Sākumlapa
"Pirmā web lapa"
HTML
CSS
Citi materiāli

Ceļošana - kalni


Lazarus (Delphi)

Ievads
Lazarus vide
Pirmā programma
Mainīgie
Globālie mainīgie
Teksta mainīgie
Veselie mainīgie
Decimālie mainīgie
Zarošanās (If)
Cikli - For
Cikls - While
Gadījuma skaitļi
Masīvi_1
Masīvi_2
Konsole
Darbs ar datnēm
Kārtošana (ievads)
Kārto (Burbulis)
Meklēšana (lineāri)

Vēl iesaku:

W3Schools
Krāsu palete

Pārlūku atbalsts CSS
 (1),   (2) 

Zarošanās If ... then ...(else...)

Zarošanās pamatā ir kāds mūsu izvirzīts loģisks apgalvojums uz salīdzināšanas pamata. Atbilstoši, vai mūsu apgalvojums programmas izpildes gaitā izrādīsies patiess vai nepatiess, ir iespējami divi tālākie notikumu attīstības ceļi.

Lai salīdzinātu, var lietot:

Izmantosim triviālo piemēru par ābolu lasīšanu – "Jānis un Ilze piedalās ābolu lasīšanas sacensībās. Jānis salasīja "x" kilogramus, bet Ilze "y" kilogramus, t.i., sākotnēji konkrētas vērtības vēl nav zināmas. Ja vairāk salasīs Jānis, tad būs jāizvada paziņojums "Uzvar Jānis!", bet ja Ilze, tad paziņojums – "Uzvar Ilze!"".

Risinājums - ņemot vērā, ka pagaidām vēl nezinām reālos lasītāju rezultātus, izveidosim modeli, kas nostrādās neatkarīgi no tā, kurš uzvarēs. Apgalvosim, ka "x>y", t.i., PIEŅEMOT, ka Jānis salasīja vairāk. Ja izrādīsies, ka mūsu apgalvojums izrādīsies patiess, tad izvadam paziņojumu "Uzvar Jānis!", pretējā gadījumā (t.i., ja mūsu apgalvojums izrādīsies aplams), izvadīsim "Uzvar Ilze!". Vai ievērojāt risinājuma atslēgas vārdus izceltus treknrakstā?

Ja (apgalvojums) tad (darām to) pretējā gadījumā (darām šito)

Atliek tikai tos iztulkot angliski!

If x>y then (izvadām "Uzvar Jānis!") else (izvadām "Uzvar Ilze!")

Lūk, arī sazarojums! Tātad apgalvojumā faktiski mēs minam jeb pieņemam, bet sekas, jeb tālāko rīcību, gan varam paredzēt abiem gadījumiem – uzminējām vai nē. Ievērosim arī, ka salīdzinot ar apgalvojumu, ir iespējami tikai DIVI notikumu tālākās attīstības "zari" jeb scenāriji!

Ja šo domu gājienu vēlētos attēlot shematiski, jeb blokshēmā, tad izskatītos apmēram šādi:

zar_if

Noprogrammēsim minēto uzdevumu:

zar_if

procedure TForm1.Button1Click(Sender: TObject);
var x,y:byte;
begin

   x:=strtoint(edit1.text);{Lietotāja ievadīto vērtību piešķir mainīgajam "x" un to no tekstuālas vērtības pārvērš par veselu skaitli, lai varētu veikt aprēķinus}
   y:=strtoint(edit2.text);{Lietotāja ievadīto vērtību piešķir mainīgajam "y" un to no tekstuālas vērtības pārvērš par veselu skaitli, lai varētu veikt aprēķinus}
   if x>y then{Paredzam gadījumu, ja izrādītos, ka Jānis salasījis vairāk}
      label3.caption:='Uzvar Jānis'{Izvadam paziņojumu}
   else{Paredzam PRETĒJO gadījumu - ja Jānis NEBŪS salasījis vairāk}
      label3.caption:='Uzvar Ilze';{Izvadam paziņojumu}
end;

If bloks beidzas tikai aiz else gadījuma apskates (aiz 'Uzvar Ilze') un tikai tur beidzot ir liekams semikols! P.S. If-s ar "Enteriem" un atkāpēm ir sadalīts tikai pārskatāmības labad – to visu varēja rakstīt arī vienā rindiņā ievērojot atstarpes...

...
if x>y then label3.caption:='Uzvar Jānis' else label3.caption:='Uzvar Ilze';
...


Tiesa, šoreiz to pašu varēja noprogrammēt, izmantojot divus if, bet neizmantojot else, t.i., else lietošana katrā if-ā nav obligāta!

procedure TForm1.Button1Click(Sender: TObject);
var x,y:byte;
begin
x:=strtoint(edit1.text);
y:=strtoint(edit2.text);
if x>y then label3.caption:='Uzvar Jānis';
if x<y then label3.caption:='Uzvar Ilze';
end;

"If-s if-ā" jeb vairākas saistītas zarošanās

Ļoti biežas ir situācijas, kad nepietiek ar tikai diviem notikumu attīstības scenārijiem. Piemēram, kā iepriekšējā uzdevumā rīkoties, ja Jānis un Ilze salasīs vienādu daudzumu? Tātad ir jāparedz trešais scenārijs!

Blokshēma, jeb domu gājiens:

zar_if

Papildināsim programmu:

procedure TForm1.Button1Click(Sender: TObject);
var x,y:byte;
begin

   x:=strtoint(edit1.text); 
   y:=strtoint(edit2.text); 
   if x>y then{Ja Jānis salasa vairāk tad...}
      label3.caption:='Uzvar Jānis'{...izvadam paziņojumu...}
   else{...pretējā gadījumā turpinām pārbaudi...}
      if x<y then{...ja Jānis salasa mazāk tad...}
         label3.caption:='Uzvar Ilze';{...izvadam paziņojumu...}
      else{...pretējā gadījumā...}
         label3.caption:='Neizšķirts';{...izvadam paziņojumu}
end;

Ievērojiet, ka semikols ir tikai aiz "Neizšķirts", jo "elši" (else) visu ir sasējuši vienā garā loģiskā ķēdē! Protams, šādi var if-us kabināt vienu otram galā stipri daudz (ne tikai divus)...

Lokāls "begin...end"

Ja aiz then vai else seko vairāk kā viens operators (t.i., notikums, piemēram, vairāku paziņojuma izvadīšana, vairāku mainīgo vērtību izmaiņas...), tad tie ieslēdzami starp begin ... end. Tajos aiz katra operatora tad liekams semikols, tomēr loģiskā ķēde (jeb konkrētais if-s) beidzas tikai aiz otrā end, kur arī semikols.

Uzdevums:

Kāds cilvēks katru mēnesi nogulda daļu savas algas divos bankas kontos. Pašreiz kontā "k1" jau ir uzkrāti Ls 1000, bet kontā "k2" Ls 800. Noguldījuma lielums ir atkarīgs no mēneša algas - ja tā ir lielāka par Ls 500, tad pirmajā kontā nogulda vēl Ls 40, bet otrajā Ls 20, pretējā gadījumā katrā kontā tiek noguldīts pa Ls 10.
Lietotājs teksta lauciņā ievada saņemto algu, programma izvada rezultātā uzkrātās summas abos kontos.

zar_if

procedure TForm1.Button1Click(Sender: TObject);
var k1, k2, alga :word;
begin
alga:=strtoint(edit1.text);
k1:=1000;
k2:=800;
if alga>500 then
   begin
   k1:=k1+40;
   k2:=k2+20;
   end
else
   begin
   k1:=k1+10;
   k2:=k2+10;
   end;
label2.caption:='1.kontā Ls '+inttostr(k1)+ ', bet 2.kontā Ls '+inttostr(k2);
end;




Autortiesības © 2005-2011, kasis.lv. Visas tiesības aizsargātas.