Последнее обновление: 20.07.2018
Консольный вывод
Для вывода информации на консоль мы уже использовали встроенный метод Console.WriteLine . То есть, если мы хотим вывести некоторую информацию на консоль, то нам надо передать ее в метод Console.WriteLine:
Using System; namespace HelloApp { class Program { static void Main(string args) { string hello = "Привет мир"; Console.WriteLine(hello); Console.WriteLine("Добро пожаловать в C#!"); Console.WriteLine("Пока мир..."); Console.WriteLine(24.5); Console.ReadKey(); } } }
Консольный вывод:
Привет мир! Добро пожаловать в C#! Пока мир... 24,5
Нередко возникает необходимость вывести на консоль в одной строке значения сразу нескольких переменных. В этом случае мы можем использовать прием, который называется интерполяцией:
Using System; namespace HelloApp { class Program { static void Main(string args) { string name = "Tom"; int age = 34; double height = 1.7; Console.WriteLine($"Имя: {name} Возраст: {age} Рост: {height}м"); Console.ReadKey(); } } }
Для встраивания отдельных значений в выводимую на консоль строку используются фигурные скобки, в которые заключается встраиваемое значение. Это можем значение переменной ({name}) или более сложное выражение (например, операция сложения {4 + 7}). А перед всей строкой ставится знак доллара $.
При выводе на консоль вместо помещенных в фигурные скобки выражений будут выводиться их значения:
Имя: Tom Возраст: 34 Рост: 1,7м
Есть другой способ вывода на консоль сразу нескольких значений:
Using System; namespace HelloApp { class Program { static void Main(string args) { string name = "Tom"; int age = 34; double height = 1.7; Console.WriteLine("Имя: {0} Возраст: {2} Рост: {1}м", name, height, age); Console.ReadKey(); } } }
Этот способ подразумевает, что первый параметр в методе Console.WriteLine представляет выводимую строку ("Имя: {0} Возраст: {2} Рост: {1}м"). Все последующие параметры представляют значения, которые могут быть встроенны в эту строку (name, height, age). При этом важен порядок подобных параметров. Например, в данном случае вначале идет name, потом height и потом age. Поэтому у name будет представлять параметр с номером 0 (нумерация начинается с нуля), height имеет номер 1, а age - номер 2. Поэтому в строке "Имя: {0} Возраст: {2} Рост: {1}м" на место плейсхолдеров {0}, {2}, {1} будут вставляться значения соответствующих параметров.
Кроме Console.WriteLine() можно также использовать метод Console.Write() , он работает точно так же за тем исключением, что не осуществляет переход на следующую строку.
Консольный ввод
Кроме вывода информации на консоль мы можем получать информацию с консоли. Для этого предназначен метод Console.ReadLine() . Он позволяет получить введенную строку.
Using System; namespace HelloApp { class Program { static void Main(string args) { Console.Write("Введите свое имя: "); string name = Console.ReadLine(); Console.WriteLine($"Привет {name}"); Console.ReadKey(); } } }
В данном случае все, что вводит пользователь, с помощью метода Console.ReadLine передается в переменную name.
Пример работы программы:
Введите свое имя: Том Привет Том
Таким образом мы можем вводить информацию через консоль. Однако минусом этого метода является то, что Console.ReadLine считывает информацию именно в виде строки. Поэтому мы можем по умолчанию присвоить ее только переменной типа string. Как нам быть, если, допустим, мы хотим ввести возраст в переменную типа int или другую информацию в переменные типа double или decimal? По умолчанию платформа.NET предоставляет ряд методов, которые позволяют преобразовать различные значения к типам int, double и т.д. Некоторые из этих методов:
Convert.ToInt32() (преобразует к типу int)
Convert.ToDouble() (преобразует к типу double)
Convert.ToDecimal() (преобразует к типу decimal)
Пример ввода значений:
Using System; namespace HelloApp { class Program { static void Main(string args) { Console.Write("Введите имя: "); string name = Console.ReadLine(); Console.Write("Введите возраст: "); int age = Convert.ToInt32(Console.ReadLine()); Console.Write("Введите рост: "); double height = Convert.ToDouble(Console.ReadLine()); Console.Write("Введите размер зарплаты: "); decimal salary = Convert.ToDecimal(Console.ReadLine()); Console.WriteLine($"Имя: {name} Возраст: {age} Рост: {height}м Зарплата: {salary}$"); Console.ReadKey(); } } }
При вводе важно учитывать текущую операционную систему. В одних культурах разделителем между целой и дробной частью является точка (США, Великобритания...), в других - запятая (Россия, Германия...). Например, если текущая ОС - русскоязычная, значит, надо вводить дробные числа с разделителем запятой. Если локализация англоязычная, значит, разделителем целой и дробной части при вводе будет точка.
Пример работы программы:
Введите имя: Том Введите возраст: 25 Введите рост: 1,75 Введите размер зарплаты: 300,67 Имя: Том Возраст: 25 Рост: 1,75м Зарплата: 300,67$
Основной задачей программирования является обработка информации, поэтому любой язык программирования имеет средства для ввода и вывода информации. В языке Си нет операторов ввода-вывода.
Ввод и вывод информации осуществляется через функции стандартной библиотеки. Прототипы рассматриваемых функций находятся в файле stdio.h . Эта библиотека содержит функции
- printf() — для вывода информации
- scanf() — для ввода информации.
Вывод информации
Функция printf()
предназначена для форматированного вывода. Она переводит данные в символьное представление и выводит полученные изображения символов на экран. При этом у программиста имеется возможность форматировать данные, то есть влиять на их представление
на экране.
Общая форма записи функции printf()
:
printf("СтрокаФорматов"
, объект1, объект2, ..., объектn);
СтрокаФорматов состоит из следующих элементов:
- управляющих символов;
- текста, представленного для непосредственного вывода;
- форматов, предназначенных для вывода значений переменных различных типов.
Объекты могут отсутствовать.
Управляющие символы не выводятся на экран, а управляют расположением выводимых символов. Отличительной чертой управляющего символа является наличие обратного слэша ‘\’ перед ним.
Основные управляющие символы:
- ‘\n’ - перевод строки;
- ‘\t’ - горизонтальная табуляция;
- ‘\v’ - вертикальная табуляция;
- ‘\b’ - возврат на символ;
- ‘\r’ - возврат на начало строки;
- ‘\a’ - звуковой сигнал.
Форматы нужны для того, чтобы указывать вид, в котором информация будет выведена на экран. Отличительной чертой формата является наличие символа процент ‘%’ перед ним:
- %d - целое число типа int со знаком в десятичной системе счисления;
- %u - целое число типа unsigned int ;
- %x - целое число типа int со знаком в шестнадцатеричной системе счисления;
- %o - целое число типа int со знаком в восьмеричной системе счисления;
- %hd - целое число типа short со знаком в десятичной системе счисления;
- %hu - целое число типа unsigned short ;
- %hx - целое число типа short со знаком в шестнадцатеричной системе счисления;
- %ld - целое число типа long int со знаком в десятичной системе счисления;
- %lu - целое число типа unsigned long int ;
- %lx - целое число типа long int со знаком в шестнадцатеричной системе счисления;
- %f - вещественный формат (числа с плавающей точкой типа float );
- %lf - вещественный формат двойной точности (числа с плавающей точкой типа double );
- %e - вещественный формат в экспоненциальной форме (числа с плавающей точкой типа float в экспоненциальной форме);
- %c - символьный формат;
- %s - строковый формат.
Строка форматов содержит форматы для вывода значений. Каждый формат вывода начинается с символа %
. После строки форматов через запятую указываются имена переменных, которые необходимо вывести.
Количество символов %
в строке формата должно совпадать с количеством переменных для вывода. Тип каждого формата должен совпадать с типом переменной, которая будет выводиться на это место. Замещение форматов вывода значениями переменных происходит в порядке их следования.
Пример на Си
1
2
3
4
5
6
7
8
9
10
#include
int
main()
{
int
a = 5;
float
x = 2.78;
printf("a=%d\n"
, a);
printf("x=%f\n"
, x);
getchar();
return
0;
}
Результат работы программы
Тот же самый код может быть представлен с использованием одного вызова printf
:
1
2
3
4
5
6
7
8
9
#include
int
main()
{
int
a = 5;
float
x = 2.78;
printf("a=%d\nx=%f\n"
, a, x);
getchar();
return
0;
}
Табличный вывод
При указании формата можно явным образом указать общее количество знакомест и количество знакомест, занимаемых дробной частью:
1
2
3
4
5
6
7
8
#include
int
main()
{
float
x = 1.2345;
printf("x=%10.5f\n"
, x);
getchar();
return
0;
}
Результат выполнения
В приведенном примере 10 - общее количество знакомест, отводимое под значение переменной; 5 - количество позиций после разделителя целой и дробной части (после десятичной точки). В указанном примере количество знакомест в выводимом числе меньше 10, поэтому свободные знакоместа слева от числа заполняются пробелами. Такой способ форматирования часто используется для построения таблиц.
Ввод информации
Функция форматированного ввода данных с клавиатуры scanf()
выполняет чтение данных, вводимых с клавиатуры, преобразует их во внутренний формат и передает вызывающей функции. При этом программист задает правила интерпретации входных данных с помощью спецификаций форматной строки.
Общая форма записи функции scanf()
:
scanf ("CтрокаФорматов"
, адрес1, адрес2,...);
Строка форматов аналогична функции printf()
.
Для формирования адреса переменной используется символ амперсанд ‘&’
:
адрес = &объект
Строка форматов и список аргументов для функции обязательны.
Пример на Си
1
2
3
4
5
6
7
8
9
10
11
12
13
14
// для возможности использования scanf
#include
#include
int
main()
{
float
y;
system("chcp 1251"
); // переходим в консоли на русский язык
system("cls"
); // очищаем окно консоли
printf("Введите y: "
); // выводим сообщение
scanf("%f"
, &y); // вводим значения переменной y
printf("Значение переменной y=%f"
, y); // выводим значение переменной y
getchar(); getchar();
return
0;
}
Результат работы программы:
Функция scanf()
является функцией незащищенного ввода, т.к. появилась она в ранних версиях языка Си. Поэтому чтобы разрешить работу данной функции в современных компиляторах необходимо в начало программы добавить строчку
#define
_CRT_SECURE_NO_WARNINGS
Другой вариант — воспользоваться функцией защищенного ввода scanf_s()
, которая появилась несколько позже, но содержит тот же самый список параметров.
1
2
3
4
5
6
7
8
9
10
#include
int
main()
{
int
a;
printf("a = "
);
scanf_s("%d"
, &a);
printf("a = %d"
,a);
getchar(); getchar();
return
0;
}