Помощь - Поиск - Пользователи - Календарь
Полная версия: Процедуры и функции
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
-Наташа-
Разработаите функцию, которая находит НОД двух целых чисел. Разработайте процедуру, вычисляющую сумму двух обыкновенных дробей. Напишите программу, которая находит сумму n заданных обыкновенных дробей.
mind abuse
Цитата(-Наташа- @ 13.05.2008 21:26) *

Разработаите функцию, которая находит НОД двух целых чисел. Разработайте процедуру, вычисляющую сумму двух обыкновенных дробей. Напишите программу, которая находит сумму n заданных обыкновенных дробей.

Эмм, вы сговорились) Задача

Как должны вводиться обыкновенные дроби?
-Наташа-
не знаю в задании не указаноsad.gif
renesko1
можно наверное так 2/6 если что не забыл.
Гость
Мальчики ну помогите полажуйста
mind abuse
Цитата(Гость @ 13.05.2008 22:07) *

Мальчики ну помогите полажуйста

Подождите пожалуйста 15 минут
mind abuse
Код
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
Цитата
Наверняка нерационально
Мало того, что нерационально, так еще и неправильно... 2/3 + 3/4 не равно 5/7, как утверждает твоя программа... В задании совсем не просто так просят найти НОД двух чисел... rolleyes.gif
mind abuse
Тьфууу((( Тяжёлый был день( Сейчас исправлю.
mind abuse
Код
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
Вот еще вариант, с обработкой элементарных ошибок:
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.
Гость
Спасибо вам огромноеsmile.gif
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.