Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- ЛАБОРАТОРНАЯ РАБОТА №8
- «ПРОГРАММИРОВАНИЕ ЛИНЕЙНЫХ И РАЗВЕТВЛЯЮЩИХСЯ АЛГОРИТМОВ»
- вариант № 5
- Цель работы - исследование списковых структур данных и приобретение навыков разработки и отладки программ, использующих динамическую память. Исследование особенностей использования переменных ссылочного типа.
- Задача создать таблицу со следующими данными, вид линейного списка:
- N Поезда, Станция отправления, Станция назначения, Время отправления, Время прибытия, Стоимость билета. Процедура, должна вставлять в конец списка новый
- элемент .
- 1 Разработать структурную схему алгоритма решения задачи по заданному варианту.
- 2 Шаги алгоритма решения.
- • Создание списка
- • Добавление в список
- • Удаление из списка
- • Просмотр списка
- • Прокрутка списка
- 3 Написать программу.
- program DemoQuery;
- uses
- Crt;
- type
- Data = Record {Описание записи о маршруте поезда}
- N__train: string[15];
- stantion__from: string[30];
- stantion__to: string[15];
- time__from: string[10];
- time__to: string[10];
- ticket__price: string[10];
- End;
- Ukaz = ^Query;{Описание указателя на элемент очереди}
- Query = Record
- Inf: Data;
- Next: Ukaz
- End;
- var
- NewE, Left, Right, Temp: Ukaz; {Указатели}
- Z: Data; {Запись, добавляемая в очередь}
- Key: Char;{номер пункта меню программы}
- exit_: integer;
- ////////////////////////////////////////////////
- procedure Org;{Процедура записи данных о поезде}
- begin
- Writeln('Выполняется процедура записи данных о поезде');
- Writeln('Для выхода из процедуры вводите символ * ');
- Writeln('======================================== ');
- Writeln('Введите номер поезда');
- Readln(Z.N__train);
- if Z.N__train = '' Then Exit; {Выход из процедуры при вводе ''}
- Writeln('Введите адрес отправления ');
- Readln(Z.stantion__from);
- if Z.stantion__from = '' Then Exit; {Выход из процедуры при вводе ''}
- Writeln('Введите адрес пребывания');
- Readln(Z.stantion__to);
- if Z.stantion__to = '' Then Exit; {Выход из процедуры при вводе ''}
- Writeln('Введите время отправления');
- Readln(Z.time__from);
- if Z.time__from = '' Then Exit; {Выход из процедуры при вводе ''}
- Writeln('Введите время пребывания');
- Readln(Z.time__to);
- if Z.time__to = '' Then Exit; {Выход из процедуры при вводе ''}
- Writeln('Введите цена билета');
- Readln(Z.ticket__price);
- if Z.ticket__price = '' Then Exit; {Выход из процедуры при вводе ''}
- New(NewE); {Создание нового элемента }
- NewE^.Inf.N__train := Z.N__train; {Заполнение его полей }
- NewE^.Inf.stantion__from := Z.stantion__from;
- NewE^.Inf.stantion__to := Z.stantion__to;
- NewE^.Inf.time__from := Z.time__from;
- NewE^.Inf.time__to := Z.time__to;
- NewE^.Inf.ticket__price := Z.ticket__price;
- NewE^.Next := nil;
- Right := NewE; { Right - указатель хвоста очереди }
- Left := NewE;{ Left - указатель головы очереди }
- while True Do {Повторение этих же действий }
- begin
- Writeln('Выполняется процедура записи данных о поезде');
- Writeln('Для выхода из процедуры вводите символ * ');
- Writeln('======================================== ');
- Writeln('Введите номер поезда');
- Readln(Z.N__train);
- if Z.N__train = '*' Then Exit; {Выход из процедуры при вводе ''}
- Writeln('Введите адрес отправления ');
- Readln(Z.stantion__from);
- if Z.stantion__from = '*' Then Exit; {Выход из процедуры при вводе ''}
- Writeln('Введите адрес пребывания');
- Readln(Z.stantion__to);
- if Z.stantion__to = '*' Then Exit; {Выход из процедуры при вводе ''}
- Writeln('Введите время отправления');
- Readln(Z.time__from);
- if Z.time__from = '*' Then Exit; {Выход из процедуры при вводе ''}
- Writeln('Введите время пребывания');
- Readln(Z.time__to);
- if Z.time__to = '*' Then Exit; {Выход из процедуры при вводе ''}
- Writeln('Введите цена билета');
- Readln(Z.ticket__price);
- if Z.ticket__price = '*' Then Exit; {Выход из процедуры при вводе ''}
- New(NewE); {Создание нового элемента }
- NewE^.Inf.N__train := Z.N__train; {Заполнение его полей }
- NewE^.Inf.stantion__from := Z.stantion__from;
- NewE^.Inf.stantion__to := Z.stantion__to;
- NewE^.Inf.time__from := Z.time__from;
- NewE^.Inf.time__to := Z.time__to;
- NewE^.Inf.ticket__price := Z.ticket__price;
- NewE^.Next := nil;
- Right^.Next := NewE; {Связь с предыдущим элементом}
- Right := NewE{Перемещение указателя хвоста очереди}
- end
- end;
- /////////////////////////////////////////////////////
- procedure Dob;{Добавление элемента в конец очереди}
- begin
- Writeln('Введите номер поезда');
- Readln(Z.N__train);
- if Z.N__train = '*' Then Exit; {Выход из процедуры при вводе ''}
- Writeln('Введите адрес отправления ');
- Readln(Z.stantion__from);
- if Z.stantion__from = '*' Then Exit; {Выход из процедуры при вводе ''}
- Writeln('Введите адрес пребывания');
- Readln(Z.stantion__to);
- if Z.stantion__to = '*' Then Exit; {Выход из процедуры при вводе ''}
- Writeln('Введите время отправления');
- Readln(Z.time__from);
- if Z.time__from = '*' Then Exit; {Выход из процедуры при вводе ''}
- Writeln('Введите время пребывания');
- Readln(Z.time__to);
- if Z.time__to = '*' Then Exit; {Выход из процедуры при вводе ''}
- Writeln('Введите цена билета');
- Readln(Z.ticket__price);
- if Z.ticket__price = '*' Then Exit; {Выход из процедуры при вводе ''}
- New(NewE); {Создание нового элемента }
- NewE^.Inf.N__train := Z.N__train; {Заполнение его полей }
- NewE^.Inf.stantion__from := Z.stantion__from;
- NewE^.Inf.stantion__to := Z.stantion__to;
- NewE^.Inf.time__from := Z.time__from;
- NewE^.Inf.time__to := Z.time__to;
- NewE^.Inf.ticket__price := Z.ticket__price;
- NewE^.Next := nil;
- if Right = nil Then {Если добавляется первый элемент, то}
- Left := NewE {инициализировать указатель головы}
- Else
- Right^.Next := NewE; {иначе добавить в конец очереди}
- Right := NewE;
- end;
- /////////////////////////////////////////////////////
- procedure Prokrutka;{Добавление первого элемента в конец очереди и удаление первого}
- var
- i, n: integer;
- begin
- Writeln('Введите номер для перемещения его в начало списка путем смещения всех элементов');
- Readln(n);
- i := 1;
- while i <> n Do
- begin
- Temp := Left;
- New(NewE); {Создание нового элемента }
- NewE^.Inf.N__train := Temp^.Inf.N__train; {Заполнение его полей }
- NewE^.Inf.stantion__from := Temp^.Inf.stantion__from;
- NewE^.Inf.stantion__to := Temp^.Inf.stantion__to;
- NewE^.Inf.time__from := Temp^.Inf.time__from;
- NewE^.Inf.time__to := Temp^.Inf.time__to;
- NewE^.Inf.ticket__price := Temp^.Inf.ticket__price;
- NewE^.Next := nil;
- if Right = nil Then {Если добавляется первый элемент, то}
- Left := NewE {инициализировать указатель головы}
- Else
- Right^.Next := NewE; {иначе добавить в конец очереди}
- Right := NewE;
- if Left <> nil Then {Если очередь не пустая, то}
- begin
- Temp := Left; {запоминаем указатель на голову очереди}
- Left := Left^.Next; {указатель головы смещаем на 2-ой элемент}
- Dispose(Temp); {oсвобождаем память от головного элемента}
- if Left = nil Then {Если удалили последний элемент, то}
- Right := nil; {указатель на конец очереди равен Nil}
- end;
- i := i + 1;
- end;
- end;
- ///////////////////////////////////////////////////////
- procedure Udal;{Процедура исключения элемента}
- begin
- Writeln('Исключается головной элемент очереди');
- Writeln('Нажмите клавишу Enter');
- Readln;
- if Left <> nil Then {Если очередь не пустая, то}
- begin
- Temp := Left; {запоминаем указатель на голову очереди}
- Left := Left^.Next; {указатель головы смещаем на 2-ой элемент}
- Dispose(Temp); {oсвобождаем память от головного элемента}
- if Left = nil Then {Если удалили последний элемент, то}
- Right := nil; {указатель на конец очереди равен Nil}
- end
- end;
- ///////////////////////////////////////////////////////
- procedure Prosmotr;{Процедура просмотра очереди}
- var
- i: integer;{Просмотр выполняется от головы к хвосту}
- begin
- Writeln('Список содержит следующие элементы:');
- Temp := Left;
- i := 1;
- while Temp <> nil Do
- begin
- Writeln(i, ' ', Temp^.Inf.N__train, ' ', Temp^.Inf.stantion__from, ' ', Temp^.Inf.stantion__to
- , ' ', Temp^.Inf.time__from, ' ', Temp^.Inf.time__to, ' ', Temp^.Inf.ticket__price);
- Temp := Temp^.Next;
- i := i + 1;
- end;
- Writeln('Нажмите клавишу Enter');
- Readkey;
- end;
- ////////////////////////////////////////////////////////
- procedure exit__procedure;{Процедура просмотра очереди}
- begin
- Writeln('Введите 1 для очистки памяти и выхода из программы');
- Writeln('Введите 0 ENTER чтобы продолжить изменять список');
- if NewE <> nil then Writeln('Память NewE не очищена');
- Readln(exit_);
- if exit_ = 1 then
- begin
- Dispose(NewE);
- if NewE = nil then Writeln('Память NewE пуста');
- NewE := nil;
- end;
- end;
- ///////////////////////////////////////////////////////
- procedure read__procedure;{Процедура чтения фаила 7}
- var
- f: text;
- s: string;
- begin
- Assign(f, 'input.txt');
- Reset(f);
- Writeln('');
- while not Eof(f) do
- begin
- readln(f, s);
- writeln(s);
- end;
- Writeln('');
- Writeln('Нажмите enter для продолжения');
- Readln;
- Close(f);
- end;
- ////////////////////////////////////////////////////////
- procedure wtite__procedure;{Процедура записи в фаил 6}
- var
- f: text;
- //s: string;
- i: integer;{Запись выполняется от головы к хвосту}
- begin
- Temp := Left;
- i := 1;
- while Temp <> nil Do
- begin
- Assign(f, 'input.txt');
- Append(f);
- Write(f, i:4);
- Write(f, Temp^.Inf.N__train:4);
- Write(f, Temp^.Inf.stantion__from:4);
- Write(f, Temp^.Inf.stantion__to:4);
- Write(f, Temp^.Inf.time__from:4);
- Write(f, Temp^.Inf.time__to:4);
- Write(f, Temp^.Inf.ticket__price:4);
- Writeln(f, '');
- Temp := Temp^.Next;
- Close(f);
- i := i + 1;
- end;
- Temp := Left;
- if Temp <> nil then
- begin
- Assign(f, 'input.txt');
- Append(f);
- Writeln(f, '//////////////////////////////////////////////////////////////');
- Close(f);
- Writeln('Вы добавили запись Нажмите enter для продолжения');
- Readln;
- end;
- end;
- ////////////////////////////////////////////////////////
- {==============основная программа================}
- begin
- Right := nil; Left := nil;
- repeat
- ClrScr; { очистка экрана }
- {вывод на экран пунктов меню}
- Writeln('1-Создание списка');
- Writeln('2-Добавление элемента в список');
- Writeln('3-Удаление элемента из списка');
- Writeln('4-Просмотр списка');
- Writeln('5-Переместить начало скиска в конец на n шагов');
- Writeln('6-Запись списка в фиал');
- Writeln('7-Вывод списка из файла');
- Writeln('8-Выход и очистка памяти');
- Writeln('-------------------------------');
- Writeln('Нажмите клавишу от 1 до 5');
- Key := ReadKey; {считывание кода нажатой клавиши}
- case Key Of { вызов необходимой процедуры по номеру}
- '1': Org;
- '2': Dob;
- '3': Udal;
- '4': Prosmotr;
- '5': Prokrutka;
- '6': wtite__procedure;
- '7': read__procedure;
- '8': exit__procedure;
- End;
- until exit_ = 1;// exit;;
- end.
- 4. Тестовые примеры, которые предусматривают проверку корректности работы программы для пустых списков.
- Делаем проверку нажимая для '2': Dob; '3': Udal;'4': Prosmotr;'5': Prokrutka, при пустых списках.
- 5. Выполнить отладку программы.
- Процедура ввода данных:
- 1-Создание списка
- 2-Добавление элемента в список
- 3-Удаление элемента из списка
- 4-Просмотр списка
- 5-Переместить начало списка в конец на n шагов
- 6-Выход
- -------------------------------
- Нажмите клавишу от 1 до 5
- Выполняется процедура записи данных о поезде
- Для выхода из процедуры вводите символ *
- ========================================
- Введите номер поезда
- №1
- Введите адрес отправления
- Севастополь1
- Введите адрес пребывания
- Краснодар1
- Введите время отправления
- Час1
- Введите время пребывания
- час15
- Введите цена билета
- 2000р
- Выполняется процедура записи данных о поезде
- Для выхода из процедуры вводите символ *
- ========================================
- Введите номер поезда
- №2
- Введите адрес отправления
- Севастополь2
- Введите адрес пребывания
- Краснодар2
- Введите время отправления
- Час2
- Введите время пребывания
- час16
- Введите цена билета
- 2000р
- Выполняется процедура записи данных о поезде
- Для выхода из процедуры вводите символ *
- ========================================
- Введите номер поезда
- №3
- Введите адрес отправления
- Севастополь3
- Введите адрес пребывания
- Краснодар3
- Введите время отправления
- Час3
- Введите время пребывания
- час17
- Введите цена билета
- 2000р
- Выполняется процедура записи данных о поезде
- Для выхода из процедуры вводите символ *
- ========================================
- Введите номер поезда
- *
- Смотрим результат
- Нажмите клавишу от 1 до 5
- Список содержит следующие элементы:
- 1 №1 Севастополь1 Краснодар1 Час1 час15 2000р
- 2 №2 Севастополь2 Краснодар2 Час2 час16 2000р
- 3 №3 Севастополь3 Краснодар3 Час3 час17 2000р
- Нажмите клавишу Enter
- Процедура добавления данных:
- Введите номер поезда
- №4
- Введите адрес отправления
- Севастополь4
- Введите адрес пребывания
- Краснодар4
- Введите время отправления
- Час4
- Введите время пребывания
- час18
- Введите цена билета
- 2000р
- Смотрим результат
- Нажмите клавишу от 1 до 5
- Список содержит следующие элементы:
- 1 №1 Севастополь1 Краснодар1 Час1 час15 2000р
- 2 №2 Севастополь2 Краснодар2 Час2 час16 2000р
- 3 №3 Севастополь3 Краснодар3 Час3 час17 2000р
- 4 №4 Севастополь4 Краснодар4 Час4 час18 2000р
- Нажмите клавишу Enter
- Процедура перемещения строк данных в списке :
- Нажмите клавишу от 1 до 5
- Введите номер для перемещения его в начало списка путем смещения всех элементов
- 4
- Смотрим результат
- Нажмите клавишу от 1 до 5
- Список содержит следующие элементы:
- 1 №4 Севастополь4 Краснодар4 Час4 час18 2000р
- 2 №1 Севастополь1 Краснодар1 Час1 час15 2000р
- 3 №2 Севастополь2 Краснодар2 Час2 час16 2000р
- 4 №3 Севастополь3 Краснодар3 Час3 час17 2000р
- Нажмите клавишу Enter
- Процедура удаления данных:
- Нажмите клавишу от 1 до 5
- Исключается головной элемент очереди
- Нажмите клавишу Enter
- 1
- Смотрим результат
- Список содержит следующие элементы:
- 1 №1 Севастополь1 Краснодар1 Час1 час15 2000р
- 2 №2 Севастополь2 Краснодар2 Час2 час16 2000р
- 3 №3 Севастополь3 Краснодар3 Час3 час17 2000р
- Нажмите клавишу Enter
- Процедура записи и чтения
- Расположение файла в корневой папке
- Вывод – в работе изучил списковые структуры данных и приобрел навыки разработки и отладки программ построенных на списковых структурах. Программа может перемещать данные, строки внутри списка что расширяет возможности его форматирования и делает его более удобным для пользователя.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement