Использование глобальных данных

Другая часто используемая возможность для передачи и/или возврата структурных переменных – использование внешних (глобальных) переменных, видимых как в точке вызова функции, так и в вызываемой функции.

Пример. Выполнить решение представленной выше задачи сортировки списка группы студентов по возрастанию среднего балла в сессию с использованием вспомогательных функций и глобальных объектов.

В программе осуществляется ввод и обработка структур данных, описанных вне функций как глобальных, с использованием указателей и массива указателей для сортировки списка студентов, что сокращает время обработки, так как не затрагивает самого массива структур данных студентов.

Программа:

#include<stdio.h>

#include<conio.h>

#include<alloc.h> /* для динамического выделения памяти */

#define kstud 30 /* максимальное количество студентов в группе */

#define kball 6 /* максимальное количество баллов в сессию */

typedef struct { /* определение типа структуры */

char *name; /* фамилия И. О. студента */

int ball [kball]; /* оценки в сессию */

float sb; /* средний балл */

} STUDENT; /* имя типа структуры */

STUDENT /* описание глобальных объектов */

gr [kstud], /* массив структур данных студентов */

*pgr [kstud ]; /* массив указателей */

int kst, kb; /* количество студентов и баллов */

void INDATA (); /* прототипы функций, */

void SRBALL (); /* которые обрабатывают */

void SORTBALL (); /* глобальные объекты */

void OUTDATA (); /* данных */

void main() /* главная функция */

{

clrscr(); /* очистка экрана */

printf (”Введите количество студентов в группе: ”);

scanf (”%d”, &kst);

printf (”Введите количество баллов в сессию: ”);

scanf (”%d”, &ks);

printf (”Ввод данных группы из %d студентов:\n”, kst);

INDATA (); /* вызов функции ввода данных */

SRBALL (); /* вычисление среднего балла */

puts (”Сортировка студентов по среднему балу (через массив “
“ указателей).”);

SORTBALL (); /* сортировка по среднему баллу */

OUTDATA (); /* вывод упорядоченного списка */

} /* конец главной функции */

void INDATA () /* функция ввода данных */

{ int i, j; /* параметры циклов */

for (i=0; i < kst; i++) /* цикл по студентам */

{ printf (”%2d. ”, i+1); /* ввод номера студента */

fflush (stdin); /* очистка буфера ввода */

(gr+1)->name = (char*)malloc(30); /* выделение динамич. памяти */

gets ((gr+i)->name); /* ввод фамилии И. О. */

printf (”Введите %d оценки (целые числа от 3 до 5): ”, kb);

for (j=0; j<kb; j++) /* цикл по баллам */

scanf (”%d”, &(gr+i)->ball[j]); /* ввод оценок */

pgr [i] = gr+i; /* запись указателей в массив указателей */

}

puts (“Конец ввода исходных данных”);

} /* конец функции INDATA */

void SRBALL () /* функция вычисления среднего балла */

{ int i, j; /* параметры циклов */

float sum; /* сумматор */

for (i=0; i < kst; i++) /* цикл по студентам */

{ sum=0; /* очистка сумматора */

for (j=0; j < kb; j++) /* цикл по баллам */

sum += (gr+i)->ball [j]; /* вычисление суммы оценок */

(gr+i)->sb = sum / kb; /* вычисление среднего балла */

}

} /* конец функции SRBALL */

void SORTBALL () /* функция сортировки методом простого выбора */

{ int i, j, k; /* параметры циклов */

STUDENT *pst; / * указатель типа STUDENT */

for (i=0; i < kst-1; i++) /* цикл по студентам */

{ k=i; /* начальное значение индекса */

for (j=i+1; j < kst; j++) /* цикл поиска max среднего балла */

if (pgr[j]->sb > pgr[k]->sb) k = j; /* индекс max среднего балла */

if (k!= i) /* если индекс k изменился, то */

{ pst = pgr[i]; /* перестановка указателей */

pgr[i] = pgr[k]; /* в массиве указателей через */

pgr[k] = pst; /* указатель pst */

}

}

} /* конец функции SORTBALL */

void OUTDATA () /* функция вывода списка студентов */

{ int i; /* параметр цикла */

puts(”Студент: Средний балл:”);

for (i=0; i < kst; i++) /* цикл по студентам */

{ printf (” %u. %-20s %6.3f\n ”, i+1, pgr[i]->name, pgr[i]->sb);

free (pgr[i]->name); /* очистка динамической памяти */

}

getch(); /* задержка экрана результатов */

} /* конец функции OUTDATA */


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: