Али_ааа 1 / 1 / 0 Регистрация: 23.12.2010 Сообщений: 52 |
||||
1 |
||||
Найти сумму двух дробей14.10.2011, 21:43. Показов 7750. Ответов 1 Метки нет (Все метки)
даны две положительные дроби:a/b и c/d. найдите их сумму и напишите ответ в виде несократимой дроби. Добавлено через 4 минуты
0 |
Puporev Почетный модератор 64284 / 47583 / 32739 Регистрация: 18.05.2008 Сообщений: 115,182 |
||||
15.10.2011, 09:31 |
2 |
|||
0 |
program slogenie_drobei;
{Bez okraglenija rezultata}
var
C1,C2,Z1,Z2,OZ,S: REAL;
begin
Write(‘vvedite chislitel 1 drobi: ‘);
ReadLN(C1);
Write(‘vvedite znamenatel 1 drobi: ‘);
ReadLN(Z1);
Write(‘vvedite chislitel 2 drobi: ‘);
ReadLN(C2);
Write(‘vvedite znamenatel 2 drobi: ‘);
ReadLN(Z2);
OZ := Z1*Z2;
S := C1+C2;
WriteLN(‘OTVET’);
WriteLN(‘chislitel ‘,S:2:0);
WriteLN(‘znamenatel ‘,OZ:2:0);
ReadLN
END.
{Результат получился без округления дроби, если знаете как сделать напишите мне, я переделаю программу}
Таня ФедороваУченик (177)
4 года назад
program Evklid;
var m, n: integer;
begin
writeln(‘Введите m, n’);
readln(m, n);
while m<>n do
if m>n then m:=m-n
else n:=n-m;
writeln(‘НОД =’,m);
end.
добавьте это и все получится
uses crt; const max=20; type frac=record //тип дробь p:integer;//числитель q:1..maxint;//знаменатель end; procedure Sokr(var a:frac); {Сокращение дроби} function Nod(a,b:integer):integer;{нахождение НОД} begin while a<>b do if a>b then a:=a-b else b:=b-a; Nod:=a End; var q:integer; begin q:=Nod(abs(a.p),a.q); a.p:=a.p div q; a.q:=a.q div q; end; procedure Summa(a,b:frac;var c:frac);//сложение двух дробей begin c.p:=a.p*b.q+b.p*a.q;{вычисляемем числитель} c.q:=a.q*b.q; end; var a:array[1..max] of frac; s:frac; n,i,j:integer; begin clrscr; randomize; repeat write('Размер массива до ',max,' n='); readln(n); until n in [1..max]; writeln('Исходный массив дробей:'); for i:=1 to n do begin repeat a[i].p:=random(20)-5; until a[i].p<>0;//без нолей a[i].q:=random(10)+1; write(a[i].p,'/',a[i].q,' '); end; writeln; for i:=1 to n-1 do begin Summa(a[i],a[i+1],s);//складываем 2 рядом a[i+1]:=s;//запоминаем сумму end; Sokr(s); write('Сумма=',s.p,'/',s.q); readln end.
Вот еще вариант, с обработкой элементарных ошибок:
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.
§ 23. Вспомогательные алгоритмы и подпрограммы ГДЗ по Информатике для 10 класса Семакин.
Составьте программу сложения двух простых дробей. Результат должен быть несократимой дробью. Используйте подпрограмму вычисления НОД по алгоритму Евклида. Простая дробь задается двумя целыми числами: числителем и знаменателем.
Ответ
Program nd;
function nod(n,m: integer): integer;
begin
while(n<>0) and (m<>0) do
begin
if n>=m then n:=n mod m else m:=m mod n;
end;
nod:=m+n;
end;
var m1,m2,n1,n2,t: integer;
begin
write(‘введите числитель и знаменатель 1 дроби через пробел: ‘);
readln(m1,n1);
write(‘введите числитель и знаменатель 2 дроби через пробел: ‘);
readln(m2,n2);
t:=nod(n2m1+m2n1,n1n2); write(m1,’/’,n1,’ + ‘,m2,’/’,n2,’ = ‘,(n2m1+m2n1) div t,’/’,(n1n2) div t);
end.