Решение задач с вложенными структурами аналогично рассмотренным выше задачам по обработке структур с учетом использования цепочки ссылок на поля структуры с помощью операций ‘.’ и ‘->’.
Пример. В программе описывается сложная структура описания данных о книгах. Требуется ввести сведения о книгах в поля структур, образующих массив структур (Library []), упорядочить список книг по возрастанию поля year вложенной структуры Publication и вывести список книг до и после сортировки. Для обработки структур используются указатели, массив указателей для сортировки и вспомогательные функции.
Программа:
#include <stdio.h>
#include <conio.h>
#include <string.h> /* для функции strcmp */
#define n 100 /* максимальное количество книг */
typedef struct { /* описание типа структуры */
int year; /* год издания */
int month; /* месяц издания */
} PUBLICATION; /* имя типа структуры */
typedef struct { /* описание типа сложной структуры */
char Author[20]; /* автор */
char Title[30]; /* название книги */
PUBLICATION Publ; /* вложенная структура */
} BOOKS; /* имя типа структуры */
int INBOOKS (BOOKS *book); /* прототипы функций */
|
|
void OUTBOOKS (BOOKS *pbook[ ], int kb);
void SORTLIB (BOOKS *pbook[ ], int kb);
void main() /* главная функция */
{ BOOKS /* тип структуры */
Library [n], /* массив библиотеки книг */
book, /* структурная переменная */
*pbook [n]; /* массив указателей на книги */
int kb=0; /* количество описанных книг */
clrscr(); /* очистка экрана */
puts ("Введите данные о книгах.");
puts ("Для окончания ввода вместо ввода Автора нажмите <Enter>.");
/* Цикл ввода данных о книгах до ввода пустой строки: */
while (INBOOKS(&book)) /* цикл пока не пустая строка */
{ Library [kb] = book; /* запись данных о книге в массив */
pbook [kb] = Library + kb; /* запись указателя на книгу */
kb++; /* увеличение количества книг */
}
clrscr (); /* очистка экрана */
puts ("Список книг до обработки:");
OUTBOOKS (pbook, kb); /* вывод списка книг */
SORTLIB (pbook, kb); /* сортировка списка книг */
puts ("\nСписок книг после обработки:");
OUTBOOKS (pbook, kb); /* вывод списка книг */
getch(); /* задержка экрана результатов */
} /* конец главной функции */
int INBOOKS (BOOKS *book) /* функция ввода данных о книге */
{
fflush (stdin); /* очистка входного буфера */
printf ("Автор: ");
gets (book->Author); /* ввод Фамилии И.О. автора */
if (!strcmp(book->Author, "")) /* если обе строки идентичны, то */
return 0; /* возврат 0 – конец ввода данных */
printf ("Название книги: ");
gets (book->Title); /* ввод названия книги */
printf ("Год издания: ");
scanf ("%d", &book->Publ.year); /* ввод года издания */
printf ("Месяц издания: ");
scanf ("%d", &book->Publ.month); /* ввод месяца издания */
return 1; /* возврат 1 – продолжение ввода */
} /* конец функции INBOOKS */
void OUTBOOKS (BOOKS *pbook[], int kb) /* функция вывода списка книг */
{ int i;
printf ("Автор Название Год Месяц");
for (i=0; i<kb; i++)
printf ("\n%-20s%-30s%4d%4d", pbook[i]->Author, pbook[i]->Title,
|
|
pbook[i]->Publ.year, pbook[i]->Publ.month);
} /* конец функции OUTBOOKS */
/* Сортировка книг через массив указателей методом “пузырька”: */
void SORTLIB (BOOKS *pbook [], int kb) /* функция сортировки */
{ int i, j; /* параметры циклов */
BOOKS *book; /* указатель на книгу */
for (i=1; i<kb; i++) /* цикл по номерам книг */
for (j=kb-1; j>=i; j– –) /* обратный цикл */
if(pbook[j-1]->Publ.year > pbook[j]->Publ.year) /* сравнение годов изданий*/
{ book = pbook [ j]; /* перестановка */
pbook [ j] = pbook [ j –1]; /* указателей на книги */
pbook [ j –1] = book; /* в массиве указателей */
}
} /* конец функции SORTLIB */
Результаты программы:
Список книг до обработки:
Автор Название Год Месяц
Митчел М. Унесенные ветром 1991 4
Толстой Л.Н. Война и мир 1995 6
Достоевский Ф.М Братья Карамазовы 1985 8
Список книг после обработки:
Автор Название Год Месяц
Достоевский Ф.М. Братья Карамазовы 1985 8
Митчел М. Унесенные ветром 1991 4