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.
• Вывести на дисплей фамилии студентов, у которых стипендия больше платы за обучение.