МУ_ЛР8_ОП (1079941), страница 6
Текст из файла (страница 6)
SNode S1 ={ &S2, {"Иванов" , 1 , 10.00f}};// Инициализация структуры при описании
SNode *pSNode = &S1;
// Для суммы окладов
float fSum = 0.0f;
while(pSNode != NULL)
{
printf ("Элемент простого списка: %s %d %f \n" , pSNode->Stud.Name,
pSNode->Stud.Num, pSNode->Stud.Oklad );
fSum = fSum + pSNode->Stud.Oklad ;
pSNode = pSNode->pNext; // Навигация
};
// Сумма
printf ("Результат суммирования (оклады): Sum= %f \n\n", fSum);
Результат печати списка и суммы по структурным переменным:
Элемент простого списка: Иванов 1 10.000000
Элемент простого списка: Петров 2 20.000000
Элемент простого списка: Сидоров 3 30.000000
Результат суммирования (оклады): Sum= 60.000000
33 Печать переменных списка с внешними данными (указатель на структуру)
struct DSNode {
DSNode * pNext;
Student * pStud; // Ссылка на данные, выделяемые динамически
};
…
// Описание переменных списка (связь ручная)
DSNode DS3 ={ NULL, NULL }; // {"Сидоров" , 3 , 30.00f}
DSNode DS2 ={ &DS3, NULL }; // {"Петров" , 2 , 20.00f}
DSNode DS1 ={ &DS2, NULL }; // {"Иванов" , 1 , 10.00f}
// Заполнения переменных списка
Student Stud1 = {"Иванов2" , 1 , 10.00f};
DS1.pStud = &Stud1;
Student Stud2 = {"Петров2" , 2 , 20.00f};
DS2.pStud = &Stud2;
Student Stud3 = {"Сидоров2" , 3 , 30.00f};
DS3.pStud = &Stud3;
…
Цикл печати списка:
DSNode * pDSNode = &DS1;
//
while(pDSNode != NULL)
{
printf ("Элемент простого списка: %s %d %f \n" , pDSNode->pStud->Name,
pDSNode->pStud->Num, pDSNode->pStud->Oklad );
pDSNode = pDSNode->pNext;
};
…
Результат печати списка:
Элемент простого списка: Иванов2 1 10.000000
Элемент простого списка: Петров2 2 20.000000
Элемент простого списка: Сидоров2 3 30.000000
34 Печать переменных списка с динамическими данными void
Структуры данных с универсальными указателями (типа void). При работе с указателями универсального вида нужно вручную следить за преобразованием типов данных и обеспечивать корректную компиляцию с явным указанием типов (С помощью каст-выражений ). Такие списки привлекательны тем, что могут хранить разные типы структурных переменных, но при этом написание программ и отладка усложняются, а вероятность ошибок возрастает. Возможность такого использования указателей базируется на правиле: любой тип указателя может быть преобразован к указателю типа void. Примеры универсальных структур:
// Минимально с универсальными указателями
struct VNode {
void * pData;
void * pNext;
};
//
struct VSList {
void * pHead; // Голова списка
void * pTail; // Хвост списка
int Count; // Счетчик студентов
};
Заполнений списков с void-указателями и каст-выражением ((Student * )):
// Ручное заполнение списка
VNode V3 = { NULL , NULL};
VNode V2 = { NULL , &V3};
VNode V1 = { NULL , &V2};
// 1 - й
V1.pData = (void *) malloc ( sizeof (Student));
strcpy( (char *)((Student * )V1.pData)->Name , "Первый");
((Student * )V1.pData)->Num = 1;
((Student * )V1.pData)->Oklad = 1000.0f;
// 2 - й
V2.pData = (void *) malloc ( sizeof (Student));
strcpy( (char *)((Student * )V2.pData)->Name , "Второй");
((Student * )V2.pData)->Num = 2;
((Student * )V2.pData)->Oklad = 2000.0f;
// 3 - й
V3.pData = (void *) malloc ( sizeof (Student));
strcpy( (char *)((Student * )V3.pData)->Name , "Третий");
((Student * )V3.pData)->Num = 3;
((Student * )V3.pData)->Oklad = 3000.0f;
// Список в нашем случае статический
VSList VL = { &V1, &V3, 3};
// Печать
void * pV;
pV = VL.pHead;
// Цикл печати списка вручную
while(pV != NULL)
{
printf ("Печать элемента списка: %s %d %f \n" ,
((Student * )(((VNode *)pV)->pData))->Name , ((Student * )(((VNode *)pV)->pData))->Num ,
((Student * )(((VNode *)pV)->pData))->Oklad );
pV = ((VNode *)pV)->pNext; // Навигация по списку
};
Печать результатов для универсальных списков:
Печать элемента списка: Первый 1 1000.000000
Печать элемента списка: Второй 2 2000.000000
Печать элемента списка: Третий 3 3000.000000
Нужно создать пустой проект в MS VS, как описано выше, скопировать через буфер обмена в него текст данного примера, отладить его и выполнить.
35 Контрольные задания ЛР №7.
36 Создать однонаправленный список вручную
Описать элемент однонаправленного списка. Описать структуру для однонаправленного списка (см. примеры). Создать однонаправленный список с вложенной структурой для своего варианта ДЗ/КЛР (см. таблицу ниже). Список создается вручную и частично инициализируется при описании элементов. Число элементов списка не менее 5-ти. Проверка правильного создания и связывания списка выполняется в отладчике (окно “Local”).
37 Распечатать однонаправленный список
Распечатать созданный в предыдущем пункте однонаправленный список. Для навигации по списку использовать указатели и оператор навигации по списку. Список напечатать в прямом порядке.
38 Создать функцию для распечатки списка
Создать функцию для распечатки списка со своими структурами. В качестве параметра должен передаваться указатель на структуру списка. Продемонстрировать работу функции на своем списке с вызовом из основной программы.
39 Создать функцию для добавления элементов в однонаправленный список (голова)
Данные добавляются в голову списка. Продемонстрировать работу функции на своем списке. Распечатать список после добавления с помощью своей функции.
40 Создать функцию для добавления элементов в однонаправленный список (хвост)
Данные добавляются в хвост списка. Продемонстрировать работу функции на своем списке. Распечатать список после добавления с помощью своей функции.
41 Выполнить удаление элементов из списка
Написать фрагмент программы для удаления из однонаправленного списка с элементами своего задания. Вид удаления задается вариантом (голова или хвост). Продемонстрировать работу функции на своем списке. Распечатать список после добавления с помощью своей функции.
42 Создать функцию очистки списка
Создать специальную функцию для очистки списка. Продемонстрировать ее работу в основной программе.
43 Написать программу для поиска экстремального элемента списка
Искать по варианту минимум или максимум для одного из целочисленных элементов своей структуры данных по варианту. Весь список, номер экстремального элемента и его значение этого элемента ( распечатать предварительно весь список и найденный элемент - всю структуру).
44 Выполнить сложение двух списков
Создать вручную два однонаправленных или двунаправленных списка из трех элементов (тип списка задается по варианту), сложить эти списки (в общий список последовательно включаются элементы первого а затем второго списка), распечатать отдельно оба списка и полученный результат после сложения. Ручное создание списков представлено в теоретической части данных МУ.
45 Варианты заданий для студентов СУЦ.
Варианты заданий приведены ниже. Номер варианта должен соответсвовать номеру студента в групповом журнале.
| № п/п | Структура ДЗ 5 полей, 3 первых из них числовые | Поиск экстренума | Удаление элементов из списка | Для сложения списков | Сортировка (д.т.) по числовому параметру |
| | Кафедра | Минимум | Из хвоста | Однонаправленные списки | По убыванию |
| | Книга | Максимум | Из головы | Двунаправленные списки | По возрастанию |
| | Файл | Минимум | Из хвоста | Однонаправленные списки | По убыванию |
| | Автомобиль | Максимум | Из головы | Двунаправленные списки | По возрастанию |
| | Компьютер | Минимум | Из хвоста | Однонаправленные списки | По убыванию |
| | Группа | Максимум | Из головы | Двунаправленные списки | По возрастанию |
| | Человек | Минимум | Из хвоста | Однонаправленные списки | По убыванию |
| | Стеллаж | Максимум | Из головы | Двунаправленные списки | По возрастанию |
| | Дом | Минимум | Из хвоста | Однонаправленные списки | По убыванию |
| | Студент | Максимум | Из головы | Двунаправленные списки | По возрастанию |
46 Дополнительные требования для студентов СУЦ (д.т.).
Для продвинутых студентов, по желанию, можно построить программу с дополнительными требованиями. Дополнительные требования выполняются в дополнение основным требованиям ЛР.
47 Создать функцию для добавления элементов по номеру в двунаправленном списке
Внешние динамические данные, свои данные. Продемонстрировать с распечаткой.
48 Создать функцию для обмена элементов в двунаправленном списке
Внешние динамические данные, свои данные. Продемонстрировать с распечаткой.
49 Отсортировать список по числовому параметру из структуры
Тип сортировки задан вариантом. Внешние динамические данные, свои данные. Продемонстрировать с распечаткой.
50 Создать функцию для сортировки элементов по номеру
Тип сортировки задан вариантом. Внешние динамические данные, свои данные. Продемонстрировать с распечаткой.
51 Создать двунаправленный список вручную – вложенные в элемент данные
Данные вложены в элемент списка. Минимально записать 5-ть элементов в цикле, можно задать случайные данные. Распечатать список.
52 Записать данные из двунаправленного списка в файл
Написать фрагмент программы для записи списка, в двоичный файл. Список использовать из предыдущего примера. Свои данные записаны в структуре элемента списка. Результат записи в файл проверить в файл менеджере.
53 Прочитать данные из файла в двунаправленный список
Прочитать данные из двоичного файла в список. Файл записан в предыдущем задании. Свои данные записаны в структуре элемента списка. Полученный список распечатать и сравнить результат с файлом (посмотреть значения в шестнадцатеричном виде в файл менеджере).
54 Демонстрация, защита ЛР и отчет по ЛР.
После выполнения всех необходимых шагов по ЛР, работающую программу нужно продемонстрировать преподавателю, проводящему ЛР, о чем он в журнале делает отметку. Далее студент на основе шаблона и примера оформляет отчет по ЛР. После оформления отчета, который может быть представлен преподавателю в электронном виде, выполняется защита ЛР. Студент дает ответы на вопросы по отчету и на контрольные вопросы приведенные ниже. ЛР считается полностью зачтенной, если выполнены все перечисленные требования и действия: демонстрация, отчет и защита ЛР.
55 Контрольные вопросы по ЛР.
-
Что такое список как структура данных? Дайте определение.
-
Какие разновидности списков вы знаете?
-
Что такое элемент списка? Какие структуры элемента списка вы знаете?
-
Какие особенности списков вы знаете по сравнению с массивами?
-
Что такое статические и динамические списки?
-
Что такое однонаправленные и двунаправленные списки? Их преимущества?
-
Как строится и используется структура типа список? Что такое хвост и голова списка
-
Как выполняется движение (навигация ) по списку?
-
Как может записываться информация в элементах списка?
-
В каких списках лучше выполнять операции добавления и удаления? Почему?
-
Как создаются динамические списки?
-
Какие основные операции над списками вы знаете?
-
Поясните работу с однонаправленным списком по МУ?
-
Поясните работу с двунаправленным списком по МУ?
-
Поясните работу со статическим списком по МУ?
-
Поясните работу с динамическим списком по МУ?
-
Поясните операцию добавления в голову списка?
-
Поясните операцию добавления в хвост списка?
-
Поясните операцию удаления из головы списка?
-
Поясните операцию удаления из хвоста списка?
-
Поясните алгоритм распечатки однонаправленного списка?
-
Как выполняется очистка статического списка?
-
Как выполняется очистка динамического списка?
-
Как записать список в файл, прочитать из файла?
56 Литература.
Основная литература
-
Список литературы, доступные книги и необходимые пособия для ЛР ОП размещены на сайте www.sergebolshakov.ru на страничке “2-й к СУЦ”. Пароль для доступа можно взять у преподавателя или старосты группы.
-
Керниган Б., Ритчи Д. К36 Язык программирования Си.\Пер. с англ., 3-е изд., испр. - СПб.: "Невский Диалект", 2001. - 352 с.: ил.
-
Касюк, С.Т. Курс программирования на языке Си: конспект лекций/С.Т. Касюк. — Челябинск: Издательский центр ЮУрГУ, 2010. — 175 с.
-
MSDN Library for Visual Studio 2005 (Vicrosoft Document Explorer – входить в состав дистрибутива VS. Нужно обязательно развернуть при установке VS VS или настроить доступ через Интернет.)
Дополнительная литература
-
Общее методическое пособие по курсу для выполнения ЛР и ДЗ (см. на сайте 1-й курс www.sergebolshakov.ru) – см. кнопку в конце каждого раздела сайта!!!
-
Другие методические материалы по дисциплине с сайта www.sergebolshakov.ru.
-
Конспекты лекций по дисциплине “Основы программирования”.
-
Подбельский В.В. Язык Си++: Учебное пособие. – М.: Финансы и статистика, 2003.
-
5. Подбельский В.В. Стандартный СИ++: Учебное пособие. – М.: Финансы и статистика, 2008.
-
Г. Шилдт “С++ Базовый курс”: Пер. с англ.- М., Издательский дом “Вильямс”, 2011 г. – 672с
-
Фридланд А.Я. Информатика и компьютерные технологии. Основные термины: толковый слов. : 3-е изд. Испр. и доп./ А.Я. Фридланд, Л.С. Хааамирова, И.А. Фридланд. – М.:ООО «Издательство Астрель»: ООО «Издательство АСТ». 2003 – 272с.
-
Г. Шилдт “С++ Руководство для начинающих” : Пер. с англ. - М., Издательский дом “Вильямс”, 2005 г. – 672с
-
Г. Шилдт “Полный справочник по С++”: Пер. с англ.- М., Издательский дом “Вильямс”, 2006 г. – 800с
-
Бьерн Страуструп "Язык программирования С++"- М., Бином, 2010 г.
57 Приложение: фрагменты программ для работы со списками
Эти примеры и пояснения к ним окончательно оформлю позднее!!!















