Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
лекции по С++.doc
Скачиваний:
59
Добавлен:
15.12.2018
Размер:
2 Мб
Скачать
☆

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

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

stud std[20];

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

Элемент массива

Элемент массива

…

Элемент массива

Поля

структуры

fio

fio

…

fio

kurs

kurs

kurs

facultet

facultet

facultet

spec

spec

spec

№ элемента массива

0

1

…

19

Рис.8

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

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

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

// kurs

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

Объявление указателя на структуру типа 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

№ элемента массива

0

1

…

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;

}

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