Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Программирование на C / C++ / Нейбауэр А. Моя первая программа на С.doc
Скачиваний:
128
Добавлен:
02.05.2014
Размер:
3.75 Mб
Скачать

Массивы структур

До сих пор мы работали с эквивалентом только одной регистрационной карточки. Но мы определили структуру с тем, чтобы хранить информацию обо всей коллекции записей. Для этого надо использовать не одиночную переменную, а массив. Создавая массив структур, мы создаем массив шаблонов. Такой массив можно определить, используя индекс с именем структурной переменной:

struct CD disc[10];

Таким образом, мы резервируем десять областей памяти, каждая из которых обладает достаточным объемом, чтобы хранить целую структуру (рис.11.7). Обращение к элементу массива происходит путем указания соответствующего индекса после имени самой структурной переменной, а не члена структуры:

gets(disc[0].name);

gets(disc[1].name);

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

Листинг 11.2. Использование массива структур.

/*CD2.c*/

struct CD

{

char name[20];

har description[40];

har category[12];

float cost;

int number;

} disc[10];

main()

{

int index, repeat;

har flag;

flag = 'Y';

index =0;

do

{

puts("Введите сведения о диске #%d\n", index);

printf("Введите название: ");

gets(disc[index].name);

printf("Введите описание: ");

gets(disc[index].description);

printf("Введите категорию: ");

gets(disc[index].category);

printf("Введите цену: ");

scanf("%f", &dics[index].cost);

printf("Введите номер ячейки: ");

scanf("%d", &disc[index].number);

index++;

if(index < 10)

{

printf("Желаете ввести данные о следующем диске? Да -Y, нет -N");

scanf("%C", &flag);

}

}

while (index < 10 && (flag == 'Y' || flag == 'y'));

puts("Название Номер п/п");

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

printf("%s %d\n", disc[repeat].name, disc[repeat].number);

}

Рис. 11.7. Массив структур

Определение массива, включающего 10 элементов disc, является частью определения структуры:

} disc[10];

Переменная flag ведена для того, чтобы пользователь мог указать, хочет ли он продолжить ввод информации, если заполнено меньше 10«карточек». Цикл do обеспечивает ввод элементов массива: пять пунктов (членов структуры) для каждого элемента массива (регистрационной карточки в картотеке коллекции). Переменная index используется как индекс в процессе создания картотеки.

После ввода значений каждого элемента массива, программа спрашивает пользователя, хочет ли он заполнить следующую карточку. После ввода значений всех 10элементов массива запрос больше не предъявляется.

В цикле do используется следующее условие:

while (index < 10 && (flag == 'Y' || flag == 'y'));

Логический оператор И указывает на то, что оба условия должны выполняться одновременно: значение переменной index должно быть меньше десяти, и переменная flag должна иметь значение 'Y' или 'y'. Если бы в условии не были поставлены внутренние скобки, компилятор Си скомбинировал бы первые два условия и трактовал всю инструкцию как условие ИЛИ (рис.11.8). И если в этом случае переменная flag примет значение 'y', цикл будет повторяться и после ввода значений всех элементов.

Рис. 11.8. Интерпретация условия при отсутствии внутренних круглых скобок

Когда будут введены данные последнего элемента массива (карточки), значение переменной index окажется на единицу больше количества элементов массива. Эта переменная в дальнейшем используется в цикле for, в котором на дисплей выводится информация о содержании компакт-дисков и их местонахождении.

Обратите внимание на то, что все обращения к членам структуры включают имя переменной c указанием индекса массива.