Как найти ввод исходных данных в c

от admin

Ввод-вывод в Си

Основной задачей программирования является обработка информации, поэтому любой язык программирования имеет средства для ввода и вывода информации. В языке Си нет операторов ввода-вывода.

Ввод и вывод информации осуществляется через функции стандартной библиотеки. Прототипы рассматриваемых функций находятся в файле stdio.h . Эта библиотека содержит функции

  • printf() — для вывода информации
  • scanf() — для ввода информации.

Вывод информации

Функция printf() предназначена для форматированного вывода. Она переводит данные в символьное представление и выводит полученные изображения символов на экран. При этом у программиста имеется возможность форматировать данные, то есть влиять на их представление
на экране.

Общая форма записи функции printf() :

СтрокаФорматов состоит из следующих элементов:

  • управляющих символов;
  • текста, представленного для непосредственного вывода;
  • форматов, предназначенных для вывода значений переменных различных типов.

Объекты могут отсутствовать.

Управляющие символы не выводятся на экран, а управляют расположением выводимых символов. Отличительной чертой управляющего символа является наличие обратного слэша ‘\’ перед ним.

Основные управляющие символы:

  • ‘\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 — строковый формат.

Строка форматов содержит форматы для вывода значений. Каждый формат вывода начинается с символа % . После строки форматов через запятую указываются имена переменных, которые необходимо вывести.
Количество символов % в строке формата должно совпадать с количеством переменных для вывода. Тип каждого формата должен совпадать с типом переменной, которая будет выводиться на это место. Замещение форматов вывода значениями переменных происходит в порядке их следования.
Пример на Си

Результат работы программы

Тот же самый код может быть представлен с использованием одного вызова printf :

Табличный вывод

При указании формата можно явным образом указать общее количество знакомест и количество знакомест, занимаемых дробной частью:

Результат выполнения
Форматированный вывод в Си

В приведенном примере 10 — общее количество знакомест, отводимое под значение переменной; 5 — количество позиций после разделителя целой и дробной части (после десятичной точки). В указанном примере количество знакомест в выводимом числе меньше 10, поэтому свободные знакоместа слева от числа заполняются пробелами. Такой способ форматирования часто используется для построения таблиц.

Вывод числа с указанием количества знакомест

Ввод информации

Функция форматированного ввода данных с клавиатуры scanf() выполняет чтение данных, вводимых с клавиатуры, преобразует их во внутренний формат и передает вызывающей функции. При этом программист задает правила интерпретации входных данных с помощью спецификаций форматной строки.
Общая форма записи функции scanf( ) :

Строка форматов аналогична функции printf() .
Для формирования адреса переменной используется символ амперсанд ‘&’ :
адрес = &объект

Строка форматов и список аргументов для функции обязательны.

Результат работы программы:
Функция scanf()

Функция scanf( ) является функцией незащищенного ввода, т.к. появилась она в ранних версиях языка Си. Поэтому чтобы разрешить работу данной функции в современных компиляторах необходимо в начало программы добавить строчку

Другой вариант — воспользоваться функцией защищенного ввода scanf_s( ) , которая появилась несколько позже, но содержит тот же самый список параметров.

Ввод данных в языке C++

Выводить данные на консоль мы научились, теперь рассмотрим объекты и функции, предназначенные для получения данных от пользователя. Для ввода данных в языке C++ предназначен объект cin (console input — ввод с консоли), объявленный в файле iostream . Объект cin позволяет ввести данные любого встроенного типа, например, число, символ или строку. В этом разделе мы рассмотрим лишь основные возможности этого объекта, так как для понимания всех возможностей требуется знание принципов объектно-ориентированного программирования (ООП). В последующих главах мы вернемся к изучению объекта cin .

Прежде чем использовать объект cin необходимо подключить файл iostream с помощью директивы #include :

Ввод числа

В качестве примера использования объекта cin произведем суммирование двух целых чисел, введенных пользователем (листинг 2.6).

Листинг 2.6. Суммирование двух введенных чисел

В первой строке производится подключение заголовочного файла iostream , а во второй — файла clocale . Далее внутри функции main() с помощью функции setlocale() настраивается локаль, а затем объявляются две локальные переменные: x и y . Ключевое слово int в начале строки означает, что объявляются целочисленные переменные. При объявлении переменным сразу присваивается начальное значение ( 0 ) с помощью оператора = . Если значение не присвоить, то переменная будет иметь произвольное значение, так называемый «мусор». Как видно из примера, на одной строке можно объявить сразу несколько переменных, разделив их запятыми.

В следующей строке с помощью объекта cout выводится подсказка для пользователя ( «x book-courier» title=»mark_flush_2″>flush() объекта cin , который сбрасывает данные из буфера потока вывода stdout в консоль. Если буфер вывода принудительно не сбросить, пользователь может не увидеть подсказку вообще.

После ввода числа и нажатия клавиши <Enter> значение будет присвоено переменной x . Ввод значения производится с помощью объекта cin . После названия объекта указывается оператор >> , который как бы указывает направление ввода. При разработке собственных объектов можно перегрузить этот оператор и тем самым управлять вводом. После оператора >> передается название переменной, в которой будут сохранены введенные данные. Так как объекты cout и cin объявлены в пространстве имен std , название пространства имен необходимо указать перед объектами.

Далее производится вывод подсказки, сброс буфера вывода и получение второго числа, которое сохраняется в переменной y . В следующей строке производится сложение двух чисел и вывод результата. Процесс ввода двух чисел и получения суммы выглядит так (данные, вводимые пользователем, выделены полужирным шрифтом):

При вводе данных производится попытка преобразования к типу переменной. В нашем примере строка «10» будет преобразована в число 10 , а строка «20» — в число 20 . Однако, пользователь вместо числа может ввести все что угодно, например, строку не содержащую число. В этом случае преобразование закончится неудачей, переменной не будет присвоено значение, а введенное значение останется в буфере и будет автоматически считано следующей операцией ввода. Проверить отсутствие ошибки при преобразовании можно с помощью метода good() объекта cin . Прототип метода:

Метод good() возвращает логическое значение true ( Истина ), которое соответствует числу 1 , если ошибок не произошло, или значение false ( Ложь ), соответствующее числу 0 , в противном случае. Вывести сообщение об ошибке и прервать выполнение программы можно так:

В этом примере для проверки условия используется оператор ветвления if . После названия оператора внутри круглых скобок указывается проверяемое выражение. Если выражение возвращает логическое значение true ( Истина ), то будут выполнены инструкции внутри фигурных скобок. Если выражение возвращает значение false ( Ложь ), то инструкции внутри фигурных скобок игнорируются и управление передается инструкции, расположенной сразу после закрывающей фигурной скобки. Проверка значения, возвращаемого методом good() , осуществляется с помощью оператора == . При ошибке метод good() вернет значение false , следовательно, условие false == false будет истинным. В этом случае выводим сообщение об ошибке и выходим из функции main() (и, следовательно, из программы), возвращая значение 1 .

Обратите внимание на то, что оператор проверки на равенство содержит два символа = . Указание одного символа = является логической ошибкой, так как этот оператор используется для присваивания значение переменной, а не для проверки условия. Использовать оператор присваивания внутри логического выражения допускается, поэтому компилятор не выведет сообщение об ошибке (но возможно выведет предупреждение), однако программа может выполняться некорректно. Подобную ошибку часто допускают начинающие программисты. Например, в следующем примере вместо проверки равенства числу 11 , производится операция присваивания:

Любое число не равное 0 трактуется как логическое значение true , поэтому производится проверка условия true == true , которое является истинным. Проверка соответствия условия значению true производится по умолчанию.

Прерывать выполнение программы в случае ошибки мы научились, теперь рассмотрим возможность обработки ошибки (листинг 2.7). Дадим пользователю три попытки ввода, прежде чем досрочно завершим программу.

Листинг 2.7. Обработка ошибок ввода

В этом примере внутри функции main() объявляются четыре локальные переменные: x , y , count и flag . Переменные x , y и count являются целочисленными, а переменная flag имеет логический тип bool . Тип bool позволяет хранить в переменной только два значения: true ( Истина ) и false ( Ложь ). Значение true соответствует числу 1 , а значение false — числу 0 . В переменной flag мы будем сохранять текущий статус обработки ошибок, а в переменной count — количество допущенных ошибок подряд.

При возникновении ошибки ее необходимо обработать, а затем вывести повторный запрос на ввод числа. Вполне возможно эту процедуру нужно будет выполнить несколько раз. Причем количество повторов заранее неизвестно. Для выполнения одних и тех же инструкций несколько раз предназначены циклы. В нашем примере используется цикл do. while . Инструкции внутри фигурных скобок будут выполняться до тех пор, пока логическое выражение после ключевого слова while является истинным. Проверка условия производится после выполнения инструкций внутри фигурных скобок, поэтому инструкции выполняются минимум один раз. Обратите внимание на логическое выражение !flag . Восклицательный знак, расположенный перед переменной, инвертирует значение. Например, если переменная содержит значение true , то выражение !true вернет значение false . Так как проверка значения на истинность производится по умолчанию, выражение может не содержать операторов сравнения.

Внутри цикла выводим подсказку пользователю с помощью объекта cout , сбрасываем буфер вывода, а затем получаем значение с помощью объекта cin и сохраняем его в переменной. Далее проверяем наличие ошибки с помощью метода good() объекта cin . Если произошла ошибка, то выводим сообщение Вы ввели не число . Количество попыток мы отслеживаем с помощью переменной count . На начальном этапе она имеет значение 1 . Если пользователь не ввел число, то увеличиваем значение на 1 с помощью инструкции:

Если пользователь допустил три ошибки подряд (переменная count будет содержать значение больше 3 ), то выводим сообщение Вы сделали три ошибки и выходим из функции main() , вызвав оператор return .

Так как ошибка была обработана необходимо сбросить флаг ошибки. Для этого предназначен метод clear() объекта cin :

В прототипе параметру state присвоено начальное значение, поэтому, если значение по умолчанию устраивает, параметр можно не указывать:

Сбросить флаг ошибки не достаточно, так как ошибочное значение по-прежнему находится в буфере. Если буфер не очистить, то значение будет автоматически передано следующей операции ввода, что породит повторную ошибку. Проигнорировать значение, расположенное в буфере, позволяют следующие инструкции:

Выполнение инструкций в цикле while продолжается до тех пор, пока логическое выражение внутри круглых скобок истинно. Внутри круглых скобок на каждой итерации цикла выполняется получение одного символа из потока ввода с помощью метода get() . Далее производится сравнение полученного символа с символом перевода строки \n и концом потока. Если полученный символ не равен символу перевода строки и не достигнут конец потока, то получаем следующий символ. Цикл выполняется до тех пор, пока не встретится символ перевода строки, который является маркером конца данных в буфере. В итоге буфер ввода будет очищен от ошибочных данных и мы можем запросить данные повторно.

Обычно в цикле while после круглых скобок указываются фигурные скобки, внутри которых размещаются инструкции, выполняемые несколько раз. Если инструкция одна, то фигурные скобки можно не указывать. Нам не нужно вообще выполнять какие-либо инструкции, поэтому мы воспользовались пустой инструкцией, состоящей из точки с запятой.

Очистить буфер можно также с помощью метода ignore() объекта cin . Прототип метода:

Первый параметр задает максимальное количество считываемых из буфера символов (по умолчанию один символ). Второй параметр задает символ-разделитель. Если символ-разделитель встретится раньше, чем будет считано указанное количество символов, то считывание прекращается. Метод возвращает ссылку на поток. Пример:

В этом примере очистка выполняется пока не будет считано 255 символов, либо пока не встретится символ перевода строки \n . Символ перевода строки также удаляется из буфера. Проблема этого способа заключается в том, что мы не знаем сколько символов нужно удалить из буфера. Число 255 — это всего лишь произвольное значение, которого может быть недостаточно. Чтобы полностью очистить буфер ввода можно в первом параметре указать максимальное значение для типа streamsize :

После очистки буфера проверяется значение переменной flag . Так как значение переменной является ложным, цикл будет выполнен еще раз.

Если ошибки нет, выполняются инструкции, расположенные после ключевого слова else . В нашем случае переменной flag присваивается значение true . Это значение является условием выхода из цикла.

Далее таким же способом получаем второе число. Так как в предыдущем цикле значения переменных flag и count были изменены, перед циклом производим восстановление первоначальных значений. Иначе выход из цикла произойдет даже в случае ошибки. Если второе число успешно получено, производим вывод суммы чисел.

После объекта cin можно указать сразу несколько переменных, разделив их операторами >> . В этом случае при вводе все значения можно указать на одной строке. Между собой значения должны разделяться пробелами, табуляцией или символом перевода строки. Эти символы не будут присвоены переменным. Например, программу суммирования двух целых чисел можно записать так:

При вводе строки «10 20» число 10 будет присвоено переменной x , а число 20 — переменной y . Пробел игнорируется.

Ввод символа

Получить символ можно двумя способами. Первый способ ничем не отличается от ввода числа, только при объявлении переменной указывается тип char :

Второй способ заключается в использовании метода get() объекта cin . Прототипы метода:

Первый прототип возвращает целочисленный код символа:

Сначала изменяется кодировка консоли и настраивается локаль. Строка, которую мы получим по умолчанию, будет в кодировке консоли (например, в кодировке windows-866 или какой-либо другой). Чтобы получить строку в кодировке windows-1251, мы передаем команду смены кодировки chcp 1251 функции system() . Чтобы использовать функцию system() следует подключить заголовочный файл process.h .

Далее объявляется символьный массив, состоящий из 255 символов. Строки в языке C++ представляют собой последовательность (массив) символов, последним элементом которого является нулевой символ ( ‘\0’ ). Обратите внимание на то, что нулевой символ (нулевой байт) не имеет никакого отношения к символу ‘0’ . Коды этих символов разные. Затем выводится подсказка пользователю и сбрасывается буфер. Далее объекту cin передается указатель на первый элемент массива str . Если в окне консоли ввести строку «Hello, world!» и нажать клавишу <Enter>, то массив str будет содержать значение «Hello,\0» . Фрагмент «world!» останется в буфере, так как символ пробела является символом-разделителем.

Чтобы получить определенное количество символов необходимо воспользоваться методом getline() объекта cin . Прототипы метода:

В первом параметре задается указатель на строку, а во втором параметре максимальное количество символов. В параметре delim можно дополнительно указать символ-ограничитель. Метод, соответствующий первому прототипу, производит считывание count-1 символов. Если раньше встретится символ перевода строки ( \n ), то считывается фрагмент до этого символа. Символ перевода строки считывается, но не записывается в массив. В конец массива автоматически вставляется нулевой символ. В качестве значения метод возвращает ссылку на поток ввода. Пример использования метода getline() приведен листинге 2.8.

Метод, соответствующий второму прототипу, производит считывание count-1 символов. Если раньше встретится символ delim , то считывается фрагмент до этого символа. Символ delim считывается, но не записывается в массив. В конец массива автоматически вставляется нулевой символ. В качестве значения метод возвращает ссылку на поток ввода.

Количество записанных в массив символов можно получить с помощью метода gcount() объекта cin . Прототип метода:

Листинг 2.8. Ввод строки

Ввод данных в языке C

Язык C++ поддерживает также операции ввода из языка C, объявленные в файле stdio.h . В языке C++ вместо этого файла лучше подключить файл cstdio :

Читать:
Как сделать эффект рации в микрофоне

Для ввода одного символа предназначена функция getchar() . Прототип функции:

В качестве значения функция возвращает код введенного символа. Чтобы символ был считан, необходимо после ввода символа нажать клавишу <Enter>. Если было введено несколько символов, то будет считан первый символ, а остальные останутся в буфере. Ключевое слово void внутри круглых скобок означает, что функция не принимает никаких параметров. Пример получения символа:

Для ввода строки предназначена функция gets() , однако применять ее в программе не следует, так как функция не производит никакой проверки длины строки, что может привести к переполнению буфера. Лучше получать строку посимвольно с помощью функции getchar() или воспользоваться функцией fgets() . Прототип функции fgets() :

В качестве параметра stream указывается стандартный поток ввода stdin . Считывание производится до первого символа перевода строки или до конца потока или пока не будет прочитано maxCount–1 символов. Содержимое строки buf включает символ перевода строки. Исключением является последняя строка. Если она не завершается символом перевода строки, то символ добавлен не будет. Если произошла ошибка или достигнут конец потока, то функция возвращает нулевой указатель. Пример получения строки приведен в листинге 2.9.

Листинг 2.9. Ввод строки

В первой строке подключается заголовочный файл cstdio , в котором объявлены функции, предназначенные для ввода и вывода данных, во второй строке — файл cstring , в котором объявлена функция strlen() , возвращающая длину строки, в третьей строке — файл clocale , в котором объявлена функция setlocale() , в четвертой строке — файл process.h , в котором объявлена функция system() , а в пятой строке — файл cwchar .

Внутри функции main() сначала изменяется кодировка консоли и настраивается локаль. Строка, которую мы получим, по умолчанию будет в кодировке консоли (например, в кодировке windows-866 или какой-либо другой). Чтобы получить строку в кодировке windows-1251, мы в начале программы передаем команду смены кодировки chcp 1251 функции system() .

Далее объявляется символьный массив buf , состоящий из 256 символов, а также указатель p на тип char и ему присваивается значение NULL . То, что переменная p является указателем, говорит символ * перед ее именем при объявлении. Значением указателя является адрес данных в памяти компьютера. Указатель, которому присвоено значение NULL , называется нулевым указателем. Такой указатель ни на что не указывает, пока ему не будет присвоен адрес.

В следующей строке выводится подсказка пользователю, а последующая инструкция сбрасывает буфер вывода. Далее мы получаем строку из стандартного потока ввода stdin . Поток указывается в третьем параметре функции fgets() . В первом параметре передается адрес символьного массива buf , а во втором — его размер. Если в процессе выполнения функции fgets() возникнет ошибка, то функция вернет нулевой указатель. В этом случае мы выводим сообщение Возникла ошибка . Если ошибка не возникла, то удаляем символ перевода строки, который был добавлен в символьный массив. Для этого с помощью функции strlen() получаем длину строки и сохраняем ее в переменной len . Затем проверяем значение последнего символа в строке. Если этот символ \n , то заменяем его нулевым символом. В противном случае ничего не заменяем. После замены выводим полученную строку в окно консоли.

Обратите внимание на два момента. Во-первых, размер символьного массива и длина строки это разные вещи. Размер массива — это общее количество символов, которое может хранить массив. Длина строки — это количество символов внутри символьного массива до первого нулевого символа. В следующем примере массив содержит 256 символов, а длина строки внутри него составляет всего три символа плюс нулевой символ:

Во-вторых, нумерация элементов массива начинается с 0 , а не с 1 . Поэтому последний символ имеет индекс на единицу меньше длины строки. Для доступа к отдельному символу нужно указать индекс внутри квадратных скобок:

Для получения и автоматического преобразования данных в конкретный тип (например, в целое число) предназначена функция scanf() . При вводе строки функция не производит никакой проверки длины строки, что может привести к переполнению буфера. Обязательно указывайте ширину при использовании спецификатора %s (например, %255s ). Прототип функции:

В первом параметре указывается строка специального формата, внутри которой задаются спецификаторы, аналогичные применяемым в функции printf() , а также некоторые дополнительные спецификаторы. В последующих параметрах передаются адреса переменных. Функция возвращает количество произведенных присваиваний. Пример получения целого числа:

Обратите внимание на то, что перед названием переменной x указан символ & . В этом случае передается адрес переменной x , а не ее значение. При вводе строки символ & не указывается, так как название переменной без квадратных скобок является ссылкой на первый элемент массива. Пример ввода строки:

Обратите внимание: чтобы получить строку в кодировке windows-1251, мы вначале указываем нужную кодировку с помощью функции system() . Если кодировку не указать, то мы получим строку в кодировке консоли (по умолчанию в консоли используется кодировка windows-866). Далее мы настраиваем локаль, чтобы не было проблем при работе с русскими буквами. Не забудьте подключить заголовочные файлы process.h и clocale , в которых содержатся объявления функций system() и setlocale() .

Считывание символов производится до первого символа-разделителя, например, пробела, табуляции или символа перевода строки. Поэтому после ввода строки «Hello, world!» переменная str будет содержать лишь фрагмент «Hello,» , а не всю строку.

Следует учитывать, что функции getchar() и scanf() применяются в языке C. Хотя их можно использовать и в языке C++, тем не менее для ввода данных стоит отдать предпочтение объекту cin . Описание функций getchar() и scanf() приведено в этой книге лишь для того, чтобы вы могли разобраться в чужом коде.

Учебник C++ (Qt Creator и MinGW)
Учебник C++ (Qt Creator и MinGW) в формате PDF

Помощь сайту

ПАО Сбербанк:
Счет: 40817810855006152256
Реквизиты банка:
Наименование: СЕВЕРО-ЗАПАДНЫЙ БАНК ПАО СБЕРБАНК
Корреспондентский счет: 30101810500000000653
БИК: 044030653
КПП: 784243001
ОКПО: 09171401
ОКОНХ: 96130
Скриншот реквизитов

Как найти ввод исходных данных в c

По умолчанию язык C++ не содержит встроенных средств для ввода с консоли и вывода на консоль, эти средства предоставляются библиотекой iostream . В ней определены два типа: istream и ostream . istream представляет поток ввода, а ostream — поток вывода.

Вообще, сам термин «поток» в данном случае представляет последовательность символов, которая записывается на устройство ввода-вывода или считывается с него. И в данном случае под устройством ввода-вывода рассматривается консоль.

Для записи или вывода символов на консоль применяется объект cout , который представляет тип ostream. А для чтения с консоли используется объект cin

Для использования этих объектов в начало исходного файла необходимо подключить библиотеку iostream:

Вывод на консоль

Для вывода на консоль применяется оператор << . Этот оператор получает два операнда. Левый операнд представляет объект типа ostream, в данном случае объект cout. А правый операнд — значение, которое надо вывести на консоль.

Так как оператор << возвращает левый операнд — cout, то с помощью цепочки операторов мы можем передать на консоль несколько значений. Например, определим простейшую программу вывода на консоль:

Консольный вывод программы:

Оператору << передаются различные значения — строки, значения переменных, которые выводятся на консоль.

Строки могут содержать управляющие последовательности, которые интерпретируются определенным образом. Например, последовательность «\n» интерпретируется как перевод на новую строку. Из других управляющих последовательностей также нередко употребляется «\t», которая интерпретируется как табуляция.

Также цепочку операторов << можно завершать значением std::endl , которое вызывает перевод на новую строку и сброс буфера. При выводе в поток данные вначале помещаются в буфер. И сброс буфера гарантирует, что все переданные для вывода на консоль данные немедленно будут выведены на консоль.

Ввод с консоли

Для считывания с консоли данных применяется оператор ввода >> , который принимает два операнда. Левый операнд представляет объект типа istream (в данном случае объект cin), с которого производится считывание, а правый операнд — объект, в который считываются данные.

Например, считаем данные с консоли:

Здесь после приглашений к вводу программа ожидает ввода значений для переменных age и weight.

Пример работы программы:

Стоит отметить, что так как оператор ввода в первом случае будет добавлять данные в целочисленную переменную age, то он ожидает ввода числа. В случае с переменной weight оператор ввода ожидает число с плавающей точкой, причем разделителем целой и дробной части должна быть точка. Поэтому мы не можем ввести любые значения, например, строки. В этом случае программа может выдать некорректный результат.

Оператор ввода >> возвращает левый операнд — объект cin, поэтому мы можем по цепочке считывать данные в различные переменные:

Пример работы программы:

После ввода одного из значений надо будет ввести пробел и затем вводить следующее значение.

1.5 – Знакомство с iostream: cout, cin и endl

В этом уроке мы подробнее поговорим о std::cout , который мы использовали в нашей программе «Hello world!» для вывода в консоль текста «Hello world!». А также узнаем, как получить данные от пользователя, которые мы будем использовать, чтобы сделать наши программы более интерактивными.

Библиотека ввода/вывода

Библиотека ввода/вывода (библиотека io) является частью стандартной библиотеки C++, которая имеет дело с базовым вводом и выводом. Мы будем использовать функции этой библиотеки для получения ввода с клавиатуры и вывода данных в консоль. Буквы io в iostream означают «input/output» (ввод/вывод).

Чтобы использовать функции, определенные в библиотеке iostream , нам нужно включить заголовочный файл iostream в начало любого исходного файла, который использует содержимое, определенное в iostream , например:

std::cout

Библиотека iostream содержит несколько предопределенных переменных, которые мы можем использовать. Одной из наиболее полезных является std::cout , которая позволяет нам отправлять данные в консоль для печати в виде текста. cout означает «character output» (вывод символов).

Вспомним нашу программу Hello world :

В эту программу мы включили iostream , чтобы у нас был доступ к std::cout . Внутри нашей функции main() мы используем std::cout вместе с оператором вставки ( << ) для отправки текста « Hello world! » в консоль для печати.

std::cout может печатать не только текст, но и числа:

Это дает результат:

Его также можно использовать для вывода значений переменных:

Это дает результат:

Чтобы напечатать несколько элементов в одной строке, для объединения (связывания) нескольких частей выводимых данных, оператор вставки ( << ) можно использовать несколько раз в одном выражении. Например:

Эта программа печатает:

Вот еще один пример, в котором мы печатаем и текст, и значение переменной в одном выражении:

Эта программа печатает:

std::endl

Как вы думаете, что напечатает следующая программа?

Результат может вас удивить:

Отдельные выражения вывода не приводят к отдельным выводимым строкам в консоли.

Если мы хотим выводить в консоль отдельные выводимые строки, нам нужно указать консоли, когда необходимо переместить курсор на следующую строку.

Один из способов сделать это – использовать std::endl . При выводе с помощью std::cout , std::endl выводит в консоль символ новой строки (заставляя курсор переместиться в начало следующей строки). В этом контексте endl означает «end line» (конец строки).

Совет

В приведенной выше программе второй std::endl технически не нужен, так как программа сразу же после этого завершается. Однако он служит двум полезным целям: во-первых, он помогает указать, что строка вывода является «законченной мыслью». Во-вторых, если мы позже захотим добавить дополнительные выражения вывода, нам не нужно будет изменять существующий код. Мы можем просто добавить новые выражения.

std::endl против '\n'

Использование std::endl может быть немного неэффективным, поскольку фактически выполняет две задачи: перемещает курсор на следующую строку и «очищает» вывод (обеспечивает немедленное отображение на экране). При записи текста в консоль с использованием std::cout , std::cout обычно всё равно очищает вывод (а если нет, это обычно не имеет значения), поэтому наличие очистки от std::endl редко бывает важным.

Из-за этого обычно предпочтительнее использовать символ '\n' . Символ '\n' перемещает курсор на следующую строку, но не выполняет избыточную очистку, поэтому он работает лучше. Символ '\n' также легче читать, поскольку он короче и может быть встроен в существующий текст.

Вот пример, в котором '\n' используется двумя разными способами:

Этот код напечатает:

Обратите внимание, что когда '\n' используется сам по себе для перемещения курсора на следующую строку, необходимы одинарные кавычки. При встраивании в текст, который уже заключен в двойные кавычки, одинарные кавычки не нужны.

Мы рассмотрим, что такое '\n' более подробно, когда перейдем к уроку о символах (4.11 – Символы).

Лучшая практика

При выводе текста в консоль лучше использовать '\n' вместо std::endl .

Предупреждение

'\n' использует обратный слеш (как и все специальные символы в C++), а не прямой слеш. Использование прямого слеша (например, '/n' ) может привести к неожиданному поведению.

std::cin

std::cin – еще одна предопределенная переменная, определенная в библиотеке iostream . В то время как std::cout выводит данные в консоль с помощью оператора вставки ( << ), std::cin (что означает «character input», «ввод символов») считывает ввод с клавиатуры с помощью оператора извлечения ( >> ). Для дальнейшего использования входные данные должны быть сохранены в переменной.

Попробуйте скомпилировать эту программу и запустить ее самостоятельно. Когда вы запустите программу, строка 6 напечатает «Enter a number: ». Когда код дойдет до строки 10, ваша программа будет ждать, пока вы введете данные. После того, как вы введете число (и нажмете клавишу Enter ), введенное вами число будет присвоено переменной x . Наконец, в строке 11 программа напечатает «You entered », а затем число, которое вы только что ввели.

Например (я ввел 4):

Это простой способ получить от пользователя ввод с клавиатуры, и в будущем мы будем использовать его во многих наших примерах. Обратите внимание, что вам не нужно использовать '\n' при принятии входных данных, так как пользователю нужно будет нажать клавишу Enter , чтобы его входные данне были принят, а это переместит курсор на следующую строку.

Если ваш экран закрывается сразу после ввода числа, обратитесь к уроку «0.8 – Несколько основных проблем C++» для решения этой проблем.

Лучшая практика

Существуют споры о том, нужно ли инициализировать переменную непосредственно перед тем, как передать ей значение, предоставленное пользователем, через другой источник (например, std::cin ), поскольку значение, предоставленное пользователем, просто перезапишет значение инициализации. В соответствии с нашей предыдущей рекомендацией о том, что переменные всегда следует инициализировать, лучше всего сначала инициализировать переменную.

Мы обсудим, как std::cin обрабатывает недопустимые входные данные в следующем уроке (7.16 – std::cin и обработка недопустимых входных данных).

Для продвинутых читателей

Библиотека ввода/вывода C++ не позволяет принимать ввод с клавиатуры без нажатия пользователем клавиши Enter . Но если вам это нужно, то вам придется использовать стороннюю библиотеку. Для консольных приложений мы рекомендуем библиотеку pdcurses. Многие графические пользовательские библиотеки имеют для этого свои собственные функции.

Резюме

Программисты-новички часто путают std::cin , std::cout , оператор вставки ( << ) и оператор извлечения ( >> ). Вот простой способ запомнить:

  • std::cin и std::cout всегда идут в левой части выражения;
  • std::cout используется для вывода значения (cout = character output);
  • std::cin используется для получения входного значения (cin = character input);
  • << используется с std::cout и показывает направление движения данных (если std::cout представляет консоль, выходные данные перемещаются из переменной в консоль). std::cout << 4 перемещает значение 4 в консоль;
  • >> используется с std::cin и показывает направление движения данных (если std::cin представляет клавиатуру, входные данные перемещаются с клавиатуры в переменную). std::cin >> x перемещает значение, введенное пользователем с клавиатуры, в x .

Небольшой тест

Вопрос 1

Рассмотрим следующую программу, которую мы использовали выше:

Программа ожидает, что вы введете целочисленное значение, поскольку переменная x , в которую будет помещен пользовательские входные данные, является целочисленной переменной.

Запустите эту программу несколько раз и опишите, что произойдет, если вместо этого вы введете следующие типы входных данных:

а) Буква, например, h .

б) Число с дробной частью. Попробуйте числа с дробными составляющими меньше 0,5 и больше 0,5 (например, 3,2 и 3,7).

Дробная составляющая опущена.

в) Небольшое отрицательное целое число, например -3.

Всё прекрасно работает.

г) Слово, например «Hello».

д) Действительно большое число (минимум 3 миллиарда).

Вы получаете, казалось бы, случайное число.

Последнее предложение может быть особенно неожиданным. Попробуйте! Это происходит потому, что x может содержать числа только до определенного размера. После этого он «переполняется». Мы обсудим переполнение в следующем уроке.

Похожие статьи