Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Задачи _ Процедуры и функции

Автор: -Наташа- 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

не знаю в задании не указаноsad.gif

Автор: 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, как утверждает твоя программа... В задании совсем не просто так просят найти НОД двух чисел... rolleyes.gif

Автор: 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;

add_ratio(res, curr);
end;
until curr.num = 0;

writeln('Результат = ', res.num, '/', res.denom);
end.

Автор: Гость 14.05.2008 22:20

Спасибо вам огромноеsmile.gif