Консольный ввод-вывод
Консольный ввод-вывод организуется с помощью стандартных библиотек stdio.h и conio.h, что предполагает наличие директив #include <stdio.h> и / или #include <conio.h> в заголовочной части программы.
Функция printf используется для вывода информации на экран. С ее помощью в окне приложения можно распечатать как строку простого текста, так и значения переменных различных типов. Общая форма записи соответствующего оператора
printf («форматная_строка» [, перем1] [, перем2] [,…]);
Здесь в круглых скобках указаны параметры (или аргументы) функции printf, причем первый из них, форматная строка в двойных кавычках, является обязательным. Остальные параметры, переменные различного типа, указываются по необходимости. Форматная строка может содержать:
обычные текстовые символы, которые выводятся на экран в том же виде, как они записаны в форматной строке,
управляющие символы, в частности символы перевода строки «\n», табуляции «\t», и некоторые другие (начинаются со знака обратной косой черты «\»),
символы форматного преобразования, которые используются для вывода значений переменных (начинаются со знака процента «%»).
Вслед за форматной строкой, в функции printf через запятую может быть указан список всех переменных, значения которых выводятся на экран. При этом внутри форматной строки должны быть размещены соответствующие символы форматного преобразования. Численное значение переменной будет выведено в ту позицию, в которой указан соответствующий символ. Символы преобразования для стандартных типов данных указаны в следующей таблице
переменная | тип данных С/C++ | символ преобразования |
целое число | int | %d |
вещественное число | float, double | %f |
текстовый символ | char | %c |
текстовая строка | char *, char [] | %s |
К примеру, запись printf («Hello!») означает вывод на экран простой текстовой строки «Hello!». Запись printf («%d», x) выводит на экран значение целочисленной переменной x. Случай, когда на экран выводятся сразу две переменные, иллюстрируется следующим примером
Здесь верхние стрелки указывают позиции внутри форматной строки, куда будут выведены значения переменных i и x. Остальной текст форматной строки будет отображен без изменения. К примеру, если переменная i к моменту выполнения этого оператора имела значение 5, а переменная x была равна 1.5, на экран будет выведено: «Значение 5‑й переменной равно 1.500000».
Важным является соответствие символа форматного преобразования (%d, %f, и т.д.) действительному типу переменной (int, float, double и т.д.). Несоблюдение этого правила ведет к непредсказуемому результату на экране. Поэтому использованная в примере переменная i должна быть объявлена ранее как целочисленная (int), а x – как вещественная (float или double).
Функция printf также дает возможности управления выводом с помощью эскейп-последовательностей, начинающихся с символа ESC (обратный слэш «\»). Некоторые из них приведены в таблице:
управляющий символ | название | действие |
\n | lf (line feed) | перевод строки |
\t | ht (horizontal tab) | горизонтальная табуляция |
\v | vt (vertical tab) | вертикальная табуляция |
\a | bel (audible bell) | звуковой сигнал |
\b | bs (backspace) | возврат на шаг (забой) |
\’ | ‘ (single quote) | одинарная кавычка |
\» | «(double quote) | двойная кавычка |
Консольный ввод может быть организован с помощью функции scanf. Вводимая при этом информация помещается в некоторую переменную. Общая форма записи этого оператора
scanf («форматная_строка», &перем1 [, &перем2] [,…]);
Аргументы функции scanf во многом аналогичны соответствующим аргументам printf, за исключением того, что в качестве дополнительных параметров scanf принимает не имена переменных, а их адреса. В силу этого перед именем каждой переменной в scanf должен стоять знак операции взятия адреса «&» (амперсанд).
В момент передачи управления функции scanf выполнение программы приостанавливается в ожидании ввода от пользователя. Вся вводимая с клавиатуры информация отображается на экране (эхо-вывод). Во время ввода пользователю доступны простейшие возможности редактирования, в частности клавиша забоя Backspace. Выполнение оператора завершается, как только пользователь нажимает клавишу Enter. Введенная информация при этом будет приведена к соответствующему типу и записана в переменную.
Функция getch из библиотеки conio.h не имеет параметров и используется для ввода с клавиатуры отдельного символа нажатой клавиши. В отличие от scanf, эта функция не требует нажатия Enter для подтверждения конца ввода. Оператор завершает работу сразу после того, как нажата любая клавиша. Ваша программа может анализировать возвращаемое этой функцией значение с тем, чтобы немедленно на него реагировать. Мы будем также использовать эту функцию в конце программы для того, чтобы приостановить закрытие окна на время ознакомления с результатами работы.
Рассмотрим следующий пример работы с функциями консольного ввода-вывода.
Пример 1. Напишите программу, выводящую на экран символы звездочки «*» в форме ромба, как это показано на рисунке справа.
Решение. Задача может быть решена несколькими способами. Ниже приводится один из вариантов.
// – Консольный вывод –
#pragma hdrstop
#include <stdio.h> // Подключаем библиотеки
#include <conio.h> // консольного ввода-вывода
#pragma argsused
int main (int argc, char* argv[])
{
printf (» *\n»); // В программе используем несколько
printf (» * *\n»); // последовательных вызовов функции
printf (» * *\n»); // printf для вывода на экран
printf («* *\n»); // отдельных строк рисунка.
printf (» * *\n»); // Каждую строку заканчиваем
printf (» * *\n»); // управляющим символом ‘\n’.
printf (» *\n»); //
getch(); // Задержка до нажатия любой клавиши
return 0; // Завершение программы
}
// –
Потоковый ввод-вывод
Потоковый ввод-вывод организуется с помощью библиотеки iostream.h, что предполагает наличие директивы #include <iostream.h> в заголовочной части программы. В библиотеке определены два потоковых объекта с именами cin и cout, которые связаны с клавиатурой и экраном компьютера соответственно. Эти объекты используются как источник входящей информации (поток cin) и контейнер исходящей информации (поток cout). Для них определены следующие операции:
извлечение из потока cin (знак операции «>>»),
размещение в потоке cout (знак операции «<<»).
Общая форма записи этих операций
cin >> переменная;
cout << текстовая строка_или_переменная;
Здесь первая строка означает извлечение числового значения из потока cin (т.е. ввод с клавиатуры) и его запись в переменную. Вторая строка – размещение простой текстовой стоки или числового значения переменной в потоке cout (т.е. вывод на экран).
Примеры:
cout << index; // выводит на экран значение index
cin >> x; // вводит значение x с клавиатуры
cout << «Enter your name»; // выводит текстовую строку
cin >> name; // вводит переменную name
В отличие от соответствующих конструкций консольного ввода-вывода, потоковые операторы нигде не требуют явного указания типа переменных. В приведенных выше примерах index, x, name могут быть переменными любого типа (int, float, char и т.д.), и во всех случаях представленные операторы будут работать корректно. Это происходит за счет автоматического определения типа переменной в потоковых операциях. Программист получает дополнительные удобства в связи с исключением ошибок приведения типов, которые характерны для консольных операций. Начинающим программистам C++ часто рекомендуется использовать именно потоковые операции, как более надежную (и современную) технику программирования.
Поток cout допускает наличие в выводимой текстовой строке управляющих символов или ESC‑последовательностей (`\n`, `\t`, `\b` и др., см. таблицу выше), действие которых аналогично их действию в операторе printf. Кроме того, вывод в cout может управляться с помощью специальных потоковых манипуляторов. Например, манипулятор endl (end line) приводит к завершению текущей строки и переводу курсора на новую экранную строку. Запись cout << endl, таким образом, приводит к тому же результату, что и конструкция cout << «\n».
Решение сформулированной выше задачи о выводе на экран фигуры в форме ромба средствами потокового ввода-вывода показано в следующем листинге
// – Потоковый вывод –
#pragma hdrstop
#include <iostream.h> // для потокового вывода в cout
#include <conio.h> // для использования getch
#pragma argsused
int main (int argc, char* argv[])
{
cout << «*\n»;
cout << «* *\n»;
cout << «* *\n»;
cout << «* *\n»;
cout << «* *\n»;
cout << «* *\n»;
cout << «*\n»;
getch();
return 0;
}
// –
Откомпилируйте код этой программы, запустите на выполнение и проверьте результат.
Арифметические операции и математические функции
Выполнение вычислений составляют основу подавляющего большинства компьютерных программ. Для этой цели C++ использует множество арифметических операций, каждая из которых имеет свой знак. Ниже приведена таблица наиболее употребительных бинарных операций, то есть операций c двумя аргументами, с примерами их программной записи
название операции | знак в С/C++ | алгебраическое выражение | запись на С/C++ |
сложение | + | f + 7 | f + 7 |
вычитание | - | p – c | p – c |
умножение | * | bm | b*m |
деление | / | x/y | x/y |
остаток от деления | % | r mod s | r% s |
Круглые скобки в арифметических выражениях C++ используются так же, как в алгебре. При определении порядка вычислений сложных выражений C++ придерживается стандартных правил старшинства операций: первыми выполняются операции в скобках; затем операции умножения, деления, и вычисления остатка; в завершение – операции сложения и вычитания. Пример:
алгебра: ® запись на С/C++:.
В последнем выражении скобки необходимы для сохранения правильного порядка операций – сначала суммирование, затем деление.
Кроме арифметических операций, язык C++ дает удобные возможности использования математических функций. Большая их часть содержится в библиотеке math.h, и для пользования ими требуется соответствующая директива #include <math.h>. Наиболее употребительные математические функции приведены в таблице:
название функции | обозначение | запись в С/С++ |
синус | sin(x) | |
косинус | cos(x) | |
тангенс | tan(x) | |
квадратный корень | sqrt(x) | |
возведение в степень | pow (x, y) | |
экспонента | exp(x) | |
натуральный логарифм | log(x) | |
модуль | fabs(x) | |
арксинус | asin(x) | |
арккосинус | acos(x) | |
арктангенс | atan(x) |
Все перечисленные функции принимают в качестве аргумента вещественную переменную (или константу) и возвращают вещественный результат. Использовать функции можно путем их вызова, аналогично вызову функций ввода-вывода. Например, в результате выполнения следующего набора операторов переменная y получит значение квадратного корня из 2:
float x = 2.0; float y = sqrt(x);
В библиотеке math.h также определены некоторые часто используемые математические константы, часть из которых приведена ниже
константа | запись в С/С++ |
M_PI | |
M_E | |
M_LN2 | |
M_LN10 |
Необходимо написать программу, запрашивающую у пользователя длины сторон треугольника a, b, c и выводящую на экран углы a, b, g.
Решение. Воспользуемся известной формулой косинусов, которую последовательно применим для нахождения всех углов треугольника. Рассчитанные значения a, b, g переведем из радианов в градусы, помножив их на 180°/p.
// – Расчет углов треугольника –
#pragma hdrstop
#include <iostream.h> // для потокового ввода-вывода
#include <conio.h> // для getch()
#include <math.h> // для acos(x) и M_PI
#pragma argsused
int main (int argc, char* argv[])
{
float a, b, c; // объявляем переменные a, b, c
cout << «input a –»; // выводим на экран приглашение
cin >> a; // вводим значение a, и т.д.
cout << «input b –»;
cin >> b;
cout << «input c –»;
cin >> c;
float alpha, betta, gamma; // объявляем переменные
alpha = acos((b*b + c*c – a*a)/(2*b*c)); // считаем alpha
betta = acos((a*a + c*c – b*b)/(2*a*c)); // считаем betta
gamma = acos((a*a + b*b – c*c)/(2*a*b)); // считаем gamma
cout << «\n alpha =» << alpha/M_PI*180; // выводим все
cout << «\n betta =» << betta/M_PI*180; // углы на экран
cout << «\n gamma =» << gamma/M_PI*180; // (в градусах)
cout << «\n» << alpha + betta + gamma; // сумма углов=pi?
getch(); // задержка
return 0; // завершение
}
// –