program calccap 5

Upload: pstraja

Post on 30-May-2018

217 views

Category:

Documents


0 download

TRANSCRIPT

  • 8/14/2019 program calcCap 5

    1/26

    Tablouri.

    CAPITOLUL 5

    TABLOURI

    Tablouri unidimensionale

    Tipurile structurate de date sunt combinaii de alte tipuri definite prin descriereatipurilor componentelor i prin indicarea unor metode de structurare. Datele structurate seutilizeaz n cadrul aplicaiilor care lucreaz cu mai multe date i pentru care declararea unorvariabile simple nu mai este suficient.

    Un tip structurat de date este tabloul, definit ca o structur care cuprinde un numr decomponente de acelai tip. Tipul componentelor se numete tipul de baz al tabloului.Accesarea unei componente din cadrul tabloului se realizeaz prin intermediul unui indice.Valorile indicilor identific n mod unic componentele.

    Observaie: datorit acestei proprieti, o variabil de tip tablou poate fi privit ca ofuncie definit pe mulimea valorilor tipului indicelui cu valori n mulimea valorilor tipuluide baz al tabloului.

    n cazul n care componentele unui tablou sunt structurate dup valorile unui singurindice tabloul se numete unidimensional, iar dac ele sunt structurate dup valorile maimultor indici tabloul se numete multidimensional, fiecare indice definind o dimensiune.

    Pentru a folosi o variabil de tip tablou unidimensional acesta trebuie declarat naintede a fi utilizat.

    Declaraia unui tablou unidimensional este urmtoarea: tip_baz nume_tablou[lim];

    unde: tip_baz - este unul din tipurile de dat admise de C; nume_tablou - este numele tabloului unidimensional;

    lim - specific numrul de elemente ale tabloului unidimensional(dimensiunea).Exemplu: int a[15];

    float b[20];Tabloul a este format din 15 componente numere ntregi; iar tabloul b este format din

    20 de componente numere reale. Referirea la elementul unui tablou unidimensional se realizeaz astfel:- se precizeaz numele tabloului;- n interiorul parantezelor drepte se precizeaz indicele corespunztor elementului.

    Exemplu: a[5] reprezint elementul de pe poziia 6 din tabloul a;b[0] reprezint primul element din tabloul b;b[19] reprezint ultimul element din tabloul b.

    Observaie: numele unui tablou are ca valoare adresa primului su element.Componentele tabloului sunt pstrate n memorie una dup alta, n zone continue, n ordineacresctoare a valorilor indicelui.

    Tablourile se pot iniializa atunci cnd se declar. Un tabel unidimensional se poateiniializa cu urmtorul format:

    tip_baz nume_tablou[n] = {e1,e2,,en};unde: e1, e2, , en sunt expresii constante. Valorile expresiilor constante trebuie

    cunoscute n momentul iniializrii tabloului unidimensional.Observatie: - numrul expresiilor de iniializat poate fi mai mic dect numrul

    elementelor tabloului.

    73

  • 8/14/2019 program calcCap 5

    2/26

  • 8/14/2019 program calcCap 5

    3/26

    Tablouri.

    printf (b=) ; scanf (%d, &b);j = 0;for (i=0; i

  • 8/14/2019 program calcCap 5

    4/26

    Tablouri.

    scrie irul inversat este: pentru i0, n-1 execut

    srie a[i]sfrit pentru

    sfrit algoritm.Programul corespunztor algoritmului este:

    #include #include void main( ){int n,i,aux,a[20];clrscr ( ) ;printf(Dimensiunea sirului=) ;scanf(%d,&n) ;for (i=0 ;i

  • 8/14/2019 program calcCap 5

    5/26

    Tablouri.

    a[1]=4a[2]=7a[3]=4a[4]=9a[5]=3a[6]=11

    a[7]=4Sirul elementelor distincte:3 4 7 9 11

    Algoritmul problemei:Algoritm distinctecitete npentru i0, n-1 execut

    citete a[i]sfrit pentrum0b[0]a[0]

    pentru i1, n-1 executj0cod1repet

    dac b[j]=a[i] atunci cod0altfel jj+1

    sfrit dacpn cnd (j>m sau cod=0) ; sfrit repetdac cod=1 atunci mm+1

    b[m]a[i]sfrit dac

    sfrit pentrumm+1pentru i0, m-1 execut

    Scrie b[i]sfrit pentru

    sfarit algoritm.Programul corespunztor algoritmului este:

    # include # include void main ( ){

    int n, m,i,j,cod;int a[30],b[30];clrscr( );printf(Dimensiunea sirului=);scanf(%, &n);

    for (i=0;i

  • 8/14/2019 program calcCap 5

    6/26

    Tablouri.

    for (i=1;i

  • 8/14/2019 program calcCap 5

    7/26

    Tablouri.

    k=3Noul sir este:3 -4 7 7 1 0

    Algoritmul problemei:Algoritm adugare

    citete n

    s0pentru i0, n-1 execut

    citete a[i]ss+ a[i]

    sfrit pentrucitete kpentru in-1,k-1,-1 execut

    a[i+1]a[i]sfrit pentrua[k-1]snn+1

    scrie Noul sir este : pentru i0, n-1 execut

    scrie a[i]sfrit pentru

    sfrit algoritm.Programul corespunztor algoritmului este:

    #include #include void main( ){ int n,i,k,a[30];

    clrscr( );

    printf(n =); scanf(%d, &n);s=0;for (i=0 ;i=k-1;i--) a[i+1] = a[i];a[k-1]=s;n++;

    printf(\n Noul sir este: \n );for(i=0 ;i

  • 8/14/2019 program calcCap 5

    8/26

    Tablouri.

    Dup citirea valorilor datelor de intrare se iniializeaz variabila s cu valoarea zero.Se parcurge ntreg irul, adaugnd valoarea fiecarui element din ir n variabila s. ncepnd dela ultimul element din ir pn la cel de pe poziia k-1 se decaleaz componentele irului cu opoziie spre dreapta

    Elementului de pe pozitia k-1 i se atribuie valoarea variabilei s i se modificdimensiunea irului.

    n final se afieaz elementele irului.

    Aplicaia 5:S se ordoneze cresctor un ir de numere reale de dimensiune dat.

    Specificarea problemei: Date de intrare: n - dimensiunea irului;

    a[0], a[1], , a[n-1] - elementele irului. Date de iesire: a[0], a[1], a[n-1].

    Date de test: Dimensiunea sirului = 6a[0]=40a[1]=60

    a[2]=21a[3]=34a[4]=70a[5]=55Sirul ordonat este:21 34 40 55 60 70

    Algoritmul problemei:Algoritm ordonarecitete npentru i0, n-1 execut

    citete a[i]

    sfrsit pentrupentru i0, n-2 execut

    min a[i]k ipentru ji+1,n-1 execut

    dac (a[j]i) atunci a[k]a[i]

    a[i]min

    sfrit dacsfrit pentruscrie "Sirul ordonat este:"pentru i0, n-1 execut

    scrie a[i]sfrit pentru

    sfrit algoritm.Programul corespunztor algoritmului este:

    #include #include void main ( )

    80

  • 8/14/2019 program calcCap 5

    9/26

    Tablouri.

    { int n,i,j,k;

    float min,a[30];clrscr( );printf( Dimensiunea sirului: );scanf(%d, &n);for (i=0 ;i

  • 8/14/2019 program calcCap 5

    10/26

  • 8/14/2019 program calcCap 5

    11/26

    Tablouri.

    sfrit ct timp

    ct timp (i

  • 8/14/2019 program calcCap 5

    12/26

    Tablouri.

    getch ( ); }

    Analiza problemei:n corpul funciei principale se declar variabile cu urmtoarea semnificaie:n, m, p - dimensiunile celor 3 iruri;i, j, k - reprezint indici folosii pentru accesarea elementelor din iruri;a, b, c - reprezint iruri de numere ntregi.

    Dup declararea variabilelor se citesc dimensiunile i elementele celor dou iruri.Se urmrete construirea irului c obinut prin interclasarea celor doua iruri a i b. Seiniializeaz cele 3 variabile folosite pentru accesarea elementelor irurilor cu valoarea zero.Ct timp mai exist elemente n ambele iruri se compara cele 2 elemente i se adaugelementul cel mai mic n irul c. n irul din care face parte valoarea mai mic se trece laelementul urmtor. Se modific i valoarea variabilei kpentru a putea aduga un alt elementn irul c.

    Dac n primul ir mai exist elemente dar n irul al doilea nu mai exist elementeatunci se vor aduga n irul c elementele rmase din primul ir.

    Dac n primul ir nu mai exist elemente dar n irul al doilea mai exist elementeatunci se vor aduga n irul c elementele rmase n irul al doilea.

    La final se afieaz cele p elemente ale irului obinut prin interclasare.n cazul datelor de test interclasarea elementelor din cele dou iruri se realizeaz

    astfel , unde a={-2, 0, 3, 7, 11, 18} i b={1, 3, 8, 13}:

    i a[i] j b[j] k c[k] c

    0 -2 0 1 0 -2 -21 0 0 1 1 0 -2 02 3 0 1 2 1 -2 0 12 3 1 3 3 3 -2 0 1 32 3 2 8 4 3 -2 0 1 3 33 7 2 8 5 7 -2 0 1 3 3 74 11 2 8 6 8 -2 0 1 3 3 7 84 11 3 13 7 11 -2 0 1 3 3 7 8 115 18 3 13 8 13 -2 0 1 3 3 7 8 11 135 18 4 - 9 18 -2 0 1 3 3 7 8 11 13 18

    Tablouri bidimensionale

    Dac componentele unui tablou sunt structurate dup valorile a doi indici atuncitabloul se numete bidimensional, fiecare indice definind o dimensiune.

    Pentru a folosi o variabil de tip tablou bidimensional acesta trebuie declarat naintede a fi utilizat.

    Declaraia unui tablou bidimensional este urmtoarea: tip_baz nume_tablou [lim1][lim2];

    unde: tip_baz - este unul din tipurile de dat admise de C; nume_tablou - este numele tabloului bidimensional; lim1, lim2 - specific numrul de elemente ale tabloului bidimensional (dimensiunea).Exemplu: int a[10][20];

    float b[20][35];Tabloul a este format din 10 linii i 20 de coloane, avnd 200 de componente

    numere ntregi. Tabloul b este format din 20 de linii i 35 de coloane, avnd 700 decomponente numere reale.

    84

  • 8/14/2019 program calcCap 5

    13/26

  • 8/14/2019 program calcCap 5

    14/26

    Tablouri.

    pentru j 0,n-1 execut

    dac i+j=n-1 atunci m[i][j]j+1altfel dac i+j

  • 8/14/2019 program calcCap 5

    15/26

    Tablouri.

    Aplicaia 2:Se cunosc elementele numere reale ale unei matrici ptrate. S se determine:

    - produsul elementelor de pe diagonala principal;- suma elementelor de pe diagonala secundar;- valoarea maxim situat deasupra diagonalei principale;

    - valoarea minim situat sub diagonala secundar.Specificarea problemei:

    Date de intrare: n - ordinul matricei;m[i][j]; i,j{0,1,,n-1}.

    Date de ieire: p - produsul elementelor de pe diagonala principal;s - suma elementelor de pe diagonala secundar;max - valoarea maxim situat deasupra diagonalei principale;min - valoarea minim situat sub diagonala secundar.

    Date de test: n=3m[0][0]=1m[0][1]=2

    m[0][2]=3m[1][0]=2m[1][1]=4m[1][2]=6m[2][0]=1m[2][1]=3m[2][2]=5Matricea este:1.0 2.0 3.02.0 4.0 6.01.0 3.0 5.0

    Produsul elementelor de pe diagonala principala : 20.000Suma elementelor de pe diagonala secundara : 8.000Valoarea maxim aflata deasupra diagonalei principale: 2.000Valoarea minim aflata sub diagonala secundara: 3.000

    Algoritmul problemei:Algoritm matricecitete npentru i 0,n-1 execut

    pentru j 0,n-1 executcitete m[i][j]

    sfrit pentru

    sfrit pentruscrie "Matricea este:"pentru i 0,n-1 execut

    pentru j 0,n-1 executscrie m[i][j]

    sfrit pentrusfrit pentrup 1;s 0pentru i 0,n-1 execut

    pp*m[i][i]s s+m[i][n-1-i]

    87

  • 8/14/2019 program calcCap 5

    16/26

    Tablouri.

    sfrit pentruscrie "Produsul elementelor de pe diagonala principala : ",pscrie "Suma elementelor de pe diagonala secundara : ",smaxm[0][1]pentru i 0,n-2 execut

    pentru j i+1,n-1 executdac (m[i][j]>max) atunci maxm[i][j]sfrit dac

    sfrit pentrusfrit pentruscrie "Valoarea maxima aflat deasupra diagonalei principale:",maxminm[1][n-1]pentru i 2,n-1 execut

    pentru j n-i,n-1 executdac (m[i][j]

  • 8/14/2019 program calcCap 5

    17/26

    Tablouri.

    for (i=2;i

  • 8/14/2019 program calcCap 5

    18/26

    Tablouri.

    Aplicaia 3: S se verifice dac o matrice ptrat este simetric.Specificarea problemei:

    Date de intrare: n - ordinul matricei;m[i][j]; i,j {0,1,,n-1}.

    Date de ieire: simetric.Date de test: n=3

    m[0][0]=1m[0][1]=2m[0][2]=4m[1][0]=2m[1][1]=3m[1][2]=5m[2][0]=4m[2][1]=5m[2][2]=6

    Matricea este:1 2 42 3 54 5 6Matricea este simetric

    Algoritmul problemei:Algoritm matrice_simetric

    citete npentru i 0,n-1 execut

    pentru j 0,n-1 executcitete m[i][j]

    sfrit pentrusfrit pentruscrie "Matricea este: "pentru i 0,n-1 execut

    pentru j 0,n-1 executscrie m[i][j]

    sfrit pentrusfrit pentrusimetric 1i 1ct timp ((i

  • 8/14/2019 program calcCap 5

    19/26

    Tablouri.

    sfrit algoritmProgramul corespunztor algoritmului este: #include

    #include void main(){ float m[20][20];

    unsigned n,i,j;int simetric;printf("\nn=");scanf("%u",&n);for (i=0;i

  • 8/14/2019 program calcCap 5

    20/26

    Tablouri.

    n final se verific valoarea variabilei simetric. Dac valoarea este 1 atunci seafieaz mesajul: Matricea este simetric; dac valoarea este 0 atunci se afieaz mesajul:Matricea nu este simetric.

    Aplicaia 4:S se determine matricea transpus.

    Specificarea problemei:Date de intrare: n - numrul liniilor matricei;

    m - numrul coloanelor tabloului;a[i][j]; i {0,1,,n-1}, j{0,1,,m-1}.

    Date de ieire: t[i][j]; i {0,1,,m-1}, j {0,1,,n-1}.Date de test: Nr. linii=3

    Nr. coloane=2a[0][0]=1a[0][1]=2a[1][0]=2a[1][1]=3

    a[2][0]=4a[2][1]=7Matricea este:1.0 2.02.0 3.04.0 7.0Matricea transpus este:1.0 2.0 4.02.0 3.0 7.0

    Algoritmul problemei:Algoritm matrice_transpus

    citete n, mpentru i 0, n-1 execut

    pentru j 0, m-1 executcitete a[i][j]t[j][i] a[i][j]

    sfrit pentrusfrit pentruscrie "Matricea este: "pentru i 0,n-1 executpentru j 0,m-1 execut

    scrie a[i][j]

    sfrit pentrusfrit pentruscrie "Matricea transpus este: "pentru i 0,m-1 execut

    pentru j 0,n-1 executscrie t[i][j]

    sfrit pentrusfrit pentru

    sfrit algoritm

    92

  • 8/14/2019 program calcCap 5

    21/26

    Tablouri.

    Programul corespunztor algoritmului este: #include

    #include void main(){ float a[20][20], t[20][20];

    unsigned n,m,i,j;

    printf("\nNr. linii=");scanf("%u",&n);printf("\nNr. coloane=");scanf("%u",&m);for (i=0;i

  • 8/14/2019 program calcCap 5

    22/26

    Tablouri.

    Date de test: Prima matrice:Nr. linii=3Nr. coloane=2a[0][0]=1a[0][1]=2a[1][0]=0

    a[1][1]=3a[2][0]=4a[2][1]=1A doua matrice:Nr. linii=2Nr. coloane=4b[0][0]=1b[0][1]=0b[0][2]=2b[0][3]=0b[1][0]=3

    b[1][1]=1b[1][2]=-1b[1][3]=0Matricea produs este:7.0 2.0 0.0 0.09.0 3.0 -3.0 0.07.0 1.0 7.0 0.0

    Algoritmul problemei:Algoritmul matrice_produs

    citete m,npentru i 0,m-1 execut

    pentru j 0,n-1 executcitete a[i][j]

    sfrit pentrusfrit pentrucitete ppentru i 0,n-1 execut

    pentru j 0,p-1 executcitete b[i][j]

    sfrit pentrusfrit pentruscrie "Matricea produs este"

    pentru i 0,m-1 executpentru j 0,p-1 execut

    c[i][j] 0pentru k 0,n-1 execut c[i][j] c[i][j]+a[i][k]*b[k][j]sfrit pentruscrie c[i][j]

    sfrit pentrusfrit pentru

    sfrit algoritm

    94

  • 8/14/2019 program calcCap 5

    23/26

    Tablouri.

    Programul corespunztor algoritmului este:#include #include void main(){ float a[20][20], b[20][20];

    float c[20][20];

    unsigned m,n,p,i,j,k;printf("\nPrima matrice:");printf("\nNr. linii=");scanf("%u",&m);printf("\nNr. coloane=");scanf("%u",&n);for (i=0;i

  • 8/14/2019 program calcCap 5

    24/26

    Tablouri.

    - elementul de pe linia i i coloana j din matricea produs se iniializeaz cu valoareazero;

    - la aceast valoare se va aduga produsul dintre elementul din prima matrice de pelinia i i coloana k i elementul din a doua matrice de pe linia k i coloana j, unde variabila kprimete pe rnd toate valorile mulimii { }1,...,1,0 n .

    n final, n cadrul a dou instruciuni repetitive se afieaz elementele matriceiprodus.

    Aplicaia 6:Fie m, n dou numere naturale i o matrice A cu m linii i n coloane, avnd

    elemente numere reale. S se interschimbe liniile matricei astfel nct suma elementelor dinlinia i s fie mai mic dect suma elementelor din linia j, pentru 0

  • 8/14/2019 program calcCap 5

    25/26

    Tablouri.

    pentru j 0,n-1 executs[i] s[i]+a[i][j]

    sfrit pentrusfrit pentrupentru i 0,m-2 execut

    pentru j i+1,m-1 executdac s[i]>s[j] atunci pentru k 0,n-1 execut

    aux a[i][k]a[i][k] a[j][k]a[j][k] aux

    sfrit pentruaux s[i]s[i] s[j]s[j] aux

    sfrit dacsfrit pentru

    sfrit pentruscrie "Matricea modificat este"

    pentru i 0,m-1 executpentru j 0,n-1 execut

    scrie a[i][j]sfrit pentru

    sfrit pentrusfrit algoritm.

    Programul corespunztor algoritmului este:#include #include void main(){ float a[20][20];

    unsigned m,n,i,j,k;float s[20],aux;printf("\nNr. linii=");scanf("%u",&m);printf("\nNr. coloane=");scanf("%u",&n);for (i=0;i

  • 8/14/2019 program calcCap 5

    26/26

    Tablouri.

    a[i][k]=a[j][k]a[j][k]=aux

    }aux=s[i]s[i]=s[j]s[j]=aux

    }

    printf("\nMatricea modificata este:\n");for (i=0;i