Опубликован: 25.08.2010 | Доступ: свободный | Студентов: 6099 / 598 | Оценка: 3.91 / 3.44 | Длительность: 11:09:00
Лекция 2:

Простейшие программы

< Лекция 1 || Лекция 2: 123 || Лекция 3 >

Простейшие средства ввода/вывода

Любая программа каким-либо образом взаимодействует с внешним миром. В простейшем случае это работа с консолью: ввод с клавиатуры и вывод на экран. В языке С++ нет встроенных средств ввода/вывода - он осуществляется с помощью средств, содержащихся в стандартных библиотеках. Рассмотрим два примера.

// используются классы стандартной библиотеки
#include <iostream>                 // 1
using namespace std;                      // 2
int main()                                // 3
{   const double course = 35.8;           // 4
    double sum;                           // 5
    cout << "Введите сумму в рублях:\n";  // 6
    cin >> sum;                     // 7
    double euro = sum / course;           // 8
    cout << "В рублях: " << sum 
		 << " В евро: " << euro 
		 << "\n";         // 9
    return 0;                             // 10
}
Листинг 2.1. Программа перевода рублей в европейскую валюту

Это первый пример законченной программы, поэтому рассмотрим его подробно. В первой строке записана директива препроцессора. Директива вида

#include <имя_файла>

вставляет содержимое указанного файла (он называется заголовочным ) в ту точку исходного файла, где она расположена. В данном случае директива задает включение файла <iostream>, в котором содержатся описания используемых в программе элементов стандартной библиотеки ввода/вывода.

Строка 2 является описанием, по которому программе становятся доступными все имена, определенные в стандартном заголовочном файле <iostream>. Дело в том, что внутри этого файла все описания спрятаны в так называемую поименованную область (пространство имен) с именем std. Это касается всех стандартных заголовочных файлов и сделано для того, чтобы стандартные имена не конфликтовали с теми, которые ввел программист.

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

ПРИМЕЧАНИЕ

Для многих заголовочных файлов, содержимое которых определено в пространстве имен std, существуют их двойники "старого стиля" с расширением .h,описания, находящиеся в которых, доступны без дополнительных усилий - например, <iostream.h>, <stdio.h>. Заголовочные файлы, унаследованные из языка С, записываются при этом без ведущей буквы c. Этот способ использования заголовочных файлов считается устаревшим.

Строка 3 представляет собой заголовок главной (и единственной) функции, в строках 4 и 5 описаны две величины с плавающей точкой: константа course и переменная sum. Строка 6 является приглашением к вводу. В результате выполнения этого оператора на экран выводится строка "Введите сумму в рублях:" и курсор переводится на следующую строку в соответствии с управляющей последовательностью \n. Стандартному объекту cout с помощью операции << передается то, что мы хотим вывести, в данном случае строковый литерал. Для вывода нескольких элементов используется цепочка операций, как в строке 9. Все величины, кроме символов и строк, при выводе преобразуются из внутренней формы представления в последовательность символов. Под величину отводится ровно столько позиций, сколько требуется для ее вывода.

В процессе ввода ( строка 7 ) происходит обратный процесс: величина преобразуется из последовательности символов, набранных на клавиатуре, во внутреннее представление числа с плавающей точкой и помещается в ячейку памяти, зарезервированную для переменной sum. Как видите, семантика ввода проста и интуитивно понятна: значение со стандартного ввода передается в переменную, указанную справа от знака операции. Если требуется ввести несколько величин, используется цепочка операций >>.

В строке 8 определяется переменная euro, которая инициализируется результатом деления переменной sum на переменную course. В строке 10 в вызывающую среду возвращается значение 0 - признак успешного завершения программы. Оператор return 0 в главной функции записывать не обязательно, поскольку при его отсутствии значение 0 будет возвращено автоматически. Во всех последующих примерах этот оператор опущен для экономии места.

Другой вариант записи той же программы приведен в листинге 2.2.

// используются функции ввода/вывода в стиле С
#include <сstdio>                         // 1
using namespace std;                      // 2
int main()                                // 3
{   const double course = 36.5;           // 4
    double sum;                           // 5
    printf( "Введите сумму в рублях\n" ); // 6
    scanf( "%lf", &sum );     // 7
    double euro = sum / course;           // 8
    printf( "В рублях: %lf В евро: %lf\n", sum, euro ); // 9
}
Листинг 2.2. Программа перевода рублей в европейскую валюту

По директиве препроцессора, расположенной в первой строке, в текст программы вставляется заголовочный файл <cstdio>, содержащий описание использованных в программе функций ввода/вывода. Функция printf в строке 6 выводит приглашение "Введите сумму в рублях:" и переходит на новую строку в соответствии с управляющей последовательностью \n. Функция scanf в строке 7 заносит введенное с клавиатуры число в переменную sum. Знак & обозначает операцию получения адреса переменной sum. Это нужно чтобы функция scanf могла записать в эту переменную введенное с клавиатуры значение.

Формат основных функций ввода-вывода, унаследованных из С:

int scanf ( строка_формата, список адресов вводимых величин )      // ввод
int printf( строка_формата, список выводимых величин )              // вывод

Функции выполняют форматированный ввод и вывод произвольного количества величин в соответствии со строкой формата. Она содержит символы, которые копируются на экран при выводе или запрашиваются с клавиатуры при вводе, и спецификации преобразования, начинающиеся со знака %, которые при вводе и выводе заменяются конкретными величинами. Каждой величине должна соответствовать своя спецификация.

Спецификация %d означает целое десятичное число, %f используется для величин типа float, %lf - для величин типа double. Оператор в строке 9 выводит на экран указанную в нем строку, заменив спецификации преобразования %lf на значения переменных sum и euro.

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

Особенности вывода кириллицы

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

Коды символов определяются реализацией, в частности, возможностями операционной системы. Набор кодов для некоторого множества символов называется кодовой страницей (кодировкой).Проблема вывода русских букв в консольное окно возникла при переходе от операционной системы MS DOS к системе Windows. В консольном окне Windows по умолчанию используется кодировка, принятая в MS DOS, для того чтобы старые программы MS DOS правильно работали в консольном окне Windows. Однако среда разработки Visual Studio.NET 2005 работает в системе Windows, в которой по умолчанию установлена другая кодовая страница. Русские символы, набираемые в окне редактора среды, имеют другую кодировку, и поэтому в консольном окне видны как "иероглифы".

Есть множество способов решения этой проблемы. Самый простой - вообще отказаться от русских букв. Если же все-таки хочется их использовать, проще всего воспользоваться функцией setlocale, унаследованной из языка С (она описана в заголовочном файле <clocale>):

setlocale( LC_ALL, "Russian" );
setlocale( LC_ALL, "rus" );

Любой из этих вызовов устанавливает русскую локаль,после чего русские константы выводятся в консольное окно по-русски при использовании и printf, и cout.

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

Выражения

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

( a + 0.12 ) / 6
x && y || ! z
( t * sin( x ) - 1.05e4 ) / ( ( 2 * k + 2 ) * (2 * k + 3 ) )
a = b = c 
b++
cout << a
i++, j++

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

Язык С++ предоставляет в наше распоряжение внушительный набор операций: арифметические, логические, поразрядные, операции отношения, выделения памяти, преобразования типа, выбора и т. д. В таблице 2.1 приведены простейшие операции, с которых мы начнем изучение.

Таблица 2.1. Простейшие операции языка С++
Операция Краткое описание
Унарные операции
++ постфиксный инкремент
-- постфиксный декремент
sizeof размер объекта или типа
-- префиксный декремент
++ префиксный инкремент
! логическое отрицание
- арифметическое отрицание (унарный минус)
+ унарный плюс
(<тип>) преобразование типа
Бинарные и тернарная операции
* умножение
/ деление
% остаток от деления
+ сложение
- вычитание
< меньше
<= меньше или равно
> больше
>= больше или равно
== равно
!= не равно
&& логическое И
|| логическое ИЛИ
? : условная операция (тернарная)
= присваивание
*= умножение с присваиванием
/= деление с присваиванием
%= остаток отделения с присваиванием
+= сложение с присваиванием
-= вычитание с присваиванием
, последовательное вычисление

Операции расположены в порядке убывания приоритета, операции с разными приоритетами отделены горизонтальной чертой. Уровней приоритетов в языке С++ огорчительно много, поэтому в случае сомнений надо не лениться обращаться к справочной информации. Основные правила, тем не менее, просты и соответствуют принятым в математике: например, вычитание имеет более низкий приоритет, чем умножение, поэтому для того, чтобы оно было выполнено раньше, соответствующая часть выражения заключается в скобки.

Если в одном выражении записано несколько операций одинакового приоритета, то унарные операции, условная операция и операции присваивания выполняются справа налево, остальные - слева направо. Например, a = b = c означает a = (b = c), а a + b + c означает (a + b) + c.

Порядок вычисления операндов в выражении не определен: например, нельзя считать, что в выражении (sin(x + 2) + cos(y + 1)) обращение к синусу будет выполнено раньше, чем к косинусу. Только четыре операции гарантируют порядок вычислений слева направо: ,, ?:, && и ||.

Результат вычисления выражения характеризуется значением и типом. Например, пусть описаны две переменные целого типа a и b:

int a = 2, b = 5;

Тогда выражение a + b имеет значение 7 и тип int. В С++ различаются так называемые L-значения (L-value) и R-значения (R-value). Название произошло от операции присваивания:

  • Выражение, являющееся L -значением (от слова Left - левый), может располагаться как с левой, так и с правой стороны операции присваивания;
  • Выражение, являющееся R -значением (от слова Right - правый), может располагаться только с правой, но никак не с левой стороны операции присваивания.

Выражения возвращают в качестве результата либо L -значения, либо R -значения. Переменная - частный случай L -значения, а константа - частный случай R -значения. Более общим случаем R -значения является обычное арифметическое выражение. L -значением в общем случае может быть не только переменная, но и некоторое выражение, ссылающееся на область памяти. В дальнейшем мы будем указывать, какие операции возвращают L -значение.

< Лекция 1 || Лекция 2: 123 || Лекция 3 >
Dana Kanatkyzi
Dana Kanatkyzi
Здравствуйте.Помогите решить задачу минимум 4 чисел.Условие такое:"Напишите функцию int min (int a, int b, int c, int d) (C/C++)"находящую наименьшее из четырех данных чисел."Заранее спасибо!
Александр Мигунов
Александр Мигунов
Россия