Главная Случайная страница Контакты | Мы поможем в написании вашей работы! | ||
|
Рассмотрим пример создания проекта, в котором используется список для хранения информации о телефонных номерах. Проект похож на задачу п.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 | Нарушение авторского права страницы | Мы поможем в написании вашей работы!