PCLP Laborator05: Problemset (extra)

Probleme extra propuse pentru PCLP Laborator05.

  1. Realizați funcția my_strlen care calculează lungimea unui șir de caractere folosindu-vă doar de pointeri. Utilizarea funcțiilor din string.h nu este permisă!

    Exemplu

    • Input:
    s = "Hello World!"
    
    • Output:
    my_strlen(s) = 12
    
  2. Realizați funcția my_swap care interschimbă 2 vectori de numere. Funcția trebuie să facă o singură interschimbare!

    Exemplu

    • Input:
    n = 5
    v = {1, 2, 3, 4, 5}
    w = {6, 7, 8, 9, 10}
    
    • Output:
    v = {6, 7, 8, 9, 10}
    w = {1, 2, 3, 4, 5}
    
  3. Realizați funcția my_reverse care inversează un vector de numere.

    Exemplu

    • Input:
    n = 5
    v = {1, 2, 3, 4, 5}
    
    • Output:
    v = {5, 4, 3, 2, 1}
    

    Folosiți operații pe biți asupra pointerilor pentru a reface funcția my_reverse. Puteti citi aici despre operatii pe biti si aici despre algoritmul de swap folosind operatii pe biti.

    Realizați funcția my_reverse fără să folosiți [].

  4. Realizați funcția my_strcmp care primește două șiruri de caractere și le compără, returnând 1 dacă primul e mai mare lexicografic, 0 dacă sunt echivalente, și -1 dacă al doilea este mai mare lexicografic.

    Exemplu 1

    • Input:
    str1 = "Alexandru"
    str2 = "Alexandra"
    
    • Output:
    1
    
    • Explicație: Șirurile sunt egale până la ultimul caracter, care este mai mare în cazul lui str1, deoarece 'u' > 'a'.

    Exemplu 2

    • Input:
    str1 = "Cătălin"
    str2 = "Cătălina"
    
    • Output:
    -1
    
    • Explicație: Șirurile sunt egale până la ultimul caracter, care este mai mic în cazul lui str1, deoarece '\0' < 'a'.

    Exemplu 3

    • Input:
    str1 = "Pascal"
    str2 = "Pascal"
    
    • Output:
    0
    
    • Explicație: Șirurile sunt egale până la final, așa că funcția returnează 0.

    Realizați și funcția my_strncmp, care are același comportament, doar că se oprește după n caractere.

  5. Calculați, folosind pointeri și două variabile locale, mărimea unui int, unui short, unui char, unui int* și a unui long.

    Exemplu

    • Input:
    long a, b;
    
    • Output:
    8
    
    • Explicatie: Mărimea unui long este 8(pe arhitectura x86_64).
  6. Realizați funcția my_memset care primește o adresă de tip void *, o valoare și o lungime, și care setează fiecare byte de la adresa primită cu valoarea dată până când ajunge la lungimea primită.

    Exemplu 1

    • Input:
    char v[10]= {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
    my_memset((void*)v, 0, 5);
    
    • Output:
    v = {0, 0, 0, 0, 0, 6, 7, 8, 9, 10};
    

    Exemplu 2

    • Input:
    int v[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
    my_memset((void*)v, 1, 4);
    
    • Output:
    v = {16843009, 2, 3, 4, 5, 6, 7, 8, 9, 10};
    
    • Explicație: my_memset lucrează byte cu byte, deci primul int devine 0x01010101.