Смекни!
smekni.com

Основы программирования на языке Си (стр. 12 из 27)

#include <iostream.h>

#include <fstream.h>

int main()

{

char character;

int integer;

ofstream out_stream;

ifstream in_stream;

// Создание текстового файла и запись в него двух целых чисел

out_stream.open( "Integers.txt" );

out_stream << 123 << ' ' << 456;

out_stream.close();

// Попытка чтения из только что созданного файла

// "Integers.txt" символа, затем целого числа,

// затем снова символа, затем опять целого числа.

in_stream.open( "Integers.txt" );

in_stream >> character >> integer;

cout << "символ: '" << character << "'&bsol;n";

cout << "целое число: " << integer << "&bsol;n";

in_stream >> character >> integer;

cout << "символ: '" << character << "'&bsol;n";

cout << "целое число: " << integer << "&bsol;n";

in_stream.close();

return 0;

}

52

ЛЕКЦИЯ 5. Операторы ветвления и циклы

1. Логические значения, выражения и функции

В этой лекции подробно рассматриваются операторы ветвления ("if" и

"switch") и операторы циклов "for" и "while". Для применения всех этих операто-

ров необходимо хорошо знать, что такое логические выражения и как они вычисля-

ются.

Язык Си++ унаследовал от языка Си соглашение, согласно которому целое

значение 0 считается логическим "false" (ложное значение), а ненулевое целое ло-

гическим "true" (истинным значением). Но выражения вроде

условие1 == 1

или

условие2 == 0

не слишком удобны при чтении теста программ человеком. Было бы лучше записы-

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

условие1 == true

и

условие2 == false

Поэтому в Си++ был добавлен специальный логический тип "bool". Перемен-

ные типа "bool" могут принимать значения "true" и "false", которые при необхо-

димости автоматически преобразуются в выражениях в значения 1 и 0.

Тип данных "bool" можно использовать в программах точно так же, как и ти-

пы "int", "char" и др. (например, для описания переменных или для создания функ-

ций, возвращающих значения типа "bool").

Программа 1.1 приведена в качестве примера использования типа данных

"bool". Она запрашивает с клавиатуры возраст кандидата, сдававшего некий тест, и

полученную кандидатом оценку в баллах. Затем программа оценивает результат вы-

полнения теста по шкале, зависящей от возраста кандидата и делает вывод о том, сдан

тест или нет. Для кандидатов до 14 лет порог сдачи теста составляет 50 баллов, для 15

или 16 лет 55 баллов, старше 16-ти лет 60 баллов.

#include <iostream.h>

bool acceptable( int age, int score );

int main()

{

int candidate_age, candidate_score;

cout << "Введите возраст кандидата: ";

cin >> candidate_age;

cout << "Введите результат тестирования: ";

cin >> candidate_score;

if ( acceptable( candidate_age, candidate_score ) )

cout << "Этот кандидат сдал тест успешно.&bsol;n";

else

cout << "Этот кандидат тест не прошел.&bsol;n";

53

return 0;

}

// Функция оценки результата тестирования: тест сдан/не сдан

bool acceptable( int age, int score )

{

if ( age <= 14 && score >= 50 )

return true;

else if ( age <= 16 && score >= 55 )

return true;

else if ( score >= 60 )

return true;

else

return false;

}

Программа 1.1.

2. Циклы "for", "while" и "do...while"

Циклы "for" впервые встречались во 2-й лекции, цикл "while" упоминался в

4-й лекции. Любой цикл "for" можно переписать в виде цикла "while" и наоборот.

Рассмотрим программу 2.1 (она похожа на программу 2.2 из 2-й лекции).

#include <iostream.h>

int main()

{

int number;

char character;

for ( number = 32; number <= 126; number = number + 1 )

{

character = number;

cout << "Символ '" << character;

cout << "' имеет код " << number << "&bsol;n";

}

return 0;

}

Программа 2.1.

Программу 2.1 можно переписать с помощью цикла "while" (программа 2.2):

#include <iostream.h>

int main()

{

int number;

char character;

number = 32;

while ( number <= 126 )

{

character = number;

cout << "Символ '" << character;

cout << "' имеет код " << number << "&bsol;n";

number++;

54

}

return 0;

}

Программа 2.2.

Замена цикла "while" на цикл "for" выполняется совсем просто. Например, в

программе 2.2 строку

while (number <= 126)

можно заменить эквивалентным циклом "for" без операторов инициализации и из-

менения значений:

for ( ; number <= 126; )

В Си++ есть еще один, третий, вариант цикла оператор цикла с постфиксным

условием (постусловием) "do {...} while". Он отличается от циклов "for" и "while"

тем, что тело цикла внутри скобок "{}" обязательно выполняется как минимум один

раз, т.к. условие повторения цикла проверяется только после выполнения тела цикла.

Циклы "Do ... while" используются довольно редко. Например этот цикл можно

применить для проверки корректности введенных с клавиатуры данных (програм-

ма 2.2а).

...

...

do {

cout << "Введите результат тестирования: ";

cin >> candidate_score;

if ( candidate_score > 100 || candidate_score < 0 )

cout << "Допускается оценка от 0 до 100.&bsol;n";

} while ( candidate_score > 100 || candidate_score < 0 );

...

...

Фрагмент программы 2.2a.

В программе 2.2a цикл с постусловием позволяет избавиться от дублирования

операторов печати приглашения и ввода данных, которое возникает при использова-

нии эквивалентного цикла "while" (программа 2.2b).

...

...

cout << "Введите результат тестирования: ";

cin >> candidate_score;

while ( candidate_score > 100 || candidate_score < 0 )

{

cout << "Допускается оценка от 0 до 100.&bsol;n";

cout << "Введите результат тестирования: ";

cin >> candidate_score;

}

...

...

Фрагмент программы 2.2b.

55

3. Множественное ветвление и оператор "switch"

Вложенные операторы "if", предназначенные для выполнения "множествен-

ного ветвления", уже встречались в 1-й лекции. Упрощенная версия этого примера

приведена ниже:

...

...

if ( total_test_score < 50 )

cout << "Вы не прошли тест. Выучите материал как следует.&bsol;n";

else if ( total_test_score < 60 )

cout << "Вы прошли тест со средним результатом.&bsol;n";

else if ( total_test_score < 80 )

cout << "Вы хорошо выполнили тест.&bsol;n";

else if ( total_test_score < 100 )

cout << "Вы показали отличный результат.&bsol;n";

else

{

cout << "Вы выполнили тест нечестно";

сout << "(оценка должна быть меньше 100 баллов)!&bsol;n";

}

...

...

Вложенные операторы "if" выглядят слишком громоздко, поэтому в Си++

реализован еще один способ множественного ветвления оператор "switch". Он по-

зволяет выбрать для выполнения один из нескольких операторов, в зависимости от

текущего значения определенной переменной или выражения.

В приведенном выше примере сообщение для печати выбирается в зависимо-

сти от значения переменной "total_test_score". Это может быть произвольное целое

число в диапазоне от 0 до 100. Диапазон проверяемых значений можно сузить, если

учесть, что оценка теста проверяется с точностью до 10-ти баллов. Введем дополни-

тельную целочисленную переменную "score_out_of_ten" и присвоим ей значение:

score_out_of_ten = total_test_score/10;

Теперь проверку в программе можно сформулировать так: (1) если переменная

"score_out_of_ten" равна 0, 1, 2, 3 или 4, то печатать сообщение "Вы не прошли

тест. Выучите материал как следует.", (2) если "score_out_of_ten" равна

5, то печатать сообщение "Вы прошли тест со средним результатом." и

т.д. В целом оператор "switch" будет выглядеть так:

...

...

score_out_of_ten = total_test_score / 10;

switch ( score_out_of_ten )

{

case 0 :

case 1 :

case 2 :

case 3 :

case 4 :

cout << "Вы не прошли тест. Выучите материал как следует.&bsol;n";

break;

case 5 :

cout << "Вы прошли тест со средним результатом.&bsol;n";

break;

case 6 :

case 7 :

56

cout << "Вы хорошо выполнили тест.&bsol;n";