Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Учебник Моя первая программа на С++.docx
Скачиваний:
3
Добавлен:
01.07.2025
Размер:
6 Мб
Скачать
☆

Использование массивов

Представьте себе, что вы являетесь менеджером в отеле, и в вашем ведении находятся помещения для проведения заседаний. У вас есть десять комнат для совещаний, каждая из которых рассчитана на опре- деленное количество человек. Вам нужна программа, которая будет выполнять следующие три функции:

  • составлять таблицу, содержащую сведения о номере и максимальной вместимости каждой комна- ты;

  • предоставлять информацию о максимальной вместимости определенной комнаты;

  • выводить список комнат, имеющих определенную вместимость.

Есть несколько способов создания такой программы. Вы можете использовать массив, состоящий из 20 элементов, содержащих как номер комнат, так и количество мест, на которое каждая из них рассчитана. Массив будет выглядеть примерно так:

int room[20] = {102, 12, 107, 43...

то есть нечетные элементы отображают номера комнат, а четные— вместимость. Комната 102 рассчитана на 12 человек, комната 107 может вместить 43 человека и так далее. Определив элемент, содержащий номер комнаты, вы знаете, что значение максимальной вместимости этой комнаты представлено следую- щим элементом массива.

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

Третьей возможностью является использование двух параллельных массивов. Параллельные массивы— это два независимых массива, которые можно соотнести друг с другом. Как это выглядит? Представьте себе две линии выпускников колледжа в актовый день. Когда две колонны достигают входа, ученики рас- полагаются друг напротив друга. Первый человек в правом ряду войдет в зал в паре с первым человеком из левого ряда и так далее. Если расположить учеников произвольно, то никаких отношений между пра- вым и левым рядом не будет. Но можно составить ряды в таком порядке, чтобы при встрече рядов образо- вались определенные пары.

Когда вы используете параллельные массивы, то создаете два независимых массива, порядок расположе- ния элементов в которых, тем не менее, находится в соответствии. То есть первый элемент одного массива каким-то образом соотносится с первым элементом другого массива и так далее.

В Листинге 10.4 приведен текст программы, в которой проблемы с распределением комнат решаются пу- тем использования параллельных массивов. Массив room содержит список номеров комнат, которые на- ходятся в вашем распоряжении, а в массиве max записаны данные о количестве мест, на которые рассчи- тана каждая комната. Если мы знаем, что номер комнаты хранится в пятом элементе массива room, то нам известно, что вместимость этой комнаты находится также в пятом элементе, только массива max.

Листинг 10.4. Использование двух параллельных массивов.

/*rooms.c*/

int room[10] = {102, 107, 109, 112,

115, 116, 123, 125, 127, 130};

int max[10] = {12, 43, 23, 12, 20, 15, 16,

23, 12, 15};

main()

{

int index, choice, num, rooms, flag, found; rooms = 10;

puts("1. Показать вместимость всех комнат\n"); puts("2. Определить вместимость

определенной комнаты\n");

puts("3. Найти комнату определенной вместимости\n"); printf("Введите Ваш выбор от 1 до 3: ");

scanf("%d", &choice); if (choice == 1)

{

for (index = 0; index < rooms; index++) printf("Комната #%d рассчитана на

%d мест\n", room[index], max[index]);

}

if (choice == 2)

{

printf("введите номер комнаты: "); scanf("%d", &num); index = 1;

found = 0;

while (! found && index < rooms)

if (room[index] == num)

found = 1;

if (! found)

else

index++;

puts("Комнаты с таким номером нет в списке\n");

else

printf("Комната #%d

рассчитана на %d мест\n", room[index], max[index]);

}

if (choice == 3)

{

flag = 0;

printf("Введите минимальное желательное количество мест:");

scanf("%d", &num);

for (index = 0; index < rooms; index++) if (max[index] >= num)

{

flag = 1; printf("Комната #%d

рассчитана на %d мест\n", room[index], max[index]);

}

if (flag == 0)

puts("Комнат с

таким количеством мест нет\n");

}

}

В этой программе максимальное значение индекса массива присваивается переменной rooms, а затем на экран выводится меню. Выбор одного из пунктов меню определяет, какая из функций будет выполняться. Это осуществляется с помощью последовательности из трех инструкций if. Аналогичную программу можно было написать с использованием инструкции switch или вложенных инструкций if...else.

Первая процедура в цикле for выводит список всех комнат и их вместимость. Здесь необходима только одна индексная переменная, которая используется в качестве индекса как для массива room, так и для массива max.

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

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

Строки

Строкой называется массив символов. При определении строки вы присваиваете ей имя и указываете максимальное количество символов, которое может в ней содержаться. Однако не забывайте о том, что один элемент массива всегда резервируется для нулевого символа (\0), вследствие чего при определении строки следует указывать количество элементов на единицу больше действительно предполагаемой мак- симальной длины строки.

Си и Си++ позволяют осуществлять ввод и вывод массива символов в виде некой целостности— строки. В то же время, каждый символ является отдельным независимым элементом массива (рис.10.7). Например, с помощью следующей программы можно ввести строку, а затем отобразить составляющие ее отдельные символы:

main()

{

char name[20]; int index;

printf("Введите Ваше имя: "); scanf("%s", name);

for (index = 0; index < 20; index++)

printf("%c\n", name[index]);

}

Рис. 10.7. Каждый из символов, составляющих строку, в действительности является отдельным элементом массива

Если в действительности было введено меньше двадцати символов, элементы массива, следующие за ну- левым символом, содержат случайные величины.

Если бы в языке Си отсутствовала функция gets(), то ввод строки можно было осуществить путем после- довательного ввода символов и присваивания их в качестве значения отдельным элементам массива, как это продемонстрировано в Листинге10.5.

Листинг 10.5. Имитация функции gets().

/*getstr.c*/ main()

{

char name[10], letter; int index;

index = 0;

puts("Введите имя, по окончании нажмите Enter\n"); do

{

letter = getchar(); name[index] = letter; index++;

}

while (letter !='\r' && index < 9); name[index] = '\0';

putchar('\n'); puts(name);

}

К счастью, язык Си расценивает строки как особую разновидность массивов, позволяя осуществлять ввод и вывод строк как единого целого. Однако какие-либо дополнительные приемы обращения со строками в языке Си отсутствуют. В то же время, использование строк настолько распространено в программирова- нии, что большинство Си и Си++ компиляторов имеют специальные функции для работы со строками. Ко- нечно, для этих целей можно написать и собственные функции, но использование стандартных библиотек представляется более эффективным. В табл.10.2 приведены типичные функции работы со строками, кото- рые содержатся в библиотеках Си и Си++.

Таблица 10.2. Функции работы со строками.

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