Obsah lekce:
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 .
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í.
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.
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
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
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.
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.
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.