Форум программистов, компьютерный форум, киберфорум
PascalABC.NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/6: Рейтинг темы: голосов - 6, средняя оценка - 4.67
 Аватар для Tetriandox
2 / 1 / 1
Регистрация: 08.02.2019
Сообщений: 44

Программа пропускает readln()

26.12.2020, 17:54. Показов 1333. Ответов 3
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Вечер добрый. Написал небольшую программу по работе с односвязным списком, а именно очередью. Но у меня возникли некоторые трудности, а именно:
1. При добавлении элемента в конец списка процедура add_in_tail не срабатывает, я не могу даже ввести элемент как программа тут же возвращается в главное меню
2. При извлечении из очереди процедура pull первый раз не срабатывает, после чего работает как нужно
Код программы прилагаю
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
{4. Создать очередь. Извлечь из очереди заданную компоненту. Поставить в очередь новую компоненту на i–е место.}
uses crt;
type
qe = ^queue1;
queue1 = record
  data:char;
  next:qe;
end;
var
  head,q,tail:qe;
  g:byte;
procedure add_queue(var head,tail:qe);
  var y:qe;
      i:char;
   begin
     writeln('Введите любой символ для добавления его в очередь. Для окончания нажмите "."');
     while (i<>'.') do
       begin
        new(y);
        readln(i); 
        y^.data := i;
        y^.next := nil;
        if head = nil then
          head := y
        else
          tail^.Next := y;
        tail := y;
        end;
  end;
procedure add_in_tail(var head,tail:qe);
var u:qe;
    x : char;
    begin
      Writeln('Введите элемент');
      readln(x);
      new(u);
      u^.data := x;
      u^.next := nil;
      if head = nil then
          head := u
        else
          tail^.next := u;
        tail:=u;
    end;
 
procedure write_queue(var head:qe);
begin
   q:=head;
    while(q<>nil) do
    begin
      write(q^.data:3);
      q:=q^.next;
    end;
    readkey();
end;
procedure pull(var head:qe);
var i:char;
    u:qe;
  begin
   if head =nil then
     writeln('Очередь пуста')
   else
   begin
     i:=head^.data;
     u:= head;
     head :=head^.next;
     dispose(u);
   end;
   Writeln();
   Writeln('Извлеченная компонента: ',i);
   readkey();
  end;
  
  begin
    repeat
    clrscr;
    Writeln('Выберите действие');
    Writeln('1. Создать очередь'); 
    Writeln('2. Добавить элемент в очередь');
    Writeln('3. Извлечь элемент из очереди');
    Writeln('4. Вывести очередь на экран');
    read(g);
    case g of
      1: add_queue(head,tail);
      2: add_in_tail(head,tail);
      3: pull (head);
      4: write_queue(head);
      else exit;
    end;
    until not(g in [1..4]);
  end.
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
26.12.2020, 17:54
Ответы с готовыми решениями:

Почему программа пропускает readln?
program generator; type zap = record d1,d2: integer end; var i,n,k,j: integer; f1,f2,f3: text; s1,s2,ans,ans2:...

Программа пропускает строки
procedure TForm1.FormKeyPress(Sender: TObject; var Key: Char); var n, k:Integer; begin n:=0; k:=0; if Length(urok) &gt; 0 then ...

Программа пропускает cin >>
Программа состоит из 2 частей. В 1 ввод имени и числа, например &quot;anna 6&quot;, выйти из цикла можно через Ctrl+Z. Во 2 части она должна искать...

3
 Аватар для Sun Serega
2355 / 1458 / 526
Регистрация: 07.04.2017
Сообщений: 4,798
26.12.2020, 18:30
Лучший ответ Сообщение было отмечено Tetriandox как решение

Решение

Потому что read(g). Read без ln значит что вы читаете только 1 значение и оставляете указатель потока ввода сразу после этого числа. Поэтому, получается, что следующий символ в потоке ввода - знак переноса строки (или, ещё, там могут быть пробелы или вообще любой текст, который шёл после числа). А если добавить ln - после прочтения указатель в потоке ввода поставит После следующего знака переноса строки.

---

В остальном по коду:
1. Выкиньте нафиг crt и используйте класс Console. К примеру вместо readkey лучше использовать Console.ReadKey.

А если замените его на пустой Readln - то сможете использовать отладку. С ней вы могли бы увидеть что именно ваш readln(x); записывает в x.

2. Используйте классы вместо указателей на запись, для создания связных списков. Тогда про dispose можно забыть + полями, сохраняемыми в этом связном списке будут допустимы другие классы (как строки или массивы. компилируется и с ними, ради совместимости, но в любой момент может крашнуться с очень странной ошибкой).

3. Используйте локальные переменные вместо глобальных, доступ к локальным переменным быстрее чем к глобальным.

4. И не пытайтесь оптимизировать программу, объявляя числа меньше integer:
Цитата Сообщение от Tetriandox Посмотреть сообщение
g:byte;
От этого программа будет только медленнее. Переменные уже integer имеют смысл только при какой-либо упаковки значений, как в array of byte.
1
 Аватар для Tetriandox
2 / 1 / 1
Регистрация: 08.02.2019
Сообщений: 44
26.12.2020, 18:51  [ТС]
Sun Serega, Sun Serega, В очередной раз спасибо за подробный разбор кода)
Можете объяснить, почему вам модуль crt не нравится? Препод просто обычно все с ним делает.
0
 Аватар для Sun Serega
2355 / 1458 / 526
Регистрация: 07.04.2017
Сообщений: 4,798
26.12.2020, 18:57
Потому что crt это древний мусор. В PascalABC.Net он сам использует класс Console, но предоставляет меньше 10% его функционала.
А добавлен он только для совместимости со старыми диалектами паскалевых: чтоб преподаватели, не способные обучится новому, не боялись данного паскаля.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
26.12.2020, 18:57
Помогаю со студенческими работами здесь

Программа пропускает цикл
Bitmap image = new Bitmap(imageFile); Bitmap outputImage = new Bitmap(image.Width, image.Height); int i = 0, j = 0; Color color; ...

Программа пропускает анимацию
Есть 3 анимации: 1.Влево. 2.Влево-вверх. 3.Влево-вниз. При назатии и удержании клавиши &quot;влево&quot; проигрывается 1-я...

Программа пропускает scanf
Доброго времени суток! Подскажите почему в программа пропускает scanf int pole; char sear; int i; ...

Программа пропускает cin
Уже несколько раз сталкивался с проблемами функции &quot;cin&quot; по задумке, в моей программе, он должен ожидать ввода цифры, а после выполнять...

программа пропускает строку
Бодрого времени суток! Имеем: я(самоучка) - уровень &quot;днище&quot; + много желания развиваться, учебник по с++, задача(условие ниже), мое...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Новые блоги и статьи
Программный контроль заполнения реквизита табличной части документа
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: реализовать контроль заполнения реквизита "ПричинаСписания". . .
wmic не является внутренней или внешней командой
Maks 02.04.2026
Решение: DISM / Online / Add-Capability / CapabilityName:WMIC~~~~ Отсюда: https:/ / winitpro. ru/ index. php/ 2025/ 02/ 14/ komanda-wmic-ne-naydena/
Программная установка даты и запрет ее изменения
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: при создании документов установить период списания автоматически. . .
Вывод данных в справочнике через динамический список
Maks 01.04.2026
Реализация из решения ниже выполнена на примере нетипового справочника "Спецтехника" разработанного в конфигурации КА2. Задача: вывести данные из ТЧ нетипового документа. . .
Программное заполнения текстового поля в реквизите формы документа
Maks 01.04.2026
Алгоритм из решения ниже реализован на нетиповом документе "ВыдачаОборудованияНаСпецтехнику" разработанного в конфигурации КА2, в дополнении к предыдущему решению. На форме документа создается. . .
К слову об оптимизации
kumehtar 01.04.2026
Вспоминаю начало 2000-х, университет, когда я писал на Delphi. Тогда среди программистов на форумах активно обсуждали аккуратную работу с памятью: нужно было следить за переменными, вовремя. . .
Идея фильтра интернета (сервер = слой+фильтр).
Hrethgir 31.03.2026
Суть идеи заключается в том, чтобы запустить свой сервер, о чём я если честно мечтал давно и давно приобрёл книгу как это сделать. Но не было причин его запускать. Очумелые учёные напечатали на. . .
Модель здравосоХранения 6. ESG-повестка и устойчивое развитие; углублённый анализ кадрового бренда
anaschu 31.03.2026
В прикрепленном документе раздумья о том, как можно поменять модель в будущем
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru