lucrari de laborator ib c++

Upload: natalia-madan

Post on 04-Apr-2018

308 views

Category:

Documents


2 download

TRANSCRIPT

  • 7/30/2019 Lucrari de Laborator Ib C++

    1/79

    Ministerul Agriculturii i Industriei Alimentare

    Al Republicii Moldova

    Colegiul Agricol din aul

    Programarea n limbajul C

    Instruciunu metodice, probleme rezolvate, lucrri de laborator

    Grjdianu Natalia

    aul 2012-2013

    1

  • 7/30/2019 Lucrari de Laborator Ib C++

    2/79

    Cuprins

    Lucrare de laborator N1 ...................................................................................................................4Lucrare de laborator N2 ...................................................................................................................9Lucrare de laborator N3 .................................................................................................................15Lucrare de laborator N4 .................................................................................................................21Lucrare de laborator N 8 ................................................................................................................26Lucrare de laborator N6 .................................................................................................................34Lucrare de laborator N7 .................................................................................................................43Lucrare de laborator N8 .................................................................................................................50Lucrare de laborator N9 .................................................................................................................59Lucrare de laborator N10 ...............................................................................................................68

    Bibliografie...............................................................................................................................................................78

    lucr. Denumirea lucrrii ore1. Funcii de intrare/ieire, tipuri de baz.

    2. Operatori, operanzi, expresii i funcii matematice n limbajul C.3. Instruciuni ciclice.4. Pointeri i tablouri.

    2

  • 7/30/2019 Lucrari de Laborator Ib C++

    3/79

    5. Prelucrarea irurilor de caractere.6. Lucrul cu tablourile unidimensionale.7. Lucrul cu tablourile bidimensionale.8. Subprograme.9. Tipuri de date definite de utilizator, redenumirea tipurilor.

    10. Prelucrarea fiierelor.

    3

  • 7/30/2019 Lucrari de Laborator Ib C++

    4/79

    Lucrare de laborator N1

    Tema: Funcii de intrare/ieire, tipuri de baz.

    Scopul lucrrii: nsuirea funciilor de intrare/ieire, utilizarea lor la introducerea i

    extragerea datelor sub controlul unor formate i fr aceasta.

    Indicaii i sugestii de lucru:

    Funcia clrscr() terge ecranul. Are prototipul void clrscr(void) i se afl n fiierul.

    Funcia getch() citete fr ecou un caracter de la intrarea standard direct n memorie, fracionarea tastei Enter. La citirea unui caracter ASCII funcia returneaz codul caracterului citit.La citirea unui caracter ne ASCII funcia se apeleaz de dou ori: la primul apel ea returneazvaloarea 0, iar la cel de al doilea apel ea returneaz o valoare specific tastei acionate. Are

    prototipul int getch(void), n fiierul .

    Funcia getche() citete cu ecou un caracter de la intrarea standard direct n memorie, fracionarea tastei Enter. La citirea unui caracter ASCII funcia se apeleaz de dou ori: la primulapel ea returneaz valoarea 0, iar la cel de al doilea apel ea returneaz o valoare specific tasteiacionate. Are prototipul int getche(void), n fiierul .

    Funcia putch(e) scrie un caracter la ieirea standard. Ea are un singur parametru. Funciareturneaz codul imaginei extrase, adic valoarea lui e. De exemplu, putch(\n), trece cursorul

    pe linia urmtoare n aceeai coloan.Funcia getchar() citete cu ecou caractere ASCII de la intrarea standard ntr-un tampon

    special pn la acionarea tastei Enter. La acionarea tastei Enter, ea returneaz codul caracteruluicurent din tampon. La urmtorul apel funcia returneaz codul caracterului urmtor din tampon.Dac n tampon nu mai sunt caractere, atunci apelul funciei impune citirea unui nou set decaractere de la intrarea standard n tampon. Prototipul este: int putchar(int c), n fiierul.

    Funcia getc() citete din flux un caracter.Funcia gets() citete cu ecou un ir de caractere ASCII de la intrarea standard care se

    termin cu . Ea are un parametru valoarea cruia este adresa de nceput a zonei dememorie unde se pstreaz irul de caractere citit. De obicei acest parametru este numele unuitablou unidimensional de tip char. La apsarea tastei Enter funcia nu scrie caracterul newline(\n) n memorie, ci caracterul NUL (\0), care semnific sfritul irului. Deci, \n sesubstitute prin \0. Fiecare caracter ocup un octet n memorie. Rezult c un ir de n caractereocup n+1 octei.

    Funcia puts(s) scrie la ieirea standard un ir de caractere ASCII, care n memorie setermin cu caracterul NUL (\0), Ea are un parametru, valoarea cruia este adresa de nceput airului de extras. De obicei, acest parametru este numele unui tablou unidimensional de tip char.La ntlnirea caracterului NUL, funcia nu scrie acest caracter, ci trece cursorul la nceputul linieiurmtoare, adic se substituie caracterul \0 prin \n.

    Funcia returneaz adresa de nceput a zonei de memorie unde se pstreaz irul citit, adicadresa primului caracter. Dac ntlnete caracterul EOF, funcia returneaz valoarea 0. Are

    prototipul n fiierul .Funcia putchar(e) scrie un caracter ASCII la ieirea standard. Ea returneaz codul

    caracterului extras sau -1 n caz de eroare. Aici putchar(\n), ca i putchar(10), trece cursorulla nceputul liniei urmtoare.

    Funcia are prototipul int putchar(int e), n fiierul .Funcia printf(c, p1, p2, p3, ...) scrie la ieirea standard date sub controlul unor formate.Are unul sau mai muli parametri. De obicei, parametrul c este un ir de caractere scris n

    4

  • 7/30/2019 Lucrari de Laborator Ib C++

    5/79

    ghilimele, care conine textele eventuale de extras i specificatorii de format eventuali pentrudatele de extras. Textele din parametrul c sunt extrase fr schimbare. Secvenele escape, cum arfi \n, \t, \0 .a., nu sunt extrase ci sunt executate. Parametrii p1, p2, p3, ... sunt expresii,valorile crora vor fi extrase. La fiecare din aceti parametri, n irul de caractere c, i corespundeun specificator de format, care indic cum se va extrage valoarea respectiv. Un specificator deformat ncepe cu % i se termin cu una sau dou litere anumite. El determin conversia valorii

    de extras din formatul intern n formatul extern. Parametrii p1, p2, p3, pot lipsi. Atunci vor fiextrase numai textele din parametrul c.Funcia returneaz numrul de octei (caracter) extrai la ieirea standard sau -1 n caz de

    eroare. Ea are prototipul n fiierul .Funcia scanf(c, p1, p2, p3, ...) citete de la intrarea standard date sub controlul unor

    formate. Are mai muli parametri. De obicei, parametrul c este un ir de caractere scris nghilimele, care conine specificatori de format pentru datele de la intrare. El poate conine icaractere albe care sunt neglijate. Parametrii p1, p2, p3, ... sunt adresele zonelor de memorieunde se vor pstra datele citite. De obicei, adresa unei zone de memorie se exprim prinoperatorul & n faa numelui unei variabile simple sau cu indice. La fiecare dintre aceti

    parametri, n irul de caractere c, i corespunde un specificator de format, care indic cum se va

    citi data respectiv de la intrare. Un specificator de format ncepe cu % i se termin cu una saudou litere anumite. El determin conversia datei de citit din formatul extern n formatul intern.

    Se cunosc urmtorii specificatori: %d, %i - ntreg, %f- real, %lf- real lung, %ld - ntreglung, %u-ntreg fr semn, %c - citete caracterul curent, %s - citete irul, %e -real n formatexponenial, %p - pointer.

    Funcia citete toate datele ce corespund specificatorilor de format din parametrul c. Dac odat de la intrare nu corespunde specificatorului de format, atunci citirea se ntrerupe. Funciareturneaz numrul datelor citite corect. Ea are prototipul n fiierul .

    Funcia fflush(stdin) golete stream-ul intrrii standard (terge coninutul buferuluitastaturii). Ea are prototipul n fiierul .

    Funcia exit(c) ntrerupe execuia programului. Parametrul c definete starea programuluin momentul apelului funciei. De obicei, valoarea 0 a parametrului c definete o stare normalde terminare a execuiei programului, iar o valoare diferit de 0 semnific prezena unei erori. Sefolosete pentru a termina execuia unui program. Funcia are prototipul n fiierul .

    sizeof este un operator care determin dimensiunea n octei a unei date sau a unui tip dedate. De exemplu, sizeof(int) returneaz numrul de octei necesari pentru a pstra o valoare detipul int, iarsizeof d returneaz numrul de octei alocai datei cu numele d.

    Tipuri de dateTipuri de date

    statice

    dinamice

    simple

    structurate

    caracter

    reale

    ntregi

    enumerativ

    logic

    mulime

    ir

    articol

    masiv

    fiier

    5

  • 7/30/2019 Lucrari de Laborator Ib C++

    6/79

    Tipuri simple de dateTipuri simple de date

    3.4*10 -4932 .. 3.4*10 493210long double

    1.7*10 -308 .. 1.7*10 3088double

    3.4*10 -38 ..3.4*10 384float

    Real

    -231 ..2 31-14long [ int ]

    0..2 32-14unsigned long

    -32768..327672[short] [ int ]0..655352unsigned [ int ]

    0..255 (0..2 8-1)1unsigned char

    -128..127 ( -27..2 7-1)1[signed] char

    ntreg

    DomeniuDomeniu dede valorivaloriLungimeLungime

    ((octeocte ii ))

    TipulTipulGrupaGrupa

    dede datdat

    Exemple de programe:

    Exemplul 1.1. Programul citete o liter minuscul i extrage caracterul precedent acesteilitere din setul de caractere alcalculatorului.#include#includevoid main(void){char c;clrscr();c=getchar();putchar(c-1);getch();

    }

    Exemplul 1.2. Programul citete un ir de caractere i extrage lungimea irului citit.#include#include#includevoid main(void){char s[256];clrscr();

    gets(s);printf(irul are %d caractere,strlen(s));getch();

    }

    Exemplul 1.3. Programul definete icitete 4 numere de la tastatur de tip int, float, longdouble, char i le afieaz la ecran.#include#includevoid main(void){char c=a;int k=3;float f=5.9;

    double d=9.999;clrscr();printf(%c\t%d\t%f\t%lf,c,k,f,d);getch();

    6

  • 7/30/2019 Lucrari de Laborator Ib C++

    7/79

    }

    Exemplul 1.4. Programul afieaz ntre dou caractere * constanta 123.456f (definit prindirectiva #define) cu diferii specificatori de format pentru date de tip float.#include#include#define a 123.456fvoid main(void)

    {clrscr();printf(*%f*\n,a);printf(*%2f*\n,a);printf(*%20f*\n,a);printf(*%-20f*\n,a);printf(*%020f*\n,a);printf(*%.2f*\n,a);printf(*%.10f*\n,a);printf(*%2.2f*\n,a);printf(*%2.10f*\n,a);printf(*%20.10f*\n,a);printf(*%-20.10f*\n,a);

    printf(*%020.10f*\n,a);getch();}

    Exemplul 1.5. Programul citete cu getch() caractere ne ASCII i apoi extrage codulfiecruia cu printf().#include#includevoid main(void){char a;clrscr();getch(); // primul apelprintf("al doilea apel:%d\n",getch());

    getch(); // primul apela=getch(); // al doilea apelprintf("al doilea apel:%d\n",a);getch(); // primul apelprintf("al doilea apel:%d\n",a=getch());getch();

    }

    Exemplul 1.6. Este dat numrul ntreg a. Folosind numai operaia de nmulire s secalculeze a8prin trei operaii.#include#includevoid main(void){int a,k,l,f;clrscr();printf("introducei valoarea lui a);scanf(%d,&a);k=a*a; //a2

    l=k*k; //a4

    f=l*l; //a8

    printf("rezultat=%d",f);getch();

    }

    Probleme propuse spre rezolvare:

    1. Programul citete dou numere ntregi i afieaz media lor aritmetic.

    7

  • 7/30/2019 Lucrari de Laborator Ib C++

    8/79

    2. Programul afieaz ntre dou caractere * constanta 123.456 (definit prin directiva #define)cu urmtorii specificatori de format: %d, %2d, %10d, %-10d, %010d, %ld, %u, %lu.3. Programul afieaz n zecimal, octal i hexazecimal constanta 123456789 definit prindirectiva #define.4. Programul citete un caracter ne ASCII (cu getchar()) i apoi afieaz (cu printf()) codulcaracterului citit i caracterul.

    5. Programul citete (cu scanf()) un numr ntreg zecimal format din cel mult nou cifre i apoiafieaz (cu printf()) numrul citit n zecimal, octal i hexazecimal.6. Sunt date trei numere de tipul: int, float, double. Calculai suma lor, produsul i diferena lori afiai rezultatele la ecran.7. Programul citete (cu scanf()) o dat calendaristic sub forma ddmmyy (o succesiune de 6cifre) i apoi o afieaz (cu printf()) sub forma 20yy/mm/dd. Aici dd, mm i yy sunt numeredin dou cifre care reprezint respectiv ziua, luna i anul.8. Programul citete (cu scanf()) numele i prenumele unei persoane separate prin spaii albe,apoi afieaz (cu printf()) numele pe un rnd i prenumele pe alt rnd.

    9. Sunt date numere ntregi x i y. S se obin:xy

    yx

    +

    1.

    10. Dat a ntreg. Folosind doar operaia de nmulire s se calculeze a2, a5, a17prin ase operaii.11. Dat a ntreg. Folosind doar operaia de nmulire s se calculeze a4, a12, a28prin ase operaii.12. S - au amestecat v1 litri de ap de temperatura t1 cu v2 litri de ap de temperatura t2. S secalculeze volumul i temperatura compoziiei obinute.13. Sunt date x i y numere ntregi. S se gseasc media aritmetic i media geometric amodulului lor.14. Este dat x ntreg. Folosind numai operaia de nmulire, adunare i scdere, s se calculezeexpresia: 2x4-3x3+4x2-5x+6.

    Se permit nu mai mult de 4 operaii de nmulire, 4 operaii de adunare i scdere.15. Sunt date lungimile catetelor triunghiului drept. S se gseasc ipotenuza i aria lui.

    16. Sunt date numerele ntregi x i y. Folosind numai operaiile de nmulire, adunare i scdere,s se calculeze: 3x2y2-2xy2-7x2y-4y2+15xy+2x2-3x+10y+6.Se permite folosirea nu mai mult de opt operaii de nmulire, de adunare i scdere.

    17. Programul citete (cu scanf()) o majuscul i apoi afieaz (cu printf()) minusculelecorespunztoare.18. Folosind operatorul sizeofafiai ct memorie se rezerv pentru fiecare tip de date (char,signed char, unsigned char, short, signed short, unsigned short, int, signed int, unsigned int, longint, long signed int, long unsiged int, float, double, long double).

    ntrebri de control:

    1. Cum se lanseaz un program la execuie n Turbo C++ ?2. n care fiiere se afl prototipurile funciilor standard ?3. Cum se afieaz Help-ul pentru o funcie standard, de exemplu clrscr() ?4. Care sunt deosebirile dintre funciile getche() i getchar() ?5. Ce valori returneaz funciile de intrare ?6. Ce valori returneaz funciile de ieire ?7. Cum i pentru ce se utilizeaz funcia exit() ?8. Care sunt funciile de citire cu ecou ?9. Care funcii de intrare cer acionarea tastei Enter ?10. char a;

    unsigned char b;a=200; b=200;

    printf(ntreg %d\t caracter %c,a, a);printf(\n ntreg %d\t caracter %c,b, b);

    Ce se va extrage la ecran? Explicai.

    8

  • 7/30/2019 Lucrari de Laborator Ib C++

    9/79

    Lucrare de laborator N2

    Tema: Operatori, operanzi, expresii i funcii matematice n limbajul C.

    Scopul lucrrii: .Utilizarea corect a operatorilor, alctuirea corect a expresiilor curespectarea regulilor de conversie implicit i conversia forat a datelor.

    Suport teoretic:

    O expresie este o secven de caractere care specific o regul pentru calculul unei valori.Aceast valoare poate fi: numeric, alfanumeric, boolean sau de tip structurat. Trebuie s vmrturisim c acum a sosit momentul s definim acest termen mult mai precis.

    O expresie poate fi foarte simpl. Cifra 7 singura (o constant) i litera M (o variabila) suntexpresii valide. Dar, o expresie poate fi de asemenea foarte complicat.

    Observai membrul drept al enunului de mai jos:m:=7*a+b*(j+sqrt(x))

    unde: 7, a,j si x sunt toate expresii; 7*a este o expresie; Funcia sqrt(x) este o expresie; j+sqrt(x), cu sau fr paranteze exterioare, este o expresie; Tot membrul drept este o expresie.

    O expresie are sens, n timpul compilrii, dac toate elementele componente au fost nprealabil declarate i au fost respectate regulile de sintax a limbajului. O expresie se calculeazn timpul execuiei dac, dup momentul cnd s-a ajuns la codul obiect, tuturor identificatorilor lis-au atribuit valori (specifice) care permit s fie evaluai.

    Fiecare din cei trei operatori (+,-, | |) care pot fi folosii pentru conectarea termenilor unor

    expresii simple se numesc operatori de adugare (adding operators).Fiecare din cei patru operatori (*, /, % i &&) care pot fi folosii pentru conectareafactorilor se numesc operatori de multiplicare (multiplying operator).

    Pentru micarea biilor spre stnga i spre dreapta, se folosesc operaiile >.Deoarece biii sunt mutai ctre un capt, la cellalt capt se adaug zerouri. (n cazul unui ntregnegativ cu semn o deplasare la dreapta va determina introducerea unui 1, astfel nct bitul desemn se va pstra.) Biii deplasai dincolo de capt nu se ntorc la captul cellalt, ci sunt

    pierdui.Operaiile de deplasare a biilor pot fi foarte utile atunci cnd decodificai intrarea de la un

    dispozitiv extern. O deplasare la dreapta mparte efectiv un numr cu 2, iar o deplasare la stngal nmulete cu 2.

    Funciile matematice: pow(x,y), poly(x, n, c[]), sin(x), sqrt(x), cos(x), exp(x), log(x),log10(x), asin(x), acos(x), atan(x) au prototipul n fiierul . Toate funciiletrigonometrice presupun argumentul exprimat n radiani. Pentru a transforma gradele n radianise nmulesc gradele cu 180/ , unde constanta 14.3= .

    Tabela 2.1: Funcii matematice din fiierul math.h

    Prototipul funciei Efect

    double acos(double x); arccosinus de x

    double asin(double x); arcsinus de x

    double atan(double x); arctangenta de x

    double atan2(double y, double x); arctangenta de y/x

    double ceil(double x); cel mai mic intreg mai mare sau egal cu x

    9

  • 7/30/2019 Lucrari de Laborator Ib C++

    10/79

    double cos(double x); cosinus de x

    double exp(double x); exponeniala

    double fabs(double x); valoarea absoluta a lui x

    double floor(double x); cel mai mare intreg mai mic sau egal cu x

    double log(double x); ln de xdouble log10(double x); lg de x

    double pow(double x, double y); x la puterea y

    double sin(double x);calculeaz valoarea funciei sinus de unghiul x

    exprimat n radiani.

    double sqrt(double x); radicalul lui x

    double tan(double x); tangenta lui x

    double poly(x, n, c[])calculeaz valoarea polinomuluip=cnxn+cn-1xn-1+...+c2x2+c1x+c0

    Media geometric a numerelor a1, a2,...,an este (a1*a2*...*an)(1/n).

    Tabela 2.2: Operatori i descrierea lor.

    Operatorul Descrierea

    < mai mic

    mai mare

    >= mai mare i egal

    != diferit

    == egal

    && a&&b are valoarea 1, atunci i numai atunci, cnd i a i b au valori diferite de 0.

    !negarea logic, !a are valoarea 0 (false), dac a are valoarea diferit de 0 i 1 (true), dac a are

    valoarea 0.

    | | sau

    ~ complement fa de 1

    > deplasare la dreapta

    ^ sau logic pe bii

    += suma cu atribuire

    ++ increment

    -- decrementul

    / mprire

    %= restul mpririi egal

    ?: condiie

    Tabela 2.3: Codurile ASCII.

    10

  • 7/30/2019 Lucrari de Laborator Ib C++

    11/79

    0 Ctrl | 25 Ctrl Y 50 2 75 K 105 I

    1 Ctrl A 26 Ctrl Z 51 3 76 L 106 J

    2 Ctrl B 27 ESCAPE 52 4 77 M 107 K

    3 Ctrl C 28 Ctrl < 53 5 78 N 108 L

    4 Ctrl D 29 Ctrl / 54 6 79 O 109 M

    5 Ctrl E 30 Ctrl = 55 7 80 P 110 n

    6 Ctrl F 31 Ctrl - 56 8 81 Q 111 o

    7 Ctrl G 32 BLANK 57 9 82 R 112 p

    8 Ctrl H 33 ! 58 : 83 S 113 q

    9 Ctrl I 34 " 59 ; 84 T 114 r

    10 \n 35 # 60 < 85 U 115 s

    11 Ctrl K 36 $ 61 = 86 V 116 t

    12 Ctrl L 37 % 62 > 87 W 117 u13 Return 38 & 63 ? 88 X 118 v

    14 Ctrl N 39 ' 64 @ 89 Y 119 w

    15 Ctrl O 40 ( 65 A 90 Z 120 x

    16 Ctrl P 41 ) 66 B 92 \ 121 y

    17 Ctrl Q 42 * 67 C 97 a 122 z

    18 Ctrl R 43 + 68 D 98 b 123 {

    19 Ctrl S 44 , 69 E 99 c 124 |

    20 Ctrl T 45 - 70 F 100 d 125 }21 Ctrl U 46 . 71 G 101 e 126 ~

    22 Ctrl V 47 / 72 H 102 f

    23 Ctrl W 48 0 73 I 103 g

    24 Ctrl X 49 1 74 J 104 h

    Exemple de programe:

    Exemplul 2.1. Sunt date 2 variabile de tip real. S se efectueze operaiile suma, produs imprire.#include#includevoid main(){float k,l;clrscr();printf("dati k si l:");scanf("%f%f",&k,&l);printf("suma=%.2f",k+l);printf("\nimpartirea=%.2f",k/l);printf("\nprodus=%.2f",k*l);getch();

    }

    Exemplul 2.2. Este dat un numr ntreg. Programul verific dac numrul introdus estepozitiv, negativ sau zero.#include

    11

  • 7/30/2019 Lucrari de Laborator Ib C++

    12/79

    void main(){int nr;printf("Numar=");scanf("%d",&nr);(nr0)?printf("pozitiv\n") : printf("zero\n"));

    }

    Exemplul 2.3. Programul citete dou numere ntregi i testeaz operatorii >> i y?x:y#define min(x,y) x

  • 7/30/2019 Lucrari de Laborator Ib C++

    13/79

  • 7/30/2019 Lucrari de Laborator Ib C++

    14/79

    h. 63/133

    13 23 2

    ))2(2

    )42)(2((

    ++= x

    xy

    yxyxyya ,

    xy

    xxyy

    yx

    yx

    yx

    yx

    yx

    yx

    yx

    yx

    b2

    +

    ++

    +

    +

    +

    = ;

    ntrebri de control:

    1. Ce este o expresie, un operand, un operator. Ce operatori cunoatei?2. Explicai cum se utilizeaz operatorul adres & ?3. Explicai cum se utilizeaz operatorul condiionat ? :.4. Ce specificatori de format se folosesc pentru a citi i a scrie date numerice flotante detipul long double?5. Fie intx=2, y; y=--x; x=y--; Care este valoarea lui x?6. Fie intx=2, y; y=x++; x=++y; Care este valoarea lui x?7. Fie char c; c=R+m-M; Care este tipul valorii lui c i ce va afia printf(%d,c)?8. Explicai cum lucreaz funciile abs(), log10(), pow(x, z) i dai exemple?9. Care sunt specificatorii pentru tipurile: int, float, char, double i care este diapazonulacestor tipuri?10.Fie intx=1, y=2, n=3, m=4; n=x/y; m=x%y; Care sunt valorile lui n i m?

    14

  • 7/30/2019 Lucrari de Laborator Ib C++

    15/79

    Lucrare de laborator N3

    Tema: Instruciuni ciclice.

    Scopul lucrrii: nsuirea instruciunilor limbajului.

    Suport teoretic:

    Instruciunea compus este un bloc de instruciuni cu formatul:{declaraii;instruciuni;}. La nceputul blocului prin declaraii se pot defini i iniializa date de diferitetipuri. Prin instruciuni se realizeaz prelucrarea datelor.

    Instruciunea if este o instruciune de ramificare. Ea are dou formate: incomplet icomplet. Formatul incomplete este: if (expresie) instruciune1.

    La ntlnirea acestei instruciuni se evalueaz expresia din paranteze. Dac expresia arevaloarea adevr, adic o valoare diferit de 0, atunci se execut instruciune1 i apoi se trece lainstruciunea imediat urmtoare dup instruciunea if. n caz contrar, se trece imediat la

    instruciunea urmtoare.Deci forma general a instruciunii if este: if (expresie) instruciune1; else

    instruciune2; Se evalueaz expresia din parantez i n caz de adevr se execut instruciune1,altfel se execut instruciune2. Dup aceasta se trece la instruciunea urmtoare dup if.Instruciunile instruciune1 i instruciune2 pot fi simple i compuse.

    Instruciunile ifpot fi incluse una n alta.Instruciunea for este o instruciune de ciclu condiionat i are formatul: for(i1; i2; i3)

    instruciune; Aici i1, i2, i3 sunt expresii: i1 este expresia de iniializare a ciclului, i2 esteexpresia care determin condiia de repetare a ciclului, i3 este expresia de reiniializare a ciclului;instruciune este corpul ciclului i poate fi o instruciune simpl sau compus. Corpul cicluluisunt acele instruciuni de prelucrare a datelor care trebuie repetate. i corpul ciclului poate lipsi.n acest caz ciclul const numai din antet i instruciunea vid: for(i1; i2; i3);

    Instruciunea for se execut n felul urmtor: se efectueaz operaiile de iniializare aleciclului i1, apoi se evalueaz expresia i2. Dac i2 are o valoare diferit de 0, adic valoareaadevr, atunci se execut instruciune corpul ciclului. n caz contrar, cnd i2 are valoarea 0,adic valoarea fals, se termin execuia ciclului for i se trece la instruciunea urmtoare dupciclu. Dup execuia corpului, ciclul se reiniializeaz se execut operaiile definite de i3 i serevine iari la verificarea condiiei de repetare a ciclului i2.

    Instruciunea while este o instruciune de ciclul condiionat i are formatul: while(i1)instruciune; antetul ciclului este while(i1) i conine n paranteze expresia i1 care este condiiade repetare a ciclului. Corpul ciclului este instruciune i poate fi o instruciune simpl sau

    compus. Ea conine acele operaii care trebuie repetate n ciclu. Corpul ciclului poate lipsi. Seevalueaz i1 i corpul ciclului se execut de attea ori de cte ori i1 are valoarea adevr.Instruciunea do-while se execut astfel: mai nti se execut instruciune, adic corpul

    ciclului, apoi se evalueaz i1, care este condiia de repetare a ciclului. Dac i1 este adevr, atuncise repet execuia corpului ciclului. n caz contrar, adic dac i1 este 0, atunci se terminexecuia ciclului i se trece la instruciunea urmtoare dup ciclu.

    Instruciunea continue se folosete n corpul unui ciclu i are formatul: continue;Instruciunea dat abandoneaz iteraia curent a ciclului i trece la iteraia urmtoare a lui.

    Instruciunea breakse folosete numai n corpul unui ciclu sau n instruciunea switch.La ntlnirea instruciunii break n corpul unui ciclu se termin execuia ciclului i se trece lainstruciunea urmtoare dup ciclu. La folosirea instruciunii break n instruciunea switch se

    iese din instruciunea switch i se trece la instruciunea urmtoare dup switch.Instruciunea switch este o instruciune care realizeaz o alternativ din mai multealternative posibile i are formatul:

    15

  • 7/30/2019 Lucrari de Laborator Ib C++

    16/79

    switch (expresie) {case valoare1: instructiune1; break;

    case valoare2: instructiune2; break;

    case valoaren: instructiunen; break;default: instructiune; }

    In limba engleza, switch nseamn comutator. Conform acestei forme generale, dup

    cuvntul cheie switch, exist o expresie de tip intsau compatibil cu aceasta (deci poate fii de tip char, byte sau short, dar nu de tip long), a crei valoare servete dreptcomutator. Se deschide apoi acolada corpului instruciunii, n care exist mai multe cazuri.Fiecare caz ncepe prin cuvntul cheie case, urmat de o valoare de tip ntreg, dup care aparuna sau mai multe instruciuni (simple sau compuse) i opional intruciuneabreak. Dup ce s-au epuizat toate cazurile, opional se poate scrie cuvntul cheie defaulturmat de una sau maimulte instruciuni i se nchide acolada corpului instruciuniiswitch.

    Executarea instruciunii switchdecurge astfel: se evalueaz mai nti expresie i seobine o valoare, care servete drept comutator. Aceast valoare se compar, de sus n jos, cufiecare din valorile indicate dup cuvintele cheie case, pn cnd se gsete prima valoarecare coincide cu cea a comutatorului. Dac s-a gsit o astfel de valoare, se execut toateinstruciunile care ncep cu cazul respectiv i se ncheie la prima instruciunebreak ntlnitsau, n lipsa acesteia, pn la acolad de nchidere a corpului instruciunii switch. dac nsnici unul din cazuri nu conine valoarea potrivit a comutatorului, atunci se execut instruciunilecare urmeaz dup cuvntul cheie defaultsau, n lipsa acestuia, nu se execut nimic.

    Instruciunele case i default se folosesc numai n instruciunea switch.Instruciunea goto este o instruciune de salt necondiionat. Ea are formatul goto nume,

    unde nume este numele unei etichete. Eticheta este un identificator (un nume) care se scrie nfaa unei instruciuni cu simbolul : dup el. De exemplu lab1: i++;Aici numele lab1 este oetichet. La ntlnirea instruciunii goto lab1; se trece imediat la execuia instruciunii cu etichetalab1 n fa, adic la instruciunea i++.

    Instruciunea return se folosete pentru a reveni dintr-o funcie. Ea are formatul return;sau return expresie; n primul caz, funcia din care se revine nu returneaz nici o valoare. Aldoilea caz se folosete cnd funcia returneaz o valoare i anume valoarea expresie definetevaloarea de returnat. Tipul valorii pentru expresie trebuie s coincid cu tipul indicat n antetulfunciei respective pentru valoarea returnat. Instruciunea return poate fi scris n orice punct alcorpului unei funcii, ns nu este obligatorie. n corpul aceleai funcii pot fi scrise mai multeinstruciuni return.

    Exemple de programe:

    Exemplul 3.1. Este dat n ntreg. S se afle prima cifra a lui n (n=123, prima cifr este 1).#include#includevoid main(){int n,c;clrscr();printf("n=");scanf("%d",&n);//ct n este mai mare ca 9 se face mprirea lui n la 10, pn seajunge la prima cifrwhile(n>9) n=n/10;printf("prima cifra este=%d",n);getch();

    }Exemplul 3.2.Este dat n ntreg. S se numere din cte cifre este compus n (n=345, c=3).#include#include

    16

  • 7/30/2019 Lucrari de Laborator Ib C++

    17/79

    void main(){int n,c; //c este un contor, iniial are valoarea zeroc=0;clrscr();printf("n=");scanf("%d",&n);//att ct n este mai mare ca zero, n se mparte la zece i c cretewhile(n>0){n=n/10;c=c+1; }printf("c=%d",c);getch();

    }

    Exemplul 3.3. Date a, b dou numere ntregi. S se afle cel mai mic multiplu comun al lor.#include#includevoid main(){int i,min,a,b,div;

    float mult;clrscr();printf("a, b");scanf("%d%d",&a,&b);if(a

  • 7/30/2019 Lucrari de Laborator Ib C++

    18/79

    for(i=2; i!/ .

    #include#include#includevoid main(){

    int i,n,f,s1,s2,x,y,n1;float s=0,s3,e;char c;clrscr();s1=s2=0; s=0; x=y=1; f=1;printf("n=");scanf("%d",&n);do{

    printf("\n1:se verifica daca este perfect");printf("\n2:sa se calculeze expresia din punctual b");printf("\n3:sa se calculeze suma din punctual c");printf("\n4:esirea\n");c=getch(); //ateapta alegerea unei operaii

    switch(c){ //c primete una din valorile (1- 4)case '1':for(i=1; i

  • 7/30/2019 Lucrari de Laborator Ib C++

    19/79

    int i,j;int prim=0; //for(i=2; i

  • 7/30/2019 Lucrari de Laborator Ib C++

    20/79

    10. Sa se scrie un program care s calculeze cel de-al n-lea numr al irului lui Fibonacci(Astfel, fiecare numr Fibonacci este suma celor dou numere Fibonacci anterioare,rezultnd secvena 0, 1, 1, 2, 3, 5, 8, 13,...).

    11. Sunt date a, b numere ntregi. S se determine toate numerele prime din intervalul [a,b].12. Pentru un numrn dat s se determine dac n este numr polindrom (numr polindrom

    6789876).

    13. Programul citete un numr pozitiv s cu cel mult dou cifre dup virgul care exprim osum de bani n lei, determin i afieaz numrul minim de bancnote de 500, 200, 100, 50,20, 10, 5,1 lei i monede de 50, 25, 10, 5, 1 bani necesare pentru a exprima suma s.Folosii instruciunea do-while.

    14. Sunt date a, b numere ntregi. S se afieze toate numerele perfecte din intervalul [a,b].15. Pentru n ntreg dat s se gseasc toate perechile gemene mai mici ca n. Pereche gemene

    sunt numerele prime cu diferena 2(5 i 7, 11 i 13, 29 i 31 etc.).16. Pentru n ntreg dat. S se gseasc perechea maxim de numere gemene mai mici ca n.17. Scriei un program care determin numrul de zerouri n n! (n

  • 7/30/2019 Lucrari de Laborator Ib C++

    21/79

    Lucrare de laborator N4

    Tema: Pointeri i tablouri.

    Scopul lucrrii: obinerea deprinderilor practice la utilizarea pointerilor, nsuiriaritmeticii pointerilor n limbajul C i a legturii dintre pointeri i tablouri.

    Suport teoretic:

    Un pointer este o variabil valorile creia sunt adrese de memorie. Pe adresele-valori aleunui pointer se pot pstra date de un anumit tip. Acest tip se indic n declaraia variabilei de tip

    pointer i se numete tipul de baz al pointerului sau tipul spre care pointeaz pointerul.

    Declaraia de pointer are formatul: tip*id1, *id2,_, *idn, unde tip este un tip de date carearat ce tip de date se vor pstra pe adresele-valori ale variabilelor id1, id2,_,idn.De exemplu:int *pi, i; Aici i este o variabil simpl de tip int, iarpi este un pointer ce indic spre tipul int,adic n pi se vor pstra adrese ale datelor de tip int. La fel char *c; c este pointer la un obiect detipul char. Se pot declara i tablouri de pointeri: char *s[80].

    Alocarea memoriei pentru pointeri. Unui pointer i se aloc, de obicei, un cuvnt alcalculatorului, adic 2 octei. ns modificatorii near, far, huge pentru tipul pointer modificmodul de alocare a pointerilor n memorie. Modificatorii far i huge aloc 2 cuvinte, adic 4octei de memorie pentru pointeri, iar near sau lipsa oricrui modificator semnific alocarea

    pointerului pe un cuvnt, adic pe 2 octei de memorie.

    Operatori specifici pentru pointeri: * - se utilizeaz pentru accesul la coninutulvariabilei adresate; & - se utilizeaz pentru aflarea adresei variabilei. Pentru tiprirea adreselor

    se folosete specificatorul de format %p. Pentru a atribui pointerului pi adresa variabilei i scriempi=&i. Dac pi este un pointer, atunci *pi este data stocat pe adresa-valoare a lui pi. Deexemplu, fie i=10 i pi=&i. Atunci pi are ca valoare adresa lui i, iar*pi este chiar valoarea 10 alui i. La declaraie pointerii se pot iniializa: float w, *y=&w; sau char *pc=Informatica;Aici pc este un pointer de tipul char * i lui i se atribuie ca valoare adresa de nceput a irului decaractere Informatica, adic adresa primului caracter din ir.

    Se pot declara pointeride tipul void *, adic pointeri la care nu se indic tipul de baz. nacest caz nu se tie n prealabil tipul datelor ce se vor pstra pe adresele-valori ale pointerului.De exemplu: int x=10, *pi; void *pv; Atribuirea pi=&x i pv=pi sunt corecte. Atribuirea pi=pvnu este corect. La atribuirea sau citirea datelor de pe adresele-valori ale unui pointer de tip void

    * trebuie explicit indicat tipul datelor respective, adic pi=(int*)pv.

    Operaii aritmetice cu pointeri: valorile a doi pointeri pot fi comparate folosindoperatori relaionali. Operaia este folosit, de obicei, pentru pointerii care pointeaz spreelementele aceluiai tablou. Comparaia unui pointer cu NULL constant special definit n, are rolul de a verifica dac s-a fcut alocarea unei zone pointerului respectiv. Estedefinit adunarea (scderea) unui scalar la un (dintr-un) pointer rezultatul fiind tot un

    pointer i diferena dintre doi pointeri, operaiile avnd sens doar dac pointerul pstreazadresa unui element dintr-un tablou. Fie p i q doi pointeri la elemente ale aceluiai tablou.Expresia p+i indic elementul situat n vector cu ipoziii la dreapta fa de p, iar expresia p-qare ca valoare numrul de elemente cuprinse ntre cele dou adrese. Operaia de incrementare

    (++) i decrementare(--) pentru pointeri mrete (micoreaz) adresa-valoare a pointerului cunumrul de octei necesari pentru a pstra o valoare de tipul spre care pointeaz pointerul. Deexemplu, dac avem declarat int *p; atunci ++p, ca i p++, mrete valoarea lui p cu 2 octei,

    21

  • 7/30/2019 Lucrari de Laborator Ib C++

    22/79

    deoarece o valoare de tipul int este alocat pe 2 octei. Analogic, dac avem declarat double *w;atunci w++, ca i ++w, mrete valoarea lui w cu 8, deoarece tipul double cere 8 octei.

    Legtura dintre pointeri i tablouri. Fie tab[n] un tablou unidimensional cu n elemente.Atunci numele tab este un pointer care are ca valoare adresa primului element al tabloului, adicare valoarea &tab[0]. Deci tab+1 este adresa elementului cu indicele 1, adic &tab[1], tab+2

    este adresa elementului cu indicele 2, adic &tab[2] .a.m.d. Respectiv *(tab+0), adic *tab esteelementul tab[0], *(tab+1) este elementul tab[1], *(tab+2) este elementul tab[2] .a.m.d.Fie acum tab[m][n] un tablou bidimensional cu m linii i n coloane. Atunci tab[0] este un

    pointer care are ca valoare adresa de nceput a liniei 0 a tabloului tab[m][n], adic &tab[0][0],tab[1] este un pointer care are ca valoare adresa de nceput a liniei 1 a tabloului tab[m][n], adic&tab[1][0] .a.m.d. Deci tab[0], tab[1],..., tab[m] este un tablou de pointeri. La rndul su,numele tab al tabloului tab[m][n] este un pointer ce pointeaz spre irul de pointeri tab[0],tab[1], tab[2],..., adic pointerul tab are ca valoare adresa pointerului tab[0]. Din toate acestearezult c expresiile &tab[i][j], tab[i]+j, *tab+i*n+j sunt echivalente. La fel expresiile tab[i][j],*(tab[i]+j), *(*tab+i*n+j) sunt echivalente. Deci **tab este nu altceva dect elementul tab[0][0].

    Exemple de programe:

    Exemplul 4.1. Programul determin elementul maxim dintr-un ir numeric; suntdemonstrate diferite moduri de adresare la elementele unui tablou unidimensional.#include#includevoid main(){

    int x[]={10,20,30,40,50}, *px,i,r,t;clrscr();px=x;

    r=*px;for (i=0;i

  • 7/30/2019 Lucrari de Laborator Ib C++

    23/79

    {unsigned a[]={10,7,9,40,5,7}, i=0,s=0,d,h;clrscr();puts(irul iniial este:);while ( i

  • 7/30/2019 Lucrari de Laborator Ib C++

    24/79

    { s+=x[i]%10; x[i]=x[i]/10; }*(y+i)=s;

    }puts(irul numeric format:);i=0;while (i

  • 7/30/2019 Lucrari de Laborator Ib C++

    25/79

    if ( max

  • 7/30/2019 Lucrari de Laborator Ib C++

    26/79

    14. Fie int s[20]= {0,1,2,3,4,5}, *pi=s ; Ce va afiaprintf(%d %d %d %d %d%d, *pi, *++pi, *++pi, *++pi, *++pi, *++pi) ; ?

    Lucrare de laborator N 8

    Tema: Prelucrarea irurilor de caractere.

    Scopul lucrrii: Utilizarea funciilor standarde de prelucrare a irurilor de caractere ioperaii cu iruri.

    Suport teoretic:

    Cele mai des ntlnite utilizri ale tablourilor unidimensionale n limbajul C sunt irurile decaractere, deoarece n C nu este prevzut tipul de date ir de caractere. Pentru memorareairurilor se utilizeaz tablouri cu tipul de baz char, care au pe ultima poziie caracterul \0.

    Pe lng necesitatea de a defini un ir de caractere ca i tablou de caractere, n prelucrareairurilor se utilizeaz deseori tipul pointer la caracter.De exemplu:

    char sir[20]; // tablou de 20 de caracterechar *psir; // pointer la caractere.

    Astfel, sir este o variabila de tipul tablou de caractere pentru care se rezerv un spaiu dememorie de 20 de octei, n timp ce psir este un pointer la caracter care poate primi ca valoareadresa unui caracter (n particular, adresa primului element dintr-un ir de caractere). Trebuiereinut c ori de cte ori se lucreaz cu variabile iruri de caractere ntr-un program, trebuie sexiste fie o definiie de forma celei prezentate pentru variabila sir, prin care se rezerv static (n

    timpul compilrii), spaiul de memorie necesar variabilei, fie s se aloce dinamic memorianecesar.

    Funciile pentru prelucrarea irurilor sunt declarate n fiierul antet string.h.Ele primescadresele irurilor prelucrate, prin intermediul parametrilor de tipul pointer la caracter.

    Denumirea funciilor de prelucrare a irurilor declarate n fiierul stdio.h

    funcia explicaiechar * gets(char* s) Citete caracterele din intrarea standard pn la ntlnirea

    caracterului Enter, care nu se adaug la irul s; plaseaz '\0' lasfritul lui s; returneaz adresa primului caracter din ir.

    int puts(char* s) Tiprete irul s, trece apoi la rnd nou.printf("%s",s1) Tiprete irul s1.Denumirea funciilor de prelucrare a irurilor declarate n fiierul string.h

    funcia explicaieint strncmp(char* s1, char* s2, int n) Compar irurile s1 i s2 spre care pointeaz pointerii s1,

    s2. Funcia returneaz 1 dac s1>s2, valoarea -1 dacs1

  • 7/30/2019 Lucrari de Laborator Ib C++

    27/79

    ambele iruri.char *strncpy(char* s1, char* s2, intn)

    Copie maxim n caractere de la irul surs s2 n iruldestinaie s1 i returneaz adresa irului destinaie.

    char *strtok(char *s1, const char *s2); Desparte irul s1 de irul s2.int strlen(char* s1) Returneaz lungimea irului fr a numra caracterul de

    sfrit \0.

    strlwr(char* s1) Convertete irul din litere mari (A la Z) n litere mici (ala z).

    strset(char* s1, char* s2) Caut prima intrare a irului s2 n irul s1.strrev(char* s) Inverseaz irul.strrchr(char* s, int c) Verific ultima intrare a simbolului c n irul s.

    Returneaz pointerul spre ultimul simbol ce coincide cu ca irului s. Dac nu-l gsete returneaz NULL.

    char*strpbrk(const char*s, constchar*s1)

    Cut n irul s orice simbol din irul s1 i afieaz peacel care mai naite se ntlnete n irul s.

    strrupr(s) Convertete irul din litere mici n litere mari .isalpha(s) Verific dac s este liter.isdigit(c) Verific dac c cifr.islower(s) Verific dac s este liter de la a la z.isspace(c) Verific dac c este spaiu.zint atoi(const char* s) Convertete irul s ntr-o valoare ntreag.int atol(const char* s) Convertete irul s ntr-o valoare ntreag lung.itoa(int n, char* s, int ) Convertete un ntreg n char.Double atof(char* s) Convertete sirul s ntr-o valoare realchar*gcvt(double v,int n, char*buf) Convertete datele de tip double ntr-un ir de simboluri,

    inclusiv simbol cu virgul mobil. Mai des se folosete laconvertirea numerelor introduse ca ir de simboluri, i

    efectuarea anumitor operaii asupra lor.

    Exemple de programe:

    Exemplul 5.1. Este datirul s. S se tipreasc cte litere de a se ntlnesc in ultimulcuvnt din ir (de ex. Anafrate ada; rezulat: 2).#include#include#includevoid main(){char s[256];int i,j=0;clrscr();gets(s);for(i=strlen(s)-1; s[i]!=' '; i--) //parcurgem irul de la sfritif(s[i]=='a') j++; //dac gsim litera a, contorul j va crete

    printf(" Litere de a n ultimul cuvnt sunt: %d",j);getch();

    }

    Exemplul 5.2. Fiecare caracter se nlocuiete cu urmtorul caracter(de ex. abc se tipretebcd) pn la apsarea tastei cifrei 9.#include#include

    #includevoid main(){char g,c;

    27

  • 7/30/2019 Lucrari de Laborator Ib C++

    28/79

    int i,j,x,k;g=0;clrscr();while(!g){c=getchar(); // ct g=0, se citesc cu ecou caractere, pn c!=9if ( c == '9' ){g = 1; continue;} // dac c=9, atunci g=1 i se trece la urmtorul pasputchar (c+1); // tiprete urmtorul caracter

    }getch();

    }

    Exemplul 5.3. Este dat irul d. Se concateneaz irurile i se copie un ir n alt ir.#include #include #include void main(void){char d[25];char *blank = " ", *c = "C++", *t = "Turbo";

    clrscr();gets(d);strcat(d, blank); // la concatenare se pstreaz textul din ambele iruristrcpy(d, t); // irul t se copie n d, i textul din irul dse tergestrcat(d, c); //se concateneazprintf("%s\n", d); // se va afia: TurboC++getch();

    }

    Exemplul 5.4. Este dat irul s. S se numere cte cuvinte are irul.#include#include#includevoid main()

    { char s[20];int i,k;k=1;clrscr();printf("sir:\n");gets(s);for(i=1;i

  • 7/30/2019 Lucrari de Laborator Ib C++

    29/79

    t=strtok(NULL,".");}

    getch();}

    Exemplul 5.6. Este dat un cuvnt s de maxim 20 caractere. S se verifice dac cuvntulintrodus este polidrom (care se citete i de la stnga i de la dreapta la fel; de exemplu cojoc).#include

    #include#include#includevoid main(){char s[20];int i,k,l,h=1;clrscr();printf("sir\n");gets(s);k=strlen(s);l=k/2;for(i=0;i

  • 7/30/2019 Lucrari de Laborator Ib C++

    30/79

    for(i=0,j=0;i

  • 7/30/2019 Lucrari de Laborator Ib C++

    31/79

    for(i; istrlen(t)) //dac se gsete un cuvnt cu lungimea mai mic caminmin=strlen(t); //atuncimin primete lungimea acelui cuvnt

    t=strtok(NULL," ");k++; //contorizeaz numrul de cuvinte}

    printf("\nnr de cuvinte:%d\nlungimea celui mai scurt cuvant:%d",k,min);

    getch();}

    Exemplul 5.14. Folosind funcia gcvt(), s se efectueze unele operaii pentru convertireairului.#include#include#include#includevoid main(){char s[256];double n;int k=4; n=2.897;gcvt(n, k. s);printf(%s ,s); // 2.897// numr negativ

    31

  • 7/30/2019 Lucrari de Laborator Ib C++

    32/79

    n=-982.897;gcvt(n, k. s);printf(%s ,s); // -982.8// numr n format tiinificn=0.897e3;gcvt(n, k. s);printf(%s ,s); // 8970

    }

    Probleme propuse spre rezolvare:

    1. Se citete un ir. S se numere cuvintele care ncep cu litera b.2. S se afieze toate poziiile unui caracter intr-un ir dat. Caracterul se introduce de latastatur(de exemplu: adelina; a are poziia 0 i 6).3. Se citete un ir de caractere care nu conine caractere albe. S se decid dac irul estealctuit exclusiv din caractere numerice.4. S se determine numrul de litere mari i mici dintr-un text dat.5. Se citete un ir ce conine i dou puncte. S se afieze textul cuprins ntre dou puncte ( Ex:ada:hjk:vbnv, irul rezultat: hjk).

    6. Se citete un ir. S se tipreasc la ecran cuvntul cu lungimea mai mic.7. Se citete un ir. S se tipreasc la ecran caracterul de cod maxim i simbolurile cu codurilecuprinse ntre [100, 235].8. Se citete un ir. S se tipreasc la ecran irul dintre paranteze (Ex: asdf (ghdfhg ) fdhj,6g -ghdfhg).9. Se d o list de cuvinte separate prin spaiu, lista se ncheie prin dou rnduri goale succesive(dou enter-uri). S se tipreasc n ordine alfabetic toate polindroamele care apar n list. Un

    polindrom este un cuvnt care este identic citit att de la nceput spre sfrit ct i de la sfritspre nceput (Ex: cazac, elevele, cojoc).10. Se citete un text. Textul conine cuvinte separate printr-un spaiu. Dac textul conine *,atunci fiecare simbol / ce precede * s fie nlocuit cu ,.

    11. Se citete un text. Textul conine cuvinte separate printr-un spaiu. S se scrie, pe liniiseparate, fiecare cuvnt care apare n text urmat de un numr care va reprezenta de cte ori aparecuvntul n text. S se determine cuvntul care apare de cele mai multe ori.12. Se citete un text. Textul conine cuvinte separate printr-un spaiu. Se va genera un nou textcare va conine cuvintele ordonate alfabetic.13. Se citete un text. Textul conine cuvinte separate printr-un spaiu. S se determine numrulde apariii al fiecrui caracter. Informaia referitoare la un caracter se va afia o singur dat.14. Se citete un text. Textul conine cuvinte separate printr-un spaiu. Se va genera un nou textcare va conine cuvintele n ordine invers (asdf - fdsa).15. S se sorteze alfabetic un ir de cuvinte (eventual, s se disting literele mici de cele mari).16. Se d un text de maxim 30 de caractere. S se listeze toate cuvintele de dou caractere din

    acest text.17. Se dau dou texte. S se stabileasc o vocal comun celor dou texte, care apare de cele mai

    puine ori.18. Fie un ir de forma: cifr-liter, cifr liter etc.(Ex : 2a4b5c). S se genereze un astfel deir: aabbbbccccc.19. Se citete un ir de caractere alfanumerice. Considerm c literele sunt separatorii numerelor.Afiai datele de tip numeric preluate n ordine din irul citit. Numerele vor fi scrise cte unul peo linie.Ex.in.txt out.txta23sc345ss5e 23

    3455

    32

  • 7/30/2019 Lucrari de Laborator Ib C++

    33/79

    20. Se citete un text de la tastatur astfel nct cuvintele s fie separate printr-un singur spaiu iimediat dup ultimul cuvnt se scrie punct. Textul va fi scris pe un singur rnd:

    a. S se determine dac textul are cuvinte distincte (se ignora diferena de cheie).b. S se tipreasc cuvintele cu lungimea mai mare ca 6.c. S se determine dac textul conine cifre

    21. Este dat un ir de caractere (lungimea irului este 0, n

  • 7/30/2019 Lucrari de Laborator Ib C++

    34/79

    char *p;p=strrchr(s1,j);

    printf((%s, p); Explicai. Ce se tiprete la ecran?.

    Lucrare de laborator N6

    Tema: Lucrul cu tablourile unidimensionale.

    Scopul lucrrii: obinerea deprinderilor practice la utilizarea tablourilor unidimensionalei operaiile de prelucrare a lor.

    Suport teoretic:

    Definiie: Masivele sunt structuri de date omogene cu un numr finit i cunoscut deelemente, ce ocup un spaiu contiguu de memorie.

    Un masiv este caracterizat de urmtoarele elemente: numele; tipul de date asociat; numrul de dimensiuni; numrul de elemente pentru fiecare dimensiune.

    Definiie: Vectorii sunt masive unidimensionale. In C++ vectorii se declar folosindsintaxa: tip nume[n]unde:

    tip tipul de date folosit; poate fi unul din tipurile de baz ( int,float, char, ) sau un tipdefinit de utilizator (articole, obiecte)

    nume numele prin care va fi referit vectorul

    n numrul de elemente ale vectorului

    Exemple de declaratii:// vector de 100 valori ntregiint vanzari[100];

    // vector de 15 valori realefloat temperaturi[15];

    Memorarea vectorilor se face ntr-un spaiu contiguu de memorie. Numele vectorului estede fapt un pointer ctre adresa primului element. Pentru o declaraie de forma int v[5];reprezentarea n memoria intern este:

    v

    v[0] v[4]v[3]v[2]v[1]

    Dimensiunea total a vectorului este calculat ca produs ntre numrul de elemente idimensiunea unui element.

    Iniializarea vectorului se poate face la declarare printr-o construcie de forma:tip nume[]={lista_valori}.

    Se observ c n acest caz nu este necesar precizarea numrului de elemente. Acesta va fi

    dedus automat de compilator din dimensiunea listei cu care se face initializarea. In cazul in carenumrul de elemente precizat este mai mare dect numrul de elemente din list se va realiza oinitializare partiala a vectorului.

    34

  • 7/30/2019 Lucrari de Laborator Ib C++

    35/79

    Exemple de initializri la declarare:

    // iniializare fr precizarea explicit a numrului maxim de elementeint v1[] = {1, 2, 3, 4, 5};// iniializare complet cu precizarea numrului maxim de elementeint v2[3] = {17, 19, 23};

    // iniializare parialint v3[5] = {7, 6, 5};

    Accesul la elementele vectorului se face direct; compilatorul calculeaz adresa elementuluipe baza indexului i a dimensiunii unui element. Numerotarea elementelor se face incepnd cuzero. Pentru un vectorv cu n elemente referirea elementelor se face folosind v[0], v[1], v[2], ,v[n-1].

    Operaii de baz: Citirea de la tastatur ;

    printf("dai nr de elemente:");scanf("%d",&nrelem);for (i = 0; i < nrelem; i++){printf("vector[%d]=",i);scanf("%d",&vector[i]);}

    Afiarea pe monitor;for (i = 0; i < nrelem; i++)printf("%3d",vector[i]);

    Cutarea elementului dup valoare ;// parcurgem vectorulfor (i = 0; i < nrelem; i++)if (vector[i] == valoare)

    { f=1;// notm c am gsit valoarea cutat

    printf("elementul cautat %d e pe pozitia: d:",vector[i],i);}// element negsit

    if (f==0) printf("elementul cautat nu este in vector: ");

    Inserarea elementului;// se presupune c dimensiunea maxim a vectorului// este cel putin egala cu nrElemente + 1int pozitia;printf("dati pozita pe care vreti sa inserati:");scanf("%d",&pozitia);printf("dati valoarea pentru inserare:");scanf("%d",&valoare);for (i = 0; i < nrelem; i++)

    if (pozitia == nrelem)// inserare la sfarsitul vectoruluivector[nrelem] = valoare;else // inserare n interiorul vectorului{

    // se deplaseaz la dreapta a elementele aflate dup poziia de inserarefor (int i = nrelem; i > pozitia; i--)

    vector[i] = vector[i-1];// i se insereaz elementul

    vector[pozitia] = valoare;}

    printf("Dupa inserare:\n");for (i = 0; i < nrelem+1; i++)

    printf("%3d",vector[i]); tergerea elementului;

    // deplasm la stanga elementele aflate dup poziia de stergere

    35

  • 7/30/2019 Lucrari de Laborator Ib C++

    36/79

    printf("dati pozita pe care vreti s o stergei:");scanf("%d",&pozitia);for (i = pozitia; i < nrelem; i++)

    vector[i] = vector[i+1];printf("Dupa stergere:\n");for (i = 0; i < nrelem; i++)printf("%3d",vector[i]);

    Exemple de programe:

    Exemplul 6.1. Dat un tablou de 10 elemente. Programul determin suma elementelor de pepoziiile pare.#include#includevoid main(){int a[10], i, s;s=0;printf(Introducem elementele vectorului:\n);for(i=0; i

  • 7/30/2019 Lucrari de Laborator Ib C++

    37/79

    clrscr();printf("\ndimensiunea vectorului:");scanf("%d", &n);printf("\nnumrul de poziii de deplasare:");scanf("%d", &x);printf("\nIntrodu elementele:\n");for(i=0; i

  • 7/30/2019 Lucrari de Laborator Ib C++

    38/79

    {printf("a[%d]=", i);scanf("%d", a+i);}

    printf("elementele vectoruluib:\n");for(i=0; i

  • 7/30/2019 Lucrari de Laborator Ib C++

    39/79

    free(a);getch();

    }

    Exemplul 6.7. Se d un tablou de n elemente. S se sorteze descresctor folosind metoda bulelor(adic se compar primul cu al doilea, 2 cu 3,etc. Ex: 6 2 4 3 1 5;

    prima parcugere: 2 4 3 1 5 6; a doua parcurgere: 2 3 1 4 5 6; a treia parcurgere: 2 1 3 4 5 6; a patra parcurgere: 1 2 3 4 5 6;

    #include#include#include //biblioteca pentru funcia maloccvoid main(){

    int k,*a, n, i, aux, j;clrscr();printf("\ndimen vec:");scanf("%d", &n);a=(int*)malloc(n*sizeof(int));

    printf("elementele vectorului a:\n");for(i=0; i

  • 7/30/2019 Lucrari de Laborator Ib C++

    40/79

    for(i=0; i=0;j--)a[j]=a[j-1];a[0]=k;

    }printf("irul final\n");for(i=0; i

  • 7/30/2019 Lucrari de Laborator Ib C++

    41/79

    9. Se d un vector de n elemente. S construiasc un nou vector ce conine acelea elementeca tabloul iniial cu condiia c toate elementele negative preced pe cele pozitive.

    10. Se d un tablou de n elemente, toate elementele sunt diferite. S se afieze pe primelelocuri elementele diferite de zero, apoi elementele egale cu zero pstrnd ordinea lor (Ex:

    1 2 0 4 0 1 2 4 0 0).11. Se d un tablou de n elemente. S se deplaseze ciclic la stnga cu x poziii (Ex: 1 2 3 4 5 ;

    x=3 4 5 1 2 3).12. Se d tablou a de n elemente. S se alctuiasc algoritmul de numrare a elementelormaxime i minime din tablouul a de n.13. Se d tablou a de n elemente. S se construiasc un nou vector de lungimea n, pentrucare elementul i este media aritmetic ale primelori elemente din vectorul iniial.14. Sunt dai doi vectori de lungimea n cu elementele n ordine descresctoare. S seconstruiasc un alt vector de lungimea n+n elemente, n ordine cresctoare i conineelementele vectorilor iniiali.15. Se d tabloul a de n elemente. Au fost introduse meciurile cu participarea echipeiZIMBRU. Elementele tabloului sunt egale cu zero (ZIMBRU a suferit nfrngere), 1 (meciuls-a terminat la egalitate) cu 2 (nvingtoare). S se stabileasc n cte meciuri echipa a suferit

    nfrngere, n cte a ctigat i n cte a fost la egalitate.16. n tabloul t[31] a fost nscris temperatura zilnic a lunii ianuarie. S se numere n ctezile a fost nregistrat temperatura sub zero grade i n cte mai sus de zero grade. S sestabileasc numrul de zile z, n care a fost nregistrat o temperatur mai mic decttemperatura medie a lunii i numrul de zile z1 n care temperatura a depit mrimea medie.17. Se d un vector din n elemente. S se determine numrul elementelor pentru careelementele precedente sunt mai mari.18. Statu-Palm-Barb-Cot a ngropat patru comori n vrfurile unui dreptunghi, scriindu-icoordonatele comorilor pe un pergament. n timpul unei lupte cu Ft-Frumos pergamentul s-a

    pierdut. Din fericire, Statu-Palm-Barb-Cot a memorat coordonatele a trei puncte n care seafl comorile. Scriei un program, care va determina coordonatele celei de a patra comori.Punctele n care au fost ngropate comorile au coordonate ntregi (x1,y1), |x1|

  • 7/30/2019 Lucrari de Laborator Ib C++

    42/79

    ntrebri de control:1. Ce nseamn tablou. Cum se definete?2. Poate tabloul(vectorul) include diferite tipuri. Dac da sau nu explicai. Dai exemplu.3. int i, a[100], k=0;

    for(i=0; i

  • 7/30/2019 Lucrari de Laborator Ib C++

    43/79

  • 7/30/2019 Lucrari de Laborator Ib C++

    44/79

    adr(m[i][j]) = adr(m[0][0]) + (i * nr_max_elemente_linie + j) * dim_element.

    Numerotarea liniilor i a coloanelor se face ncepnd cu zero.

    Exemple de accesare elemente:

    // citeste al doilea element de pe a doua linie din matriceint a = m2[1][1];// modifica primul elementm2[0][0] = 7;

    Transmiterea ca parametri se face ca i in cazul vectorilor prin numele masivului. Problemacare apare n cazul matricelor este aceea c numrul de coloane trebuie fixat pentru a permitecalcularea de ctre compilator a adresei elementelor. n cazul n care se dorete lucrul cu matriceoarecare, transmiterea se va face prin pointeri iar adresa elementelor se va calcula dupa formula

    prezentat anterior. n acest caz va trebui trimis ca parametru att dimensiunea maxim amatricei ct i dimensiunea minim a acesteia.

    In practic apar cazuri n care matricele au anumite caracteristici care permit o stocare maieficienta dect cea standard. Exemple de asemenea matrice sunt: matricele diagonale, matricelesimetrice.

    Matricele diagonale sunt matrice ptratice de dimensiune n care conin elemente nenulenumai pe diagonala principal:

    7 0 00 2 00 0 1

    1In acest caz memorarea se va face folosind un vector de dimensiune n care va memoraelementele de pe diagonala principala.

    Exemplu de utilizare:

    // declarare si initializareint matDiag[3] = {7, 2, 11};// citire valoareint val1 = CitireValoare(matDiag, 3, 1, 2);// scriere valoare (1, 1);ScriereValoare(matDiag, 3, 1, 1, 5);

    Matricele simetrice sunt matrice patratice in care corespondente de sub i de pestediagonala principala sunt egale (adica m[i][j] = m[j][i] pentru oricare i si j). n acest caz se vafolosi un vector care va conine numai elementele de peste i de pe diagonala principal.

    Matricea 1 2 3 42 5 6 73 4 8 97 8 9 1

    0va fi liniarizata sub forma:

    1 2 3 4 5 6 7 8 9 10

    Calculul pozitiei elementului i,j dintr-o matrice de dimensiune n se face dupa formula:

    44

  • 7/30/2019 Lucrari de Laborator Ib C++

    45/79

    jii

    nijinijinnnp +

    =++++=++++=2

    )1()...21()(...)2()1(

    pentruj i,atunci se interschimb i cuj.Funcia de acces la elemente este:int& Valoare(int* matrice, int n, int i, int j){

    // interschimbm elementele daca este cazulif (j > i){

    int t = j;j = i;i = t;

    }// calculam pozitiaint pozitia = i*n + (i*(i-1))/2 + j;return matrice[pozitia];

    }

    Exemplu de utilizare:

    // declarare si initializareint matSim[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};// citire valoareint val1 = Valoare(matSim, 4, 1, 2);// scriere valoare (1, 1);

    Valoare(matSim, 4, 1, 1) = 7;Aceeai tehnica se poate aplica i n cazul matricelor triunghiulare.

    Matricele rare sunt matrice care au majoritatea elementelor nule (mai mult doua treimi). nacest caz este mai eficient s memorm matricea sub forma a trei vactori care s conin linia,coloana i valoarea pentru elementele nenule.Pentru matricea:

    0 0 0 0

    0 0 0 23

    0 7 0 00 0 0 0

    vom avea vectorii:Linii: 1 2Coloane: 3 1Valori: 2

    37

    Alternativ, putem stoca elementele intr-un singur vector de articole care s conin linia,coloana i valoarea pentru fiecare element nenul.

    Exemple de programe:

    Exemplu 7.1. Este dat matricea de dimensiunea n*m. S se afieze cte elementele suntpare pe fiecare linie.#include#include#includevoid main(){

    int i,j,n,m,a[5][5],pare;clrscr();printf("\nintroduceti numrul de linii");scanf("%d",&n);

    45

  • 7/30/2019 Lucrari de Laborator Ib C++

    46/79

    printf("\nintroducei numrul de coloane");scanf("%d",&m);printf("\nintroducei elementele matricei:\n");for(i=0;i

  • 7/30/2019 Lucrari de Laborator Ib C++

    47/79

    }

    Exemplul 7.3. Este dat matricea de dimensiunea n*m. S se afieze maximul pe fiecarecoloan dintre elementele pozitive.#include#include#includevoid main()

    { int i,j,n,m,*a,max;clrscr();printf("\nintroducei numarul de linii");scanf("%d",&n);printf("\nintroducei numarul de coloane");scanf("%d",&m);a=(int*)malloc(n*m*sizeof(int)); // alocm memorieprintf("\nintroducei elementele matricei:\n");for(i=0;i

  • 7/30/2019 Lucrari de Laborator Ib C++

    48/79

    for(i=0;i

  • 7/30/2019 Lucrari de Laborator Ib C++

    49/79

    12. Se consider o matrice ptratic de dimensiune N*N (N

  • 7/30/2019 Lucrari de Laborator Ib C++

    50/79

    Lucrare de laborator N8

    Tema: Subprograme.

    Scopul lucrrii: Definirea subprogramelor-utilizator, apelarea i aplicarea lor.

    Suport teoretic:

    Subprogramele snt uniti de program care: au un algoritm propriu, pot fi proiectate independent, pot fi scrise independent, pot fi compilate independent, nu se pot executa independent ci numai n cadrul unui program (apel).

    Avantajele utilizrii lor:

    evitarea scrierii repetate a aceluiai set de instruciuni, creterea eficienei, prin reutilizarea subprogramelor (biblioteci de subprograme).

    Programele se pot descompune n subprobleme (module), adic n grupe de aciuni care sepot repeta de un numr de ori i care se execut numai n funcie de anumite condiii. Acest lucrudetermin existena unui modul principal pentru prelucrrile principale i pentru activareasubordonailor. Cnd se apeleaz un subprogram, executarea continu cu prima instruciunedin respectivul subprogram. Cnd se termin executarea instruciunilor din subprogram, secontinu cu instruciunea urmtoare apelului, din blocul apelant.

    Subprogramele in limbajul C++ se numesc funcii.Subprogramele pot fi:

    standard (predefinite) sau nestandard (utilizator)

    Exemple de funcii sdandard utilizate frecvent: Funcii de i/o: gets (), fgets (), puts (), scanf (), printf (), getch (), getchar (), fscanf (), Funcii de lucru cu iruri de caractere: strlen (), strcat (), strchr (), strcmp (), atoi (), Funcii matematice: exp(), log(), sin(), cos(), ceil(), floor(), pow(), sqrt(), abs(),

    Ce trebuie s tim despre funcii? cum le putem defini, cum s le apelm, cum s stabilim legtura dintre funcie i programul apelant.

    Definiiaconine antetul funciei i corpul acesteia. Nu este admis definirea unei funciin corpul altei funcii.

    Sintaxa antetului: tip_rezultat nume (lista parametrilor formali);

    Aici tip_rezultat poate fi : un tip standard, o adres a unui tip definit anterior, o structur detip articol. Dac este omis se consider ca fiind tipul int.sau

    void nume(lista parametrilor formali)Dac are tipul void, apelul la funcie se face dintr-o linie de program aparte. n celelalte cazuri

    poate fi parte component a unor expresii.Lista parametrilor formali este o list separat prin virgule de nume de variabile i

    tipurile asociate lor, care primesc valorile argumentelor atunci cnd este apelat funcia. Ofuncie poate s nu aib parametri. Totui, parantezele sunt necesare, chiar dac nu exist

    50

  • 7/30/2019 Lucrari de Laborator Ib C++

    51/79

    parametri. Toi parametrii funciei trebuie declarai individual, fiecare coninnd att tipul ct inumele. Ei snt creai la intrarea n funcie i distrui la ieirea din ea. Parametrilor formali li se

    pot aplica atribuiri sau folosii n expresii. Aceste variabile ndeplinesc sarcina de primire avalorilor argumentelor transmise funciei.

    Corpul funciei este un bloc, care implementeaz algoritmul de calcul folosit de ctre

    funcie. n corpul funciei apar (n orice ordine) declaraii pentru variabilele locale i instruciuni.Dac funcia ntoarce o valoare, se folosete instruciunea return valoare. La execuie, lantlnirea acestei instruciuni, se revine n funcia apelant.

    Sfera de influen a funciilor. Fiecare funcie este un bloc de cod discret. Nici oinstruciune din alt funcie nu poate avea acces la el dect printr-un apel al funciei. De exemplunu putem folosi goto pentru a sri n mijlocul altei funcii. Codul i datele definite ntr-o funcienu pot s interacioneze cu codul sau cu datele definite n alta, deoarece cele dou funcii audiferite sfere de influen. Variabilele definite ntr-o funcie se numesc variabile locale. Clasa dememorare este segmentul de stiv. Ele snt vizibile doar la nivelul blocului n care au fostdeclarate. Durata de via este egal cu durata execuiei blocului respectiv. Adic variabilelelocale nu-i pstreaz valoarea ntre apelrile funciei. Excepie este atunci cnd variabila se

    declar cu specificatorul de clas de memorie static.Variabilele globale se declar n afara oricrei funcii i pot fi utilizate de toate funciile

    care urmeaz declaraiei respective. La declarare acestea snt iniializate automat cu 0. Ele aualocat spaiu n tot timpul execuiei programului. Sunt utile atunci cnd mai multe funcii aleaceluiai program folosesc aceleai date.

    Observaie: n C++ toate funciile au acelai nivel de influen. Asta nseamn c nu pot fidefinite ntr-o funcie alte funcii.

    Funcia se utilizeaz prin apelare la ea. Apelul funciei este o construcie urmat depunct i virgul, numit instruciune de apel, de forma:

    nume_funcie (lista_parametrilor_efectivi);Parametrii efectivi trebuie s corespund cu cei formali ca ordine i tip. La apel, se atribuie

    parametrilor formali valorile parametrilor efectivi, dup care se execut instruciunile din corpulfunciei. La revenirea din funcie, controlul este redat funciei apelante, i execuia continu cuinstruciunea urmtoare instruciunii de apel, din funcia apelant. O alt posibilitate de a apela ofuncie este aceea n care apelul funciei constituie operandul unei expresii (apelul funcieiintervine intr-o expresie). Acest lucru este posibil doar n cazul n care funcia returneaz ovaloare, folosit n calculul expresiei(doar pentru funciile cu tip). La ntlnirea instruciuniireturn, dup atribuirea valorii, execuia funciei se ncheie i se revine la funcia care a apelat-o.n absena instruciunii return, execuia funciei se ncheie dup execuia ultimei instruciuni. nacest caz nu se ntoarce nici o valoare.

    Parametrii declarai n antetul unei funcii sunt numii formali, pentru a sublinia faptul cei nu reprezint valori concrete, ci numai in locul acestora pentru a putea exprima procesul decalcul realizat prin funcie. Ei se concretizeaz la execuie prin apelurile funciei.

    Parametrii folosiila apelul unei funcii suntparametri reali, efectivi, concrei, actualiiarvalorile lor vor fi atribuite parametrilor formali, la execuie. Utilizarea parametrilor formali laimplementarea funciilor i atribuirea de valori concrete pentru ei, la execuie, reprezint un primnivel de abstractizare n programare. Acest mod de programare se numete programare

    procedural i realizeaz un proces de abstractizare prin parametri.

    Funciile comunic prin argumente: ele primesc ca parametri (argumente) datele deintrare, efectueaz prelucrrile descrise n corpul funciei asupra acestora i pot returna o valoare

    (rezultatul, datele de ieire). Transmiterea parametrilor se poate realiza:

    51

  • 7/30/2019 Lucrari de Laborator Ib C++

    52/79

    prin valoare. Aceast metod copiaz valoarea unui argument ntr-un parametru formal alsubprogramului. n acest caz modificrile efectuate asupra parametrului nu au efectasupra argumentului;

    prin referin (adres). Prin aceast metod n parametru se copiaz adresa unuiargument. Aceasta nseamn c modificrile efectuate asupra parametrului afecteazargumentul. Se utilizeaz dac e necesar a transmite n programul apelant mai mult dect

    o valoare. Cu puine excepii, C++ folosete apelarea funciilor prin valoare. Cnd omatrice este folosit ca un argument al unei funcii, acesteia i este pasat adresa matricei.Astfel, codul funciei opereaz asupra coninutului efectiv al matricei i poate s-lmodifice.

    Funciile pot fi descrise n cadrul aceluiai fiier, sau n fiiere diferite, care sunt testate icompilate separat, asamblarea lor realizndu-se cu ajutorul linkeditorului de legturi.

    Funcii recursive se folosesc la programarea proceselor de calcul recursive.Recursivitatea este procesul de definire a unui lucru prin el nsui. Se spune despre o funcie ceste recursiv, dac o instruciune din corpul ei apeleaz chiar acea funcie.Funcia de calcul alfactorialului e un exemplu simplu de funcie recursiv. n limbajul C funcia recursiv fact(n)

    poate fi realizat astfel:double fact(int n){ if(n==0) return 1.0;

    else return n*fact(n-1); }

    Exemple de programe:

    Exemplul 8.1.Funcia afisare afieaz 65 de simboluri * consecutive.#include#define NAME Vasilache Andrei#define ADDRESS Cogalniceanu, 65#define LIM 40

    void afisare(void); // prototipul funcieivoid main(){afisare(); //apelul funcieiprintf(\t%s\t,NAME);printf(%s\n,ADDRESS);afisare(); // al doilea apel al funciei

    }void afisare(){int n; for(n=1; n

  • 7/30/2019 Lucrari de Laborator Ib C++

    53/79

    {int spaces;show_n_char(*,LIM); // apelul funcieiputchar(\n);show_n_char(SPACE,20);printf(%s,NAME);spaces=(60-strlen(ADDRESS))/2;show_n_char(SPACE, spaces);printf(%s\n,ADDRESS);show_n_char(*,LIM); // al doilea apel al funciei

    }void show_n_char(char ch,int n){int i; for(i=1; i

  • 7/30/2019 Lucrari de Laborator Ib C++

    54/79

    void main(){unsigned a, b, c;clrscr();puts(introdu doua numere fara semn:);scanf(%u%u,&a,&b);c=dc(a,b);printf(cmmmc(a,b)=%u,a*b/c);getch();

    }

    Exemplul 8.7. S se determine o rdcin a ecuaiei 6cos(x)+8sin(x)=0 pe segmentul [2,4]cu precizia eps=0.00017 prin metoda biseciei.#include#include#include#define eps 0.0001float f( float x){ return 6*cos(x)+8*sin(x);}void main(){

    clrscr();float a=2.0, b=4.0;float ya,yc; double c; int n=0;lab1: c=(a+b)/2.0; ya=f(a); yc=f(c); n++;if ((c-a)=100) { printf ("convergenta slaba, n=%d",n);goto end;}

    if((ya*yc)max) { max = s[i]; pmax = i; }if (s[i]

  • 7/30/2019 Lucrari de Laborator Ib C++

    55/79

    void citire(int s[], int n);// prototipul functiei de numarare a elementelor pare negativeint numar(int s[], int n);void main(){int i, m[10], dim;puts(dimensiunea sirului numeric:); scanf(%i,&dim);citire(m,dim);printf(sint %i numere pare negative, numar(m,dim));

    }void citire(int s[], int n){puts(Elementele masivului:);for(int i=0; i

  • 7/30/2019 Lucrari de Laborator Ib C++

    56/79

    int i, a[10], dim;puts(dimensiunea sirului numeric:); scanf(%i,&dim);for(i = 0; i < dim; i++)

    scanf(%i,&a[i]);printf(suma elementelor - %i, suma(a,dim-1));getch();

    }int suma(int v[], int n){if(n == 1) return 0;else return (v[n-1] + suma(v,n-1);

    }

    Exemplul 8.12. Funcia cu numr variabil de parametri sumeaz numere ntregi.#include#includeint suma(int m,...); // prototipul funciei cu numr variabil de parametrivoid main(){printf(suma elementelor - %i, suma(2,6,4));printf(suma elementelor - %i, suma(6,1,2,3,4,5,6));

    getch();}int suma(int m,...){int *p=&m, t=0;for(; m; m--) t += *(++p);return t;

    }

    Probleme propuse spre rezolvare:

    1. S se realizeze un program care conine o funcie ce citete elementele unui vector dedimensiunea n cu valori ntregi i o funcie ce returneaz cte elemente impare pozitive sunt.

    2. S se realizeze un program care conine o funcie ce citete elementele unui vector dedimensiunea n cu valori ntregi i o funcie ce returneaz produsul elementelor pare pozitive.

    3. S se realizeze un program care conine o funcie ce citete elementele unui vector dedimensiunea n cu valori reale i o funcie ce returneaz indicele celui mai mare element.

    4. S se realizeze o funcie care primete un simbol ca parametru i returneaz numrul lui deordine dac-i liter i -1 n caz contrar. (De ex.: i c i C sunt litere cu numrul de ordine 3).

    5. S se realizeze o funcie care primete un ir de simboluri ca parametru i returneaz 1 dacirul e palindromic (se citete la fel din ambele direcii) i 0 n caz contrar.

    6. S se realizeze un program care conine o funcie ce citete elementele unui vector dedimensiunea n cu valori ntregi i o funcie ce returneaz lungimea celui mai lung subir

    nedescresctor din acest tablou.7. Programul calculeaz suma ptratelor numerelor din segmentul [m,n]. Se folosete o funcierecursiv pentru a calcula suma.

    8. Programul determin cel mai mic numr dintr-un ir numeric. Se folosete o funcierecursiv.

    9. Programul afieaz cuvintele cu lungimea mai mare dect 6 simboluri dintr-un ir decaractere, care este pasat unei funcii.

    10. Date numerele reale s, t. De obinut y = f( t, -2s, 1.47 ) + f( 2.2, t, s-t ), unde

    ||5

    sin2),,(

    c

    cbacbaf

    +

    =

    11. Date numerele reale a, b, c. De calculat )15.1,max(1

    ),max(),max(

    bca

    cbabaa

    y ++

    +++

    = .ntrebri de control:

    56

  • 7/30/2019 Lucrari de Laborator Ib C++

    57/79

    1. O funcie este total caracterizat de : ...2. Dac funcia fare urmtorul prototip: tipf(lista parametrilor), atunci tip poate fi:

    i. vectorii. structur

    iii. ntreg, real sau caracteriv. pointer spre un tip definit anterior

    v. tablou bidimensional3. Cum se numesc parametrii folosii la definiia unui subprogram?4. O funcie ntoarce obligatoriu o valoare?5. O funcie trebuie s conin obligatoriu parametri?6. Ce tipuri de subprograme cunoatei?7. Ce trebuie s tim despre funcii?8. Ce prezint antetul funciei?9. Ce metode de transmitere a argumenilor n funcii cunoatei?10. Ce este o funcie recursiv?11. Funciile trebuie definite i descrise obligator n acelai fiier cu programul apelant?12. Ce va tipri funcia?

    int a=1;void f() { int b=1, c=1; printf(a=%i b=%i c=%i\n, a++, b++, c++); }void main() { while(a

  • 7/30/2019 Lucrari de Laborator Ib C++

    58/79

    58

  • 7/30/2019 Lucrari de Laborator Ib C++

    59/79

    Lucrare de laborator N9

    Tema: Tipuri de date definite de utilizator, redenumirea tipurilor.

    Scopul lucrrii: Definirea i utilizarea unui tip nou de date: structuri, reuniuni,

    enumerri, cmpuri de bii; nsuirea modalitii de redenumire a tipurilor.

    Suport teoretic:

    Un mod de grupare al datelor este tabloul. Tabloul este un set ordonat de date de acelaitip. Un alt mod de grupare al datelor este structura. Structura reunete date de diferite tipuri, darcare se afl ntr-o legtur logic. Obiectele ce fac parte din structur se numesc cmpuri saumembrii structurii. La definirea i utilizarea structurilor e necesar a cunoate trei lucruri: 1)definirea structurii; 2) declararea variabilei, care corespunde acestui tip; 3) asigurarea accesuluila componentele variabilei-structur.

    Odeclaraie de structur are forma:

    struct nume { lista de declaraii } nume1, nume2,, numen;

    Aici nume definete un tip nou de date, iarnume1, nume2,..., numen sunt structuri, adicvariabile de tipul nume; lista de declaraii declar componentele structurii de tip nume.Exemplu de definire: struct { char title[20]; int year; float value; };. Structura dat are 3cmpuri. In unul se pstreaz denumirea crii, n altul anul ediiei, n al treilea preul.Tipului structur i se poate asocia un nume generic, care poate fi indicat n forma: typedefstruct { char title[20]; int year; float value; } book ;. Specificatorul typedefeste executat dectre compilator, nu de ctre preprocesor ca #define. n continuare numele generic bookpoate fi

    utilizat la definirea noilor structuri. Exist i alt modalitate de asociere a numelui generic tipuluistructura: struct book { char title[20]; int year; float value; };. Aceast modalitate estenecesar la definirea structurilor recursive deoarece typedefnu este suficient: struct node{ intdate; node* next; };. Structura S nu poate conine membri de tipul S, dar poate coninemembri ce pointeaz ctre S. Observaie: cnd definii o structur, definii nu o variabil, ci untip compus de variabile. Nu va exista nici o variabil pn nu vei declara una de acest tip.

    Declararea variabilelor de tip structur se poate face odat cu definirea ei: struct { chartitle[20]; int year; float value; } date1, mas[10];. n C++ dac a fost deja declarat ostructur, putem declara variabile de acest tip folosind doar numele ei generic, fr a preceda cucuvntul cheie struct. De exemplu avnd declararea struct book { char title[20]; int year;float value; }; putem declara book date2, date3[10]. Cnd este declarat o variabil de tipstructur compilatorul de C/C++ aloc automat suficient memorie pentru toate elementele ei.Lungimea zonei de memorie rezervat pentru variabila de tip struct rezult din nsumarealungimilor cmpurilor. Aceasta nu poate depi 65520 octei (ca orice variabil de tip structurat).Pentru o structur i dovedete utilitatea operatorul sizeof, care asigur determinarea lungimiizonei de memorie asociate unei variabile sau unui tip de date.

    Accesul la membrii stucturii se face n dou moduri: global sau pe componente.Referirea global este permis numai n operaia de atribuire, cu condiia ca ambele variabile(surs i destinaie) s aib acelai tip. Referirea pe componente (prin numele lor) este o

    reflectare a faptului c articolul este o structur cu acces direct. Referirea cmpurilor uneistructuri se face prin calificare, folosind operatorul. (punct). De exemplu: dac declarm booklibry, identificatorul libry.value indic la membrul value al structurii libry. Identificatorul

    59

  • 7/30/2019 Lucrari de Laborator Ib C++

    60/79

    libry.value este variabil de tipul float i se utilizeaz asemntor variabilelor de acest tip, ca deexemplu: scanf( %f ,&libry.value). Dac sunt declarate dou variabile a i b de acelai tipstructur putem efectua atribuirea a=b. Nu se admite atribuirea ntre variabile de tip structurcare aparin abloanelor diferite, fie i foarte asemntoare.

    Se pot declara pointeri ctre structuri. Exist dou ntrebuinri ale pointerilor pentru

    structuri : generarea unei apelri de funcii prin referin i crearea listelor nlnuite. Deexemplu : struct bal { float bilan; char nume[80]; } pers, *pstr;. Atunci pstr=&pers; plaseazadresa structurii pers n pstr. Pentru a avea acces la membrii structurii folosind acest pstr seutilizeaz operatorul ->: pstr->bilan , pstr->nume[0].

    Un alt mod de grupare a datelor este reuniunea. Diferena este doar aceea c se substituiecuvntul struct prin cuvntul union. Declararea tipului reuniune se realizeaz astfel: unionnume_tip { tip_cimp1 cimp1; tip_cimp2 cimp2; ...; tip_cimpn cimpn;};Spre deosebire de o structur lungimea zonei de memorie rezervate pentru o variabil de tipreuniune va fi egal cu maximul dintre lungimile cmpurilor componente. Gestiunea coninutuluirespectivei zone de memorie va trebui realizat de ctre programator.

    Referirea la elementele unei reuniuni se face ca i la structuri.

    Exemplu de declarare de reuniune:

    union a { int x; long y; double z; char z[5]; } p, r[6], *t;

    Aici s-au declarat reuniunea p de tipul a, tabloul de reuniuni r ce const din 6 elemente ifiecare element este o reuniune de tipul a, un pointer t ce pointeaz spre acelai tip a. Pentrufiecare reuniune declarat se vor aloca cte 8 octei, deoarece tipul double necesit 8 octei numrul maxim.

    Un alt tip definit de utilizator este tipul enumerare. Acest tip permite folosirea numelorsugestive pentru valori numerice.

    O declaraie de tip enumerare are forma:

    enum nume_generic { nume0, nume1, , numen} list_variabile;

    Aici nume_generic este numele tipului enumerare nou declarat, nume0, nume1,..., numensunt numele sugestive care se vor folosi n continuare n locul valorilor numerice 0, 1, ..., n i

    anume: nume0 substituie valoarea 0, nume1 substituie valoarea 1, ..., numen substituie valoarean. Iarlist_variabile sunt declarate variabile de tipul nume_generic, adic variabile de acest tipenumerare. Aceste variabile sunt similare cu variabilele de tip int. De exemplu definim enumseason { win,spr,sum,aut } s; Atunci printf(%d %d, spr,sum) va afia 1 2.

    La declaraia tipului enumerare se pot impune i alte valori pentru numele sugestive. Deexemplu, dac vom folosi construcia numei=si n loc de numei n lista numelor sugestive,atunci aceasta va impune pentru numele sugestiv numei valoarea si. Respectiv numei+1 va aveavaloarea si+1. Dac definim n felul urmtor enumerarea de mai sus enum seazon{ win=1,spr,sum,aut } s; Atunci printf(%d %d, spr,sum) va afia 2 3.

    Limbajul de programare C permite accesul la unul sau mai muli bii din octet. Una dinmetodele de prelucrare pe bii este organizarea unui tip nou tipul cmpuri de bii. Acetia sunt

    60

  • 7/30/2019 Lucrari de Laborator Ib C++

    61/79

    structuri speciale n care se definesc numrul de bii ocupai de fiecare element. O declaraiepentru un tip cmpuri de bii are forma:

    struct nume { tip nume_cimp1 : lungime_cimp ;tip nume_cimp2 : lungime_cimp ;tip nume_cimpn : lungime_cimp ;

    } n1, n2,..., nm;Aici tip poate fi unsigned, int, signed, char, unsigned char, iar lungime_cimp este

    lungimea cmpului n bii i nu poate depi doi octei. Numele cmpului poate lipsi, atunci eldefinete o zon de bii ne utilizat din octetul respectiv. Lungimea cmpului poate fi 0, atuncicmpul urmtor se aloc n octetul urmtor. Biii se aloc ncepnd de la biii de ordin inferior aioctetului spre cei de ordin superior. Dac un cmp nu ncape n octetul curent, el se aloc noctetul urmtor.

    Referirea la cmpurile de bii se face ca i n cazul structurilor obinuite. Exemplu dedeclarare a tipului cmpuri de bii:

    struct BITFIELDS { unsigned a : 2;

    int b : 4;unsigned c : 1;unsigned : 3;int d : 2 ; } x;

    Aici este declarat variabila x de tipul cmpuri de bii. Aceast declarare ne asigururmtoarea amplasare:

    15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0ne utilizai d ne utilizai c b a

    Dac cmpul d ar fi avut lungimea mai mare dect 6 ar fi fost amplasat automat n urmtorul

    octet. Pentru a regla n mod forat acest lucru se folosete, dup cum s-a spus mai sus, lungimea0 a unui cmp.

    n structuri pot fi utilizai n comun att componente obinuite ct i cmpuri de bii. Deexemplu:

    struct angajat { char nume[20];float plata;unsigned active : 1; // activ sau ntrerupt

    unsigned impozit : 3; } ;definete o nregistrare despre salariat care folosete doar un octet pentru a pstra douinformaii: statutul angajatului i impozitul. Variabilele de tip cmpuri de bii au i restricii:1) nu putem obine adresa unui cmp de bii; 2) nu pot fi introduse n tablouri.

    C admite o facilitate numit typedefpentru a crea nume pentru noi tipuri de date. O astfelde declaraie de tip are forma:

    typedef nume_tip_vechi nume_tip_nou;

    De exemplu declaraia: typedef int LENGTH; face numele LENGTH sinonim pentru "int".Tipul LENGTH poate fi utilizat n declaraii exact la fel ca int:

    LENGTH len, maxlen;LENGTH *lengths[];

    Similar, declararea: typedef char* STRING;face ca STRING sa fie sinonim cu char* sau pointerul unui caracter, care poate fi utilizat ndeclaraii ca: STRING p, lineptr[LINES] ;

    61

  • 7/30/2019 Lucrari de Laborator Ib C++

    62/79

    Exemple de programe:

    Exemplul 9.1. Programul simplific o fracie raional. Simplificarea se face prinmprirea numrtorului i numitorului la cel mai mare divizor comun al lor.#include#includevoid main(){// cmpul n reprezint numrtorul,m- numitorul

    typedef struct { long unsigned n;long unsigned m; } Rational;

    Rational s; long unsigned k, cmmdc=1, h;clrscr();puts(Introducei o fracie raional);scanf (%lu%lu,&s.n,&s.m) ;puts(Ai introdus fracia: );printf(%lu/%lu\n,s.n,s.m);h=s.n < s.m ? s.n : s.m; // h este minimul dintre numrtor i numitorfor(k=1;k

  • 7/30/2019 Lucrari de Laborator Ib C++

    63/79

    printf(Dai numrul de persoane: ); scanf(%d,&n);for (i=0; i

  • 7/30/2019 Lucrari de Laborator Ib C++

    64/79

    puts ( Virsta: );scanf ( %d, &vs ); x->virsta=vs; fflush ( stdin );puts ( Sexul: ); scanf ( %c, &sx ); x->sex=sx; fflush ( stdin );if ( x->sex==F || x->sex==f )

    { puts ( Dati numele sotului: ); gets ( x->p.sot ); }else { puts ( Dati numele sotiei: ); gets ( x->p.sotie ); }

    }void Scrie ( int nr_p, persoana x ){if ( wherey ()==20 ) { puts ( Apasati o tasta ); getch(); }printf ( Datele persoanei a %d-a:\n, nr_p );printf ( Numele: %s Virsta: %d Sexul: %c , x.nume, x.virsta, x.sex );if ( x.sex==F || x.sex==f ) printf ( Numele sotului: %s\n, x.p.sot );

    else printf ( Numele sotiei: %s\n, x.p.sotie );}void main(){ clrscr();persoana om[20]; int i,n;puts ( Dati numarul de personae: ); scanf ( %d, &n );for ( i=0; i

  • 7/30/2019 Lucrari de Laborator Ib C++

    65/79

    }

    Exemplul 9.6. Programul exemplific folosirea enumerrilor.#include#includeenum spectrum { red, orange, yellow, green, blue, violet } ;void main(){

    enum spectrum color;puts ( Introduceti culoarea ( pentru ieire tastai q ) );while ( ( scanf (%d, &color)) == 1 ){switch ( color ) {case red : puts ( Trandafirii sunt rosii ); break;case orange : puts ( Macii sunt orange ); break;case yellow : puts ( Florile florii soarelui sunt galbene ); break;case green : puts ( Iarba este verde ); break;case blue : puts ( Clopoeii sunt albatri ); break;case violet : puts ( Toporasii sunt violeti ); break;default : printf ( Nu cunosc nimic de culoarea data.\n ); }puts ( Urmatoarea culoare );

    }}

    Exemplul 9.7. Programul declar un tablou de structuri student cu elementele: nume numele studentului, tabloul note[5] pentru a pstra notele, med pentru pstrarea notei medii.Se utilizeaz funciile de introducere a datelor despre fiecare student, de calculare a notei mediifiecrui student i atribuirii ei variabilei med, de afiare a listei studenilor.#include#include#includestruct student { char nume[10];

    int note[5];float med; };

    void initiere (student * s, int n);void calcul (student * s, int n);void afisare (student * s, int n);void main(){int n; clrscr();student *m;puts (Dai numrul de studeni:); scanf (%d, &n);m=(student*)malloc(n*sizeof(student));initiere (m,n);calcul (m,n);afisare (m,n);getch ();

    }void initiere (student * s, int n){int i, j, q;for ( i=0; inume);for ( j=0; jnote[j]=q;}

    }}void calcul ( student* s, int n){int i,j; float f;for (i=0; i

  • 7/30/2019 Lucrari de Laborator Ib C++

    66/79

    { f=0.0;for ( j=0; jnote[j];(s+i)->med=f/5.0;

    }}void afisare ( student *s, int n){puts (" NUME | MEDIA ");for ( int i=0; inume, (s+i)->med );}

    Probleme propuse spre rezolvare:

    1. Programul realizeaz operaii cu fracii raionale ( introducere, extragere, atribuire,inversare, adunare, scdere, nmulire, mprire ).

    2. Programul realizeaz admiterea la un liceu i permite: iniializarea vectorului de nregistrri de tip elev; adugarea unui elev n vector; nlocuirea unui elev cu alt elev; inserarea unui elev pe o anumit poziie n vector; eliminarea din vector a unui elev avnd un anumit nume; cutarea unui elev dup nume; calcularea mediilor; listarea alfabetic a elevilor; listarea elevilor n ordinea descresctoare a mediilor.

    3. Programul administreaz un parc de automobile. Informaiile relative la un automobil sunt:numrul de locuri, marca, tipul de carburant, numrul de nmatriculare. Programul permiteintrarea unei maini, ieirea unei maini, nlocuirea unei maini cu alta de acelai model (avnd

    alt numr de nmatriculare).4. Programul invit utilizatorul s introduc ziua, luna (denumirea prescurtat), anul i

    afieaz numrul zilelor ce s-au scurs de la nceputul anului pn la ziua introdus.5. Fiind date dou fracii p i qprogramul afieaz forma ireductibil a fraciilorp+q, p-q, p/q,

    p*q, punnd n eviden numrtorul i numitorul acestora.6. Programul determin de cte ori o persoan nscut n anul A>1900, luna L, ziua z, avnd

    vrsta v i-a aniversat ziua de natere n aceeai zi a sptmnii cu cea n care s-a nscut.7. Programul calculeaz valoarea unei expresii raionale.8. Programul determin denumirea zilei dup o dat calendaristic presupus corect. Folosii

    tipul union.

    ntrebri de control:

    1. Ce este un tip definit de utilizator ? Care sunt aceste tipuri i necesitatea lor ?2. Ce este o structur ? Care este deosebirea dintre o structur i un tablou ?3. Cum se declar o structur ? Cum se face referirea la componentele unei structuri ?4. Cum se aloc memorie unei structuri ?5. Definii o structur care s conin denumirea prescurtat a lunii pn la trei simboluri,

    numrul de zile a lunii i numrul de ordine al lunii.6. Definii un tablou din 12 structuri ca n punctul 5 i efectuai iniializarea lui pentru un an

    bisect.

    7. Condiia ca dou puncte distincte A i B ( de tip structur) s aparin aceleiai axe decoordonate este:

    66

  • 7/30/2019 Lucrari de Laborator Ib C++

    67/79

    a) A.x==0 && B.x==0 && A.y==0 && B.y==0b) ( A.x==0 || B.x==0 ) && ( A.y==0 || B.y==0)c) A.x==0 && B.x==0 || A.y==0 && B.y==0d) A.x==0 || B.x==0 && A.y==0 || B.y==0

    8. Este dat un fragment de program: struct name { char first[20]; char last[20]; } ;

    struct bem { int limbs; name title; char type[30]; } ;bem *pb; bem deb = { 6, { Bernazel, Gwolkapwolk }, Arcturan };

    A) Ce va afia: printf(%d\n, deb.limbs); printf(%s\n, pb->type);printf(%s\n, pb->type + 2) ?

    B) Cum poate fi accesat Gwolkapwolk ( n dou moduri ).9. Ce este o reuniune ? Care este deosebirea dintre o structur i o