PCLP Laborator07: Problemset (extra)

Probleme extra propuse pentru PCLP Laborator07.

  1. Implementați funcția my_strcmpi(const char *s1, const char *s2) care va întoarce:

    • 0 dacă cele două string-uri sunt egale;
    • < 0 dacă șirul de caractere s1 se află înaintea lui s2 în ordine lexicografică;
    • > 0 dacă șirul de caractere s2 se află înaintea lui s1 în ordine lexicografică.

    În cazul în care cere 2 șiruri au lungimi diferite, face comparația caracter cu caracter până la caracterul special '\0', inclusiv.

    Comparația se va face fără a ține cont de diferențele între literele mici și mari, iar implementarea se va face fără a folosi funcția strlen și/sau operatorul [].

  2. Scrieți o funcție void count_vowels(const char *s, int counts[]) care primește ca prim parametru un șir de caractere și întoarce (prin al 2-lea parametru) numărul de apariții al fiecărei vocale a limbii engleze.

    Numărarea nu va face diferență între literele mari sau cele mici.

    De exemplu, pentru șirul de intrare "Ana are mere.", rezultatul va fi {3, 3, 0, 0, 0}, deoarece vocalele a și e apar de exact 3 ori fiecare, iar vocalele i, o și u nu apar deloc în text.

  3. Scrieți un program care citește linie cu linie perechi de câte 2 cuvinte, iar pentru fiecare pereche afișează textul DA, dacă cuvintele sunt unul anagrama celuilalt, respectiv NU în caz contrar.

    Citirea se va încheia atunci când de la tastatură se citește fie o linie goală, fie o linie care nu conține exact 2 cuvinte separate prin spațiu.

    Hint: Un cuvânt este anagrama unui alt cuvând dacă este format din exact aceleași litere, dar în altă ordine. Numărul de apariții al fiecărei litere trebuie să fie egal în ambele cuvinte.

  4. Să se scrie funcția: char* case_reverse(char* string);

Funcția primește ca parametru un șir de caractere (string) și returnează un nou șir, alocat dinamic, în care:

Observație: Apelantul este responsabil să elibereze memoria alocată dinamic pentru șirul returnat.

a) Să se implementeze funcția case_reverse folosind funcțiile din <ctype.h> (de exemplu islower, isupper, tolower, toupper).

b) Să se rescrie funcția astfel încât schimbarea capitalizării să fie realizată doar folosind operații pe biți (de exemplu &, |, ^), fără a apela funcțiile din <ctype.h> pentru conversia între litere mici și mari. Se vor trata doar literele din alfabetul englez ('A''Z', 'a''z').

Exemplu

Pentru șirul de intrare:
"Abc DeF 123!"

un apel corect al funcției case_reverse trebuie să producă șirul:
"aBC dEf 123!"