01
Zadanie wprowadzające: Uniwersalny Analizator Transakcji
Cel

Student demonstruje umiejętność posługiwania się typem precyzyjnym decimal w obliczeniach finansowych oraz operatorami specyficznymi dla języka C#. Zadanie ma na celu pokazanie mechanizmów formatowania wyjścia konsolowego oraz struktury instrukcji switch w nowoczesnej formie. Student potrafi zarządzać prostymi tablicami i pętlami do generowania raportów tekstowych.

Scenariusz

Przygotowujesz system do wstępnej weryfikacji koszyka zakupowego w sklepie wielobranżowym. Program musi przetworzyć listę produktów, gdzie każdy produkt posiada cenę oraz opcjonalną kategorię. Niektóre produkty mogą nie mieć przypisanej kategorii w bazie danych, co należy obsłużyć za pomocą operatorów bezpiecznego dostępu. Algorytm musi poprawnie naliczyć podatek VAT w zależności od przypisanej grupy towarowej, stosując różne stawki procentowe. Finalnie system generuje czytelny raport, w którym każda linia jest precyzyjnie wyrównana do kolumn. Musisz zadbać o to, aby kwoty pieniężne były wyświetlane z odpowiednim symbolem waluty zgodnie z lokalnymi ustawieniami. Raport kończy się podsumowaniem całkowitej wartości brutto wszystkich zakupionych towarów. Całość musi być wykonana jako pojedyncza, spójna aplikacja konsolowa o wysokiej czytelności kodu.

Sugerowane kroki do wykonania
  1. Utwórz nowy projekt aplikacji konsolowej w środowisku Visual Studio lub innym wybranym IDE.
  2. Zdefiniuj tablicę typu decimal przechowującą ceny netto pięciu przykładowych produktów.
  3. Utwórz równoległą tablicę stringów przechowującą nazwy kategorii (zostaw jedną wartość jako null).
  4. Zadeklaruj zmienną sumaBrutto i zainicjalizuj ją wartością zero.
  5. Wypisz nagłówek raportu, używając stałych szerokości kolumn w konsoli.
  6. Uruchom pętlę for przechodzącą przez wszystkie elementy tablicy cen.
  7. Wewnątrz pętli użyj operatora ?? do przypisania wartości "Inne", jeśli kategoria produktu jest nullem.
  8. Zastosuj instrukcję switch do ustalenia stawki VAT na podstawie nazwy kategorii produktu.
  9. Oblicz wartość podatku oraz cenę brutto dla bieżącej pozycji w tablicy.
  10. Wyświetl sformatowaną linię raportu z wykorzystaniem interpolacji stringów i formatowania walutowego :c.
Kod rozwiązania
using System;

class Program
{
    static void Main()
    {
        // Typ decimal z przyrostkiem m zapewnia precyzję
        decimal[] ceny = { 19.99m, 1200.00m, 5.50m, 299.99m, 89.00m };
        string[] kategorie = { "Spożywcze", "Elektronika", "Spożywcze", "RTV", null };

        decimal sumaBrutto = 0;

        // Nagłówek z formatowaniem stałopozycyjnym
        Console.WriteLine("{0,-15} | {1,-12} | {2,-10} | {3,-10}", "Towar", "Kategoria", "Netto", "VAT");
        Console.WriteLine(new string('-', 55));

        for (int i = 0; i < ceny.Length; i++)
        {
            // Operator ?? obsługuje brak kategorii
            string kat = kategorie[i] ?? "Inne";
            decimal stawka;

            switch (kat)
            {
                case "Spożywcze": stawka = 0.05m; break;
                case "Elektronika":
                case "RTV": stawka = 0.23m; break;
                default: stawka = 0.08m; break;
            }

            decimal vat = ceny[i] * stawka;
            decimal brutto = ceny[i] + vat;
            sumaBrutto += brutto;

            // Interpolacja stringów z formatowaniem walutowym :c
            Console.WriteLine($"Pozycja {i + 1,-7} | {kat,-12} | {ceny[i],10:c} | {vat,10:c}");
        }

        Console.WriteLine(new string('-', 55));
        Console.WriteLine($"RAZEM DO ZAPŁATY (BRUTTO): {sumaBrutto:c}");
    }
}
                    
1.1
Średnia dobowa pomiarów temperatury
Cel

Głównym celem zadania jest przećwiczenie obsługi tablic jednowymiarowych oraz implementacja prostych algorytmów obliczeniowych. Student uczy się iteracji po danych oraz interakcji z użytkownikiem poprzez konsolę.

Scenariusz

Zostałeś poproszony o przygotowanie małego narzędzia dla stacji meteorologicznej do analizy tygodniowych pomiarów. Użytkownik powinien mieć możliwość wprowadzenia dokładnie siedmiu wartości temperatury, reprezentujących kolejne dni tygodnia. Program musi zapisać te wartości w odpowiedniej strukturze danych, która umożliwi ich późniejszą obróbkę. Po zebraniu kompletu danych, algorytm oblicza średnią arytmetyczną temperatur z całego okresu. Dodatkowo system musi odnaleźć i wskazać dzień, w którym zanotowano najwyższą temperaturę. Wyświetlone wyniki powinny być czytelne i sformatowane tak, aby ułatwić odczyt badaczowi. Program powinien informować użytkownika o tym, który konkretnie dzień jest aktualnie wpisywany do bazy. Finalny raport ma zawierać pełną listę wprowadzonych wartości oraz wyliczone statystyki.

Sugerowane kroki do wykonania
  1. Zadeklaruj tablicę siedmioelementową typu double do przechowywania temperatur.
  2. Utwórz pętlę for, która wykona się dokładnie siedem razy.
  3. Wewnątrz pętli wyświetl prośbę o podanie temperatury dla konkretnego dnia tygodnia.
  4. Pobierz wartość od użytkownika i skonwertuj ją na typ double (double.Parse).
  5. Zmień pętlę, aby zapisać każdą pobraną wartość pod odpowiednim indeksem w tablicy.
  6. Zainicjalizuj zmienną pomocniczą do sumowania wszystkich wartości z tablicy.
  7. Użyj kolejnej pętli (lub pętli foreach) do obliczenia sumy wszystkich temperatur.
  8. Wylicz średnią, dzieląc sumę przez długość tablicy (Length).
  9. Zaimplementuj prosty mechanizm wyszukiwania wartości maksymalnej w tablicy.
  10. Wyświetl podsumowanie w konsoli, zaokrąglając wyniki do dwóch miejsc po przecinku.
1.2
System oceniania z wartościami domyślnymi
Cel

Poznanie działania operatora null-coalescing (??) w praktycznym zastosowaniu biznesowym. Student uczy się zarządzać danymi tekstowymi i liczbowymi, sprawnie obsługując brakujące informacje wprowadzane przez użytkownika.

Scenariusz

Budujesz moduł do zarządzania arkuszem ocen dla szkoły wyższej, gdzie nie każdy przedmiot musi mieć jeszcze wystawioną notę końcową. Twoim zadaniem jest stworzenie aplikacji, która przyjmuje nazwy kursów oraz odpowiadające im oceny. System musi być na tyle elastyczny, aby w przypadku, gdy użytkownik nie wprowadzi żadnej oceny dla danego wiersza, automatycznie przypisywana była wartość domyślna oznaczająca "3.0" (jako wariant bezpieczny). Program powinien przetworzyć listę trzech przedmiotów pobranych sekwencyjnie z klawiatury. Po zakończeniu wprowadzania danych, system generuje przejrzysty wykaz wszystkich kursów wraz z ich statusami punktowymi. Musisz zwrócić szczególną uwagę na to, jak program reaguje na całkowicie puste ciągi znaków w polu oceny. Wynik powinien być wyświetlony jako estetycznie wyrównana tabela w oknie konsoli. Dzięki takiemu podejściu aplikacja jest odporna na błędy użytkownika i nie powoduje awarii przy braku opcjonalnych danych. Całość służy jako przykład poprawnego projektowania logiki tzw. "fail-safe" w kodzie.

Sugerowane kroki do wykonania
  1. Zadeklaruj dwie tablice stringów: jedną na nazwy przedmiotów, drugą na wprowadzone oceny.
  2. Poproś użytkownika o podanie nazw 3 przedmiotów i zapisz je w pierwszej tablicy.
  3. Utwórz pętlę do pobierania ocen dla każdego z wprowadzonych wcześniej przedmiotów.
  4. Wczytaj ocenę jako ciąg znaków (string) za pomocą Console.ReadLine().
  5. Sprawdź, czy wprowadzona wartość jest pusta (isEmpty) lub składa się tylko z białych znaków.
  6. Jeśli wejście jest puste, przypisz do tablicy ocen wartość null.
  7. W pętli prezentującej wyniki zastosuj operator ?? do wyświetlenia oceny domyślnej.
  8. Sformatuj wyjście tak, aby nazwa przedmiotu i ocena były oddzielone znakiem separatora.
  9. Zadbaj o czytelny nagłówek listujący funkcje programu na początku jego działania.
  10. Przetestuj program, wprowadzając celowo puste pole dla jednego z przedmiotów.
1.3
Biuro rachunkowe: Kalkulator typów umów
Cel

Wykorzystanie typu decimal oraz rozbudowanej instrukcji switch do sterowania logiką obliczeniową. Student uczy się precyzyjnego modelowania algorytmów podatkowych oraz formatowania wyników finansowych.

Scenariusz

Tworzysz prosty kalkulator dla działu kadr, który ma szybko przeliczać kwoty brutto na kwoty netto dla różnych form zatrudnienia. Program po uruchomieniu prosi o podanie miesięcznego wynagrodzenia brutto, które powinno być obsłużone z precyzją finansową. Następnie użytkownik wybiera jeden z trzech kodów umów: 'UOP' dla umowy o pracę, 'UZ' dla umowy zlecenia oraz 'UD' dla umowy o dzieło. Na podstawie wybranego kodu, program stosuje odpowiednie procentowe odliczenia kosztów uzyskania przychodu i ubezpieczeń. Przyjmij uproszczone wskaźniki: 70% wartości dla UOP, 80% dla UZ i 85% dla UD. Jeśli użytkownik poda nieznany kod umowy, system powinien zgłosić błąd i uniemożliwić wykonanie błędnych obliczeń. Finalnie wyświetlane jest pełne podsumowanie zawierające kwotę wejściową, naliczony podatek i kwotę netto. Całość musi być wykonana z dbałością o detale wizualne, takie jak separatory tysięcy i właściwa waluta. Kalkulator ten ma za zadanie zminimalizować błędy przy ręcznym wyliczaniu wypłat przez młodszych księgowych.

Sugerowane kroki do wykonania
  1. Pobierz od użytkownika kwotę brutto i skonwertuj ją na typ decimal.
  2. Pobierz od użytkownika kod umowy (np. jako string).
  3. Zadeklaruj zmienną typu decimal na kwotę netto oraz współczynnik obliczeń.
  4. Użyj instrukcji switch (lub switch expression), aby przypisać współczynnik na podstawie kodu.
  5. Obsłuż wejście domyślne (default) w switchu na wypadek błędnego kodu umowy.
  6. Jeśli kod jest błędny, wyświetl komunikat i zakończ działanie bezpiecznie.
  7. Pomnóż kwotę brutto przez wyznaczony w switchu współczynnik procentowy.
  8. Zapisz wynik w zmiennej kwotaNetto.
  9. Wypisz zestawienie finansowe używając formatu walutowego :c2 dla wszystkich kwot.
  10. Dodaj informację o wielkości całego potrącenia (różnica między brutto a netto).
1.4
Analiza frekwencji studenckiej (Tablice Jagged)
Cel

Praktyczne zrozumienie struktury i zastosowania tablic poszarpanych (jagged arrays) w sytuacjach o nieregularnej liczbie danych. Student uczy się alokacji pamięci dla podtablic oraz operowania na nich za pomocą zagnieżdżonych struktur pętli.

Scenariusz

Jako programista uczelniany budujesz system do ewidencji obecności na zajęciach laboratoryjnych dla wielu grup. Każda z grup ma inną liczbę zarejestrowanych studentów, co sprawia, że standardowa macierz prostokątna byłaby nieefektywna pamięciowo. Musisz stworzyć strukturę, która pozwoli przechować liczbę godzin obecności dla każdego studenta w trzech różnych grupach (np. 3 osoby w pierwszej, 5 w drugiej, 2 w trzeciej). Twoim zadaniem jest wypełnienie tej struktury przykładowymi danymi wprowadzonymi ręcznie lub wygenerowanymi w kodzie. Algorytm musi następnie przejść przez listę wszystkich grup i dla każdej z nich osobno obliczyć średnią frekwencję. Wyniki powinny być zaprezentowane w formie czytelnej listy, która wskazuje numer grupy i jej statystyczne wyniki. Musisz zadbać o poprawne indeksowanie tablic, aby uniknąć błędów wyjścia poza zakres przy nieregularnej długości wierszy. System ten symuluje realne bazy danych, gdzie wiersze często mają różną liczbę powiązanych ze sobą rekordów. Finalnie program powinien wyświetlić łączną liczbę studentów we wszystkich grupach objętych analizą.

Sugerowane kroki do wykonania
  1. Zadeklaruj tablicę poszarpaną (int[][]) przeznaczoną na 3 grupy (wiersze).
  2. Zainicjalizuj pierwszy wiersz jako tablicę 3-elementową.
  3. Zainicjalizuj drugi wiersz jako tablicę 5-elementową.
  4. Zainicjalizuj trzeci wiersz jako tablicę 2-elementową.
  5. Użyj zagnieżdżonych pętli for do wprowadzenia danych o obecnościach.
  6. Pamiętaj o pobieraniu długości danego wiersza za pomocą właściwości Length.
  7. Stwórz zmienną pomocniczą do liczenia sumy dla aktualnie przetwarzanej grupy.
  8. Oblicz średnią dla grupy wewnątrz pętli zewnętrznej i wyświetl ją natychmiast.
  9. Zastosuj formatowanie stringów, aby wyświetlić identyfikatory studentów (np. G1-S1).
  10. Wyświetl na końcu całkowitą sumę wszystkich obecności zliczoną dla całego roku.
1.5
Planowanie produkcji (Tablice 2D Regularne)
Cel

Opanowanie pracy z tablicami wielowymiarowymi regularnymi oraz metodami GetLength do zarządzania ich wymiarami. Student uczy się mapowania rzeczywistych struktur tabelarycznych na kod programistyczny.

Scenariusz

Pracujesz w dziale IT fabryki, która produkuje trzy rodzaje komponentów na czterech różnych liniach produkcyjnych. Musisz zapisać w systemie raport wydajnościowy z ostatniej zmiany, przedstawiający liczbę sztuk wyprodukowanych na każdej linii dla każdego produktu. Najlepszym rozwiązaniem będzie użycie macierzy o stałych wymiarach 3x4, gdzie wiersze reprezentują typy produktów, a kolumny konkretne maszyny. Twoim zadaniem jest stworzenie algorytmu, który wczyta te dane i pozwoli na przeprowadzenie szybkiej analizy. Po zebraniu informacji, program musi obliczyć całkowitą liczbę sztuk wyprodukowanych dla każdego typu komponentu (suma w każdym wierszu macierzy). Dodatkowo Twoim celem jest wskazanie, która maszyna (kolumna) była statystycznie najbardziej efektywna w trakcie zmiany. Wynik musi być zaprezentowany w formie tabeli tekstowej, z czytelnym opisem co oznacza każda wartość. Taka analiza pozwala kadrze zarządzającej na szybką identyfikację ewentualnych przestojów lub awarii na konkretnych liniach produkcyjnych. Program musi być stabilny i poprawnie obsługiwać granice zadeklarowanej macierzy.

Sugerowane kroki do wykonania
  1. Zadeklaruj dwuwymiarową tablicę int[3, 4] na dane produkcyjne.
  2. Użyj zagnieżdżonych pętli for do wczytania danych od użytkownika.
  3. Zastosuj metodę GetLength(0) dla pętli zewnętrznej (wiersze - produkty).
  4. Zastosuj metodę GetLength(1) dla pętli wewnętrznej (kolumny - maszyny).
  5. Dodaj komunikaty informujące, dla której maszyny i produktu aktualnie wpisujesz dane.
  6. Stwórz pętlę obliczającą sumę dla każdego wiersza z osobna.
  7. Wyświetl wyniki sumowania wierszy z odpowiednim opisem słownym.
  8. Wyświetl całą macierz na konsoli, używając stałego odstępu między kolumnami.
  9. Dodaj mechanizm sumowania kolumn, aby ocenić wydajność poszczególnych maszyn.
  10. Podsumuj raport łączną wydajnością całej fabryki w danym cyklu.
1.6
Inwentaryzacja: Szybkie wyszukiwanie fraz
Cel

Zastosowanie pętli foreach oraz operacji na ciągach znaków do filtrowania zbiorów danych. Student uczy się metod optymalnego przeszukiwania tablic oraz transformacji wielkości liter w celu zwiększenia skuteczności wyszukiwania.

Scenariusz

W dużym magazynie logistycznym potrzebne jest proste narzędzie do błyskawicznego sprawdzania dostępności towarów według podanej części nazwy. System ma przechowywać statyczną tablicę kilkunastu produktów, takich jak elektronika, meble biurowe i akcesoria. Użytkownik wpisuje w konsoli wyszukiwaną frazę, a program musi przeszukać całą bazę pod kątem wystąpienia tego ciągu znaków w dowolnym miejscu nazwy produktu. Twoim zadaniem jest zapewnienie, aby wyszukiwanie nie brało pod uwagę wielkości wpisanych liter (tzw. case-insensitive search). Algorytm po przeanalizowaniu tablicy powinien wyświetlić listę wszystkich trafień oraz podsumować całkowitą liczbę znalezionych pozycji. Jeśli żadna nazwa nie pasuje do wzorca, system musi o tym wyraźnie poinformować użytkownika stosownym komunikatem. Taka funkcjonalność znacznie przyspiesza pracę magazynierów przy obsłudze dużych partii towaru o skomplikowanych nazwach katalogowych. Musisz również zadbać o to, aby program po wyświetleniu wyników oczekiwał na reakcję użytkownika przed zamknięciem okna. Jest to świetny przykład zastosowania iteracji po kolekcjach typu string w codziennych zadaniach programistycznych.

Sugerowane kroki do wykonania
  1. Zainicjalizuj tablicę stringów z co najmniej 10 nazwami przedmiotów magazynowych.
  2. Pobierz od użytkownika frazę do wyszukania za pomocą Console.ReadLine().
  3. Zamień pobraną frazę na małe litery za pomocą metody .ToLower().
  4. Utwórz licznik (int) znalezionych produktów i ustaw go na zero.
  5. Zastosuj pętlę foreach do przejścia przez każdy element tablicy nazw.
  6. Wewnątrz pętli zamień nazwę bieżącego produktu tymczasowo na małe litery.
  7. Użyj metody .Contains(), aby sprawdzić, czy fraza znajduje się wewnątrz nazwy.
  8. Jeśli wynik jest pozytywny, wyświetl pełną nazwę produktu i zwiększ licznik.
  9. Po wyjściu z pętli sprawdź wartość licznika i wyświetl odpowiedni komunikat podsumowujący.
  10. Przetestuj program, wpisując fragmenty nazw o różnej wielkości liter.