Обработка вложенных структур

Решение задач с вложенными структурами аналогично рассмотренным выше задачам по обработке структур с учетом использования цепочки ссылок на поля структуры с помощью операций ‘.’ и ‘->’.

Пример. В программе описывается сложная структура описания данных о книгах. Требуется ввести сведения о книгах в поля структур, образующих массив структур (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


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: