Разработка программы, реализующей алгоритм двусвязного списка

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

Рубрика Программирование, компьютеры и кибернетика
Вид курсовая работа
Язык русский
Дата добавления 21.01.2014
Размер файла 2,1 M

Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже

Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.

Размещено на http://www.allbest.ru/

3

Размещено на http://www.allbest.ru/

1

Курсовая работа

Разработка программы, реализующей алгоритм двусвязного списка

СОДЕРЖАНИЕ

1. Введение

2. Теоретический вопрос

2.1 Введение

2.2 История

2.3 Принцип кэширования

2.4 Кэширование внешних накопителей

3. Практический раздел

3.1 Постановка задачи

3.2 Описание программы

3.3 Блок-схема программы

3.4 Выводы

4. Список использованной литературы

5. Приложение 1

6. Приложение 2

1. Введение

Цель курсовой работы - закрепление и углубление знаний, полученных при изучении курса «Основы алгоритмизации и программирования» посредством разработки программного обеспечения для компьютера.

дисковый кэш алгоритм программа список

2. Теоритический вопрос Windows. Дисковый кэш

2.1 Введение

Снижение эффективности, замедление работы системы пользователь замечает в процессе выполнения команд.

Процессор сохраняет временные результаты своей работы в области, называемой регистрами. Так как регистры находятся внутри процессора, доступ к его содержимому осуществляется очень быстро. К сожалению, во время выполнения команд большая их часть (и данные) располагаются в памяти, и процессор должен ожидать завершения двух медленных операций системной шины:

1) Запрос команды из памяти;

2) Передача команды в процессор.

Чтобы уменьшить количество операций, разработчики поместили в процессор дорогостоящие, но быстродействующие устройства памяти (оно называется КЭШ памяти процессора).

Кэш (англ. cache, от фр. cacher -- «прятать») -- промежуточный буфер с быстрым доступом, содержащий информацию, которая может быть запрошена с наибольшей вероятностью. Доступ к данным в кэше идёт быстрее, чем выборка исходных данных из оперативной (ОЗУ) и быстрее внешней (жёсткий диск или твердотельный накопитель) памяти, за счёт чего уменьшается среднее время доступа и увеличивается общая производительность компьютерной системы.

2.2 История

Впервые слово «cache» в компьютерном контексте было использовано в 1967 году во время подготовки статьи для публикации в журнале «IBM Systems Journal». Статья касалась усовершенствования памяти в разрабатываемой модели 85 из серии IBM System/360. Редактор журнала Лайл Джонсон попросил придумать более описательный термин, нежели «высокоскоростной буфер», но из-за отсутствия идей сам предложил слово «cache». Статья была опубликована в начале 1968 года, авторы были премированы IBM, их работа получила распространение и впоследствии была улучшена, а слово «кэш» вскоре стало использоваться в компьютерной литературе как общепринятый термин.

2.3 Принцип кэширования

Диаграмма кэша памяти ЦПУ

Кэш -- это память с большей скоростью доступа, предназначенная для ускорения обращения к данным, содержащимся постоянно в памяти с меньшей скоростью доступа (далее «основная память»). Кэширование применяется ЦПУ, жёсткими дисками, браузерами, веб-серверами, службами DNS и WINS.

Кэш состоит из набора записей. Каждая запись ассоциирована с элементом данных или блоком данных (небольшой части данных), которая является копией элемента данных в основной памяти. Каждая запись имеет идентификатор, определяющий соответствие между элементами данных в кэше и их копиями в основной памяти. Когда клиент кэша (ЦПУ, веб-браузер, операционная система) обращается к данным, прежде всего, исследуется кэш. Если в кэше найдена запись с идентификатором, совпадающим с идентификатором затребованного элемента данных, то используются элементы данных в кэше. Такой случай называется попаданием кэша. Если в кэше не найдена запись, содержащая затребованный элемент данных, то он читается из основной памяти в кэш, и становится доступным для последующих обращений. Такой случай называется промахом кэша. Процент обращений к кэшу, когда в нём найден результат, называется уровнем попаданий или коэффициентом попаданий в кэш.

Например, веб-браузер проверяет локальный кэш на диске на наличие локальной копии веб-страницы, соответствующей запрошенному URL. В этом примере URL -- это идентификатор, а содержимое веб-страницы -- это элементы данных.

Если кэш ограничен в объёме, то при промахе может быть принято решение отбросить некоторую запись для освобождения пространства. Для выбора отбрасываемой записи используются разные алгоритмы вытеснения.

При модификации элементов данных в кэше выполняется их обновление в основной памяти. Задержка во времени между модификацией данных в кэше и обновлением основной памяти управляется так называемой политикой записи. В кэше с немедленной записью каждое изменение вызывает синхронное обновление данных в основной памяти.

В кэше с отложенной записью (или обратной записью) обновление происходит в случае вытеснения элемента данных, периодически или по запросу клиента. Для отслеживания модифицированных элементов данных записи кэша хранят признак модификации (изменённый или «грязный»). Промах в кэше с отложенной записью может потребовать два обращения к основной памяти: первое для записи заменяемых данных из кэша, второе для чтения необходимого элемента данных. В случае, если данные в основной памяти могут быть изменены независимо от кэша, то запись кэша может стать неактуальной. Протоколы взаимодействия между кэшами, которые сохраняют согласованность данных, называют протоколами когерентности кэша.

2.4 Кэширование внешних накопителей

Многие периферийные устройства хранения данных используют внутренний кэш для ускорения работы, в частности, жёсткие диски используют кэш-память от 1 до 64 Мбайт (модели с поддержкой NCQ/TCQ используют её для хранения и обработки запросов), устройства чтения CD/DVD/BD-дисков также кэшируют прочитанную информацию для ускорения повторного обращения.

Операционная система также использует часть оперативной памяти в качестве кэша дисковых операций (например, для внешних устройств, не обладающих собственной кэш-памятью, в том числе жёстких дисков, flash-памяти и гибких дисков). Часто для кэширования жёстких дисков предоставляется вся свободная (не выделенная процессам) оперативная память. Применение кэширования внешних накопителей обусловлено следующими факторами:

1. скорость доступа процессора к оперативной памяти во много раз больше, чем к памяти внешних накопителей;

2. производительность дисковых устройств хранения (жесткие, гибкие, оптические диски) максимальна при чтении-записи нескольких последовательно расположенных блоков и значительно уменьшается при одиночных запросах в разные места диска, что связано с инерцией механического привода головки.

3. крайне неравномерная частота обращения к различным блокам памяти внешних накопителей:

1. использование части блоков несколькими процессами одновременно, по чтению и записи (например, в базах данных)

2. очень частое чтение части блоков (индексные файлы, каталоги в файловой системе)

3. очень частая запись части блоков (файлы логов, журналов, баз данных; метаданные файловой системы).

При чтении кэш позволяет прочитать блок один раз, затем хранить одну копию блока в оперативной памяти для всех процессов и выдавать содержимое блока «мгновенно» (по сравнению с запросом к диску). Существует техника «предзапроса» -- в фоновом режиме операционной системой считываются в кэш также несколько следующих блоков (после нужного).

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

Кэширование внешних устройств хранения значительно увеличивает производительность системы за счёт оптимизации использование ввода-вывода. Преимуществом технологии является прозрачная (незаметная для программ) автоматическая оптимизация использования памяти-дисков при неизменности логики приложений, работающих с файлами.

Недостатком кэширования записи является промежуток времени между запросом на запись от программы и фактической записью блока на диск, а также изменение порядка выполнения записей, что может приводить к потерям информации или несогласованности структур при сбое питания или зависании системы. Данная проблема сглаживается принудительной периодической синхронизацией (записью изменённых строк кэша).

3. Практический раздел

3.1 Постановка задачи

Разработать программу, реализующую алгоритм двусвязного списка (20 элементов). В качестве элемента списка выбрать структуру:

Факультет

I. Код (ключ)

II. Название

III. Фамилия И.О. декана

IV. К-во кафедр

V. К-во преподавателей

Предусмотреть заполнение списка из файла (подготовить файл на 20 элементов).

Предусмотреть многоуровневое меню:

1) Заполнение списка с начала

a) с консоли (циклически)

b) из файла

2) Вставка элемента (с консоли) в список

a) в конец списка

b) вслед за указанным элементом (по ключу)

3) Вставка элементов (из файла) в список

a) в конец списка

b) вслед за указанным элементом (по ключу)

4) Удаление элемента

a) из конца списка

b) по ключу

5) Очистка списка (с выводом удаляемых элементов)

a) безвозвратно

b) с сохранением в файл

6) Вывод элементов, содержащихся в списке

a) на экран

b) в файл

7) Вывод количества элементов в списке

8) Выход

3.2 Описание программы

Программа реализованная в данной курсовой работе предназначена для работы с двусвязным списком. Меню программы выглядит так:

При выборе первого пункта меню вызывается функция enter, пользователю предоставляется выбор: заполнить список с консоли или считать из файла желаемое количество элементов.

При выборе второго пункта меню вызывается функция insert1, пользователь вводит элемент с консоли и ему предоставляется выбор: добавить его в конец списка или по ключу.

При выборе третьего пункта меню вызывается функция insert2, элемент считывается их файла и пользователю предоставляется выбор: добавить в конец списка или по ключу.

При выборе четвертого пункта меню вызывается функция delet,

пользователю предоставляется выбор: удалить элемент по ключу или из конца списка.

При выборе пятого пункта меню вызывается функция clean, пользователю предоставляется выбор: отчистить список безвозвратно или с сохранением в файл.

При выборе шестого пункта меню вызывается функция print, пользователю предоставляется выбор: вывести список на экран или сохранить его в файл.

При выборе седьмого пункта меню вызывается функция number, на экран выводится количество элементов в списке.

При выборе восьмого пункта меню происходит завершение программы.

3.3 Блок-схема программы

3.4 Выводы

Закрепил и углубил знаний, полученные при изучении курса «Основы алгоритмизации и программирования» посредством разработки программного обеспечения для компьютера. Разработал программу, реализующую алгоритм двусвязного списка.

4. Список использованной литературы

1. Шилдт Герберт. Справочник программиста С,С++.

2. Онлайн справочник: http://autodor-book.com/publ/complex_hardware/lectures/tema_11_tverdotelnye_nakopiteli/2-1-0-52

3. Системное программирование: http://sistemprog.elitno.net/lec/modul_3/lec_09/lec_31-3.html

4. Википедия: http://ru.wikipedia.org/wiki/%D0%9A%D1%8D%D1%88

5. Введение в язык C++. Бьерн Страуструп, 1995.

5. Приложение 1

#include <iostream>

#include <stdio.h>

using namespace std;

struct faculty //структура

{

int code;

char name[45];

char fio[45];

int numkaf;

int teacher;

struct faculty *pred;

struct faculty *next;

}*phead=NULL,*last,info;

int countelem=0;

char ShowMenu () //меню

{

cout<<endl<<

"----------------------------------------"<<endl<<

" MENU "<<endl<<

"----------------------------------------"<<endl<<

"<1> - Заполнение списка"<<endl<<

"<2> - Вставка элемента в список с консоли"<<endl<<

"<3> - Вставка элемента в список из файла"<<endl<<

"<4> - Удаление элемента"<<endl<<

"<5> - Очистка списка с выводом их на экран"<<endl<<

"<6> - Вывод элементов"<<endl<<

"<7> - Вывод количества элементов в списке"<<endl<<

"<8> - Выход"<<endl;

cin.sync();

return getchar();

};

void enter() //функция для ввода списка

{

while(true) //цикл для выбора операции ввода

{

try{

cout<<"Сделайте выбор"<<endl<<

"<1> - заполнение с консоли"<<endl<<

"<2> - заполнение с файла"<<endl<<

"<3> - конец операции ввода"<<endl;

int p;

cin>>p;

if(p<1 || p>3) throw (char*)"Ошибка ввода, попробуйте заново";

if(p==1) //ввод с кансоли

{

try

{

m:if(countelem==20) throw(char*)"Список полный, выберите другую операцию";

int n=0;

cout<<"Введите желаемое количество элементов в списке: ";

cin>>n;

cout<<endl;

for(int i=0;i<n;++i)

{

if(countelem==20) goto m;

faculty *pf = new faculty; // временная переменная

cout<<i+1<<") "<<"Введите код факультета: ";

cin>>pf->code;

cout<<"Введите название факультета: ";

cin>>pf->name;

cout<<"Введите ФИО декана: ";

cin>>pf->fio;

cout<<"Введите количество кафедр: ";

cin>>pf->numkaf;

cout<<"Введите преподователей: ";

cin>>pf->teacher;

cout<<endl;

//создание двусвязного списка

if(phead==0) // вставка первого элемента

{

pf->next=NULL;

pf->pred=NULL;

phead=pf; //голова указывает на созданный элемент

last=pf;

}

else // если не первый

{

last->next = pf;

pf->next = NULL;

pf->pred = last;

last = pf;

}

countelem++;

}

}

catch(char *str) //сообщение и конец операции если список полон

{

cout<<str<<endl<<endl;

break;

}

}

else if(p==2) //ввод с файла

{

try

{

k:if(countelem==20) throw(char*)"Список полный, выберите другую операцию";

faculty *temp=phead;

int n=0;

cout<<"Введите желаемое количество элементов в списке: ";

cin>>n;

cout<<endl;

FILE *f;

f = fopen("Список_структур.dat","r");

for(int i=0;i<n;++i)

{

if(countelem==20) goto k;

int x=0;

faculty *pf = new faculty;

fread(pf,sizeof(info),1,f);

while(temp!=0) // проверка совпадения

{

if(temp->code==pf->code)

{

x++;

break;

}

temp=temp->next;

}

if(x==0) // нет совпадения

{

//создание двусвязного списка

if(phead==0) // вставка первого элемента

{

pf->next=NULL;

pf->pred=NULL;

phead=pf; //голова указывает на созданный элемент

last=pf; //хвост

}

else //если не первый

{

last->next = pf;

pf->next = NULL;

pf->pred = last;

last = pf;

}

countelem++;

}

if(x==1) n++; //есть совпадение

}

fclose(f);

}

catch(char *str) //сообщение и конец операции если список полон

{

cout<<str<<endl<<endl;

break;

}

}

else if(p==3) return; // конец операции

}

catch(char*str) // сообщение и рестарт операции если не правильный выбор

{

cout<<str<<endl<<endl;

}

}

}

void insert1() //вставка элемента с консоли в список

{

while(true) //цикл для выбора операции вставки элемента

{

try

{

cout<<"Сделайте выбор"<<endl<<

"<1> - вставить в конец списка"<<endl<<

"<2> - вставить по ключу"<<endl<<

"<3> - конец операции"<<endl;

int p;

cin>>p;

if(p<1 || p>3) throw (char*)"Ошибка ввода, попробуйте заново";

if(p==1) //вставка элемента в конец списка

{

try

{

if(countelem==20) throw(char*)"Список полный, выберите другую операцию";

faculty *pf = new faculty;

//создание двусвязного списка

cout<<"Введите код факультета: ";

cin>>pf->code;

cout<<"Введите название факультета: ";

cin>>pf->name;

cout<<"Введите ФИО декана: ";

cin>>pf->fio;

cout<<"Введите количество кафедр: ";

cin>>pf->numkaf;

cout<<"Введите преподователей: ";

cin>>pf->teacher;

cout<<endl;

if(phead==0) // вставка если первый элемент

{

pf->next=NULL;

pf->pred=NULL;

phead=pf; //голова указывает на созданный элемент

last=pf; //хвост

}

else //если не первый

{

last->next = pf;

pf->next = NULL;

pf->pred = last;

last = pf;

}

countelem++;

}

catch(char *str) //сообщение и конец операции если список полон

{

cout<<str<<endl<<endl;

break;

}

}

else if(p==2) //вставка элемента по ключу

{

try

{

if(countelem==20) throw(char*)"Список полный, выберите другую операцию";

faculty *temp=phead; //создание временного элемента

faculty *pf = new faculty;

cout<<"Введите код факультета: ";

cin>>pf->code;

cout<<"Введите название факультета: ";

cin>>pf->name;

cout<<"Введите ФИО декана: ";

cin>>pf->fio;

cout<<"Введите количество кафедр: ";

cin>>pf->numkaf;

cout<<"Введите преподователей: ";

cin>>pf->teacher;

cout<<endl;

if(phead==NULL) // если первый

{

cout<<"Список пуст, элемент будет первым"<<endl<<endl;

pf->next=NULL;

pf->pred=NULL;

phead=pf; //голова указывает на созданный элемент

last=pf; //хвост

countelem++;

}

else //если не первый

{

try

{

cout<<"Введите ключ элемента, после которого вставить: ";

int l;

cin>>l;

while(temp!=0) //проверка позиции элемента

{

if(temp->code==l) break;

temp=temp->next;

}

if(temp==NULL) throw(char*)"Элемента с таким ключом нет, попробуйте другой";

else if(temp->code==last->code) //если элемент последний

{

pf->next=0;

pf->pred=last;

last->next=pf;

last=pf;

}

else // если элемент в любой позиции

{

pf->next=temp->next;

temp->next->pred=pf;

temp->next=pf;

pf->pred=temp;

}

countelem++;

}

catch(char*str) // сообщение и рестарт операции если ошибка ввода

{

cout<<endl;

cout<<str<<endl<<endl;

}

}

}

catch(char *str) //сообщение и конец операции если список полон

{

cout<<str<<endl<<endl;

break;

}

}

else if(p==3) return; //конец операции

}

catch(char*str) // сообщение и рестарт операции если не правильный выбор

{

cout<<str<<endl<<endl;

}

}

}

void insert2() //вставка элемента из файла в список

{

faculty *temp=phead;

while(true) //цикл для выбора операции вставки элемента

{

try

{

cout<<"Сделайте выбор"<<endl<<

"<1> - вставить в конец списка"<<endl<<

"<2> - вставить по ключу"<<endl<<

"<3> - конец операции"<<endl;

int p;

cin>>p;

if(p<1 || p>3) throw (char*)"Ошибка ввода, попробуйте заново";

if(p==1) //вставка элемента в конец списка

{

try

{

if(countelem==20) throw(char*)"Список полный, выберите другую операцию";

FILE *f;

f = fopen("Список_структур.dat","r");

z:faculty *pf = new faculty;

fread(pf,sizeof(info),1,f);

//создание двусвязного списка

while(temp!=NULL) // проверка совпадения

{

if(temp->code==pf->code)

{

temp=phead;

goto z;

}

temp=temp->next;

}

temp=phead;

if(temp==0) // вставка первого элемента

{

pf->next=NULL;

pf->pred=NULL;

phead=pf; //голова указывает на созданный элемент

last=pf; //хвост

temp=phead;

}

else // если не первый

{

last->next = pf;

pf->next = NULL;

pf->pred = last;

last = pf;

}

countelem++;

}

catch(char*str) // сообщение и конец операции если список полон

{

cout<<str<<endl<<endl;

break;

}

}

else if(p==2) //вставка элемента по ключу

{

try

{

if(countelem==20) throw(char*)"Список полный, выберите другую операцию";

FILE *f;

f = fopen("Список_структур.dat","r");

x:faculty *pf = new faculty;

fread(pf,sizeof(info),1,f);

while(temp!=0) // проверка совпадения

{

if(temp->code==pf->code)

{

temp=phead;

goto x;

}

temp=temp->next;

}

temp=phead;

if(temp==NULL) // вставка первого элемента

{

cout<<"Список пуст, элемент будет первым"<<endl<<endl;

pf->next=NULL;

pf->pred=NULL;

phead=pf; //голова указывает на созданный элемент

last=pf; //хвост

countelem++;

temp=phead;

}

else //если не первый

{

try

{

cout<<"Введите ключ элемента, после которого вставить: ";

int l;

cin>>l;

while(temp!=0)

{

if(temp->code==l) break;

temp=temp->next;

}

if(temp==NULL)

{

temp=phead;

throw(char*)"Элемента с таким ключом нет, попробуйте другой";

}

else if(temp->code==last->code) //если элемент последний

{

pf->next=0;

pf->pred=last;

last->next=pf;

last=pf;

countelem++;

}

else // в любой позиции

{

pf->next = temp->next;

temp->next->pred=pf;

temp->next = pf;

pf->pred = temp;

countelem++;

}

}

catch(char*str) // сообщение и рестарт операции если ошибка ввода

{

cout<<endl<<str<<endl<<endl;

}

}

}

catch(char*str) // сообщение и конец операции если список полон

{

cout<<str<<endl<<endl;

break;

}

}

else if(p==3) return; //конец операции

}

catch(char*str) // сообщение и рестарт операции если не правильный выбор

{

cout<<str<<endl<<endl;

}

}

}

void delet() //функция для выбора операции удаления элемента

{

faculty *temp=last; //создается временный элемент

faculty *ptemp=phead; //создается временный элемент

o:if(phead==NULL)

{

cout<<"Список пуст,сначала заполните его"<<endl;

return ;

}

while(true) //цикл для выбора операции удаления элемента

{

try

{

cout<<"Сделайте выбор"<<endl<<

"<1> - удалить из конца списка"<<endl<<

"<2> - удалить по ключу"<<endl<<

"<3> - конец операции"<<endl;

int p;

cin>>p;

if(p<1 || p>3) throw (char*)"Ошибка ввода, попробуйте заново";

if(p==1) //удаление из конца

{

if(phead==NULL) goto o;

if(ptemp->code==temp->code) // если единственный элемент в списке

{

phead=NULL;

last=NULL;

delete ptemp;

ptemp=NULL;

countelem--;

}

else // если не единственный

{

last=temp->pred;

last->next=NULL;

delete temp;

countelem--;

}

temp=last;

ptemp=phead;

}

else if(p==2) //удаление по ключу

{

try

{

cout<<"Введите ключ элемента: ";

int n;

cin>>n;

while(ptemp!=0) //поиск ключа

{

if(ptemp->code==n) break;

ptemp=ptemp->next;

}

if(ptemp==NULL) throw(char*)"Элемента с таким ключом нет";

if(ptemp->code==phead->code && ptemp->code==last->code) // если элемент единственный

{

phead=NULL;

last=NULL;

delete ptemp;

ptemp=NULL;

countelem--;

}

else if(ptemp->code==phead->code) // если элемент первый

{

phead=ptemp->next;

phead->pred=NULL;

delete ptemp;

ptemp=NULL;

countelem--;

}

else if(ptemp->code==last->code) //если элемент последний

{

last=ptemp->pred;

last->next=NULL;

delete ptemp;

ptemp=NULL;

countelem--;

}

else // если в любой позиции

{

ptemp->pred->next=ptemp->next;

ptemp->next->pred=ptemp->pred;

delete ptemp;

ptemp=NULL;

countelem--;

}

temp=last;

ptemp=phead;

}

catch(char*str) // сообщение и рестарт если ошибка ввода

{

cout<<endl<<str<<endl<<endl;

}

}

else if(p==3) return; //конец операции

}

catch(char*str) // сообщение и рестарт операции если не правильный выбор

{

cout<<str<<endl<<endl;

}

}

}

void clean() //функция для отчистки списка

{

faculty *temp=last; //создается временный элемент

faculty *ptemp=phead; //создается временный элемент

if(phead==NULL)

{

cout<<"Список пуст,сначала заполните его"<<endl;

return ;

}

while(true) //цикл для выбора операции отчистки списка

{

try

{

cout<<"Сделайте выбор"<<endl<<

"<1> - отчистить безвозвратно"<<endl<<

"<2> - отчистить с сохранением в файл"<<endl<<

"<3> - конец операции"<<endl;

int p;

cin>>p;

if(p<1 || p>3) throw (char*)"Ошибка ввода, попробуйте заново";

if(p==1) //удаление списка безвозвратно с выводом на экран

{

int i=1;

while (ptemp!=0) // вывод на экран списка

{

cout<<i<<") Код факультета: "<<ptemp->code<<endl;

cout<<"Название факультета: "<<ptemp->name<<endl;

cout<<"ФИО декана: "<<ptemp->fio<<endl;

cout<<"К-во кафедр: "<<ptemp->numkaf<<endl;

cout<<"К-во преподавателей: "<<ptemp->teacher<<endl<<endl;

i++;

ptemp=ptemp->next;

}

while(temp!=0) //удаление списка

{

delete temp;

temp=temp->pred;

}

countelem=0;

delete phead;

phead=NULL;

}

else if(p==2) //удаление списка с сохранением в файл

{

FILE*f;

f=fopen("Список_структур_2.dat","w");

while (ptemp!=0) //запись списка в файл

{

fwrite(ptemp,sizeof(info),1,f);

ptemp=ptemp->next;

}

ptemp=phead;

fclose(f);

while(temp!=0) //удаление списка

{

delete temp;

temp=temp->pred;

}

countelem=0;

delete phead;

phead=NULL;

}

else if(p==3) return; //конец операции

}

catch(char*str) // сообщение и рестарт операции если не правильный выбор

{

cout<<str<<endl<<endl;

}

}

}

void print() //просмотр элементов в списке

{

faculty *temp=phead; //создается временный элемент

if(phead==NULL)

{

cout<<"Список пуст"<<endl;

return ;

}

while(true) //цикл для выбора операции вывода

{

try

{

cout<<"Сделайте выбор"<<endl<<

"<1> - вывод списка на экран"<<endl<<

"<2> - вывод списка в файл"<<endl<<

"<3> - конец операции ввода"<<endl;

int p;

cin>>p;

if(p<1 || p>3) throw (char*)"Ошибка ввода, попробуйте заново";

if(p==1) //вывод на экран

{

int i=1;

while (temp!=0) //вывод на экран

{

cout<<i<<") Код факультета: "<<temp->code<<endl;

cout<<"Название факультета: "<<temp->name<<endl;

cout<<"ФИО декана: "<<temp->fio<<endl;

cout<<"К-во кафедр: "<<temp->numkaf<<endl;

cout<<"К-во преподавателей: "<<temp->teacher<<endl<<endl;

i++;

temp=temp->next;

}

temp=phead;

}

else if(p==2) //вывод в файл

{

FILE*f;

f=fopen("Список_структур_2.dat","w");

while (temp!=0) //сохранение в файл

{

fwrite(temp,sizeof(info),1,f);

temp=temp->next;

}

temp=phead;

fclose(f);

}

else if(p==3) return; //конец операции

}

catch(char*str) // сообщение и рестарт операции если не правильный выбор

{

cout<<str<<endl<<endl;

}

}

}

void number() //Функция определяющая количество в списке

{

if(phead==NULL)

{

cout<<"Список пуст"<<endl;

return ;

}

cout<<"К-во элементов в списке: "<<countelem<<endl;

return;

}

int main()

{

setlocale(LC_ALL, ""); //вывод русского текста

char p;

while (true)

{

p=ShowMenu(); //вызываем меню

switch (p)

{

case '1': enter();break;

case '2': insert1();break;

case '3': insert2();break;

case '4': delet();break;

case '5': clean();break;

case '6': print();break;

case '7': number();break;

case '8': return 0;

}

}

}

6. Приложение 2

Размещено на Allbest.ru


Подобные документы

  • Написание программы для работы со списком документов, разработка функционала. Требования к аппаратному и программному обеспечению. Описание интерфейса пользователя. Структура программы и описание данных. Процедура тестирования и его результаты.

    курсовая работа [1,5 M], добавлен 26.08.2012

  • Осуществление работы разрабатываемой программы на основе алгоритма, использующего Z-буфер. Аналитическое описание программной реализации. Алгоритмы основных функций программы. Содержание руководства пользователя. Файлы программы, пункты главного меню.

    курсовая работа [1,7 M], добавлен 15.04.2015

  • Разработка алгоритма решения задачи численного интегрирования методом трапеции. Словесное описание и блок-схема разработанного алгоритма программы. Описание интерфейса, главного окна и основных форм программы. Проверка работоспособности программы.

    курсовая работа [1,4 M], добавлен 16.03.2012

  • Разработка алгоритма поставленной задачи по обработке числовой информации в среде Turbo Pascal 7.0 с базовым языком программирования Pascal, отладка программы, реализующей разработанный алгоритм. Описание структуры программы, ее вспомогательных процедур.

    курсовая работа [668,0 K], добавлен 25.02.2010

  • Описание информационной структуры, используемой для организации списка. Контрольные примеры обработки и сортировки. Краткое описание алгоритма. Локальные переменные функции. Иерархическая структура программы, а также код программы на языке С/С++.

    курсовая работа [91,4 K], добавлен 16.07.2013

  • Процесс моделирования работы САПР: описание моделирующей системы, разработка структурной схемы и Q-схемы, построение временной диаграммы, построение укрупненного моделирующего алгоритма. Описание математической модели, машинной программы решения задачи.

    курсовая работа [291,6 K], добавлен 03.07.2011

  • Разработка и тестирование программы на языке Pascal для поиска, вывода на экран и сохранения в файл списка книг с фамилиями авторов в алфавитном порядке, изданных после 2012 года. Разработка алгоритма и его описание. Инструкции по эксплуатации приложения.

    курсовая работа [903,0 K], добавлен 13.06.2013

  • Анализ и описание алгоритма. Основные характеристики выбранного компьютера, программных сред (операционная система и среда программирования). Описание компонентов и интерфейса программы, а также модулей, процедур и функций. Вызов и загрузка программы.

    курсовая работа [1,3 M], добавлен 26.04.2015

  • Описание использованных структур данных и разработка программы, обеспечивающей сжатие данных по алгоритму LZ77 с пошаговой визуализацией. Описание процедур, функций, структуры приложения и интерфейса пользователя. Тест и анализ работы алгоритма LZ77.

    курсовая работа [537,9 K], добавлен 28.06.2011

  • Разработка блок-схемы и программы обработки одномерного массива с доступом к элементам с помощью индексов и с помощью указателей. Словесное описание алгоритма и пользовательского интерфейса, листинг программы обработки матрицы и результат её выполнения.

    курсовая работа [391,1 K], добавлен 30.09.2013

Работы в архивах красиво оформлены согласно требованиям ВУЗов и содержат рисунки, диаграммы, формулы и т.д.
PPT, PPTX и PDF-файлы представлены только в архивах.
Рекомендуем скачать работу.