Студопедия.Орг Главная | Случайная страница | Контакты | Мы поможем в написании вашей работы!  
 

Лабораторная работа № 9. Разработка проекта с использованием списков



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

Задание Краткие теоретические сведения
1. Создать проект, ввести операторы главной функции OAP_Listи изучить структуру функции. Добавить операторы создания списков и операций над ними. Первая часть -главная функция (пусть она имеет имя OAP_List) - организует ввод и редактирование информации, демонстрирует способы обращения к функциям работы со списком, описанным во второй части (List.cpp). Для записи этой функции используется обычная процедура создания проекта. Надо после открытия MS Visual Studio выполнить Создать проект/ Visual С++ / Win32 / Консольное приложение Win32. В появившемся окне в поле Имя следует ввести имя проекта (OAP_List), указать место размещения проекта. В окне Мастер приложений Win32нажать кнопку Далее, в появившемся окне нажать Готово. В глобальной области появится заготовка: #include "stdafx.h" int _tmain(int argc, _TCHAR* argv[]) { return 0; } Можно записать текст программы. В этой программе создаются списки L1, L2, L5. Опробуются операции вставки элементов, удаления, поиска.   #include "stdafx.h" #include "List.h" #include <iostream> using namespace std; struct Person {char name[20]; int age; Person *next; }; Object L2 = Create(); //создать список L2 void f (void* b) //функция используется при выводе { Person *a=(Person*)b; cout<<a->name<<" "<<a->age<<endl; } int _tmain(int argc, _TCHAR* argv[]) { setlocale(LC_ALL, "Russian"); Person a1 = {"Петров", 20}; Person a2 = {"Сидоров", 25}; Person a3 = {"Гончаров", 47}; Person a4 = {"Обломов", 24}; Person a5 = {"Бунич", 55}; Person* aa; bool rc; Object L1 = Create(); //создать список L1 rc = L1.Insert(&a1); //= true rc = L1.Insert(&a2); //= true rc = L1.Insert(&a3); //= true rc = L1.Insert(&a4); // = true L1.Insert(&a5); L1.Insert(&a5); L1.Insert(&a4); L1.PrintList(f); cout<<"----------------------------"<<endl; Object L5 = Create(); //создать список L5 rc = L5.Insert(&a1); rc = L5.Insert(&a2); rc = L5.Insert(&a3); rc = L5.Insert(&a4);// = true L1.Insert(&a5); L1.Insert(&a5); L1.Insert(&a5); L1.Insert(&a5); L1.Insert(&a5); Element* e = L1.GetLast(); while (e!= NULL)// 1...4 { aa = (Person*)e->Data; e = e->GetPrev(); }; e = L1.Search(&a3); aa = (Person*)e->Data; cout<<"Найден элемент= "<<aa->name<<endl; if (e!= NULL) aa = (Person*)e->Data; e = L1.Search(&a5); if (e!= NULL) aa = (Person*)e->Data; rc = L1.Delete(&a5);// = false rc = L1.Delete(&a3);// = true rc = L2.Insert(&a1); rc = L2.Insert(&a2); rc = L2.Insert(&a3); L2.PrintList(f); Element *a=L2.GetFirst(); L2.PrintList(f); return 0; }
2. Добавить в проект файл List.cpp. Изучить функции программы. Написать комментарии к операторам. Для добавления программы List.cpp, содержащей функции для манипуляции со списком (удаление элементов, вставка, поиск и т.п.) надо в контекстном меню пункта Файлы исходного кода окна Обозревателя решений выполнить Добавить / Создать элемент. В появившемся окне выбрать Код / Файл C++, набрать имя (List.cpp) и ввести текст программы. #include "stdafx.h" #include "List.h" bool Object::Insert(void* data) //вставка в начало { bool rc=0; if (Head == NULL) {Head = new Element(NULL,data,Head); rc=true;} else { Head = (Head->Prev = new Element(NULL, data,Head)); rc=true;} return rc; } Element* Object::Search (void* data) //найти заданный {Element* rc = Head; while((rc!= NULL) && (rc->Data!= data)) rc = rc->Next; return rc; } void Object::PrintList(void(*f)(void*))// вывод { Element* e = Head; while (e!= NULL) { f(e->Data); e = e->GetNext(); }; } void Object::PrintList(void(*f)(void*), Element *e) { f(e->Data); } bool Object::Delete(Element* e) //удалить по ссылке { bool rc=0; if (rc = (e!= NULL)) {if (e->Next!= NULL) e->Next->Prev = e->Prev; if (e->Prev!= NULL) e->Prev->Next = e->Next; else Head = e->Next; delete e; } return rc; } bool Object::Delete(void* data) //удалить по значению { return Delete(Search(data)); }; Element* Object::GetLast() { Element* e = Head, *rc = e; while (e!= NULL) { rc = e; e = e->GetNext(); }; return rc; } Object Create() {return *(new Object()); }    
3. Добавить в проект заголовочный файл List.h. Выполнить программы проекта. Проанализировать результат. Третья часть – это файл List.h, который содержит описание структуры списка, конструктор списка и прототипы программ обработки списка. Этот файл добавляется в заголовочную часть. Надо в контекстном меню пункта Заголовочные файлы окна Обозревателя решений выполнить Добавить / Создать элемент. В появившемся окне выбрать Код / Заголовочный файл, набрать имя (List.h) и ввести текст программы: #pragma once struct Element// элемент списка { Element* Prev;// указатель на предыдущий элемент Element* Next;// указатель на следующий элемент void* Data;// данные Element(Element* prev, void* data, Element* next)// конструктор { Prev = prev; Data = data; Next = next; } Element* GetNext(){return Next;};// получить следующий Element* GetPrev(){return Prev;}; //получить предыдущий }; struct Object //блок управления списком {Element* Head; //указатель на начало списка Object() { Head = NULL; }; Element* GetFirst(){return Head;}; //получить первый элемент списка Element* GetLast(); //получить последний элемент списка Element* Search (void* data); //найти первый элемент по данным bool Insert(void* data); //добавить элемент в начало bool InsertEnd(void* data); //добавить в конец bool Delete(Element* e); //удалить по адресу элемента bool Delete(void* data); //удалить первый по данным bool DeleteList(); //очистить список void Object::PrintList(void(*f)(void*)); void Object::PrintList(void(*f)(void*),Element*); int Object::CountList(); bool Object::DeleteDouble(); }; Object Create();// создать список Здесь директива препроцессора #pragma once применяется для защиты от двойного подключения заголовочных файлов.

4. Дополнить проект, разработав функцию DeleteList (удаление списка), CountList (подсчет числа элементов списка), а также функцию в соответствии со своим вариантом из таблицы, представленной ниже. Для хранения элементов списка использовать структуру Element. Для управления списком использовать блок Object.

В содержимом списка отразить информацию в соответствии со своим вариантом из лабораторной работы № 1. Создать интерфейс в виде меню.

№ варианта Задание для выполнения
1, 16 DeleteDouble() – функция удаления повторяющихся (имеющих одинаковые поля или одно из полей) элементов
2, 15 DeleteKFirst(int k) – функция удаления К первых элементов списка.
3, 14 DeleteEveryМ (int m) – функция удаления каждого М-ого элемента списка.
4, 13 DeleteKLast(int k) – функция удаления К последних элементов списка.
5, 12 InsertEnd(void* data) – добавление нового элемента в конец списка
6, 11 FindMin() – функция поиска минимального элемента списка по одному из выбранных полей.
7, 10 FindMax() – функция поиска максимального элемента списка по одному из выбранных полей.
8, 9 OneByOne (Object &to, Object &from1, Object &from2) - функцию, которая формирует список to, включив в него поочередно элементы из списков from1 и from2. (вне Object)

В начало практикума





Дата публикования: 2015-02-18; Прочитано: 760 | Нарушение авторского права страницы | Мы поможем в написании вашей работы!



studopedia.org - Студопедия.Орг - 2014-2024 год. Студопедия не является автором материалов, которые размещены. Но предоставляет возможность бесплатного использования (0.007 с)...