Управление порядком выполнения команд с помощью оператора if
В нескольких последних строках программы (до строки "return 0") записано:
if (another_age >= 0)
{
cout<< "В " <<another_year<< " году вам будет ";
cout<< another_age << "\n";
}
else
{
cout << "В " << another_year << " вы еще не родились!\n";
}
Оператор ветвления (условный оператор) "if...else..." выглядит примерно
одинаково во всех процедурных языках программирования. В Си++ он называется
просто оператором if, и его общая структура такова:
if ( условие )
{
Оператор1;
...
...
ОператорN;
}
else
{
ОператорN+1;
...
...
ОператорN+M;
}
Часть "else (иначе)" в операторе if необязательна. Более того, если после
"if ( условие )" стоит только один оператор, то можно опустить фигурные скобки и
записать оператор так:
if ( условие )
Оператор1;
В программах условные операторы часто встречаются группами, например:
...
...
if (total_test_score < 50)
cout<< "Вынепрошлитест. Выучите материал как следует.\n";
else if (total_test_score < 65)
cout << "Вы прошли тест со средним результатом.\n";
else if (total_test_score < 80)
cout << "Вы хорошо выполнили тест.\n";
else if (total_test_score < 95)
cout << "Вы показали отличный результат.\n";
else
{
cout << "Вы сдали тест нечестно!\n";
total_test_score = 0;
}
...
...
Приведенный фрагмент программы может показаться довольно сложным. Тем
не менее, он соответствует правилам Си++. Это легко понять, если обратиться к син-
таксической диаграмме оператора if (рис. 4).
В овальных или круговых рамках на синтаксических диаграммах указываются
элементы языка, которые буквально так и воспроизводятся в исходном тексте про-
грамм. В прямоугольных рамках приведены элементы, требующие дальнейшего оп-
ределения, возможно, с помощью других синтаксических диаграмм. Набор таких диа-
грамм служит формальным описанием синтаксиса языка программирования.
Обратите внимание, что на рис. 4 отсутствует символ ";" и разделители "{}".
Эти элементы языка включены в определение (и синтаксическую диаграмму) для
обобщенного понятия "оператор языка Си++".
Рис. 4. Синтаксическая диаграмма оператора if.
При обработке приведенного фрагмента программы компилятор Си++ трактует
весь текст, выделенный ниже полужирным шрифтом, как один оператор после перво-
гослова else.
...
...
if (total_test_score < 50)
cout<< "Вынепрошлитест. Выучите материал как следует.\n";
elseif (total_test_score < 65)
cout << "Вы прошли тест со средним результатом.\n";
else if (total_test_score < 80)
cout << "Вы хорошо выполнили тест.\n";
|
else if (total_test_score < 95)
cout << "Вы показали отличный результат.\n";
Else
{
cout << "Вы сдали тест нечестно!\n";
total_test_score = 0;
}
...
...
Массивы
Назначение массивов
В программировании часто возникают задачи, связанные с обработкой боль-
ших объемов данных. Для постоянного хранения этих данных удобно пользоваться
файлами. Например, в программе для ввода и сортировки длинных числовых списков
данные можно ввести с клавиатуры один раз и сохранить в файле для последующего
многократного использования. Но до сих пор не было рассмотрено удобного способа
представления больших объемов данных внутри программ. Для этой цели в Си++
часто применяются массивы – простейшая разновидность структурных типов дан-
ных (о более сложных структурах данных будет говориться в следующих лекциях).
Массив – это набор переменных одного типа ("int", "char" и др.). При объявле-
нии массива компилятор выделяет для него последовательность ячеек памяти, для
обращения к которым в программе применяется одно и то же имя. В то же время мас-
сив позволяет получить прямой доступ к своим отдельным элементам.
1.1 Объявление массивов
Оператор описания массива имеет следующий синтаксис:
<тип данных><имя переменной>[<целое значение>];
Допустим, в программе требуется обрабатывать данные о количестве часов, от-
работанных в течении недели группой из 6-ти сотрудников. Для хранения этих дан-
ных можно объявить массив:
int hours[6];
или, лучше, задать численность группы с помощью специальной константы:
const int NO_OF_EMPLOYEES = 6;
int hours[NO_OF_EMPLOYEES];
Если подобные массивы будут часто встречаться в программе, то целесообраз-
ноопределитьновыйтип:
const int NO_OF_EMPLOYEES = 6;
typedef int Hours_array[NO_OF_EMPLOYEES];
Hours_array hours;
Hours_array hours_week_two;
В любом из трех перечисленных вариантов, в программе будет объявлен мас-
сив из 6 элементов типа "int", к которым можно обращаться с помощью имен:
hours[0]
hours[1]
hours[2]
hours[3]
hours[4]
hours[5]
Каждое из этих имен является именем элемента массива. Числа 0, ..., 5 назы-
ваются индексами элементов. Отличительная особенность массива заключается в том,
что его элементы – однотипные переменные – занимают в памяти компьютера после-
довательные ячейки памяти (рис. 1).
Рис. 1.. Расположение элементов массива в оперативной памяти (направление
сверху вниз соответствует возрастанию адресов ячеек памяти).
1.2 Использование элементов массивов в выражениях
С элементами объявленного массива можно выполнять все действия, допусти-
мые для обычных переменных этого типа (выше был приведен пример целочисленно-
го массива, т.е. типа "int"). Например, возможны операторы присваивания наподо-
бие:
hours[4] = 34;
hours[5] = hours[4]/2;
или логические выражения с участием элементов массива:
if (number < 4 && hours[number] >= 40) { ...
Присвоить значения набору элементов массива часто бывает удобно с помо-
щью циклов "for" или "while". В программе 1.1 в цикле у оператора запрашивается
количество часов, отработанных каждым сотрудником группы за неделю. Хотя более
естественной может показаться нумерация сотрудников от 1 до 6, а не от 0 до 5, но
необходимо помнить, что индексация массивов в Си++ начинается с 0. Поэтому про-
грамма 1.1 вычитает 1 из порядкового номера сотрудника, чтобы вычислить индекс
соответствующего элемента массива.
#include <iostream.h>
const int NO_OF_EMPLOYEES = 6;
typedef int Hours_array[NO_OF_EMPLOYEES];
int main()
{
Hours_array hours;
int count;
for ( count = 1; count <= NO_OF_EMPLOYEES; count++ )
{
cout << "Сколько часов отработал сотрудник";
cout<< " номер " << count << "?: ";
cin>> hours[count - 1];
}
return 0;
Программа 1.1.
В типичном сеансе работы программа 1.1 выведет на экран подобные сообщения:
Сколько
Сколько
Сколько
Сколько
часов
часов
часов
часов
отработал
отработал
отработал
отработал
сотрудник
сотрудник
сотрудник
сотрудник
номер
номер
номер
номер
1?:
2?:
3?:
4?:
|
|
Сколько часов отработал сотрудник номер 5?:38
Сколько часов отработал сотрудник номер 6?:37
На рис. 2. показано состояние целочисленного массива после ввода этих данных.
Рис. 2.. Состояние массива после присвоения значений его элементам.
Полезно разобраться, что произошло бы, если бы в программе 1.1 внутри цикла
"for" в операторе "cin ..." отсутствовало бы вычитание 1 из переменной "count".
Компилятор Си++ (в отличие, например, от Паскаля) не обнаруживает ошибки выхо-
да за пределы массива, поэтому участок памяти компьютера с массивом и сразу за
ним оказался бы в состоянии, показанном на рис. 3.
Рис. 3.. Ошибка выхода за пределы массива.
Другими словами, значение "37" было бы размещено в ячейке памяти, доста-
точной для хранения целого числа, которая расположена сразу после массива "hours".
Это чрезвычайно нежелательная ситуация, потому что компилятор может зарезерви-
ровать эту ячейку памяти для другой переменной (например, для переменной
"count").
Массивы могут быть любого типа, не обязательно типа "int". Ниже приведена
программа 1.2, в которой символьный ("char") массив применяется для печати собст-
венного исходного файла на экране в обратном порядке.
#include <iostream.h>
#include <fstream.h>
const int MAX_LEN = 1000;
typedef char File_array[MAX_LEN];
int main()
{
char character;
File_array file;
int count;
ifstream in_stream;
in_stream.open("prg6_1_2.cpp");
in_stream.get(character);
for ( count = 0; !in_stream.eof() && count < MAX_LEN; count++ )
{
file[count] = character;
|
|
in_stream.get(character);
}
in_stream.close();
while (count > 0)
cout<< file[--count];
return 0;
Программа 1.2.
В заголовке цикла "for" обратите внимание на условие "... && count < MAX
...", специально предусмотренное для предотвращения выхода за пределы массива.