Консольный ввод-вывод.

Последнее обновление: 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;
}



Есть вопросы?

Сообщить об опечатке

Текст, который будет отправлен нашим редакторам: