Управление порядком выполнения команд с помощью оператора 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";

Управление порядком выполнения команд с помощью оператора if - student2.ru

Управление порядком выполнения команд с помощью оператора if - student2.ru  

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?:



Управление порядком выполнения команд с помощью оператора if - student2.ru  
}

Сколько часов отработал сотрудник номер 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;

Управление порядком выполнения команд с помощью оператора if - student2.ru  
Управление порядком выполнения команд с помощью оператора if - student2.ru  

in_stream.get(character);

}

in_stream.close();

while (count > 0)

cout<< file[--count];

return 0;

Программа 1.2.

В заголовке цикла "for" обратите внимание на условие "... && count < MAX

...", специально предусмотренное для предотвращения выхода за пределы массива.

Наши рекомендации