Главная страница
Случайная страница
Разделы сайта
АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника
|
Определение динамического массива из 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
|
|
|
|
| № элемента массива
|
|
| …
| 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.
|