Модернизировать программу (Списки) - закончить ввод по нажатию клавиши - Turbo Pascal
Формулировка задачи:
Доброго времени суток!
Помогите пожалуйста улучшить программу для работы со списками.
Эта программа предназначена для ввода и обработки
n
элементов списка. Сначала задается числоn
элементов, затем начинается вводn
элементов. Нужно переделать ее так чтобы при нажатии определенной клавиши введение элементов заканчивалось.Буду благодарен за помощь!
(спасибо ZX Spectrum-128, который уже помогал с этой программой)
Решение задачи: «Модернизировать программу (Списки) - закончить ввод по нажатию клавиши»
textual
Листинг программы
program spisok; uses crt; type uk=^rec; rec = record fio : string[15]; {ФИО пациента} davl : integer; {давление} v : uk {указатель на следующую запись} end; var tek, pred, perv, rab : uk; {указатели на бегущую, предыдущую, первую, рабочую запись} n,k : integer; ch:char; begin {введение n записей пациентов} // write ('Введите количество пациентов: '); readln (n); k:=1; new (tek); {выделение памяти} write ('Введите фамилию ',k,'-го пациента: '); readln (tek^.fio); write ('Введите давление: '); readln (tek^.davl); tek^.v := nil; {следующей записи пока нет} pred:=tek; perv:=tek; while ch<>#27 do // for k:=2 to n do begin inc(k); new (tek); {выделение памяти} pred^.v := tek; write ('Введите фамилию ',k,'-го пациента: '); readln (tek^.fio); write ('Введите давление: '); readln (tek^.davl); tek^.v:=nil; {следующей записи пока нет} pred:=tek; ch:=readkey; end; {удаление записей пациентов с давлением более 140} tek:=perv; {указатель на начало списка} pred:=nil; {предыдущией записи пока нет} while tek<>nil do begin if tek^.davl>140 then begin rab:=tek; if tek<>perv then pred^.v:=tek^.v else perv:=tek^.v; if tek^.v=nil then {запись последняя} if tek<>perv then {список не пуст} pred^.v:=nil else {список пуст} perv:=nil; dispose (rab); end else pred:=tek; {переставляем указатель предварительной записи, если бегущую запись не удаляли} tek:=tek^.v; {переход к следующей записи} end; {вывод оставшихся записей} writeln ('Вывод записей оставшихся в списке'); if perv<>nil then {список не пуст} begin tek:=perv; while tek<>nil do begin writeln('Фамилия ',tek^.fio,' давление ', tek^.davl); tek:=tek^.v {переход к следующей записи} end end; readln; end.
Объяснение кода листинга программы
- Создается тип данных
uk
, который представляет собой запись с полямиfio
(строка ФИО пациента),davl
(число давления) иv
(указатель на следующую запись). - Создается переменная
tek
типаuk
, которая будет использоваться для выделения памяти под новую запись. - Создаются три указателя
tek
,pred
иperv
, которые будут использоваться для отслеживания предыдущей, текущей и первой записи в списке. - Создается переменная
n
, которая будет использоваться для хранения количества пациентов. - Создается переменная
ch
, которая будет использоваться для чтения символа из консоли. - Запускается цикл while, который будет выполняться до тех пор, пока значение
ch
не станет равным #27 (конец ввода). - Внутри цикла создается новая переменная
tek
типаuk
. - Вводится информация о пациенте: ФИО и давление. Информация записывается в переменную
tek
. - Указатель
tek
устанавливается в значениеnil
, чтобы указать, что следующей записи пока нет. - Указатель
pred
устанавливается в значениеtek
, а указательperv
устанавливается в значениеtek
. - Если значение
ch
не равно #27, то выполняется цикл for, который будет выполняться для каждого пациента от 2 доn
. - Внутри цикла for создается новая переменная
tek
типаuk
. - Вводится информация о пациенте: ФИО и давление. Информация записывается в переменную
tek
. - Указатель
tek
устанавливается в значениеnil
, чтобы указать, что следующей записи пока нет. - Указатель
pred
устанавливается в значениеtek
, а указательperv
устанавливается в значениеtek
. - Если значение
ch
не равно #27, то выполняется цикл while, который будет выполняться до тех пор, пока значениеtek
не станет равнымnil
. - Если значение
tek
равноnil
, то выполняется код для удаления записей пациентов с давлением более 140. - После выполнения всех операций с памятью, указатели
tek
,pred
иperv
должны быть установлены в значениеnil
. - Выводится информация о записях, которые остались в списке.
- Программа завершается, вызывая функцию readln.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д