/* инвентаризация большого количества книг */
#include
#define MAXTIT 40
#define MAXAUT 40
#define MAXBKS 100 /* максимальное количество книг */
#define STOP " " /* нулевая строка прекращает ввод */
struct book { /* создание шаблона типа book */
char title [MAXTIT];
char author [MAXAUT];
float value; };
main ( )
{
struct book libry[MAXBKS]; /* массив структур типа book */
int count = 0;
int index;
printf("Введите, пожалуйста, название книги.\n");
printf(" Нажмите клавишу [ввод] в начале строки для останова.\n");
while(strcmp(gets(libry [count].title), STOP) != 0 &&
count < MAXBKS)
{ printf("Введите теперь фамилию автора.\n");
gets(libry [count].author);
printf("Введите теперь цену.\n");
scanf(" %f", & libry [count++].value);
while(getchar()!='n'); /* очистите строку ввода */
if(counts < MAXBKS)
printf("Введите название следующей книги.\n");
} printf ("Вот список ваших книг: \n");
for(index = 0; index < count; index++)
printf("%s, %s: %p.2f\n", libry [index].title, libry[index].author,
libry[index].value);
}
РИC. 14.2. Программа инвентаризации большого количества книг.
Вот пример работы программы:
Введите, пожалуйста, название книги.
Нажмите клавишу [ввод] в начале строки для останова.
Искусство программирования
Введите теперь фамилию автора. Д.Кнут
Введите теперь цену.
5р.67
Введите название следующей книги.
... еще вводы...
Вот список ваших книг:
Искуство программирования для ЭВМ, Д.Кнут: 5р.67
ПЛ/1 для программистов, Скотт Р., Сондак Н: 1р.08
Программирование на языке Паскаль, П. Грогоно: 1р.30
Язык Фортран 77, Г. Кантан: 0р.80
Трансляция языков программирования, Ф. Вайнгартен: 0р.75
Язык Эсперанто, М.И. Исаев: 0р.60
Ассемблеры и загрузчики, Д.Баррон: 0р.30
Структурное программирование, У. Дал, Э. Дейкстра, К. Хоор: 1р.11
Операционные системы, Г. Катцан: 2р.25
Параллельные вычислительные системы, Б.А.Головкин: 2р.50
Следует обратить внимание на два важных момента, относящихся к массивам структур, - как описывать и как обращаться к отдельным их элементам. После разъяснения этих вопросов мы вернемся и сделаем пару замечаний по нашей программе.
Описание массива структур
Процесс описания массива структур совершенно аналогичен описанию любого другого типа массива:
struct book libry [MAXBKS];
Этот оператор объявляет libryмассивом, состоящим из MAXBKS-элементов. Каждый элемент массива представляет собой структуру типа book. Таким образом, libry[0]является book-структурой, libry[1]- второй book-структурой и т. д. Рис. 14.3 может помочь вам представить это. Имя libryсамо по себе не является именем структуры; это имя массива, содержащего структуры.

РИС. 14.3. Maccив структур.
Определение элементов массива структур
При определении элементов массива структур мы применяем те же самые правила, которые используются для отдельных структур: сопровождаем имя структуры операцией получения элемента и именем элемента:
libry [0].value value - первый элемент массива
libry [4].title title - пятый элемент массива
Заметим, что индекс массива присоединяется к libry, а не к концу имени:
libry. value[2] /* неправильно */
libry[2].value /* правильно */
Мы используем libry[2].value, потому что libry[2] является именем структурной переменной точно так же, как libry[l]является именем другой структурной переменной, а ранее doyleбыло именем структурной переменной.
Между прочим, что бы это значило?
libry[2].title[4]
Это был бы пятый элемент элемента title(т. е. title[4]) структуры типа book, описанный третьей структурой (т.e. libry[2]). В нашем примере им был бы символ р. Это означает, что индексы, находящиеся справа от операции " .", относятся к отдельным элементам, в то время как индексы, расположенные слева от операции, относятся к массивам структур.
Теперь покончим с этой программой.
Главное отличие ее от нашей первой программы заключается в том, что теперь создается цикл для считывания названий книг. Мы начинаем цикл с while-условия:
while(strcmp(gets(libry [count].title), STOP) != 0
&& count < MAXBKS)
Выражение gets(libry [count].title)считывает вводимую строку, содержащую название книги. Функция strcmp( )сравнивает эту строку со STOP, которая является " " , т.e. пустой строкой. Если пользователь нажмет клавишу [ ввод] в начале строки, то перепишется пустая строка и цикл закончится. Мы также должны проверять, не превысило ли число считанных на текущий момент книг предельного размера массива.
Читать дальше