Scheme logice operatori relationali, expresii relationale in C++
  • Tematica
  • Noi notiuni

  • Operatori relationali

        Programele scrise si analizate pana in acest moment, au fost simple inlantuiri de instructiuni de atribuire, executia programului era una liniara unde instructiunile se inlantuiau unele dupa altele de la ineputul programuli pana la sfarsitul lui.
        Problemele pe care dorim sa le rezolvam cu ajutorul calculatorului sunt de cele mai multe ori, mult mai complexe. O simpla insiruire de instructiuni nu poate rezolva probleme complexe. De multe ori e nevoie ca programul sa ia cai diferite in functie de datele introduse de operator , de anumite valori ale diferitelor variabile sau constante. Programul trebuie sa contina toate variantele posibile, si in momentul rularii , in urma unor operatii de comparare sa urmeze calea corespunzatoare. Comparatia se face prin intermediul operatorilor relationali.

    OperatorSemnificatie
    >Mai mare
    <Mai mic
    >=Mai mare sau egal
    <=Mai mic sau egal
    ==Egal
    !=Diferit


  • Expresii relationale

        O instructiune cu doi operanzi si un operator relational intre ei se numeste expresie relationala.
        Rezultatul unei expresii relationale este o valoare bool-eana care poate lua deci doua valori: true sau false

  • Program C++ pentru a exemplifica modul de scriere al expresiilor relationale

    
    // Program scris in C++ Visual Studio 2005 de tipul:CLR console application
    // Expresii relationale 
    
    #include "stdafx.h"
    #include < iostream >
    using namespace std;
    
    int main()
    {
      double  a,b;
      cout << "\n\tIntroduceti o valoare pentru numarul a : ";
      cin >> a ;
      cin.ignore();
      cout << "\n\tIntroduceti o valoare pentru numarul b : ";
      cin  >> b;
      cin.ignore();
      cout <<"\n\n\tOperatia : a >  b are ca rzultat: " << (a>b);
      cout <<"\n\tOperatia : a >= b are ca rezultat: " << (a>=b);
      cout <<"\n\tOperatia : a == b are ca rezultat: " << (a==b);
      cout <<"\n\tOperatia : a != b are ca rezultat: " << (a!=b);
      cout <<"\n\tOperatia : a <= b are ca rezultat: " << (a<=b);
      cout <<"\n\tOperatia : a <  b are ca rezultat: " << (a < b);
      cin.get();
      return 0;
    }
    


    Dupa rularea programului in "Command Prompt" se afiseaza:



  • Scheme logice

        Schemele logice – au rolul de a reprezenta grafic fluxul general al datelor si a algoritmului de prelucrare.
        Sintetizeaza succesiunea etapelor de rezolvare a unei probleme constituind o reprezentare grafica a functiilor algoritmului utlizat. In cadrul acestor scheme se folosesc simboluri standard, carora li se asociaza în principiu anumite instructiuni.
        Schema logica reprezinta de fapt un graf orientat în care exista cel putin urmatoarele elemente:
        Ordinea în care instructiunile programului sunt executate constituie structura de control a acestuia.
        Schema logica este importanta la analiza problemei, la scrierea programuli si la intelegerea programului de alte persoane, schema logica fiind reprezentarea vizuala a functionarii programului.

    Se folosesc urmatoarele simboluri grafice in cadrul schemelor logice





        Schema logica a programului care asteapata de la utilizator raza unui cerc si afiseaza aria acestuia , arata astfel:





        Sunt cazuri in care programul trebuie sa ruleze anumite instructiuni numai in anumite cazuri. Sa presupunem ca un program asteapta doua numere de la utilizator si vrea sa calculeze diferenta lor si s-o afiseze insa inainte sa afiseze diferenta numerelor introduse am vrea sa fim avertizati cu un mesaj ca diferenta este negativa. Deci 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:





        Sa realizam acum schema logica a unui program care asteapata de la utilizator doua numere (a si b) pe care le afiseaza in ordine crescatoare adica in ordinea a,b daca a < b sau b,a daca b < a





        Schema logica a unui program care asteapata de la utilizator coeficientii euatiei de gradul 1 (a si b) si afiseaza solutiile





        Schema logica a unui program care asteapata de la utilizator coeficientii euatiei de gradul 2 (a, b si c) si afiseaza solutiile





        Sa realizam acum schema logica a unui program care asteapata de la utilizator trei numere (a,b si c) pe care le afiseaza in ordine crescatoare.





        De multe ori e nevoie sa calculam repetitiv ceva. Sa luam de exemplu calculul sumei primelor 100 de numere naturale sau calculul lui n!. Sa realizam schema logica a unui program ce calculeaza n factorial.





        Sa vedem aceasta schema logica afisata animat pentru n=4.

        Sa incercam sa calculam cat mai exact valoarea lui e. Numarul e poate fi descompus in serii astfel:



        Numarul e va putea fi aproximat prin aplicarea formulei de sus pe un numar finit de pasi astfel:



        fact(k) fiind aplicatia anterioara pentru calculul factorialului.

        Daca includem schema logica a aplicatiei de calcul factorial, schema logica pentru aproximarea numarului e devine:



  • Algoritmul bubble sort

        Am realizat anterior schema logica a unui program care astepata de la utilizator trei numere (a,b si c) pe care le afiseaza in ordine crescatoare. Pentru mai mult de 3 numere situatia se complica foarte mult asa ca trebuie sa concepem alta strategie.
        Vom folosi pentru inceput, algoritmul bubble sort. Algoritmul se bazeaza pe facilitatile de repetitie si este schitat in urmatoarea schema logica. Algoritmul schitat grafic mai jos poate ordona n numere, insa este utilizat in cazul concret de 10 numere.



         Vezi codul sursa


        In principiu algoritmul bubble sort ia pe rand doua cate doua numere si le schimba locul daca primul numar este mai mare decat cel de-al doilea. In primul pas se compara nr1 cu nr2, in pasul doi nr2 cu nr3. Dupa n-1 pasi se ajunge la comparatia n-1 cu n. Daca se repeta operatia de cel putin n-1 ori avem certitudinea ca sirul este ordonat crescator. In cazul cel mai defavorabil in care primul numar este cel mai mare, dupa n-1 treceri prin sirul de numere, acesta ajunge pe ultimul loc fiind cel mai mare.
        Algoritmul bubble sort este mai bine exemplifica in aplicatia grafica:


        Daca sirul anterior este deja ordonat crescator programul totusi ruleaza 81 de pasi adica (n-1)*(n-1). Am putea realiza o optimizare in sensul ca daca sirul e deja ordonat sa nu mai continue algoritmul de aranjare si sa treaca direct la afisarea sirului de numere. Vom introduce o variabila suplimentara numita si semafor care va fi inscrisa cu o anumita valoare cand in urma trecerii prin sirul de numere nu a avut loc nici o schimbatre intre pozitiile numerelor si deci sirul este deja ordonat.



         Vezi codul sursa



  • Algoritmul sel sort

        O alta metoda de ordonare, este metoda selectiei (sel sort). Conform acestei metode, se urmeaza urmatorii pasi:


         Vezi codul sursa


        La prima vedere se pare ca algoritmul ruleaza la fel de mult ca buble sort insa daca analizam cu atentie vedem ca timpul se reduce la jumatate.

         Vezi codul sursa




  • Algoritmul insert sort

        O alta metoda de ordonare, este metoda insert sort. Conform acestei metode, se ia sirul neordonat si se construieste un nou sir astfel: se iau pe rand elementele din primul sir si se insereaza la locul potrivit in sirul 2. Metoda presupune deplasarea cu o pozitie spre dreapta din locul in care trebuie inserat elementul curent.



  • Algoritmul quick sort

        Cea mai eficienta insa, ramane metoda quick sort. Conform acestei metode, se extrage un element la intamplare din sir, se grupeaza elementele in doua grupe. Pentru o sortare crescatoare, se plaseaza toate elementele mai mici intr-un sir la stanga si toate elementele mai mari intr-un sir la dreapta elementului selectat initial. Se repeta operatia pentru fiecare sir rezultat, rezultand deci dupa prima iteratie 2 siruri, dupa doua iteratii 4 siruri si asa mai departe. Sortarea este completa cand nici unul din siruri nu are mai mult de un element. Se repeta operatia