Anglická verze
logolink

< Zpět na seznam lekcí

Základní programátorské konstrukce I

AlgortimyObsah lekce:

  • Funkce JeVetsi pro porovnání dvou zadaných hodnot
  • Procedura Setrid, která setřídí pole od nejmenšího čísla po největší
  • Funkce Maximum, která vrátí největší prvek pole

Funkce JeVetsi pro porovnání dvou zadaných hodnot

Chceme vytvořit proceduru, která porovná dvě zadaná čísla a vrátí true proměnné AjeVetsiNezB (je datového typu boolean, který může mít hodnotu true nebo false), pokud je první z nich větší než druhé. Jinak vrátí false.

Mohou nastat tři různe výsledky: a = b , a < b nebo a > b. Hodnoty porovnáváme pomocí operátoru IF (podmínka) THEN a ELSE. Začatek a konec těchto funkcí vymezujeme pomocí BEGIN a END. Pokud neplatí podmínka u IF, tak začne probíhat ELSE. Jistě si všimnete, že v programu není nikde zadána podminka a > b. Není tam uvedena, protože pokud neplatí ani jedna z dvou předchozích možností( a = b , a < b ), tak musí logicky platit, že a > b .

Algoritmus pro porovnávání dvou čísel
 program JeVetsi;
 {$APPTYPE CONSOLE}
 uses
   SysUtils;
 var a,b:integer;
     AjeVetsiNezB:boolean;
 begin
  writeln('Zadejte cislo a:');
  readln(a);
  writeln('Zadejte cislo b:');
  readln(b);
  if (a = b)then
   begin
    AjeVetsiNezB:=false;
      writeln;
    writeln(a,' = ',b,' => Hodnota cisla A je rovna hodnote cisla B' );
   end
  else
   begin
    if (a < b) then
     begin
      AjeVetsiNezB:=false;
      writeln;
      writeln(a,' < ',b,' => Hodnota cisla A je mensi nez hodnota cisla B');
     end
    else
     begin
      AjeVetsiNezB:=true;
      writeln;
      writeln(a,' > ',b,' => Hodnota cisla A je vetsi nez hodnota cisla B');
     end;
    end;
  writeln;
  writeln('Pro ukonceni programu stisknete libovolnou klavesu');
  readln;
 end.

Chceme-li také specifikovat co je má stát, když podmínka neplatí, pak příkaz IF-THEN obsahuje ještě část ELSE, která se vykoná, pokud podmínka neplatí.

Procedura Setrid, která setřídí pole od nejmenšího čísla po největší

Pokud chceme seřadit nějaké prvky v poli, musíme nejprve pole vytvořit. Konstanta n udává počet prvků v poli. Chceme-li snížit nebo zvýšit počet prvků pole, stačí změnit její hodnotu. V type pojmenujeme pole jako pole, které bude mít 1 až n prvků a bude obsahovat čísla typu integer, tedy celá čísla.

K naplnění pole poslouží jednoduchý FOR cyklus, který chce po uživateli zadat čísla, které má pole obsahovat.

Inicializace pole
 const n=10;
 type pole=array [1..n]of integer;
 var p:pole;

  for i:=1 to n do
   begin
    writeln('Zadejte hodnotu ',i,' pole');
    readln(p[i]);
   end;

Čísla budeme řadit pomocí toho, ze pole budeme prochazet zleva doprava a pokud je předcházející prvek větší než prvek následující, tak je prohodíme. Analogicky prochazíme pole zprava doleva, abychom urychlili řazení. Po prvním průchodu máme na začatku pole(vlevo) nejmenší prvek a na konci (vpravo) největší prvek pole, je tedy zbytečné procházet první a poslední prvek, kdyz už jsou seřazené a tak zavedeme proměnnou k (musí být ze zacátku nastavená na 1, jinak by program správně nefungoval), která tento připad ošetří. Budeme tedy procházet pole dokud prvky nebudou seřazeny tedy dokud proměnná serazene nebude TRUE.

Pokud je následujíci prvek menší než předcházející, tak prohodíme čísla. Do pomocné proměnné pom uložíme hodnotu jednoho prvku. Do prvku pole, jehož hodnotu máme uloženou v pom, dosadíme hodnotu druhého prvku pole. p[i+1]:=pom - nakonec do druhého prvku pole vložíme hodnotu proměnné pom

BUBBLESORT
  k:=1;
  serazene:=false;
  WHILE (serazene=false) DO
   begin
    serazene:=true;
    FOR i:=(0+k) to (n-k) DO
     begin
      IF (p[i]>p[i+1]) THEN
       begin
        pom:=p[i];
        p[i]:=p[i+1];
        p[i+1]:=pom;
        serazene:=false;
       end;
     end;
     FOR i:=(n-k) downto (1+k) DO
      begin
       IF (p[i] < p[i-1]) then
        begin
         pom:=p[i];
         p[i]:=p[i-1];
         p[i-1]:=pom;
         serazene:=false;
        end;
       end;
    k:=k+1;
   end;

Při každém prúchodu programem se k zvýší o 1 - nebudou se řadit již seřazená čísla. Na začátku WHILE nastavíme serazene na TRUE tedy předpokládáme, že prvky pole jsou už seřazené. Pokud ještě prvky nejsou seřazené a proběhne jeden z IF, serazene se změní na FALSE a cyklus WHILE proběhne znovu

Algoritmus pro řazení čísel- BUBBLESORT
 program Setrid;
 {$APPTYPE CONSOLE}
 uses
   SysUtils;
 const n=10;
 type pole=array [1..n]of integer;
 var p:pole;
     i,k,pom:integer;
     serazene:boolean;
 begin
  for i:=1 to n do
   begin
    writeln('Zadejte hodnotu ',i,' pole');
    readln(p[i]);
   end;
  k:=1;
  serazene:=false;
  WHILE (serazene=false) DO
   begin
    serazene:=true;
    FOR i:=(0+k) to (n-k) DO
     begin
      IF (p[i] > p[i+1]) THEN
       begin
        pom:=p[i];
        p[i]:=p[i+1];
        p[i+1]:=pom;
        serazene:=false;
       end;
     end;
     FOR i:=(n-k) downto (1+k) DO
      begin
       IF (p[i] < p[i-1]) then
        begin
         pom:=p[i];
         p[i]:=p[i-1];
         p[i-1]:=pom;
         serazene:=false;
        end;
       end;
    k:=k+1;
   end;
  writeln;
  for i:=1 to n do
   begin
    if (i=1) then
     write('Serazene hodnoty od nejmensi po nejvetsi: ', p[i])
    else
     write(', ',p[i]);
   end;
  writeln;writeln;
  writeln('Pro ukonceni programu stisknete libovolnou klavesu');
  readln;
 end.

Funkce Maximum, která vrátí největší prvek pole

Hledání maxima můžeme začít již při zadávání hodnot do pole. První zadávanou hodnotu ulozíme i do proměnné max, protože je zatím prázdná a nemáme s čím vkládaný prvek porovnávat. V podstatě tedy uvažujeme, ze první prvek pole je tím největším.

Jestliže narazíme na prvek, který je větší než hodnota max, tak ho uložíme do max.

Algoritmus pro výpis maxima
 program Maximum;
 {$APPTYPE CONSOLE}
 uses
   SysUtils;
 const n=10;
 type pole=array [1..n]of integer;
 var p:pole;
     i,max:integer;
  begin
   for i:=1 to n do
    begin
     writeln('Zadejte hodnotu ',i,' pole');
     readln(p[i]);
     if (i=1) then
      max:=p[1]
     else
      begin
       if (p[i]>max) then
        max:=p[i];
      end;
    end;
   writeln;
   writeln('Nejvetsi prvek pole je hodnota: ',max);
   writeln;
   writeln('Pro ukonceni programu stisknete libovolnou klavesu');
   readln;
  end.
webdesign, xhtml, css, php - Mgr. Michal Mikláš