Cum funcționează
Două lucruri contează aici, și amândouă sunt despre citire și caractere.
Citirea unei linii întregi din fişier. Se folosește f.getline(s, 201), nu f >> s. Cu >>
citirea se oprește la primul spațiu, deci ai prelua doar ELEVUL. getline ia tot rândul, cu
spații și semne de punctuație.
Dimensiunea e 201, nu 200: textul are cel mult 200 de caractere, plus terminatorul '\0' pe
care C++ îl adaugă la final. Fără locul lui, ai scrie în afara șirului.
Tratarea majusculelor. Enunțul cere și A, și a. În loc să scrii zece comparații, convertești
caracterul la literă mică și compari cu cinci:
if (c >= 'A' && c <= 'Z') c = c + 32;
Funcționează pentru că, în tabela ASCII, literele mici sunt exact cu 32 de poziții după cele
mari: 'A' are codul 65, 'a' are 97. Adunarea lui 32 transformă orice majusculă în minuscula ei.
Verificarea c >= 'A' && c <= 'Z' e necesară — altfel ai strica cifrele și semnele de punctuație.
Parcurgerea merge până la '\0', terminatorul pus automat de getline. Nu ai nevoie de lungimea
șirului.
Funcția separată esteVocala nu e obligatorie, dar face codul mult mai citibil și e apreciată la
barem.
Greșeli frecvente
f >> s în loc de f.getline — se citește doar primul cuvânt, iar rezultatul e prea mic.
char s[200] — nu rămâne loc pentru terminator la un text de exact 200 de caractere.
- Verificarea doar a literelor mici — se pierd
E, E, U din primul exemplu (rezultat 10 în
loc de 13).
- Conversia fără verificare (
c = c + 32 aplicat la orice) — cifrele devin alte caractere și
pot ajunge accidental să pară vocale.
- Verificarea
nr > 0 uitată — la un text fără vocale se afișează 0 în loc de NU.