Loading...
Hristo_Penchev avatar Hristo_Penchev 389 Точки

Употреба на Console.Read(), Console.ReadLine и Console.ReadKey

Работя над Employee Data от домашното. По принцип мога да я направя, но има някои детайли, които ме човъркат и искам да си ги обясня. Ето кода:

Console.Write("Please enter employee's first name: ");
            string firstName = Console.ReadLine();
            Console.Write("Please enter employee's last name: ");
            string lastName = Console.ReadLine();
            Console.Write("Please enter employee's age: ");
            byte age = byte.Parse(Console.ReadLine());
            Console.Write("Please enter employee's gender(m/f): ");
            string gender = Console.ReadLine();
            Console.Write("\nPlease enter employee's personal ID number: ");
            string personalIDNumber = Console.ReadLine();
            Console.Write("Please enter employee's unique number: ");
            string uniqueEmployeeNumber = Console.ReadLine();

 ...........print the info.......

Така написана, програмата работи, но искам да декларирам променливата gender като char. Console.Readline() не иска да ми я конвертира, дори с изрично кастване:

char gender = (char)Console.ReadLine();
Дава ми грешка, че не може да конвертира string в char.

Опитах с Console.Read, четох в книгата на Наков за функцията, но не я разбрах добре. Опитах следното:

char gender = Console.Read();

gender = Convert.ToChar(gender);

при този вариант ми дава правилна стойност на gender, но се получава следния бъг - не ми дава да въведа стойност за следващата променлива personalIDNumber и направо ме прехвърля на uniqueEmployeeNumber.

Може директно да се въведе Char с Console.ReadKey(), но тогава въвеждането става без натискане на Enter, което може да е объркващо за потребителя, понеже останалите променливи се въвеждат след натискане на Enter.

Домашното спокойно може да бъде написано, като gender се декларира като string, но съм се заинатил да намеря начин да го декларирам като char. Някой знае ли как да стане?

Благодаря предварително!

 

Тагове:
2
Programming Basics
Samuil.Petrow avatar Samuil.Petrow 1550 Точки

string input = Console.ReadLine();

char gender = input[0];

 

Проблемът с .Read() е в четенето, чете следващия символ от буфера и нищо повече, съответно новият ред, който реално се слага прави проблема.

1
Hristo_Penchev avatar Hristo_Penchev 389 Точки

Благодаря за отговора. А има ли начин все пак директно да се въведе чар и да се потвърди с ентър или трябва да се минава през стринг?

Console.Read() ми остава пълна мъгла.

0
mihayloff14 avatar mihayloff14 824 Точки

Може да пробваш с Console.ReadKey()

ConsoleKeyInfo input = Console.ReadKey();

Console.ReadLine();

char gender = ' ';
if (input.Key == ConsoleKey.M)
{
gender = 'm';
}
if (input.Key == ConsoleKey.F)
{
gender = 'f';
}

В случая няма нужда от Enter, освен ако не въведеш Console.ReadLine() (стоп метод)

 

0
fricer avatar fricer 23 Точки

Не знам защо някой досега не ти каза за парсването


char gender = char.Parse(Console.ReadLine());
Console.WriteLine(gender);

ето как става. Програмата директно си го обръща в char, но трябва разбира се да въведеш само един символ иначе хвърля exeption и става именно със въвеждане на символ и натискане на Enter

4
kasskata avatar kasskata 492 Точки

Не всички знаят че прасето го има във всички типове данни,затова никой не ти е казал до сега но char.Parse(Console.ReadLine());,което спомена колегата, е най добрия начин да изискваш от потребителя чарове.Изисква Enter защот трябва да зададеш края на инпута,който въвеждаш за да започне парсването(да заколиш прасето).

Не се учете да използвате ReadKey() и Read(), няма да ви трябва за изпита,a най много да го използвате в задаване на някоя функция когато правите игра например(но затова в ниво 1)

Regarts and keep coding

1
Hristo_Penchev avatar Hristo_Penchev 389 Точки

Благодаря за отговора, това като че ли е най-удачното решение. Ползвал съм парсване за присвояване на числена стойност, но нямах представа, че работи и при char. А Console.Read() така и не разбрах как работи. Доколкото разбирам, ентър прекъсва пълненето на буфера и после трябва да се конвертират символите от въпросния буфер някак си. Но защо взема и ентъра и кой му казва да го конвертира. Пълна мъгла е.
Може и да не трябва за изпита, но бих се радвал да разбера логиката на метода.

0
fricer avatar fricer 23 Точки
Колега Console.Read(...) го има доста добре обяснено във книгата на Наков в главата "Вход и изход от конзола". Основният принцип на метода е, че чете само един символ въпреки че може последователно да се въведени няколко. И докато Console.ReadLine(...) спира изпълнението на програмата при всяко негово извикване, за да могат да бъдат въведени данни, Console.Read(...) спира само ако буфера е празен. Тоест ако вместо един символ му въведа 10 метода ще прочете само първия ще, ще го обработи по зададения код, ще го премахне от буфера и програмата ще се завърти отново без да пита за следващ вход, а направо ще вземе втория символ и така докато не се изпразни буфера. Console.Read(...) ще попита отново за вход чак когато няма нищо в буфера. В книгата има доста добър пример напиши го и го прекарай през дебъгера, за да придобиеш по-добра представа какво прави, а и следващата лекция мисля че е именно вход и изход от конзола така че лекторите ще го обяснят.
1
Можем ли да използваме бисквитки?
Ние използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Можете да се съгласите с всички или част от тях.
Назад
Функционални
Използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Използваме „сесийни“ бисквитки, за да Ви идентифицираме временно. Те се пазят само по време на активната употреба на услугите ни. След излизане от приложението, затваряне на браузъра или мобилното устройство, данните се трият. Използваме бисквитки, за да предоставим опцията „Запомни Ме“, която Ви позволява да използвате нашите услуги без да предоставяте потребителско име и парола. Допълнително е възможно да използваме бисквитки за да съхраняваме различни малки настройки, като избор на езика, позиции на менюта и персонализирано съдържание. Използваме бисквитки и за измерване на маркетинговите ни усилия.
Рекламни
Използваме бисквитки, за да измерваме маркетинг ефективността ни, броене на посещения, както и за проследяването дали дадено електронно писмо е било отворено.