печатают на экране? Объясните свой ответ и проверьте его опытным путем.
Программа 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
Приведенная ниже программа должна печатать время закрытия магазина в раз-
личные дни недели (в виде таблицы). В программе объявлен новый перечислимый
тип данных "День" и определена функция "closing_time(...)", которая должна воз-
вращать час закрытия магазина в заданный день (пока эта функция не слишком слож-
на –для любого дня возвращает значение 17). Программа демонстрирует, как можно
использовать типы "int" и "Day" в преобразованиях типов (в заголовке цикла "for" и
при вызове функции "closing_time(...)").
#include <iostream.h>
enum Day { Monday, Tuesday, Wednesday, Thursday,
Friday, Saturday, Sunday };
int closing_time( Day day_of_the_week );
// Главная функция
int main()
{
int count;
// Печать заголовка таблицы
cout.width(17);
cout << "ДЕНЬ";
cout.width(19);
cout << "ВРЕМЯ ЗАКРЫТИЯ \n\n";
// Печать таблицы от понедельника (Monday) до
// воскресенья ___________(Sunday)
for ( count = int(Monday); count <= int(Sunday); count++ )
{
cout.width(19);
switch ( count )
{
case 0 : cout << "Понедельник"; break;
case 1 : cout << "Вторник"; break;
case 2 : cout << "Среда"; break;
case 3 : cout << "Четверг"; break;
case 4 : cout << "Пятница"; break;
case 5 : cout << "Суббота"; break;
case 6 : cout << "Воскресенье"; break;
default : cout << "ОШИБКА!";
}
cout.width(9);
cout << closing_time( Day(count) ) << ":00\n";
}
return 0;
}
// Конец главной функции
// Функция, возвращающая время закрытия магазина
// в заданный день недели
int closing_time( Day day_of_the_week )
{
return 17;
}
62
(а) Что произойдет (и почему), если заменить оператор "switch" на строку
cout << Day(count); ?
Вместо этого замените "switch" на строку
print_day( Day(count), cout );
и добавьте описание и определение функции "print_day(...)", внутри которой
разместите удаленный из главной функции оператор "switch" (поток стандарт-
ного вывода "cout" передавайте в функцию как параметр по ссылке ти-
па "ostream&").
(б) Магазин закрывается в воскресенье в 13:00, в субботу в 17:00, в среду в 20:00 и в
остальные дни в 18:00. С помощью оператора "switch" внесите соответствующие
изменения в функцию "closing_time(...)" и проверьте работу программы.
Упражнение 5
Напишите программу, которая отображает в виде таблицы количество строч-
ных английских букв (от 'a' до 'z') в собственном исходном файле "ex5_5.cpp"
(сохраните исходный текст программы именно в этом файле).
При разработке программы предположите, что у компьютера очень мало памя-
ти –используйте только одну переменную типа "ifstream", одну переменную типа
"char" и две переменных типа "int". Программа должна выдавать на экран сообще-
ния, похожие на следующие:
СИМВОЛ КОЛИЧЕСТВО ВХОЖДЕНИЙ
a 38
b 5
c 35
d 7
e 58
f 8
...
...
w 4
x 4
y 0
z 1
63
ЛЕКЦИЯ 6. Массивы и символьные строки
1. Назначение массивов
В программировании часто возникают задачи, связанные с обработкой боль-
ших объемов данных. Для постоянного хранения этих данных удобно пользоваться
файлами. Например, в программе для ввода и сортировки длинных числовых списков
данные можно ввести с клавиатуры один раз и сохранить в файле для последующего
многократного использования. Но до сих пор не было рассмотрено удобного способа
представления больших объемов данных внутри программ. Для этой цели в Си++
часто применяются массивы –простейшая разновидность структурных типов дан-
ных (о более сложных структурах данных будет говориться в следующих лекциях).
Массив –это набор переменных одного типа ("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).
64
Рис. 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?: 38
Сколько часов отработал сотрудник номер 2?: 42
Сколько часов отработал сотрудник номер 3?: 29
Сколько часов отработал сотрудник номер 4?: 35
65
Сколько часов отработал сотрудник номер 5?: 38
Сколько часов отработал сотрудник номер 6?: 37
На рис. 2. показано состояние целочисленного массива после ввода этих данных.
Рис. 2.. Состояние массива после присвоения значений его элементам.
Полезно разобраться, что произошло бы, если бы в программе 1.1 внутри цикла
"for" в операторе "cin ..." отсутствовало бы вычитание 1 из переменной "count".
Компилятор Си++ (в отличие, например, от Паскаля) не обнаруживает ошибки выхо-
да за пределы массива, поэтому участок памяти компьютера с массивом и сразу за