Typ char w C#

Czym jest char?

char to typ wartościowy reprezentujący pojedynczy znak Unicode. W odróżnieniu od string, który może zawierać wiele znaków, char zawsze reprezentuje dokładnie jeden znak.

char literaA = 'A';           // Literki w apostrofach!
char cyfra5 = '5';
char spacja = ' ';
char nowаLinia = '\n';
string tekst = "ABC";         // String w cudzysłowach!

Console.WriteLine($"Char: {literaA}");     // A
Console.WriteLine($"String: {tekst}");     // ABC

Kluczowe różnice char vs string:

Właściwośćcharstring
CudzysłowyApostrof 'A'Cudzysłów "ABC"
Liczba znakówDokładnie 10 lub więcej
TypWartościowyReferencyjny
Rozmiar16 bitów (2 bajty)Zmienny
ZmiennośćMożna zmieniaćNiemutowalny

Reprezentacja Unicode

char literaA = 'A';
char polskieA = 'ą';
char emoji = '😀';
char chińskiZnak = '中';

Console.WriteLine($"A = {literaA} (kod: {(int)literaA})");        // A (kod: 65)
Console.WriteLine($"ą = {polskieA} (kod: {(int)polskieA})");      // ą (kod: 261)
Console.WriteLine($"😀 = {emoji} (kod: {(int)emoji})");          // 😀 (kod: 55357)
Console.WriteLine($"中 = {chińskiZnak} (kod: {(int)chińskiZnak})"); // 中 (kod: 20013)

Wyjaśnienie funkcji:

  • (int)char – konwersja char na jego kod Unicode (liczba całkowita)
  • Każdy znak ma swój unikalny numer w tabeli Unicode
  • ASCII (0-127) to podzbiór Unicode dla podstawowych znaków angielskich
  • Unicode obsługuje znaki wszystkich języków świata

2. Tworzenie i inicjalizacja zmiennych char

2.1 Podstawowe sposoby

// Bezpośrednie przypisanie znaku
char litera = 'X';
char cyfra = '7';
char znak = '@';

// Przez kod Unicode
char literaA1 = (char)65;      // 'A' (kod ASCII 65)
char literaA2 = '\u0041';      // 'A' (Unicode hex)
char polskieL = '\u0142';      // 'ł' (Unicode hex)

// Znaki specjalne (escape sequences)
char tab = '\t';               // Tabulator
char nowaLinia = '\n';         // Nowa linia
char backslash = '\\';         // Ukośnik wsteczny
char apostrof = '\'';          // Apostrof
char cudzysłów = '\"';         // Cudzysłów

Console.WriteLine($"Tab:|{tab}|");
Console.WriteLine($"Nowa linia:|{nowaLinia}|");
Console.WriteLine($"Backslash: {backslash}");
Console.WriteLine($"Apostrof: {apostrof}");
Console.WriteLine($"Cudzysłów: {cudzysłów}");

Wyjaśnienie funkcji i składni:

  • 'X' – literał char (zawsze w apostrofach)
  • (char)liczba – konwersja liczby na char według kodu Unicode
  • '\u0041' – zapis Unicode w systemie szesnastkowym (hex)
  • \t, \n, \\, \', \" – znaki specjalne (escape sequences)
  • Escape sequences pozwalają reprezentować znaki, których nie da się wpisać bezpośrednio

2.2 Konwersje między typami

// char → int (kod Unicode)
char znak = 'B';
int kod = (int)znak;
Console.WriteLine($"'{znak}' ma kod: {kod}");  // 'B' ma kod: 66

// int → char
int kodLitery = 67;
char litera = (char)kodLitery;
Console.WriteLine($"Kod {kodLitery} to znak: '{litera}'");  // Kod 67 to znak: 'C'

// char → string
char pojedynczyZnak = 'D';
string stringZZnaku = pojedynczyZnak.ToString();
// lub
string stringZZnaku2 = $"{pojedynczyZnak}";
Console.WriteLine($"Char jako string: {stringZZnaku}");

// string → char (pierwszy znak)
string tekst = "Hello";
char pierwszyZnak = tekst[0];
Console.WriteLine($"Pierwszy znak z '{tekst}': '{pierwszyZnak}'");  // 'H'

Wyjaśnienie funkcji:

  • (int)char – jawna konwersja char na int (kod Unicode)
  • (char)int – jawna konwersja int na char (może rzucić wyjątek jeśli kod nieprawidłowy)
  • char.ToString() – konwertuje char na string o długości 1
  • string[indeks] – dostęp do char na danej pozycji w stringu (od poprzedniej lekcji)

3. Metody klasy char do klasyfikacji znaków

3.1 Sprawdzanie typu znaku

char[] testowZnaki = {'A', 'a', '5', ' ', '@', '\t', 'ą', '.'};

foreach (char c in testowZnaki)
{
    Console.WriteLine($"\nZnak: '{c}' (kod: {(int)c})");
    Console.WriteLine($"  Litera: {char.IsLetter(c)}");
    Console.WriteLine($"  Cyfra: {char.IsDigit(c)}");
    Console.WriteLine($"  Biały znak: {char.IsWhiteSpace(c)}");
    Console.WriteLine($"  Wielka litera: {char.IsUpper(c)}");
    Console.WriteLine($"  Mała litera: {char.IsLower(c)}");
    Console.WriteLine($"  Litera lub cyfra: {char.IsLetterOrDigit(c)}");
    Console.WriteLine($"  Znak interpunkcyjny: {char.IsPunctuation(c)}");
    Console.WriteLine($"  Symbol: {char.IsSymbol(c)}");
    Console.WriteLine($"  Kontrolny: {char.IsControl(c)}");
}

Wyjaśnienie funkcji char.Is…():

  • char.IsLetter(c) – sprawdza czy to litera (a-z, A-Z, ą, ć, itp.)
  • char.IsDigit(c) – sprawdza czy to cyfra (0-9)
  • char.IsWhiteSpace(c) – sprawdza czy to biały znak (spacja, tab, nowa linia)
  • char.IsUpper(c) – sprawdza czy to wielka litera
  • char.IsLower(c) – sprawdza czy to mała litera
  • char.IsLetterOrDigit(c) – sprawdza czy to litera lub cyfra (alfanumeryczny)
  • char.IsPunctuation(c) – sprawdza czy to znak interpunkcyjny (. , ! ? ; 🙂
  • char.IsSymbol(c) – sprawdza czy to symbol (@, #, $, %, &, *)
  • char.IsControl(c) – sprawdza czy to znak kontrolny (\n, \t, \r)

3.2 Konwersje wielkości liter

char[] litery = {'A', 'b', 'Ć', 'ł', '5', '@'};

Console.WriteLine("Oryginał → Wielka → Mała");
Console.WriteLine("------------------------");

foreach (char c in litery)
{
    char wielka = char.ToUpper(c);
    char mała = char.ToLower(c);
    Console.WriteLine($"   '{c}'   →  '{wielka}'  →  '{mała}'");
}

Wyjaśnienie funkcji:

  • char.ToUpper(c) – konwertuje znak na wielką literę (jeśli to możliwe)
  • char.ToLower(c) – konwertuje znak na małą literę (jeśli to możliwe)
  • Jeśli znak nie jest literą, zwraca oryginalny znak bez zmian
  • Obsługuje polskie znaki diakrytyczne (ą, ć, ę, ł, ń, ó, ś, ź, ż)

4. Praktyczne zastosowania char

4.1 Walidacja danych wejściowych

static bool CzyPrawidłowyLogin(string login)
{
    // Login musi mieć 3-15 znaków i zawierać tylko litery, cyfry i _
    if (login.Length < 3 || login.Length > 15)
        return false;
    
    // Pierwszy znak musi być literą
    if (!char.IsLetter(login[0]))
        return false;
    
    // Sprawdzamy każdy znak
    foreach (char c in login)
    {
        if (!char.IsLetterOrDigit(c) && c != '_')
        {
            return false;
        }
    }
    
    return true;
}

// Testowanie
string[] loginy = {"user1", "123abc", "a", "very_long_username_too_long", "user@123", "User_123"};

foreach (string login in loginy)
{
    bool prawidłowy = CzyPrawidłowyLogin(login);
    Console.WriteLine($"Login '{login}': {(prawidłowy ? "✅ OK" : "❌ Błędny")}");
}

Wyjaśnienie funkcji:

  • string.Length – właściwość zwracająca liczbę znaków w stringu
  • login[0] – dostęp do pierwszego znaku (char) w stringu
  • foreach (char c in string) – iteracja przez każdy znak w stringu
  • && – operator logiczny AND (wszystkie warunki muszą być prawdziwe)
  • ! – operator logiczny NOT (negacja)

4.2 Generator hasła

using System;

class GeneratorHasła
{
    static void Main()
    {
        Console.Write("Podaj długość hasła (8-50): ");
        if (int.TryParse(Console.ReadLine(), out int długość) && długość >= 8 && długość <= 50)
        {
            string hasło = GenerujHasło(długość);
            Console.WriteLine($"Wygenerowane hasło: {hasło}");
            AnalizujHasło(hasło);
        }
        else
        {
            Console.WriteLine("Nieprawidłowa długość!");
        }
    }
    
    static string GenerujHasło(int długość)
    {
        Random rand = new Random();
        char[] hasło = new char[długość];
        
        // Zestawy znaków
        string małeLitery = "abcdefghijklmnopqrstuvwxyz";
        string wielkieLitery = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
        string cyfry = "0123456789";
        string znakiSpecjalne = "!@#$%^&*()_+-=[]{}|;:,.<>?";
        
        string wszystkieZnaki = małeLitery + wielkieLitery + cyfry + znakiSpecjalne;
        
        // Zapewniamy przynajmniej jeden znak z każdej grupy
        hasło[0] = małeLitery[rand.Next(małeLitery.Length)];
        hasło[1] = wielkieLitery[rand.Next(wielkieLitery.Length)];
        hasło[2] = cyfry[rand.Next(cyfry.Length)];
        hasło[3] = znakiSpecjalne[rand.Next(znakiSpecjalne.Length)];
        
        // Pozostałe znaki losowo
        for (int i = 4; i < długość; i++)
        {
            hasło[i] = wszystkieZnaki[rand.Next(wszystkieZnaki.Length)];
        }
        
        // Mieszamy hasło
        for (int i = 0; i < długość; i++)
        {
            int j = rand.Next(długość);
            (hasło[i], hasło[j]) = (hasło[j], hasło[i]); // Swap
        }
        
        return new string(hasło);
    }
    
    static void AnalizujHasło(string hasło)
    {
        int małeLitery = 0, wielkieLitery = 0, cyfry = 0, znakiSpecjalne = 0;
        
        foreach (char c in hasło)
        {
            if (char.IsLower(c))
                małeLitery++;
            else if (char.IsUpper(c))
                wielkieLitery++;
            else if (char.IsDigit(c))
                cyfry++;
            else
                znakiSpecjalne++;
        }
        
        Console.WriteLine("\n=== ANALIZA HASŁA ===");
        Console.WriteLine($"Długość: {hasło.Length}");
        Console.WriteLine($"Małe litery: {małeLitery}");
        Console.WriteLine($"Wielkie litery: {wielkieLitery}");
        Console.WriteLine($"Cyfry: {cyfry}");
        Console.WriteLine($"Znaki specjalne: {znakiSpecjalne}");
        
        // Ocena siły hasła
        int punkty = 0;
        if (małeLitery > 0) punkty++;
        if (wielkieLitery > 0) punkty++;
        if (cyfry > 0) punkty++;
        if (znakiSpecjalne > 0) punkty++;
        if (hasło.Length >= 12) punkty++;
        
        string siła = punkty switch
        {
            <= 2 => "Słabe",
            3 => "Średnie", 
            4 => "Silne",
            5 => "Bardzo silne",
            _ => "Nieznane"
        };
        
        Console.WriteLine($"Siła hasła: {siła} ({punkty}/5 punktów)");
    }
}

Wyjaśnienie nowych funkcji:

  • int.TryParse(string, out int) – próbuje przekonwertować string na int, zwraca true/false
  • out – słowo kluczowe pozwalające funkcji zwrócić dodatkową wartość
  • Random.Next(max) – generuje losową liczbę od 0 do max-1
  • new string(char[]) – konstruktor tworzący string z tablicy char
  • (a, b) = (b, a) – tuple swap (zamiana miejscami dwóch zmiennych)
  • switch expression – nowoczesna składnia switch w C#
  • _ – wildcard pattern (domyślny przypadek w switch expression)

5. Połączenie z – char, string i pliki

5.1 Analizator częstotliwości znaków w pliku

using System;
using System.IO;
using System.Collections.Generic;
using System.Linq;

class AnalizatorZnaków
{
    static void Main()
    {
        string nazwaPliku = "tekst_do_analizy.txt";
        
        // Tworzymy przykładowy plik z różnymi znakami
        if (!File.Exists(nazwaPliku))
        {
            string przykład = @"Programowanie w C# jest fascynujące!
Możemy analizować każdy znak w tekście.
WIELKIE litery, małe litery, cyfry 123, znaki specjalne @#$%
Polskie znaki: ąćęłńóśźż ĄĆĘŁŃÓŚŹŻ
Białe znaki: spacje, tabulatory	i nowe linie.";
            
            File.WriteAllText(nazwaPliku, przykład);
            Console.WriteLine($"Utworzono plik: {nazwaPliku}");
        }
        
        // Wczytujemy zawartość pliku
        string zawartość = File.ReadAllText(nazwaPliku);
        Console.WriteLine($"Analizowany tekst ({zawartość.Length} znaków):");
        Console.WriteLine($"{zawartość}\n");
        
        // Analizujemy znaki
        AnalizujZnaki(zawartość);
        
        // Zapisujemy raport
        ZapiszRaport(zawartość, "raport_znakow.txt");
    }
    
    static void AnalizujZnaki(string tekst)
    {
        // Słownik do liczenia wystąpień każdego znaku
        Dictionary<char, int> częstotliwość = new Dictionary<char, int>();
        
        // Liczniki kategorii znaków
        int litery = 0, cyfry = 0, białeZnaki = 0, interpunkcja = 0, 
            symbole = 0, kontrolne = 0, inne = 0;
        int wielkieLitery = 0, małeLitery = 0;
        int polskieZnaki = 0;
        
        // Analizujemy każdy znak
        foreach (char c in tekst)
        {
            // Liczenie wystąpień
            if (częstotliwość.ContainsKey(c))
                częstotliwość[c]++;
            else
                częstotliwość[c] = 1;
            
            // Klasyfikacja znaków
            if (char.IsLetter(c))
            {
                litery++;
                if (char.IsUpper(c))
                    wielkieLitery++;
                else if (char.IsLower(c))
                    małeLitery++;
                    
                // Sprawdzamy polskie znaki
                if ("ąćęłńóśźżĄĆĘŁŃÓŚŹŻ".Contains(c))
                    polskieZnaki++;
            }
            else if (char.IsDigit(c))
                cyfry++;
            else if (char.IsWhiteSpace(c))
                białeZnaki++;
            else if (char.IsPunctuation(c))
                interpunkcja++;
            else if (char.IsSymbol(c))
                symbole++;
            else if (char.IsControl(c))
                kontrolne++;
            else
                inne++;
        }
        
        // Wyświetlamy statystyki kategorii
        Console.WriteLine("=== STATYSTYKI KATEGORII ZNAKÓW ===");
        Console.WriteLine($"Wszystkich znaków: {tekst.Length}");
        Console.WriteLine($"Litery: {litery} (wielkie: {wielkieLitery}, małe: {małeLitery})");
        Console.WriteLine($"Polskie znaki diakrytyczne: {polskieZnaki}");
        Console.WriteLine($"Cyfry: {cyfry}");
        Console.WriteLine($"Białe znaki: {białeZnaki}");
        Console.WriteLine($"Znaki interpunkcyjne: {interpunkcja}");
        Console.WriteLine($"Symbole: {symbole}");
        Console.WriteLine($"Znaki kontrolne: {kontrolne}");
        Console.WriteLine($"Inne: {inne}");
        
        // Top 10 najczęściej występujących znaków
        Console.WriteLine("\n=== TOP 10 NAJCZĘSTSZYCH ZNAKÓW ===");
        var najczęstsze = częstotliwość
            .OrderByDescending(x => x.Value)
            .Take(10);
            
        int pozycja = 1;
        foreach (var para in najczęstsze)
        {
            char znak = para.Key;
            int liczba = para.Value;
            string nazwaZnaku = PobierzNazwęZnaku(znak);
            double procent = (double)liczba / tekst.Length * 100;
            
            Console.WriteLine($"{pozycja,2}. '{znak}' ({nazwaZnaku}) - {liczba} razy ({procent:F1}%)");
            pozycja++;
        }
        
        // Znaki występujące tylko raz
        var unikatowe = częstotliwość.Where(x => x.Value == 1).Count();
        Console.WriteLine($"\nZnaków występujących tylko raz: {unikatowe}");
    }
    
    static string PobierzNazwęZnaku(char znak)
    {
        return znak switch
        {
            ' ' => "spacja",
            '\t' => "tabulator",
            '\n' => "nowa linia",
            '\r' => "powrót karetki",
            _ when char.IsLetter(znak) => $"litera {(char.IsUpper(znak) ? "wielka" : "mała")}",
            _ when char.IsDigit(znak) => "cyfra",
            _ when char.IsPunctuation(znak) => "interpunkcja",
            _ when char.IsSymbol(znak) => "symbol",
            _ => "inny"
        };
    }
    
    static void ZapiszRaport(string tekst, string nazwaRaportu)
    {
        var raport = new List<string>();
        raport.Add("=== RAPORT ANALIZY ZNAKÓW ===");
        raport.Add($"Data: {DateTime.Now:dd.MM.yyyy HH:mm:ss}");
        raport.Add($"Analizowany tekst: {tekst.Length} znaków");
        raport.Add("");
        
        // Szczegółowa analiza każdego znaku (ASCII 32-126)
        raport.Add("=== ZNAKI ASCII (32-126) ===");
        for (int i = 32; i <= 126; i++)
        {
            char c = (char)i;
            int liczba = tekst.Count(x => x == c);
            if (liczba > 0)
            {
                raport.Add($"Kod {i,3}: '{c}' - {liczba,3} razy");
            }
        }
        
        File.WriteAllLines(nazwaRaportu, raport);
        Console.WriteLine($"\nRaport szczegółowy zapisano w: {nazwaRaportu}");
    }
}

Wyjaśnienie nowych funkcji:

  • Dictionary<TKey, TValue> – kolekcja par klucz-wartość (wymaga using System.Collections.Generic)
  • ContainsKey(key) – sprawdza czy słownik zawiera dany klucz
  • OrderByDescending() – sortuje malejąco (wymaga using System.Linq)
  • Take(n) – pobiera pierwsze n elementów
  • Where(warunek) – filtruje elementy spełniające warunek
  • Count(warunek) – liczy elementy spełniające warunek
  • switch expression with when – nowoczesna składnia switch z dodatkowymi warunkami

7. Zaawansowane techniki z char

7.1 Operacje arytmetyczne na znakach

// Znaki jako liczby - można na nich wykonywać operacje arytmetyczne
char a = 'A';
char b = (char)(a + 1);  // 'B'
char c = (char)(a + 25); // 'Z'

Console.WriteLine($"'{a}' + 1 = '{b}'");
Console.WriteLine($"'{a}' + 25 = '{c}'");

// Różnica między znakami
char x = 'X';
char y = 'A';
int różnica = x - y;  // 23 (X to 88. znak, A to 65.)
Console.WriteLine($"'{x}' - '{y}' = {różnica}");

// Przechodzenie przez alfabet
Console.WriteLine("Alfabet angielski:");
for (char litera = 'A'; litera <= 'Z'; litera++)
{
    Console.Write($"{litera} ");
}
Console.WriteLine();

7.2 Konwersja cyfr-znaków na liczby

// Konwersja char cyfry na int
char cyfrаZnak = '7';
int cyfrаLiczba1 = cyfrаZnak - '0';  // 7 (ASCII '7' = 55, '0' = 48, różnica = 7)
int cyfrаLiczba2 = char.GetNumericValue(cyfrаZnak);  // 7.0 (zwraca double)

Console.WriteLine($"Znak '{cyfrаZnak}' jako liczba: {cyfrаLiczba1}");

// Sprawdzanie czy char reprezentuje cyfrę i konwersja
static int CharNаCyfre(char c)
{
    if (char.IsDigit(c))
        return c - '0';
    else
        throw new ArgumentException($"'{c}' nie jest cyfrą!");
}

// Konwersja całego stringu cyfr na liczbę (ręcznie)
static int StringNаLiczbe(string cyfry)
{
    int wynik = 0;
    foreach (char c in cyfry)
    {
        if (!char.IsDigit(c))
            throw new ArgumentException($"'{c}' nie jest cyfrą!");
        
        wynik = wynik * 10 + (c - '0');
    }
    return wynik;
}

Wyjaśnienie funkcji:

  • char - char – różnica kodów Unicode dwóch znaków
  • char + int – przesunięcie znaku o określoną liczbę pozycji w Unicode
  • char.GetNumericValue(char) – konwertuje znak cyfry na wartość numeryczną
  • Operacje arytmetyczne na char działają na kodach Unicode

8. Najczęstsze błędy i pułapki

8.1 Myślenie cudzysłowów i apostrofów

// ❌ BŁĄD
char znak = "A";     // Błąd kompilacji - to string, nie char!

// ✅ PRAWIDŁOWO
char znak = 'A';     // Char w apostrofach
string tekst = "A";  // String w cudzysłowach

8.2 Porównywanie z uwzględnieniem wielkości liter

char input = 'a';

// ❌ Niebezpieczne
if (input == 'A') { /* ... */ }

// ✅ Bezpieczne porównanie
if (char.ToUpper(input) == 'A') { /* ... */ }
// lub
if (char.ToLower(input) == 'a') { /* ... */ }

8.3 Przekroczenie zakresu przy konwersji

// ❌ Niebezpieczne - może rzucić wyjątek
int dużaLiczba = 70000;
char znak = (char)dużaLiczba;  // Może dać nieprzewidywalne rezultaty

// ✅ Bezpieczne sprawdzanie zakresu
if (dużaLiczba >= 0 && dużaLiczba <= 65535)
{
    char znak = (char)dużaLiczba;
}
else
{
    Console.WriteLine("Liczba poza zakresem char!");
}

8.4 Błędne założenia o kodach ASCII

// ❌ Błędne założenie - działa tylko dla angielskiego
char c = 'ą';
if (c >= 'a' && c <= 'z')  // false! ą ma kod 261, poza zakresem a-z
{
    Console.WriteLine("Mała litera");
}

// ✅ Prawidłowe sprawdzenie
if (char.IsLower(c))  // true - rozpoznaje polskie znaki
{
    Console.WriteLine("Mała litera");
}

9. Przydatne zakresy kodów Unicode

9.1 Podstawowe zakresy znaków

static void PokazZakresy()
{
    Console.WriteLine("=== ZAKRESY UNICODE ===");
    
    // Cyfry (0-9)
    Console.WriteLine("Cyfry:");
    for (int i = 48; i <= 57; i++)
    {
        Console.Write($"{(char)i} ");
    }
    Console.WriteLine($" (kody {48}-{57})");
    
    // Wielkie litery angielskie (A-Z)
    Console.WriteLine("\nWielkie litery angielskie:");
    for (int i = 65; i <= 90; i++)
    {
        Console.Write($"{(char)i} ");
    }
    Console.WriteLine($" (kody {65}-{90})");
    
    // Małe litery angielskie (a-z)
    Console.WriteLine("\nMałe litery angielskie:");
    for (int i = 97; i <= 122; i++)
    {
        Console.Write($"{(char)i} ");
    }
    Console.WriteLine($" (kody {97}-{122})");
    
    // Podstawowe znaki interpunkcyjne
    Console.WriteLine("\nPodstawowe znaki specjalne:");
    int[] specialCodes = {32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47};
    foreach (int kod in specialCodes)
    {
        Console.Write($"'{(char)kod}' ");
    }
    Console.WriteLine();
    
    // Polskie znaki diakrytyczne
    Console.WriteLine("\nPolskie znaki diakrytyczne:");
    string polskie = "ąćęłńóśźż ĄĆĘŁŃÓŚŹŻ";
    foreach (char c in polskie)
    {
        if (c != ' ')
            Console.Write($"'{c}'({(int)c}) ");
    }
    Console.WriteLine();
}

Wyjaśnienie najważniejszych zakresów:

  • 48-57: Cyfry 0-9
  • 65-90: Wielkie litery A-Z
  • 97-122: Małe litery a-z
  • 32: Spacja
  • 9: Tabulator (\t)
  • 10: Nowa linia (\n)
  • 13: Powrót karetki (\r)

10. Podsumowanie i najważniejsze wskazówki

Najważniejsze metody char:

  • Klasyfikacja: IsLetter(), IsDigit(), IsWhiteSpace(), IsUpper(), IsLower()
  • Konwersja: ToUpper(), ToLower(), ToString()
  • Sprawdzanie: IsLetterOrDigit(), IsPunctuation(), IsSymbol(), IsControl()

11. Praktyczne zadania

Zadanie 1 – Klasyfikator znaków

Napisz program, który:

  1. Pobiera od użytkownika ciąg znaków
  2. Klasyfikuje każdy znak (litera/cyfra/specjalny/biały)
  3. Wyświetla statystyki w formie tabeli
  4. Zapisuje wyniki do pliku „klasyfikacja.txt”

Zadanie 2 – Konwerter Caesar Cipher

Napisz program, który:

  1. Wczytuje tekst z pliku
  2. Szyfruje/deszyfruje używając szyfru Cezara (przesunięcie o n pozycji)
  3. Zachowuje wielkość liter i pomija znaki nie-literowe
  4. Zapisuje wynik do nowego pliku

Zadanie 3 – Walidator kodu pocztowego

Napisz program, który:

  1. Wczytuje plik z kodami pocztowymi (jeden w linii)
  2. Sprawdza format: 2 cyfry, myślnik, 3 cyfry (np. „12-345”)
  3. Używa char.IsDigit() do walidacji
  4. Tworzy raport z prawidłowymi i błędnymi kodami

Zadanie 4 – Analizator częstotliwości liter

Napisz program, który:

  1. Wczytuje długi tekst z pliku
  2. Liczy częstotliwość każdej litery (ignorując wielkość)
  3. Tworzy wykres słupkowy w konsoli używając znaków
  4. Zapisuje statystyki do pliku CSV

Zadanie 5 – Generator loginów

Napisz program, który:

  1. Pobiera imię i nazwisko
  2. Generuje propozycje loginów (różne kombinacje)
  3. Sprawdza każdy login używając char.IsLetterOrDigit()
  4. Zapisuje prawidłowe loginy do pliku