Пример 1. Написать программу структурного описания каталога одной книги.
 Программный код решения примера
   | #include <stdio.h>
 #include <conio.h>
 #include <string.h>
 #define N 40
 struct book { // определение структуры
 char title[N+1]; // название книги
 char author[N+1]; // автор
 int year; // год издания
 int page; // количество страниц
 float price; // цена в у.е.
 } Library;
 int main (void)
 {
 // Инициализация полей структуры
 Library.year = 2007;
 Library.page = 496;
 Library.price = 12.78F;
 strcpy_s(Library.title, N, "Programming in C");
 strcpy_s(Library.author, N, "Stephen G. Kochan");
 // Вывод на консоль
 printf("\n\t Title: %c\n", Library.title);
 printf("\t Author: %c\n", Library.author);
 printf("\t Year: %d\n", Library.year);
 printf("\t Number of pages: %d p.\n", Library.page);
 printf("\t Price: %1.2f y.e.\n", Library.price);
 printf("\n\n Press any key: ");
 getch();
 return 0;
 }
 |  
 
 В программе использованы функции strcpy_s() вместо стандартных функций strcpy(),что позволило избавиться от предупреждений в системе Visual Studio 2010.
 
 
 Результат выполнения программы показан на рис. 13.1.
 Рис. 13.1. Пример инициализированных полей структуры
 Задание 1
 1. Совместите объявление и инициализацию структуры. После инициализации структуры выполните изменение ее полей с последующим выводом на консоль.
 2. Примените оператор typedef.
 3. Поля структуры title и author определите с помощью указателей.
 4. Произведите инициализацию структуры после ввода значений полей с клавиатуры.
 5. Выполните вывод полей структуры в текстовый файл compX.txt, где Х – номер компьютера, на котором выполняется лабораторная работа.
 Пример 2. Написать программу анализа средней успеваемости четырех студентов по четырем предметам за сессию на основе структурного типа данных.
 Программный код решения примера
   | #include <stdio.h>
 #include <conio.h>
 #include <stdlib.h>
 #define N 4 // число студентов
 #define CH 30 // число символов для фамилии или имени
 // Определение структуры
 Struct
 {
 char**name; // имя студента
 char**surname; // фамилия студента
 int M; // отметка по математическому анализу
 int A; // отметка по алгебре
 int H; // отметка по истории
 int In; // отметка по информатике
 } student[N];
 int main (void) {
 float mark;
 int i;
 // Выделение памяти для символьных указателей
 for (i = 0; i < N; ++i)
 {
 student[i].name = (char**) malloc(CH*sizeof(char));
 student[i].surname = (char**) malloc(CH*sizeof(char));
 }
 printf("\n");
 for (i = 0; i < N; ++i) {
 printf("\t Enter a name of %d student \n\t: ", i+1);
 gets_s(student[i].name, CH - 1);
 printf("\t Enter a surname of %d student \n\t: ", i+1);
 gets_s(student[i].surname, CH – 1);
 printf("\t Enter marks in 4 subjects for %d student (through a blank) \n\t: ", i+1);
 scanf_s("%i%i%i%i", &(student[i].M),&(student[i].A),
 &(student[i].H),&(student[i].In));
 _flushall();
 }
 puts("\n=====================================================================================");
 printf("\t Statement of Achievement students:\n");
 puts("======================================================================================\n");
 for (i = 0; i < N; ++i) {
 printf("\t %c \t %c:\n\t Mathematical analyses, Algebra, History, Informatics\n \
 \n\t\t %d\t\t %3d\t \
 %3d\t %5d\n----------------------------------------------\n", \
 student[i].name, student[i].surname, \
 student[i].M,student[i].A,student[i].H,student[i].In);
 }
 mark = 0.0F; // F – спецификатор для типа float
 for (i = 0; i < N; ++i)
 {
 mark += (student[i].M + student[i].A + student[i].H + student[i].In);
 }
 // Средняя оценка группы из 4 (N)студентов
 printf("\n\t The average mark groups of %d students: %1.4f", N, mark/(4*N));
 // 4*N - общее количество оценок
 // Освобождение памяти
 for (i = 0; i < N; ++i)
 {
 free(student[i].name);
 free(student[i].surname);
 }
 printf("\n\n Press any key: ");
 getch();
 return 0;
 }
 |  
 
 В программе использован массив структур – переменная student[N]. С целью определения имени и фамилии предварительно выделяется память под символьные указатели с помощью функций malloc(), для которых включен заголовок #include <stdlib.h>.
 Определение структуры выполнено за пределами главной функции main(), что позволяет использовать ее в других функциях, если бы они были определены в программе.
 Шаблон структуры задан без имени-этикетки.
 Возможный результат выполнения программы приведен на рис. 13.2.
 
 
 Рис. 13.2. Пример сводной ведомости успеваемости студентов
 Задание 2
 1. Выполните усреднение оценок для каждого студента.
 2. Предусмотрите ввод названий предметов (математический анализ, алгебра и т. д.) и определите их в виде инициализаторов структуры.
 3. Увеличьте число студентов до семи и произведите запись результатов в текстовый файл с именем compX.txt, где Х – номер компьютера, на котором выполняется лабораторная работа.
 4. В шаблоне структуры задайте теговое имя. Проанализируйте работу программы.
 5. Примените оператор typedef для определения структурного типа данных.
 6. Расположите фамилии (с именем) студентов в порядке возрастания их среднего балла за сессию.
 Пример 3. Написать программу создания карточки служащего с помощью структурного типа данных и указателя на структуру. Предусмотреть инициализацию полей структуры и изменение этих полей.
 Для решения примера воспользуемся структурой, рассмотренной в теоретической части данной темы:
 struct employee {
 char Name [20+1]; // имя
 char Surname [20+1]; // фамилия