Структуры – производные типы данных языка С
Задание 3
- В программу добавьте нумерацию полей структуры, например: 1) имя: и т.д.
- В программу введите свое имя и фамилию, возраст и размер получаемой стипендии (если нет, то нуль). Значения новых полей выведите на консоль и в текстовый файл с именем compX.txt, где Х – номер компьютера, за которым выполняется лабораторная работа.
- Инициализацию полей структуры выполните с помощью указателя.
- Выполните предварительную инициализацию структуры, а затем смените значения полей.
- Тип данных double замените на тип float
Пример 4. Напишите программу информационной карточки студенческой группы с данными о студентах, применив вложенные структуры.
Как известно, если членом структуры является другая структура, то она называется вложенной.
Программный код решения примера:
#include <stdio.h> #include <conio.h> #include <string.h> #define N 20 int main (void) { struct stud { // шаблон структуры char name[N+1]; // имя студента char surname[N+1]; // фамилия студента int age; // возраст - полных лет double av_mark; // средняя успеваемость }; struct group { // шаблон структуры int number; // номер группы int quantity; // количество студентов в группе struct stud student;// вложенная структура } ACOUY; // ACOUY - структурная переменная // Инициализация полей структуры ACOUY.number = 3; ACOUY.quantity = 21; strcpy_s(ACOUY.student.name, N, "Peter"); strcpy_s(ACOUY.student.surname, N, "Bobrov"); ACOUY.student.age = 20; ACOUY.student.av_mark = 4.25; // Вывод на консоль puts("\n========= Varient field of structure ==============="); printf("\n Group Number: %d,\n The number of students in the group: %d,\n\ Name: %s,\n Surname: %s,\n Age: %d,\n Average mark: %1.2f", \ ACOUY.number, ACOUY.quantity, ACOUY.student.name, ACOUY.student.surname, \ ACOUY.student.age, ACOUY.student.av_mark); puts("\n\n================================================\n"); printf("\n Press any key: "); _getch(); return 0; }
Результат выполнения программы показан на рис. 13.4.
Задание 4
- Инициализацию структуры выполните с клавиатуры.
- Предусмотрите массив структур ACOUY[N], где N – количество групп (например, N = 3 ).
- Введите данные своей студенческой группы и предусмотрите вывод на консоль данных о себе.
- Примените оператор typedef и указатель на структуру.
Пример 5. Напишите программу составления карточки на студента с динамическим распределением памяти для имени и фамилии на основе структурного типа данных [13.5].
Для динамического распределения памяти применим функцию malloc() и символьные указатели в качестве инициализаторов структуры.
Программный код решения примера:
#include <stdio.h> #include <conio.h> #include <string.h> #include <stdlib.h> #include <locale.h> const int MAX = 80; // Предполагаемое число символов int main (void) { char *NAME, *SURNAME; struct stud { // шаблон структуры char *name; // указатель вместо массива символов имени студента char *surname; // указатель вместо массива символов фамилии студента int age; // возраст - полных лет float av_mark; // средняя успеваемость int letters; // число символов в имени и фамилии } TABLE, *PTR; PTR = &TABLE; // инициализация указателя на структуру NAME = (char *)malloc(MAX); printf("\n Enter a name of the student: "); gets_s(NAME, MAX); SURNAME = (char *)malloc(MAX); printf(" Enter a surname of the student: "); gets_s(SURNAME, MAX); // Распределение памяти для хранения "структурного" имени PTR->name = (char *)malloc(strlen(NAME)+1); // Копирование имени в распределенную память strcpy_s(PTR->name, strlen(NAME)+1, NAME); // Распределение памяти для хранения "структурной" фамилии PTR->surname = (char *)malloc(strlen(SURNAME)+1); // Копирование фамилии в распределенную память strcpy_s(PTR->surname, strlen(SURNAME)+1, SURNAME); printf(" Enter the age of the student: "); scanf_s("%d", &TABLE.age); printf(" Enter an average mark of the student: "); scanf_s("%f", &TABLE.av_mark); TABLE.letters = strlen(PTR->name) + strlen(PTR->surname); // Для вывода чисел с десятичной запятой setlocale(LC_NUMERIC, ".1251"); puts("\n======== Varient field of structure ==============="); printf("\n Name: %s\n Surname: %s\n Age: %d\n Average mark: %1.2f\n\ The name and surname of student have: %d letters", \ PTR->name, PTR->surname, PTR->age, PTR->av_mark, PTR->letters); puts("\n\n================================================\n"); // Освобождение памяти free(NAME); free(SURNAME); free(PTR->name); free(PTR->surname); printf("\n Press any key: "); _getch(); return 0; }
В программе сначала выделяется память для имени и фамилии, для которых использованы указатели *NAME, *SURNAME. После того как имя и фамилия введены с клавиатуры, рассчитывается количество символов плюс символ окончания строки '\0', которые используются для выделения памяти для структурных переменных.
Возможный результат выполнения программы показан на рис. 13.5.