pascal- největší společný dělitel

Místo pro dotazy a rady ohledně programovacích jazyků (C++, C#, PHP, ASP, Javascript, VBS..) a tvorby webových stránek

Moderátor: Mods_senior

apurvathea
Level 2
Level 2
Příspěvky: 203
Registrován: březen 07
Pohlaví: Žena
Stav:
Offline

pascal- největší společný dělitel

Příspěvekod apurvathea » 10 led 2010 18:08

Ahoj, mám za úkol napsat program který zjistí největší společný dělitel dvou čísel. Našla jsem na internetu- níže napsaný.
Říká tedy- tučná část, jestliže a bude větší než b- zmenši číslo a o číslo b jinak zmenši číslo b o číslo a.
další řádek s podmínkou if mi není jasný- tedy jeho druhá část else Delitel:=Delitel(a,b); není mi jasné- proč tam jsou hodnoty a i b
Pokud tedy budu mít napříkald čísla 18 a 10. Mám číslo a větší než číslo b. Odečte se mi tedy od čísla 18-10. Vysledek 8. Delitel tedy bude? Vím že má vyjít 2- ale jak k tomu ten program dospěje? Moc díky za pomoc.

Program nsd;
{$APPTYPE CONSOLE}
uses
SysUtils;
Var a,b : integer;
Function Delitel(a,b:integer):integer;
Begin
if a > b then Dec(a,b) else Dec(b,a);
if (b=0) or (a=0) then Delitel:=a or b else Delitel:=Delitel(a,b);

End;
Begin
Writeln('Zadej dve cisla :');
Readln(a,b);
writeln('n(',a,',',b,') = ',delitel(a,b));
Readln;
end.

Reklama
ini808
Level 3.5
Level 3.5
Příspěvky: 815
Registrován: prosinec 05
Pohlaví: Nespecifikováno
Stav:
Offline

Re: pascal- největší společný dělitel

Příspěvekod ini808 » 10 led 2010 18:29

Máš dvě čísla, v tomto případě 18 a 10 a vždy se odečte větší od menšího; následně se pokračuje s rozdílem a menším z číslem dokud obě čísla nebudou stejná. Tedy:
1) 18>10 => 18-10 = 8, pokračuje se s 10 a 8
2) 10>8 => 10-8 = 2, pokračuje se s 8 a 2
3) 8>2 => 8-2 = 6, pokračuje se s 6 a 2
4) 6>2 => 6-2=4, pokračuje se s 4 a 2
5) 4>2 => 4-2=2, pokračuje se s 2 a 2
6) 2=2 => nalezen největší společný dělitel

Edit:
Možná trochu srozumitelnější než rekurze je následující cyklus (c++):

[syntax]int a; int b;
cout << "Zadat prvni cislo ";
cin >> a;
cout << "Zadat druhe cislo ";
cin >> b;
while (a != b)
{
if (a>b) a=1+(a-1)%b;
else b=1+(b-1)%a;
}
cout << "Nejvetsi spolecny delitel: "<< a;[/syntax]
Naposledy upravil(a) ini808 dne 10 led 2010 18:54, celkem upraveno 1 x.

Uživatelský avatar
CZechBoY
Master Level 9.5
Master Level 9.5
Příspěvky: 8813
Registrován: srpen 08
Bydliště: Brno
Pohlaví: Muž
Stav:
Offline
Kontakt:

Re: pascal- největší společný dělitel

Příspěvekod CZechBoY » 10 led 2010 18:43

ini808: zdrojové kódy dávej prosím do syntax funkce.
Taky autorka tématu chce program v jazyku Pascal nikoli C++

Jak se vůbec počítá ten dělitel ? :blush:
PHP, Nette, MySQL, C#, TypeScript, Python
IntelliJ Idea, Docker, Opera browser, Linux Mint
iPhone XS
Raspberry PI 3 (KODI, Raspbian)
XBox One S, PS 4, nVidia GeForce NOW

apurvathea
Level 2
Level 2
Příspěvky: 203
Registrován: březen 07
Pohlaví: Žena
Stav:
Offline

Re: pascal- největší společný dělitel

Příspěvekod apurvathea » 10 led 2010 18:50


apurvathea
Level 2
Level 2
Příspěvky: 203
Registrován: březen 07
Pohlaví: Žena
Stav:
Offline

Re: pascal- největší společný dělitel

Příspěvekod apurvathea » 10 led 2010 18:51

ini 808- takze to delitel(a,b) vlastne bude nakonci vypadat jakoby delitel(2,2) ?

ini808
Level 3.5
Level 3.5
Příspěvky: 815
Registrován: prosinec 05
Pohlaví: Nespecifikováno
Stav:
Offline

Re: pascal- největší společný dělitel

Příspěvekod ini808 » 10 led 2010 18:58

ano, nakonec se bude volat fce delitel(2, 2), která vrátí hodnotu 2

CZechBoY: omlouvám se, kód upraven
Já vím, mluvilo se o kódu v Pascalu, ale také o porozumění Euklidovu algoritmu. Když jsem měl uložen tento kód, tak jsem ho poslal. Je podle mě čitelný i neznalým c++, respektive málo znalým programování. Jestli se ti nelíbí, můžeš ho přepsat :smile:

apurvathea
Level 2
Level 2
Příspěvky: 203
Registrován: březen 07
Pohlaví: Žena
Stav:
Offline

Re: pascal- největší společný dělitel

Příspěvekod apurvathea » 10 led 2010 19:28

tak jsem si to nakonec upravila takhle:
[syntax]uses
SysUtils;
var a,b:integer;
begin
{ TODO -oUser -cConsole Main : Insert code here }
writeln ('zadej cislo a,b');
readln (a,b);
repeat
if a>b then a:=(a-b) else b:=(b-a);

until a=b;
writeln('nsd je ',a);
readln;
end.[/syntax]

ted ještě potřebuju aby z toho spočítal nejmenší společný násobek těch dvou čísel. Tedy aby provedl (a*b) / hodnotou, ktera mi vysla jako nejvetsi spolecny delitel.. Tedy 18*10 div 2= 90. Ale nevím jak v programu použít číslo které mi vyjde jako nejmenší společný dělitel. Budu muset použít funkce? Díky za rady

Uživatelský avatar
CZechBoY
Master Level 9.5
Master Level 9.5
Příspěvky: 8813
Registrován: srpen 08
Bydliště: Brno
Pohlaví: Muž
Stav:
Offline
Kontakt:

Re: pascal- největší společný dělitel

Příspěvekod CZechBoY » 10 led 2010 20:01

Sice Pascal neumim, ale hodnotu výsledku získáš třeba takhle: výsledek=a+b;
zkusim někde najít knížku o Pascalu, někde jsem ji doma měl :D
jo a zkuste dát [ syntax lang=pascal]váš kód [/syntax]
PHP, Nette, MySQL, C#, TypeScript, Python
IntelliJ Idea, Docker, Opera browser, Linux Mint
iPhone XS
Raspberry PI 3 (KODI, Raspbian)
XBox One S, PS 4, nVidia GeForce NOW

apurvathea
Level 2
Level 2
Příspěvky: 203
Registrován: březen 07
Pohlaví: Žena
Stav:
Offline

Re: pascal- největší společný dělitel

Příspěvekod apurvathea » 10 led 2010 20:05

v pascalu je to myslí takhle : vysledek:= a*b;
takze bych napsala vysledek:= (a*b) div a ted prave nevim co napsat- když napíšu div a - tak je to hloupost.

Uživatelský avatar
Tomina
Level 5.5
Level 5.5
Příspěvky: 2690
Registrován: březen 08
Bydliště: Praha
Pohlaví: Muž
Stav:
Offline
Kontakt:

Re: pascal- největší společný dělitel

Příspěvekod Tomina » 10 led 2010 20:12

Já mám mezi cvičeními ze školy toto:

[syntax]program NSNaNSD;

{$APPTYPE CONSOLE}


uses
SysUtils;

var x,y:integer;

function nsd(a,b:integer):integer; {nejvetsi spolecny delitel}
var
zbytek:integer;

begin
repeat {postupne deleni}
zbytek:=a mod b; {zjistovani zbytku po deleni}
a:=b;
if zbytek = 0 then break else b:=zbytek;
until zbytek=0;

nsd:=b;
end;

function nsn(a,b:longint):longint; {nejmensi spolecny nasobek}
begin
nsn:=(a*b) div nsd(a,b);
end;

begin

write('Zadejte cislo x: ');
readln(x);

write('Zadejte cislo y: ');
readln(y);

writeln;
writeln('Nejvetsi spolecny delitel je: ', nsd(x,y));
writeln('Nejmensi spolecny nasobek je: ', nsn(x,y));
readln;
end.
[/syntax]

apurvathea
Level 2
Level 2
Příspěvky: 203
Registrován: březen 07
Pohlaví: Žena
Stav:
Offline

Re: pascal- největší společný dělitel

Příspěvekod apurvathea » 10 led 2010 20:16

tomina- díky, tenhle zápis jsem taky našla- ale přišlo mi to složitý :oops: , ty funkce mi nějak nejdou, no pascal se učim 2 dny- v pondělí jdu na zkoušku. Takže je tam asi stejně budu muset zakomponovat... sakra :x

Uživatelský avatar
Tomina
Level 5.5
Level 5.5
Příspěvky: 2690
Registrován: březen 08
Bydliště: Praha
Pohlaví: Muž
Stav:
Offline
Kontakt:

Re: pascal- největší společný dělitel

Příspěvekod Tomina » 11 led 2010 10:42

Já jdu ve středu také na zkoušku z pascalu, drtím to už snad dva měsíce a prostě na to nemám hlavu, jsou to samé funkce, matice, integrály, bla bla bla...je to strašný...jestli to dám, tak se půjdu pořádně ožrat :-D


Zpět na “Programování a tvorba webu”

Kdo je online

Uživatelé prohlížející si toto fórum: Žádní registrovaní uživatelé a 6 hostů