OberonCore
https://forum.oberoncore.ru/

Как правильно вводить данные через модуль In?
https://forum.oberoncore.ru/viewtopic.php?f=23&t=2033
Страница 1 из 1

Автор:  Виталий [ Вторник, 10 Ноябрь, 2009 15:25 ]
Заголовок сообщения:  Как правильно вводить данные через модуль In?

Всем доброго.
Хочу изучать Оберон. Пользую Блэк Бокс.
Прочитал с этого портала пару книг - терь хочу попрактиковаться.
Первая программа:
Код:
MODULE q;
IMPORT In, StdLog;

PROCEDURE aga*;
VAR
 q,w:INTEGER;
BEGIN
 w:=0;
 StdLog.Clear;
 In.Open;
 WHILE In.Done DO
   In.Int(q);
   w:=w+q;
   StdLog.Int(w);
   StdLog.Ln;
 END
END aga;

END q.


Вопрос:
Я ввожу значения (предположим я не знаю сколько их будет) так: ниже командера на следующей строке написал
23 4 67. Выделил их. И нажал на командер.
В логе получил
Цитата:

23
27
94
161

Что я делаю неверно и как правильно вводить числа.

Автор:  Александр Ильин [ Вторник, 10 Ноябрь, 2009 15:30 ]
Заголовок сообщения:  Re: Как правильно вводить данные через модуль In?

Виталий писал(а):
В логе получил
Что я делаю неверно и как правильно вводить числа.
Вы забыли написать, что вы ожидали получить.

Автор:  Александр Ильин [ Вторник, 10 Ноябрь, 2009 15:34 ]
Заголовок сообщения:  Re: Как правильно вводить данные через модуль In?

Проверять In.Done нужно после каждого вызова In.Int.
Код:
MODULE q;
   IMPORT In, StdLog;

   PROCEDURE aga*;
   VAR
      q,w:INTEGER;
   BEGIN
      w:=0;
      StdLog.Clear;
      In.Open;
      In.Int(q); (* <- сюда *)
      WHILE In.Done DO
         (* In.Int(q); -> отсюда *)
         w:=w+q;
         StdLog.Int(w);
         StdLog.Ln;
         In.Int(q); (* <- и сюда *)
      END
   END aga;

END q.

Автор:  А.П. [ Вторник, 10 Ноябрь, 2009 15:40 ]
Заголовок сообщения:  Re: Как правильно вводить данные через модуль In?

Виталий писал(а):
Хочу изучать Оберон. ...Что я делаю неверно и как правильно вводить числа.

Перед циклом надо сделать ввод первого числа.
Ввод остальных надо делать В КОНЦЕ цикла. Тогда In.Done будет правильно регулировать выход из цикла при любом количестве подряд идущих чисел во входном потоке.

Автор:  Виталий [ Вторник, 10 Ноябрь, 2009 15:56 ]
Заголовок сообщения:  Re: Как правильно вводить данные через модуль In?

Цитата:
Вы забыли написать, что вы ожидали получить.

Млин точно.
Желаю просуммировать числа.
Пока тут читал книги и понял что капитально тупанул. Подкорректировал свой код на основании
Цитата:
Перед циклом надо сделать ввод первого числа.
Ввод остальных надо делать В КОНЦЕ цикла.


Код:
PROCEDURE aga*;
VAR
 q,w:INTEGER;
BEGIN
 w:=0;
 StdLog.Clear;
 In.Open;
 REPEAT
   In.Int(q);
   w:=w+q;
 UNTIL ~In.Done;
   StdLog.Int(w);
   StdLog.Ln;
END aga;

Выделил 2 2 2 Ожидал получить 6 а получил 8 в Логе.
Где я опять напортачил?

Попутный вопрос - как мне пошагам прогу отлаживать?
Есть в ББ такая возможность?

Автор:  Trurl [ Вторник, 10 Ноябрь, 2009 16:23 ]
Заголовок сообщения:  Re: Как правильно вводить данные через модуль In?

Код:
REPEAT
   In.Int(q); (* последний раз In.Done=FALSE  *)
   w:=w+q; (* а мы все равно суммируем *)
UNTIL ~In.Done;

Автор:  Виталий [ Вторник, 10 Ноябрь, 2009 16:34 ]
Заголовок сообщения:  Re: Как правильно вводить данные через модуль In?

А так:
Код:
 In.Open;
 WHILE In.Done DO
   In.Int(q);
   w:=w+q;
 END;
   StdLog.Int(w);

Тоже на 2 2 2 восьмерку дает...

Думал что мешает старая загрузка. выполнил Compile and Unload но все равно...
Чего-то недопонимаю а чего...

Вот если зарядить:
Код:
 FOR i:=1 TO 3 DO
   In.Int(q);
   w:=w+q;
 END;

Отрабатывает верно, значит я неверно понимаю работу Done?


Все Наконец то дошло!!!
Код:
MODULE q;
IMPORT In, StdLog;

PROCEDURE aga*;
VAR
 i,q,w:INTEGER;
BEGIN
 w:=0;
 StdLog.Clear;
 In.Open;
 In.Int(q);
 WHILE In.Done DO
   w:=w+q;
   In.Int(q);
 END;
   StdLog.Int(w);
   StdLog.Ln;
END aga;

END q.
q.aga


Я действительно не в ту степь поехал

Всем спасибо за терпение, думаю у меня еще будут подобные вопросы.
:wink:

Автор:  Илья Ермаков [ Вторник, 10 Ноябрь, 2009 19:16 ]
Заголовок сообщения:  Re: Как правильно вводить данные через модуль In?

По поводу пошаговой отладки:
http://www.inr.ac.ru/~info21/blackbox/d ... lcome.html

Зато просто просмотр состояния программы в какой-то точке - сколько угодно. Вставьте оператор HALT(0) - и на этом месте выполнение алгоритма будет остановлено, откроется навигатор памяти.

Автор:  Виталий [ Среда, 11 Ноябрь, 2009 14:15 ]
Заголовок сообщения:  Re: Как правильно вводить данные через модуль In?

Илья Ермаков писал(а):
По поводу пошаговой отладки:
http://www.inr.ac.ru/~info21/blackbox/d ... lcome.html

Зато просто просмотр состояния программы в какой-то точке - сколько угодно. Вставьте оператор HALT(0) - и на этом месте выполнение алгоритма будет остановлено, откроется навигатор памяти.

О! Точно HALT... Долго вспоминал как это называется, спасибо )

Страница 1 из 1 Часовой пояс: UTC + 3 часа
Powered by phpBB® Forum Software © phpBB Group
https://www.phpbb.com/