Помощь - Поиск - Пользователи - Календарь
Полная версия: С помощью процедуры привести дробь к несократимому виду
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
marwell
с помощью процедуры Socr привести дробь 1+1/2+1/3+1/4+1/5+...+1/20 к несократимому виду

var a_1,a_2,b_1,b_2,p,q:integer;
function NOD(a:integer; b:integer):integer;
begin
while(a<>0) and (b<>0) do
if a>=b then a:=a mod b
else b:=b mod a;
NOD:=a+b;
end;
function NOK (A: integer; B: integer): integer;
begin
NOK := (a * b) div NOD (a, b);
end;
procedure Socr(a,b:integer; var p,q:integer);
begin
if a=b then begin
p:=1;
q:=1;
end
else if NOD (a, b)<>1 then
begin
p:=a div NOD(a, b);
q:=b div NOD(a, b);
end
else Writeln ('дробь несократима');
end;
begin
a_1:=1;
a_2:=1;
b_1:=1;
for b_2:=2 to 21 do
begin
a_1:=(NOK(b_1, b_2) div b_1)*a_1;
a_1:=a_1+((NOK(b_1, b_2) div b_2)*a_2);
b_1:=NOK(b_1, b_2);
end;
writeln (a_1,'/',b_1);
Socr(a_1,b_1,p,q);
Writeln (p,'/',q);
readln;
end.


посмотрите, please, правильно?
volvo
Цитата
посмотрите, please, правильно?
А ты программу запускал? Она ж вылетает у тебя с переполнением:
Exitcode = 215
Runtime error 215 at $004013F5
$004013F5 NOK, line 13 of F:/Programs/Pascal/__test.pas
$004014FE main, line 34 of F:/Programs/Pascal/__test.pas
$00407D10

marwell
Цитата(volvo @ 4.01.2010 14:00) *

А ты программу запускал? Она ж вылетает у тебя с переполнением:
Exitcode = 215
Runtime error 215 at $004013F5
$004013F5 NOK, line 13 of F:/Programs/Pascal/__test.pas
$004014FE main, line 34 of F:/Programs/Pascal/__test.pas
$00407D10



я ее на Delphi запускал(((
volvo
Какая разница, там должно было быть то же самое...
Я ж говорил тебе - найди процедуру сложения дробей, и используй. Вот здесь все, что нужно, кроме основной программы: Процедуры и функции

Основная программа выглядит так:
var
curr: ratio;
i: integer;
const
res: ratio = (num:0; denom:1);

begin
for i := 1 to 20 do
begin
curr.num := 1; curr.denom := i;
add_ratio(res, curr);
end;
writeln(res.num, '/', res.denom);
end.
Тем более, если у тебя Дельфи (тогда тему надо было создавать в "32-битных компиляторах", если консольное приложение, или в разделе "Дельфи" - если оконное) - которая может возвращать результат - запись, тогда можно сделать функции сложения/сокращения дробей, и все вообще запишется в одну строку...
marwell
Цитата(volvo @ 4.01.2010 14:22) *
Основная программа выглядит так:
а ratio это что? паскаль выдает ошибку unknown identifier
volvo
А ты не копируй КУСОК. Я дал ссылку на работоспособную программу. Почему надо ее сначала исковеркать, а потом удивляться и возмущаться, что она не работает? Ratio - это мой тип, я его там описывал...
marwell
Цитата(volvo @ 4.01.2010 14:43) *

А ты не копируй КУСОК. Я дал ссылку на работоспособную программу. Почему надо ее сначала исковеркать, а потом удивляться и возмущаться, что она не работает? Ratio - это мой тип, я его там описывал...

function NOD(A, B: longint): integer;
begin
while (a <> 0) and (b <> 0) do
if a >= b then
a := a mod b
else
b := b mod a;
NOD := a + b;
end;

function NOK(A, B: longint): integer;
begin
NOK := a * b div NOD (a, b)
end;

type
ratio = record
num, denom: longint;
end;

{ Процедура сокращения дробей (заодно корректируем знак) }
procedure Socr(var res: ratio);
var the_nod: longint;
begin
repeat
the_nod := NOD(abs(res.num), abs(res.denom));
if the_nod > 1 then begin
res.num := res.num div the_nod;
res.denom := res.denom div the_nod;
end;
until the_nod = 1;

if res.denom < 0 then begin
res.num := res.num * (-1);
res.denom := abs(res.denom);
end;
end;

{ Сложение дробей }
procedure add_ratio(var res: ratio; curr: ratio);
var new_denom: longint;
begin
Socr(curr);

new_denom := NOK(res.denom, curr.denom);
res.num :=
res.num * (new_denom div res.denom) +
curr.num * (new_denom div curr.denom);
res.denom := new_denom;

Socr(res);
end;

var
curr: ratio;
i: integer;
const
res: ratio = (num:0; denom:1);

begin
for i := 1 to 20 do
begin
curr.num := 1; curr.denom := i;
add_ratio(res, curr);
end;
writeln(res.num, '/', res.denom);
readln;
end.

а так правильно? результат 6229/23780=0,2619428. Но ведь 1+1/2+1/3+1/4+...+1/20=3.59773966(примерно)
Lapp
Цитата(marwell @ 4.01.2010 15:32) *
а так правильно? результат 6229/23780=0,2619428. Но ведь 1+1/2+1/3+1/4+...+1/20=3.59773966(примерно)
Исправь тип функций с integer на LongInt.
И никогда не отключай range check до окончания отладки.
volvo
Цитата
а так правильно? результат 6229/23780=0,2619428.
blink.gif То у тебя Дельфи, теперь ты переходишь на 16-битный Турбо-Паскаль... Ты уж для себя выбери что-то одно, а то знаешь ли, можно таких дел наворочать, рассчитывая на один компилятор, а используя другой...
marwell
Цитата(Lapp @ 5.01.2010 7:11) *

Исправь тип функций с integer на LongInt.
И никогда не отключай range check до окончания отладки.

спасибо большое

Добавлено через 3 мин.
Цитата(volvo @ 5.01.2010 10:28) *

blink.gif То у тебя Дельфи, теперь ты переходишь на 16-битный Турбо-Паскаль... Ты уж для себя выбери что-то одно, а то знаешь ли, можно таких дел наворочать, рассчитывая на один компилятор, а используя другой...

просто проходим мы паскаль, а мне привычнее на дельфи, на паскале я раньше почти не работал...
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.