Смекни!
smekni.com

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

печатают на экране? Объясните свой ответ и проверьте его опытным путем.

Программа 3а:

#include <iostream.h>

int main()

{

int count = 1;

for ( ; count <= 5; count++ )

{

int count = 1;

cout << count << "&bsol;n";

}

return 0;

}

Программа 3b:

#include <iostream.h>

int main()

{

int count = 1;

while ( count <= 5 )

{

int count = 1;

cout << count << "&bsol;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 << "ВРЕМЯ ЗАКРЫТИЯ &bsol;n&bsol;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&bsol;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".

Компилятор Си++ (в отличие, например, от Паскаля) не обнаруживает ошибки выхо-

да за пределы массива, поэтому участок памяти компьютера с массивом и сразу за