Структуры – производные типы данных языка С
Задание 1
- Совместите объявление и инициализацию структуры. После инициализации структуры выполните изменение ее полей с последующим выводом на консоль.
- Примените оператор typedef.
- Поля структуры title и author определите с помощью указателей.
- Произведите инициализацию структуры после ввода значений полей с клавиатуры.
- Выполните вывод полей структуры в текстовый файл 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); printf("\t Enter a surname of %d student \n\t: ", i+1); gets_s(student[i].surname, CH); 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 %s \t %s:\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 - общее количество оценок printf("\n\n Press any key: "); _getch(); return 0; }
В программе использован массив структур – переменная student[N]. Для определения имени и фамилии предварительно выделяется память для символьных указателей с помощью функций malloc(), для которых включен заголовок #include <stdlib.h>.
Шаблон структуры задан без имени-этикетки (без тегового имени).
Возможный результат выполнения программы показан на рис. 13.2.
Задание 2
- Выполните усреднение оценок для каждого студента.
- Предусмотрите ввод названий предметов (математический анализ, алгебра и т.д.) и определите их в виде инициализаторов структуры.
- Увеличьте число студентов до семи и произведите запись результатов в текстовый файл с именем compX.txt, где Х – номер компьютера, за которым выполняется лабораторная работа.
- В шаблоне структуры задайте теговое имя. Проанализируйте работу программы.
- Примените оператор typedef для определения структурного типа данных
- Расположите фамилии (с именем) студентов в порядке возрастания их среднего балла за сессию.
Пример 3. Напишите программу создания карточки служащего с помощью структурного типа данных и указателя на структуру. Предусмотрите инициализацию полей структуры и изменения этих полей.
Для решения примера воспользуемся структурой, рассмотренной в теоретической части данной лабораторной работы:
struct employee { char Name [20+1]; // Имя char Surname [20+1]; // Фамилия int age; // возраст double hourlysalary; // почасовой оклад } employee_new, *PTR; // *PTR – указатель на структуру
Программный код решения примера:
#include <stdio.h> #include <conio.h> #include <string.h> #include <locale.h> // Предполагаемое число символов в имени или фамилии #define n 20 int main (void) { // Определение структуры struct emloyee { char name[n+1]; // имя char surname[n+1]; // фамилия int age; // возраст double hourlysalary; // почасовой оклад в у.е. } emloyee_new, *PTR; // *PTR - указатель на структуру // Для поддержки русских шрифтов setlocale( LC_ALL, ".1251");// кодовая страница Windows – 1251 PTR = &emloyee_new; //В указатель помещается адрес employee_new // Инициализация полей структуры strcpy_s(PTR -> name, n, "Владимир"); strcpy_s(PTR -> surname, n, "Викулов"); PTR -> age = 25; PTR -> hourlysalary = 6.78; // Вывод на консоль puts("\n=============== Поля структуры ===================="); printf("\n Имя: %s\n Фамилия: %s\n возраст: %d лет\n почасовой оклад: %1.2f y.e.\n", \ PTR -> name, PTR -> surname, PTR -> age, PTR -> hourlysalary); puts("\n==================================================\n"); printf("\n\n Нажмите любую клавишу (Press any key): "); _getch(); return 0; }
В программе инициализация полей структуры выполнена с помощью оператора стрелка "–>". С подключением заголовочного файла <locale.h> и определением прототипа функции setlocale(LC_ALL,".1251") производится поддержка русских шрифтов.
Результат выполнения программы показан на рис. 13.3.