Модернизировать программу (Списки) - закончить ввод по нажатию клавиши - 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.

Объяснение кода листинга программы

  1. Создается тип данных uk, который представляет собой запись с полями fio (строка ФИО пациента), davl (число давления) и v (указатель на следующую запись).
  2. Создается переменная tek типа uk, которая будет использоваться для выделения памяти под новую запись.
  3. Создаются три указателя tek, pred и perv, которые будут использоваться для отслеживания предыдущей, текущей и первой записи в списке.
  4. Создается переменная n, которая будет использоваться для хранения количества пациентов.
  5. Создается переменная ch, которая будет использоваться для чтения символа из консоли.
  6. Запускается цикл while, который будет выполняться до тех пор, пока значение ch не станет равным #27 (конец ввода).
  7. Внутри цикла создается новая переменная tek типа uk.
  8. Вводится информация о пациенте: ФИО и давление. Информация записывается в переменную tek.
  9. Указатель tek устанавливается в значение nil, чтобы указать, что следующей записи пока нет.
  10. Указатель pred устанавливается в значение tek, а указатель perv устанавливается в значение tek.
  11. Если значение ch не равно #27, то выполняется цикл for, который будет выполняться для каждого пациента от 2 до n.
  12. Внутри цикла for создается новая переменная tek типа uk.
  13. Вводится информация о пациенте: ФИО и давление. Информация записывается в переменную tek.
  14. Указатель tek устанавливается в значение nil, чтобы указать, что следующей записи пока нет.
  15. Указатель pred устанавливается в значение tek, а указатель perv устанавливается в значение tek.
  16. Если значение ch не равно #27, то выполняется цикл while, который будет выполняться до тех пор, пока значение tek не станет равным nil.
  17. Если значение tek равно nil, то выполняется код для удаления записей пациентов с давлением более 140.
  18. После выполнения всех операций с памятью, указатели tek, pred и perv должны быть установлены в значение nil.
  19. Выводится информация о записях, которые остались в списке.
  20. Программа завершается, вызывая функцию readln.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

11   голосов , оценка 3.818 из 5
Похожие ответы