Форум «Всё о Паскале» _ Задачи _ Процедуры и функции
Автор: -Наташа- 14.05.2008 0:26
Разработаите функцию, которая находит НОД двух целых чисел. Разработайте процедуру, вычисляющую сумму двух обыкновенных дробей. Напишите программу, которая находит сумму n заданных обыкновенных дробей.
Автор: mind abuse 14.05.2008 0:39
Цитата(-Наташа- @ 13.05.2008 21:26)
Разработаите функцию, которая находит НОД двух целых чисел. Разработайте процедуру, вычисляющую сумму двух обыкновенных дробей. Напишите программу, которая находит сумму n заданных обыкновенных дробей.
Эмм, вы сговорились) http://forum.pascal.net.ru/index.php?showtopic=21877
Как должны вводиться обыкновенные дроби?
Автор: -Наташа- 14.05.2008 0:46
не знаю в задании не указано
Автор: renesko1 14.05.2008 0:50
можно наверное так 2/6 если что не забыл.
Автор: Гость 14.05.2008 1:07
Мальчики ну помогите полажуйста
Автор: mind abuse 14.05.2008 1:12
Цитата(Гость @ 13.05.2008 22:07)
Мальчики ну помогите полажуйста
Подождите пожалуйста 15 минут
Автор: mind abuse 14.05.2008 2:04
Код
Program t1; uses crt; var i:integer;
procedure ratio; var numerator,denominator: array [1..1000] of integer; n,numsum,densum:integer; begin numsum:=0; densum:=0; writeln('input number of ratios'); write('n='); readln(n); writeln('input numerator of ratio, then press "Enter", then input denominator of ratio'); writeln('input ratios');
for i:=1 to n do begin write('ratio ',i,'='); read(numerator[i]); write('/'); read(denominator[i]); end;
for i:=1 to n do begin numsum:=numsum+numerator[i]; densum:=densum+denominator[i]; end; writeln('Sum is ',numsum,'/',densum); end;
begin clrscr; ratio; end.
Наверняка нерационально, +дробную черту на следующую строку не переносит + дробь не упрощает, но работает, а минусы исправимы.
Автор: volvo 14.05.2008 3:46
Цитата
Наверняка нерационально
Мало того, что нерационально, так еще и неправильно... 2/3 + 3/4 не равно 5/7, как утверждает твоя программа... В задании совсем не просто так просят найти НОД двух чисел...
Автор: mind abuse 14.05.2008 4:30
Тьфууу((( Тяжёлый был день( Сейчас исправлю.
Автор: mind abuse 14.05.2008 6:54
Код
Program t1; uses crt; var i: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;
procedure ratio; var numerator,denominator: array [1..1000] of integer; n,numsum,densum,usednod:integer; begin numsum:=0;
writeln('input number of ratios'); write('n='); readln(n); writeln('input numerator of ratio, then press "Enter", then input denominator of ratio'); writeln('input ratios');
for i:=1 to n do begin write('ratio ',i,'='); read(numerator[i]); write('/'); read(denominator[i]); densum:=denominator[1]; numsum:=0; end;
for i:=2 to n do begin densum:=densum*denominator[i]; end;
for i:=1 to n do begin numsum:=numsum+(densum div denominator[i])*numerator[i]; end;
usednod:=NOD(numsum,densum); numsum:=numsum div usednod; densum:=densum div usednod; writeln('Sum is ',numsum,'/',densum); end;
begin clrscr; ratio; end.
По-прежнему сильно корявое, но теперь хоть считает правильно и дробь сокращает. Жалко, что человека предыдущим вариантом подвёл(
Автор: volvo 14.05.2008 15:33
Вот еще вариант, с обработкой элементарных ошибок:
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 div_ratio(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 div_ratio(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;
div_ratio(res); end;
var curr: ratio; const { Изначально результат = 0, т.е. 0/1 } res: ratio = (num:0; denom:1);
begin writeln('Дроби (0 в числителе для окончания подсчета)'); repeat write('Числитель: '); readln(curr.num); if curr.num <> 0 then begin write('Знаменатель: '); readln(curr.denom); if curr.denom = 0 then repeat writeln('Деление на 0 недопустимо!'); write('Знаменатель: '); readln(curr.denom); until curr.denom <> 0;