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}"); // ABCKluczowe różnice char vs string:
| Właściwość | char | string |
|---|---|---|
| Cudzysłowy | Apostrof 'A' | Cudzysłów "ABC" |
| Liczba znaków | Dokładnie 1 | 0 lub więcej |
| Typ | Wartościowy | Referencyjny |
| Rozmiar | 16 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 1string[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 literachar.IsLower(c)– sprawdza czy to mała literachar.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 stringulogin[0]– dostęp do pierwszego znaku (char) w stringuforeach (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/falseout– słowo kluczowe pozwalające funkcji zwrócić dodatkową wartośćRandom.Next(max)– generuje losową liczbę od 0 do max-1new 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 kluczOrderByDescending()– sortuje malejąco (wymaga using System.Linq)Take(n)– pobiera pierwsze n elementówWhere(warunek)– filtruje elementy spełniające warunekCount(warunek)– liczy elementy spełniające warunekswitch 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ówchar + int– przesunięcie znaku o określoną liczbę pozycji w Unicodechar.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łowach8.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:
- Pobiera od użytkownika ciąg znaków
- Klasyfikuje każdy znak (litera/cyfra/specjalny/biały)
- Wyświetla statystyki w formie tabeli
- Zapisuje wyniki do pliku „klasyfikacja.txt”
Zadanie 2 – Konwerter Caesar Cipher
Napisz program, który:
- Wczytuje tekst z pliku
- Szyfruje/deszyfruje używając szyfru Cezara (przesunięcie o n pozycji)
- Zachowuje wielkość liter i pomija znaki nie-literowe
- Zapisuje wynik do nowego pliku
Zadanie 3 – Walidator kodu pocztowego
Napisz program, który:
- Wczytuje plik z kodami pocztowymi (jeden w linii)
- Sprawdza format: 2 cyfry, myślnik, 3 cyfry (np. „12-345”)
- Używa char.IsDigit() do walidacji
- Tworzy raport z prawidłowymi i błędnymi kodami
Zadanie 4 – Analizator częstotliwości liter
Napisz program, który:
- Wczytuje długi tekst z pliku
- Liczy częstotliwość każdej litery (ignorując wielkość)
- Tworzy wykres słupkowy w konsoli używając znaków
- Zapisuje statystyki do pliku CSV
Zadanie 5 – Generator loginów
Napisz program, który:
- Pobiera imię i nazwisko
- Generuje propozycje loginów (różne kombinacje)
- Sprawdza każdy login używając char.IsLetterOrDigit()
- Zapisuje prawidłowe loginy do pliku