Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Теоретические вопросы _ Где результат?

Автор: Balhash 2.05.2007 21:48

М
Пользуемся тегами


Пишу пргу:

program sum;
var
x,y,s:integer;
write('введите 1е сагаемое);
read(x);
write('введите 2е слагаемое');
read(y);
s:=x+y;
write('сумма равна',s);
end.

Компилирую, запускаю, ввожу 1е нажимаю ввод, ввожу 2е нажимаю ввод и wacko.gif .
А где результат?

Автор: volvo 2.05.2007 21:58

Жмешь Alt+F5 и смотришь на результат ...

Автор: Tan 2.05.2007 22:01

program sum;
var
x,y,s:integer;
begin {<----}
write('введите 1е сагаемое');
read(x);
write('введите 2е слагаемое');
read(y);
s:=x+y;
write('сумма равна',s);
readln;{<----}
readln;
end.

Автор: volvo 2.05.2007 22:03

Tan, и что?

smile.gif Не заметил, что в программе 2 раза вводится число + Enter? Не поможет тут Readln... Сам догадаешься, почему, или подсказать?

Автор: Tan 2.05.2007 22:10

Я наверно не тем голову забил, но кроме ковычки в предыдущем своём посте, я больше ничего не заметил =)

Автор: volvo 2.05.2007 22:12

Ты проверял, КАК твой код работает? Вот попробуй его запустить, и потом расскажи, ПОЧЕМУ так происходит... Ты же написал ReadLn, почему программа НЕ ждет нажатия на Enter, а завершается сразу же?

Автор: Tan 2.05.2007 22:15

не знаю как в БП7, я компилировал на Pascal ABC, у меня ожидает ввода данных, могу print screen кинуть.

Автор: volvo 2.05.2007 22:19

Я не знаю, что это Pascal ABC - этот раздел не для экзотики, а для стандартного Паскаля...

P.S.
Вопрос к автору: каким компилятором пользуешься?

Автор: Tan 2.05.2007 22:22

Верное замечание, впредь буду компилить под стандартным, ситуацию спасают 2 readln, но почему, не понял =) Можно объяснить ?

Автор: Lapp 3.05.2007 0:16

Цитата(Tan @ 2.05.2007 19:22) *

Можно объяснить ?

Извиняюсь за вторжение.. не могу удержаться - вопрос уж очень приятный smile.gif

Это плата за простоту идеологии ввода, используемой в Read и ReadLn (Read имеется в виду для файлов типа text!). В простых случаях все работает, как ожидается, но в некоторых случаях возможны накладки..
Твой первый ReadLn уходит на съедение Enter'а, завершающего ввод y.
Ситуацию легко исправить, если использовать для ввода х и у не Read, а ReadLn. Собственно, это и есть тот способ ввода, который предполагается при работе с текстовыми файлами (упрощенно выражаясь smile.gif). Отдельная операция ввода - это всегда ввод строки (в которой может быть несколько чисел). И если эта строка вводилась Read'ом, то завершающий ее Enter обычно просто как бы игнорируется - если не поставить за ним ReadLn, что ты и сделал smile.gif. ReadLn же без параметров просто переходит к новой строке, пропуская конец текущей.
Первый ReadLn очистил буфер, второй выполнил задержку.

PS
Н-да, простого объяснения не вышло.. wacko.gif

Автор: Tan 3.05.2007 0:29

Спасибо Lapp, для меня ты вполне доступно объяснил, я всё уловил, только сейчас вспомнил, что такое у меня случалось раньше и довольно часто, но я по разному от этого уходил (в том числе и 2йным Readln, ведь тогда я не знал причину этой штуки).

Автор: Cherynka 9.05.2007 23:38

Проблема решается добавлением вместо Readln в конце программы такой строчки:

 repeat until keypressed;

Хотя данные все-равно лучше вводить с переходом на новую строку

Автор: volvo 9.05.2007 23:48

Цитата
Проблема решается
Резонно возникает вопрос - а чем ЭТО лучше чем ReadLn? Преимущество в чем? Вот недостаток я вижу: я ОБЯЗАН подключить CRT, чего не требуется с ReadLn, а преимущества где?

Автор: Cherynka 9.05.2007 23:57

Я не говорю про преимущества, я говорю про альтернативу. В данном же случае одного Readln мало, уже два надо. А если переменных больше, а переход на другую строку не сделан, тогда сколько readlnов понадобится?
З.Ы. Я не претендую на идеальность этого варианта

Автор: volvo 9.05.2007 23:59

Цитата
тогда сколько readlnов понадобится?
Максимум 2... Объяснить?

Автор: Cherynka 10.05.2007 0:11

Видимо да. Хотя я сама с такой ситуацией не сталкивалась - не идет один ReadLn, тогда пользуюсь вышеуказанным циклом

Автор: Sto 10.05.2007 1:09

Как альтернатива, можно вот так

...
readln(y);
s:=x+y;
write('сумма равна',s);
readln;
end.

Автор: Cherynka 10.05.2007 1:25

Логично. Вот только не пойму, почему вы так категорично отнеслиськ моему варианту? nea.gif

Автор: Tan 10.05.2007 1:36

Просто вышеперечисленная дискуссия к которой вы присоединились не носила характера как от этого избавиться (я даже до поста Lapp без проблем бы обошёл эту проблему, мы просто говорили почему она возникла). Cherynka, ответ на твой пост, а зачем лишний модуль в программе ? К тому же если автор вопроса выложил исходник, надо быть максимально близким к нему в решении и рекомендациях. Можно и ассемблером обойти эту проблему, но в данной ситуации надо ли это ?