Teorija

Komentārs par iepriekšējo piemēru
Iepriekšējā piemērā bija jāuzraksta programma, kas veic šādas darbības:
1) Palūgt lietotājam ievadīt divus veselus skaitļus (un saglabāt to vērtības divos mainīgajos).
2) Izvadīt šo skaitļu summu un starpību.
3) Aizvietot pirmo mainīgo (skaitli) ar iegūto summu un otro mainīgo (skaitli) - ar starpību, pēc tam izvadot jaunās vērtības.
 
Un tika izmantot papildus mainīgie iegūto summas un starpības vērtību glabāšanai. Taču šo programmu var uzrakstīt bez to izmantošanas.
 
 
Pirmais mēģinājums (kā izrādīsies, neveiksmīgs):
programpiemeers2;usescrt;varPirmaisSkaitlis,OtraisSkaitlis:integer;beginclrscr;{Abuskaitļuievade}write('Ievadipirmoskaitli:');readln(PirmaisSkaitlis);write('Ievadiotroskaitli:');readln(OtraisSkaitlis);{Summasunstarpībasizvade}writeln('Sjoskaitljusummair',PirmaisSkaitlis+OtraisSkaitlis);writeln('Sjoskaitljustarpiibair',PirmaisSkaitlisOtraisSkaitlis);{Jaunovērtībupiešķiršanaunizvadīšana}PirmaisSkaitlis:=PirmaisSkaitlis+OtraisSkaitlis;OtraisSkaitlis:=PirmaisSkaitlisOtraisSkaitlis;{Tesanāksaplamavērtība}writeln('Jaunaasveertiibasir',PirmaisSkaitlis,'un',OtraisSkaitlis);readkey;end.
 
 
Ja lietotāja ievadītās vērtības apzīmē ar x un ytad arī mainīgo PirmaisSkaitlis un OtraisSkaitlis vērtības kļūst atbilstoši x un y.
Pēc ievades seko summas un starpības izvade. Redzams, ka tur viss ir kārtībā.
 
Tālāk seko divas rindiņas (komandas), pēc kurām PirmaisSkaitlis un OtraisSkaitlis vajadzētu būt ar pareizām vērtībām - pirmajam jākļūst par summu x+y, otrajam par starpību x-y.
 
PirmaisSkaitlis:=PirmaisSkaitlis+OtraisSkaitlis;
Pēc šīs PirmaisSkaitlis vērtība ir x+y. Tātad ir iegūta pareiza vērtība.
OtraisSkaitlis:=PirmaisSkaitlisOtraisSkaitlis;
Bet pēc šīs OtraisSkaitlis vērtība ir (x+y) - y = x. Tā ir nepareiza vērtība, jo vajadzēja iegūt x-y.
 
Šīs kļūdas cēloņi:
1) pēc pirmās komandas tika izmainīta PirmaisSkaitlis vērtība,
2) otrā komanda ir paredzēta neizmainītām (lietotāja ievadītajām) vērtībām.
 
Viens šīs problēmas risinājums ir tomēr rīkoties kā iepriekšējā piemērā - izmantot papildus mainīgos Summa un Starpiiba.
Svarīgi!
Šāds variants ar papildus mainīgo izmantošanu parasti ir visprātīgākais. Tie padara programmu saprotamāku (protams, ja tiem ir paskaidrojoši nosaukumi) un tādā veidā samazina kļūdas iespēju. Turklāt ļoti bieži bez tiem nav iespējams iztikt.
 
Tomēr šai gadījumā ir vēl viena iespēja - pārveidot otru komandu tā, lai no izmainītajām vērtībām iegūtu vajadzīgo (pareizo) rezultātu.
Kā no x+y un y var iegūt izteiksmi x-y? Šādi: (x+y)-2*y.
(x+y) atbilst PirmaisSkaitlis, bet y - OtraisSkaitlis, tāpēc sanāk šāda komanda:
OtraisSkaitlis:=PirmaisSkaitlis2OtraisSkaitlis;
 
 
Iegūtais alternatīvais programmas variants:
programpiemeers2;usescrt;varPirmaisSkaitlis,OtraisSkaitlis:integer;beginclrscr;{Abuskaitļuievade}write('Ievadipirmoskaitli:');readln(PirmaisSkaitlis);write('Ievadiotroskaitli:');readln(OtraisSkaitlis);{Summasunstarpībasizvade}writeln('Sjoskaitljusummair',PirmaisSkaitlis+OtraisSkaitlis);writeln('Sjoskaitljustarpiibair',PirmaisSkaitlisOtraisSkaitlis);{Jaunovērtībupiešķiršanaunizvadīšana}PirmaisSkaitlis:=PirmaisSkaitlis+OtraisSkaitlis;OtraisSkaitlis:=PirmaisSkaitlis2OtraisSkaitlis;{Tagadirpareizi}writeln('Jaunaasveertiibasir',PirmaisSkaitlis,'un',OtraisSkaitlis);readkey;end.
 
Svarīgi!
Šis variants patērē mazāk atmiņas, jo izmanto mazāku skaitu mainīgo.
(Tiesa, šajā gadījumā atmiņas ietaupījums ir niecīgs.)