singlepost

помогите срочно!!! Уккажите ошибки в проге на паскале!!! << На главную или назад  

программа должна определять скократима дробь или нет, елси да то должно быть сообщение "дробь сократима" иначе "дробь нескоратима"
вот код:
program bh;
var c,zn:integer; c1,zn1:real;
procedure Dr(Ch,z:integer; var ch1:real; var Z1:real);
var d:integer; t,j:real;
label 10;
begin
d:=1;
repeat
if abs(ch) > abs(z) then d:=ch else d:=z;
t:=ch/d;
j:=z/d;
if (frac(t)=0) and (frac(j)=0) then d:=d-1;
else
begin

Ch1:=ch/d;
z1:=z/d;

writeln('dro6b sokr');
goto 10;
end;

until (d=1);

z1:=z;
ch1:=ch;
writeln('dro6b ne sokr');
10:end;
begin
writeln('vvedite 4islitelb c, u znavenatelb zn');
readln(c,zn);
dr(c,zn,c1,zn1);

readln
end.

3 ответов в теме “помогите срочно!!! Уккажите ошибки в проге на паскале!!!”

  1. 1
    Евгений Будан ответил:

    начал разбирать и к середине стало влом…Коля… мой тебе совет – не используй goto, это плохой тон. И давай осмысленные названия переменным – напрягает разбираться в этой мешанине.

    З.Ы. по теме – похоже в условиях не стоят begin и end, алгоритм вообще не продуман

  2. 2
    Михаил Малеванный ответил:

    Метки не стоит использовать.
    Дальше, раз в процедуру на вход поступают целые значения, то если дробь сократима, то и на выходные параметры должныбыть целые и все вычисления должны быть с целочисленными переменными. Использование вещественных вообще говоря некорректно из-за погрешностей вычислений.

    Для определения, сократима ли дробь лучше использовать алгоритм Евклида для нахождения НОД.
    Если НОД = 1, то дробь несократима. Иначе – сократима.

    Что-то в таком духе (пишу по памяти, без проверки в паскале, могут быть ошибки), ввод/вывод взят из оригинала :-)

    var ch, z, n: integer;

    function nod(var a, 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;

    begin
    writeln('vvedite 4islitelb c, u znavenatelb zn');
    readln(c,zn);
    n := nod(c, zn);
    if n = 1 then
    writeln('dro6b ne sokr')
    else
    writeln('dro6b sokr');
    readln;
    end.

    Если нужны еще и сами значения числителя и знаменателя после сокращения – то нужно исходные значения целочисленно (div) разделить на полученный НОД.

  3. 3
    Колян Вялков ответил:

    спс всем, что помогли, а особенно Михаилу, да только я там не много исправил и все работает)))

Клуб программистов работает уже ой-ой-ой сколько, а если поточнее, то с 2007 года.