называется блоком. Для переменных, объявленных внутри блока, этот блок является
областью видимости. Другими словами, переменные "создаются" каждый раз, когда
при выполнении программа входит внутрь блока, и "уничтожаются" после выхода из
Блока.
Если одно и то же имя используется для переменной внутри и снаружи блока,
То это две разных, независимых переменных. При выполнении внутри блока про-
Грамма по умолчанию полагает, что имя относится к внутренней переменной. Обра-
Щение к внешней переменной происходит только в том случае, если переменная с та-
Ким именем не описана внутри блока. Действие этого правила продемонстрировано в
Программе 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 << "\n";
cout << "integer2 == " << integer2 << "\n";
cout << "integer3 == " << integer3 << "\n";
}
cout << "integer1 == " << integer1 << "\n";
cout << "integer2 == " << integer2 << "\n";
|
|
cout << "integer3 == " << integer3 << "\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 << "\n";
}
cout << "\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 << "\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 << "\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 << "\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 << "\n";
}
}
Программа 4.4.
Замечание о вложенных циклах
В первоначальном варианте программы "таблица умножения" (программа 4.2)
Есть вложенные циклы. В последующих вариантах программы читабельность исход-
Ного текста улучшается с помощью процедурной абстракции. Преобразование тела
Цикла в вызов функции позволяет производить разработку этого алгоритма независи-
Мо от остальной части программы. Поэтому уменьшается вероятность ошибок, свя-
Занных с областью видимости переменных и перегрузкой имен переменных.
Недостаток выноса тела цикла в отдельную функцию заключается в уменьше-
Нии быстродействия, поскольку на вызов функции тратится больше времени, чем на
Итерацию цикла. Если цикл выполняется не очень часто и не содержит большого ко-
Личества итераций (больше нескольких десятков), то временными затратами на вызов
Функции вполне можно пренебречь.
Сводка результатов
Тип данных "bool" предназначен для использования в логических выражениях
И в качестве возвращаемого значения логических функций. Такие функции можно
применять в качестве условий в условных операторах и операторах циклов. В Си++
есть три варианта циклов: "for", "while" и "do... while".
Вложенные операторы "if" в некоторых случаях можно заменить оператором
множественного ветвления "switch".
Внутри составного оператора (блока), ограниченного _______фигурными скобка-
ми "{}", допускается описание локальных переменных (внутренних переменных бло-
Ка).
60
Упражнения
Упражнение 1
Разработайте функцию, которая принимает целочисленный параметр и возвра-
щает логическое ("bool") значение "true", только если переданное ей число является
Простым числом из диапазона от 1 до 1000 (число 1 простым не считается). Проверьте
Свою функцию на различных входных данных с помощью тестовой программы.
Подсказка: (1) если число не является простым, то оно имеет как минимум один
Простой множитель, меньший или равный квадратному корню из числа.
(2) (32*32)=1024 и 1024>1000.
Упражнение 2
Напишите функцию "print_pyramid(...)", которая получает целочисленный
параметр "height (высота)" и отображает на экране "пирамиду" заданной высоты из
символов "*". Проверьте функцию с помощью простой тестовой программы, которая
должна воспроизводить следующий примерный диалог с пользователем:
Эта программа печатает на экране "пирамиду"
Заданной высоты.
Введите высоту пирамиды: 37
Введите другое значение (из диапазона от 1 до 30): 6
**
****
******
********
**********
************
Упражнение 3
Цикл "for" всегда можно переписать в форме цикла "while", и наоборот. Яв-
Ляются ли две показанных ниже программы эквивалентными? Какие сообщения они
Печатают на экране? Объясните свой ответ и проверьте его опытным путем.
Программа 3а:
#include <iostream.h>
Int main()
{
int count = 1;
for (; count <= 5; count++)
{
int count = 1;
cout << count << "\n";
}
return 0;
}
Программа 3b:
#include <iostream.h>
Int main()
{
int count = 1;
while (count <= 5)
{
int count = 1;
cout << count << "\n";
count++;
}
return 0;
}
61
Упражнение 4