Advertisement
Savelyev_Vyacheslav

8 л/р pascal

Oct 21st, 2020
208
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Pascal 20.38 KB | None | 0 0
  1. ЛАБОРАТОРНАЯ РАБОТА №8  
  2. «ПРОГРАММИРОВАНИЕ ЛИНЕЙНЫХ И  РАЗВЕТВЛЯЮЩИХСЯ АЛГОРИТМОВ»
  3. вариант № 5
  4.  
  5. Цель работы - исследование списковых структур данных и приобретение навыков разработки и отладки программ, использующих динамическую память. Исследование особенностей использования переменных ссылочного типа.  
  6. Задача создать таблицу со следующими данными, вид линейного списка:
  7. N Поезда, Станция отправления, Станция назначения, Время отправления, Время прибытия, Стоимость билета. Процедура, должна вставлять в конец списка  новый
  8. элемент .
  9.  
  10. 1 Разработать структурную схему алгоритма решения задачи по заданному варианту.
  11.  
  12.  
  13.  
  14. 2 Шаги алгоритма решения.
  15. • Создание списка
  16. • Добавление в список
  17. • Удаление из списка
  18. • Просмотр списка
  19. • Прокрутка списка
  20.  
  21. 3 Написать программу.
  22.  
  23. program DemoQuery;
  24.  
  25. uses
  26.   Crt;
  27.  
  28. type
  29.   Data = Record {Описание записи о маршруте поезда}
  30.     N__train: string[15];
  31.     stantion__from: string[30];
  32.     stantion__to: string[15];
  33.     time__from: string[10];
  34.     time__to: string[10];
  35.     ticket__price: string[10];
  36.   End;
  37.   Ukaz = ^Query;{Описание указателя на элемент очереди}
  38.   Query = Record
  39.     Inf: Data;
  40.     Next: Ukaz
  41.   End;
  42.  
  43. var
  44.   NewE, Left, Right, Temp: Ukaz; {Указатели}
  45.   Z: Data; {Запись, добавляемая в очередь}
  46.   Key: Char;{номер пункта меню программы}
  47.   exit_: integer;
  48. ////////////////////////////////////////////////
  49. procedure Org;{Процедура записи данных о поезде}
  50. begin
  51.   Writeln('Выполняется процедура записи данных о поезде');
  52.   Writeln('Для выхода из процедуры вводите символ * ');
  53.   Writeln('======================================== ');
  54.   Writeln('Введите номер поезда');
  55.   Readln(Z.N__train);
  56.   if Z.N__train = '' Then Exit; {Выход из процедуры при вводе ''}
  57.   Writeln('Введите адрес отправления ');
  58.   Readln(Z.stantion__from);
  59.   if Z.stantion__from = '' Then Exit; {Выход из процедуры при вводе ''}
  60.   Writeln('Введите адрес пребывания');
  61.   Readln(Z.stantion__to);
  62.   if Z.stantion__to = '' Then Exit; {Выход из процедуры при вводе ''}
  63.   Writeln('Введите время отправления');
  64.   Readln(Z.time__from);
  65.   if Z.time__from = '' Then Exit; {Выход из процедуры при вводе ''}
  66.   Writeln('Введите время пребывания');
  67.   Readln(Z.time__to);
  68.   if Z.time__to = '' Then Exit; {Выход из процедуры при вводе ''}
  69.   Writeln('Введите цена билета');
  70.   Readln(Z.ticket__price);
  71.   if Z.ticket__price = '' Then Exit; {Выход из процедуры при вводе ''}
  72.   New(NewE); {Создание нового элемента }
  73.   NewE^.Inf.N__train := Z.N__train; {Заполнение его полей }
  74.   NewE^.Inf.stantion__from := Z.stantion__from;
  75.   NewE^.Inf.stantion__to := Z.stantion__to;
  76.   NewE^.Inf.time__from := Z.time__from;
  77.   NewE^.Inf.time__to := Z.time__to;
  78.   NewE^.Inf.ticket__price := Z.ticket__price;
  79.   NewE^.Next := nil;
  80.   Right := NewE; { Right - указатель хвоста очереди }
  81.   Left := NewE;{ Left - указатель головы очереди }
  82.   while True Do {Повторение этих же действий }
  83.   begin
  84.     Writeln('Выполняется процедура записи данных о поезде');
  85.     Writeln('Для выхода из процедуры вводите символ * ');
  86.     Writeln('======================================== ');
  87.     Writeln('Введите номер поезда');
  88.     Readln(Z.N__train);
  89.     if Z.N__train = '*' Then Exit; {Выход из процедуры при вводе ''}
  90.     Writeln('Введите адрес отправления ');
  91.     Readln(Z.stantion__from);
  92.     if Z.stantion__from = '*' Then Exit; {Выход из процедуры при вводе ''}
  93.     Writeln('Введите адрес пребывания');
  94.     Readln(Z.stantion__to);
  95.     if Z.stantion__to = '*' Then Exit; {Выход из процедуры при вводе ''}
  96.     Writeln('Введите время отправления');
  97.     Readln(Z.time__from);
  98.     if Z.time__from = '*' Then Exit; {Выход из процедуры при вводе ''}
  99.     Writeln('Введите время пребывания');
  100.     Readln(Z.time__to);
  101.     if Z.time__to = '*' Then Exit; {Выход из процедуры при вводе ''}
  102.     Writeln('Введите цена билета');
  103.     Readln(Z.ticket__price);
  104.     if Z.ticket__price = '*' Then Exit; {Выход из процедуры при вводе ''}
  105.     New(NewE); {Создание нового элемента }
  106.     NewE^.Inf.N__train := Z.N__train; {Заполнение его полей }
  107.     NewE^.Inf.stantion__from := Z.stantion__from;
  108.     NewE^.Inf.stantion__to := Z.stantion__to;
  109.     NewE^.Inf.time__from := Z.time__from;
  110.     NewE^.Inf.time__to := Z.time__to;
  111.     NewE^.Inf.ticket__price := Z.ticket__price;
  112.     NewE^.Next := nil;
  113.     Right^.Next := NewE; {Связь с предыдущим элементом}
  114.     Right := NewE{Перемещение указателя хвоста очереди}
  115.   end
  116. end;
  117. /////////////////////////////////////////////////////
  118. procedure Dob;{Добавление элемента в конец очереди}
  119. begin
  120.   Writeln('Введите номер поезда');
  121.   Readln(Z.N__train);
  122.   if Z.N__train = '*' Then Exit; {Выход из процедуры при вводе ''}
  123.   Writeln('Введите адрес отправления ');
  124.   Readln(Z.stantion__from);
  125.   if Z.stantion__from = '*' Then Exit; {Выход из процедуры при вводе ''}
  126.   Writeln('Введите адрес пребывания');
  127.   Readln(Z.stantion__to);
  128.   if Z.stantion__to = '*' Then Exit; {Выход из процедуры при вводе ''}
  129.   Writeln('Введите время отправления');
  130.   Readln(Z.time__from);
  131.   if Z.time__from = '*' Then Exit; {Выход из процедуры при вводе ''}
  132.   Writeln('Введите время пребывания');
  133.   Readln(Z.time__to);
  134.   if Z.time__to = '*' Then Exit; {Выход из процедуры при вводе ''}
  135.   Writeln('Введите цена билета');
  136.   Readln(Z.ticket__price);
  137.   if Z.ticket__price = '*' Then Exit; {Выход из процедуры при вводе ''}
  138.   New(NewE); {Создание нового элемента }
  139.   NewE^.Inf.N__train := Z.N__train; {Заполнение его полей }
  140.   NewE^.Inf.stantion__from := Z.stantion__from;
  141.   NewE^.Inf.stantion__to := Z.stantion__to;
  142.   NewE^.Inf.time__from := Z.time__from;
  143.   NewE^.Inf.time__to := Z.time__to;
  144.   NewE^.Inf.ticket__price := Z.ticket__price;
  145.   NewE^.Next := nil;
  146.   if Right = nil Then {Если добавляется первый элемент, то}
  147.     Left := NewE {инициализировать указатель головы}
  148.   Else
  149.     Right^.Next := NewE; {иначе добавить в конец очереди}
  150.   Right := NewE;
  151. end;
  152. /////////////////////////////////////////////////////
  153. procedure Prokrutka;{Добавление первого элемента в конец очереди и удаление первого}
  154. var
  155.   i, n: integer;
  156. begin
  157.   Writeln('Введите номер для перемещения его в начало списка путем смещения всех элементов');
  158.   Readln(n);
  159.   i := 1;
  160.   while  i <> n Do
  161.   begin
  162.     Temp := Left;
  163.     New(NewE); {Создание нового элемента }
  164.     NewE^.Inf.N__train := Temp^.Inf.N__train; {Заполнение его полей }
  165.     NewE^.Inf.stantion__from := Temp^.Inf.stantion__from;
  166.     NewE^.Inf.stantion__to := Temp^.Inf.stantion__to;
  167.     NewE^.Inf.time__from := Temp^.Inf.time__from;
  168.     NewE^.Inf.time__to := Temp^.Inf.time__to;
  169.     NewE^.Inf.ticket__price := Temp^.Inf.ticket__price;
  170.     NewE^.Next := nil;
  171.     if Right = nil Then {Если добавляется первый элемент, то}
  172.       Left := NewE {инициализировать указатель головы}
  173.     Else
  174.       Right^.Next := NewE; {иначе добавить в конец очереди}
  175.     Right := NewE;
  176.     if Left <> nil Then {Если очередь не пустая, то}
  177.     begin
  178.       Temp := Left; {запоминаем указатель на голову очереди}
  179.       Left := Left^.Next; {указатель головы смещаем на 2-ой элемент}
  180.       Dispose(Temp); {oсвобождаем память от головного элемента}
  181.       if Left = nil Then {Если удалили последний элемент, то}
  182.         Right := nil; {указатель на конец очереди равен Nil}
  183.     end;
  184.     i := i + 1;
  185.   end;
  186. end;
  187. ///////////////////////////////////////////////////////
  188. procedure Udal;{Процедура исключения элемента}
  189. begin
  190.   Writeln('Исключается головной элемент очереди');
  191.   Writeln('Нажмите клавишу Enter');
  192.   Readln;
  193.   if Left <> nil Then {Если очередь не пустая, то}
  194.   begin
  195.     Temp := Left; {запоминаем указатель на голову очереди}
  196.     Left := Left^.Next; {указатель головы смещаем на 2-ой элемент}
  197.     Dispose(Temp); {oсвобождаем память от головного элемента}
  198.     if Left = nil Then {Если удалили последний элемент, то}
  199.       Right := nil; {указатель на конец очереди равен Nil}
  200.   end
  201. end;
  202. ///////////////////////////////////////////////////////
  203. procedure Prosmotr;{Процедура просмотра очереди}
  204. var
  205.   i: integer;{Просмотр выполняется от головы к хвосту}
  206. begin
  207.   Writeln('Список содержит следующие элементы:');
  208.   Temp := Left;
  209.   i := 1;
  210.   while Temp <> nil Do
  211.   begin
  212.     Writeln(i, ' ', Temp^.Inf.N__train, ' ', Temp^.Inf.stantion__from, ' ', Temp^.Inf.stantion__to
  213.     , ' ', Temp^.Inf.time__from, ' ', Temp^.Inf.time__to, ' ', Temp^.Inf.ticket__price);
  214.     Temp := Temp^.Next;
  215.     i := i + 1;
  216.   end;
  217.   Writeln('Нажмите клавишу Enter');
  218.   Readkey;
  219. end;
  220. ////////////////////////////////////////////////////////
  221. procedure exit__procedure;{Процедура просмотра очереди}
  222. begin
  223.   Writeln('Введите 1 для очистки памяти и выхода из программы');
  224.   Writeln('Введите 0 ENTER чтобы продолжить изменять список');
  225.   if  NewE <> nil then Writeln('Память  NewE не очищена');
  226.   Readln(exit_);
  227.   if exit_ = 1 then
  228.   begin
  229.     Dispose(NewE);
  230.     if  NewE = nil then Writeln('Память  NewE пуста');
  231.     NewE := nil;
  232.   end;
  233. end;
  234. ///////////////////////////////////////////////////////    
  235. procedure read__procedure;{Процедура чтения фаила 7}
  236. var
  237.   f: text;
  238.   s: string;
  239. begin
  240.   Assign(f, 'input.txt');
  241.   Reset(f);
  242.   Writeln('');
  243.   while not Eof(f) do
  244.   begin
  245.     readln(f, s);
  246.     writeln(s);
  247.   end;
  248.   Writeln('');
  249.   Writeln('Нажмите enter для продолжения');
  250.   Readln;
  251.   Close(f);
  252. end;
  253. ////////////////////////////////////////////////////////
  254. procedure wtite__procedure;{Процедура записи в фаил 6}
  255. var
  256.   f: text;
  257.   //s: string;
  258.   i: integer;{Запись выполняется от головы к хвосту}
  259. begin
  260.   Temp := Left;
  261.   i := 1;
  262.   while Temp <> nil Do
  263.   begin
  264.     Assign(f, 'input.txt');
  265.     Append(f);
  266.     Write(f, i:4);    
  267.     Write(f, Temp^.Inf.N__train:4);  
  268.     Write(f, Temp^.Inf.stantion__from:4);  
  269.     Write(f, Temp^.Inf.stantion__to:4);  
  270.     Write(f, Temp^.Inf.time__from:4);  
  271.     Write(f, Temp^.Inf.time__to:4);  
  272.     Write(f, Temp^.Inf.ticket__price:4);  
  273.     Writeln(f, '');
  274.     Temp := Temp^.Next;
  275.     Close(f);
  276.     i := i + 1;
  277.   end;
  278.   Temp := Left;
  279.   if Temp <> nil then
  280.   begin
  281.     Assign(f, 'input.txt');
  282.     Append(f);
  283.     Writeln(f, '//////////////////////////////////////////////////////////////');
  284.     Close(f);
  285.     Writeln('Вы добавили запись Нажмите enter для продолжения');
  286.     Readln;
  287.   end;
  288. end;
  289. ////////////////////////////////////////////////////////
  290. {==============основная программа================}
  291. begin
  292.   Right := nil; Left := nil;
  293.   repeat
  294.     ClrScr; { очистка экрана }
  295.     {вывод на экран пунктов меню}
  296.     Writeln('1-Создание списка');
  297.     Writeln('2-Добавление элемента в список');
  298.     Writeln('3-Удаление элемента из списка');
  299.     Writeln('4-Просмотр списка');
  300.     Writeln('5-Переместить начало скиска в конец на n шагов');
  301.     Writeln('6-Запись списка в фиал');
  302.     Writeln('7-Вывод списка из файла');
  303.     Writeln('8-Выход и очистка памяти');
  304.     Writeln('-------------------------------');
  305.     Writeln('Нажмите клавишу от 1 до 5');
  306.     Key := ReadKey; {считывание кода нажатой клавиши}
  307.     case Key Of { вызов необходимой процедуры по номеру}
  308.       '1': Org;
  309.       '2': Dob;
  310.       '3': Udal;
  311.       '4': Prosmotr;
  312.       '5': Prokrutka;
  313.       '6': wtite__procedure;
  314.       '7': read__procedure;
  315.       '8': exit__procedure;
  316.     End;  
  317.    
  318.   until exit_ = 1;// exit;;
  319. end.
  320.  
  321.  
  322. 4. Тестовые примеры, которые предусматривают проверку корректности работы программы для пустых списков.
  323.  
  324. Делаем проверку нажимая для '2': Dob; '3': Udal;'4': Prosmotr;'5': Prokrutka, при пустых списках.
  325.  
  326.  
  327. 5. Выполнить отладку программы.
  328.  
  329. Процедура ввода данных:
  330. 1-Создание списка
  331. 2-Добавление элемента в список
  332. 3-Удаление элемента из списка
  333. 4-Просмотр списка
  334. 5-Переместить начало списка в конец на n шагов
  335. 6-Выход
  336. -------------------------------
  337. Нажмите клавишу от 1 до 5
  338. Выполняется процедура записи данных о поезде
  339. Для выхода из процедуры вводите символ *
  340. ========================================
  341. Введите номер поезда
  342. 1
  343. Введите адрес отправления
  344. Севастополь1
  345. Введите адрес пребывания
  346. Краснодар1
  347. Введите время отправления
  348. Час1
  349. Введите время пребывания
  350. час15
  351. Введите цена билета
  352. 2000р
  353. Выполняется процедура записи данных о поезде
  354. Для выхода из процедуры вводите символ *
  355. ========================================
  356. Введите номер поезда
  357. 2
  358. Введите адрес отправления
  359. Севастополь2
  360. Введите адрес пребывания
  361. Краснодар2
  362. Введите время отправления
  363. Час2
  364. Введите время пребывания
  365. час16
  366. Введите цена билета
  367. 2000р
  368. Выполняется процедура записи данных о поезде
  369. Для выхода из процедуры вводите символ *
  370. ========================================
  371. Введите номер поезда
  372. 3
  373. Введите адрес отправления
  374. Севастополь3
  375. Введите адрес пребывания
  376. Краснодар3
  377. Введите время отправления
  378. Час3
  379. Введите время пребывания
  380. час17
  381. Введите цена билета
  382. 2000р
  383. Выполняется процедура записи данных о поезде
  384. Для выхода из процедуры вводите символ *
  385. ========================================
  386. Введите номер поезда
  387. *
  388. Смотрим результат
  389. Нажмите клавишу от 1 до 5
  390. Список содержит следующие элементы:
  391. 11 Севастополь1 Краснодар1 Час1 час15 2000р
  392. 22 Севастополь2 Краснодар2 Час2 час16 2000р
  393. 33 Севастополь3 Краснодар3 Час3 час17 2000р
  394. Нажмите клавишу Enter
  395.  
  396. Процедура добавления данных:
  397. Введите номер поезда
  398. 4
  399. Введите адрес отправления
  400. Севастополь4
  401. Введите адрес пребывания
  402. Краснодар4
  403. Введите время отправления
  404. Час4
  405. Введите время пребывания
  406. час18
  407. Введите цена билета
  408. 2000р
  409.  
  410. Смотрим результат
  411. Нажмите клавишу от 1 до 5
  412. Список содержит следующие элементы:
  413. 11 Севастополь1 Краснодар1 Час1 час15 2000р
  414. 22 Севастополь2 Краснодар2 Час2 час16 2000р
  415. 33 Севастополь3 Краснодар3 Час3 час17 2000р
  416. 44 Севастополь4 Краснодар4 Час4 час18 2000р
  417. Нажмите клавишу Enter
  418.  
  419.  
  420. Процедура перемещения строк данных в списке :
  421. Нажмите клавишу от 1 до 5
  422. Введите номер для перемещения его в начало списка путем смещения всех элементов
  423. 4    
  424. Смотрим результат
  425. Нажмите клавишу от 1 до 5
  426. Список содержит следующие элементы:
  427. 14 Севастополь4 Краснодар4 Час4 час18 2000р
  428. 21 Севастополь1 Краснодар1 Час1 час15 2000р
  429. 32 Севастополь2 Краснодар2 Час2 час16 2000р
  430. 43 Севастополь3 Краснодар3 Час3 час17 2000р
  431. Нажмите клавишу Enter
  432.  
  433.  
  434. Процедура удаления данных:
  435. Нажмите клавишу от 1 до 5
  436. Исключается головной элемент очереди
  437. Нажмите клавишу Enter
  438. 1    
  439. Смотрим результат
  440. Список содержит следующие элементы:
  441. 11 Севастополь1 Краснодар1 Час1 час15 2000р
  442. 22 Севастополь2 Краснодар2 Час2 час16 2000р
  443. 33 Севастополь3 Краснодар3 Час3 час17 2000р
  444. Нажмите клавишу Enter
  445.  
  446. Процедура записи и чтения
  447. Расположение файла в корневой папке
  448.  
  449.  
  450. Вывод – в работе  изучил списковые структуры данных и приобрел навыки разработки и отладки программ построенных на списковых структурах. Программа может перемещать данные, строки внутри списка что расширяет возможности его форматирования и делает его более удобным для пользователя.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement