Помощь - Поиск - Пользователи - Календарь
Полная версия: Где результат?
Форум «Всё о Паскале» > Pascal, Object Pascal > Теоретические вопросы
Balhash
М
Пользуемся тегами


Пишу пргу:
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
Жмешь Alt+F5 и смотришь на результат ...
Tan
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
Tan, и что?

smile.gif Не заметил, что в программе 2 раза вводится число + Enter? Не поможет тут Readln... Сам догадаешься, почему, или подсказать?
Tan
Я наверно не тем голову забил, но кроме ковычки в предыдущем своём посте, я больше ничего не заметил =)
volvo
Ты проверял, КАК твой код работает? Вот попробуй его запустить, и потом расскажи, ПОЧЕМУ так происходит... Ты же написал ReadLn, почему программа НЕ ждет нажатия на Enter, а завершается сразу же?
Tan
не знаю как в БП7, я компилировал на Pascal ABC, у меня ожидает ввода данных, могу print screen кинуть.
volvo
Я не знаю, что это Pascal ABC - этот раздел не для экзотики, а для стандартного Паскаля...

P.S.
Вопрос к автору: каким компилятором пользуешься?
Tan
Верное замечание, впредь буду компилить под стандартным, ситуацию спасают 2 readln, но почему, не понял =) Можно объяснить ?
Lapp
Цитата(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
Спасибо Lapp, для меня ты вполне доступно объяснил, я всё уловил, только сейчас вспомнил, что такое у меня случалось раньше и довольно часто, но я по разному от этого уходил (в том числе и 2йным Readln, ведь тогда я не знал причину этой штуки).
Cherynka
Проблема решается добавлением вместо Readln в конце программы такой строчки:
 repeat until keypressed;

Хотя данные все-равно лучше вводить с переходом на новую строку
volvo
Цитата
Проблема решается
Резонно возникает вопрос - а чем ЭТО лучше чем ReadLn? Преимущество в чем? Вот недостаток я вижу: я ОБЯЗАН подключить CRT, чего не требуется с ReadLn, а преимущества где?
Cherynka
Я не говорю про преимущества, я говорю про альтернативу. В данном же случае одного Readln мало, уже два надо. А если переменных больше, а переход на другую строку не сделан, тогда сколько readlnов понадобится?
З.Ы. Я не претендую на идеальность этого варианта
volvo
Цитата
тогда сколько readlnов понадобится?
Максимум 2... Объяснить?
Cherynka
Видимо да. Хотя я сама с такой ситуацией не сталкивалась - не идет один ReadLn, тогда пользуюсь вышеуказанным циклом
Sto
Как альтернатива, можно вот так
...
readln(y);
s:=x+y;
write('сумма равна',s);
readln;
end.
Cherynka
Логично. Вот только не пойму, почему вы так категорично отнеслиськ моему варианту? nea.gif
Tan
Просто вышеперечисленная дискуссия к которой вы присоединились не носила характера как от этого избавиться (я даже до поста Lapp без проблем бы обошёл эту проблему, мы просто говорили почему она возникла). Cherynka, ответ на твой пост, а зачем лишний модуль в программе ? К тому же если автор вопроса выложил исходник, надо быть максимально близким к нему в решении и рекомендациях. Можно и ассемблером обойти эту проблему, но в данной ситуации надо ли это ?
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.