Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Лекции по проге / 15_Динамические структуры данных

.pdf
Скачиваний:
33
Добавлен:
14.03.2016
Размер:
246.85 Кб
Скачать

Задание

Увеличить средний рейтинг студента Петрова, (группа 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