Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ЗФ_ОАиП / Лекции ГГУ Скорины - Программирование.doc
Скачиваний:
179
Добавлен:
21.03.2016
Размер:
2.27 Mб
Скачать

29.6. Массивы структур

Процесс описания массива структур совершенно аналогичен описанию массива любого другого типа:

struct Student {

char fio[80];

int year;

char address[100];

};

struct Student grp[35];

Объявляем массив grp, состоящий из 35 элементов. Каждый элемент массива представляет собой структуру типа Student, т.е. grp[0] является в массиве первой Student-структурой, grp[1] – второй Student-структурой и т.д.

Массив структур можно инициализировать при описании:

struct Student grp1[]= { {“Иванов”, 1990, “Гомель”},

{“Петров”, 1989, “Минск”},

{“Волков”, 1993, “Мозырь”},

{“Кузмин”, 1988, “Добруш”},

{“Зайцев”, 1990, “Гомель”} };

Число элементов массива grp1 будет вычислено по количеству инициализаторов, т.к. внутри квадратных скобок [] ничего не задано.

Доступ к элементам массива структур может выполняться с использованием индекса или через указатель-константу, которым является имя массива.

Пример доступа к студенту с номером i:

strcpy(grp[i].fio, “Иванов”);

(*(grp+i)).year = 1990;

strcpy((grp+i)->address, “Гомель”);

Для доступа к элементам массива структур может использовать и обычный казатель:

struct Student *ptr;

ptr = grp;

strcpy(ptr[i].fio, “Иванов”);

(*(ptr+i)).year = 1990;

strcpy((ptr+i)->address, “Гомель”);

ptr++; // переход к студенту с номером i+1, т.е.

// увеличивает указатель на размер типа struct Student

Задача. Описать группу студентов, заполнить информацию о группе и студентах группы с клавиатуры, определить самого юного студента в группе, отсортировать студентов группы по фамилии.

void main() {

int i, j;

struct Student {

char fio[80];

int year;

char adr[100];

};

struct Gruppa {

char name[10]; // название группы

int num; // количество студентов в группе

struct Student stud[35]; // студенты группы

} grp;

struct Student *min, st;

printf("Название группы: ");

scanf("%s", grp.name);

printf("Количество студентов: ");

scanf("%d", &grp.num);

printf("Введите информацию о студентах группы: \n");

for (i=0; i<grp.num; i++) {

printf("Студент %d: \n”, i);

flushall();

printf("Фамилия: ");

gets(grp.stud[i].fio);

printf("Год рождения: ");

scanf("%d", &grp.stud[i].year);

flushall();

printf("Адрес: ");

gets(grp.stud[i].adr);

}

// поиск самого юного студента

if (grp.num == 0) min = NULL;

else min = &grp.stud[0];

for (i=1; i<grp.num; i++)

if (grp.stud[i].year < min->year)

min = &grp.stud[i];

if (min) {

printf("Самый юный студент: \n");

printf("Фамилия = %s\n", min->fio);

printf("Год рождения = %d\n", min->year);

printf("Адрес = %s\n", min->adr);

}

else

puts("В группе нет студентов!\n");

// сортировка студентов по фамилии

for (i=0; i<grp.num-1; i++)

for (j=i+1; j<grp.num; j++)

if (strcmp(grp.stud[i].fio,grp.stud[j].fio)>0) {

st = grp.stud[i];

grp.stud[i] = grp.stud[j];

grp.stud[j] = st;

}

printf(“Отсортированный список группы %s:\n”, grp.name);

for (i=0; i<grp.num; i++) {

printf("Студент %d:\n”, i);

printf("Фамилия = %s\n", grp.stud[i].fio);

printf("Год рождения = %d\n", grp.stud[i].year);

printf("Адрес = %s\n", grp.stud[i].adr);

}

}