Технический форум
Вернуться   Технический форум > Программирование > Форум программистов > Математика


Ответ
 
Опции темы Опции просмотра
Старый 25.01.2009, 10:27   #31 (permalink)
Vladimir_S
Специалист
 
Регистрация: 27.08.2008
Адрес: Санкт-Петербург
Сообщений: 27,807
Сказал(а) спасибо: 340
Поблагодарили 583 раз(а) в 208 сообщениях
Репутация: 113184
По умолчанию

Цитата:
Сообщение от ummasha Посмотреть сообщение
Вот еще одна задача из книжки: найти все натуральные числа a,b,c из интервала от 1 до 20, для которых выполняется равенство:а2+ b2 = c2

Program KR_2_Var1_2;
Var a,b,c:integer;
Begin
For a:=1 to 20 do
For b:=1 to 20 do
For c:=1 to 20 do
If sqr(a)+sqr(b)=sqr(c) then writeln(a,' ',b,' ',c);
readln;
end.

Задача решается без всяких проблем, НО: в книжке вместо этого было а*а+b*b=с*с. И это "типа" квадраты чисел?
В книжке, Маша, всё правильно. Тут есть одна тонкость. Употребив функцию SQR, Вы преобразовали целочисленный формат (Integer, Word, Byte...) в вещественный (Real, Extended...), что "не есть хорошо" хотя бы потому, что в этом формате операция проверки на равенство может, в зависимости от аппаратной реализации, оказаться не совсем корректной, поскольку в "дальних" разрядах может висеть "мусор", и как на него среагирует транслятор, неведомо (например, 2 может преобразоваться во что-нибудь вроде 2.0000000005298307645). Я в своих программах вообще избегаю таких действий, заменяя их при необходимости чем-нибудь вроде if Round(a*100000)=Round(b*100000) then ...
Vladimir_S вне форума   Ответить с цитированием
Старый 25.01.2009, 15:56   #32 (permalink)
ummasha
Member
 
Аватар для ummasha
 
Регистрация: 24.12.2008
Сообщений: 419
Записей в дневнике: 4
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 1311
По умолчанию

Да, в школе ничего такого не говорили...((( Ну тогда сделаю так, как вы сказали.
Спасибо, что ответили

Последний раз редактировалось ummasha; 25.01.2009 в 16:59
ummasha вне форума   Ответить с цитированием
Старый 25.01.2009, 16:59   #33 (permalink)
ummasha
Member
 
Аватар для ummasha
 
Регистрация: 24.12.2008
Сообщений: 419
Записей в дневнике: 4
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 1311
По умолчанию

Вставила в Паскаль If Round(a*100000)+Round(b*100000)=Round(c*100000) then ... вместо If sqr(a)+sqr(b)=sqr(c), но вместо суммы квадратов чисел получилась просто сумма чисел (((

И еще. Иногда у меня не получалось определить четность/нечетность элемента с помощью операций вроде i mod 2=0 или i mod 2=1, а с помощью функций odd(x) или not odd(x) все получалось.

Последний раз редактировалось ummasha; 25.01.2009 в 17:15
ummasha вне форума   Ответить с цитированием
Старый 25.01.2009, 20:53   #34 (permalink)
Vladimir_S
Специалист
 
Регистрация: 27.08.2008
Адрес: Санкт-Петербург
Сообщений: 27,807
Сказал(а) спасибо: 340
Поблагодарили 583 раз(а) в 208 сообщениях
Репутация: 113184
По умолчанию

Цитата:
Сообщение от ummasha Посмотреть сообщение
Вставила в Паскаль If Round(a*100000)+Round(b*100000)=Round(c*100000) then ... вместо If sqr(a)+sqr(b)=sqr(c), но вместо суммы квадратов чисел получилась просто сумма чисел (((

И еще. Иногда у меня не получалось определить четность/нечетность элемента с помощью операций вроде i mod 2=0 или i mod 2=1, а с помощью функций odd(x) или not odd(x) все получалось.
Маша, ну я же не про то совсем! А про то, что ВНЕ ЗАВИСИМОСТИ ОТ ЗАДАЧИ конструкции типа if a=b then для ВЕЩЕСТВЕННЫХ (Real) чисел применять рискованно - может не сработать, поэтому лучше перевести параметры в целочисленный формат операцией ROUND. В данном случае достаточно if Round(SQR(a)) + Round(SQR(b)) = Round(SQR(c)) then... Умножение на 10 или 100 или 100000 или еще на что-нибудь подобное нужно лишь для смещения разряда. Например, допустим в программе числа a и b получили значения 0.00753 и 0.0755, а Вы хотите проверить их на равенство. Просто Round не годится, потому что Round(a)=Round(b)=0, а вот Round(a*100000)=753, Round(b*100000)=755. А вообще - чем Вас не устраивает вариант, приведенный в книжке?

А насчет трудностей с определением четности по остатку - странно. Должно получаться. Формат там целочисленный, так что проблем быть вроде как не может.
Покажите, если есть под рукой, программу, где не получалось - разберемся.
Vladimir_S вне форума   Ответить с цитированием
Старый 25.01.2009, 20:55   #35 (permalink)
ummasha
Member
 
Аватар для ummasha
 
Регистрация: 24.12.2008
Сообщений: 419
Записей в дневнике: 4
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 1311
По умолчанию

Программа:

Program KR_2_Var1_2;
Var a,b,c:integer;
Begin
For a:=1 to 20 do
For b:=1 to 20 do
For c:=1 to 20 do
If Round(a*100000)+Round(b*100000)=Round(c*100000) then writeln(a,' ',b,' ',c);
readln;
end.

В чем же проблема? (((
ummasha вне форума   Ответить с цитированием
Ads

Яндекс

Member
 
Регистрация: 31.10.2006
Сообщений: 40200
Записей в дневнике: 0
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 55070
Старый 25.01.2009, 21:14   #36 (permalink)
Vladimir_S
Специалист
 
Регистрация: 27.08.2008
Адрес: Санкт-Петербург
Сообщений: 27,807
Сказал(а) спасибо: 340
Поблагодарили 583 раз(а) в 208 сообщениях
Репутация: 113184
По умолчанию

Цитата:
Сообщение от ummasha Посмотреть сообщение
Программа:

Program KR_2_Var1_2;
Var a,b,c:integer;
Begin
For a:=1 to 20 do
For b:=1 to 20 do
For c:=1 to 20 do
If Round(a*100000)+Round(b*100000)=Round(c*100000) then writeln(a,' ',b,' ',c);
readln;
end.

В чем же проблема? (((
Маша, ну не торопитесь и не суетитесь - прочитайте внимательно, что написано в предыдущем посте. Сейчас в программе оператор If действительно сравнивает просто сумму двух чисел с третьим, а не сумму квадратов с квадратом третьего, как требуется.
Vladimir_S вне форума   Ответить с цитированием
Старый 25.01.2009, 21:30   #37 (permalink)
Vladimir_S
Специалист
 
Регистрация: 27.08.2008
Адрес: Санкт-Петербург
Сообщений: 27,807
Сказал(а) спасибо: 340
Поблагодарили 583 раз(а) в 208 сообщениях
Репутация: 113184
По умолчанию

Вообще я чувствую, что лучше пройти этот момент еще раз и обстоятельно.
Итак, в книжке предложена конструкция
If а*а+b*b=с*с then...
и она у Вас вызвала, как я понял, недоумение. Надеюсь, Вы помните, что умножение числа само на себя это и есть возведение в квадрат, поэтому решение абсолютно верное. Но Вы предложили другое:
If sqr(a)+sqr(b)=sqr(c) then...
которое вроде бы делает то же самое. В чем же разница? А в том, что в результате действия функции SQR получается ВЕЩЕСТВЕННОЕ (Real) число. Т.е. если число a имеет тип Integer, то и число a*a тоже будет иметь тип Integer, а вот число SQR(a) будет иметь тип Real, что не всегда удобно, и я объяснил, почему.
Vladimir_S вне форума   Ответить с цитированием
Старый 25.01.2009, 21:43   #38 (permalink)
ummasha
Member
 
Аватар для ummasha
 
Регистрация: 24.12.2008
Сообщений: 419
Записей в дневнике: 4
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 1311
По умолчанию

Спасибо огромное за все объяснения, Vladimir_S! Вы мне очень помогли! )))
PS: скоро будут еще задачи
ummasha вне форума   Ответить с цитированием
Старый 25.01.2009, 23:32   #39 (permalink)
Darkcosinus
Member
 
Регистрация: 25.04.2008
Сообщений: 238
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
По умолчанию

Собственно, по моей задачке ummasha правильно написала решение - нужно использовать побитовую операцию XOR

По поводу возражений по поводу типов данных и т.п. - задачки эти служат, чтобы развить программистское мышление, а не чтобы просто решить для галочки. В них изначально нет строгих начальных условий, чтоб как раз и подумать о том, какие варианты в принципе возможны и какие ограничения они накладывают.
Darkcosinus вне форума   Ответить с цитированием
Старый 26.01.2009, 12:44   #40 (permalink)
Vladimir_S
Специалист
 
Регистрация: 27.08.2008
Адрес: Санкт-Петербург
Сообщений: 27,807
Сказал(а) спасибо: 340
Поблагодарили 583 раз(а) в 208 сообщениях
Репутация: 113184
По умолчанию

Цитата:
Сообщение от Darkcosinus Посмотреть сообщение
Собственно, по моей задачке ummasha правильно написала решение - нужно использовать побитовую операцию XOR
Ах вот оно как? XOR, говорите? Ну сейчас порезвимся! А если числа вещественные и дробные? Комплексные? Type mismatch!!!
Vladimir_S вне форума   Ответить с цитированием
Ads

Яндекс

Member
 
Регистрация: 31.10.2006
Сообщений: 40200
Записей в дневнике: 0
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 55070
Ответ


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

BB коды Вкл.
Смайлы Вкл.
[IMG] код Выкл.
HTML код Выкл.
Trackbacks are Вкл.
Pingbacks are Вкл.
Refbacks are Выкл.




Часовой пояс GMT +4, время: 07:04.

Powered by vBulletin® Version 6.2.5.
Copyright ©2000 - 2014, Jelsoft Enterprises Ltd.