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

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

Форум «Всё о Паскале» _ Задачи _ Read

Автор: sheka 28.09.2010 22:35

Заполнить массив так, чтобы вводимые элементы располагались на одной строчке экрана.
Всегда пользовался Readln, т.к. он работает почему-то так же как и Read.
Препод рассказывает, что типо не так.
Как это можно осуществить без СRT?

Добавлено через 14 мин.
Ну строку разделять на числа - тоже не вариант lol.gif

Автор: volvo 28.09.2010 23:07

Цитата
Всегда пользовался Readln, т.к. он работает почему-то так же как и Read.
Неправда. Они работают по-разному. Read не переходит к следующей строке входного файла после прочтения данных.

var
a: array[1 .. 10] of integer;
x: integer;
i, j: integer;
begin
i := 0;
while not eoln do
begin
read(X);
inc(i);
a[i] := X;
end;

for j := 1 to i do
write(a[j]:4);
writeln;
end.
читает столько чисел, сколько есть, до конца строки. Главное - чтоб не вылететь за границы массива.

Автор: sheka 29.09.2010 3:23

С файлами вопросов нет (Обманул, именно в этих целях пользовался smile.gif).

Меня интересует именно экран при вводе данных.

for i := 1 to 2 do read(a[i])

ничем не отличается от
for i := 1 to 2 do readln(a[i])


Автор: Lapp 29.09.2010 3:26

Цитата(sheka @ 28.09.2010 19:35) *
Заполнить массив так, чтобы введеные элементы располагались на одной строчке экрана.
Sheka, "введенные" или "вводимые"?
В смысле - ввод в одной строке? Ты все же ставь задачу точнее. Я не придираюсь. Тут было как-то хоть ясно из контекста, в другой задаче может и не быть.

Автор: sheka 29.09.2010 3:27

Понял. Исправил.

Автор: volvo 29.09.2010 6:23

Цитата
for i := 1 to 2 do read(a[i])

ничем не отличается от
for i := 1 to 2 do readln(a[i])

Да? А по-моему, отличается.

Следи за руками: вариант №2 - "вводим строку 4<пробел><пробел><пробел>8 и жмем на ввод". Что имеешь?
А ничего. Цикл от 1 до 2? Значит, должно быть 2 символа конца строки. Первое число (4) занесено в a[1], второе - проигнорировано, от тебя ожидается ввод еще одного числа вместе с Enter-ом.

Вариант №1 - "вводим строку 4<пробел><пробел><пробел>8 и жмем на ввод". Что имеем? Все прекрасно, цикл закончился, и a[1] и a[2] содержат новые значения. Правда вот буфер клавиатуры почистить не мешает, там остался символ #13, и если ты еще что-то будешь читать, то велика вероятность, что это "что-то" прочитается не совсем так, как ты задумывал, в особенности если это будет строка или символ.

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

Автор: Lapp 29.09.2010 8:44

Цитата(sheka @ 29.09.2010 0:23) *
for i := 1 to 2 do read(a[i])

ничем не отличается от
for i := 1 to 2 do readln(a[i])
Да, Sheka, это ты лажанулся.. smile.gif
К словам volvo добавить особенно нечего, но я пишу, чтобы сказать: понимание именно таких нюансов выводит тебя на уровень "не новичка". Постарайся покрутить это все и разобраться до конца. Особенно, кстати, насчет непочищенного буфера - очень частая ошибка. Сколько тут было вопросов типа: "я поставил ReadLn для задержки, а она не задерживается!" И ставят по десять ReadLn'ов, и честят компилятор за "глюки"..

Автор: sheka 29.09.2010 23:43

Да, действительно.
Чистить буфер так?

Цитата
MemW[Seg0040:$1C]:=MemW[Seg0040:$1A];{уравнять адреса начала и конца буфера}
или так
while keypressed do readkey;

А если я пишу в Делфи, что тогда делать?

Автор: TarasBer 30.09.2010 0:56

> MemW[Seg0040:$1C]:=MemW[Seg0040:$1A];
Вай, зачем так сложно?


for i := 1 to 2 do read(a[i]);
readln;