Instrukcja:
Wszystkie poniższe zadania należy zrealizować w ramach projektów konsolowych (Console Application). Zaleca się korzystanie ze środowiska Visual Studio lub JetBrains Rider. Zwróć szczególną uwagę na formatowanie wyjścia oraz czytelność Twojego kodu.

Spis treści

  1. Pierwsze kroki i struktura programu
  2. Deklaracja zmiennych i typy danych
  3. Kalkulator wieku emerytalnego
  4. Operatory i formatowanie liczb
  5. Logika warunkowa w systemie biletowym
  6. Pętle w praktyce - tabliczka mnożenia
  7. Interaktywna gra "Za dużo, za mało"
  8. Tworzenie własnych metod
  9. Podstawy programowania obiektowego
  10. Zaawansowane formatowanie raportów
01
Pierwsze kroki i struktura programu
Cel

Zapoznanie studenta z podstawową strukturą pliku źródłowego w języku C#. Zrozumienie różnicy między modelem klasowym a instrukcjami najwyższego poziomu (Top-level statements).

Opis

W tym zadaniu Twoim celem jest utworzenie pierwszego, działającego programu w środowisku C#. Program powinien wyświetlać na ekranie powitanie oraz aktualną datę i godzinę systemową. Należy przeanalizować dwa podejścia do budowy aplikacji konsolowej. Pierwsze z nich to tradycyjny model wykorzystujący klasę Program oraz statyczną metodę Main jako punkt wejścia. Drugie podejście to nowoczesne "Top-level statements", które upraszczają kod do minimum, usuwając zbędną "otoczkę" kodu systemowego. W opisie zadania należy uwzględnić, jak kompilator interpretuje te dwie formy zapisu. Wykorzystasz do tego przestrzeń nazw System oraz klasę Console. Program ma być prostym, ale kompletnym przykładem poprawnej składni C#.

Przykład kodu
// Tradycyjne podejście klasowe
using System;

namespace PodstawyCS
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Witaj w świecie C#!");
            Console.WriteLine("Dzisiaj jest: " + DateTime.Now);
        }
    }
}
Przykład działania
Witaj w świecie C#!
Dzisiaj jest: 10.04.2026 21:35:45
02
Deklaracja zmiennych i typy danych
Cel

Poznanie podstawowych typów danych dostępnych w języku C# oraz umiejętność przypisywania do nich wartości pochodzących od użytkownika.

Opis

Każdy program komputerowy przetwarza dane, które muszą być przechowywane w pamięci w odpowiednich "szufladkach" zwanych zmiennymi. W tym zadaniu stworzysz aplikację, która pobierze od użytkownika cztery różne informacje: imię (tekst), wiek (liczba całkowita), wzrost (liczba zmiennoprzecinkowa) oraz informację, czy użytkownik lubi programować (wartość logiczna true/false). Wykorzystasz typy danych takie jak string, int, double oraz bool. Ważnym elementem jest konwersja danych pochodzących z klawiatury, ponieważ funkcja Console.ReadLine() zawsze zwraca tekst. Do zamiany tekstu na liczby użyjesz metod takich jak int.Parse() lub double.Parse(). Na koniec program powinien wyświetlić wszystkie te dane w jednej, czytelnej linii tekstu, wykorzystując tzw. interpolację ciągu znaków (znak $ przed cudzysłowem). To zadanie uczy, jak dobierać typy zmiennych do rodzaju przechowywanych informacji.

Przykład kodu
string imie = Console.ReadLine();
int wiek = int.Parse(Console.ReadLine());
double wzrost = double.Parse(Console.ReadLine());
bool lubiProgramowac = bool.Parse(Console.ReadLine());

Console.WriteLine($"Użytkownik {imie} ma {wiek} lat i {wzrost} cm wzrostu.");
Przykład działania
Podaj imię: Jan
Podaj wiek: 20
Podaj wzrost: 185,5
Czy lubisz programować (true/false): true
Użytkownik Jan ma 20 lat i 185,5 cm wzrostu.
03
Kalkulator wieku emerytalnego
Cel

Zastosowanie instrukcji warunkowych if-else do budowy logiki decyzyjnej opartej na wielu parametrach.

Opis

W tym zadaniu napiszemy program, który symuluje prosty system kadrowy sprawdzający uprawnienia emerytalne. Użytkownik zostanie poproszony o podanie swojego imienia, aktualnego wieku oraz płci (oznaczonej jako 'K' dla kobiet i 'M' dla mężczyzn). Program musi uwzględnić polskie przepisy prawa pracy, według których wiek emerytalny dla kobiet wynosi 60 lat, a dla mężczyzn 65 lat. Wykorzystując instrukcje warunkowe if oraz else if, program powinien sprawdzić, czy użytkownik osiągnął już wymagany wiek. Jeśli tak, wyświetli radosną informację o prawie do odpoczynku. W przeciwnym razie obliczy, ile dokładnie lat pozostało do osiągnięcia limitu. Ważnym aspektem zadania jest obsługa wejścia tak, aby litery 'k'/'m' były traktowane tak samo jak wielkie 'K'/'M'. To zadanie uczy logicznego myślenia oraz umiejętności rozgałęziania przepływu programu na podstawie danych wejściowych.

Przykład kodu
string plec = Console.ReadLine().ToUpper();
if (plec == "K")
{
    if (wiek >= 60) Console.WriteLine("Możesz już iść na emeryturę!");
    else Console.WriteLine($"Zostało Ci {60 - wiek} lat do emerytury.");
}
else if (plec == "M")
{
    if (wiek >= 65) Console.WriteLine("Możesz już iść na emeryturę!");
    else Console.WriteLine($"Zostało Ci {65 - wiek} lat do emerytury.");
}
Przykład działania
Podaj imię: Adam
Podaj wiek: 62
Podaj płeć (K/M): M
Witaj Adam! Zostało Ci 3 lat do emerytury.
04
Operatory i formatowanie liczb
Cel

Praktyczne wykorzystanie operatorów arytmetycznych oraz zaawansowane formatowanie wyników finansowych w konsoli.

Opis

Zadanie polega na stworzeniu nowoczesnego kalkulatora zakupowego, który precyzyjnie oblicza koszty produktów. Użytkownik wprowadza nazwę towaru, jego cenę netto oraz stawkę podatku VAT wyrażoną w procentach (np. 23). Program musi wykonać szereg operacji matematycznych: obliczyć kwotę podatku oraz cenę brutto za jedną sztukę. Dodatkowo program pyta o liczbę zakupionych sztuk i oblicza łączną wartość zamówienia. Kluczowym elementem zadania jest użycie typu danych decimal zamiast double, co jest profesjonalnym standardem przy obliczeniach finansowych ze względu na eliminację błędów zaokrągleń. Wyniki powinny być wyświetlone w czytelny sposób, z użyciem formatowania walutowego (np. symbol zł dodawany automatycznie przez system). Uczeń dowie się, jak operować na liczbach zmiennoprzecinkowych i jak prezentować dane w sposób profesjonalny dla użytkownika końcowego.

Przykład kodu
decimal cenaNetto = decimal.Parse(Console.ReadLine());
int vat = int.Parse(Console.ReadLine());

decimal kwotaVat = cenaNetto * vat / 100;
decimal cenaBrutto = cenaNetto + kwotaVat;

Console.WriteLine($"Cena brutto: {cenaBrutto:C}");
Console.WriteLine($"Kwota VAT: {kwotaVat:F2} zł");
Przykład działania
Nazwa produktu: Monitor
Cena netto: 1200,50
Podatek VAT (%): 23
Liczba sztuk: 2

Cena brutto za sztukę: 1 476,62 zł
Łączna wartość zamówienia: 2 953,23 zł
05
Logika warunkowa w systemie biletowym
Cel

Ćwiczenie złożonych warunków logicznych przy użyciu operatorów && oraz || oraz instrukcji switch.

Opis

Wyobraź sobie, że budujesz system sprzedaży biletów dla lokalnego kina. Cena bazowa biletu wynosi 30 zł, ale system musi automatycznie naliczać zniżki na podstawie wieku i statusu studenta. Dzieci do lat 7 wchodzą za darmo (0 zł). Młodzież i studenci w wieku od 7 do 26 lat otrzymują 50% zniżki, o ile posiadają ważną legitymację. Seniorzy powyżej 65 roku życia mają stałą zniżkę 30%. Twój program powinien zapytać o wiek, a następnie – jeśli wiek mieści się w przedziale studenckim – dopytać o posiadanie legitymacji (T/N). Wykorzystaj operatory logiczne (AND oraz OR) do połączenia tych warunków w elegancki sposób. Dodatkowo, użyj instrukcji switch, aby pozwolić użytkownikowi wybrać rodzaj seansu (2D lub 3D), gdzie seans 3D dolicza dodatkowe 10 zł do ostatecznej ceny. Zadanie to doskonale uczy budowania wielowarstwowej logiki biznesowej, która jest podstawą większości aplikacji komercyjnych.

Przykład kodu
int cenaBazowa = 30;
decimal cena = cenaBazowa;
bool maLegitymacje = Console.ReadLine() == "T";
string typSeansu = Console.ReadLine();

if (wiek < 7) cena = 0;
else if (wiek >= 7 && wiek <= 26 && maLegitymacje)
{
    cena = cenaBazowa * 0.5m;
}
else if (wiek > 65) cena = cenaBazowa * 0.7m;

switch (typSeansu)
{
    case "3D": cena += 10; break;
    default: break;
}
Przykład działania
Podaj wiek: 21
Czy masz legitymację (T/N): T
Wybierz seans (2D/3D): 3D

Cena biletu po zniżkach i dopłatach: 25,00 zł
06
Pętle w praktyce - tabliczka mnożenia
Cel

Opanowanie zagnieżdżonych pętli for oraz technik wyrównywania tekstu w konsoli.

Opis

Pętle są jednym z najważniejszych fundamentów programowania, pozwalającym na wielokrotne powtarzanie tych samych operacji. W tym zadaniu stworzysz automatyczny generator tabliczki mnożenia o wymiarach 10x10. Wykorzystasz do tego dwie pętle for – zewnętrzną dla wierszy i wewnętrzną dla kolumn. Każda komórka tabeli powinna być wynikiem mnożenia indeksu wiersza przez indeks kolumny. Aby tabela wyglądała estetycznie i była czytelna, musisz zastosować metodę PadLeft() na wyświetlanym tekście lub użyć odpowiednich manipulatorów formatowania w Console.Write(). Dzięki temu liczby jedno- i dwucyfrowe będą idealnie wyrównane w kolumnach. Zadanie to uczy, jak zarządzać wielowymiarowymi strukturami danych oraz jak dbać o profesjonalny wygląd interfejsu tekstowego, co jest kluczowe w narzędziach konsolowych (CLI).

Przykład kodu
for (int i = 1; i <= 10; i++)
{
    for (int j = 1; j <= 10; j++)
    {
        Console.Write((i * j).ToString().PadLeft(4));
    }
    Console.WriteLine();
}
Przykład działania
  1   2   3   4   5   6   7   8   9  10
  2   4   6   8  10  12  14  16  18  20
  3   6   9  12  15  18  21  24  27  30
 ...
 10  20  30  40  50  60  70  80  90 100
07
Interaktywna gra "Za dużo, za mało"
Cel

Zastosowanie pętli while oraz klasy Random do obsługi interaktywnych procesów o nieznanej liczbie powtórzeń.

Opis

Stworzysz klasyczną grę liczbową, w której komputer "myśli" liczbę z zakresu od 1 do 100, a zadaniem gracza jest jej odgadnięcie. Program wykorzystuje klasę Random do wygenerowania tajnej liczby przed rozpoczęciem gry. Sercem aplikacji jest pętla while, która będzie się powtarzać tak długo, aż użytkownik poda poprawną wartość. Po każdej próbie program musi udzielić podpowiedzi: "Za dużo!" lub "Za mało!", naprowadzając gracza na właściwy trop. Dodatkowym wyzwaniem jest zaimplementowanie licznika prób, który na końcu gry poinformuje użytkownika, jak sprawnie poradził sobie z zadaniem. Zadanie to uczy obsługi zdarzeń losowych, sterowania pętlami nieskończonymi z warunkiem przerwania (break lub zmiana flagi logicznej) oraz budowania interakcji, która wymaga reakcji programu na błędy użytkownika.

Przykład kodu
Random rnd = new Random();
int tajnaLiczba = rnd.Next(1, 101);
bool odgadnieto = false;
int licznik = 0;

while (!odgadnieto)
{
    licznik++;
    int strzal = int.Parse(Console.ReadLine());
    if (strzal == tajnaLiczba) odgadnieto = true;
    else if (strzal > tajnaLiczba) Console.WriteLine("Za dużo!");
    else Console.WriteLine("Za mało!");
}
Console.WriteLine($"Gratulacje! Odgadłeś w {licznik} próbach.");
Przykład działania
Wylosowałem liczbę od 1 do 100. Zgadnij ją!
Twoja propozycja: 50
Za mało!
Twoja propozycja: 75
Za dużo!
Twoja propozycja: 63
Gratulacje! Odgadłeś w 3 próbach.
08
Tworzenie własnych metod
Cel

Zrozumienie pojęcia modularności kodu poprzez definicję i wywoływanie własnych metod z parametrami.

Opis

Do tej pory cały kod pisaliśmy wewnątrz jednej głównej metody. W tym zadaniu nauczysz się dzielić program na mniejsze, logiczne części zwane metodami. Stworzysz uniwersalny przelicznik jednostek temperatury, który będzie posiadał dwie oddzielne metody: jedna do zamiany stopni Celsjusza na Fahrenheita, a druga do wykonania odwrotnej operacji. Każda z tych metod musi przyjmować parametr typu double i zwracać wynik tego samego typu. W metodzie głównej (Main) zbudujesz proste menu, które pozwoli użytkownikowi wybrać kierunek konwersji, a następnie wywoła odpowiedni fragment kodu. Zadanie to uczy, jak unikać powtarzania tego samego kodu (zasada DRY – Don't Repeat Yourself) oraz jak zarządzać przepływem danych między różnymi częściami aplikacji. To pierwszy krok w stronę tworzenia złożonych systemów o czytelnej i łatwej w utrzymaniu architekturze.

Przykład kodu
static double CelsjuszNaFahrenheit(double celsjusz)
{
    return (celsjusz * 9 / 5) + 32;
}

// Wywołanie w Main
double wynik = CelsjuszNaFahrenheit(25.0);
Przykład działania
--- PRZELICZNIK TEMPERATURY ---
1. Celsjusz -> Fahrenheit
2. Fahrenheit -> Celsjusz
Wybór: 1
Podaj temperaturę: 25

Wynik: 77,00 °F
09
Podstawy programowania obiektowego
Cel

Wprowadzenie do świata obiektowości poprzez definicję własnej klasy, pól oraz metod operujących na stanie obiektu.

Opis

Programowanie obiektowe (OOP) to paradygmat, w którym dane i funkcje są łączone w spójne całości zwane obiektami. W tym zadaniu Twoim celem jest zamodelowanie klasy Student, która będzie przechowywać informacje o imieniu, nazwisku oraz numerze indeksu. Klasa powinna posiadać publiczne pola (lub właściwości) oraz specjalną metodę o nazwie PrzedstawSie(), która wyświetli sformatowane dane studenta na konsoli. W metodzie głównej programu musisz utworzyć (zinstancjonować) co najmniej dwa obiekty tej klasy, przypisać im różne wartości dla pól i wywołać ich metody. Dzięki temu zadaniu zrozumiesz kluczową różnicę między klasą (projektem/szablonem), a obiektem (konkretnym bytem w pamięci komputera). Dowiesz się również, jak hermetyzacją i strukturą kodu można odwzorowywać rzeczywiste obiekty w świecie cyfrowym.

Przykład kodu
class Student
{
    public string Imie;
    public string Nazwisko;
    public int NumerIndeksu;

    public void PrzedstawSie()
    {
        Console.WriteLine($"Student: {Imie} {Nazwisko} (ID: {NumerIndeksu})");
    }
}

// Tworzenie obiektu
Student s1 = new Student();
s1.Imie = "Anna"; s1.Nazwisko = "Nowak"; s1.PrzedstawSie();
Przykład działania
Tworzenie bazy studentów...
Student: Anna Nowak (ID: 12345)
Student: Marek Kowalski (ID: 54321)

Operacja zakończona sukcesem.
10
Zaawansowane formatowanie raportów
Cel

Podsumowanie zdobytych umiejętności poprzez budowę aplikacji generującej estetyczne raporty tekstowe.

Opis

Ostatnie zadanie jest zwieńczeniem kursu podstaw i wymaga połączenia niemal wszystkich poznanych elementów: zmiennych, pętli, instrukcji warunkowych oraz formatowania tekstu. Napiszesz program generujący "Raport z postępów kursu C#". Program powinien pozwolić na wprowadzenie listy wykonanych zadań (wykorzystując pętlę), a następnie wyświetlić je w formie eleganckiej tabeli z nagłówkiem i stopką. Kluczowe jest użycie zaawansowanej interpolacji ciągów znaków do precyzyjnego wyrównywania kolumn (np. {nazwa,-20}) oraz formatowania dat. Program powinien również obliczać procentowy postęp wszystkich zadań w stosunku do oczekiwanego celu. Zadanie to uczy dbałości o szczegóły oraz pokazuje, jak w prostym środowisku konsolowym można tworzyć profesjonalne raporty danych, które są czytelne i estetyczne dla użytkownika. Jest to doskonały trening przed tworzeniem bardziej zaawansowanych aplikacji biznesowych i systemowych.

Przykład kodu
string naglowek = $"{"Lp.",-5} | {"Zadanie",-25} | {"Status",-10}";
Console.WriteLine(naglowek);
Console.WriteLine(new string('-', 45));

for (int i = 1; i <= 3; i++)
{
    Console.WriteLine($"{(i + "."),-5} | {"Zadanie " + i,-25} | {"OK",-10}");
}
Przykład działania
--- RAPORT POSTĘPÓW KURSU C# ---

Lp. | Zadanie | Status
---------------------------------------------
1. | Podstawy składni | ZALICZONE
2. | Pętle i warunki | ZALICZONE
3. | Klasy i obiekty | W TRAKCIE
---------------------------------------------
Postęp całkowity: 66,67%