Опубликован: 14.12.2010 | Уровень: для всех | Доступ: свободно
Лекция 14:

Структуры – производные типы данных языка С

< Лекция 13 || Лекция 14: 1234 || Лекция 15 >

Задание 3

  1. В программу добавьте нумерацию полей структуры, например: 1) имя: и т.д.
  2. В программу введите свое имя и фамилию, возраст и размер получаемой стипендии (если нет, то нуль). Значения новых полей выведите на консоль и в текстовый файл с именем compX.txt, где Х – номер компьютера, за которым выполняется лабораторная работа.
  3. Инициализацию полей структуры выполните с помощью указателя.
  4. Выполните предварительную инициализацию структуры, а затем смените значения полей.
  5. Тип данных 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.

Пример информационной карточки студенческой группы

Рис. 13.4. Пример информационной карточки студенческой группы

Задание 4

  1. Инициализацию структуры выполните с клавиатуры.
  2. Предусмотрите массив структур ACOUY[N], где N – количество групп (например, N = 3 ).
  3. Введите данные своей студенческой группы и предусмотрите вывод на консоль данных о себе.
  4. Примените оператор 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.

Пример динамического создания карточки студента

Рис. 13.5. Пример динамического создания карточки студента
< Лекция 13 || Лекция 14: 1234 || Лекция 15 >
Мухаммадюсуф Курбонов
Мухаммадюсуф Курбонов
Андрей Поляков
Андрей Поляков
Россия, Челябинск, Южно-Уральский Государственный Университет (НИУ)