Вход и изход
Проблем
Програмата знае само едно име
Програмата поздравява клиента по име:
string name = "Мария";Console.WriteLine("Здравей, " + name + "!");Здравей, Мария!Работи, но поздравява всички като Мария. Името е записано в кода. За всеки нов клиент трябва да промениш програмата и да я пуснеш наново. Искаш програмата сама да попита.
Идеята
Четене от клавиатурата
Когато програмата чете, тя спира и чака. Човекът пише и натиска Enter. Написаното е входът на програмата.
class Program{ static void Main() { Console.Write("Как се казваш? "); string name = Console.ReadLine(); Console.WriteLine("Здравей, " + name + "!"); }}МарияКак се казваш? Здравей, Мария!Console.ReadLine() чете един ред, до Enter.
Входът и изходът тук са показани поотделно. В конзолата името ще се появи там, където го пишеш: след „Как се казваш? “. Затова въпросът е с Write: отговорът да е на същия ред.
По-точно, за любопитните
- В проект от
dotnet new consoleредътstring name = Console.ReadLine();дава предупреждение CS8600. Причината е, чеReadLineвръщаnull(нищо), ако входът е свършил. Това е предупреждение, не грешка, и програмата се пуска. Как се работи сnull, ще видим по-нататък. Console.Read()чете само един символ и връща кода му като число. В курса ще четем винаги цели редове.
Проблем
12 + 30 = 1230
Касиерът въвежда две плащания, 12 € и 30 €. Програмата трябва да покаже общата сума:
string first = Console.ReadLine();string second = Console.ReadLine();string total = first + second;Console.WriteLine("Общо: " + total + " €");1230Общо: 1230 €Вместо 42 излезе 1230. Програмата не е сбъркала сметката. Тя изобщо не е смятала.
Идеята
От текст към число
Каквото и да напише човекът, Console.ReadLine() връща текст. „12“ и „30“ са два текста, а + между текстове ги слепва. За да смяташ, превърни текста в число:
int first = int.Parse(Console.ReadLine());int second = int.Parse(Console.ReadLine());int total = first + second;Console.WriteLine("Общо: " + total + " €");1230Общо: 42 €Превръщането на текст в стойност от друг тип се казва парсване (parse).
int.Parse(...)даваint.double.Parse(...)даваdouble.- Същото има и за другите типове:
long.Parse,bool.Parseи т.н.
Сумата тук е първата сметка в курса. Изваждане, умножение и деление идват в следващия урок.
int first = int.Parse(Console.ReadLine());int second = int.Parse(Console.ReadLine());int total = first + second;Console.WriteLine("Общо: " + total + " €");Стъпка по стъпка, с думи
- Човекът пише 12 и Enter. Console.ReadLine() връща текста "12", не число.
- int.Parse превръща текста в числото 12. То отива във first.
- 30 минава по същия път: текст, парсване, число в second.
- Сега + събира числа: 12 + 30 = 42.
- Отпечатва се „Общо: 42 €“.
По-точно, за любопитните
- Ако текстът не е число (например „дванайсет“), програмата спира с грешка:
FormatException. Как се хваща такава грешка, ще видим в модул „Грешки и изключения“.
int.TryParseпроверява, без да спира програмата. Ползва се сifиout, които идват по-нататък.
- Десетичният знак зависи от регионалните настройки на компютъра. На компютър с български настройки
double.Parse("3.5")спира с грешка и иска запетая:3,5. Примерите в курса са с точка.
Пробвай
Колко билета?
Програмата чете колко са възрастните и колко са децата.
23Какво ще отпечата програмата?
int adults = int.Parse(Console.ReadLine());int children = int.Parse(Console.ReadLine());Console.WriteLine("Билети: " + adults + children);"Билети: " + adults вече е текстът „Билети: 2“, а текст + 3 слепва 3 накрая. Със скоби първо се смята сумата: "Билети: " + (adults + children) дава „Билети: 5“.Идеята
Числата, както ги искаш
В миналия урок цената 49.90 излезе като 49.9. За цена искаш винаги два знака след десетичната точка. Това е форматиран изход:
string product = "Слушалки";double price = 49.9;int qty = 2;Console.WriteLine($"{product}: {price:F2} €");Console.WriteLine($"{qty} бр. в количката");string label = $"Цена: {price:F2} €";Console.WriteLine(label);Слушалки: 49.90 €2 бр. в количкатаЦена: 49.90 €$ пред кавичките позволява да пишеш стойности направо в текста, във фигурни скоби: {product}. Това се казва интерполация на низове.
След двоеточие пишеш формата: {price:F2} значи дробно число с точно 2 знака след точката. F0 е без знаци след точката, F3 е с три.
Стойността в променливата не се променя. Форматът решава само как да изглежда, когато се печата.
По-точно, за любопитните
- Хилядите и подравняването в колони:
double total = 1234.5;Console.WriteLine($"Общо: {total:N2} €");Console.WriteLine($"{"Кафе",-10}|{2.5,8:F2}");Console.WriteLine($"{"Лаптоп",-10}|{1299.0,8:F2}");Общо: 1,234.50 €Кафе | 2.50Лаптоп | 1299.00N2 добавя разделител за хилядите. Числото след запетаята е ширината: {2.5,8:F2} заема 8 знака, подравнено вдясно, а -10 подравнява вляво.
Има и по-стар запис със същия смисъл: Console.WriteLine("{0}: {1:F2} €", product, price);. Ще го срещаш в чужд код.
- И тук регионалните настройки имат значение. На компютър с български настройки
F2дава49,90, а разделителят за хилядите е интервал:1 234,50. Изходът в уроците е с точка.
В C# дори обикновеното "Цена: " + price следва настройките. На компютър с български настройки цената от миналия урок излиза като 49,9.
Пробвай
Два знака
Нощувката струва 65.5 €. Искаш да излезе „Нощувка: 65.50 €“. Какво трябва да пише на празното място?
Console.WriteLine($"Нощувка: {price:} €");F2: дробно число с точно два знака след точката.
Пробвай
Намери грешката
Програмата пита колко билета да запази. Тя не се компилира. На кой ред е грешката?
Избери реда с грешката.
Console.ReadLine() връща текст, а tickets е int. Компилаторът не превръща текст в число сам: „CS0029: Cannot implicitly convert type 'string' to 'int'“. Поправката е int tickets = int.Parse(Console.ReadLine());.Упражнение
Програми, които питат
Реши задачите в редактора си. Входът е по един ред за всяка стойност. Не печатай въпроси като „Въведи име:“, за да съвпадне изходът ти с примерния.
1. Поздрав по име. Прочети име и поздрави.
МарияЗдравей, Мария!2. Сума на две числа. Прочети две цели числа и отпечатай сметката.
172517 + 25 = 423. Два текста в един. Прочети два текста и ги отпечатай заедно, с интервал между тях.
ВеликоТърновоВелико Търново4. π с два знака. Запиши π в променлива като 3.14159265358979 и го отпечатай с два знака след точката. Готовата стойност Math.PI идва в следващия урок.
3.14Още задачи
- Възраст. Прочети име и възраст (цяло число) и отпечатай „Мария е на 19 години.“
- Визитка от клавиатурата. Прочети име, професия и телефон и отпечатай визитката от урока „Първата програма“ с тях.
- Цена с два знака. Прочети цена като дробно число и я отпечатай с два знака и знак за евро: при вход
7.5изходът еЦена: 7.50 €. - Сума на две цени. Прочети две дробни цени и отпечатай сумата им с два знака: при вход
12.4и3.15изходът еОбщо: 15.55 €.
Тест