Определение динамического массива из n структур

Определение статического массива структур

 

Объявление статического массива std из 20 структур типа stud:

stud std[20];

Массив представлен на рис.8.

  Элемент массива Элемент массива Элемент массива
       
Поля структуры fio fio fio
kurs kurs kurs
facultet facultet facultet
spec spec spec
       
№ элемента массива
Рис.8

Примеры обращения к полям элемента массива с номером i:

gets(std[i].fio); //вводится с клавиатуры поле fio

scanf("%i",&std[i].kurs); //с клавиатуры вводится целочисленное поле

// kurs

 
 


Объявление указателя на структуру типа stud:

stud *st;

int n;

printf("n=");

scanf("%i",&n); //ввод количества элементов динамического массива st

st=(stud*)malloc(n*sizeof(stud)); // выделение динамической памяти

// под n структур типа stud.

Массив представлен на рис.9. Значением переменной st будет адрес нулевого элемента (первой структуры) динамического массива структур. Число n будет определять количество однотипных объектов (структурный тип stud описывает каждый такой объект), информация о которых будет храниться в созданном динамическом массиве. Именем этого массива будет имя указателя st.

 

  Элемент массива Элемент массива Элемент массива
     
Поля структуры fio fio fio
kurs kurs kurs
facultet facultet facultet
spec spec spec
st      
№ элемента массива n-1
Рис.9

Примеры обращения к полям i-го элемента динамического массива структур st.

gets((st+i)–>fio); //вводится с клавиатуры поле fio

scanf("%i",&(st+i)–>kurs); //с клавиатуры вводится целочисленное

//поле kurs

printf ("kurs=%i\n",(st+i)–>kurs); // на экран выводится значение поля

// kurs

Здесь операция & определяет адрес в ОП поля kurs i-го элемента динамического массива структур st. Операция –> (записанные последовательно друг за другом два знака: минус (–) и больше (>)) обозначает доступ к полю структуры через указатель:

 
 

 


Пример. Каждого студента можно описать при помощи следующих характеристик: ФИО, курс, специальность, предмет1, предмет2, предмет3. Написать программу, определяющую количество студентов:

1) сдавших сессию на «отлично»;

2) не сдавших хотя бы 1 экзамен.

 

Ход выполнения работы

1. Алгоритм решения данной задачи – алгоритм обработки одномерного массива. В задаче каждым элементом массива будет структура, т.е. элемент массива представляет собой набор переменных различного типа. Для ввода элемента массива нужно вводить значения каждого поля элемента массива поочередно. Так как работаем с массивом, то ввод-вывод элементов массива производится с помощью циклов с параметром.

2. Написать программу, соответствующую алгоритму.

Запишем алгоритм решения задачи и соответствующие программы с использованием статического и динамического массивов.

Использование динамических массивов:

Алгоритм Программа
структурный_тип stud { сhar fio[30]; int kurs; сhar spec[30]; int hist; int math; int phis; }; объявление stud *st; цел: n, i, count_5, count_2; ввод n выделение динамической памяти под указатель st для i=0 до n-1 шаг 1 заполнить каждое поле элемента массива структур отдельно все_для i count_5=count_2=0 для i=0 до n-1 шаг 1 //определяем количество //отличников если sti–>hist= =5 && sti–>math= =5 && sti–>phis= =5 count_5++; все_если // определяем количество студентов, // не сдавших хотя бы один экзамен если sti–>hist==2|| sti–>math==2|| sti–>phis==2 count_2++; все_если все_если все_для i печать count_5; печать count_2; освободить выделенную динамическую память под указатель st;     #include "stdio.h" #include "stdlib.h" typedef struct { char fio[30]; int kurs; char spec[30]; int hist; int math; int phis; } stud; int main() { stud *st; int n, i, count_5, count_2; printf("n="); scanf("%i",&n); st=(stud*)malloc(n*sizeof(stud)); // заполнение массива структур for(i=0;i<=n-1;i++) { printf(“fio=”);gets((st+i)–>fio); printf(“spec=”);gets((st+i)–>spec); printf(" kurs="); scanf("%i",&(st+i)–>kurs); printf(" history="); scanf("%i",&(st+i)–>hist); printf(" math="); scanf("%i",&(st+i)–>math); printf(" phis="); scanf("%i",&(st+i)–>phis); } count_5=count_2=0; for (i=0;i<=n-1;i++) { //определяем количество // отличников if((st+i)–>hist= =5&& (st+i)–>math= =5 && (st+i)–>phis==5) count_5++; //определяем количество студентов, //не сдавших хотя бы один экзамен if((st+i)–>hist= =2|| (st+i)–>math= =2|| (st+i)–>phis= =2) count_2++; } printf("count_5=%i\n",count_5); printf("count_2=%i\n",count_2); free(st); return; }

Использование статических массивов:

Алгоритм Программа
структурный_тип stud { сhar fio[30]; int kurs; сhar spec[30]; int hist; int math; int phis; }; объявление stud st[10]; цел: i, count_5, count_2; для i=0 до 10-1 шаг 1 заполнить каждое поле элемента массива структур отдельно все_для i count_5=count_2=0 для i=0 до 10-1 шаг 1 //определяем количество //отличников если st[i]–>hist= =5 && st[i]–>math= =5 && st[i]–>phis= =5 count_5++; все_если // определяем количество // студентов, не сдавших // хотя бы один экзамен если st[i]–>hist= =2|| st[i]–>math= =2|| st[i]–>phis= =2 count_2++; все_если все_если все_для i печать count_5; печать count_2;     #include "stdio.h" #include "stdlib.h" #define n 10 typedef struct { char fio[30]; int kurs; char spec[30]; int hist; int math; int phis; } stud; int main() { stud st[n]; int i, count_5, count_2; // заполнение массива структур for(i=0;i<=n-1;i++) { printf(“fio=”);gets(st[i].fio); printf(" kurs=");scanf("%i",&st[i].kurs); printf(“spec=”);gets(st[i].spec); printf(" history=");scanf("%i",&st[i].hist); printf(" math=");scanf("%i",&st[i].math); printf(" phis=");scanf("%i",&st[i].phis); } count_5=count_2=0; for (i=0;i<=n-1;i++) { //определяем количество отличников if(st[i].hist= =5&&st[i].math= =5&& st[i].phis= =5) count_5++; //определяем количество студентов, //не сдавших хотя бы один экзамен if(st[i].hist= =2|| st[i].math= =2|| st[i].phis= =2) count_2++; } printf("count_5=%i\n",count_5); printf("count_2=%i\n",count_2); return; }

3. Создать проект и реализовать данную задачу в среде Visual C++ 6.0.