Instructiunea de decizie

Fara instructiunea de decizie sau de test (in nici un caz detest) algorimul ar fi linear.  Aceasta instructiune ne ajuta in cazul in care avem o intrebare privind natura datelor folosite, a valorii lor la un moment dat.

Practic, trebuie sa punem intrebari la care algoritmul sa raspunda cu adevarat/fals; ce operatori folosim pentru a obtine raspunsuri adevarat/fals?

Expresii cu valoare logica (adevarat/fals)

Operatori de relatie:

  • “>” inseamna  mai mare
    • a>b are valoarea adevarat numai daca valoarea variabilei a este mai mare decat valoarea variabilei b
  • “<” inseamna mai mic
    • a<b are valoarea adevarat numai daca valoarea variabilei a este mai mica decat valoarea variabilei b
  • “>=” inseamna  mai mare egal
    • a>b are valoarea adevarat numai daca valoarea variabilei a este mai mare sau egala cu valoarea variabilei b
  • “<=” inseamna  mai mic sau egal
    • a>b are valoarea adevarat numai daca valoarea variabilei a este mai mica sau egala cu valoarea variabilei b
  • ” =” inseamna egal
    • a=b are valoarea adevarat numai daca variabila a are aceeasi valoare cu variabila b
  • “!=” inseamna diferit
    • a!=b are valoarea adevarat numai daca variabila a  NU are aceeasi valoare cu variabila b

Operatori logici

Operatorii logici (cu care lucreaza si logica matematica) sunt SI, SAU si NEGARE:

  • Operatorul SI este un operator binar, cu doi operanzi cu valoare logica. Rezultatul operatorului SI este adevarat numai daca ambii operanzi au valoarea ADEVARAT.
    • “Mie imi place fata bruneta si cu ochi albastri!”
    • daca fata nu este bruneta sau nu are ochi albastri nici nu ma uit la ea (:P), ceea ce inseamna fals; daca macar una dintre conditii este falsa atunci intreaga expresie este falsa
  • Operatorul SAU este un operator binar cu doi operanzi cu valoare logica. Rezultatul operatiei SAU este adevarat daca macar unul din operanzi are valoarea ADEVARAT.
    • “Mie imi place fata bruneta SAU cu ochi albastri!“
    • Fata nu trebuie sa aiba ambele calitati. Daca este bruneta imi place (ADEVARAT). Daca este cu ochi albastri imi place (ADEVARAT).
    • Daca macar una din conditii este adevarata atunci intreaga expresie este adevarata
  • Operatorul de negatie (vom folosi semnul ” ! ” ) schimba valoarea de adevar a expresiei: !ADEVARAT==FALS si !FALS ==ADEVARAT

Exemple:

  • X apartine [-5, -2]
    • (x>=-5) SI (X<=-2)
  • x apartine (0, 10)
    • (x>0) SI (x<10)
  • x nu apartine (-7,9]
    • (x<=-7)  SAU (x>9)
    • !(x>-7)  SAU !(x<=9)
    • !((X>-7) SI (x<=9))

Observatii

  • prioritatea operatorilor logici: negare, SI, SAU
  • in cazul expresiilor logice se pot aplica regulile lui De Morgan:
    • !( exp1 si exp2) = !exp1 sau !exp2
    • !(exp1 sau exp2) = !exp1 si !exp2

Instructiunea de decizie (de test; sau detest :P)

Sintaxa:

daca (exp_logica) atunci  instructiune1

[altfel instructiune2;]

Efect:  Se evalueaza expresia logica; daca valoarea logia ca expresiei este ADEVARAT se executa intructiunea 1; Daca exista sectiunea ALTFEL si valoarea logica a expresiei este FALS se executa intructiunea 2; in ambele cazuri, dupa executarea intructiunii corespunzatoare si executa ce instructiune urmeaza dupa testul nostru.

Observatie. Un algoritm trebuie sa fie clar si sa poata fi inteles intr-un singur fel. Din acest punct de vedere, exista doua moduri de a scrie un algoritm:

  • cate o instructiune pe linie si cu marcatori la sfarsitul instructiunilor de test si repetitive (cum cere manualul)
  • mai multe instructiuni pe line, separate printr-un marcator; pentru cazul cand un grup de instructiuni trebuie executate impreuna pe unul din cazurile intrtuctiunii de decizie (de exemplu ), acestea pot fi incadrate cu acolade (in limbajul C++) sau cu cuvinte rezervate (begin …  end);
  • Pentru ca pdeudocodul nu este un limbaj in sine ci doar o conventie de notatii, sugerez sa folosim deja notatiile din C++;
  • cand o secventa de instructiuni trebuie executate una dupa alta, datorita logicii algoritmului, acea secventa o vom incadra in acolade (de exemplu: {instructiune1; instructiune2; instructiune3; …}); vom reveni cu amanunte.

Exemple:

  • Sa se afiseze maximul a doua valori citite.

intreg a,b;

citeste a,b;

daca (a>b) atunci scrie a

                   altfel scrie b.

  • Sa se afiseze modulul (matematic) al unui numar intreg.

intreg a;

citeste a;

daca (a>0) atunci scrie a

                  altfel scrie -a.

  • Sa memoram valoarea maxima intr-o variabila si sa o afisam.

intreg a,b,max;

citeste a,b;

daca (a>b) atunci max<-a

                  altfel max<-b;

Scrie max.

  • Sa se citeasca o valoare intreaga si sa se stabileasca daca s-a citit o valoare para sau nu.

intreg a;

citeste a;

daca (a%2 ==0) atunci scrie “Valoarea citita este para!”

                          altfel scrie “Valoarea citita este impara!”.

  • Fie a si b coeficientii unei ecuatii de grad 1. Sa se afiseze solutia ecuatiei a*x + b =0;
    • evident x=-b/a daca a!=0;

intreg a,b;

real x;

citeste a,b;

daca (a!=0) atunci { x<- -b/a; scrie “Solutia ecuatiei este “; Scrie x;}

                   altfel scrie “Nu se poate calcula solutia ecuatiei”.

Secventa { x=-b/a; scrie “Solutia ecuatiei este “; Scrie x;} trebuie gandita ca un intreg deoarece este valabila numai pentru cazul in care a este nenul; de aceea am incadrat-o intre acolade.

  • Fie a, b si c coeficientii unei ecuatii de grad 2 (a*x^2+b*x+c=0). Sa se calculeze valorile radacinii, daca exista.
    • conditia pentru a fi ecuatie de grad 2: coeficientul a trebuie sa fie nenul (a!=0)
    • trebuie calculata valoarea DELTA=b*b-4*a*c
    • pentru a avea solutii, valoarea DELTA trebuie sa fie pozitiva, cel putin nula;
    • vom folosi radical (expr) pentru a calcula valoarea radicalului unei expresii reale/intregi

intreg a,b,c,delta;

real x1,x2;

citeste a,b,c;

daca (a==0) atunci  scrie ” Coeficientii nu formeaza ecuatie de gradul 2″;

 altfel {delta=b*b-4*a*c;

           daca (delta<0) atunci scrie “Nu se pot calcula radacini reale ”

                                   altfel {x1<- (-b+radical(delta))/(2*a); x2<- -b-radical(delta))/(2*a);

                                              scrie “Solutiile sunt :”, x1,” “, x2; }

}

Observatii:

  • x1 si x2 sunt declarati reali pentru ca se obtin in urma radicalului si a unei impartiri
  • urmariti daca algoritmul scrie concide cu termenii problemei
  • pentru cazul coeficientului a nenul trebuie efectuate doua operatii (calculul lui delta si testul lui delta), motiv pentru care acestea au fost incadrate intre acolade
  • la calculul solutiilor au fost puse paranteze pentru separarea numitorului si a numaratorului
  • de asemenea, aici au trebuit puse acolade pentru calculul celor doua solutii si a afisarii solutiilor
  • Fie o functie matematica data pe intervale. Sa se calculeze valoarea functiei intr-un punct x oarecare daca expresia functiei este:
    • x^2+2*x+1 daca x<0
    • 3*x+5  daca x apartine [0,5)
    • -x+2 daca x>=5
    • este clar ca valoarea functie difera pe cele trei intervale; va trebui sa verificam, pe rand, carui interval apartine valoarea citita pentru x;

real x,f;

citeste x;

daca (x<0) atunci f<- x*x+2*x+1

                  altfel daca (x>=5) atunci f<- -x+2

                                               altfel f<- 3*x+5;

scrie f.

Advertisements

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s