RSS

L4. Instructiunea de decizie

10 Aug

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.

 
5 Comments

Posted by on 10/08/2009 in C2_1. Algoritmica

 

5 responses to “L4. Instructiunea de decizie

  1. blue butterfly

    26/11/2009 at 17:08

    Salut! Am dat de blogul tau si am vazut ca este foarte complex. Din pacate, nu am gasit ce cautam. Ai putea sa ma ajuti si pe pine in rezolvarea unei probleme? Se citesc maximum 100 de elemente de la tastatura. Sa se afiseze cea mai mare valoare folosind instructiunea array.

    var a=new Array(100);
    var n=prompt(“Cate elemnte se citesc”,0);
    for (i=0; i<n; i=i+1)
    {
    a[i]=prompt ("Introduceti elementul curent",0);
    }
    b=0;
    for (i=0; i<n; i=i+1)
    De aici cum continui? Multumesc.

     
  2. mchelariu

    26/11/2009 at 17:43

    max=0;
    for (i=0; i<n; i=i+1) if (a[max]<a[i]) max=i;
    cout<<"Valoarea maxima din sir este:"<<a[max];

    … cam asa … ; ce limbaj e cel in care ai lucrat mai sus?

     
  3. Ilies Dragos

    12/11/2013 at 17:22

    Nu stiu daca mai sunteti activ pe site dar oricum incerc.Cum decide cand avem 3 variabile? De exemplu: a,b,c real; sa se scrie un algoritm care calculeaza si afiseaza cel mai mare numar. Se face la fel cum e la cele cu 2 variabile, se adauga “OR min<-c" dupa "min<-b" ? Multumesc

     
  4. mchelariu71

    12/11/2013 at 19:43

    1. Exista variabilele de intrare (care sa memoreze valorile pe care problema le da), variabile de iesire (caresa memoreze rezultatul) si variabile de manevra (pentru alte date necesare pe parcursul algoritmului)
    2. Despre Min/max.
    Trebuie sa ai grija ca prima valoare primita sa- i fie data lui min/max, ca valoare de pornire.
    Pentru restul valorilor, ideea e sa compari mereu valoarea X care ti-o da problema cu min/max si sa schimbi min/max, atunci cand e necesar – in cazul in care s-a gasit o valoare mai mica/mare
    – daca (max<x) atunci maxx) atunci min<-x

     
  5. Bebe

    04/07/2015 at 10:57

    Aplicand operatorul conditional ?: de trei ori, vei obtine numarul cel mai mare:
    int a=11, b=5, c=9, max;
    max=a<b?(b<c?c:b):(a<c?c:a);

     

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

 
%d bloggers like this: