Programarea Calculatoarelor, seria CC

Laborator 6

Funcții cu vectori

În acest laborator veţi învăţa să:



Vectori

Atunci când declarați o variablilă, compilatorul va fi informat despre 2 lucruri: numele variabilei si tipul ei, de exemplu int n. Astfel compilatorul va rezerva o zonă de memorie pentru aceasta variabilă (4 octeți pentru o arhitectură pe 32 biți).

Atunci când se face o atribuire n = 7, la zona de memorie rezervată variabilei n va fi scrisă noua valoare.

Pentru ca o funcție să poată modifica valoarea variabilei n ea va avea nevoie de adresa la care se află, de exemplu, pentru a citi variabila am scrie scanf("%d", &n);

Atunci când declarați un vector, de exemplu int v[100], variabila v va reține adresa primului element al vectorului, deci începutul zonei de memorie care a fost rezervată. Adresa celui de-al i-lea element va fi &v[i], lucru care poate fi scris și ca v + i.

Dacă vrem să modificăm elementele din v în interiorul unei funcții va trebui să trimitem ca parametru adresa sa de început, deci chiar v.

Să luăm ca exemplu o funcție care adaugă un întreg x tuturor elementelor din vectorul v, de n elemente.

void add(int v[], int n, int x)
{
    int i;
    for (i = 0; i < n; i++)
        v[i] = v[i] + x;
}

În loc de int v[] am fi putut folosi și int * v, v fiind, după cum am spus, un pointer la primul element.

Pentru a apela funcția vom scrie add(v, n, x).


Problema 1.

Rulați următorul program și încercați să înțelegeți de ce afișează respectivele valori. Este important să întrebați dacă nu înțelegeți ceva.

#include <stdio.h>

int main()
{
    int a[] = {0, 1, 2, 3, 4, 5, 6, 7, 8};
    unsigned long int adr0, adr1, adr2;
    int *p1, *p2;

    printf("a = %p\na + 1 = %p\na + 3 = %p\n\n", a, a + 1, a + 3);

    printf("sizeof(a) = %d\n", sizeof(a));
    printf("sizeof(a + 1) = %d\n", sizeof(a + 1));
    printf("sizeof(a + 3) = %d\n\n", sizeof(a + 3));

    adr0 = (unsigned long int) a;
    adr1 = (unsigned long int) (a + 1);
    adr2 = (unsigned long int) a + 1;

    printf("adr0 = %lu\nadr1 = %lu\nadr2 = %lu\n\n", adr0, adr1, adr2);

    p1 = a + 4;
    p2 = &(a[4]);

    printf("p1 = %p \t *p1 = %d\n", p1, *p1);
    printf("p2 = %p \t *p2 = %d\n", p2, *p2);
    printf("a + 4 = %p \t a[4] = %d\n", a + 4, a[4]);

    *p1 = *p1 + 1;
    printf("\na[4] = %d\n", a[4]);

    return 0;
}


Problema 2.

Sa se scrie o functie care sorteaza un vector folosind bubble sort. Functia va primi ca parametri vectorul care trebuie sortat, precum si numarul de elemente.

Exemplu:

Intrare Ieşire
9 12 3 1 1 3 9 12
10 -2 5 17 3 8 -2 3 5 8 10 17

Problema 3.

Să se scrie o funcție care calculează valorile unghiurilor unui triunghi, în funcție de lungimile laturilor. Funcția va primi 2 argumente: un vector cu datele de intrare (lungimile laturilor) și unul cu rezultate (unghiurile).

HINT: Funcțiile trigonometrice sunt declarate în math.h.

Exemplu:

Intrare Ieşire
10.0 10.0 10.0 60.00 60.00 60.00
2 2 2.82 45.00 45.00 90.00
3.0 5.2 6.0 30.00 90.00 60.00

Problema 4.

Să se scrie o funcție pentru extragerea elementelor comune din doi vectori (neordonați) într-un al treilea vector. Funcția are 5 argumente: adresa (numele) și dimensiunea vectorilor de intrare, adresa vectorului rezultat.

Funcția întoarce dimensiunea vectorului rezultat.

Exemplu:

Intrare Ieşire
5
4 1 5 7 10
4
1 10 3 4
3
4 1 10

Problema 5.

Funcție pentru compararea a doi vectori de caractere, echivalentă ca rezultat cu funcția strcmp. Funcția primește doi vectori de caractere și are un rezultat întreg (negativ - daca primul șir este mai mic, zero - dacă sunt egale sau pozitiv - dacă primul șir este mai mare). Program care verifică funcția, pentru șiruri citite de la tastatură în doi vectori.

HINT: Pentru a citi un vector de caractere, de exemplu char sir[100] folosiți scanf("%s", sir).

Exemplu:

Intrare Ieşire
abcd
acdf
1
abcd
abcd
0
bcde
zdg
-1

Problema 6.

Să se scrie o funcție care primește ca parametru un vector v și o valoare x cu prototipul: void transform(int v[], int n, int x). Funcția modifică vectorul v astfel încât elementele mai mici ca x se află la începutul vectorului și elementele mai mari sau egale cu x la sfârșitul lui.

Nu se vor folosi sortări!

Exemplu:

Intrare Ieşire
10 5
7 2 8 1 3 9 7 5 6 1
1 2 3 1 8 9 7 5 6 7

Problema 7.

Să se scrie un program care citește o matrice A(m x n) și copiază elementele matricei în spirală într-un vector V. Veți folosi urmatoarele funcții:

void spirala (int A[][100], int m, int n, int V[]); // copiază elementele lui A în V, în spirală

void afisare (int V[], int dim); // afișează un vector V, de dimensiune dim

Exemplu:

Intrare Ieşire
3 4
1 2 3 4
5 6 7 8
9 10 11 12
1 5 9 10 11 12 8 4 3 2 6 7

Probleme suplimentare