Laborator Cpp.pdf

20
UNIVERSITATEA MARITIMĂ CONSTANŢA Cătălin-Constantin Pomazan Simona Dinu Laborator Programarea Calculatoarelor şi Limbaje de Programare Etapele ce trebuie parcurse pentru realizarea unui program sunt: analiza problemei proiectarea soluţiei – definirea algoritmului de rezolvare codificarea algoritmului într-un limbaj de programare testarea funcţionării programului Dacă în timpul testării programului se constată funcţionarea defectuoasă a acestuia, este necesară reluarea ultimelor două sau trei etape în funcţie de natura erorilor (erori de codificare sau erori de proiectare). În domeniul informaticii, un algoritm este o metodă practică pentru rezolvarea unei probleme, exprimat ca o secvenţă finită de paşi. Altfel spus, un algoritm este o listă bine definită de instrucţiuni pentru finalizarea unei probleme. Un algoritm poate fi reprezentat în mai multe modalităţi: în limbaj natural – descriere amănunţită prin cuvinte printr-o schemă logică – reprezentare grafică simplă în pseudocod – descriere formală simplificată intermediară între limbajul natural şi de limbajul de programare Reprezentarea prin schemă logică a unui algoritm utilizează blocuri (operaţii) de bază şi/sau structuri de control (formate prin gruparea blocurilor de bază). În continuare vor fi enumerate aceste elemente ce apar într-o schemă logică precum şi reprezentarea echivalentă a acestora (acolo unde este posibil) în pseudocod ( pe centru) şi in limbajul C++ ( în dreapta paginii). Blocuri de bază Blocul de început/sfârşit – orice schemă logică începe cu un bloc de început şi se termină cu un bloc de sfârşit. Blocul de intrare – desemnează preluarea datelor (valorilor variabilelor) de la dispozitivul de intrare (de exemplu de la tastatură). Laborator programarea calculatoarelor şi limbaje de programare 1

Transcript of Laborator Cpp.pdf

  • UNIVERSITATEA MARITIM CONSTANACtlin-Constantin PomazanSimona Dinu

    Laborator Programarea Calculatoarelor i Limbaje de Programare

    Etapele ce trebuie parcurse pentru realizarea unui program sunt: analiza problemei proiectarea soluiei definirea algoritmului de rezolvare codificarea algoritmului ntr-un limbaj de programare testarea funcionrii programului

    Dac n timpul testrii programului se constat funcionarea defectuoas aacestuia, este necesar reluarea ultimelor dou sau trei etape n funcie denatura erorilor (erori de codificare sau erori de proiectare).

    n domeniul informaticii, un algoritm este o metod practic pentru rezolvareaunei probleme, exprimat ca o secven finit de pai. Altfel spus, un algoritmeste o list bine definit de instruciuni pentru finalizarea unei probleme.

    Un algoritm poate fi reprezentat n mai multe modaliti: n limbaj natural descriere amnunit prin cuvinte printr-o schem logic reprezentare grafic simpl n pseudocod descriere formal simplificat intermediar ntre limbajul

    natural i de limbajul de programare

    Reprezentarea prin schem logic a unui algoritm utilizeaz blocuri (operaii) debaz i/sau structuri de control (formate prin gruparea blocurilor de baz). n continuare vor fi enumerate aceste elemente ce apar ntr-o schem logicprecum i reprezentarea echivalent a acestora (acolo unde este posibil) npseudocod (pe centru) i in limbajul C++ (n dreapta paginii).

    Blocuri de baz

    Blocul de nceput/sfrit orice schem logic ncepe cu un bloc de nceput ise termin cu un bloc de sfrit.

    Blocul de intrare desemneaz preluarea datelor (valorilor variabilelor) de ladispozitivul de intrare (de exemplu de la tastatur).

    Laborator programarea calculatoarelor i limbaje de programare 1

  • read a; cin >> a;

    Blocul de ieire desemneaz scrierea rezultatelor (valorilor variabilelor) ladispozitivul de ieire (de exemplu pe ecranul monitorului).

    write a; cout

  • Structuri de control

    Structurile de control sunt grupri de blocuri de baz ce apar frecvent nschemele logice i pentru care sunt definite instruciuni specifice n limbajele deprogramare (n situaia noastr n C++).

    Structura secvenial (secvena) grupeaz de obicei mai multe operaii(instruciuni) elementare (iniializri de variabile, prelucrri asupra datelor,tiprire a rezultatelor, etc.).

    { }

    Structura alternativ (decizia) permite ramificarea simpl a execuiei nfuncie de valoarea de adevr a condiiei. Cele dou ramuri se exclud mutual.Este posibil ca una dintre ramuri s fie vid (s nu conin alte blocuri). Pentru a exprima secvene de instruciuni n pseudocod i n C++ a fost folositnotaia .

    if a>b then

    else

    endif;

    if a> b then

    endif;

    if(a>b){

    } else {

    };

    if(a>b){

    };

    Structura repetitiv condiionat anterior (bucla/ciclul cu test iniial) secvena se execut repetitiv ct timp condiia este adevrat. Secvena se mainumete n aceast situaie i corpul buclei (corpul ciclului). Dac rezultatultestrii iniiale a condiiei este fals, secvena nu este executat nici mcar o

    Laborator programarea calculatoarelor i limbaje de programare 3

  • singur dat.

    while a>b

    repeat;

    while(a>b){

    };

    Pentru structura repetitiv condiionat anterior, condiia testat pentru repetareasecvenei se scrie identic n pseudocod i n C++. Pentru ca secvena s nu se repete la infinit, n cadrul acesteia trebuie modificatevariabilele ce sunt folosite n condiia testat pentru repetarea buclei astfel nctla un moment dat s se poat realiza ieirea din bucl.

    n afar de structurile de control menionate anterior i care permit descriereaoricrui algoritm, mai exist cteva structuri de control derivate din acestea cesunt folosite uzual i anume:

    Structura repetitiv condiionat posterior (bucla/ciclul cu test final) secvena (corpul buclei) se execut repetitiv pn cnd condiia devineadevarat. Spre deosebire de bucla cu test iniial, n cazul buclei cu test finalsecvena se execut cel puin o dat.

    repeat

    until ab);

    Pentru structura repetitiv condiionat posterior condiia testat pentru ieireadin bucl trebuie scris negat n C++ fa de pseudocod. n pseudocod secvenase repet pn cnd condiia devine adevrat, iar n C++ secvena serepet atta timp ct condiia este adevrat.Pentru ca secvena s nu se repete la infinit, n cadrul acesteia trebuie modificatevariabilele ce sunt folosite n condiia testat pentru repetarea buclei astfel nctla un moment dat s se poat realiza ieirea din bucl.

    Structura repetitiv (bucla/ciclul) cu contor este derivat din structura

    Laborator programarea calculatoarelor i limbaje de programare 4

  • repetitiv condiionat anterior. Secvena se execut repetitiv de un numrprestabilit de ori controlat de valoarea variabilei contor. Pentru ca repetarea snu se fac la infinit, este necesar incrementarea (decrementarea) variabileicontor cu valoarea pas (care trebuie sa fie diferit de zero).

    for contor=val_ini,val_fin

    repeat;

    int contor;for(contor=val_ini; contor

  • programul sare la sfritul structurii switch. Dac a nu este egal cu val_1, setrece la evaluarea cu val_2, i aa mai departe. n final, dac nici una dintreevaluri nu a fost adevrat, se execut instruciunile specificate dup default: iapoi se iese din structura switch. Eticheta default: i instruciunile scrise dupaceasta sunt opionale.Dac instruciunea break lipsete, se trece la execuia secvenei pentru val_2 (fra se mai verifica egalitatea), apoi la secvena pentru val_3 i aa mai departe(inclusiv secvena pentru default) pn la terminarea structurii sau pn la primainstruciune break.

    Instruciunea break poate fi folosit deasemenea n orice alt structur repetitivpentru a iei din bucl fr a mai fi necesar respectarea condiiei de ieire dinaceasta.

    Exerciiul 1 (instruciuni de intrare/ieire, structuri decizionale): S se scrie unprogram simplu care citete de la consol valorile pentru dou variabile ntregi (ai b) i afieaz prin mesaj care variabil este mai mare precum i valoareaacesteia.

    Reprezentarea algoritmului prin schem logic

    Algoritmul scris n pseudocod

    read a, b;if a > b then

    write a este mai mare;write a;

    elseif a = b then

    write a identic cu b;write a;

    elsewrite b este mai mare;write b;

    endif;endif;

    Laborator programarea calculatoarelor i limbaje de programare 6

  • Programul scris n C++#include // pentru functiile cin si cout#include // pentru functiile clrscr si getchvoid main(){

    clrscr(); // sterge ecranulint a, b;cout > a;cout > b;if(a>b){

    cout

  • Observaie: n evaluarea expresiilor matematice trebuie inut seama de tipuloperanzilor i ordinea de evaluare a expresiilor. Dac am fi scris formula astfel:

    tempF = 9 / 5 * tempC + 32;

    prelucrarea acesteia ar fi produs un rezultat eronat. Expresia 9/5 din cauza faptului c 9este reprezentat ca ntreg este evaluat ca un ntreg, iar valoarea corect a fraciei 9/5(1,8) este transformat prin trunchiere tot ntr-un ntreg (1) ceea ce evident denatureazrezultatul expresiei. Variabila tempC este de tip float i n aceast situaie evaluarea se vaface corect dac formula este scris:

    tempF = tempC * 9 / 5 + 32;

    Exerciiul 3 (bucla cu contor, tipuri de variabile): S se scrie un program simplucare citete de la consol un numr natural n i calculeaz factorialul acestuinumr.

    Algoritmul scris n pseudocod

    read n;factorialN 1;for i=1,n

    factorialN factorialN * i;repeat;write factorialN;

    Programul scris n C++#includevoid main(){

    unsigned int n; unsigned long factorialN;/* daca pentru n se vor folosi valori mai mari decat 33

    variabila factorialN va trebui sa fie de tipul unsigned double pentru a putea pastra valoarea factorialului */

    cout > n;factorialN = 1;for(int i=1;i

  • Exerciiul 4 (vectori, bucla cu test final, bucla cu contor, divizibilitate, paritate,tipuri de variabile): S se scrie un program simplu care citete de la consol unir X de n elemente ntregi (n1 and n50for i=1,n

    read X(i);repeat;

    a. suma elementelor pozitivesuma 0;for i=1,n;

    if X(i) > 0 then

    suma suma + X(i);endif;

    repeat;write Suma elementelor pozitive este: ;write suma;

    b. produsul elementelor pareprodus 1;for i=1,n

    if X(i) mod 2 = 0 then

    produs produs * X(i);endif;

    repeat;write Produsul elementelor pare este: ;write produs;

    c. suma elementelor negative aflate pe poziii imparesuma 0;for i=1,n

    if X(i) < 0 and i mod 2 = 1 then

    suma suma + X(i);endif;

    repeat;write Suma elementelor negative aflate pe pozitii impare este: ;write suma;

    Laborator programarea calculatoarelor i limbaje de programare 9

  • d. media aritmetic a elementelor care dau restul 2 la mprirea cu 5suma_elem 0;nr_elem 0;for i=1,n

    if X(i) mod 5 = 2 thennr_elem nr_elem + 1;

    suma_elem suma_elem + X(i);endif;

    repeatif nr_elem = 0 then

    write Nu exista elemente ce dau restul 2 la impartirea cu 5.;else

    write Media aritmetica a elementelor ce dau restul 2 la impartirea cu 5 este: ;write suma_elem / nr_elem;

    endif;

    e. numrul elementelor mai mici (strict) dect 5nr_elem 0;for i=1,n

    if X(i) < 5 thennr_elem nr_elem + 1;

    endif;repeat;write Numarul elementelor mai mici ca 5 este: ;write nr_elem;

    f. s se verifice dac elementul cu index m este divizibil cu 4do

    read m;until m1 and mn;

    if X(m) mod 4 0 then

    write Numarul X(m) NU este divizibil.;else

    white Numarul X(m) este divizibil cu 4.;endif;

    Observaie: La scrierea codului n C++ trebuie s inem seama de faptul cindexarea vectorului X ncepe de la zero (indexul primului element ntreg alvectorului X este zero). Acest prim element, dei are indexul 0 (care este numrpar), este de fapt plasat pe o poziie impar n cadrul vectorului (irului denumere).

    Observaie: Evaluarea logic (adevrat sau fals) a unei variabile numerice este:fals (false, 0) dac variabila are valoarea zero sau adevrat (true, 1) dacvariabila este diferit de zero (are o valoare nenul). De exemplu, pentrusecvena de instruciuni:

    int a, b;a=0; b=-7;

    evaluarea logic (n instruciuni de tip decizional - if) a variabilelor a i b ntoarcerezultatul false (0) pentru a i true (1) pentru b.

    Laborator programarea calculatoarelor i limbaje de programare 10

  • Programul complet scris n C++ pentru rezolvarea pe rnd a celor ase cerineale exerciiului 4

    #include#includevoid main(){

    int n, X[50];// preia de la consola elementele din sirul Xdo{

    clrscr();coutn;

    }while((n50));cout

  • getch();};

    Observaie: Acest exerciiu cu toate subpunctele sale (mai puin f) poate firezolvat folosind o singur parcurgere a vectorului X bucla for n care se facencrcarea cu valori a vectorului. Pentru aceasta, toate variabilele necesarerezolvrii cerinelor vor fi declarate la nceputul funciei main i n cadrul buclei,dup citirea valorii pentru X[i] se vor face testele i prelucrrile necesarerezolvrii.

    Exerciiul 5 (bucla cu test iniial): S se scrie un program simplu care citete dela consol un numr natural n i afieaz suma cifrelor acestui numr.

    Notm n pseudocod:a mod b = restul mpririi ntregi a lui a la ba div b = ctul mpririi ntregi a lui a la b

    Algoritmul scris n pseudocod

    read n;suma 0;while n 0

    suma suma + n mod 10;n n div 10;

    repeat;write suma;

    Programul scris n C++#include#includevoid main(){

    unsigned long n;unsigned int suma = 0; // declararea si initializarea variabilei suma

    clrscr(); // sterge ecranulcout > n;while(n>0){

    suma += n % 10; // se mai poate scrie si suma = suma + n % 10;n /= 10; // se mai poate scrie si n = n / 10;

    };cout

  • la consol un numr natural n i l afieaz rsturnat (citit de la sfrit lanceput).

    Algoritmul scris n pseudocod

    read n;n_invers 0;while n 0

    n_invers n_invers * 10 + n mod 10;n n div 10;

    repeat;write n_invers;

    Programul scris n C++#include#includevoid main(){

    unsigned long n, n_invers;clrscr();cout > n;n_invers=0;while(n>0){

    n_invers = n_invers*10 + n%10;n/=10;

    };cout

  • Exerciiul 7 (structura switch, inline if): S se scrie un program simplu carecitete de la consol un numr natural n i afieaz dac acesta este un numrprim sau nu.

    Algoritmul scris n pseudocod

    read n;prim 1;case n

    0:prim 0;

    1:prim 0;

    2:prim 1;

    else: for i = 2,nr

    if n mod i = 0 thenprim 0;exit for;

    endif;repeat;

    endcase;

    if prim = 1 thenwrite Numarul este prim;

    elsewrite Numarul nu este prim;

    endif;

    Programul scris n C++#include#include#includevoid main(){

    unsigned int n, prim=1;clrscr();coutn;switch(n){

    case 0:prim=0; // numarul nu este primbreak;

    case 1:prim=0; // numarul nu este primbreak;

    case 2:prim=1; // numarul este primbreak;

    default:for(int i=2;i

  • fie mai mare sau egal cu 2 i pstrnd doar secvena de pe ramura default ainstruciunii switch.

    Observaie: Afiarea rezultatului este fcut folosind o instruciune inline if ce arestructura:

    ( ? : )

    Dac este evaluat ca fiind adevrat, se folosete n continuare, iar dac este evaluat ca fiind fals, se folosete.

    Exerciiul 8: S se scrie un program simplu care afieaz primele n numereprime.

    Algoritmul scris n pseudocod

    read n;nr 2;while n > 0

    prim 1;for i=2,nr

    if nr mod i = 0prim 0;exit for;

    endif;repeat;

    if prim = 1 thenwrite nr;n n - 1;

    endif;nr nr + 1;

    repeat;

    Programul scris n C++#include#include#includevoid main(){

    unsigned int n, prim;unsigned long nr;clrscr();cout > n;nr=2; // incepem testarea de la 2 care este primwhile(n>0){

    prim=1; // presupunem ca numarul este primfor(unsigned long i=2;i

  • cout
  • Algoritmul scris n pseudocod

    repeatread n;

    until n 2 and n 50;

    for i=1,n

    read A(i);repeat;

    for i=1,nfor j=i+1,n

    if A(i) > A(j) then

    tmp A(i);

    A(i) A(j);

    A(j) tmp;endif;

    repeat;repeat;

    for i=1,n

    write A(i);repeat;

    Programul scris n C++#include#includevoid main(){

    int A[50], tmp;// preia de la consola elementeledo{

    clrscr();coutn;

    }while((n50));cout

  • numr natural. Afiai numerele naturale n baza 10 pentru fiecare linie n parteprecum i suma acestora.

    Algoritmul scris n pseudocod

    repeatread m;

    until m 2 and m 10;

    repeatread n;

    until n 2 and n 10;

    for i=1,mfor j=1,n

    repeat

    read A(i,j);

    until A(i,j) = 0 or A(i,j) = 1;repeat;

    repeat;

    suma 0;for i=1,m

    nr 0;for j=1,n

    nr nr * 2 + A(i,j);

    write A(i,j);repeat;write nr;suma suma + nr;

    repeat;write suma;

    Programul scris n C++#include#includevoid main(){

    // se face si initializarea variabilei sumaint A[10][10], m, n, i, j, nr, suma=0;clrscr();// citeste numarul de linii pana cand m este in intervalul 2-10do{

    coutm;

    } while ((m10));// citeste numarul de coloane pana cand n este in intervalul 2-10do{

    coutn;

    } while ((n10));// citeste elementele matricii Afor(i=0;i

  • // calcul numar echivalent linienr=nr*2+A[i][j];// afiseaza elementul matricii urmat de spatiu (tab)cout
  • write produs2;

    Programul scris n C++#include#includevoid main(){

    unsigned int A[10][10], n, i, j;unsigned int suma1=0, suma2=0;double produs1=1, produs2=1;// citeste dimensiunea matricei in intervalul 1-10do{

    coutn;

    } while((n10));/* citeste elementele matricei si face validarea ca acestea sa fie in intervalul 0-10 */for(i=0;i