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

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

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

Автор: MiH@N 14.01.2008 1:47

помогите решить с кратким объяснением(если можно).(пробовал сам но не удаётся 'Реузультат должен быть несократимой дробью"-выполнить это условие wacko.gif .)
14. Даны две дроби A/B и C/D (A,B,C,D-натуральные числа). Составить программу для вычитания из первой дроби второй. Реузультат должен быть несократимой дробью.

Автор: compiler 14.01.2008 1:53

дублировать темы это не хорошо http://forum.pascal.net.ru/index.php?showtopic=21102
тем более Оzzя тебе уже все решил...

Автор: MiH@N 14.01.2008 2:00

не совсем понял как решил...

Автор: compiler 14.01.2008 2:03

Цитата(MiH@N @ 13.01.2008 21:00) *
не совсем понял как решил...
на каком этапе остановился?
1)читаешь две дроби(четыре целых числа)
2)считаешь числитель и знаменатель для результирующей дроби
3)сокращаешь дробь
3а) поиск НОД-а
3б) деление числителя и знаменателя на НОД
4)вывод результата

Автор: MiH@N 14.01.2008 2:06

так прафильно будет?

undefinedprogram program zadanie 3;
uses crt;
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;

function nok(a,b:integer):integer;
begin
nok:=round((a*b)/nod(a,b));
end;

procedure minus(a,b,c,d:integer;var x,y:integer);
var m:integer;
begin
x:=a*(nok(b,d) div b)-c*(nok(b,d) div d);
y:=nok(b,d);
m:=nod(abs(x),y);
x:=x div m;
y:=y div m;
end;

var n1,n2,m1,m2,x,y:integer;
begin
clrscr;
write('Введите числитель первой дроби: ');readln(n1);
repeat
write('Введите знаменатель первой дроби: ');readln(n2);
until n2>0;
write('Введите числитель второй дроби: ');readln(m1);
repeat
write('Введите знаменатель второй дроби: ');readln(m2);
until m2>0;
minus(n1,n2,m1,m2,x,y);
clrscr;
if m1>=0 then writeln(n1,'/',n2,'-',m1,'/',m2,'=',x,'/',y) else
writeln(n1,'/',n2,'-(',m1,'/',m2,')=',x,'/',y);
readkey;
end.

Автор: compiler 14.01.2008 2:30

замечательно!
только следует добавить одно условие

        if x<>0 then begin
m:=nod(abs(x),y);
x:=x div m;
y:=y div m; end;

Автор: MiH@N 14.01.2008 2:52

а такое условие не нужно :

If b<0 or d<0 then...


Добавлено через 10 мин.
Цитата(compiler @ 13.01.2008 21:30) *
замечательно!
только следует добавить одно условие
а можно поточнее-куда добавить??

Автор: compiler 14.01.2008 3:06

Цитата(MiH@N @ 13.01.2008 21:52) *
а такое условие не нужно
ты ж вроде это при чтении проверяешь
Цитата(MiH@N @ 13.01.2008 21:52) *
а можно поточнее-куда добавить??
в процедуру minus, противном случае если отнять два равных числа получим глюк)

Автор: MiH@N 14.01.2008 3:13

а в блок-схеме как это намалевать?

Автор: compiler 14.01.2008 3:26

Цитата(MiH@N @ 13.01.2008 22:13) *
а в блок-схеме как это намалевать?
по поиску можешь найти программы которые это сделают...

Автор: MiH@N 15.01.2008 0:37

Цитата(compiler @ 13.01.2008 22:26) *

по поиску можешь найти программы которые это сделают...

а пару ссылок на наиболее грамотные подкинуть не можешь?.. ато скачал несколько...одна с треском и шумом но всёж коряво работает а другая вообще pas.-ы не грузит(хотя должна).