Как найти сумму дробей в паскале

Али_ааа

1 / 1 / 0

Регистрация: 23.12.2010

Сообщений: 52

1

Найти сумму двух дробей

14.10.2011, 21:43. Показов 7750. Ответов 1

Метки нет (Все метки)


Студворк — интернет-сервис помощи студентам

даны две положительные дроби:a/b и c/d. найдите их сумму и напишите ответ в виде несократимой дроби.

Добавлено через 4 минуты

Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
uses crt;
var
a, b, c, d: integer;
s: real;
begin
Writeln('a='); Readln(a);
Writeln('b='); Readln(b);
Writeln('c='); Readln(c);
Writeln('d='); Readln(d);
S:=(a*d+b*c)/(b*d);
write('s=');
readln
end.



0



Puporev

Почетный модератор

64284 / 47583 / 32739

Регистрация: 18.05.2008

Сообщений: 115,182

15.10.2011, 09:31

2

Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
uses crt;
var
a, b, c, d, p, p1, q, q1: integer;
s: real;
begin
clrscr;//если не Паскаль АВС
repeat
writeln('Введите числители и знаменатели двух дробей, натуральные числа:');
Write('a='); Readln(a);
Write('b='); Readln(b);
Write('c='); Readln(c);
Write('d='); Readln(d);
until(a>0)and(b>0)and(c>0)and(d>0);
p:=a*d+b*c;
q:=b*d;
//найдем НОД числителя и знаменателя
p1:=p;
q1:=q;
while p1<>q1 do
if p1>q1 then p1:=p1-q1 else q1:=q1-p1;
p:=p div p1; //сократим дробь
q:=q div p1;
write('s=',p,'/',q);
readln //если не Паскаль АВС
end.



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.

Informatika-10-klass-Semakin ГДЗ § 23. Вспомогательные алгоритмы и подпрограммы

§ 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.


Добавить комментарий