Лекции по проге / 15_Динамические структуры данных
.pdf
Задание
Увеличить средний рейтинг студента Петрова, (группа IVT-160) на 5 баллов. Использовать следующие функции
// Вернуть кол-во студентов в группе // param [in] group – название группы // return - кол-во студентов в группе int getCount(const char *group);
// Получить студента в группе
// param [in] group – название группы
// param [in] student – индекс студента в группе // return - студент с заданным индексом,
// возвращает NULL, если студент не найден
41 struct TStudent *getStudent(const char *group, int student);
Изменение данных, хранящихся в контейнере
// текущий студент
struct TStudent *student; // студент Петров
struct TStudent *Petrov = NULL; // кол-во студентов в группе
int studentCount = getCount("IVT-160");
// Находим студента Петрова
for(int i = 0; i < studentCount && !Petrov; i++)
{
student = getStudent("IVT-160", i); if(strcmp(student->FIO, "Петров") == 0) { Petrov = student; }
|
} |
|
42 |
// Изменяем средний рейтинг Петрова (если нашли его) |
|
if(Petrov) |
Petrov->avg_rating += 5; |
|
Извлечение/удаление данных из контейнера
● В контейнер передается индекс извлекаемого элемента
●Контейнер удаляет указатель из контейнера и возвращает его копию - элемент фактически удаляется из контейнера
●Через полученный указатель можно обратиться к данным или уничтожить их
43
Извлечение/удаление данных из контейнера
IVT-160
... |
44
student
Иванов
76.9 removeStudent(...)
Петров |
IVT-160 |
92.7 |
|
Сидоров |
... |
|
|
25.0 |
|
Задание
Отчислить из группы IVT-160 первого студента и освободить память, занимаемую им. Использовать функцию:
//Извлечь студента из группы
//param [in] group – название группы
//param [in] student – индекс студента в группе
//return - студент с заданным индексом,
//возвращает NULL, если студент не найден
struct TStudent *removeStudent(const char *group, int student);
45
Извлечение/удаление данных из контейнера
struct TStudent *student; // отчисляемый студент
//Извлекаем первого студента из группы student = removeStudent("IVT-160", 0);
//Освобождаем память, занимаемую студентом if(student)
{
free(student); student = NULL;
}
//... или (работает только при корректном
//обращении к контейнеру)
46 free( removeStudent("IVT-160", 0) );
Перемещение данных между контейнерами
●Элемент извлекается из первого контейнера, возвращается указатель на этот элемент
●Элемент добавляется во второй контейнер, используя полученный указатель
47
IVT-160
... |
48
Перемещение данных между контейнерами
IVT-161 |
Антонов |
IVT-161 |
|
|
|
||
... |
77.2 |
... |
|
Щукина |
|||
|
|
||
|
86.5 |
addStudent() |
|
|
|
student
Иванов 
76.9removeStudent()
Петров |
IVT-160 |
92.7 |
|
Сидоров |
... |
|
|
25.0 |
|
Задание
Перевести из группы IVT-160 в группу IVT-161 первого студента
49
Перемещение данных между контейнерами
struct TStudent *student; // студент для перевода
//Извлекаем первого студента из группы IVT-160 student = removeStudent("IVT-160", 0);
//Добавляем студента в группу IVT-161
if(student != NULL)
{ addStudent("IVT-161", student); }
50
