Обработка динамических структур данных
Представление (построение, создание) списка данных в виде линейного однонаправленного списка. Формирование массива данных. Вывод данных на экран. Алгоритм удаления, перемещения данных. Сортировка методом вставки. Алгоритм загрузки данных из файла.
Рубрика | Программирование, компьютеры и кибернетика |
Вид | курсовая работа |
Язык | русский |
Дата добавления | 16.05.2015 |
Размер файла | 2,1 M |
Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже
Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.
Размещено на http://www.allbest.ru/
Размещено на http://www.allbest.ru/
МИНИСТЕРСТВО ОБРАЗОВАНИЯ И НАУКИ РОССИЙСКОЙ ФЕДЕРАЦИИ
ФЕДЕРАЛЬНОЕ ГОСУДАРСТВЕННОЕ БЮДЖЕТНОЕ ОБРАЗОВАТЕЛЬНОЕ
УЧРЕЖДЕНИЕ ВЫСШЕГО ПРОФЕССИОНАЛЬНОГО ОБРАЗОВАНИЯ
«МОСКОВСКИЙ АВИАЦИОННЫЙ ИНСТИТУТ
(национальный исследовательский университет)» (МАИ)
Курсовая работа
на тему: «Обработка динамических структур данных»
по дисциплине: Программирование на ЯВУ
Студента гр. ДА 2-49
Буйная М.А/
Байконур 2014 г.
Аннотация
Данная курсовая работа посвящена разработке и обработке массивов структур. Программы курсовой работы дают возможность обработать данные одномерных списков. В курсовой работе имеется описание алгоритмов и листингов программ.
Алгоритм решения задач выполнен в программе Microsoft Visual в среде языка Си++.
1. Постановка задачи
Разработать алгоритм и составить программу обработки списка данных «Гостиница», выполнив следующие этапы:
1. Представление (построение, создание) списка данных в виде линейного однонаправленного списка с элементами сложного типа
2. Выполнить удаление из исходного списка сведений о гостиницах, в которых нет свободных номеров
3. Выполнить перемещение в начало исходного списка сведений о пятизвёздочных гостиницах
4. Выполнить сортировку исходного списка данных по полю «общее количество мест» методом вставки
5. Создать пользовательский интерфейс, с помощью которого будет проходить работа с программой, используя средства текстового и графического режимов работы. Интерфейс должен содержать:
- все основные пункты работы (создание, удаление, перемещение, сортировка, выход, просмотр результатов работы на каждом этапе);
В процессе обработки указанного списка необходимо сформировать текстовый файл отчета, содержащий как исходный список данных, так и списки данных, полученные в результате их обработки на каждом этапе.
Требования к программе:
- Программа должна обеспечивать ввод исходных данных с клавиатуры(не менее 20 записей);
- Программа должна содержать пояснения основных идентификаторов и блоков;
- Реализацию алгоритма необходимо выполнить на языке программирования С/С++.
2. Метод решения
Для записи данных о туризме необходимо воспользоваться структурами. Структура позволяет объединить в одном объекте разнотипные данные с целью их совместной обработки.
Ключевым словом для объявления структуры является слово «struct».
Пример 1:
struct a { int x;
float y;
char mas[15]; }
Это так называемый структурный шаблон. Общий вид описания шаблона:
struct тег(имя структуры) { тип1 имя поля1;
тип2 имя поля2;
тип3 имя поля3;
………………..
тип n имя поля n; };
Структурные переменные удобно изображать в виде дерева или графа.
Пример 2:
z
x y mas
mas0 mas1 ……. Mas14
Рис. 1 - граф структурных переменных примера 1
Изобразим в виде дерева поля записи о гостиницах:
Гостиница
Название Класс Всего мест Свободно Стоимость номера
Рисунок 2 - граф полей записи о гостиницах
2.1 Формирование данных
Запишем структурный шаблон, который будет содержать названия гостиниц, класс гостиницы, общее количество мест, количество свободных номеров, минимальная стоимость номера в сутки:
typedef struct data_{char nazvanie[255];//название гостиницы
int class_;//класс гостиницы //1-5
int kolichestvo_o;//количество мест общее
int kolichestvo_s;//количество мест свободное
int cena;//стоимость номера в сутки
};
Следовательно, будет формироваться массив разнотипных данных
data_
0 nazvanie class_ kolichstvo_o kolichestvo_s cena
data_
n
Рисунок 3 - Массив разнотипных данных полей записи структуры «Гостиница»
2.2 Линейный поиск
Линейный поиск эффективен в массивах, с небольшим количеством элементов, причём элементы в таких массивах никак не отсортированы и не упорядочены. Алгоритм линейного поиска в массивах последовательно проверяет все элементы массива и сравнивает их с ключевым значением. Чтобы убедиться, в отсутствии искомого значения необходимо проверить все элементы массива. У линейного поиска есть один недостаток: если образец не присутствует в массиве, то без принятия предохранительных мер поиск может выйти за границы массива.
Линейный поиск необходим в удалении из исходного списка о гостиницах, в которых нет свободных номеров. Следовательно, решение делится на 3 пункта:
1) Ввести количество гостиниц;
2) Поиск гостиниц, в которых нет свободных номеров;
3) Удалить данные.
void sspisok::udalenie()
{spisok *p;//
int n=0;
if((BegQ!=NULL)&&(EndQ!=NULL))
{
p=BegQ;
while(p!=NULL//поиск номеров
{n++;
if(p->data.kolichestvo_s==0) //если нет свободных номеров
{sspisok::delete_data(n); //удаление гостиницы
n--;//возврат индекса к предыдущему элементу
}
p=p->next;
};
}
}
if((BegQ==NULL)&&(EndQ==NULL))//если список пустой
{cout<<"Список не был создан или пустой"<<endl;
}
else
if((BegQ->data.kolichestvo_o==NULL)&&(EndQ->data.kolichestvo_o==NULL))//проверка на пустоту списка
{cout<<"Список пустой"<<endl;//вывод соотв. сообщения
};
}
Поиск в программе реализован согласно алгоритму линейного поиска.
2.3 Сортировка методом вставки
Рассмотрим сортировку методом вставки. Принцип метода заключается в следующем:
Массив разделяется на 2 части: отсортированную и не отсортированную. Элементы из не отсортированной части поочередно выбираются и вставляются в отсортированную часть так, чтобы не нарушить в ней упорядоченность элементов. В начале работы алгоритма в качестве отсортированной части массива принимают только первый элемент, а в качестве не отсортированной - все остальные элементы.
Таким образом, алгоритм будет состоять из (n-1) - го прохода ( n - размерность массива), каждый из которых будет включать 4 действия:
- взятие очередного i-го отсортированного элемента и сохранение его в дополнительной переменной;
- поиск позиции i в отсортированной части массива, в которой присутствие взятого элемента не нарушит упорядоченности элементов;
- сдвиг элементов массива от i-го до (j-1)-го вправо, чтобы освободить найденную позицию вставки;
- вставка взятого элемента в найденную i-ую позицию
Примером сортировки вставками можно взять пункт из разработанной программы сортировка по общему количеству мест в гостинице.
void sspisok::sort_mas(long n)//сортировка массива по общему количеству мест
{data_ tmp;
for (int i = 1; i < n; i++) {
for (int j = 0; j < n-i; j++) {
if (c[j].kolichestvo_o > c[j+1].kolichestvo_o) {
tmp = c[j];
c[j] = c[j+1];
c[j+1] = tmp;
}
}
}
};
Сортировка в программе реализована согласно методу вставки.
алгоритм сортировка данные линейный
3 .Алгоритмизация задачи
Схема алгоритмов и пояснение используемых идентификаторов приведены в Приложении Б и руководстве программиста. Текст программы представлен в приложении А.
Решение задачи включает следующие этапы:
1) Формирование массива данных;
2) Вывод данных на экран;
3) Удаление данных;
4) Перемещение данных;
5) Сортировка данных;
6) Запись данных в файл;
7) Загрузка данных из файла;
3.1 Алгоритм формирования данных
При создании списка данных о гостиницах необходимо:
Шаг 1. Ввод размерности массива;
Шаг 2. Цикл: для i=0;i<n;i++ выполнять ввод:
Название Data.nazvanie;
Класс Data.class_;
Общее количество мест - Data.kolichestvo_o;
Количество свободных мест - Data.kolichestvo_s;
Цена - Data.cena;
Шаг 3. Конец цикла;
3.2 Алгоритм вывода данных на экран
Шаг 1. Вывод на экран шапки таблицы с данными
Шаг 2. Цикл: для i=0;i<n;i++ выполнять вывод:
Название Data.nazvanie;
Класс Data.class_;
Общее количество мест - Data.kolichestvo_o;
Количество свободных мест - Data.kolichestvo_s;
Цена - Data.cena;
Шаг 3. Конец цикла;
3.3 Алгоритм удаления данных
Шаг 1. Ввод данных о гостиницах
Шаг 2. Цикл: while(p!=NULL) // пока не найдется гостиница без свободных номеров
При отсутствии свободных номеров в гостинице data.kolichestvo_s==0
удалить данные об этой гостинице sspisok::delete_data(n)
продолжить поиск по циклу (n--).
Шаг 4. Конец цикла;
3.4 Алгоритм перемещения данных
Шаг 1. Ввод данных о гостиницах;
Шаг 2. Цикл while(Q!=NULL)//пока не начало списка
выполнять поиск пятизвездочной гостиницы Q->next->data.class_==5
присвоить указателю Q2 значение указателя Q->next
найденной гостинице присвоить указатель начала списка BegQ=Q2.
Шаг 3. Конец цикла;
3.5 Алгоритм сортировки данных
Шаг 1. Ввод новой переменной tmp и массива данных c[j]
Шаг 2. Циклы: для i=0;i<n-1;i++ , для j = 0; j < n-i; j++ выполнять
Сравнение полей записи общего количества мест в гостинице
Присваивание tmp значения c[j]
Копирование c[j] в массив c[j+1];
Шаг 3. Конец цикла;
3.6 Алгоритм записи данных в файл
Шаг 1. Открытие файла
Шаг 2. Цикл while пока не конец файла выполнять запись данных в файл
Название Data.nazvanie;
Класс Data.class_;
Общее количество мест - Data.kolichestvo_o;
Количество свободных мест - Data.kolichestvo_s;
Цена - Data.cena;
Шаг 3. Конец цикла
Шаг 4. Закрытие файла
3.7 Алгоритм загрузки данных из файла
Шаг 1. Открытие файла;
Шаг 2. Цикл: пока не закончатся данные в файле выполнять
Вывод на экран данных
Название x.nazvanie;
Класс x.class_;
Общее количество мест x.kolichestvo_o;
Количество свободных мест x.kolichestvo_s;
Цена x.cena.
Шаг 3. Конец цикла;
Шаг 4. Закрытие файла;
4. Инструкция по пользованию программой
4.1 Руководство пользователя
Назначение программы «Гостиница» предназначена для обработки массивов структур, содержащего сведения о гостиницах.
Для запуска программы необходимо:
1) Запустить программу Microsoft Visual C++.
2) Выполнить следующие команды: File\ Open project…\ C:\Users\Маша\Documents\Visual Studio 2008\Projects\Курсовая Отель.sln
3) Запустить программу выполнением опции главного меню Run/Run.
Для удобства с программой разработан пользовательский интерфейс, представленный далее.
cout<<"Menu"<<endl;
cout<<"1.Sformirovat spisok"<<endl;
cout<<"2.Dobavit zapis'"<<endl;
cout<<"3.Udalit' zapis'"<<endl;
cout<<"4.Otobrazit spisok"<<endl;
cout<<"5.Skoirovat v Fail"<<endl;
cout<<"6.Skopirovat v Massiv"<<endl;
cout<<"7.Otobrazit Massiv"<<endl;
cout<<"8.Sortirovat Massiv"<<endl;
cout<<"9.Skopirovat iz Faila"<<endl;
cout<<"10.Nayti zapis' v spiske"<<endl;
cout<<"11.Udalenie otelei bez svobodnih nomerov"<<endl;
cout<<"12.Peremeshenie 5-ti zvezdochnih gostinic"<<endl;
cout<<"0.Vyhod"<<endl;
cout<<endl<<endl;
cout<<"Vyberite:_";
После запуска программы необходимо выбрать соответствующий пункт меню, путем ввода его номера с клавиатуры.
Выходные параметры программы: результатом работы программы являются списки гостиниц, представленные в табличной форме.
4.2 Руководство программиста
Данная программа написана с использованием языка Си++. Минимальное количество обрабатываемых данных ограничено (не менее 20). Данные вводятся клавиатуры . Данная программа состоит из основного блока и 12 подпрограмм.
Таблица 4.2.1 - Идентификаторы функции add_data
Переменная |
Тип |
Назначение |
|
i |
long |
Указывает номер записи в массиве |
|
n |
long |
Указывает на количество записей в массиве |
Таблица 4.2.2 - Идентификаторы функции delete_data
Переменная |
Тип |
Назначение |
|
i |
long |
Указывает номер удаляемой записи в массиве |
|
n |
long |
Указывает на количество записей в массиве |
|
j |
int |
Указывает номер удаляемого элемента |
Таблица 4.2.3 - Идентификаторы функции sp_copy_mas
Переменная |
Тип |
Назначение |
|
i |
long |
Указывает на количество записей в массиве |
|
n |
long |
Указывает номер записи в массиве |
Таблица 4.2.4 - Идентификаторы функции sort_mas
Переменная |
Тип |
Назначение |
|
i |
int |
Указывает на количество записей в массиве |
|
n |
long |
Указывает на номер записи в массиве |
|
j |
int |
Указывает на номер записи в массиве |
|
tmp |
int |
Переменная для копирования записи количества номеров |
|
c[j] |
char |
Переменная для копирования строк |
Таблица 4.2.5 - Идентификаторы функции show_mas
Переменная |
Тип |
Назначение |
|
i |
long |
Указывает на количество записей в массиве |
Таблица 4.2.6 - Идентификаторы функции fail
Переменная |
Тип |
Назначение |
|
i |
int |
Указывает номер записи в массиве |
|
n |
int |
Указывает на количество записей в массиве |
Таблица 4.2.7 - Идентификаторы функции find_data
Переменная |
Тип |
Назначение |
|
t |
long |
Указывает количество найденных записей |
Таблица 4.2.8 - Идентификаторы функции peremesh
Переменная |
Тип |
Назначение |
|
n |
int |
Указывает номер записи в массиве |
Таблица 4.2.9 - Идентификаторы функции udalenie
Переменная |
Тип |
Назначение |
|
n |
int |
Указывает номер записи в массиве |
5. Анализ результатов
1) Создание списка данных
Шаг 1. Запуск программы;
Шаг 2. Выбор пункта формирование списка (1);
Шаг 3. Ввод количества гостиниц (n=32)
Шаг 4. Ввод данных
2) Вывод списка данных
Ожидаемый результат
Название |
Класс |
Общее количество мест |
Количество свободных мест |
Минимальная Цена |
|
Milana |
4 |
120 |
32 |
2000 |
|
Kinder |
3 |
130 |
22 |
200 |
|
GoGs |
5 |
550 |
36 |
5000 |
|
Finnish |
4 |
600 |
32 |
6000 |
|
Dobi |
3 |
250 |
65 |
400 |
|
Max |
3 |
100 |
22 |
400 |
|
Apple |
2 |
200 |
35 |
220 |
|
Evas |
4 |
500 |
12 |
1200 |
|
Fox |
2 |
45 |
11 |
500 |
|
Lelik |
2 |
30 |
10 |
120 |
|
Toto |
4 |
250 |
13 |
1300 |
|
Gomer |
1 |
15 |
2 |
100 |
|
Frank |
5 |
777 |
120 |
5000 |
|
Sandra |
3 |
450 |
35 |
4000 |
|
Rex |
4 |
600 |
36 |
6000 |
|
Toll |
1 |
50 |
21 |
200 |
|
Oleg |
1 |
30 |
25 |
100 |
|
Kira |
1 |
50 |
10 |
150 |
|
Ermak |
3 |
320 |
23 |
150 |
|
UFO |
5 |
750 |
32 |
6000 |
|
Polli |
5 |
450 |
65 |
3500 |
|
GHOST |
5 |
120 |
32 |
5000 |
|
jIjI |
3 |
320 |
23 |
4500 |
|
Kiska |
4 |
120 |
32 |
2000 |
|
Gosha |
2 |
250 |
21 |
1200 |
|
Alex |
4 |
300 |
23 |
5500 |
|
Lumos |
4 |
250 |
34 |
4600 |
|
Pappa |
3 |
330 |
125 |
2000 |
|
Reg |
5 |
600 |
254 |
5500 |
|
Kollags |
2 |
120 |
0 |
100 |
|
Gagas |
1 |
20 |
1 |
80 |
|
Hippo |
4 |
450 |
125 |
2000 |
Полученный результат
Вывод: полученный результат совпал с ожидаемым.
3) Сохранение в файл
Шаг 1. Выберем пункт копировать в файл (5);
Шаг 2. Проверка наличия данных в файле ftext_in.txt.
Вывод: данные сохранены в файле
4) Удаление гостиниц без свободных номеров
Шаг 1. Выберем в меню пункт удаление (11);
Ожидаемый результат:
Название |
Класс |
Общее количество мест |
Количество свободных мест |
Минимальная Цена |
|
Milana |
4 |
120 |
32 |
2000 |
|
Kinder |
3 |
130 |
22 |
200 |
|
GoGs |
5 |
550 |
36 |
5000 |
|
Finnish |
4 |
600 |
32 |
6000 |
|
Dobi |
3 |
250 |
65 |
400 |
|
Max |
3 |
100 |
22 |
400 |
|
Apple |
2 |
200 |
35 |
220 |
|
Evas |
4 |
500 |
12 |
1200 |
|
Fox |
2 |
45 |
11 |
500 |
|
Lelik |
2 |
30 |
10 |
120 |
|
Toto |
4 |
250 |
13 |
1300 |
|
Gomer |
1 |
15 |
2 |
100 |
|
Frank |
5 |
777 |
120 |
5000 |
|
Sandra |
3 |
450 |
35 |
4000 |
|
Rex |
4 |
600 |
36 |
6000 |
|
Toll |
1 |
50 |
21 |
200 |
|
Oleg |
1 |
30 |
25 |
100 |
|
Kira |
1 |
50 |
10 |
150 |
|
Ermak |
3 |
320 |
23 |
150 |
|
UFO |
5 |
750 |
32 |
6000 |
|
Polli |
5 |
450 |
65 |
3500 |
|
GHOST |
5 |
120 |
32 |
5000 |
|
jIjI |
3 |
320 |
23 |
4500 |
|
Kiska |
4 |
120 |
32 |
2000 |
|
Gosha |
2 |
250 |
21 |
1200 |
|
Alex |
4 |
300 |
23 |
5500 |
|
Lumos |
4 |
250 |
34 |
4600 |
|
Pappa |
3 |
330 |
125 |
2000 |
|
Reg |
5 |
600 |
254 |
5500 |
|
Gagas |
1 |
20 |
1 |
80 |
|
Hippo |
4 |
450 |
125 |
2000 |
Полученный результат
Вывод: полученный результат совпал с ожидаемым.
5) Перемещение
Шаг 1. Выбрать в меню пункт перемещение (12)
Шаг 2. Перенести пятизвёздочные гостиницы в начало списка:
Следовательно, ожидаемый результат:
Название |
Класс |
Общее количество мест |
Количество свободных мест |
Минимальная Цена |
|
Polli |
5 |
450 |
65 |
3500 |
|
Frank |
5 |
777 |
120 |
5000 |
|
GHOST |
5 |
120 |
32 |
5000 |
|
Reg |
5 |
600 |
254 |
5500 |
|
UFO |
5 |
750 |
32 |
6000 |
|
GoGs |
5 |
550 |
36 |
5000 |
|
Milana |
4 |
120 |
32 |
2000 |
|
Kinder |
3 |
130 |
22 |
200 |
|
Finnish |
4 |
600 |
32 |
6000 |
|
Dobi |
3 |
250 |
65 |
400 |
|
Max |
3 |
100 |
22 |
400 |
|
Apple |
2 |
200 |
35 |
220 |
|
Evas |
4 |
500 |
12 |
1200 |
|
Fox |
2 |
45 |
11 |
500 |
|
Lelik |
2 |
30 |
10 |
120 |
|
Toto |
4 |
250 |
13 |
1300 |
|
Gomer |
1 |
15 |
2 |
100 |
|
Sandra |
3 |
450 |
35 |
4000 |
|
Rex |
4 |
600 |
36 |
6000 |
|
Toll |
1 |
50 |
21 |
200 |
|
Oleg |
1 |
30 |
25 |
100 |
|
Kira |
1 |
50 |
10 |
150 |
|
Ermak |
3 |
320 |
23 |
150 |
|
jIjI |
3 |
320 |
23 |
4500 |
|
Kiska |
4 |
120 |
32 |
2000 |
|
Gosha |
2 |
250 |
21 |
1200 |
|
Alex |
4 |
300 |
23 |
5500 |
|
Lumos |
4 |
250 |
34 |
4600 |
|
Pappa |
3 |
330 |
125 |
2000 |
|
Gagas |
1 |
20 |
1 |
80 |
|
Hippo |
4 |
450 |
125 |
2000 |
Полученный результат
Вывод: полученный результат совпал с ожидаемым
6) Сортировка
Шаг 1. Выбрать в меню пункт сортировка массива(8);
Шаг 2. Проверить результаты сортировки;
Ожидаемый результат:
Название |
Класс |
Общее количество мест |
Количество свободных мест |
Минимальная Цена |
|
Gomer |
1 |
15 |
2 |
100 |
|
Gagas |
1 |
20 |
1 |
80 |
|
Lelik |
2 |
30 |
10 |
120 |
|
Oleg |
1 |
30 |
25 |
100 |
|
Fox |
2 |
45 |
11 |
500 |
|
Toll |
1 |
50 |
21 |
200 |
|
Kira |
1 |
50 |
10 |
150 |
|
Max |
3 |
100 |
22 |
400 |
|
GHOST |
5 |
120 |
32 |
5000 |
|
Milana |
4 |
120 |
32 |
2000 |
|
Kiska |
4 |
120 |
32 |
2000 |
|
Kinder |
3 |
130 |
22 |
200 |
|
Apple |
2 |
200 |
35 |
220 |
|
Dobi |
3 |
250 |
65 |
400 |
|
Toto |
4 |
250 |
13 |
1300 |
|
Gosha |
2 |
250 |
21 |
1200 |
|
Lumos |
4 |
250 |
34 |
4600 |
|
Alex |
4 |
300 |
23 |
5500 |
|
Ermak |
3 |
320 |
23 |
150 |
|
jIjI |
3 |
320 |
23 |
4500 |
|
Pappa |
3 |
330 |
125 |
2000 |
|
Polli |
5 |
450 |
65 |
3500 |
|
Sandra |
3 |
450 |
35 |
4000 |
|
Hippo |
4 |
450 |
125 |
2000 |
|
Evas |
4 |
500 |
12 |
1200 |
|
GoGs |
5 |
550 |
36 |
5000 |
|
Reg |
5 |
600 |
254 |
5500 |
|
Finnish |
4 |
600 |
32 |
6000 |
|
Rex |
4 |
600 |
36 |
6000 |
|
UFO |
5 |
750 |
32 |
6000 |
|
Frank |
5 |
777 |
120 |
5000 |
Полученный результат:
Вывод: полученный результат совпал с ожидаемым.
7) Загрузка данных из файла
Шаг 1. Выбрать в меню пункт копирование из файла (9);
Шаг 2. Проверить результаты загрузки
Ожидаемый результат:
Полученный результат:
Вывод: полученный результат совпал с ожидаемым.
Заключение
В данной курсовой работе были разработаны и обработаны массивы структур. Программа курсовой работы даёт возможность обработать данные одномерных списков. Все полученные результаты совпали с ожидаемыми, а именно: при выводе списка на экран были показаны все те данные, что вводились при создании; удалены данные, в соответствии с пустыми турами; страны были упорядочены по возрастанию количества билетов. Следовательно, программа работает правильно.
Список используемой литературы
1. Дональд К. «Искусство программирования. 3 том. Сортировка и поиск».
2. Хэзфилд Р., Кирби Л. «Искусство программирования на C++. Фундаментальные алгоритмы, структуры данных и примеры приложений».
3. Либерти Д. «Освой самостоятельно С++»
4. Лафоре Р. «Объектно- ориентированное программирование в С++».
5. Подбельский В. «Язык Cu ++: Учебное пособие».
6. Жарков В. «Visual C++».
Приложение А
// Курсовая_Отель.cpp : main project file.
#include <malloc.h>//для динамических массивов
#include <iostream>//для cin cout
#include <conio.h>//для getch()
#include <fstream>//для файлов
#include <stdio.h>//стандартный ввод вывод
#include <string.h>//библиотека работы со строками
using namespace std;
typedef struct data_{char nazvanie[255];//название гостиницы
int class_;//класс гостиницы 1-5
int kolichestvo_o;//количество мест общее
int kolichestvo_s;//количество мест свободное
int cena;//стоимость номера в сутки
};
typedef struct spisok{data_ data; //структура однонаправленного списка
spisok* next;
};
spisok *BegQ,*EndQ,*Q;//BegQ-начало списка,EndQ-конец списка//Q-основной список
data_ Data;//Data-для ввода данных
data_ *c;//динамическая переменная для массива
data_ *d;//дополнительный массив для сортировки
long nn;//количество элементов в массиве
class sspisok {public:
void form(void);//процедура формирования списка
void add_data(data_);//добавления элемента в конец списка список
void show_sp(void);//просмотр списка данных
void delete_data(long);//удаление элемента списка
void sp_copy_mas();//процедура копирования списка данных в массив
void sort_mas(long);//процедура сортировки массива
void show_mas(long);//вывод массива
void find_data(char*);//поиск в массиве,т.к.линейный
void sp_copy_file(void);//процедура копирования из списка в файл
void file_copy_sp();//процедура заполнения списка из файла
void peremesh();//перемещение 5-ти звёздочных гостиниц в начало списка
void udalenie();//удаление гостиниц без свободных номеров
};
void sspisok::form(void)//процедура формирования однонаправленного списка,Q-сам список
//так как спискок кольцевой начало списка обозначим меткой,значением -1
{Q=new spisok;//создание самого списка
BegQ=new spisok;//создание указателя на начало
EndQ=new spisok;//создание указателя на конец
BegQ->next=EndQ;//начало ссылается на конец
EndQ->next=NULL;//списорк ссылается в конец,а конец в никуда
Q=BegQ;//список лежит в начале
Q->next=EndQ;//след. эл. ссылается в конец
BegQ->data.kolichestvo_o=NULL;//обнуление полей данных
EndQ->data.kolichestvo_o=NULL;//обнуление полей данных
cout<<"Sozdan spisok"<<endl;
}
void sspisok::add_data(data_ Data)//добавление данных
{spisok *p;//для добавления элемента
//для первого элемента
if((BegQ->data.kolichestvo_o==NULL)&&(EndQ->data.kolichestvo_o==NULL))//если список пустой в полях данных
{Q->data=Data;//заполняем поле данных
Q->next=NULL;//указатель следующего элемента пустота
Приложение А(продолжение)
BegQ=Q;//начало списка ссылается на список
Q=BegQ;//список переносим в начало списка
EndQ=BegQ;//конец приравниваем началу
EndQ=Q;//конец списка
BegQ->next=EndQ;//начало ссылается на конец
EndQ->next=NULL;//списорк ссылается в конец,а конец в никуда
}
else
//для всех остальных
if((BegQ==NULL)&&(EndQ==NULL))
{cout<<"spisok ne sozdan"<<endl;
}
else
{p=new spisok;//создаем переменную динамическую
p->data=Data;//в поле данных заносим данные
p->next=NULL;
EndQ->next=p;//следующий после конца это добавленный элемент
EndQ=p;//смещаем конец на добавленный элемент
};
}
void sspisok::delete_data(long n)//удаление n-ного элемента списка
{spisok *p;//
long i;//счетчик
if((BegQ!=NULL)&&(EndQ!=NULL)&&(n!=1))
{p=BegQ;//передача адреса
for(i=0;i<n-2;i++)
{p=p->next;//смещение указателя
}
p->next=p->next->next;//удаление элемента
cout<<"bil udalen "<<n<<"-ii element "<<endl;
};
//на случай удаления первого элемента
if((BegQ!=NULL)&&(EndQ!=NULL)&&(n==1))
{BegQ=BegQ->next;
cout<<"bil udalen "<<n<<"-ii element "<<endl;
};
if((BegQ==NULL)&&(EndQ==NULL))//если список пустой
Приложение А(продолжение)
{cout<<"Spisok pustoi ili ne sozdan"<<endl;
}
else
if((BegQ->data.kolichestvo_o==NULL)&&(EndQ->data.kolichestvo_o==NULL))//проверка на пустоту списка
{cout<<"Spisok pustoi"<<endl;//вывод соотв. сообщения
};
}
void sspisok::show_sp(void)//просмотр списка
{ Q=BegQ;//смещение указателя
if(Q->data.kolichestvo_o!=NULL)
{cout<<" Nazvanie Klass Kol-vo obshee Kol-vo svobodnoe Cena"<<endl<<endl;
while(Q!=NULL)//пока не начало списка
{
cout.width(8);
cout<<Q->data.nazvanie;
cout.width(10);
cout<<Q->data.class_;
cout.width(10);
cout<<Q->data.kolichestvo_o;
cout.width(18);
cout<<Q->data.kolichestvo_s;
cout.width(20);
cout<<Q->data.cena<<endl;
Q=Q->next;//переход на следующую позицию
}
}
if((BegQ==NULL)&&(EndQ==NULL))//если спискок пустой
{cout<<"Spisok ne sozdan"<<endl;//вывод соотв. сообщения
}
else
if((BegQ->data.kolichestvo_o==NULL)&&(EndQ->data.kolichestvo_o==NULL))//проверка на пустоту списка
{cout<<"Spisok pustoi"<<endl;//вывод соотв. сообщения
};
}
void sspisok::sp_copy_mas()//копирование списка в массив
{long i,n;//n-для определения количества элементов в списке,i-для цикла
//если в списке что то есть
Q=BegQ;//смещение указателя
n=0;//обнуление количества
while(Q!=NULL)//пока не начало списка
{n++;
Q=Q->next;//переход на следующую позицию
}
c=(data_*)malloc(n*sizeof(data_));//создания динамического массива
nn=n;//передача количества элементов списка в глобальную переменную для сортировки
Q=BegQ;
//копирование списка в массив
for(i=0;i<n;i++)
{c[i]=Q->data;
Q=Q->next;
}
//если элементы не обнаружены
if((BegQ->data.kolichestvo_o==NULL)&&(EndQ->data.kolichestvo_o==NULL))//проверка на наличие списка
{cout<<"Spisok ne sozdan"<<endl;
}
else
if((BegQ->data.kolichestvo_o==NULL)&&(EndQ->data.kolichestvo_o==NULL))//проверка на пустоту списка
{cout<<"Spisok pustoi"<<endl;
};
};
void sspisok::sort_mas(long n)//сортировка массива
// сортировка
{data_ tmp;
for (int i = 1; i < n; i++) {
for (int j = 0; j < n-i; j++) {
if (c[j].kolichestvo_o > c[j+1].kolichestvo_o) {
tmp = c[j];
c[j] = c[j+1];
c[j+1] = tmp;
}
}
}
};
void sspisok::show_mas(long n)//вывод массива
{long i;//счетчик
//вывод массива по циклу
cout<<" Nazvanie Klass Kol-vo obshee Kol-vo svobodnoe Cena"<<endl<<endl;
for(i=0;i<n;i++)
{ cout.width(8);
cout<<c[i].nazvanie;
cout.width(10);
cout<<c[i].class_;
cout.width(10);
cout<<c[i].kolichestvo_o;
cout.width(18);
cout<<c[i].kolichestvo_s;
cout.width(20);
cout<<c[i].cena<<endl;
}
cout<<endl;//переход на новую строчку
}
void sspisok::find_data(char Data[255])
{long t;//t-количество найденных элементов
Q=BegQ;//указатель списка в начало
t=0;//обнулнение счетчика
while(Q!=NULL)//пока не конец списка
{if(stricmp(Q->data.nazvanie,Data)==0)//если элемент найден то увеличение счетчика
{cout<<"nazavanie - "<<Q->data.nazvanie<<" class - "<<Q->data.class_<<endl;//печать элемента в файл
t++;//увеличение счетчика
}
Q=Q->next;//переход на следующий элемент
}
if(t>0)//если элемент списка равен искомому
{cout<<"Zapis' naidena "<<t<<" raz(a)"<<endl;
}
else
{cout<<"Zapis' ne naidena"<<endl;
}
}
void sspisok::sp_copy_file(void)//копирование списка в файл
{ofstream file("C:\\ftext_from.txt");//создание файла
Q=BegQ;//смещение указателя
while(Q!=NULL)//пока не конец списка
{file<<"Nazvanie - "<<Q->data.nazvanie<<" Klass - "<<Q->data.class_<<" kol-vo_o - "<<Q->data.kolichestvo_o<<" kol-vo_s - "<<Q->data.kolichestvo_s<<" Cena - "<<Q->data.cena<<endl;//печать элемента в файл
Q=Q->next;//переход на следующую позицию
}
}
void sspisok::file_copy_sp()//копирование данных из файла в список
{data_ x;//переменная для считывания из файла
ifstream file("C:\\ftext_in.txt");//открытие файла
if(file!=NULL)
{cout<<"File Soderzhit sleduiushie elementi:"<<endl;
cout<<" Nazvanie Klass Kol-vo obshee Kol-vo svobodnoe Cena"<<endl<<endl;
while(!file.eof())//пока не конец файла
{
file>>x.nazvanie;
cout.width(8);cout<<x.nazvanie;
file>>x.class_;
cout.width(10);cout<<x.class_;
file>>x.kolichestvo_o;
cout.width(10);cout<<x.kolichestvo_o;
file>>x.kolichestvo_s;
cout.width(18);cout<<x.kolichestvo_s;
file>>x.cena;
cout.width(20);cout<<x.cena<<endl;;
sspisok::add_data(x);//вызов метода класса и добавление элемента в список
}
}
else
{cout<<"File C:\\ftext_in.txt ne naiden"<<endl;
}
}
void sspisok::peremesh()
{int n=0;
spisok *Q2;//буфер
Q2=new spisok;
Q=BegQ;//смещение указателя
while(Q->next!=NULL)//пока не начало списка
{ n++;
if(Q->next->data.class_==5)
{ cout<<" n="<<n<<endl;
Q2=Q->next;
Q->next=Q->next->next;
Q2->next=BegQ;
BegQ=Q2;
}
Q=Q->next;//переход на следующую позицию
}
}
void sspisok::udalenie()
{spisok *p;
int n=0;
if((BegQ!=NULL)&&(EndQ!=NULL))
{
p=BegQ;
while(p!=NULL)
{n++;
if(p->data.kolichestvo_s==0)
{sspisok::delete_data(n);
n--;//возврат индекса к предыдущему элементу
}
p=p->next;
};
}
if((BegQ==NULL)&&(EndQ==NULL))//если список пустой
{cout<<"Spisok pustoi ili ne sozdan"<<endl;
}
else
Приложение А(продолжение)
if((BegQ->data.kolichestvo_o==NULL)&&(EndQ->data.kolichestvo_o==NULL))//проверка на пустоту списка
{cout<<"Spisok pustoi"<<endl;//вывод соотв. сообщения
};
}
int main(array<System::String ^> ^args)
{sspisok x;//объект класса
int vibor;//для меню
long i,n;//i-для циклов,n-для количесва
long j;//для прочих целей
BegQ=NULL;//обнуление указателя
EndQ=NULL;//обнуление указателя
Q=NULL;//обнуление указателя
//////////////////////////меню///////////////////////////
while(vibor!=0)
{system("cls");
cout<<"Menu"<<endl;
cout<<"1.Sformirovat spisok"<<endl;
cout<<"2.Dobavit zapis'"<<endl;
cout<<"3.Udalit' zapis'"<<endl;
cout<<"4.Otobrazit spisok"<<endl;
cout<<"5.Skoirovat v Fail"<<endl;
cout<<"6.Skopirovat v Massiv"<<endl;
cout<<"7.Otobrazit Massiv"<<endl;
cout<<"8.Sortirovat Massiv"<<endl;
cout<<"9.Skopirovat iz Faila"<<endl;
cout<<"10.Nayti zapis' v spiske"<<endl;
cout<<"11.Udalenie otelei bez svobodnih nomerov"<<endl;
cout<<"12.Peremeshenie 5-ti zvezdochnih gostinic"<<endl;
cout<<"0.Vyhod"<<endl;
cout<<endl<<endl;
cout<<"Vyberite:_";
cin>>vibor;
system("cls");
if(vibor==1)//формирование списка
{x.form();//формирование списка
}
if(vibor==2)//ввод данных
{if((BegQ!=NULL)&&(EndQ!=NULL))
{cout<<"Skolko Zapisey vvesti"<<endl;
cout<<"n=";
cin>>n;//ввод количества
for(i=0;i<n;i++)
{
cout<<"Nazvanie -";
cin>>Data.nazvanie;//ввод данных
cout<<"Klass-";
cin>>Data.class_;
cout<<"Obshee kolichestvo-";
cin>>Data.kolichestvo_o;//ввод данных
cout<<"Kolichestvo svobodnih-";
cin>>Data.kolichestvo_s;//ввод данных
cout<<"Cena-";
cin>>Data.cena;
x.add_data(Data);//добавление элемента в список
}
}
if((BegQ==NULL)&&(EndQ==NULL))
{cout<<"Spisok ne sozdan"<<endl;
}
}
if(vibor==3)//удаление элемента
{if((BegQ!=NULL)&&(EndQ!=NULL))
{cout<<"Vvedite nomer zapisi kotoruyu nuzhno udalit"<<endl;
cout<<"n=";
cin>>j;//ввод номера удаляемого элемента
x.delete_data(j);//удаление элемента
}
if((BegQ==NULL)&&(EndQ==NULL))
{cout<<"Spisok ne sozdan"<<endl;
}
}
if(vibor==4)//вывод элементов на экран
{x.show_sp();//вывод списка на экран
}
Приложение А(продолжение)
if(vibor==5)//копировать в файл
{if((BegQ!=NULL)&&(EndQ!=NULL))
{cout<<"Dannie skopirovani v fail, po adresu C:\\ftext_from.txt"<<endl;
x.sp_copy_file();//копирование данных в список
}
if((BegQ==NULL)&&(EndQ==NULL))
{cout<<"Spisok ne sozdan"<<endl;
}
}
if(vibor==6)//копировать в массив
{if((BegQ!=NULL)&&(EndQ!=NULL))
{x.sp_copy_mas();//копирание данных в массив
cout<<"V spiske "<<nn<<" - elementov"<<endl;//вывод сообщения о количестве элементов
cout<<"Spisok skopirovan v massiv"<<endl;
}
if((BegQ==NULL)&&(EndQ==NULL))
{cout<<"Spisok ne sozdan"<<endl;
}
}
if(vibor==7)//вывод массива
{if((BegQ!=NULL)&&(EndQ!=NULL))
{cout<<"Vivod massiva"<<endl;
x.show_mas(nn);//вывод массива на экран
}
if((BegQ==NULL)&&(EndQ==NULL))
{cout<<"Spisok ne sozdan"<<endl;
}
}
if(vibor==8)//сортировать массив
{if((BegQ!=NULL)&&(EndQ!=NULL))
{x.sort_mas(nn);//сортировка массива
cout<<"Massiv otsortirovan"<<endl;
x.show_mas(nn);//вывод массива на экран
}
if((BegQ==NULL)&&(EndQ==NULL))
{cout<<"Spisok ne sozdan"<<endl;
}}
Приложение А(продолжение)
if(vibor==9)//сформировать файл из списка или добавить элементы в список из файла
{if((BegQ!=NULL)&&(EndQ!=NULL))
{x.file_copy_sp();
}
if((BegQ==NULL)&&(EndQ==NULL))
{cout<<"Spisok ne sozdan"<<endl;
}
}
if(vibor==10)//найти элемент в массиве
{if((BegQ!=NULL)&&(EndQ!=NULL))
{cout<<"Vvedite nazvanie gostinici kotoruiu nuzhno naiti:_"<<endl;
cout<<"Gostinica-";
cin>>Data.nazvanie;//ввод данных
x.find_data(Data.nazvanie);//поиск элемента
}
if((BegQ==NULL)&&(EndQ==NULL))
{cout<<"Spisok ne sozdan"<<endl;
}
}
if(vibor==11)
{if((BegQ!=NULL)&&(EndQ!=NULL))
{ x.udalenie();
cout<<"Gostinici bez svobodnyh nomerov udaleny"<<endl;
x.show_sp();
}
}
if(vibor==12)
{if((BegQ!=NULL)&&(EndQ!=NULL))
{ x.peremesh(); x.peremesh();
cout<<"5-ti zvezdochnie gostinici v nachalo spiska"<<endl;
x.show_sp();
}
}
getch();
}
}
Приложение Б
Рисунок Б.1 - Блок-схема основной части программы
Рисунок Б.2- блок-схема функции «form ()»
Рисунок Б.3- блок-схема функции «add_data ()»
Рисунок Б.4- блок-схема функции « delete_data ()»
Рисунок Б.5- блок-схема функции « show_sp ()»
Рисунок Б.6- блок-схема функции «sp_copy_file()»
Рисунок Б.7- блок-схема функции «sp_copy_mass()»
Рисунок Б.8- блок-схема функции «show_mass()»
Рисунок Б.9- блок-схема функции «sort_mass()»
Рисунок Б.10- блок-схема «file_copy_sp()»
Рисунок Б.11- блок-схема функции «find_data()»
Рисунок Б.12- блок-схема функции «udalenie ()»
Рисунок Б.13- блок-схема функции «peremesh ()»
Размещено на Allbest.ur
Подобные документы
Структура записей входного массива. Описание основных типов данных. Алгоритм программы: присвоение начальных значений переменных, чтение списка из файла, вывод данных на экран, выполнение обработки данных, сохранение списка в файл. Листинг программы.
курсовая работа [325,2 K], добавлен 28.12.2012Написание программы, исходя из конкретных данных. Создание двунаправленного линейного списка. Main - главная программа, содержащая меню. Занесение данных в память списка. Результирующий файл. Значения всех числовых данных из диапазона целого типа данных.
курсовая работа [2,3 M], добавлен 22.12.2010Структура данных с указанием типов. Общая структурная схема программы. Алгоритмы сортировки вставками. Назначение make-файла. Функции управления программой; перемещения и корректировки введенных данных и их удаления справочника, загрузки данных из файла.
курсовая работа [1,3 M], добавлен 12.01.2016Структура программного комплекса. Ввод информации из заданного файла. Создание набора данных. Добавление элементов в конец набора данных. Просмотр всех элементов набора данных. Копирование информации из НД в заданный файл. Сортировка массива по номерам.
курсовая работа [630,5 K], добавлен 01.06.2014Процедура ввода исходных данных в программу, вывод результатов работы программы на экран. Принцип организации хранения логически связанных наборов информации в виде файлов. Параметры характеристики файла, способы обращения к нему, соглашения по типу.
реферат [14,5 K], добавлен 06.12.2011Исследование программного средства для управления базой данных с информацией о фильмах. Составление алгоритма удаления и добавления элемента в указанное место двунаправленного списка. Характеристика поиска, вывода на экран и сортировки элементов списка.
курсовая работа [94,5 K], добавлен 23.09.2011Изучение и освоение инструментальных средств Excel для управления базами данных. Правила формирования списка на рабочем листе Excel. Простая и многоуровневая сортировка списка. Варианты фильтрации данных в таблице. Вычисляемый критерий и его создание.
лабораторная работа [297,2 K], добавлен 15.11.2010Описание процедуры выбора структуры хранения данных. Программная реализация одномерного неоднородного массива. Представление бинарного дерева в виде динамической структуры данных. Изучение способов поиска в упорядоченном дереве. Содержание базы данных.
практическая работа [850,0 K], добавлен 16.04.2015Составление алгоритма сортировки линейной вставкой. Понятие однонаправленного циклического списка символов, реализация процедуры подсчета суммы элементов и составление алгоритма. Прямое представление дерева, алгоритм работы с ним на абстрактном уровне.
контрольная работа [32,8 K], добавлен 20.01.2012Создание базы данных, содержащей сведения о напильниках. Вывод данных об инструменте, номер насечки которых равен 2.Использование переменных типа "запись" при работе с базами данных. Решение задачи с использованием Microsoft Excel. Алгоритм программы.
курсовая работа [33,3 K], добавлен 08.03.2013