Към съдържанието
wannacode

Вход и изход

Проблем

Програмата знае само едно име

Програмата поздравява клиента по име:

string name = "Мария";
Console.WriteLine("Здравей, " + name + "!");
Изход
Здравей, Мария!

Работи, но поздравява всички като Мария. Името е записано в кода. За всеки нов клиент трябва да промениш програмата и да я пуснеш наново. Искаш програмата сама да попита.

Идеята

Четене от клавиатурата

Когато програмата чете, тя спира и чака. Човекът пише и натиска Enter. Написаното е входът на програмата.

Program.cs
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 + " €");
Вход
12
30
Изход
Общо: 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 + " €");
Вход
12
30
Изход
Общо: 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 + " €");
Стъпка по стъпка, с думи
  1. Човекът пише 12 и Enter. Console.ReadLine() връща текста "12", не число.
  2. int.Parse превръща текста в числото 12. То отива във first.
  3. 30 минава по същия път: текст, парсване, число в second.
  4. Сега + събира числа: 12 + 30 = 42.
  5. Отпечатва се „Общо: 42 €“.
По-точно, за любопитните
  • Ако текстът не е число (например „дванайсет“), програмата спира с грешка: FormatException. Как се хваща такава грешка, ще видим в модул „Грешки и изключения“.
  • int.TryParse проверява, без да спира програмата. Ползва се с if и out, които идват по-нататък.
  • Десетичният знак зависи от регионалните настройки на компютъра. На компютър с български настройки double.Parse("3.5") спира с грешка и иска запетая: 3,5. Примерите в курса са с точка.

Пробвай

Колко билета?

Програмата чете колко са възрастните и колко са децата.

Вход
2
3

Какво ще отпечата програмата?

int adults = int.Parse(Console.ReadLine());
int children = int.Parse(Console.ReadLine());
Console.WriteLine("Билети: " + adults + children);
Отговор

Идеята

Числата, както ги искаш

В миналия урок цената 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.00

N2 добавя разделител за хилядите. Числото след запетаята е ширината: {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:} €");

Пробвай

Намери грешката

Програмата пита колко билета да запази. Тя не се компилира. На кой ред е грешката?

Избери реда с грешката.

Упражнение

Програми, които питат

Реши задачите в редактора си. Входът е по един ред за всяка стойност. Не печатай въпроси като „Въведи име:“, за да съвпадне изходът ти с примерния.

1. Поздрав по име. Прочети име и поздрави.

Вход
Мария
Изход
Здравей, Мария!

2. Сума на две числа. Прочети две цели числа и отпечатай сметката.

Вход
17
25
Изход
17 + 25 = 42

3. Два текста в един. Прочети два текста и ги отпечатай заедно, с интервал между тях.

Вход
Велико
Търново
Изход
Велико Търново

4. π с два знака. Запиши π в променлива като 3.14159265358979 и го отпечатай с два знака след точката. Готовата стойност Math.PI идва в следващия урок.

Изход
3.14

Още задачи

  • Възраст. Прочети име и възраст (цяло число) и отпечатай „Мария е на 19 години.“
  • Визитка от клавиатурата. Прочети име, професия и телефон и отпечатай визитката от урока „Първата програма“ с тях.
  • Цена с два знака. Прочети цена като дробно число и я отпечатай с два знака и знак за евро: при вход 7.5 изходът е Цена: 7.50 €.
  • Сума на две цени. Прочети две дробни цени и отпечатай сумата им с два знака: при вход 12.4 и 3.15 изходът е Общо: 15.55 €.

Тест

Провери се

1. Какво връща Console.ReadLine()?
2. Прочетени са текстовете "12" и "30". Какво дава first + second?
3. Какво прави int.Parse("25")?
4. int a = 2; int b = 3; Какво отпечатва "Сума: " + a + b?
5. Как се отпечатва 7.5 като 7.50?

Създаден от Иво Гергов като част от кампанията на Evo Tech за достъпно обучение по програмиране ·