1. Ce este un sir de caractere? Creare si acces
str; fiecare caracter este accesat printr-un indice intreg care incepe de la 0.
s = I n f o r m a t i c a poz: 0 1 2 3 4 5 6 7 8 9 10 neg: -11-10 -9 -8 -7 -6 -5 -4 -3 -2 -1
# Crearea unui sir de caractere si accesarea elementelor s = "Informatica" print("Sirul:", s) print("Lungimea:", len(s)) print("Primul caracter:", s[0]) print("Ultimul caracter:", s[-1]) print("Caracterul de pe pozitia 3:", s[3])
Sirul: Informatica Lungimea: 11 Primul caracter: I Ultimul caracter: a Caracterul de pe pozitia 3: o
2. Parcurgerea unui sir de caractere
# Parcurgerea unui sir de caractere s = "Python" print("Parcurgere cu indice:") for i in range(len(s)): print(f" s[{i}] = '{s[i]}'") print("Parcurgere directa (for-each):") for c in s: print(f" '{c}'", end=" ") print()
Parcurgere cu indice: s[0] = 'P' s[1] = 'y' s[2] = 't' s[3] = 'h' s[4] = 'o' s[5] = 'n' Parcurgere directa (for-each): 'P' 'y' 't' 'h' 'o' 'n'
def numara_vocale(s): vocale = "aeiouAEIOU" contor = 0 for c in s: if c in vocale: contor += 1 return contor print(numara_vocale("Structuri de date")) # Output real: 6
3. Cautarea intr-un sir de caractere
# Cautarea intr-un sir s = "structuri de date" # Cautare manuala O(n) def cauta_caracter(sir, c): for i in range(len(sir)): if sir[i] == c: return i return -1 poz = cauta_caracter(s, 'd') print("Cautare manuala a lui 'd':", poz) # Metode Python predefinite print("Metoda find('d'):", s.find('d')) print("Metoda index('d'):", s.index('d')) print("Metoda count('t'):", s.count('t')) print("'date' in s:", 'date' in s) print("'matrice' in s:", 'matrice' in s)
Cautare manuala a lui 'd': 10
Metoda find('d'): 10
Metoda index('d'): 10
Metoda count('t'): 3
'date' in s: True
'matrice' in s: False
find() returneaza -1 daca nu gaseste; index() arunca ValueError. Prefer find() in cod defensiv.
4. Prelucrarea sirurilor: metode si slice-uri
# Metode str uzuale s = " Buna ziua, Lume! " print("strip(): |" + s.strip() + "|") print("upper(): " + s.strip().upper()) print("lower(): " + s.strip().lower()) print("replace: " + s.strip().replace("Lume", "Romania")) s2 = "ana are mere" print("split(): ", s2.split()) print("startswith: ", s2.startswith("ana")) print("endswith: ", s2.endswith("pere"))
strip(): |Buna ziua, Lume!| upper(): BUNA ZIUA, LUME! lower(): buna ziua, lume! replace: Buna ziua, Romania! split(): ['ana', 'are', 'mere'] startswith: True endswith: False
# Slice-uri: s[start:stop:step] s = "programare" print("s[0:4] :", s[0:4]) # primele 4 caractere print("s[4:] :", s[4:]) # de la pozitia 4 la final print("s[::2] :", s[::2]) # fiecare al 2-lea caracter print("s[::-1] :", s[::-1]) # inversat # Imutabilitate — nu poti modifica direct un caracter try: s[0] = 'P' except TypeError as e: print("Imutabilitate:", e) s_nou = 'P' + s[1:] # solutie: creare sir nou print("Nou dupa 'modificare':", s_nou)
s[0:4] : prog s[4:] : ramare s[::2] : pormr s[::-1] : eramargorp Imutabilitate: 'str' object does not support item assignment Nou dupa 'modificare': Programare
def e_palindrom(s): s = s.lower() # ignoram majusculele return s == s[::-1] print(e_palindrom("radar")) # True print(e_palindrom("Ana")) # True (case-insensitive) print(e_palindrom("coapsa")) # False
5. Clasa string in C++ EXCLUSIV INTENSIV
In C++, #include <string> ofera clasa string. Spre deosebire de Python, string-urile C++ sunt mutabile — poti modifica direct orice caracter cu s[i] = 'x'.
#include <iostream> #include <string> #include <algorithm> using namespace std; int main() { string s = "Informatica"; cout << "Sirul: " << s << endl; cout << "Lungimea: " << s.length() << endl; cout << "Primul caracter: " << s[0] << endl; cout << "Ultimul caracter: " << s[s.length()-1] << endl; // Parcurgere cu indice cout << "Caractere: "; for (int i = 0; i < (int)s.length(); i++) cout << s[i] << " "; cout << endl; // Cautare — string::npos daca nu gaseste size_t poz = s.find('a'); if (poz != string::npos) cout << "Prima 'a' la pozitia: " << poz << endl; // Majuscule cu transform din <algorithm> string s2 = s; transform(s2.begin(), s2.end(), s2.begin(), ::toupper); cout << "Uppercase: " << s2 << endl; // substr(pozitie_start, lungime) cout << "Primele 5 caractere: " << s.substr(0, 5) << endl; // Mutabilitate: modificare directa s[0] = 'i'; cout << "Dupa s[0]='i': " << s << endl; return 0; }
Sirul: Informatica Lungimea: 11 Primul caracter: I Ultimul caracter: a Caractere: I n f o r m a t i c a Prima 'a' la pozitia: 6 Uppercase: INFORMATICA Primele 5 caractere: Infor Dupa s[0]='i': informatica
- Python
str: imutabil |len(s)|find()returneaza -1 la esec - C++
string: mutabil |s.length()|find()returneazastring::nposla esec
6. Criptarea sirurilor: Cifrul Caesar EXCLUSIV INTENSIV
Programa cls. X intensiv include explicit criptarea/decriptarea sirurilor de caractere. Cifrul Caesar este exemplul clasic: fiecare litera este deplasata in alfabet cu o valoare fixa.
c cu deplasare d:litera_criptata = chr( (ord(c) - ord('A') + d) % 26 + ord('A') )Modulo 26 asigura rotatie: dupa 'Z' revenim la 'A'. Decriptarea = aceeasi formula cu
-d.
# Cifrul Caesar — O(n), n = lungimea mesajului def cifru_caesar(s, deplasare): rezultat = '' for c in s: if c.isalpha(): baza = ord('A') if c.isupper() else ord('a') rezultat += chr((ord(c) - baza + deplasare) % 26 + baza) else: rezultat += c # spatii, cifre, semne raman neschimbate return rezultat mesaj = "Informatica este frumoasa" criptat = cifru_caesar(mesaj, 3) decriptat = cifru_caesar(criptat, -3) print("Original: ", mesaj) print("Criptat: ", criptat) print("Decriptat:", decriptat)
Original: Informatica este frumoasa Criptat: Lqirupdwlfd hvwh iuxprdvd Decriptat: Informatica este frumoasa
Decriptarea = criptare cu
-d (echivalent cu deplasare 26 - d).Atentie: cifrul Caesar nu este sigur criptografic — are doar 25 chei posibile, vulnerabil la brute-force.