typedef struct // создаем свой тип адрес

Struct

{

char street[10];

char city[10];

unsigned long int index;

}kinoPenza[3];

 

В этом случае имя описания структуры указывать не обязательно, как в объявлении 3.

 

Часто удобно использовать ключевое слово typedef при описании структуры, таким образом создается новый тип данных, и при объявлении переменных можно опускать слово struct. Например так:

Typedef struct

{

char street[10];

char city[10];

unsigned long int index;

}address; // создали собственный тип данных address

address sovremenik; // создали переменную с типом address

address[3] kinoPenza; // создали массив переменных с типом address

 

Доступ к членам структуры.

Доступ к отдельным членам структуры осуществляется с помощью оператора . (который обычно называют оператором точка или оператором доступа к члену структуры). Например, в следующем выражении полю index в уже объявленной переменной-структуре sovremenik присваивается значение почтового индекса, равное 440008:

 

sovremenik.index = 440008;

Значению city присваивается значение Penza

char city[5] = {'P','e','n','z','a'};

int i =0;

while(i < 5){

sovremenik.city[i]= city[i];

i++;

}

Полями структуры могут быть другие структуры.

 

Например созданная ранее структура address может быть полем другой структуры:

 

typedef struct // создаем свой тип адрес

{

char street[10];

char city[5];

unsigned long int index;

}address;

 

typedef struct{ // создаем свой тип студент

char name[10];

address adr;

}student;

 

 

student alex; // создаем переменную с типом студент

 

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

alex.adr.index = 440049;// обращаемся к полю вложенной структуры

 

Присваивание структур

Информация, которая находится в одной структуре, может быть присвоена другой структуре того же типа при помощи единственного оператора присваивания. Нет необходимости присваивать значения каждого члена в отдельности. Как выполняется присваивание структур.

Например, так

alex.adr = sovremenik;

 

Указатель на структуру:

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

student* pointerStudent; // объявляем указатель на структуру типа студент

pointerStudent = &alex; // указатель указывает на alex

 

Указатели на структуры в Си широко распространены, поэтому присутствует специальный оператор доступа к полям структуры, через указатель на структуру. ->

 

address alexAdress = pointerStudent-> adr;// доступ к полю adr, через

// указатель на структуру.

 

Объединения.

Объединение — это объект, который в данный момент может содержать любой из нескольких членов. Т.е. описывает общее место в памяти для всех своих членов. Размер объединения равен размеру наибольшего члена.Объединение можно использовать для экономии памяти, или для представления одного значения в разных типах переменных. Для того чтобы описать объединение используется ключевое слово union. Описание и использование объединения похоже на описание структуры, например.

// описание объединения, размер 32 бита.

union bit32{

int int_value;

char char_massive[4];

short int short_massive[2];

float float_value;

};

// создание переменной

union bit32 myUnion;

Доступ до полей с помощью оперетора «.»

 

printf("%d \n",sizeof(myUnion));// размер переменной myUnion в байтах

myUnion.int_value = 0x11223344; // присваиваем значение одному из полей

// в других полях появилось этоже значение.

for(i = 0; i < 4; i++){

printf("%x \n",myUnion.char_massive[i]); // выведет 44 33 22 11

}

for(i = 0; i < 2; i++){

printf("%x \n",myUnion.short_massive[i]);// выведет 3344 1122

}

printf("%e \n",myUnion.float_value);// выведет 1.279534e-028.

 

 

Практическая часть.

 

1. Создать и инициализировать структуру для хранения отметок в зачетной книжке за семестр. С обязательными полями – фамилия, оценки за 3 экзамена, и с любым количеством дополнительных полей.

2. Создать и инициализировать массив из 3, созданных ранее структур.

3. Вывести на экран фамилию того студента, у кого средняя оценка за экзамены, ближе всего к средней по группе (из 3 человек).

4. Вывести фамилии в порядке увеличения оценки за экзамены по первому предмету.

5. Сделать инициализацию массива структур из пункта 2, с помощью ввода данных с клавиатуры. Повторить пункты 3-4.

 

Пример кода программы:

 

#include <stdio.h>

#include <math.h>

#include <ctype.h>

 

enum {

TAU,

Informatika,

NumberExamsSubject,

};

enum {

NumberStudents = 3,

};

typedef struct{

char name[40];

unsigned char examsMark[NumberExamsSubject];

float meanExamsMark;

}recordBook;

 

void main(void){

// длякорректнойработыprintf и scanf

setvbuf(stdin, NULL, _IONBF, 0);

setvbuf(stdout, NULL, _IONBF, 0);

 

// Инициализация в текстепрограммы

recordBook students[NumberStudents] = {

{"Иванов", {4,4}},

{"Петров", {5,5}},

{"Сидоров", {3,4}}

};

// инициализация с помощьюклавиатуры

int i = 0;

int j = 0;

for(i = 0; i < NumberStudents; i++){

printf("Введитефамилию %d студента \n", i+1 );

scanf("%s", students[i].name);

for(j = 0; j < NumberExamsSubject;j++ ){

printf("Введитеоценку %d студентаза %d предмет\n", i+1, j+1 );

scanf("%d", &students[i].examsMark[j]);

}

}

// Нахождениесреднейоценкипоэкзаменам

for(i = 0; i < NumberStudents; i++){

int summa = 0;

for(j = 0; j < NumberExamsSubject;j++ ){

summa += students[i].examsMark[j];

}

students[i].meanExamsMark = (float)summa/NumberExamsSubject;

}

// Нахождениесреднейоценкипогруппе

float meanMarkGroup = 0;

for(i = 0; i < NumberStudents; i++){

meanMarkGroup += students[i].meanExamsMark;

}

meanMarkGroup = meanMarkGroup/NumberStudents;

 

// Нахождениестудента с оценкойсамойблизкой к средней

float difference = 0;

float min_difference = fabs(meanMarkGroup - students[0].meanExamsMark);// начальнаяразница

int student_index = 0;

for(i = 1; i < NumberStudents; i++){

difference = fabs(meanMarkGroup - students[i].meanExamsMark);

if(difference < min_difference){

min_difference = difference;

student_index = i;

}

}

printf(" Cтудент с самойблизкой к среднейоценкой - %s",students[student_index].name);

}

 

 

Варианты заданий.

 

 

Вариант 1.
1.Описать структуру с именем student, содержащую следующие поля:
• name – фамилия;
• group – номер группы (целое число);
• marks – успеваемость, оценки (массив из пяти элементов).
2. Написать программу, выполняющую следующие действия :

• инициализацию массива massiveStudents, состоящий из 3 структур типа student в тексте программы;
• ввод с клавиатуры данных в массив massiveStudents, состоящий из 3 структур типа student;
• вывод на дисплей фамилий и номеров групп для всех студентов, включенных в массив, если средний балл студента больше 4,0;
• если таких нет, вывести соответствующее сообщение.

Вариант 2
1. Описать структуру с именем student, содержащую следующие поля:
• name – фамилия;
• group – номер группы (целое число);
• marks – успеваемость, оценки (массив из пяти элементов).


2. Написать программу, выполняющую следующие действия :

• инициализацию массива massiveStudents, состоящий из 3 структур типа student в тексте программы;

• ввод с клавиатуры данных в массив massiveStudents, состоящий из 3 структур типа student;

• вывод на дисплей фамилий и номеров групп для всех студентов, имеющих оценки 4 и 5;
• если таких нет, вывести соответствующее сообщение.

Вариант 3
1. Описать структуру с именем student, содержащую следующие поля:
• name – фамилия;
• group – номер группы (целое число);
• marks – успеваемость, оценки (массив из пяти элементов).


2. Написать программу, выполняющую следующие действия :

• инициализацию массива massiveStudents, состоящий из 3 структур типа student в тексте программы;

• ввод с клавиатуры данных в массив massiveStudents, состоящий из 3 структур типа student;

• вывод на дисплей фамилий и номеров групп для всех студентов, имеющих хотя бы одну оценку 2;
• если таких студентов нет, вывести соответствующее сообщение.

 

Вариант 4

1. Описать структуру с именем student, содержащую следующие поля:
• name – фамилия;
• group – номер группы (целое число);
• marks – успеваемость, оценки (массив из пяти элементов).


2. Написать программу, выполняющую следующие действия :

• инициализацию массива massiveStudents, состоящий из 3 структур типа student в тексте программы;

• ввод с клавиатуры данных в массив massiveStudents, состоящий из 3 структур типа student;

• вывод на дисплей фамилий и всех оценок студентов, фамилия которых содержит букву а;
• если таких студентов нет, вывести соответствующее сообщение.

Вариант 5

1. Описать структуру с именем student, содержащую следующие поля:

• name – фамилия;
• attendance – посещаемость в процентах (целое число);
• marks – успеваемость, оценки (массив из пяти элементов).

• balls – общая характеристика учебы. (число с плавающей точкой)


2. Написать программу, выполняющую следующие действия :

• инициализацию массива massiveStudents, состоящий из 3 структур типа student в тексте программы, поле balls не заполняется;

• ввод с клавиатуры данных в массив massiveStudents, состоящий из 3 структур типа student, поле balls не заполняется;

• для каждого студента рассчитать балы (balls) по формуле – сумма оценок (marks) * посещаемость (attendance)/ 100;
• для каждого студента вывести на экран фамилию и рассчитанный бал.

 

Вариант 6

2. Описать структуру с именем student, содержащую следующие поля:

• name – фамилия;
• attendance – посещаемость в процентах (целое число);
• marks – успеваемость, оценки (массив из пяти элементов).

• balls – общая характеристика учебы. (число с плавающей точкой)


2. Написать программу, выполняющую следующие действия :

• инициализацию массива massiveStudents, состоящий из 3 структур типа student в тексте программы, поле balls не заполняется;

• ввод с клавиатуры данных в массив massiveStudents, состоящий из 3 структур типа student, поле balls не заполняется;

• для каждого студента рассчитать балы (balls) по формуле – посещаемость (attendance)/100 + средняя оценка по всем 5 дисциплинам ;
• для каждого студента вывести на экран фамилию и рассчитанный бал.

 

Вариант 7

3. Описать структуру с именем student, содержащую следующие поля:

• name – фамилия;
• attendance – посещаемость в процентах (целое число);
• marks – успеваемость, оценки (массив из пяти элементов).

• balls – общая характеристика учебы. (число с плавающей точкой)


2. Написать программу, выполняющую следующие действия :

• инициализацию массива massiveStudents, состоящий из 3 структур типа student в тексте программы, поле balls не заполняется;

• ввод с клавиатуры данных в массив massiveStudents, состоящий из 3 структур типа student, поле balls не заполняется;

• узнать среднюю посещаемость (attendance) в массиве студентов;

• узнать среднюю оценку (marks) для каждого студента;
• вывести рассчитанные значения на дисплей.

 

Вариант 8

4. Описать структуру с именем student, содержащую следующие поля:

• name – фамилия;
• attendance – посещаемость в процентах (целое число);
• marks – успеваемость, оценки (массив из пяти элементов).

• year – год поступления (целое число).

• payment – платник?( может быть 0 или 1).

 

 


2. Написать программу, выполняющую следующие действия :

• инициализацию массива massiveStudents, состоящий из 3 структур типа student в тексте программы,

• ввод с клавиатуры данных в массив massiveStudents, состоящий из 3 структур типа student.

• Вывести на дисплей фамилию студента с лучшей посещаемостью;

• Вывести на дисплей фамилии студентов - платников, если такие есть.

 

 

Вариант 9

1. Описать структуру с именем student, содержащую следующие поля:

• name – фамилия;
• attendance – посещаемость в процентах (целое число);
• marks – успеваемость, оценки (массив из пяти элементов).

• year – год поступления (целое число).

• payment – платник?( может быть 0 или 1).

 


2. Написать программу, выполняющую следующие действия :

• инициализацию массива massiveStudents, состоящий из 3 структур типа student в тексте программы,

• ввод с клавиатуры данных в массив massiveStudents, состоящий из 3 структур типа student.

• Вывести на дисплей фамилии студентов - бюджетников, если такие есть.

• Вывести на дисплей фамилию студента с лучшей суммой оценок;


Вариант 10

2. Описать структуру с именем student, содержащую следующие поля:

• name – фамилия;
• marks – успеваемость, оценки (массив из пяти элементов).

• payment – плата за обучение.

• grant – стипендия за обучение.

 


2. Написать программу, выполняющую следующие действия :

• инициализацию массива massiveStudents, состоящий из 3 структур типа student в тексте программы,

• ввод с клавиатуры данных в массив massiveStudents, состоящий из 3 структур типа student.

• Вывести на дисплей фамилии студентов, у которых стипендия больше платы за обучение.