C# pentru începători

Șiruri C#: numărarea vocalelor și comparații explicite

Numără vocalele unui text în C# folosind string și reguli explicite pentru majuscule. Vezi indexarea, cazul gol și limitele alfabetului ales.

Un string C# reprezintă text și permite accesul la elemente prin indici. În acest exercițiu folosim numai caractere latine simple, cifre, spații și semne de punctuație ASCII. Definim vocalele drept a, e, i, o, u și variantele lor majuscule. Litera y nu este vocală în contractul nostru.

Această restricție face numărarea precisă și ușor de urmărit. Nu pretindem că fiecare element char corespunde oricărei litere pe care o vede cititorul într-un text Unicode. Pentru diacritice sau caractere compuse trebuie stabilite separat regulile de clasificare și normalizare.

Intrare și rezultat

Citim o linie de cel mult 200 de caractere ASCII. Sfârșitul intrării înaintea liniei este tratat ca text gol. Afișăm numărul vocalelor și numărul consoanelor latine, separate prin spațiu. Cifrele, spațiile și punctuația nu contribuie. Pentru lungime mai mare de 200 sau caractere în afara intervalului ASCII 0..127 afișăm INVALID. Pozițiile textului sunt 0..Length−1.

Exemplu urmărit

Pentru „Ana are 2 mere!”, vocalele sunt A, a, a, e, e, e: șase apariții. Consoanele sunt n, r, m, r: patru apariții. Cifra 2, spațiile și semnul exclamării nu intră în nicio categorie. Rezultatul este 6 4. Nu numărăm vocale distincte: fiecare apariție contribuie separat, chiar dacă litera e se repetă.

În Ana are 2 mere!, cele patru fragmente contribuie cu 2, 2, 0, 2 vocale și 1, 1, 0, 2 consoane.În Ana are 2 mere!, cele patru fragmente contribuie cu 2, 2, 0, 2 vocale și 1, 1, 0, 2 consoane.Mărește schema ↗

De ce funcționează

Parcurgem fiecare poziție exact o dată. Dacă întâlnim o majusculă din A..Z, o transformăm în litera mică echivalentă prin deplasarea dintre codurile ASCII. Dacă rezultatul nu este în a..z, îl ignorăm. Pentru o literă latină verificăm explicit cele cinci vocale; orice altă literă din alfabetul declarat este consoană. După fiecare pas, cele două numărătoare descriu exact prefixul procesat. Transformarea este locală în variabila ch și nu modifică textul original.

Limite și greșeli de evitat

Timpul este O(L), unde L este lungimea liniei, iar memoria suplimentară O(1), în afara textului citit. Nu folosi o condiție de forma ch == 'a' || 'e': fiecare parte a operatorului || trebuie să fie o expresie bool completă. Nu clasifica drept consoană orice caracter care nu este vocală; altfel ai număra și cifra sau spațiul. Verificarea apartenenței la alfabet trebuie făcută înainte de această alegere.

Program complet C#

using System;
class Program
{
    static void Main()
    {
        string text = Console.ReadLine() ?? "";
        if (text.Length > 200) { Console.WriteLine("INVALID"); return; }
        int vowels = 0, consonants = 0;
        foreach (char original in text)
        {
            if (original > 127) { Console.WriteLine("INVALID"); return; }
            char ch = original;
            if (ch >= 'A' && ch <= 'Z') ch = (char)(ch - 'A' + 'a');
            if (ch < 'a' || ch > 'z') continue;
            if (ch == 'a' || ch == 'e' || ch == 'i' || ch == 'o' || ch == 'u') vowels++;
            else consonants++;
        }
        Console.WriteLine($"{vowels} {consonants}");
    }
}

Exersează

  1. Pentru „AEIOU”, rezultatul este 5 0, deoarece acceptăm majusculele.
  2. Pentru „123 !”, rezultatul este 0 0: lipsesc literele.
  3. Pentru „yyy”, rezultatul este 0 3, conform definiției explicite a vocalelor. Dacă o altă cerință include y între vocale, modifici regula de clasificare, nu parcurgerea.

Continuă studiul

Recapitulează Primul program C#: Console.WriteLine și Main. Recapitulează Condiții în C#: if, else și operatori logici. Recapitulează Bucla for în C#: numărare și acumulare.

Întrebări frecvente

Numărăm vocale distincte sau toate aparițiile?

Toate aparițiile. Două litere a de la poziții diferite cresc numărătorul de două ori.

Sunt tratate majusculele?

Da. Pentru alfabetul ASCII ales, literele A..Z sunt transformate local în variantele mici înainte de clasificare.

Programul tratează și diacriticele românești?

Nu în acest contract. El acceptă numai ASCII și respinge alte caractere, pentru a nu produce o clasificare incompletă prezentată drept generală.

Un pas mai departe

Autentifică-te pentru a păstra progresul în cont.

Exersează cu o problemă →