Drugi zestaw zadań laboratoryjnych koncentrujący się na efektywnym zarządzaniu zbiorami danych. Tematyka obejmuje tablice wielowymiarowe, listy dynamiczne oraz zaawansowane pętle przetwarzające kolekcje.
Praktyczne zastosowanie jednowymiarowych tablic do przechowywania i analizy zbiorów danych liczbowych.
W tym zadaniu stworzysz aplikację do analizy danych meteorologicznych pobranych w ciągu jednego tygodnia. Program powinien najpierw zapytać użytkownika, ile pomiarów temperatury chce wprowadzić, a następnie utworzyć tablicę typu double o dokładnie takim rozmiarze. Wykorzystując pętlę for, wypełnij tablicę wartościami podanymi z klawiatury. Po zebraniu wszystkich danych, program musi przejrzeć tablicę, aby znaleźć temperaturę maksymalną, minimalną oraz obliczyć średnią arytmetyczną wszystkich pomiarów. Do znalezienia ekstremów możesz wykorzystać własną logikę z instrukcjami warunkowymi lub statyczne metody klasy Math. Na koniec wyświetl raport podsumowujący. Zadanie to uczy deklarowania tablic o dynamicznym rozmiarze (określanym w czasie działania programu) oraz iterowania po ich elementach w celu ekstrakcji istotnych informacji statystycznych.
Użycie dynamicznej kolekcji List<T> do przechowywania nieokreślonej z góry liczby elementów oraz wykorzystanie metod sortujących.
W przeciwieństwie do tablic, listy w C# mogą dynamicznie zmieniać swój rozmiar w trakcie pracy programu. Twoim zadaniem jest stworzenie aplikacji, która pozwoli użytkownikowi na wprowadzanie dowolnej ilości liczb całkowitych. Proces dodawania liczb powinien trwać tak długo, aż użytkownik wpisze cyfrę '0', co zasygnalizuje koniec wprowadzania danych (sama cyfra 0 nie powinna trafić do kolekcji). Wszystkie liczby mają być przechowywane w obiekcie klasy List<int>. Po zakończeniu etapu wprowadzania, program musi wywołać wbudowaną metodę .Sort(), aby uporządkować liczby od najmniejszej do największej. Na koniec wyświetl zawartość listy w jednej linii, oddzielając liczby przecinkami. Zadanie to uczy korzystania z generycznych kolekcji, obsługi pętli o nieznanej liczbie iteracji oraz wykorzystywania gotowych algorytmów dostarczanych przez platformę .NET.
Zastosowanie tablic dwuwymiarowych do symulacji przestrzennych układów danych (siatki/mapy).
W tym zadaniu przygotujemy symulator małego parkingu piętrowego, który posiada 3 poziomy, a na każdym z nich znajduje się 5 miejsc postojowych. Do odwzorowania tej struktury wykorzystasz tablicę dwuwymiarową typu bool[,] o wymiarach 3x5, gdzie wartość true oznacza miejsce zajęte, a false – wolne. Napisz program, który wyświetla graficzną mapę parkingu (np. [X] dla zajętego i [ ] dla wolnego miejsca) oraz pozwala użytkownikowi "zaparkować" samochód poprzez podanie numeru piętra i numeru miejsca. Program powinien sprawdzić, czy wskazane miejsce jest wolne przed dokonaniem rezerwacji. Jeśli miejsce jest już zajęte, należy wyświetlić odpowiedni komunikat błędu. Zadanie to uczy elastycznego zarządzania danymi w macierzy oraz poprawnego operowania na dwóch wymiarach tablicy.
Zrozumienie i implementacja tablic nieregularnych (jagged arrays) w sytuacjach, gdy wiersze mają różną długość.
Często zdarza się, że struktura danych nie jest idealnie prostokątna. W tym zadaniu zamodelujemy dziennik ocen dla trzech różnych grup studenckich, z których każda ma inną liczbę osób (np. grupa A: 3 osoby, grupa B: 5 osób, grupa C: 2 osoby). Do tego celu idealnie nadaje się tablica nieregularna (ang. jagged array) typu int[][]. Twoim zadaniem jest zainicjalizowanie takiej tablicy, a następnie wypełnienie jej ocenami podanymi przez użytkownika dla każdej grupy z osobna. Program powinien obliczyć i wyświetlić średnią ocen dla każdej grupy oraz średnią ogólną dla całego roku. Zwróć uwagę na składnię tablic nieregularnych, gdzie każdy "wiersz" musi zostać oddzielnie utworzony za pomocą słowa kluczowego new. Zadanie to uczy elastycznego zarządzania pamięcią oraz poprawnego operowania na strukturach typu "tablica tablic", co jest częstym wzorcem w zaawansowanym programowaniu C#.
Zastosowanie kolekcji List<string> do budowy prostego systemu zarządzania elementami dynamicznymi.
Zadanie polega na stworzeniu aplikacji konsolowej, która będzie pełniła rolę elektronicznej listy zakupów. Uczeń musi zainicjalizować listę generyczną przechowującą ciągi znaków (List<string>). Program powinien w pętli wyświetlać menu z opcjami: Dodaj produkt, Usuń produkt (według nazwy lub indeksu), Wyświetl listę oraz Wyjdź. Przy usuwaniu elementu należy zadbać o sprawdzenie, czy dany produkt w ogóle znajduje się na liście, aby uniknąć błędów w trakcie działania aplikacji. Dodatkowo, po każdej modyfikacji, program powinien informować użytkownika o aktualnej liczbie przedmiotów na liście przy użyciu właściwości .Count. Zadanie to uczy podstawowych operacji na kolekcjach dynamicznych (CRUD – Create, Read, Update, Delete) oraz interakcji z użytkownikiem poprzez tekstowe menu sterujące przepływem programu.
Praca na tablicach znaków (char[]) oraz manipulacja pojedynczymi elementami tekstowymi w kontekście logicznym.
W tym zadaniu stworzymy bazę pod popularną grę w odgadywanie słów. Twoim zadaniem jest zainicjalizowanie stałego słowa do odgadnięcia (np. "PROGRAMOWANIE") oraz utworzenie tablicy znaków o tej samej długości, wypełnionej na początku znakami podkreślenia '_'. Gracz w pętli podaje pojedynczą literę. Program musi sprawdzić, czy litera ta występuje w słowie-zagadce, przechodząc przez tablicę znaków. Jeśli tak, należy odsłonić literę w odpowiednich miejscach tablicy maskującej. Gra toczy się do momentu, w którym wszystkie litery zostaną odgadnięte (brak znaków podkreślenia w tablicy). Do zamiany słowa na tablicę znaków wykorzystaj metodę .ToCharArray(). Zadanie to uczy operowania na typach char, porównywania znaków oraz synchronizacji dwóch zbiorów danych (słowa celowego i aktualnego stanu gry widocznego dla użytkownika).
Wprowadzenie do asocjacyjnych struktur danych typu Słownik (Dictionary) do zliczania unikalnych wystąpień kluczy.
Czasami musimy wiedzieć nie tylko, jakie dane posiadamy, ale ile razy każda z nich występuje. W tym zadaniu napiszemy program, który przeanalizuje krótkie zdanie wpisane przez użytkownika. Program powinien podzielić zdanie na pojedyncze słowa (metoda .Split()), a następnie zliczyć, ile razy każde słowo się powtarza. Do przechowania tych wyników użyjesz słownika Dictionary<string, int>, gdzie kluczem będzie słowo, a wartością liczba jego wystąpień. Przy każdym słowie sprawdź, czy znajduje się już w słowniku (metoda .ContainsKey()). Jeśli tak – zwiększ licznik, jeśli nie – dodaj nową parę z wartością 1. Na koniec wyświetl raport z częstotliwością słów. To zadanie uczy korzystania z niezwykle wydajnych struktur mapujących oraz podstaw czyszczenia i segmentacji danych tekstowych.
Implementacja wydajnego algorytmu wyszukiwania w posortowanym zbiorze danych (logarytmiczna złożoność obliczeniowa).
Wyszukiwanie liniowe (element po elemencie) jest nieefektywne przy dużych zbiorach danych. W tym zadaniu nauczysz się implementować wyszukiwanie binarne (Binary Search) na posortowanej tablicy liczb całkowitych. Algorytm ten polega na ciągłym dzieleniu zakresu poszukiwań na pół i porównywaniu wartości środkowej z szukaną liczbą. Twoim zadaniem jest stworzenie metody, która przyjmuje posortowaną tablicę oraz szukaną wartość, a następnie zwraca indeks tego elementu lub informację o jego braku. W opisie zadania należy podkreślić kluczowy warunek: wyszukiwanie binarne zadziała poprawnie tylko wtedy, gdy dane są już wcześniej uporządkowane. Zadanie to nie tylko uczy konkretnego algorytmu, ale przede wszystkim pokazuje, jak dobór odpowiedniej metody przetwarzania danych wpływa na wydajność i szybkość działania aplikacji. Jest to klasyczny przykład optymalizacji, który każdy programista powinien znać.
Opanowanie składni pętli foreach do eleganckiego i bezpiecznego procesowania elementów kolekcji.
Podczas gdy pętla for opiera się na indeksach, pętla foreach skupia się bezpośrednio na elementach kolekcji, co czyni kod czytelniejszym i mniej podatnym na błędy typu "off-by-one". W tym zadaniu Twoim celem jest stworzenie listy liczb (List<int>), a następnie obliczenie sumy kwadratów wszystkich jej elementów przy użyciu pętli foreach. Program powinien najpierw wygenerować lub pobrać od użytkownika zestaw liczb, a w kolejnym kroku przejść przez nie, podnosząc każdą do kwadratu i dodając do zmiennej sumującej. Zadanie to ma na celu pokazanie różnicy w czytelności kodu między tradycyjną pętlą indeksowaną a nowoczesnym podejściem iteracyjnym. Pętla foreach jest standardem w codziennej pracy programisty C#, szczególnie przy operowaniu na złożonych obiektach i kolekcjach generycznych, gdzie bezpo��redni dostęp do elementu jest ważniejszy niż znajomość jego pozycji.
Integracja różnych struktur danych (tablic wielowymiarowych i list) w jednej, funkcjonalnej aplikacji biznesowej.
Ostatnie zadanie wymaga połączenia wiedzy o tablicach i kolekcjach w celu stworzenia miniaturowego systemu rezerwacji biletów kinowych. Twoim zadaniem jest zamodelowanie układu sali kinowej o wymiarach 5x10 przy użyciu tablicy znaków char[,], gdzie '.' oznacza wolny fotel, a 'R' zarezerwowany. Dodatkowo, program musi prowadzić historię wszystkich dokonanych rezerwacji w formie listy ciągów znaków (List<string>), przechowując wpisy takie jak "Rząd 2, Miejsce 5 zarezerwowane o 14:30". Program powinien oferować menu pozwalające na podgląd sali, dokonanie rezerwacji oraz wyświetlenie dziennika zdarzeń (logów). Zadanie to symuluje realne problemy programistyczne, gdzie dane wizualne/strukturalne (mapa sali) są oddzielone od danych historycznych/zdarzeniowych (lista logów). Jest to doskonałe ćwiczenie z zakresu projektowania prostych systemów informatycznych oraz zarządzania stanem aplikacji poprzez współpracujące ze sobą kolekcje.