Instructiuni decizionale: if, swich, if imbricate
  • Tematica
  • Noi notiuni, functii si instructiuni utilizate Instructiunea if :

        Instructiunea if se foloseste pentru a executa o instructiune numai in anumite conditii.

  • Formatul instructiunii:

        Instructiunea if se compune din urmatoarele linii:

        if(valoare booleana)
                instructiune;


        Obervatii:
         - Prima linie contine intre paranteze o valoare booleana sau o expresie relationala care returneaza o singura valoare boolena. Expresiile relationale sunt bazate pe urmatorii operatori relationali:

    - Operator relational - Semnificatie
    >Mai mare
    <Mai mic
    >=Mai mare sau egal
    <=Mai mic sau egal
    ==Egal
    !=Diferit

         - Prima linie nu se termina cu ;
         - Urmatoarea linie este o instructiune care va fi executata numai daca valoarea booleana sau valoarea expresiei relationale este adevarata.
         - Daca trebuiesc executate mai multe instructiuni (bloc de instructiuni), acestea se pune in acolade.

        if(valoare booleana)
        {
                instructiune;
                instructiune;
                .
                .
                .
                instructiune;
        }


  • Exemplu de program C++ ce utilizeaza instructiunea decizionala if

        Sa realizam un program care asteapta doua numere de la utilizator apoi calculeaza diferenta lor si o afiseaza, insa inainte sa afiseze diferenta numerelor introduse am vrea sa fim avertizati cu un mesaj ca diferenta este negativa. Instructiunea care afiseaza mesajul "Diferenta este negativa", trebuie sa se execute numai daca diferenta dintre numerele introduse este negativa. Schema logica a unui astfel de program arata astfel:

    // Program scris in C++ Visual Studio 2005 de tipul:CLR console application
    // program care asteapta doua numere de la utilizator apoi calculeaza diferenta lor si o afiseaza
    // inainte sa afiseze diferenta numerelor, avertizeaza cu un mesaj ca diferenta este negativa.
    
    #include "stdafx.h"
    #include < iostream >
    using namespace std;
    
    int main(void)
    {
    	int a,b,d;
    	cout <<" \n\tIntroduceti numarul a: ";
    	cin >> a;
    	cout <<" \n\tIntroduceti numarul b: ";
    	cin >> b;
    	d=a-b;
    	if (d<0)
    		cout <<" \n\tDiferenta este negativa!! ";
    	cout <<" \n\n\tDiferenta dintre a si b este :"<< d ;
    	cin.ignore();
    	cin.get();
    	return 0;
    }
    

        Dupa rularea programului in "Command Prompt" se afiseaza:


        In cazul in care instructiunea conditionala e compusa din mai multe linii trebuiesc folosite acolade.
        Spre exemplu daca vrem sa mai adaugam mesajul "Atentie", programul devine:

    // Program scris in C++ Visual Studio 2005 de tipul:CLR console application
    // program care asteapta doua numere de la utilizator apoi calculeaza diferenta lor si o afiseaza
    // inainte sa afiseze diferenta numerelor, avertizeaza cu un mesaj ca diferenta este negativa.
    
    #include "stdafx.h"
    #include < iostream >
    using namespace std;
    
    int main(void)
    {
    	int a,b,d;
    	cout <<" \n\tIntroduceti numarul a: ";
    	cin >> a;
    	cout <<" \n\tIntroduceti numarul b: ";
    	cin >> b;
    	d=a-b;
    	if (d<0){
    		cout <<" \n\t      Atentie!!           ";
    		cout <<" \n\tDiferenta este negativa!! ";
    		}
    	cout <<" \n\n\tDiferenta dintre a si b este :"<< d ;
    	cin.ignore();
    	cin.get();
    	return 0;
    }
    

    Instructiunea if / else:

  • Formatul instructiunii:

        if(valoare booleana)
          instructiune;

        else
          instructiune;


        Instructiunea if / else se foloseste pentru a executa o instructiune pentru cazul cand valoare booleana este adevarata si alta instructiune pentru cazul cand valoarea booleana nu este adevarata.

         - Daca trebuiesc executate mai multe instructiuni (bloc de instructiuni), acestea se pun in acolade.

        if(valoare booleana)
        {
                instructiune;
                instructiune;
                .
                .
                .
                instructiune;
        }
        else
        {
                instructiune;
                instructiune;
                .
                .
                .
                instructiune;
        }


        Programul pentru ordonarea a doua numere (vezi schema logica de mai jos), foloseste instructiunea if / else .



    // Program scris in C++ Visual Studio 2005 de tipul:CLR console application
    // program care asteapta doua numere de la utilizator apoi le ordoneaza in ordine crescatoare
    
    #include "stdafx.h"
    #include < iostream >
    using namespace std;
    
    int main(void)
    {
    	int a,b;
    	cout <<" \n\tIntroduceti numarul a: ";
    	cin >> a;
    	cout <<" \n\tIntroduceti numarul b: ";
    	cin >> b;
    	if (a>b)
    		cout <<"\n\n\tNumerele ordonate crescator sunt b,a adica: " << b <<", " << a;
    	else
    		cout <<"\n\n\tNumerele ordonate crescator sunt a,b adica: " << a <<", " << b;
    	cin.ignore();
    	cin.get();
    	return 0;
    }
    


        Pentru a vizualiza modul de rulare a aplicatiei se poate alege rularea pas cu pas.
        Rularea pas cu pas a aplicatiei se poate realiza prin plasarea unui Breakpoint in program la inceputul instructiunii decizionale "if" de exemplu.


        Dupa plasarea Breakpoint-ului programul se lanseaza normal dupa care rularea acestuia se va opri la instructiunea corespunzatoare Breakpoint-ului
        Din acest moment se poate rula pas cu pas prin apasarea tastei F10
        Se observa ca pentru valorile a=7 respectiv b=9 programul ruleaza direct pe ramura "else"

    Instructiunea if/else in WFA

        Si in modul grafic Windows Forms Application sunt utile instructiunile decizionale if. Deschidem un nou proiect Windows Forms Application numit if si plasam doua obiecte de tip Radio Button cu numele radioButton1 respectiv radioButton2. Plasam apoi un button1 si un obiect label1, pentru a schita un formular de comanda pentru un calculator.



        Utilizatorul trebuie sa decida ce fel de calculator vrea sa comande, apoi sa apese button1:"Comanda" pentru a lansa comanda. Label1:"optiune" va scrie mesajul corespunzator optiunii marcate. Completam procedura creata pe evenimentul click a obiectului button1 cu

       C#

    				if (this.radioButton1.Checked)
    					this.label1.Text="Ati ales LapTop";
    				else
    					this.label1.Text="Ati ales DeskTop";
    
    


        Dupa lansarea aplicatiei si marcarea optiunii DeskTop ecranul aplicatiei arata astfel:



        Daca dorim sa plasam doua sau mai multe grupuri de butoane de tip "Radio Button" vom utiliza un obiect de tip "Panel" sau "GroupBox" pentru a delimita grupurilre de butoane intre ele asemanator cu aplicatia Windows Forms Application numit if_radio .


    Operatorul conditional:

        Operatorul conditional are urmatoara sintaxa:

        [expresie relationala] ? [instructiune pentru expresie "adevarata"]:[instructiune pentru expresie "falsa"]

        Folosind operatorul relational programul pentru ordonarea a doua numere devine:

    // Program scris in C++ Visual Studio 2005 de tipul:CLR console application
    // program care asteapta doua numere de la utilizator apoi le ordoneaza in ordine crescatoare
    
    #include "stdafx.h"
    #include < iostream >
    using namespace std;
    
    int main(void)
    {
    	int a,b;
    	cout <<" \n\tIntroduceti numarul a: ";
    	cin >> a;
    	cout <<" \n\tIntroduceti numarul b: ";
    	cin >> b;
    	cout <<"\n\n\tNumerele ordonate crescator sunt:" << ( a>b ? " b , a " : " a , b"); 
    	cin.ignore();
    	cin.get();
    	return 0;
    }
    


        
    Instructiunea if / else if /else:

        Instructiunea if / else if /else se foloseste pentru a implementa structuri decizionale cu mai mult de doua alternative.
  • Formatul instructiunii:

        Instructiunea if / else if /else se compune din urmatoarele linii:

        if(valoare booleana)
          instructiune;


        else if(valoare booleana)
          instructiune;


        else if(valoare booleana)
          instructiune;

    .
    .
    .

        else
          instructiune;


        Sa presupunem ca la aplicatia grafica pentru comanda calculatorului vrem sa adaugam optiunea:Server station. Avem de ales intre trei opriuni:LapTop DeskTop si ServerStation. Programul scris in Visual Studio 2005 Console application arata astfel:

    // Program scris in C++ Visual Studio 2005 de tipul:CLR console application
    // program care asteapta optiunea d-voastra si o afiseaza. 
    
    #include "stdafx.h"
    #include < iostream >
    using namespace std;
    
    int main(void)
    {
    	int a;
    	cout <<" \nTastati: ";
    	cout <<" \n\t1-Pentru LapTop";
    	cout <<" \n\t2-Pentru DeskTop";
    	cout <<" \n\t3-Pentru ServerStation";
    	cout <<" \n\n\tOptiunea d-voastra: ";
    	cin >> a;
    	if (a==1)
    		cout <<"\n\n\tAti ales LapTop: " ;
    	else if (a==2)
    		cout <<"\n\n\tAti ales DeskTop: " ;
    	else
    		cout <<"\n\n\tAti ales ServerStation: " ;
    	cin.ignore();
    	cin.get();
    	return 0;
    }
    

    Instructiunea Switch:

        Instructiunea switch este asemanatoare cu instructiunea if/ else if/ else . Aceasta instructiune evalueaza valoarea unei expresii intregi dupa care compara aceasta valoare cu 2 sau mai multe valori pentru a decide pe care ramura de program sa continue.
  • Formatul instructiunii:

        Instructiunea swich se compune din urmatoarele linii:

        swich(expresie){

        case V1:
          instructiune;
          break;


        case V2:
          instructiune;
          break;

    .
    .
    .

        case Vn:
          instructiune;
          break;


        default:
          instructiune;

    }

        Aplicatia de mai sus devine:

    // Program scris in C++ Visual Studio 2005 de tipul:CLR console application
    // program care asteapta optiunea d-voastra si o afiseaza. 
    
    #include "stdafx.h"
    #include < iostream >
    using namespace std;
    
    int main(void)
    {
    	int a;
    	cout <<" \nTastati: ";
    	cout <<" \n\t1-Pentru LapTop";
    	cout <<" \n\t2-Pentru DeskTop";
    	cout <<" \n\t3-Pentru ServerStation";
    	cout <<" \n\n\tOptiunea d-voastra: ";
    	cin >> a;
    	switch(a){
    	case 1:
    		cout <<"\n\n\tAti ales LapTop: " ;
    		break;
    	case 2:
    		cout <<"\n\n\tAti ales DeskTop: " ;
    		break;
    	case 3:
    		cout <<"\n\n\tAti ales ServerStation: " ;
    		break;
    	default:
    		cout <<"\n\n\t Nu ati ales nimic !" ;
    	}
    	cin.ignore();
    	cin.get();
    	return 0;
    }
    


        In cazul in care expresia nu este o valoare numerica ci un caracter de exemplu, aplicatia devine:

    // Program scris in C++ Visual Studio 2005 de tipul:CLR console application
    // program care asteapta optiunea d-voastra si o afiseaza. 
    
    #include "stdafx.h"
    #include < iostream >
    using namespace std;
    
    int main(void)
    {
    	char a;
    	cout <<" \nTastati: ";
    	cout <<" \n\tL-Pentru LapTop";
    	cout <<" \n\tD-Pentru DeskTop";
    	cout <<" \n\tS-Pentru ServerStation";
    	cout <<" \n\n\tOptiunea d-voastra: ";
    	cin >> a;
    	switch(a){
    	case 'L':
    		cout <<"\n\n\tAti ales LapTop: " ;
    		break;
    	case 'D':
    		cout <<"\n\n\tAti ales DeskTop: " ;
    		break;
    	case 'S':
    		cout <<"\n\n\tAti ales ServerStation: " ;
    		break;
    	default:
    		cout <<"\n\n\t Nu ati ales nimic!" ;
    	}
    	cin.ignore();
    	cin.get();
    	return 0;
    }
    


        Instructiunea break este apsolut necesara cand nu dorim sa se mai execute urmatoarele ramuri ale instructiunii switch.

    Instructiuni if imbricate:

        Instructiunea if poate sa apara in interiorul altei instructiuni if. In acest caz se spune ca o instructiue if este imbricata in interiorul altei instructiuni if.

        Sa realizam programul care rezolva ecuatia de gradul 1 a carei schema logica o aveti mai jos.



        Pentru a implementa schema logica de mai sus e nevoie sa imbricam instructiuni if in alte instructiuni if

    // Program scris in C++ Visual Studio 2005 de tipul:CLR console application
    // programul rezolva ecuatia de gradul I ax+b=0
    
    #include "stdafx.h"
    #include < iostream >
    using namespace std;
    
    int main(void)
    {
    	double a,b,x;
    	cout <<" \nProgramul rezolva ecuatia de gradul I de forma: ax+b=0";
    	cout <<" \n\n\tIntroduceti coeficientul a: ";
    	cin >> a;
    	cout <<" \n\tIntroduceti coeficientul b: ";
    	cin >> b;
    	if (b==0){
    		if (a==0)
    			cout <<"\n\n\tSolutii infinite!! " ;
    		else
    			cout <<"\n\n\tx=0 " ;
    	}
    	else{
    		if (a==0)
    		cout <<"\n\n\t x= infinit ";
    		else{
    			x=-b/a;
    			cout <<"\n\n\t x=" << x;
    		}
    	}
    	cin.ignore();
    	cin.get();
    	return 0;
    }
    


        Rezolvarea ecuatiei de gradul doi se gaseste in schema logica de mai jos.



        Pentru a implementa schema logica de mai sus se folosesc instructiuni if imbricate.

    // Program scris in C++ Visual Studio 2005 de tipul:CLR console application
    // programul rezolva ecuatia de gradul II de forma ax*x+bx+c=0
    
    #include "stdafx.h"
    #include < iostream >
    #include < math.h >
    using namespace std;
    
    int main(void)
    {
    	double a,b,c,delta,x1,x2;
    	cout <<" \nProgramul rezolva ecuatia de gradul II de forma: ax*x+bx+c=0";
    	cout <<" \n\n\tIntroduceti coeficientul a: ";
    	cin >> a;
    	cout <<" \n\tIntroduceti coeficientul b: ";
    	cin >> b;
    	cout <<" \n\tIntroduceti coeficientul c: ";
    	cin >> c;
    	delta=b*b-4*a*c;
    
    	if (delta>=0){
    		if (a==0){
    			// ecuatie de gradul I
    			if (c==0){
    				if (b==0)
    					cout <<"\n\n\tSolutii infinite!! " ;
    				else
    					cout <<"\n\n\tx=0 " ;
    			}
    			else{
    			if (b==0)
    				cout <<"\n\n\t x= infinit ";
    				else{
    					x1=-c/b;
    					cout <<"\n\n\t x1=" << x1;
    				}
    			}
    		}
    		else{
    			x1=(-b+sqrt(delta))/(2*a);
    			x2=(-b-sqrt(delta))/(2*a);
    			cout <<"\n\n\tx1= " << x1;
    			cout <<"\n\n\tx2= " << x2;
    		}
    	}
    	else
    	cout << "\n\n\tSolutii imaginare!! " ;
    	cin.ignore();
    	cin.get();
    	return 0;
    }
    


        Sa realizam programul pentru ordonarea a trei numere conform schemei logice de mai jos.



    // Program scris in C++ Visual Studio 2005 de tipul:CLR console application
    // programul ordoneaza crescator trei numere citite de la tastatura
    
    #include "stdafx.h"
    #include < iostream >
    using namespace std;
    
    int main(void)
    {
    	double a,b,c;
    	cout <<" \nProgramul ordoneaza crescator trei numere :a,b,c" ;
    	cout <<" \n\n\tIntroduceti numarul a: ";
    	cin >> a;
    	cout <<" \n\tIntroduceti numarul b: ";
    	cin >> b;
    	cout <<" \n\tIntroduceti numarul c: ";
    	cin >> c;
    	if (a>=b){
    		if (b>=c){
    			cout <<"\n\n\tOrdinea este c-b-a " << c <<" : " << b <<" : " << a  ;
    		}else{
    			if (a>=c){
    				cout <<"\n\n\tOrdinea este b-c-a " << b <<" : " << c <<" : " << a  ;
    			}else{
    				cout <<"\n\n\tOrdinea este b-a-c " << b <<" : " << a <<" : " << c  ;
    			}
    		}
    	}else{
    		if (b>=c){
    			if (a>=c){
    				cout <<"\n\n\tOrdinea este c-a-b " << c <<" : " << a <<" : " << b  ;
    			}else{
    				cout <<"\n\n\tOrdinea este a-c-b " << a <<" : " << c <<" : " << b  ;
    			}
    		}else{
    			cout <<"\n\n\tOrdinea este a-b-c " << a <<" : " << b <<" : " << c  ;
    		}		
    	}
    	cin.ignore();
    	cin.get();
    	return 0;
    }
    

        In aplicatiile anterioare am utilizat diverse forme ale instructiunilor decizionale in care s-au folosit expresii relationale bazate pe urmatorii operatori relationali:

    - Operator relational - Semnificatie
    >Mai mare
    <Mai mic
    >=Mai mare sau egal
    <=Mai mic sau egal
    ==Egal
    !=Diferit


        Expresiile relationale pot contine pe langa operatorii relationali si operatori logici.

    Operatori logici


        Pentru a combina comparatiile multiple intr-o singura instructiune if, se folosesc operatorii logici care leaga una sau mai multe expresii intr-o expresie finala.

    Operator logic Nume Efect
    && AND (si) Expresia finala e adevarata daca toate expresiile sunt adevarate
    || OR (sau)Expresia finala e adevarata daca cel putin una dintre expresii este adevarata
    ! NOT (nu)Inverseaza expresia adica daca expresia e adevarata , !expresia e falsa si invers


    Operatorul logic &&

        Operatorul logic SI este un operator binar combinand doua sau mai multe expresii binare. Returneaza "adevarat" numai daca toate expresiile combinate au valoarea "adevarat"

        Sa presupunem ca avem circuitul de mai jos. Sa realizam un program in care sa interbam care este starea comutatoarelor K1 si K2 si programul sa afiseze daca ledul este aprins sau stins.



    // Program scris in C++ Visual Studio 2005 de tipul:CLR console application
    // Programul analizeaza starea unui circuit cu doua comutatoare serie K1 si K2. 
    // Afiseaza daca circuitul este inchis sau deschis.
    
    #include "stdafx.h"
    #include < iostream >
    using namespace std;
    
    int main(void)
    {
    	char  k1,k2;
    	bool  c1,c2;
    	cout <<" \nAnaliza stare circuit cu doua comutatoare serie K1 si K2." ;
    	cout <<" \n\n\tK1 este inchis sau deschis(I/D): ";
    	cin >> k1;
    	cout <<" \n\tK2 este inchis sau deschis(I/D): ";
    	cin >> k2;
    	if (k1=='I')
    		c1=true;
    	else
    		c1=false;
    	if (k2=='I')
    		c2=true;
    	else
    		c2=false;
    	if (c1 && c2)
    		cout <<" \n\n\tCircuitul este inchis si ledul e aprins: ";
    	else
    		cout <<" \n\n\tCircuitul este deschis si ledul e stins: ";
    	cin.ignore();
    	cin.get();
    	return 0;
    }
    


        

        Sa realizam in Windows Forms Application o aplicatie care sa simuleze functionarea portii logice SI
        Deschidem un nou proiect Windows Forms Application numit si pe care plasam un obiect PictureBox cu numele pictureBox1. Setam proprietatea Image cu imaginea de mai jos:



        Plasam apoi doua obiecte de tip NumericUpDown cu numele numericUpDown1 respectiv numericUpDown2 pentru a simula intrarile portii logice. Se mai plaseaza doua obiecte Label cu numele label1 respectiv label2, pentru a afisa iesirea porii sub forma numerica si sub forma booleana.
         Completam procedurile create pe evenimentele ValueChanged a obiectelor NumericUpDown cu acelasi lucru si anume:

       C#

                Boolean a, b;
                a=System.Convert.ToBoolean(this.numericUpDown1.Value);
                b=System.Convert.ToBoolean(this.numericUpDown2.Value);
                this.label1.Text = System.Convert.ToString(System.Convert.ToInt32(a && b));
                this.label2.Text = System.Convert.ToString(a && b);


        Dupa lansarea aplicatiei si stabilirea intrarilor la "1" ecranul aplicatiei arata astfel:



    Operatorul logic ||

        Operatorul logic SAU este un operator binar combinand doua sau mai multe expresii binare. Returneaza "adevarat" daca cel putin una din expresiile combinate au valoarea "adevarat"

        Aplicatia care analiza un circuit cu doua comutatoare raspundea corect numai pentru raspunsul "I" nu si pentru raspunsul "i". Sa modificam aplicatia astfel incat sa lucreze curect si pentru raspunsul "I" nu si pentru raspunsul "i"

    // Program scris in C++ Visual Studio 2005 de tipul:CLR console application
    // Programul analizeaza starea unui circuit cu doua comutatoare serie K1 si K2. 
    // Afiseaza daca circuitul este inchis sau deschis.
    
    #include "stdafx.h"
    #include < iostream >
    using namespace std;
    
    int main(void)
    {
    	char  k1,k2;
    	bool  c1,c2;
    	cout <<" \nAnaliza stare circuit cu doua comutatoare serie K1 si K2." ;
    	cout <<" \n\n\tK1 este inchis sau deschis(I/D): ";
    	cin >> k1;
    	cout <<" \n\tK2 este inchis sau deschis(I/D): ";
    	cin >> k2;
    	if (k1=='I' || k1=='i')
    		c1=true;
    	else
    		c1=false;
    	if (k2=='I'|| k2=='i')
    		c2=true;
    	else
    		c2=false;
    	if (c1 && c2)
    		cout <<" \n\n\tCircuitul este inchis si ledul e aprins: ";
    	else
    		cout <<" \n\n\tCircuitul este deschis si ledul e stins: ";
    	cin.ignore();
    	cin.get();
    	return 0;
    }
    
    


        Sa presupunem ca avem circuitul de mai jos. Sa realizam un program in care sa interbam care este starea comutatoarelor K1 si K2 si programul sa afiseze daca ledul este aprins sau stins.



    // Program scris in C++ Visual Studio 2005 de tipul:CLR console application
    // Programul analizeaza starea unui circuit cu doua comutatoare in paralel K1 si K2. 
    // Afiseaza daca circuitul este inchis sau deschis.
    
    #include "stdafx.h"
    #include < iostream >
    using namespace std;
    
    int main(void)
    {
    	char  k1,k2;
    	bool  c1,c2;
    	cout <<" \nAnaliza stare circuit cu doua comutatoare paralel K1 si K2." ;
    	cout <<" \n\n\tK1 este inchis sau deschis(I/D): ";
    	cin >> k1;
    	cout <<" \n\tK2 este inchis sau deschis(I/D): ";
    	cin >> k2;
    	if (k1=='I' || k1=='i')
    		c1=true;
    	else
    		c1=false;
    	if (k2=='I'|| k2=='i')
    		c2=true;
    	else
    		c2=false;
    	if (c1 || c2)
    		cout <<" \n\n\tCircuitul este inchis si ledul e aprins: ";
    	else
    		cout <<" \n\n\tCircuitul este deschis si ledul e stins: ";
    	cin.ignore();
    	cin.get();
    	return 0;
    }
    
    


    Operatorul logic !

        Operatorul logic NU este un operator binar folosit pentru inversarea valorii unei expresii booleene. Returneaza "adevarat" daca expresia are valoarea "fals" si invers returneaza "fals" daca expresia are valoarea "adevarat"

        Programul urmator cere trei valori si calculeaza daca ele pot reprezenta lungimile laturilor unui triunghi. In cadrul acestui program s-au folosit pe langa operatorii $$ || si operatorul !.

    // Program scris in C++ Visual Studio 2005 de tipul:CLR console application
    // programul cere trei valori si calculeaza daca ele pot reprezenta lungimile laturilor unui triunghi
    
    #include "stdafx.h"
    #include < iostream >
    using namespace std;
    int main()
    { float a,b,c;
      bool t;
      cout << "Laturile unui triunghi\n";
      cout << "\n\tIntroduceti 3 numere reale:\n";
      cin >> a >> b >> c;
      cin.ignore();
      t = !( a <= 0 || b <= 0 || c <= 0);
      t = t && a < b + c && b < a + c && c < a + b;
      if( !t)
      		cout << "\n\n\tValorile introduse NU pot fi lungimile laturilor unui triunghi !";
      else
    		cout << "\n\n\tValorile introduse pot fi lungimile laturilor unui triunghi !";
      
      cin.get();
      return 0;
    }
    

        Vom utiliza operatorul ! (not) in proiectul not ralizat in C# Windows Forms Application, proiect in care vom schimba alternativ culoarea unui dreptrungi la apasarea unui singur buton.



    namespace not
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
            }
            System.Drawing.Graphics desen;
            System.Drawing.SolidBrush pensula_rosie;
            System.Drawing.SolidBrush pensula_verde;
            Boolean cul;
            private void button1_Click(object sender, EventArgs e)
            {
                desen = this.CreateGraphics();
                pensula_rosie = new System.Drawing.SolidBrush(System.Drawing.Color.Red);
                pensula_verde = new System.Drawing.SolidBrush(System.Drawing.Color.Green);
                if (cul)
                    desen.FillRectangle(pensula_verde, 300, 50, 50, 50);
                else
                    desen.FillRectangle(pensula_rosie, 300, 50, 50, 50);
                cul = !cul;
    
            }
        }
    }
    


    Proiritatile operatorilor logici

        Prioritatile intre operatorii logici si operatorii relationali sunt urmatoarele:
    1.     !
    2.     Operatori relationali <,<=,==,>,=>,!=
    3.     &&
    4.     ||


        In cazul in care dorim sa schimbam prioritatile se folosesc paranteze
        In exemplul de sus avem expresiat = !( a <= 0 || b <= 0 || c <= 0); pentru a forta executia oeratorilor || mai intai si pe urma operatorul !
        la fel se procedeaza si in cazul in care vrem sa schimbam prioritatea intre && si || si vrem sa fortam executia || mai repede
        Exemplu: Sa reluam aplicatia de analiza a unui circuit cu doua comutatoare K1 si K2 legate in paralel, la care adaugam si conditia suplimentara ca tensiunea sa fie peste 1,5V ca sa poata aprinde ledul.

    // Program scris in C++ Visual Studio 2005 de tipul:CLR console application
    // Programul analizeaza starea unui circuit cu doua comutatoare in paralel K1 si K2. 
    // Analizeaza daca circuitul este inchis sau deschis si  afiseaza mesajul "led" aprins
    // numai daca circuitul e inchis si tensiunea aplicata este peste 1,5v
    
    #include "stdafx.h"
    #include < iostream >
    using namespace std;
    
    int main(void)
    {
    	char  k1,k2;
    	bool  c1,c2;
    	double u;
    	cout <<" \nAnaliza stare led intr-un circuit cu doua comutatoare montate paralel K1 si K2." ;
    	cout <<" \n\n\tK1 este inchis sau deschis(I/D): ";
    	cin >> k1;
    	cout <<" \n\tK2 este inchis sau deschis(I/D): ";
    	cin >> k2;
    	cout <<" \n\tTensiunea U aplicata : ";
    	cin >> u;
    	if ((k1=='I' || k1=='i')&& (u>1.5))
    		c1=true;
    	else
    		c1=false;
    	if ((k2=='I'|| k2=='i')&& (u>1.5))
    		c2=true;
    	else
    		c2=false;
    	if (c1 || c2)
    		cout <<" \n\n\Ledul e aprins: ";
    	else
    		cout <<" \n\n\tLedul e stins: ";
    	cin.ignore();
    	cin.get();
    	return 0;
    }
    
    


        Pentru a forta executia operatorului || in fata operatorului && s-a utilizat expresia:

        if ((k1=='I' || k1=='i')&& (u>1.5))


    Exemple de utilizare a instructiunilor decizionale in C# WFA

         Forme geometrice

        Vom utiliza in continuare instructiunea if pentru a alege forma geometrica ce urmeaza a fi desenata pe ecran.
        Deschidem un nou proiect Windows Forms Application intitulat forme_geom_00 si plasam patru obiecte de tip Radio Button cu numele radioButton1...radioButton4. Plasam apoi un Buton cu numele button1 .



        Utilizatorul trebuie sa decida ce fel de forma geometrica doreste, apoi sa apese button1:"Deseneaza".
        Completam procedura creata pe evenimentul click a obiectului button1 cu

       C#

                System.Drawing.Graphics Desen;
                Desen = this.CreateGraphics();
                System.Drawing.Pen Creion_albastru;
                Creion_albastru = new System.Drawing.Pen(System.Drawing.Color.Blue);
                if (this.radioButton1.Checked)
                    Desen.DrawLine(Creion_albastru, 150, 50, 350, 200);
                if (this.radioButton2.Checked)
                    Desen.DrawRectangle(Creion_albastru, 250, 50, 200, 100);
                if (this.radioButton3.Checked)
                    Desen.DrawEllipse(Creion_albastru, 250, 150, 105, 105);
                if (this.radioButton4.Checked)
                    Desen.DrawEllipse(Creion_albastru, 150, 50, 95, 200);
    


        Modificam aplicatia anterioara si vom desena si forme geometrice pline iar inainte de desenare vom sterge ecranul. Vom utiliza in continuare instructiunea if pentru a alege forma geometrica ce urmeaza a fi desenata pe ecran.
        Deschidem un nou proiect Windows Forms Application intitulat forme_geom_01 si plasam sase obiecte de tip Check Box cu numele checkBox1...checkBox6. Plasam apoi un Buton cu numele button1 .


        Completam procedura creata pe evenimentul click a obiectului button1 cu

       C#

        	    System.Drawing.Graphics Desen;
        	    System.Drawing.Pen Creion_albastru, Creion_rosu, Creion_ciocolatiu;
        	    System.Drawing.SolidBrush Pensula;
        	    Desen = this.CreateGraphics();
        	    Creion_albastru =new System.Drawing.Pen(System.Drawing.Color.Blue);
        	    Creion_rosu =new System.Drawing.Pen(System.Drawing.Color.Red);
        	    Creion_ciocolatiu =new System.Drawing.Pen(System.Drawing.Color.Chocolate);
        	    Pensula=new System.Drawing.SolidBrush(System.Drawing.Color.Aquamarine);
                Desen.Clear(this.BackColor);
                if (this.checkBox1.Checked)
                {
                    Desen.DrawLine(Creion_albastru, 210, 50, 250, 150);
                }
                if (this.checkBox2.Checked)
                {
                    Desen.DrawRectangle(Creion_rosu, 250, 175, 200, 100);
                }
                if (this.checkBox3.Checked)
                {
                    Desen.DrawEllipse(Creion_ciocolatiu, 300, 50, 105, 105);
                }
                if (this.checkBox4.Checked)
                {
                    Desen.DrawEllipse(Creion_albastru, 125, 20, 55, 100);
                }
                if (this.checkBox5.Checked)
                {
                    Desen.FillRectangle(Pensula, 50, 175, 75, 130);
                }
                if (this.checkBox6.Checked)
                {
                    Desen.FillEllipse(Pensula, 150, 150, 75, 130);
                }
    

         - Inainte desenare se sterge ecranul cu instructiunea: Desen.Clear(this.BackColor); Culoarea folosita la stergere este chiar fundalul form-ului curent
         - Pentru desenarea formelor pline se defineste o pensula: System.Drawing.SolidBrush Pensula;
         - Se creaza obiectul Pensula apoi cu: Pensula=new System.Drawing.SolidBrush(System.Drawing.Color.Aquamarine);
         - Dreptunghi plin se deseneaza cu: Desen.FillRectangle(Pensula, 150, 25, 75, 130);
         - Elipsa plina se deseneaza cu: Desen.FillEllipse(Pensula, 150, 25, 75, 130);


        In proiectul WFA intitulat forme_geom_02 vom elimina butonul "Deseneaza", desenarea facandu-se in momentul alegerii formei dorite.


        Generam evenimente CheckedChanged pentru fiecare Check Box in parte.

       C#

            System.Drawing.Graphics Desen;
            System.Drawing.Pen Creion_albastru, Creion_rosu, Creion_ciocolatiu;
            System.Drawing.SolidBrush Pensula;
            private void Form1_Load(object sender, EventArgs e)
            {
                Desen = this.CreateGraphics();
                Creion_albastru = new System.Drawing.Pen(System.Drawing.Color.Blue);
                Creion_rosu = new System.Drawing.Pen(System.Drawing.Color.Red);
                Creion_ciocolatiu = new System.Drawing.Pen(System.Drawing.Color.Chocolate);
                Pensula = new System.Drawing.SolidBrush(System.Drawing.Color.Aquamarine);
            } 
            private void button1_Click(object sender, EventArgs e)
            {
                Desen.Clear(this.BackColor);
            }
            private void checkBox1_CheckedChanged(object sender, EventArgs e)
            {
                if(checkBox1.Checked)
                    Desen.DrawLine(Creion_albastru, 210, 50, 250, 150);
            }
            private void checkBox2_CheckedChanged(object sender, EventArgs e)
            {
                if (checkBox2.Checked)
                    Desen.DrawRectangle(Creion_rosu, 250, 175, 200, 100);
            }
            private void checkBox3_CheckedChanged(object sender, EventArgs e)
            {
                if(checkBox3.Checked)
                    Desen.DrawEllipse(Creion_ciocolatiu, 300, 50, 105, 105);
            }
            private void checkBox4_CheckedChanged(object sender, EventArgs e)
            {
                if(checkBox4.Checked)
                    Desen.DrawEllipse(Creion_albastru, 125, 20, 55, 100);
            }
            private void checkBox5_CheckedChanged(object sender, EventArgs e)
            {
                if(checkBox5.Checked)
                    Desen.FillRectangle(Pensula, 50, 175, 75, 130);
            }
            private void checkBox6_CheckedChanged(object sender, EventArgs e)
            {
                if(checkBox6.Checked)
                    Desen.FillEllipse(Pensula, 150, 150, 75, 130);
            }
    

         - Folosim instructiuni if pentru a forta desenarea numai cand validam Check Box nu si la devalidare.

         Afisarea evolutiei in timp a unei valori

        Instrumentele fizice pentru afisarea evolutiei in timp a marimilor electrice sunt relativ scumpe.



        Osciloscop


        O solutie mult mai ieftina o reprezinta instrumentele virtuale.
        Vom realiza in continuare o aplicatia graph_00 care afiseaza graficul evolutiei in timp a unei valori.
        Afisarea graficului se bazeaza pe unirea printr-o linie a doua valori consecutive. Valorile vor fi generate prin intermediul unui obiect de tip "trackBar". Citirea valorii acestui obiect, se face la intervale egale de timp folosind un timer.



            System.Drawing.Graphics Desen;
            System.Drawing.Pen Creion_albastru;
            System.Drawing.Pen Creion_rosu;
            System.Drawing.Pen Creion_pic;
            Int16 w = 400, h = 220, val, val_v, val_max = 1024, x0 = 75, y0 = 20, poz;
    
            private void Form1_Paint(object sender, PaintEventArgs e)
            {
                Desen = this.CreateGraphics();
                Creion_albastru = new System.Drawing.Pen(System.Drawing.Color.Blue);
                Creion_rosu = new System.Drawing.Pen(System.Drawing.Color.Red);
                Creion_pic = new System.Drawing.Pen(this.BackColor);
                Desen.DrawRectangle(Creion_albastru, x0 - 2, y0 - 2, w + 10, h + 4);
                this.trackBar1.Maximum = val_max;
            }
    
            private void timer1_Tick(object sender, EventArgs e)
            {
                val_v = val;
                val = System.Convert.ToInt16(this.trackBar1.Value);
                this.label1.Text = System.Convert.ToString(this.trackBar1.Value);
    
                Desen.DrawLine(Creion_pic, x0 + poz + 1, y0, x0 + poz + 1, y0 + h);
                Desen.DrawLine(Creion_albastru, x0 + poz + 2, y0, x0 + poz + 2, y0 + h - 1);
                val = System.Convert.ToInt16(System.Convert.ToDouble(val) * (System.Convert.ToDouble(h) / System.Convert.ToDouble(val_max)));
                Desen.DrawLine(Creion_rosu, x0 + poz - 1, y0 + h - val_v, x0 + poz, y0 + h - val);
                poz++;
                if (poz - 2 > w)
                {
                    Desen.DrawLine(Creion_pic, x0 + poz + 1, y0, x0 + poz + 1, y0 + h);
                    poz = 0;
                    Desen.DrawLine(Creion_pic, x0 + poz, y0, x0 + poz, y0 + h);
                    poz = 1;
                    Desen.DrawLine(Creion_pic, x0 + poz, y0, x0 + poz, y0 + h);
                }
            }
    

        Pornind de la instrumentatia aflata la ATI, vom afisa un semnal EKG.



        Instrument virtual ATI


        In proiectul ekg_00 vom genera automat valorile folosind o functie. Vom utiliza functia ekg(px) functie care simuleaza valorile primite de la un EKG.
        Functia ekg furnizeaza o valoare instantanee (intre 0 si 100) a ekg-ului in pozitia px. Parametrul px maxim fiind numarul de puncte intre doua pulsuri. Valorile uzuale pentru px fiind 1-150;



            System.Drawing.Graphics Desen;
            System.Drawing.Pen Creion_albastru;
            System.Drawing.Pen Creion_rosu;
            System.Drawing.Pen Creion_pic;
            System.Random nr;
            int w = 400, h = 200, val, val_v, val_max = 100, x0 = 75, y0 = 20, poz, px_puls, px_max=150;
            double puls;
            private void Form1_Load(object sender, EventArgs e)
            {
                Desen = this.CreateGraphics();
                Creion_albastru = new System.Drawing.Pen(System.Drawing.Color.Blue);
                Creion_rosu = new System.Drawing.Pen(System.Drawing.Color.Red);
                Creion_pic = new System.Drawing.Pen(this.BackColor);
                Desen.DrawRectangle(Creion_albastru, x0 - 2, y0 - 2, w + 10, h + 4);
                nr=new System.Random();
                puls=70;
                this.trackBar1.Value = Convert.ToInt32(puls);
                this.label1.Text = System.Convert.ToString(puls);
            }
    
            private void timer1_Tick(object sender, EventArgs e)
            {
                val_v = val;
                px_puls = px_puls + 1;
                if ((px_puls > px_max - puls) && (this.trackBar2.Value > 0))
                {
                    px_puls = 0;
                    puls = this.trackBar2.Value+nr.Next(10);
                    //System.Media.SystemSounds.Beep.Play();
                    //System.Media.SystemSounds.Asterisk.Play();    
                }
                if (this.trackBar2.Value > 0)
                    val = ekg(px_puls);
                else
                {
                    puls = 0;
                    val = 0;
                }
                this.trackBar1.Value = Convert.ToInt16(puls);
                this.label1.Text = System.Convert.ToString(puls);
                Desen.DrawLine(Creion_pic, x0 + poz + 1, y0, x0 + poz + 1, y0 + h);
                Desen.DrawLine(Creion_albastru, x0 + poz + 2, y0, x0 + poz + 2, y0 + h - 1);
                val = System.Convert.ToInt16(System.Convert.ToDouble(val) * (System.Convert.ToDouble(h) / System.Convert.ToDouble(val_max)));
                Desen.DrawLine(Creion_rosu, x0 + poz - 1, y0 + h - val_v, x0 + poz, y0 + h - val);
                poz++;
                if (poz - 2 > w)
                {
                    Desen.DrawLine(Creion_pic, x0 + poz + 1, y0, x0 + poz + 1, y0 + h);
                    poz = 0;
                    Desen.DrawLine(Creion_pic, x0 + poz, y0, x0 + poz, y0 + h);
                    poz = 1;
                    Desen.DrawLine(Creion_pic, x0 + poz, y0, x0 + poz, y0 + h);
                }
            }
        }
    }