Spolecny jmenovatel dvou zlomku – Pascal – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu
Reklama
Reklama

Spolecny jmenovatel dvou zlomku – Pascal – Fórum – Programujte.comSpolecny jmenovatel dvou zlomku – Pascal – Fórum – Programujte.com

 

Hledá se programátor! Plat 1 800 € + bonusy (firma Boxmol.com)
romanzdk0
Newbie
4. 5. 2015   #1
-
0
-

Zdravim, resim problem se spolecnym jmenovatelem dvou zlomku...

Dostanu ctyri cisla na vstupu, z tech vytvorim 2 zlomky a ty mam prevest na 2zlomky se stejnym jmenovatelem, ale ani za nic mi nejde udelat. Pokud mozno, co nejjednoduseji, pokud by to slo treba bez tech NSD a NSN. Kod:

program zlomky;
type zlomek=array[1..2] of integer;

procedure vytvor(a,b:integer; var x:zlomek);
begin
  readln(x[1],x[2]);
end;

function nsd(var x,y:zlomek):integer;
var zb:integer;
begin
  repeat
    zb:=x[2] mod y[2];
    x[1]:=y[2];
    if zb=0 then break else y[2]:=zb;
  until zb=0;
  nsd:=y[2];
end;

function nsn(x,y:zlomek):integer;
begin
  nsn:=(x[2]*y[2]) div nsd(x,y);
end;

procedure spolJ(x,y:zlomek; var x2,y2:zlomek);
begin
  x2[2]:=nsn(x,y);
  y2[2]:=nsn(x,y);
  x2[1]:=((x2[2]/x[2])*x[1]);
  y2[1]:=((y2[2]/y[2])*y[1]);
end;

procedure zapis(var x:zlomek);
begin
  if x[2]<>1 then writeln(x[1],'/',x[2]) else writeln(x[1]);
end;

var x,x2,y,y2,z,z2:zlomek;
    a,b:integer;
begin
vytvor(a,b,x);
zapis(x);
vytvor(a,b,y);
zapis(y);
writeln('Spolecny jmenovatel: '); spolJ(x,y,x2,y2); zapis(x2); zapis(y2);
end.

Predem diky vsem za rady.

Nahlásit jako SPAM
IP: 82.100.31.–
Reklama
Reklama
Sniper
~ Anonymní uživatel
184 příspěvků
4. 5. 2015   #2
-
0
-

Máš to zbytečně složitý (zlomek jako array, proč?) a zmatený, důsledkem čehož asi někde špatně přiřazuješ. Nebudu to hledat, rozbolela by mě z toho hlava. Takhle bych to řešil já, můžeš se inspirovat: 

program Project2;

{$APPTYPE CONSOLE}

uses
  SysUtils;

  //Greatest common divisor
  Function GCD(A,B: Integer): Integer;
  var
    Remainder:  Integer;
  begin
    repeat
      Result := B;
      Remainder := A mod B;
      A := B;
      B := Remainder;
    until Remainder = 0;
  end;

//------------------------------------------------------------------------------

  //Least common multiple
  Function LCM(A,B: Integer): Integer;
  begin
    Result := Abs(A * B) div GCD(A,B);
  end;

//------------------------------------------------------------------------------  

type
  TFraction = record
    Numerator:    Integer;
    Denominator:  Integer;
  end;

//------------------------------------------------------------------------------

  Function EnterFraction(const Text: String; out Fraction: TFraction): Boolean;

    Function ReadInteger(const ReadText: String; out Number: Integer): Boolean;
    var
      Str:  String;
    begin
      Result := False;
      repeat
        Write(ReadText); ReadLn(Str);
        If Str = '*' then Exit;
        Result := TryStrToInt(Str,Number);
        If not Result then WriteLn(Str + ' is not a valid number');
      until Result;
    end;

  begin
    WriteLn(Text);
    Result := False;
    If ReadInteger('  Enter fraction numerator: ',Fraction.Numerator) then
      repeat
        If ReadInteger('  Enter fraction denominator: ',Fraction.Denominator) then
          begin
            If Fraction.Denominator = 0 then WriteLn('Denominator must not be 0.');
            Result := Fraction.Denominator <> 0;
          end
        else Exit;
      until Fraction.Denominator <> 0;
  end;

//------------------------------------------------------------------------------

  procedure CommonDenominator(var Fract1, Fract2: TFraction);
  var
    Temp: Integer;
  begin
    Temp := LCM(Fract1.Denominator,Fract2.Denominator);
    Fract1.Numerator := (Temp div Fract1.Denominator) * Fract1.Numerator;
    Fract2.Numerator := (Temp div Fract2.Denominator) * Fract2.Numerator;
    Fract1.Denominator := Temp;
    Fract2.Denominator := Temp;
  end;

//------------------------------------------------------------------------------

  procedure WriteFraction(Fraction: TFraction);
  begin
    If Fraction.Denominator = 1 then WriteLn(Fraction.Numerator)
      else WriteLn(Fraction.Numerator,'/',Fraction.Denominator)
  end;

//------------------------------------------------------------------------------

var
  Fract1: TFraction;
  Fract2: TFraction;

begin
  If EnterFraction('Enter fraction 1', Fract1) and EnterFraction('Enter fraction 2', Fract2) then
    begin
      WriteLn;
      Write('Fraction 1: '); WriteFraction(Fract1);
      Write('Fraction 2: '); WriteFraction(Fract2);
      CommonDenominator(Fract1,Fract2);
      WriteLn;
      Write('Common denominator: '); WriteLn(Fract1.Denominator);
      WriteLn;
      Write('Fraction 1: '); WriteFraction(Fract1);
      Write('Fraction 2: '); WriteFraction(Fract2);      
    end;
  WriteLn;
  Write('Press enter to end the program...'); ReadLn;
end.

Moc jsem to ale nekontroloval.

Nahlásit jako SPAM
IP: 90.179.201.–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 8 hostů

Moderátoři diskuze

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032016 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý