Смекни!
smekni.com

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

break;

case 8 :

case 9 :

case 10 :

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

break;

default :

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

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

}

...

...

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

Оператор "switch" имеет следующий синтаксис:

switch (селектор)

{

case метка1 :

<операторы1>

break;

...

...

...

case меткаN :

<операторыN>

break;

default :

<операторы>

}

Сделаем несколько важных замечаний относительно оператора "switch":

Внутри "switch" выполняются операторы, содержащиеся между меткой,

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

сле этой метки оператором "break".

Операторы "break" необязательны, но они улучшают читабельность про-

грамм. С ними сразу видно, где заканчивается каждый вариант множествен-

ного ветвления. Как только при выполнении операторов внутри "switch"

встречается "break", то сразу выполняется переход на первый оператор про-

граммы, расположенный после оператора "switch". Иначе продолжается

последовательное выполнение операторов внутри "switch".

Селектор (переменная или выражение) может быть целочисленного (напри-

мер, "int" или "char") или любого перечислимого типа, но не веществен-

ного типа.

Вариант "default" ("по умолчанию") необязателен, но для безопасности

лучше его предусмотреть.

4. Блоки и область видимости переменных

В Си++ фигурные скобки "{}" позволяют оформить составной оператор, кото-

рый содержит несколько операторов, но во всех конструкциях языка может подстав-

57

ляться как один оператор. На описания переменных фигурные скобки также оказы-

вают важное влияние.

Составной оператор, внутри которого описана одна или несколько переменных,

называется блоком. Для переменных, объявленных внутри блока, этот блок является

областью видимости. Другими словами, переменные "создаются" каждый раз, когда

при выполнении программа входит внутрь блока, и "уничтожаются" после выхода из

блока.

Если одно и то же имя используется для переменной внутри и снаружи блока,

то это две разных, независимых переменных. При выполнении внутри блока про-

грамма по умолчанию полагает, что имя относится к внутренней переменной. Обра-

щение к внешней переменной происходит только в том случае, если переменная с та-

ким именем не описана внутри блока. Действие этого правила продемонстрировано в

программе 4.1.

#include <iostream.h>

int integer1 = 1;

int integer2 = 2;

int integer3 = 3;

int main()

{

int integer1 = -1;

int integer2 = -2;

{

int integer1 = 10;

cout << "integer1 == " << integer1 << "&bsol;n";

cout << "integer2 == " << integer2 << "&bsol;n";

cout << "integer3 == " << integer3 << "&bsol;n";

}

cout << "integer1 == " << integer1 << "&bsol;n";

cout << "integer2 == " << integer2 << "&bsol;n";

cout << "integer3 == " << integer3 << "&bsol;n";

return 0;

}

Программа 4.1.

Программа 4.1 выводит на экран сообщения:

integer1 == 10

integer2 == -2

integer3 == 3

integer1 == -1

integer2 == -2

integer3 == 3

Применение локальных переменных иногда объясняется экономией памяти, а

иногда необходимостью использования в различных частях программы разных пере-

менных с одинаковыми именами. См. в качестве примера программу 4.2, которая пе-

чатает таблицу умножения для чисел от 1 до 10.

#include <iostream.h>

int main()

{

int number;

for ( number = 1; number <= 10; number++ )

58

{

int multiplier;

for ( multiplier = 1; multiplier <= 10; multiplier++ )

{

cout << number << " x " << multiplier << " = ";

cout << number * multiplier << "&bsol;n";

}

cout << "&bsol;n";

}

return 0;

}

Программа 4.2.

Программу 4.2 можно переписать в более понятном виде с помощью функ-

ции (см. программу 4.3).

#include <iostream.h>

void print_times_table( int value, int lower, int upper );

int main()

{

int number;

for ( number = 1; number <= 10; number++ )

{

print_times_table( number, 1, 10 );

cout << "&bsol;n";

}

return 0;

}

void print_times_table( int value, int lower, int upper )

{

int multiplier;

for ( multiplier = lower; multiplier <= upper; multiplier++ )

{

cout << value << " x " << multiplier << " = ";

cout << value * multiplier << "&bsol;n";

}

}

Программа 4.3.

Далее, программу 4.3 можно усовершенствовать, исключив описания всех пе-

ременных из "main()" и добавив две функции (см. программу 4.4).

#include <iostream.h>

void print_tables( int smallest, int largest );

void print_times_table( int value, int lower, int upper );

int main()

{

print_tables( 1, 10 );

return 0;

}

void print_tables( int smallest, int largest )

59

{

int number;

for ( number = smallest; number <= largest; number++ )

{

print_times_table( number, 1, 10 );

cout << "&bsol;n";

}

}

void print_times_table( int value, int lower, int upper )

{

int multiplier;

for ( multiplier = lower; multiplier <= upper; multiplier++ )

{

cout << value << " x " << multiplier << " = ";

cout << value * multiplier << "&bsol;n";

}

}

Программа 4.4.

5. Замечание о вложенных циклах

В первоначальном варианте программы "таблица умножения" (программа 4.2)

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

ного текста улучшается с помощью процедурной абстракции. Преобразование тела

цикла в вызов функции позволяет производить разработку этого алгоритма независи-

мо от остальной части программы. Поэтому уменьшается вероятность ошибок, свя-

занных с областью видимости переменных и перегрузкой имен переменных.

Недостаток выноса тела цикла в отдельную функцию заключается в уменьше-

нии быстродействия, поскольку на вызов функции тратится больше времени, чем на

итерацию цикла. Если цикл выполняется не очень часто и не содержит большого ко-

личества итераций (больше нескольких десятков), то временными затратами на вызов

функции вполне можно пренебречь.

6. Сводка результатов

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

и в качестве возвращаемого значения логических функций. Такие функции можно

применять в качестве условий в условных операторах и операторах циклов. В Си++

есть три варианта циклов: "for", "while" и "do ... while".

Вложенные операторы "if" в некоторых случаях можно заменить оператором

множественного ветвления "switch".

Внутри составного оператора (блока), ограниченного _______фигурными скобка-

ми "{}", допускается описание локальных переменных (внутренних переменных бло-

ка).

60

7. Упражнения

Упражнение 1

Разработайте функцию, которая принимает целочисленный параметр и возвра-

щает логическое ("bool") значение "true", только если переданное ей число является

простым числом из диапазона от 1 до 1000 (число 1 простым не считается). Проверьте

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

Подсказка: (1) если число не является простым, то оно имеет как минимум один

простой множитель, меньший или равный квадратному корню из числа.

(2) (32*32)=1024 и 1024>1000.

Упражнение 2

Напишите функцию "print_pyramid(...)", которая получает целочисленный

параметр "height (высота)" и отображает на экране "пирамиду" заданной высоты из

символов "*". Проверьте функцию с помощью простой тестовой программы, которая

должна воспроизводить следующий примерный диалог с пользователем:

Эта программа печатает на экране "пирамиду"

заданной высоты.

Введите высоту пирамиды: 37

Введите другое значение (из диапазона от 1 до 30): 6

**

****

******

********

**********

************

Упражнение 3

Цикл "for" всегда можно переписать в форме цикла "while", и наоборот. Яв-

ляются ли две показанных ниже программы эквивалентными? Какие сообщения они