Mini-Browser

sâmbătă, 4 decembrie 2010

Structuri: If si if-else

In aceast articol vom invata cum sa facem un program care sa ia decizii.
Cea mai simpla metoda de a programa o comportare este sa spui: " Daca A este adevarat, atunci executa B". Ei bine cam asa re reprezinta instructiunea if din C++. 
Iata forma simpla a sintaxei instructiunii if:
if (conditie)
    instructiune;
Instructiunea if mai are si o sintaxa compusa si mai preferata de unii:
if(conditie){
    instrctiuni;
}
Ce este diferit? Care este diferenta?
Diferit este faptul ca in al doilea exemplu se folosesc acolade.
Diferenta este faptul ca forma simpla a lui if executa doar o singura instructiune pe cand cea cu acolade executa doua sau mai multe.
Multi gresesc cand programeaza si scriu mai multe instructiuni dar nu intre acolade. 
Ce rol au acoladele?
Acoladele au rolul de a crea un bloc de instructiuni care urmeaza sa fie executate in cazul in care conditia este adevarata, pe cand daca nu avem acoladele se va executa doar prima instructiune care urmeaza dupa if.


Sa luam un exemplu:
...
if (a==b)  
    cout << " a este egal cu b";
...


Mai observam ca s-au folosit de 2 ori semnul egal. De ce?
C++ are doi operatori diferiti. Unul care indica atribuirea ( = ), adica copie valoarea din membrul drept in membrul stang si unul care indica verificarea egalitatii ( == ).
Cand vrem sa testam o egalitate mereu trebuie sa folosim operatorul == .


Se mai poate specifica si actiunile care trebuie executate in cazul in care conditia este falsa, iar aceasta foloseste cuvantul cheie else (altfel).
Iata un exemplu:
...
if(a==b)
    cout << " a este egal cu b";
else
    cout << "a nu este egal cu b"; 
...
Operatorii rationali din C++ sunt: 
<      - mai mic
>      - mai mare
<=    - mai mic sau egal
>=    - mai amre sau egal
==    - verificarea egalitatii
!=     - verificarea inegalitatii


Sa luam ca exemplu un program care ne afiseaza daca un numar este par sau impar:


#include <iostream>
using namespace std;


int main(){
    int n;
    cout << " Introduceti un numar: ";
    cin>>n;
    if(n%2==0)
        cout << " Numarul este par.";
    else
        cout << " Numarul este impar.";
    return 0;
}


In acest program am folosit un operator nou si anume operatorul modulo ( % ). Acest operator returneaza restul imartirii, iar daca restul impartirii unui numar la 2 este 0 inseamna ca acel numar este par, iar in caz contrar este impar.







Variabile

Ne-am jucat pana acum cu texte, am invatat cum sa le afisam iar acum e momentul sa trecem mai departe si sa invatam despre variabile.
Ce sunt variabilele?


Variabilele sunt locatii in care putem plasa date.


Datele respective sunt , la randul lor, de mai multe tipuri, iar noi vom discuta despre 3 tipuri elementare: intreg, fractionar si sir de text.


Tipul Intreg - are capacitatea de a memora date din multimea numerelor intregi. Ex: 14; -19;1003.


Tipul Fractionar - are capacitatea de a memora si partea fractionara a numerelor reale. Ex: 13,1235; -15,4; 3,14; etc


Tipul Sir de text - Are capacitatea de a memora caractere
Iar tipurile sunt la randul lor definite prin cuvintele cheie:
int - pentru tipul intreg
double - pentru tipul fractionar
char *- pentru tipul sir de text
Sunt multe alte tipuri de variabile dar pentru inceput e de ajuns sa le stim pe acestea 3.


Cum se declara o variabila?
 Sintaxa generala a declararii variabilelor este urmatoarea:
  tip nume_variabila;
Ex:  int produs;
       double suma;
       char *text;


Numele variabilei poate fi orice cuvant dorim cu cateva exceptii:
1. Nu trebuie sa fie asemanator cu cuvintele cheie din C++ precum main, int, if, while,etc
2. Trebuie sa inceapa cu o litera a alfabetului si nu un numar sau un alt caracter precum virgula sau alte semne de punctuatie ci mai poate contine underline ( _ ) ca delimitator de cuvinte.
Ex: double produsul_numerelor;
       char *numele_meu;


Acum ca am lamurit cum se declara variabilele trebuie sa le atribuim valori.
Putem atribui valori variabilelor folosint semnul egal ( = ).
Ex: suma = 13; sau  produsul = 5 * 3;
Daca avem nevoie de o cantitate mai mare de variabile in programul nostru le putem declara sub acelasi tip folosind semnul virgula ( , ).
Ex: int a, b, suma; -> este echivalentul acestor instructiuni:
int a;
int b;
int suma;


Iata un exemplu de program care foloseste variabile:


#include<iostream>
using namespace std;


int main() {
    int a, b, sum;
    a=5;
    b=13;
    sum = a + b;
    cout << sum;
    return 0;
}
    
Acest exemplu declara 3 variabile a,b si suma, si atribuie valori lui a si b, calculeaza suma si o plaseaza in variabila sum, apoi o afiseaza.


Ati observat ca, pentru a afisa valoarea unei variabile la consola, folosim tot obiectul cout si operatorul de flux, doar ca nu mai folosim ghilimelele. De ce?
Pentru ca ghilimelele se folosesc cand dorim sa afisam un sir de caractere, sau un text. Cand dorim sa afisam o variabila trebuie sa scriem doar numele variabilei.


Acum tim ce sunt variabilele si avem o idee cum se lucreaza cu ele deci, putem trece mai departe.


Acum putem face operatii de matematica folosind variabile si operatori dar asta putem face si cu calcuatorul din windows sau chiar si din minte. De ce ne-ar mai trebui sa scriem atata cod de program pentru un lucru atat de simplu?
Ei bine o parte buna a raspunsului e ca odata facut un program se poate executa de nenumarate ori fara sa-l rescriem de fiecare data. Si o a II -a parte a raspunsului e ca putem face mai mult decat simple operatii de adunare si scadere.
Cum ar fi sa facem un program care sa citeasca gradele Fahrenheit si sa afiseze gradele Celsius?
Pentru inceput vreau sa intreb, nu ar fi mai elegant ca un program sa afiseze un mesaj in care sa solicite un numar, sa citeasca acel numar, sa faca calculele si sa afisere rezultatul?
Ba da.
Ca un program sa citeasca un numar de la tastatura va trebui sa foloseasca obiectul cin.
cin este la fel ca obiectul cout, doar ca de data asta nu afiseaza datele ci asteapta ca utilizatorul sa introduca datele si sa le plaseze in variabile. ( cin = console input )
Iata programul:


#include <iostream>
using namespace std;


int main(){
    double temp_celsius, temp_fahrenheit;
    cout << " Introuceti temperatura in grade Fahrenheit: ";
    cin >> temp_fahrenheit;
    temp_celsius = (temp_fahrenheit - 32) / 1.8;
    cout << " Temperatura in grade Celsius este: ";
    cout << temp_celsius;
    return 0;
}

Observam la cin ca operatorul de flux este indreptat spre aprtea dreapta ( >> ). Asta inseamna ca datele se scurg dinspre stanga spre dreapta, astfel ca programul asteapta sa introducem datele si apoi sa o atribuie variabilei.
Daca scriem ceva de genul: cin >> a >> b >> c; programul asteapta sa introducem 3 valori doar ca trebuie introduse cu un spatiu intre ele ( Ex: 12 53 72 ) si vor fi atribuite exact in ordinea in care sunt scrise ( a =12 , b = 53, c = 72 ). Daca dorim sa citim pe rand atunci ne trebuie scris in felul urmator: cin>>a;
                cin>>b;
                cin>>c;


O alta regula importanta este ca o variabila trebuie declarata mereu inainte de a fi utilizata!
o instructiune de genul :
    a=a*2;
    int a;
va fi gresita si va duce la erori la compilare, caci variabila trebuie declarata ianinte de a fi utilizata.


Variabilele declarate in exemplus de mai sus sunt de tipul double deoarece prin imaprtirea la 1.8 va da un rezultat cu parte fractionara.


Ce se intampla daca declaram o variabila de tip int si ii atribuim o valoare factionara?
Deoarece tipul int citeste doar intregi tot ceea ce este dupa virgula se va pierde.


As vrea sa mai amintesc despre comentariile din codul sursa.
Liniile de program c++ care incep cu o pereche de caractere slash ( // ) sunt comentarii si sunt ignorate de catre compilatorul C++ pana la sfarsitul liniei!
Sau mai putem nota comentariile intre /* (aici sunt plasate comentariile)  */
Iata versiunea comentata a exemplului de mai sus:



#include <iostream>
using namespace std;

int main(){
    // declaram variabilele
    double temp_celsius, temp_fahrenheit;
    // afisam mesajul introductiv
    cout << " Introuceti temperatura in grade Fahrenheit: ";
    // citim temperatura Fahrenheit
    cin >> temp_fahrenheit;
    temp_celsius = (temp_fahrenheit - 32) / 1.8;   // convertim in Celsius
    // Afisam rezultatul
    cout << " Temperatura in grade Celsius este: ";
    cout << temp_celsius;
    return 0;
}

Comentariile sunt utile pentru programator, in cazurile programelor mari in care sunt asa de multe linii de cod incat nu mai stii exact de unde incepe o anumita instructiune, iar plasand comentariile iti va fi usor sa revii mai tarziu.

Primul Program.. Afisarea unui mesaj


Vom incepe prin a prezenta cel mai simplu program, si anume afisarea unui mesaj.

# include <iostream>
using namespace std;

int main() {
    cout << " Exemplu de mesaj. ";
}


Acest program nu face decat sa afiseze un singur mesaj, nimic mai mult.
Ca sa intelegem mai bine vom lua fiecare instructiune in parte si o vom analiza.

 " #include <iostream> " - Directiva are forma generala #include <nume_fisier> . Acesta este o directiva de preprocesor din C++ si nu face altceva decat sa incarce declaratii si definitii care accepta o parte a bibliotecii standard C++.
De ce avem nevoie de asa ceva?

Pai , in acest exemplu este nevoie de aceasta directiva pentru a putea afisa mesajul, caci obiectul cout este definit in cadrul fisierului iostream si nu face decat sa afiseze mesajul dintre ghilimele la consola.

Alte exemple de directive pot fi: #include <math.h> , #include <string>, #include <stdlib.h> , etc...
Probabil ati observat ca unele tipuri contin extensia .h si altele nu.
Explicatia este ca cele care nu contin aceasta extensie .h sunt fisiere "virtuale". 
Ce intelegem prin virtuale?
Adica care contine informatii intr-o forma precompilata. 
De asemenea retineti ca numele fisierului se scrie intre aceste semne < > caci pe viitor vom invata ca ne putem creea noi propriile fisiere include.
Sunt multe de discutat despre aceste directive de aceea nu am sa ma intind prea mult.

Daca nu intelegeti prea bine nu-i nici o problema, tot ce trebuie sa stiti momentan este sa includeti aceasta directiva la inceputul programului. ( #include <iostream> )


using namespace std; " - Instructiunea using permite referirea directa la obiecte precum std::cout.
Daca nu am fi avut aceasta instructiune ar fi trebuit sa afisam mesajul astfel:
    std::cout<<" Exemplu de mesaj. ";
Aceasta instructiune ne scuteste de nevoia de a mai scrie std:: inaintea obiectuluilui cout si de asemenea inaintea lui cin sau endl (explic in viitoarele tutoriale ce inseamna).
namespace std indica faptul ca se foloseste spatiul de nume std.


int main() { } " - In principiu main este o functie.(vom discuta despre functii in tutorialele viitoare) De aici isi incepe programul executia si ruleaza pana la terminarea lui.
In fiecare program creat in C++ avem nevoie de functia main. De asemenea trebuie sa mentionez acele acolade "{ }". Desi aici sunt afisate una dupa alta trebuie sa tinem minte ca toate instructiunile trebuie plasate intre ghilimele, exact ca in exemplul de sus.
Forma generala este:

int main() {
    instructiuni;
}


return 0; " - Aceasta instructiune nu face decat sa returneze valoarea 0 sistemului inainte de a-si incheia executia. Este bine sa ne invatam sa scriem return 0; la fiecare program pe care il facem deoarece functiile in genereal returneaza o valoare cu exceptia celor de tip void, si ne va fi la indemana cand vom invata despre functii.


cout "  -  ( cout = console output, in engleza)

Am pastrat acest cout pentru final deoarece este singura instructiune reala a acestui exemplu.

Ne putem imagina cout ca fiind ecranul calculatorului sau mai concret consola. In C++ datele de iesire se afiseaza folosind cout si un operator de "flux" ( << ) orientat spre stanga, care indica trecerea datelor de la o valoare ( in acest caz textul intre ghilimele) la consola.

                                  cout<< "Stapane, sunt aici pentru a sluji!";

Mereu cand folosim cout trebuie sa plasam textul intre ghilimele ( " " ) !!
De asemenea nu trebuie sa uitam de caracterul punct si virgula ( ; ).
O importanta regula este ca Fiecare instructiune din C++ trebuie sa se termine cu punct si virgula cu cateva exceptii, pe care le vom explica la momentul potrivit.
Una din exceptii este directiva #include <nume_fisier> Dupa aceasta instructiune nu se pune punct si virgula.
O a II-a exceptie este functie main.

Daca ne jucam putin cu afisarea mesajelor observam ca urmatorul program desi functioneaza, nu reactioneaza exact cum dorin noi.

#include <iostream>
using namespace std;

int main() {
    cout << " Eu sunt Terminator,";
    cout << " Sunt un virus foarte renumit.";
    cout << " Temeti-va!! ";
return 0;
}

Acest program va afisa: Eu sunt Terminator.Sunt un virus foarte puternic.Temeti-va!!
Iar noi dorim sa le afiseze unul sub altul ca trei propozitii independente.
Cum facem asta?
Pai textul trimis la ecran nu trece automat la urmatoarea linie fizica, iar din acest motiv trebuie sa afisam un caracter linie noua si anume endl ( endl = end line ).
Iata programul care afiseaza propozitiile pe 3 linii fizice independente:

#include <iostream>
using namespace std;

int main() {
    cout << " Eu sunt Terminator,"<<endl;
    cout << " Sunt un virus foarte renumit."<<endl;
    cout << " Temeti-va!! "<<endl;
return 0;
}

Este important de stiut ca toate datele se scurg dinspre dreapta spre stanga, deci daca ar fi sa parcurgem acest program am obtine urmatorii pasi:
1. Afiseaza mesajul "Eu sunt Terminator."
2. Afiseaza caracterul linie noua.
3. Afiseaza mesajul "Sunt un virus foarte renumit."
4. Afiseaza caracterul linie noua.
5. Afiseaza mesajul " Temeti-va!! ".
6. Afiseaza caracterul linie noua.
Astfel la consola vom obtine rezultatul dorit:
 Eu sunt Terminator.
 Sunt un virus foarte renumit.
 Temeti-va!!

Mai putem folosi si un caracter Escape pentru a afisa propozitiile pe o linie noua.
Este echivalentul lui endl si se noteaza "\n". Partea buna este ca acest caracter escape trebuie introdus in textul dintre ghilimele si nu va fi afisat ci va fi interpretat ca un caracter linie noua iar asta ne va reduce volumul de instructiuni ce trebuie scrie pentru a afisa un text.
Iata programul revizuit:

#include <iostream>
using namespace std;

int main() {
    cout << " Eu sunt Terminator,\n Sunt un virus foarte renumit.\n Temeti-va!!";
return 0;
}

Dupa cum am spus, va avea acelasi efect ca si programul in care am folosit endl, doar ca de data asta am obtinut un numar redus de linii de cod.

 Eu sunt Terminator.
 Sunt un virus foarte renumit.
 Temeti-va!!

vineri, 3 decembrie 2010

Pentru inceput...



     Tutorialele scrise in acest blog sunt pentru incepatori care vor sa dobandeasca cunostinte de baza in limbajul C++. 

Ok, deci nu-mi place sami bat capul cu povestioare gen " cum au luat nastere limbajele de progamare",etc..  pentru asta aveti Google la dispozitie. Lamurind acest lucru vreau sa incep prin a prezenta niste notiuni primare si a trece in revista cateva definitii tehnice care ne trebuie pentru a intelege pe deplin limbajul C++.
De multe ori am auzit persoane zicand ceva de genu "programu asta nu vrea sa porneasca" sau " l-am pus sa-mi execute niste operatii si imi face altceva...". Deci in primul rand vreau sa va spun o prima regula foarte importanta care sper sa lamureasca multi pe viitor:  

Calculatoarele nu fac decat ceea ce li se spune!


Ca sa fiu mai explicit, un calculator nu va sti niciodata ce vrem noi cu adevarat sa faca. Cand spunem "Converteste gradele Fahrenheit in grade Celsius" unui om i s-ar parea ceva simplu dar ca sa inteleaga calculatorul trebuie sa fim mult mai detaliati urmand mai multi pasi:
1.Scrie mesajul " Gradele celsius = "
2.Citeste de la tastatura un numar si stocheazal in variabia celsius.
3. Converteste gradele Celsius in grade Fahrenheit
4. Afiseaza mesajul"Temperatura in grade Fahrenheit este: ".
5. Afiseaza rezultatul convertirii.


Bine, deci acum avem o mica idee despre ce urmeaza. Acum vreau sa disut despre cateva definitii tehnice pe care le vom folosi des in viitoarele tutoriale.


Cod Sursa   -   Codul sursa este un program scris intr-un limbaj precum C++.Codul sursa este compus instructiunile C++ care formeaza programul.


Cod Masina   -   Codul masina este practic limbajul microprocesorului, care este format  din combinatii de 1 si 0. 


Date     -   Sunt informatiile stocate de un program, in vederea manipularii sau afisarii. La nivel de sintaxa ele pot fi alcatuite din cuvinte si numere.


Instructiune  -   O instructiune reprezinta de obicei o linie dintr-un program care executa o operatie sau mai multe


Program   -   Programul reprezinta o serie de instructiuni ce sunt indeplinite de  calculator folosind date initiale.


Compilator   -   Compilatorul e un program care preia instructiunile (codul sursa) C++ si genereaza programul sub forma de cod masina (sau mai formal .exe) pentru a putea fi rulate de calculator.


Operand  -  Este o variabila, constanta, o nume de functie, etc a carei valoare este prelucrata de operator.


Operator  -  Este un simbol care arata ce operatii se execut (Ex: '+' , '-', '*' ...)


Expresie  -  Este o combinatie de operanzi, operatori, functii, etc. care in urma evaluarii lor se obtine o valoare rezultata. De exemplu " suma=suma+i; " sau " x= -b/a; ".


Acum, pentru ca avem cateva cunostinte de baza putem merge mai departe. In primul rand ne trebuie un compilator pe care vom rula programele. Eu folosesc Microsoft Visual Studio 2008 Express. Pentru incepatori recomand MinGW sau CodeBlocks daca lucrati pe Windows.
De asemenea sunt multe alte compilatoare unele mai complexe, altele mai simple si la indemana.
Acum ramane de noi sa il alegem pe cel care ni se potriveste cel mai bine.


Bine, avem compilator acum ce?


Acum voi explica cum creem un proiect si cum vom creea fisierele care ne trebuie pentru a putea incepe sa scriem programe.


Navigam la     File -> New -> Project


Acum va trebui sa selectam tipul de proiect. Pe noi ne intereseaza Console Aplication sau Win32 Console Aplication cum e trecut in unele compilatoare, si un nume pentru proiectul respectiv.
Dupa ce am creat proiectul trebuie sa mai adaugam un fisier:


Navigam la     File -> New -> File...


Aici va trebui sa selectam tipul fisierului. Noua ne trebuie C/C++ Source File sau C++ File depinde de compilator.


Daca intampinati probleme sau nelamuriri sau credeti ca am omis ceva va rog sa postati pe blog.