Laborator 7: Prelucrarea şirurilor de caractere. Funcţii. Aplicaţii

Obiectivele laboratorului:

În acest laborator vom studia:

De asemenea, vom exersa lucrul cu pointeri și alocare dinamică pentru a realiza programe care manipulează în mod eficient șiruri de caractere.

De fiecare dată când uitați sa eliberați memoria, un ponei moare. Aveți grijă de ei!

  1. a. Să se determine dacă un string este palindrom. Un string este un palindrom dacă citit de la primul caracter până la ultimul are aceeași succesiune ca citită de la ultimul până la primul. Se citește un string de la tastatură. Să afișeze PALINDROME / NOT PALINDROME.

    Trebuie să scrieți o funcție is_palindrome. La acest exercitiu este irelevant cum e alocat stringul.

    b. Modificați funcția astfel încât să nu conteze dacă sunt litere mici sau mari (hint).

    c. Actualizați funcția astfel încât stringul citit și dat funcției să poată să conțină o propoziție (cuvinte + spații). (ex. “ele fac cafele” sau “gigel e legig” - facem abstracție de spații). Hint: Cu scanf %s ne oprim la whitespace. Putem folosi fgets:

    char s[NMAX];
    fgets(s, NMAX, stdin); // citeste in s un sir de caractere, de la tastatura
                           // (cu tot cu whitespace). Se vor citi maxim NMAX-1
                           // caractere, si nu exista riscul sa depasim bufferul.
    
    is_palindrome(s);      // returneaza 0 sau 1
    
  2. Să se citească un vector v de n cuvinte (alocat dinamic). Să se implementeze funcția sort_strings:

    // sortează vector-ul de stringuri astfel;
    // - crescator dupa lungimea acestora
    // - in caz de egalitate, se va aplica criteriul lexicografic.
    // n = nr de stringuri
    // v = vector de stringuri
    void sort_strings(int n, char **v);
    
  3. a. Folosind funcția strtok, citiţi un şir de caractere şi afişaţi pe ecran cuvintele sale constituente. Un cuvânt este orice succesiune de caractere printabile delimitate de whitespace și semne de punctuație (spațiu, tab, newline, punct, punct și virgulă, virgulă, semnul întrebării / exclamării).

    // exemplu de string citit cu fgets
    "Who is number #5 in this top, according to Gigel?"
    // cuvintele extrase
    "Who", "is", "number", "#5", "in", "this", "top", "according", "to", "Gigel"
    

    b. Numărați cuvintele adevărate! (conțin doar litere).

    Pentru exemplu de mai sus se va afisa “#words = 9” (numărul de tokeni găsiți de strtok este 10, dar #5 nu este cuvânt).Hint

  4. Se dă o propoziție într-un șir de caractere s. Se mai dă în plus un string word care reprezintă un cuvânt. Să se determine numarul de apariții a lui word în acea propozitie.

    char s[] = "Gigel is Gigel all the time except when isn't Gigel, but he is still a gigel...";
    char word[] = "Gigel";
    int cnt = count_occurences(s, word); // cnt va fi 3, pt ca Gigel apare de 3 ori in s
    
  5. [BONUS] a. Se dau un caracter c și un string s. Afișați pe ecran toate pozițiile din s unde apare c.

    char s[] = "xlm_xlt_xgm_xmm_xxt";
    char c = 'x';
    print_all_char_occurrences(c, s); // 0 4 8 12 16 17
    

    b. Se dau un string word și un string s. Afișați pe ecran toate pozițiile din s unde apare word.

    char s[] = "xlm_xlt_xgm_xlm_xxt";
    char word[] = "xlm";
    print_all_str_occurrences(word, s); // 0 12
    
  6. [BONUS] Se dă n de la tastatură. Citiţi n studenți dați prin nume, prenume şi vârsta. Nu se cunoașțe altceva despre date, deci prin urmare orice tablou va fi alocat dinamic. Afişaţi pe ecran, în funcţie de opţiunea selectată, lista citită de la tastatură, ordonată în funcţie de opțiunea opt:

    • dacă opt == 1, se va sorta crescător după nume
    • dacă opt == 2, se va sorta crescător după prenume
    • dacă opt == 0, se va sorta descrescător după vârstă; în caz de egalitate dupa vârstă, se va sorta lexicografic după nume; în caz de egalitate după nume, se va sorta invers lexicografic după prenume.