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

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

Вернуться   Форум программистов > Delphi программирование > Паскаль, Turbo Pascal, PascalABC.NET
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 25.11.2011, 18:46   #1
ProgrammiST-_-
Пользователь
 
Регистрация: 07.10.2011
Сообщений: 12
По умолчанию Комбинированный тип данных.

Даны описания переменных: type рац= record
число:integer;
знам:1.maxint
end;
массив = array[1..20] of рац;
Описать:
Логическую функцию равно (а,b) сравнивающую два рациональных числа а и b.
Без понятия как решать даже, если кто то разбирается нужна ваша помощь=(
ProgrammiST-_- вне форума Ответить с цитированием
Старый 26.11.2011, 00:18   #2
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,707
По умолчанию

вас в школе не научили сравнивать дроби?
p51x вне форума Ответить с цитированием
Старый 26.11.2011, 02:59   #3
TinMan
Форумчанин
 
Аватар для TinMan
 
Регистрация: 05.09.2011
Сообщений: 869
По умолчанию

Думаю, проще всего переложить числители этих в longint а дальше премножить. Как-то примерно так:
Код:
a:= r1.chis;
b:= r2.chis;
a:= a*r2.znam;
b:= b*r1.znam;
if a>b then writeln('r1 > r2')
else if a<b then writeln('r1 < r2')
else writeln('r1 = r2');
Предпочитаю на "ты".
TinMan вне форума Ответить с цитированием
Старый 26.11.2011, 12:41   #4
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,707
По умолчанию

Код:
a:= a*r2.znam;
b:= b*r1.znam;
О! Я всегда думал, что в дробях делят на знаменатель....

Не надо выдумывать и меня стандартное поведение операторов.
p51x вне форума Ответить с цитированием
Старый 26.11.2011, 13:27   #5
Juffin
Форумчянин
Форумчанин
 
Аватар для Juffin
 
Регистрация: 05.04.2009
Сообщений: 446
По умолчанию

Цитата:
Не надо выдумывать и меня(ть?) стандартное поведение операторов.
А как вы сравниваете дроби? Вы хотите сказать, что вместо того, чтобы приводить их к общему знаменателю, вы делите числитель на знаменатель и сравниваете десятичные дроби?
Nobody expects Spanish Inquisition!
Juffin вне форума Ответить с цитированием
Старый 26.11.2011, 15:27   #6
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

p51x, Вы неправы...
сравните, например, дроби 1/3 и 2/6
очевидно, что 1*6 равно 2*3.

имхо, TinMan предложил простое и красивое решение. (фактически происходит приведение дробей к общему знаменателю, который в данном алгоритме равен r1.znam * r2.znam) и, раз знаменатели дроби равны, можно смело сравнивать числители.)
Недостаток у данного метода только один, может не хватить разрядности longint. Впрочем, тут уже всё будет зависеть от того, какая разрядность у integer (если речь идёт о турбоПаскаль, то LongInt гарантировано хватит:
Код:
var a1, a2 : integer;
  b : longint;
begin
  a1 := MaxInt;  a2 := MaxInt;
  b := a1;
  b := b * a2;
  WriteLn(b);  readln;
end.
если же речь о другом компиляторе Паскаль, то это уже не факт.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 26.11.2011, 16:05   #7
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,707
По умолчанию

Цитата:
p51x, Вы неправы...
Да то? Признаю, пропустил, что на разные знаменатели умножает, но:
1. В большом проекте, ессли вы поменяете ожидаемое стандартное поведение оператора, то по рукам быстро получите
2. Учитывая, что обычно лонгинт в два раза по разрядам превосходит инт, то очень интерсно посмотреть как будут сравниваться таким методом максинт и максинт
p51x вне форума Ответить с цитированием
Старый 26.11.2011, 16:21   #8
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
1. В большом проекте, ессли вы поменяете ожидаемое стандартное поведение оператора,
никак не могу понять, о каком стандартном операторе Вы второй пост подряд ведёте речь...
Поясните, пожалуйста, какое поведение какого стандартного оператора меняется...

Цитата:
2. Учитывая, что обычно лонгинт в два раза по разрядам превосходит инт, то очень интерсно посмотреть как будут сравниваться таким методом максинт и максинт
А Вы зря читаете посты "по диагонали"...
мой пост выше. пример как раз с максинт на максинт. компилятор TurboPascal. всё работает нормально.
Впрочем, там же я отметил, что это зависит от разрядности Integer в конкретном компиляторе...


p.s. в любом случае, умножение даст более точный результат, чем деление и сравнение полученных дробных значений...
Serge_Bliznykov вне форума Ответить с цитированием
Старый 27.11.2011, 08:10   #9
TinMan
Форумчанин
 
Аватар для TinMan
 
Регистрация: 05.09.2011
Сообщений: 869
По умолчанию

Juffin, Серж - спасибо за поддержку ).

p51x, извини, я не привел объяснение - что, по-видимому, и сбило тебя с толку. Надо все же писать пару слов всегда, постараюсь исправиться.

Что касается разрядности.. В условии четко указан тип: integer, и даже приведены диапазоны. Во всех Pascal-компиляторах, с которыми я знаком (TP и FP, собственно, про ABC не знаю), типы integer и longint отличаются под длине вдвое - потому я и счел возможным предложить такое решение.
Предпочитаю на "ты".
TinMan вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Комбинированный тип данных Black_butterfly Помощь студентам 1 14.04.2011 11:29
Комбинированный тип данных ne4eHUce Помощь студентам 3 11.04.2011 01:36
Записи комбинированный тип данных Александр Бутырин Паскаль, Turbo Pascal, PascalABC.NET 4 28.12.2010 18:34
Комбинированный тип данных Nightt Помощь студентам 0 19.06.2009 18:25