Опубликован: 14.12.2010 | Доступ: свободный | Студентов: 3137 / 738 | Оценка: 4.53 / 4.12 | Длительность: 26:28:00
Лекция 14:

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

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

Задание 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);

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.

Пример инициализированных полей структуры

Рис. 13.2. Пример инициализированных полей структуры

Задание 2

  1. Выполните усреднение оценок для каждого студента.
  2. Предусмотрите ввод названий предметов (математический анализ, алгебра и т.д.) и определите их в виде инициализаторов структуры.
  3. Увеличьте число студентов до семи и произведите запись результатов в текстовый файл с именем compX.txt, где Х – номер компьютера, за которым выполняется лабораторная работа.
  4. В шаблоне структуры задайте теговое имя. Проанализируйте работу программы.
  5. Примените оператор typedef для определения структурного типа данных
  6. Расположите фамилии (с именем) студентов в порядке возрастания их среднего балла за сессию.

Пример 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.

Пример вывода полей структуры на консоль

Рис. 13.3. Пример вывода полей структуры на консоль
< Лекция 13 || Лекция 14: 1234 || Лекция 15 >
Мухаммадюсуф Курбонов
Мухаммадюсуф Курбонов