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

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

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

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 25.12.2011, 12:44   #1
Camaro Chevelle
Форумчанин
 
Регистрация: 05.11.2011
Сообщений: 102
По умолчанию глюк в турбо паскале

написал функцию, определяющую является ли число палиндромом в двоичной записи. жирным выделил то, где для проверки вывожу значения логических выражений, необходимых для входа в while. оказывается, что (i<>j) есть true, (i in s) есть true, (j in s) также есть true, а ((i in s)=(j in s)) не есть true. объясните плз в чём дело.

Код:
function binpal(n: longint): boolean;
  var
    i, j: integer;
    s: set of 0..8*sizeof(n)-1 absolute n;
  begin
    j:=8*sizeof(n)-1;
    while not (j in s) do
      dec(j);
    i:=0;

    writeln(i<>j);    
    writeln(i in s);
    writeln(j in s);
    writeln((i in s)=(j in s));

    while (i<>j) and ((i in s)=(j in s)) do begin
      inc(i);
      dec(j);
    end;
    binpal:=(j-i)<2;
  end;

Последний раз редактировалось Camaro Chevelle; 25.12.2011 в 12:57.
Camaro Chevelle вне форума Ответить с цитированием
Старый 25.12.2011, 14:06   #2
whatever
a.k.a. Skull
Форумчанин
 
Регистрация: 17.11.2009
Сообщений: 963
По умолчанию

А что ты хочешь от ((i in s)=(j in s)) ? (true=true) => true? Лично я не знаю, как дэлфи расценит эту запись. Можно просто написать

Код:
while (i<>j) and (i in s) and (j in s) do begin
Все тривиальное просто
whatever вне форума Ответить с цитированием
Старый 25.12.2011, 16:48   #3
Camaro Chevelle
Форумчанин
 
Регистрация: 05.11.2011
Сообщений: 102
По умолчанию

Цитата:
Сообщение от whatever Посмотреть сообщение
А что ты хочешь от ((i in s)=(j in s)) ? (true=true) => true? Лично я не знаю, как дэлфи расценит эту запись.
интересно, а как он её должен расценивать-то?????
(true=true) –> true
(false=false) –> true
в остальных случаях false
т. е. типа как опреатор eqv в некоторых языках, но в паскале eqv нет, пробовал через отрицание xor, та же песня.
по-моему так. имхо достаточно очевидно и я диву даюсь почему паскаль неверно это понимает. Или истина не равна истине? А ложь лжи? с какого перепуга?

Последний раз редактировалось Camaro Chevelle; 25.12.2011 в 16:50.
Camaro Chevelle вне форума Ответить с цитированием
Старый 25.12.2011, 17:31   #4
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

вариант 1.
Код:
var
...
     b1, b2 : boolean;
...
    b1 := (i in s);
    b2 := (j in s);
    writeln('b1 ',b1,' b2 ',b2,' condition =', b1 = b2);
вариант 2. (о нём выше уже писали - не сравнивать булевские выражения - а строить выражение булевой алгебры, как и положено:
Код:
    writeln(i<>j);    
    writeln(i in s);
    writeln(j in s);
    writeln((i in s) and (j in s));

   while (i<>j) and (i in s) and (j in s)) do begin
второй вариант проще и более правильный.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 25.12.2011, 17:39   #5
Camaro Chevelle
Форумчанин
 
Регистрация: 05.11.2011
Сообщений: 102
По умолчанию

Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
вариант 2. (о нём выше уже писали - не сравнивать булевские выражения - а строить выражение булевой алгебры, как и положено:
Код:
    writeln(i<>j);    
    writeln(i in s);
    writeln(j in s);
    writeln((i in s) and (j in s));

   while (i<>j) and (i in s) and (j in s)) do begin
второй вариант проще и более правильный.
во-первых он не проще, а во-вторых он неправильный, читайте внимательнее
и я не хочу использовать переменные чтобы их один раз тупо сравнить, хотелось бы понять почему паскаль так тупит, в чем тут причина?

Последний раз редактировалось Camaro Chevelle; 25.12.2011 в 17:41.
Camaro Chevelle вне форума Ответить с цитированием
Старый 25.12.2011, 19:15   #6
veniside
Старожил
 
Регистрация: 03.01.2011
Сообщений: 2,508
По умолчанию

версия паскаля какая? У меня в BP 7.0 всё верно выводит. И отрицание xor тоже работает как надо.
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."
veniside вне форума Ответить с цитированием
Старый 25.12.2011, 19:21   #7
whatever
a.k.a. Skull
Форумчанин
 
Регистрация: 17.11.2009
Сообщений: 963
По умолчанию

Цитата:
Или истина не равна истине? А ложь лжи? с какого перепуга?
Повторюсь, я не знаю как дэлфи это интерпретирует. Как вариант может быть так:
Код:
((i in s)=(j in s)) <=> (i=j) in s
Все тривиальное просто
whatever вне форума Ответить с цитированием
Старый 25.12.2011, 19:29   #8
veniside
Старожил
 
Регистрация: 03.01.2011
Сообщений: 2,508
По умолчанию

да всё там нормально работает и всю жизнь работало. ищите ошибку у себя, а не в паскале.

http://ideone.com/VL0Ga

Цитата:
<=>
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."
veniside вне форума Ответить с цитированием
Старый 25.12.2011, 19:37   #9
whatever
a.k.a. Skull
Форумчанин
 
Регистрация: 17.11.2009
Сообщений: 963
По умолчанию

Поддерживаю предыдущего оратора:

Все работет

Цитата:
Цитата: <=>

"Тогда и только тогда", нормальный символ :D Матфак одобряэ!
Все тривиальное просто
whatever вне форума Ответить с цитированием
Старый 25.12.2011, 19:37   #10
Camaro Chevelle
Форумчанин
 
Регистрация: 05.11.2011
Сообщений: 102
По умолчанию

у меня bp 7.0 глючит конкретно в этой функции, в остальном никаких нареканий не вызывает.
т. е. если я просто проверю допустим так
Код:
writeln(true=true);
writeln(false=false);
writeln(true=false);
writeln(false=true);
в первых двух случаях он выдаёт true, в 3 и 4 - false
пока всё нормально
а когда проверяю такое (уже внутри функции)
Код:
writeln(i in s); {true}
writeln(j in s); {true}
writeln((i in s)=(j in s)); {тут false!!! какого хрена???}
глючит!

Последний раз редактировалось Camaro Chevelle; 25.12.2011 в 19:58.
Camaro Chevelle вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
в турбо паскале natalialove Фриланс 8 31.05.2010 19:11
в турбо паскале tanyalove Помощь студентам 12 26.05.2010 20:05
турбо паскале tanyalove Помощь студентам 2 19.05.2010 20:10
турбо паскале tanyalove Паскаль, Turbo Pascal, PascalABC.NET 10 18.05.2010 20:08
в турбо паскале tanyalove Помощь студентам 17 29.04.2010 13:16