Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 03.02.2022, 08:41   #1
denis228777228
Новичок
Джуниор
 
Регистрация: 03.02.2022
Сообщений: 1
Вопрос Ошибка в программе

У меня появился вопрос, почему при компиляции данного кода выводит дополнительные ответ(правильный ответ 17 и числа до него). Если A to число и x to число, если это число будет степенью двойки, то будут дополнительные ответы. Подскажите почему?
Код:
Begin
  for var A:=0 to 512 do
    begin
     var B:= true;
  for var x:=1 to 512 do
  begin
    if not ((((x and 23) <>0) and ((x and 17)<>0)) or ((x and 58) =0) or((x and A)=0)) then 
     B:=false;
  end;
  If B then writeln (A);
  end;
end.

Последний раз редактировалось BDA; 03.02.2022 в 08:53.
denis228777228 вне форума Ответить с цитированием
Старый 03.02.2022, 09:12   #2
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,291
По умолчанию

Конечно с отступами лучше, чем без них, но еще лучше с верными отступами:
Код:
begin
  for var A := 0 to 512 do
  begin
    var B := true;
    for var x := 1 to 512 do
    begin
      if not ((((x and 23) <> 0) and ((x and 17) <> 0)) or ((x and 58) = 0) or ((x and A) = 0)) then 
        B := false;
    end;
    if B then writeln(A);
  end;
end.
Для числа N, являющегося степенью двойки, выражение (x and N) = 0 (где x от 1 до N - 1) всегда истинно. А дополнительные ответы есть не для всех степеней двойки (например, 8 и 32 не печатаются), так что нужно понять, что вообще значит выражение внутри цикла по x.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 03.02.2022, 12:25   #3
digitalis
Старожил
 
Аватар для digitalis
 
Регистрация: 04.02.2011
Сообщений: 4,551
По умолчанию

Не вникая в суть этого странного задания, можно его чуть-чуть оптимизнуть для красивости:
Код:
var x,B: Boolean ; 
Begin
  for A:=0 to 512 do
    begin
        B:= true;
        for  x:=1 to 512 do
               if not ((((x and 23) >0) and ((x and 17)>0)) or ((x and 58) =0) or((x and A)=0)) then
                  begin 
                     B:=false; Break
                  end;
        If B then writeln (A);
    end;
end.
Ну и вдогонку 2 маленьких замечания:
1. При компиляции получается из исходника исполняемый модуль .exe . Весь же вышеописанный беспредел происходит во время выполнения скомпиленой проги. Мало знать умные слова - надо понимать и их смысл.
2. Вот такая простая задачка - замечательный полигон для тренировки работы с отладчиком. Пройти по шагам спорные места, глянуть: а что же там происходит?
Ну и условие задачи не описано - уверен, что 0..17 only is valid ? А искать не пойми чего в странном коде - занятие для учеников телепата или для мазохиста.
(Если это Паскаль АБЦ - то за var извиняюсь, там это вроде в цикл вкрячивать надо. Но сути оно не меняет ).

Последний раз редактировалось digitalis; 03.02.2022 в 17:20.
digitalis вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Ошибка в программе Nefroz Работа с сетью в Delphi 4 08.05.2014 18:32
ошибка в программе MKS23 Помощь студентам 1 13.06.2012 20:36
Ошибка в программе Rusl_v Общие вопросы C/C++ 4 17.12.2010 16:24