Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
13_структуры_производные_типы_данных.pdf
Скачиваний:
9
Добавлен:
16.03.2016
Размер:
697.68 Кб
Скачать

Язык программирования Cи

Общий формат доступа к элементам структуры имеет вид

имя_переменной_структуры . имя_поля; имя_указателя_на_структуру –> имя_поля;

(*имя_указателя_на_структуру) . имя_поля;

Например, для рассмотренной инициализации можно изменить почасовой оклад с помощью оператора точки и указателя на структуру:

new_employee.hourlysalary = 21.0; employeePtr –> hourlysalary = 21.0;

Следует обратить внимание на то, что new_employee – это имя всего объектаструктуры, а hourlysalary – имя элемента этой структуры. Аналогично и в случае использования указателя *employeePtr на структуру.

При изменении полей структуры следует обратить внимание на случай со строками, например:

strcpy(new_employee . name, "Stephen");

При этом должен быть предусмотрен заголовочный файл <string.h>. для функции strcpy().

Когда объявлен массив структур, например stack[120], это означает, что создано 120 наборов переменных, каждый из которых организован так, как определено в структуре с дескриптором employee. Чтобы получить доступ к определенной структуре stack[120], следует указать имя массива с индексом, который изменяется от 0 до 119. Например, для пятой структуры можно сделать изменения в почасовом окладе:

stack[4].hourlysalary = 121.5;

Как и в других массивах переменных языка С, в массивах структур индексирование начинается с нуля. Членами структуры могут быть также массивы или структуры. Когда одна структура является членом другой, она называется вложенной [2].

Рассмотрим пример: struct X =

{

int A[7][8]; float b; char ch;

struct employee Emp2;

} Y;

Инициализация элементов двухмерного массива А может быть такой:

Y.A[2][5] = 99;

Инициализация вложенной структуры может быть следующей:

Y.Emp2.hourlysalary = 12.75;

В соответствии со стандартом С89 структуры могут быть вложенными вплоть до 15го уровня, стандарт С99 допускает уровень вложенности до 63-го включительно [2].

2. ПРАКТИЧЕСКАЯ ЧАСТЬ

Пример 1

Написать программу структурного описания каталога одной книги. Программный код решения примера

#include <stdio.h> #include <conio.h> #include <string.h> #define N 40 struct book

{ // определение структуры

char

title[N+1];

//

название книги

char

author[N+1];

//

автор

3

Язык программирования Cи

int year;

// год издания

int page;

// количество страниц

float price;

// цена в у.е.

} Library;

 

int main (void)

{

//Инициализация полей структуры

Library.year = 2007; Library.page = 496; Library.price = 12.78F;

strcpy_s(Library.title, N, "Programming in C"); strcpy_s(Library.author, N, "Stephen G. Kochan");

//Вывод на консоль

printf("\n\t Title: %s\n", Library.title); printf("\t Author: %s\n", Library.author); printf("\t Year: %d\n", Library.year );

printf("\t Number of pages: %d p.\n", Library.page ); printf("\t Price: %1.2f y.e.\n", Library.price); printf("\n\n Press any key: ");

_getch(); return 0;

}

В программе использованы функции strcpy_s() вместо стандартных функций strcpy(), что позволило избавиться от предупреждений в системе Visual Studio 2010.

Результат выполнения программы показан на рисунке.

Задание 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;// Имя студента

4

Язык программирования Cи

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>.

Определение структуры выполнено за пределами главной функции main(), что позволяет использовать ее в других функциях, если бы они были определены в программе.

5

Язык программирования Cи

Шаблон структуры задан без имени-этикетки.

Возможный результат выполнения программы приведен на рисунке.

Пример сводной ведомости успеваемости студентов

Задание 2

1.Выполните усреднение оценок для каждого студента.

2.Предусмотрите ввод названий предметов (математический анализ, алгебра и т. д.) и определите их в виде инициализаторов структуры.

3.Увеличьте число студентов до семи и произведите запись результатов в текстовый файл с именем compX.txt, где Х – номер компьютера, на котором выполняется лабораторная работа.

4.В шаблоне структуры задайте теговое имя. Проанализируйте работу программы.

5.Примените оператор typedef для определения структурного типа данных.

6.Расположите фамилии (с именами) студентов в порядке возрастания их среднего балла за сессию.

6