OberonCore

Библиотека  Wiki  Форум  BlackBox  Компоненты  Проекты
Текущее время: Четверг, 16 Август, 2018 00:00

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 10 ] 
Автор Сообщение
 Заголовок сообщения: Входящий поток
СообщениеДобавлено: Понедельник, 13 Июль, 2015 20:41 
Аватара пользователя

Зарегистрирован: Вторник, 25 Ноябрь, 2014 08:05
Сообщения: 21
Объясните пожалуйста, что не так со мной или входящим потоком?

Код:
(* найти сумму всех положительных чисел из входящего потока*)

MODULE Ex;
   IMPORT  Log := StdLog,  In := i21sysIn,  Math;
   PROCEDURE Pos*;
      VAR  k, sum:INTEGER;
   BEGIN
      In.Open; ASSERT (In.done);
      sum:=0;
      WHILE In.Done DO
         In.Int(k);
         IF k>0 THEN
            INC( sum,k );
         END;
      END;
      Log.Int(sum);
   END Pos;
END Ex.

Сам входящий поток:

-2 2 2 -2 результат 4

-2 2 2 -2 2 результат 8

Изображение


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Входящий поток
СообщениеДобавлено: Понедельник, 13 Июль, 2015 21:03 

Зарегистрирован: Вторник, 29 Август, 2006 12:32
Сообщения: 2516
Откуда: Россия, Ярославль
На самом деле надо проверять done каждый раз после чтения Int и только если done, то прибавлять k. А так у вас последняя k два раза учитывается ошибочно, если она положительная.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Входящий поток
СообщениеДобавлено: Понедельник, 13 Июль, 2015 21:07 
Аватара пользователя

Зарегистрирован: Вторник, 25 Ноябрь, 2014 08:05
Сообщения: 21
Пётр Кушнир писал(а):
На самом деле надо проверять done каждый раз после чтения Int и только если done, то прибавлять k. А так у вас последняя k два раза учитывается ошибочно, если она положительная.

Спасибо Пётр, поправил, сразу получил верный результат :D


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Входящий поток
СообщениеДобавлено: Понедельник, 13 Июль, 2015 21:12 

Зарегистрирован: Вторник, 29 Август, 2006 12:32
Сообщения: 2516
Откуда: Россия, Ярославль
Вообще, я бы сделал с циклом REPEAT, не знаю, насколько это соответствовало бы эталонному решению, но REPEAT был бы кстати.
С одной стороны ASSERT можно выкинуть, так как WHILE уже охраняет. С другой стороны, ASSERT и WHILE можно заменить на IF In.done THEN REPEAT UNTIL !In.done END, с чтением не в начале цикла, а в конце, но тогда появляется лишняя первая итерация. Но это скорее борьба с нерегулярностью интерфейса модуля In.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Входящий поток
СообщениеДобавлено: Понедельник, 13 Июль, 2015 21:15 

Зарегистрирован: Вторник, 29 Август, 2006 12:32
Сообщения: 2516
Откуда: Россия, Ярославль
А еще желательно k присвоить 0 вначале, а то если ни одного числа не прочитается, то в k может быть огромный мусор больше нуля.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Входящий поток
СообщениеДобавлено: Пятница, 14 Август, 2015 09:31 
Аватара пользователя

Зарегистрирован: Воскресенье, 12 Апрель, 2015 18:12
Сообщения: 1064
Откуда: СССР v2.0 rc 1
Специально сейчас проверил. Все строки создаются как "", целые -- 0, вещественные -- 0.0 Вы недооцениваете мозг Вирта,)


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Входящий поток
СообщениеДобавлено: Пятница, 14 Август, 2015 10:10 
Аватара пользователя

Зарегистрирован: Четверг, 08 Октябрь, 2009 15:00
Сообщения: 2118
Откуда: Красноярск
prospero78 писал(а):
Специально сейчас проверил. Все строки создаются как "", целые -- 0, вещественные -- 0.0 Вы недооцениваете мозг Вирта,)

Проверьте получше. Это далеко не всегда так. Что-то такое было по поводу глобальных переменных только, еще указатели всегда инициализируются в NIL. Локальные никак не инициализируются. Нули и пустые строки могут быть, если место под память ББ выделилось случайно пустое.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Входящий поток
СообщениеДобавлено: Пятница, 14 Август, 2015 10:33 
Модератор
Аватара пользователя

Зарегистрирован: Понедельник, 14 Ноябрь, 2005 18:39
Сообщения: 8970
Откуда: Россия, Орёл
Для глобальных переменных инициализация нулями гарантируется.

Для локальных - гарантируется мусор в стеке.

Кроме указателей, которые таки, конечно, зачищаются.
Если посмотреть дизасм преамбул процедур в ББ, видно, как компилятор
старательно затирает указатели во фрейме процедуры, игнорируя всё между ними :)

Инициализация глобальных переменных гарантирована сообщением о языке, так что на неё можно полагаться.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Входящий поток
СообщениеДобавлено: Пятница, 14 Август, 2015 12:57 
Аватара пользователя

Зарегистрирован: Воскресенье, 12 Апрель, 2015 18:12
Сообщения: 1064
Откуда: СССР v2.0 rc 1
Я вот как раз глобальные и объявлял.
Странно, почему для локальных такое допущение. Может кто-то запилет обнуление локальных? Это же будет методически верно? xor eax, eax; push eax; сделать не в напряг же будет для INTEGER и SHORTREAL?
З.Ы. А в Go это лучше сделано, получается. Тоже заявлен, как язык системного программирования,)


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Входящий поток
СообщениеДобавлено: Пятница, 14 Август, 2015 15:02 
Аватара пользователя

Зарегистрирован: Четверг, 08 Октябрь, 2009 15:00
Сообщения: 2118
Откуда: Красноярск
prospero78 писал(а):
Я вот как раз глобальные и объявлял.
Странно, почему для локальных такое допущение. Может кто-то запилет обнуление локальных? Это же будет методически верно? xor eax, eax; push eax; сделать не в напряг же будет для INTEGER и SHORTREAL?
З.Ы. А в Go это лучше сделано, получается. Тоже заявлен, как язык системного программирования,)

Это активно обсуждалось в Центре, в целом есть за и против, но особой необходимости нет. Вызов процедур должен быть "дешевым", если при вызове процедуры должны происходить инициализации, то она станет жирнее, рекуррентные алгоритмы будут работать медленно.


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 10 ] 

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Вся информация, размещаемая участниками на конференции (тексты сообщений, вложения и пр.) © 2005-2018, участники конференции «OberonCore», если специально не оговорено иное.
Администрация не несет ответственности за мнения, стиль и достоверность высказываний участников, равно как и за безопасность материалов, предоставляемых участниками во вложениях.
Без разрешения участников и ссылки на конференцию «OberonCore» любое воспроизведение и/или копирование высказываний полностью и/или по частям запрещено.
Powered by phpBB® Forum Software © phpBB Group
Русская поддержка phpBB