Болталка PascalABC.NET

Народ в паскаль.

БОльшая часть защит в программировании — это защита от дурака

Дуракам паскаль не писан.

А Питон?

Я вчера понял, откуда у Ван Россума взялась идея отступы делать. Он нагляделся на диаграммы Насси - Шнайдермана!

Хитрый Шнайдерман оказался Шнейдерманом. Ну тут ваще не похоже. Скорее, Ван Россум, судя по его гееграфическому положению, обкурился. Но мы не привыкли отступать - покажем питонистам едрёну нашу мать.

Возвращаясь к самому себе, настаиваю, что я имел в виду паскаль, а не Питон. А Питон - да, это клинический случай. Питонистам место рядом с Наполеоном, которому тоже пришлось спешно отступать.

original

Решил с дочкой позаниматься.

Написали небольшую программку.

PROGRAM prg(prg);
VAR C,D : STRING;
VAR A,B,P : INTEGER;

begin
  D:='N';
  WHILE D='N' DO
BEGIN
  READ(D); // В этом месте чтение с клавиатуры строки еще работает
  C:='Введите длину прямоугольника ';
  WRITE (C);
  READLN (A);
  C:='Введите высоту прямоугольника ';
  WRITE (C);
  READ (B);
  P:=(A+B)*2;
  C:='Периметр прямоугольника равен ';
  WRITE (C);
  WRITELN(P);
  C:='Завершить работу программы? N - Нет  Y - Да';
  WRITELN (C);
  READ(D); // Здесь уже не работает
  end;

END.

Screenshot_3

Напишите код так:

```
код
```

Знак ` находится в англ раскладке за Ё

А от скрина не лучше, код нужен чтоб тестировать.

А впрочем нет, всё понятно.

Допустим вот есть текст на вводе:

123\n
456

(\n это перенос строки) Когда вы прочитали число - вы забрали из ввода 3 цифры. Но там всё ещё остался перенос строки. Из за него, если дальше прочитать string - получите пустую строку, потому что её читает до конца строки.

Используйте Readln. Он, после прочтения значения, убирает из ввода все символы до переноса строки включительно.

 C:='Завершить работу программы? N - Нет  Y - Да';
  WRITELN (C);
  READLN(D); 

Поправил все равно не работает, пролетает мимо без опроса клавиатуры.

Вставляйте код в ```, глазам больно. И внимательно прочитайте моё объяснение, потому что вы вообще не то исправили.

Все заработало, Спасибо!!!

Заменил везде READ на READLN заработало.

Спасибо еще раз.

Старый код, неэффективное использование. Попробуйте все же воспользоваться выложенной на сайте литературой.

Было бы не плохо. Буду очень благодарен если скинете ссылку на литературу, что бы долго не искать.

Заходите на http://pascalabc.net и слева видите кнопку “Книги по PascalABC.NET”.

На главной странице вообще ещё полно интересного.

На официальном сайте есть целый раздел

Спасибо, за оказанную помощь!!!

Добрый вечер!!!
Решил с дочкой позаниматься. Написали следующий код

BEGIN

VAR D : STRING := 'N'; 
VAR (A,B,P):=(0,0,0);

  WHILE D='N' DO
  begin
    
    CONSOLE.Write('Введите длину прямоугольника ');
    while not TryRead(A) do
    Println('Неверный ввод. Повторите');
       
    CONSOLE.Write('Введите высоту прямоугольника ');
    while not TryRead(B) do
    PrintLn ('Неверный ввод. Повторите');
      
    P:=(A+B)*2;
    CONSOLE.WriteLine('Периметр прямоугольника равен '+ P);
    CONSOLE.Write('Завершить работу программы? N - Нет  Y - Да ');
    D:=CONSOLE.ReadLine(); //Пришлось добавить, что бы закрыть старый поток
    D:=CONSOLE.ReadLine();
    CONSOLE.Clear();
  end;

END. ```

В конце пришлось написать одну и туже команду два раза, чтобы закрыть поток. Иначе чтение с клавиатуры пролетает мимо. 
Вопрос - можно это исправить как то по другому?

Удивительно. Сначала Вы упорно рветесь для чего-то работать через консоль (“Мы не ищем легких путей!”), а затем ищете способ эту консоль закрыть… Вы уверены, что TryRead чистят буфер? А если нет - Вы снова наступили на все те же грабли с чтением символьных переменных и строк.

Согласен, наступили на те же грабли. Функция TryRead понравилась хотели попробовать её использовать. Помня прошлое сразу сообразили в чем дело, но к сожалению функции TryReadLine не существует. Я же правильно понимаю???

@Slava213406, вы не теми кавычками код выделяете. Надо использовать ```, эти смволы находятся за ё в англ. раскладке.

А зачем вам? TryRead всё равно срабатывает только на Enter. В теории можно несколько чисел через пробел ввести. Но и так работать будет, только криво выведет запросы ввода.

Ещё - зачем вы используете CONSOLE.Write? Тут обычное Write с тем же успехом подойдёт. Ну и конкретно тут - лучше строку-приглашение передавать в TryRead, вторым параметром.

И старайтесь объявлять переменные не в начале программы, а перед первым использованием.