
- •Общие методические указания по выполнению лабораторных работ
- •Работа со структурами данных (struct)
- •Описание структур и структурных переменных
- •Вложенные структуры
- •Обращение к полям структуры
- •Например, для переменных, описанных шаблоном
- •Массивы структурных переменных
- •Объявление типов в языке Си
- •Введите оценки ( 2 целых числа от 3 до 5 ): 5 5
- •Использование структур в функциях
- •Использование глобальных данных
- •Обработка вложенных структур
- •Толстой л.Н. Война и мир 1995 6 Структуры и поразрядные операции
- •Поразрядные операции
- •Сдвиговые поразрядные операции
- •Операнд сдвиг число_битов
- •Структуры с битовыми полями
- •Работа с объединениями (union)
- •Работа с перечислениями (enum)
- •Работа с файлами Понятие файла и потока ввода-вывода данных в компьютере
- •Открытие и закрытие файла
- •Потоки стандартного ввода-вывода
- •Повторное открытие файла
- •Позиционирование указателя записи-чтения
- •Int fseek (указатель_потока, (long) смещение, начало_отсчета),
- •Начало_отсчета может принимать следующие значения:
- •Функции файлового ввода-вывода
- •Посимвольный ввод-вывод
- •Вывод символов из файла:
- •Построчный ввод-вывод Пусть описан символьный массив
- •Форматированный ввод-вывод данных
- •Блоковый ввод-вывод
- •Работа с динамическими структурами данных Динамическое распределение памяти
- •Очередь
- •Рекурсивные функции
- •Деревья
Обработка вложенных структур
Решение задач с вложенными структурами аналогично рассмотренным выше задачам по обработке структур с учетом использования цепочки ссылок на поля структуры с помощью операций ‘.’ и ‘->’.
Пример. В программе описывается сложная структура описания данных о книгах. Требуется ввести сведения о книгах в поля структур, образующих массив структур (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