Programarea Calculatoarelor, seria CC

Laborator 11

Programare generică

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



Problema 1 - Problemă rezolvată.

Scrieți un program care citește un n de la tastatură și creează un vector (cu dimensiunea n) de numere întregi generate aleator și îl sortează ulterior folosind funcția de bibliotecă void qsort din stdlib.h:

void qsort ( void * base, size_t num, size_t size, int ( * comparator ) ( const void *, const void * ) )

Implementați o funcție de comparare în care să apelați qsort cu parametrii corespunzători.
Rezolvare:

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

#define MAX_VALUE 200

int cmp(const void * a, const void *b)
{
    return (*(int*)a - *(int*)b);
}

int main(void)
{
    int N, i;
    int *v;
    printf("Introduceti dimensiunea vectorului:\n");
    scanf("%d", &N);

    v = calloc(N, sizeof(int));
    if (!v) printf("Nu am putut aloca memorie pentru v!\n");

    srand(time(NULL));
    for (i = 0; i < N; ++i)
        v[i] = (rand() % MAX_VALUE)+1;

    for (i = 0; i < N; ++i)
        printf("%d ", *(v+i));
    printf("\n");

    qsort(v, N, sizeof(int), cmp);

    for (i = 0; i < N; ++i)
        printf("%d ", *(v+i));
    printf("\n");

    free(v);
    return 0;
}

Problema 2.

Completați programul de la problema 1 astfel încât să se afișeze poziția pe care apare un întreg x citit de la tastatură în vectorul sortat. Veți folosi funcția void *bsearch din stdlib.h:

void *bsearch ( const void * key, void * base, size_t num, size_t size, int ( * comparator ) ( const void *, const void * ) )

Funcția întoarce un pointer către elementul din vector corespunzător cheii căutate sau NULL dacă nu a fost găsit un astfel de element.


Problema 3.

Se consideră următoarele definiții:

typedef struct entry {
    void * key;
    void * value;
} entry;

typedef struct map {
    entry ** elem; // vectorul de elemente; este alocat si realocat dinamic
    int n_elem; // numarul de elemente din vector
    int cap; // capacitatea vectorului
} map;
Definiți următoarele funcții: Pentru a testa funcțiile definite vom face următoarea particularizare: vrem să reținem definițiile asociate unor cuvinte. Va trebui să implementați funcțiile:
În programul principal, afișați un meniu ce va permite următoarele operații la apăsarea respectivelor taste: Aveți grijă să alocați memorie pentru fiecare cuvânt și pentru fiecare definiție și să o eliberați atunci când nu mai este nevoie (de ex. la ștergerea unui cuvânt). Puteți să le citiți inițial într-un buffer alocat static și să folosiți funcția strdup.