Структуры – производные типы данных языка С
Задание 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.
 
                             

