Листинг 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); }

Листинг 2. Использование массива структур. - student2.ru
Рис. 7. Массив структур

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

} disc[10];

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

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

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

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

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

Листинг 2. Использование массива структур. - student2.ru
Рис. 8. Интерпретация условия при отсутствии внутренних круглых скобок

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

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

Структуры и функции

В исходном K&R-стандарте языка Си использование структур ограничено. Структуры могут передаваться в качестве аргументов только с использованием указателей, о которых будет сказано дальше. Кроме того, отсутствует возможность прямого присваивания одной структуры другой, например, следующим образом:

cdrom = disc;

В современных компиляторах Си и Си++ такая возможность существует. Теперь можно непосредственно присваивать одну структурную переменную другой.

Большинство компиляторов Си++ и компиляторы Си, поддерживающие стандарт ANSI, позволяют передавать и возвращать структуру целиком. В Листинге 3 продемонстрировано, как можно передать структуру функции. Значения членов структуры вводятся в main(), затем вся структура передается функции putdisc() для вывода. При вызове функции используется структурная переменная disc:

putdisc(disc);

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

putdisc(disk)struct CD disk;

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

Наши рекомендации