Zbiór zadań laboratoryjnych przygotowanych dla studentów pierwszego roku informatyki. Materiał obejmuje podstawy składni, typy danych, instrukcje sterujące oraz fundamenty programowania obiektowego w środowisku konsolowym.
Celem zadania jest zapoznanie studenta z fundamentalną strukturą pliku źródłowego w języku C# oraz konfiguracją środowiska programistycznego. Student nauczy się rozróżniać tradycyjny model klasowy z metodą Main od nowoczesnych instrukcji najwyższego poziomu (Top-level statements), co pozwoli na świadomy wybór architektury startowej aplikacji. Ćwiczenie kładzie nacisk na poprawne wykorzystanie przestrzeni nazw System oraz klasy Console do komunikacji z użytkownikiem.
Salon Auto-Premium decyduje się na wdrożenie prostego systemu powitalnego, który ma wyświetlać spersonalizowane komunikaty dla gości odwiedzających salon. Twoim zadaniem jest stworzenie prototypu aplikacji, która będzie stanowiła fundament dla bardziej rozbudowanego interfejsu klienta. Program musi witać użytkownika i podawać aktualny czas, co buduje wrażenie profesjonalizmu i dbałości o szczegóły już od pierwszej sekundy interakcji. Wykorzystasz do tego standardowe mechanizmy języka C#, aby zapewnić wysoką wydajność i stabilność narzędzia. Tego typu mikroserwisy są powszechnie stosowane w systemach Digital Signage na całym świecie. Twoja praca pozwoli na szybkie przetestowanie łączności z terminalem i poprawności wyświetlania znaków narodowych. To zadanie to pierwszy krok w budowie nowoczesnego wizerunku cyfrowego firmy.
Fundamentem każdej aplikacji w języku C# jest definicja punktu wejścia, który tradycyjnie stanowi metoda static void Main umieszczona wewnątrz klasy Program. W środowisku .NET Core 6.0 i nowszych wprowadzono mechanizm Top-level statements, który pozwala na pisanie kodu bezpośrednio w pliku, bez konieczności deklarowania jawnej klasy czy przestrzeni nazw. Kompilator pod spodem automatycznie generuje niezbędną infrastrukturę, co redukuje tzw. boilerplate code i przyspiesza proces prototypowania. Dyrektywa using System; informuje kompilator, że program będzie korzystał z typów zawartych w bazowej przestrzeni nazw platformy .NET. Klasa Console jest klasą statyczną, co oznacza, że nie wymaga tworzenia instancji obiektu przed wywołaniem jej metod takich jak WriteLine. Metoda WriteLine wysyła strumień danych tekstowych do standardowego wyjścia (stdout) i automatycznie dodaje znak końca linii. Właściwość DateTime.Now pobiera aktualny czas systemowy z zegara procesora, zwracając strukturę typu DateTime. Typ DateTime jest typem wartościowym (struct), co gwarantuje jego efektywne przechowywanie na stosie pamięci operacyjnej. Konkatenacja ciągów znaków za pomocą operatora + powoduje niejawne wywołanie metody ToString() na obiektach innych niż tekstowe. Przestrzenie nazw pełnią rolę kontenerów logicznych, zapobiegając konfliktom nazw w dużych systemach informatycznych. Zastosowanie bloku namespace PodstawyCS definiuje zakres widoczności dla klas zawartych wewnątrz tego pliku. Słowo kluczowe static oznacza, że dana metoda należy do typu, a nie do konkretnego obiektu, co jest kluczowe dla punktu startowego aplikacji. Parametr string[] args pozwala na przekazywanie argumentów wiersza poleceń do programu podczas jego uruchamiania. .NET Runtime (CLR) odpowiada za kompilację kodu JIT do instrukcji natywnych procesora w momencie egzekucji. Czytelność kodu w C# wspierana jest przez klamry {}, które wyznaczają granice bloków logicznych programu. Poprawna struktura pliku źródłowego jest pierwszym krokiem do zrozumienia cyklu życia aplikacji w ekosystemie Microsoft .NET.
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#.
Zadanie ma na celu opanowanie deklaracji i inicjalizacji podstawowych typów danych, takich jak string, int, double oraz bool. Student zdobędzie praktyczną umiejętność konwersji danych tekstowych pobranych z konsoli na typy liczbowe przy użyciu metod z rodziny Parse. Ważnym elementem jest również zrozumienie silnego typowania w C# oraz wykorzystanie interpolacji ciągów znaków do czytelnej prezentacji zgromadzonych informacji.
Dział marketingu Auto-Premium potrzebuje narzędzia do szybkiego zbierania profili klientów zainteresowanych jazdami próbnymi nowymi modelami aut. Jako programista musisz przygotować formularz elektroniczny, który precyzyjnie zarejestruje kluczowe parametry demograficzne i preferencyjne gości. System musi obsługiwać różne typy danych, od prostych imion po wartości liczbowe określające wzrost czy wiek, co jest niezbędne do poprawnego dopasowania ergonomii fotela kierowcy. Każda informacja musi zostać skonwertowana do odpowiedniego formatu, aby mogła być później przetworzona przez algorytmy analityczne CRM. Poprawna walidacja i typowanie danych na tym etapie zapobiegają kosztownym błędom w bazach danych w przyszłości. Tworzony przez Ciebie moduł będzie bezpośrednio wpływał na jakość obsługi klienta segmentu premium. Twoim celem jest zapewnienie maksymalnej czytelności i integralności gromadzonych informacji.
System typów w C# dzieli się na typy wartościowe oraz referencyjne, co determinuje sposób ich alokacji w pamięci RAM. Typ string jest typem referencyjnym, co oznacza, że zmienna przechowuje jedynie adres do danych znajdujących się na stercie. Z kolei typy int, double oraz bool są typami wartościowymi, które przechowują swoje dane bezpośrednio na stosie. Deklaracja zmiennej informuje kompilator o konieczności rezerwacji określonej liczby bajtów w pamięci: np. 32 bity dla int i 64 bity dla double. Metoda Console.ReadLine() odczytuje wejście użytkownika jako strumień string, co wymusza konwersję na typy numeryczne. Mechanizm int.Parse() analizuje ciąg znaków i próbuje zamienić go na 32-bitową liczbę całkowitą ze znakiem. Należy pamiętać, że podanie wartości nienumerycznej do metody Parse spowoduje rzucenie wyjątku FormatException i przerwanie działania programu. Typ double reprezentuje liczby zmiennoprzecinkowe o podwójnej precyzji, zgodne ze standardem IEEE 754, co pozwala na operacje na ułamkach. Wartości logiczne typu bool mogą przyjmować jedynie stany true lub false, zajmując teoretycznie jeden bajt pamięci. Interpolacja ciągów znaków, oznaczana symbolem $, pozwala na osadzanie wyrażeń bezpośrednio wewnątrz literałów tekstowych. Pod spodem kompilator zamienia interpolację na wywołanie metody string.Format, co jest rozwiązaniem wydajnym i bezpiecznym. Silne typowanie języka C# sprawia, że raz zadeklarowana zmienna nie może zmienić swojego typu w trakcie życia aplikacji. Inicjalizacja zmiennych polega na przypisaniu im wartości początkowej przed pierwszym użyciem, co zapobiega błędom dostępu do pamięci. Wykorzystanie metody Console.Write zamiast WriteLine pozwala na wprowadzenie danych w tej samej liniii, w której wyświetlany jest komunikat. Zmienne lokalne zadeklarowane wewnątrz metody Main przestają istnieć w momencie zakończenia jej wykonywania. Zrozumienie różnic między reprezentacją tekstową a binarną jest kluczowe dla poprawnego przetwarzania danych w systemach informatycznych.
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.
Głównym celem jest praktyczne zastosowanie instrukcji warunkowych if-else do implementacji złożonej logiki biznesowej opartej na wielu kryteriach wejściowych. Student nauczy się budować rozgałęzienia programu uwzględniające zmienne tekstowe i liczbowe, realizując algorytm sprawdzający uprawnienia emerytalne dla różnych płci. Ćwiczenie rozwija umiejętność precyzyjnego sterowania przepływem aplikacji oraz przetwarzania danych użytkownika w celu wygenerowania spersonalizowanych komunikatów.
W dziale HR firmy Auto-Premium planowanie sukcesji i zarządzanie kadrami wymaga precyzyjnych narzędzi do analizy stażu pracy oraz uprawnień emerytalnych pracowników. Musisz stworzyć moduł, który automatycznie zweryfikuje, czy dany pracownik zbliża się do wieku uprawniającego do świadczeń, uwzględniając przy tym różnice w przepisach dla kobiet i mężczyzn. System ma za zadanie wyeliminować błędy manualne przy wyliczaniu czasu pozostałego do zakończenia kariery zawodowej, co jest kluczowe dla stabilności operacyjnej firmy. Dzięki temu menedżerowie będą mogli z wyprzedzeniem planować rekrutację i szkolenia nowych specjalistów na zwalniające się stanowiska. Program musi w sposób elegancki i empatyczny komunikować wyniki, budując pozytywne relacje wewnątrz organizacji. Implementacja tej logiki to doskonały przykład automatyzacji procesów biznesowych w nowoczesnym przedsiębiorstwie. System ten stanie się częścią większego ekosystemu zarządzania zasobami ludzkimi.
Implementacja logiki decyzyjnej w C# opiera się na instrukcjach warunkowych if-else, które sterują przepływem sterowania procesora. Wyrażenie logiczne wewnątrz nawiasów if musi zwracać wartość typu bool, co jest wymuszane przez silne typowanie języka. Metoda ToUpper() wywoływana na obiekcie typu string zwraca nową instancję ciągu znaków z zamienionymi wszystkimi literami na wielkie. Porównywanie tekstów za pomocą operatora == w C# jest domyślnie czułe na wielkość liter, dlatego normalizacja danych wejściowych jest niezbędna. Zagnieżdżanie instrukcji if pozwala na tworzenie wielopoziomowych struktur logicznych zależnych od wielu zmiennych jednocześnie. Operatory porównania takie jak >= służą do weryfikacji relacji między dwiema wartościami numerycznymi typu int. Wynik operacji arytmetycznej 60 - wiek jest obliczany w czasie rzeczywistym i osadzany w ciągu znaków dzięki mechanizmowi interpolacji. Instrukcja else if pozwala na sprawdzenie kolejnego warunku tylko wtedy, gdy poprzednie zwróciły wartość false. Blok else stanowi gałąź domyślną, która wykonuje się, gdy żadna z wcześniejszych weryfikacji nie zakończyła się sukcesem. Zmienna plec przechowuje referencję do obiektu na stercie, podczas gdy wiek jest wartością stałą umieszczoną na stosie. Czytelność kodu wspierana jest przez wcięcia, które choć nie są wymagane przez kompilator, są standardem w profesjonalnym programowaniu. Wykorzystanie klamer {} jest zalecane nawet dla pojedynczych instrukcji, aby uniknąć błędów logicznych przy przyszłej rozbudowie kodu. .NET Runtime optymalizuje wykonanie instrukcji warunkowych poprzez mechanizm przewidywania skoków na poziomie sprzętowym. Obsługa różnych kryteriów dla kobiet i mężczyzn demonstruje, jak kod odzwierciedla realne zasady biznesowe i prawne. Programowanie defensywne wymagałoby tu również sprawdzenia, czy użytkownik nie podał wieku ujemnego lub nierealistycznie wysokiego. Prawidłowe rozgałęzienie algorytmu jest fundamentem budowy inteligentnych i interaktywnych systemów ekspertowych.
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.
Celem ćwiczenia jest biegłe posługiwanie się operatorami arytmetycznymi oraz zrozumienie różnic między typami zmiennoprzecinkowymi, ze szczególnym uwzględnieniem typu decimal w obliczeniach finansowych. Student nauczy się implementować algorytmy podatkowe (VAT) oraz automatyzować wyliczenia brutto dla wielu jednostek towaru. Istotnym aspektem jest opanowanie specyfikatorów formatowania walutowego, które pozwalają na profesjonalną prezentację wyników zgodnie z ustawieniami regionalnymi systemu.
Salon Auto-Premium operuje na towarach o wysokiej wartości, gdzie każda operacja finansowa musi być wykonana z najwyższą matematyczną precyzją. Twoim zadaniem jest opracowanie modułu kalkulacyjnego do wystawiania faktur proforma, który bezbłędnie przeliczy wartości netto na brutto przy różnych stawkach VAT. Wykorzystanie typu decimal jest tu kluczowe, aby uniknąć błędów zaokrągleń binarnego typu double, które mogłyby prowadzić do niezgodności z przepisami skarbowymi. System musi również obsługiwać zakupy hurtowe dla klientów flotowych, dynamicznie przeliczając sumaryczne koszty zamówienia. Profesjonalna prezentacja wyników z użyciem symboli walutowych podnosi zaufanie klientów do rzetelności salonu. Dzięki temu narzędziu doradcy handlowi mogą błyskawicznie przygotować wiarygodną ofertę cenową. To zadanie uczy odpowiedzialności za kod operujący na realnych środkach finansowych firmy.
W obliczeniach finansowych krytyczne jest użycie typu decimal, który oferuje precyzję dziesiętną i eliminuje błędy zaokrągleń binarnych. Typ decimal zajmuje 128 bitów i pozwala na zachowanie do 28-29 cyfr znaczących, co czyni go standardem w systemach ERP. Literały typu decimal wymagają sufiksu m, co jednoznacznie wskazuje kompilatorowi pożądany typ danych. Operatory arytmetyczne takie jak mnożenie oraz dzielenie mają ustalone priorytety wykonania zgodne z zasadami matematyki. Kolejność działań można jawnie wymusić poprzez zastosowanie nawiasów okrągłych, co zwiększa przewidywalność wyników algorytmu. Specyfikator formatu :C wewnątrz klamer interpolacji automatycznie formatuje liczbę zgodnie z lokalnymi ustawieniami walutowymi systemu operacyjnego. Dzięki temu na polskim systemie program automatycznie doda symbol "zł" i zastosuje przecinek jako separator dziesiętny. Typ int służy do przechowywania liczby sztuk towaru, ponieważ jest to wartość niepodzielna i całkowita z natury biznesowej. Niejawna konwersja z int na decimal zachodzi automatycznie, gdyż nie wiąże się ona z ryzykiem utraty danych. Odwrotna konwersja z decimal na int wymagałaby jawnego rzutowania i skutkowałaby odcięciem części ułamkowej. Obliczanie podatku VAT jako cenaNetto * vat / 100 demonstruje prostą, lecz skuteczną implementację logiki skarbowej. Przechowywanie wyników pośrednich w zmiennych takich jak kwotaVat ułatwia debugowanie i zwiększa czytelność kodu źródłowego. Metoda decimal.Parse() jest wrażliwa na kulturę systemową, co należy uwzględnić przy wprowadzaniu danych z kropką zamiast przecinka. Zastosowanie stałych podatkowych pozwala na łatwą aktualizację algorytmu w przypadku zmiany przepisów prawa. Arytmetyka typu decimal jest wolniejsza niż typu double, ale gwarantuje absolutną zgodność z wymaganiami księgowymi. Profesjonalne formatowanie raportu finansowego buduje zaufanie użytkownika do precyzji działania całego systemu informatycznego.
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.
Zadanie koncentruje się na budowie zaawansowanych struktur decyzyjnych z wykorzystaniem operatorów logicznych koniunkcji i alternatywy do weryfikacji wielopoziomowych uprawnień zniżkowych. Student zdobędzie umiejętność łączenia instrukcji if-else z konstrukcją switch, co pozwoli na efektywne zarządzanie różnymi wariantami cenowymi seansów kinowych. Ćwiczenie uczy projektowania przejrzystych algorytmów dla scenariuszy, w których wynik zależy od kombinacji wieku, statusu studenta oraz wybranego trybu usługi.
W ramach rozszerzenia działalności, Auto-Premium planuje otworzyć ekskluzywne kino samochodowe dla swoich najbardziej lojalnych klientów. Musisz zaprojektować system sprzedaży biletów, który automatycznie przydziela zniżki na podstawie wieku oraz statusu uczestnika programu lojalnościowego. Logika systemu musi być elastyczna i pozwalać na doliczanie opłat za specjalne seanse w formacie 3D oraz obsługę darmowych wejść dla najmłodszych. Precyzyjne połączenie wielu warunków logicznych pozwoli na sprawne zarządzanie ruchem przy wjeździe i uniknięcie kolejek. System musi być intuicyjny dla operatora, wyświetlając jasne komunikaty o finalnej cenie po uwzględnieniu wszystkich benefitów. Taka automatyzacja jest niezbędna do zachowania standardów premium podczas wydarzeń masowych organizowanych przez markę. Twoim zadaniem jest stworzenie silnika decyzyjnego, który poradzi sobie z każdą kombinacją danych wejściowych.
Zaawansowana logika biletowa wymaga zastosowania operatorów logicznych koniunkcji && oraz alternatywy ||. Operator && zwraca prawdę tylko wtedy, gdy oba warunki składowe są spełnione, co pozwala na precyzyjne filtrowanie uprawnień. C# stosuje mechanizm short-circuiting, co oznacza, że w wyrażeniu A && B, jeśli A jest fałszywe, warunek B nie jest w ogóle sprawdzany. Instrukcja switch jest wydajną alternatywą dla wielu instrukcji if-else, gdy sprawdzamy wartość jednej zmiennej względem wielu stałych. Każda sekcja case wewnątrz switcha musi kończyć się instrukcją skoku, najczęściej break, aby uniknąć błędów wykonania. Słowo kluczowe default definiuje zachowanie programu w przypadku, gdy żadna z wartości Case nie pasuje do testowanej zmiennej. Typ bool przechowuje wynik porównania == "T", co pozwala na proste i czytelne sprawdzanie posiadania legitymacji studenckiej. Zmienne typu decimal użyte do przechowywania ceny gwarantują odporność na błędy precyzji przy obliczaniu zniżek procentowych. Zastosowanie mnożnika 0.5m przy obliczaniu zniżki 50% jest przykładem deklaracji stałej typu decimal bezpośrednio w kodzie. Hierarchia warunków od najmłodszych do najstarszych zapewnia poprawność klasyfikacji bez konfliktów logicznych. Operator przypisania złożonego += dodaje wartość dopłaty do aktualnego stanu zmiennej cena, skracając zapis kodu. Wartość cenaBazowa jest zadeklarowana jako int, ale przy operacjach z decimal jest automatycznie promowana do wyższego typu. .NET Runtime optymalizuje instrukcję switch za pomocą tablic skoków, co czyni ją szybszą przy dużej liczbie opcji. Logika systemu kinowego demonstruje, jak programowo odwzorować skomplikowane polityki cenowe stosowane w usługach. Zastosowanie typu string dla typu seansu pozwala na łatwą rozbudowę o nowe formaty, takie jak IMAX czy 4DX. Poprawna weryfikacja wieku i statusu studenta jest fundamentem sprawiedliwego i efektywnego systemu dystrybucji biletów.
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.
Celem zadania jest dogłębne zrozumienie mechanizmu działania zagnieżdżonych pętli for oraz ich wykorzystania do generowania dwuwymiarowych struktur danych w formacie tekstowym. Student nauczy się kontrolować iteracje wierszy i kolumn, tworząc czytelną tabliczkę mnożenia o określonych wymiarach. Dodatkowo, ćwiczenie kładzie nacisk na estetykę interfejsu konsolowego poprzez zastosowanie metod wyrównywania tekstu, takich jak PadLeft, co zapewnia idealną geometrię raportu.
Dział logistyki Auto-Premium potrzebuje narzędzia do generowania matryc cenowych dla usług serwisowych zależnych od czasu pracy i stawki godzinowej. Twoim zadaniem jest stworzenie generatora tabelarycznych zestawień, które pozwolą doradcom serwisowym na błyskawiczne odczytanie kosztów standardowych napraw. Wykorzystanie zagnieżdżonych pętli pozwoli na automatyczne wygenerowanie czytelnej struktury danych, która będzie stanowić podstawę dla cenników w salonach na całym świecie. Musisz zadbać o idealne wyrównanie kolumn, aby raport był czytelny nawet przy druku w małym formacie. Taka automatyzacja eliminuje potrzebę ręcznego tworzenia zestawień w arkuszach kalkulacyjnych i zmniejsza ryzyko błędu ludzkiego. Dzięki temu modułowi proces ofertowania w serwisie stanie się znacznie szybszy i bardziej profesjonalny. To ćwiczenie uczy budowania strukturalnych raportów danych w środowisku konsolowym.
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).
Zadanie ma na celu nauczenie studenta obsługi procesów iteracyjnych o nieokreślonej z góry liczbie powtórzeń przy użyciu pętli while oraz zarządzania stanem gry za pomocą flag logicznych. Student pozna zasady generowania liczb pseudolosowych klasą Random oraz budowania interaktywnego dialogu z użytkownikiem opartego na systemie podpowiedzi. Programowanie mechaniki gry pozwala na praktyczne przećwiczenie obsługi błędnych danych wejściowych oraz implementację liczników monitorujących wydajność działań gracza.
W ramach systemów rozrywki pokładowej dla najmłodszych pasażerów luksusowych limuzyn Auto-Premium, projektujesz prostą, ale wciągającą grę edukacyjną. Zadaniem aplikacji jest trening logicznego myślenia i szacowania wartości liczbowych poprzez interaktywną zabawę w zgadywanie. System musi dynamicznie reagować na strzały użytkownika, dostarczając precyzyjnych wskazówek naprowadzających na cel. Implementacja licznika prób pozwoli na wprowadzenie elementu grywalizacji, motywując pasażerów do bicia własnych rekordów podczas długich podróży. Gra musi być odporna na nieoczekiwane dane wejściowe, zapewniając nieprzerwaną zabawę bez awarii systemu operacyjnego kokpitu. Ten moduł to świetny przykład tworzenia oprogramowania interaktywnego, które angażuje użytkownika w czasie rzeczywistym. Twoja praca przyczyni się do podniesienia komfortu podróży całej rodziny.
Gra opiera się na pętli while, która kontynuuje swoje działanie tak długo, jak długo warunek logiczny pozostaje prawdziwy. Klasa Random służy do generowania liczb pseudolosowych, wykorzystując aktualny czas systemowy jako domyślne ziarno. Metoda rnd.Next(1, 101) zwraca liczbę całkowitą większą lub równą 1 i mniejszą niż 101, co definiuje zakres poszukiwań. Zmienna flagowa odgadnieto typu bool steruje cyklem życia gry, pozwalając na jej przerwanie po osiągnięciu sukcesu. Operator negacji ! w warunku pętli sprawia, że blok kodu wykonuje się, gdy flaga ma wartość false. Licznik prób licznik++ jest inkrementowany przy każdym obrocie pętli, rejestrując wysiłek gracza w czasie rzeczywistym. Instrukcja int.Parse wewnątrz pętli pobiera strzał użytkownika, co wymaga ostrożności przy wprowadzaniu danych nienumerycznych. Struktura if-else if-else precyzyjnie klasyfikuje odpowiedź gracza względem tajnej liczby, dając natychmiastowy feedback. Po odgadnięciu liczby, flaga zmienia wartość na true, co przy kolejnym sprawdzeniu warunku pętli powoduje wyjście z iteracji. Finalny komunikat z wynikiem jest wyświetlany już poza blokiem pętli, wykorzystując zgromadzone w liczniku dane. .NET Garbage Collector automatycznie zarządza pamięcią zajmowaną przez obiekt klasy Random po zakończeniu działania programu. Pętla while jest idealna w sytuacjach, gdy nie znamy dokładnej liczby iteracji potrzebnych do osiągnięcia celu. Możliwość przerwania pętli za pomocą słowa kluczowego break byłaby alternatywnym sposobem implementacji wyjścia z gry. Interaktywność programu buduje zaangażowanie użytkownika i demonstruje responsywność aplikacji konsolowych. Projektowanie mechaniki gry uczy zarządzania stanem aplikacji i obsługi błędów w dynamicznym środowisku uruchomieniowym. Zastosowanie algorytmów losowych jest fundamentem wielu systemów symulacyjnych i rozrywkowych.
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.
Głównym celem jest opanowanie zasad modularności kodu i dekompozycji złożonych problemów na mniejsze, reużywalne jednostki funkcjonalne zwane metodami. Student nauczy się definiować metody z parametrami wejściowymi i zwracanymi wartościami, co pozwoli na separację logiki obliczeniowej od interfejsu użytkownika. Ćwiczenie utrwala dobre praktyki programistyczne, takie jak zasada DRY, oraz uczy efektywnego przekazywania danych między różnymi blokami kodu w ramach jednej klasy.
Inżynierowie Auto-Premium pracują nad systemem adaptacji klimatyzacji dla pojazdów eksportowanych na rynki globalne, gdzie stosowane są różne skale temperatur. Twoim zadaniem jest stworzenie biblioteki konwersji termicznej, która w sposób modularny i reużywalny obsłuży przeliczanie stopni Celsjusza na Fahrenheita i odwrotnie. Zastosowanie własnych metod pozwoli na czysty podział logiki, co ułatwi późniejszą integrację z głównym komputerem pokładowym pojazdu. Program musi być przygotowany na obsługę precyzyjnych danych z czujników zewnętrznych, gwarantując niezawodność odczytów w ekstremalnych warunkach pogodowych. Unikanie powtarzalności kodu (zasada DRY) sprawi, że system będzie łatwiejszy w utrzymaniu i dalszej rozbudowie o nowe skale, np. Kelvina. Dzięki temu narzędziu systemy komfortu termicznego będą działać poprawnie niezależnie od kraju przeznaczenia auta. Budujesz tutaj profesjonalny fundament pod zaawansowaną inżynierię oprogramowania.
Metody w C# pozwalają na enkapsulację logiki, co promuje reużywalność kodu i ułatwia jego testowanie jednostkowe. Definicja metody składa się z modyfikatora dostępu, typu zwracanego, unikalnej nazwy oraz listy parametrów w nawiasach. Słowo kluczowe static oznacza, że metoda należy do klasy i może być wywołana bez tworzenia obiektu tej klasy. Typ zwracany double określa, jakiego rodzaju dane zostaną wysłane z powrotem do miejsca wywołania po zakończeniu obliczeń. Instrukcja return kończy wykonywanie metody i przekazuje wynikową wartość do nadrzędnego bloku kodu. Parametry wejściowe, takie jak double celsjusz, działają jako zmienne lokalne widoczne wyłącznie wewnątrz danej metody. Wywołanie metody polega na podaniu jej nazwy wraz z argumentami, co powoduje skok procesora do adresu pamięci, gdzie zapisany jest kod metody. Po wykonaniu metody sterowanie wraca do kolejnej linii kodu po miejscu wywołania, co zarządza stos wywołań. Zasada DRY jest tu realizowana poprzez uniknięcie wielokrotnego wpisywania wzorów matematycznych w różnych częściach programu. Modularność pozwala na niezależną modyfikację algorytmu konwersji bez wpływania na logikę wyświetlania menu w metodzie Main. Sygnatura metody unikalnie identyfikuje ją w systemie, co pozwala na przeciążanie metod o tej samej nazwie, ale różnych parametrach. Przekazywanie argumentów przez wartość sprawia, że metoda pracuje na kopii danych, nie modyfikując oryginalnych zmiennych z zewnątrz. Zastosowanie metod statycznych jest typowe dla klas narzędziowych oraz prostych skryptów obliczeniowych. Dokumentowanie metod za pomocą komentarzy XML ułatwia zrozumienie ich przeznaczenia innym programistom w zespole. Podział programu na mniejsze funkcje jest kluczowym krokiem w ewolucji od programowania strukturalnego do obiektowego. Dobrze zaprojektowane metody stanowią stabilne cegiełki, z których budowane są najbardziej skomplikowane systemy informatyczne.
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.
Celem ćwiczenia jest wprowadzenie do paradygmatu programowania obiektowego (OOP) poprzez samodzielne zaprojektowanie klasy stanowiącej szablon dla rzeczywistych obiektów. Student nauczy się definiować pola przechowujące stan oraz metody opisujące zachowanie obiektów, a także zrozumie proces instancjonowania klas za pomocą operatora new. Zadanie pozwala dostrzec różnicę między statyczną definicją typu a dynamicznym życiem obiektu w pamięci operacyjnej komputera.
Centrum szkoleniowe Auto-Premium potrzebuje nowoczesnej bazy danych do zarządzania profilami kursantów uczestniczących w akademiach bezpiecznej jazdy. Musisz zaprojektować system oparty na obiektach, który pozwoli na cyfrowe odwzorowanie uczestników szkolenia wraz z ich unikalnymi identyfikatorami. Wykorzystanie paradygmatu obiektowego umożliwi łatwe zarządzanie tysiącami rekordów i przypisywanie im konkretnych zachowań, jak np. automatyczne przedstawianie się w raportach. Taka architektura pozwala na łatwe rozszerzanie systemu o nowe cechy, jak poziom umiejętności czy historia ukończonych kursów. Dzięki instancjonowaniu klas, program staje się bardziej elastyczny i lepiej oddaje rzeczywistą strukturę organizacji. Twoim celem jest stworzenie solidnego szablonu danych, który stanie się sercem systemu ewidencji dydaktycznej salonu. To zadanie to brama do budowy profesjonalnych aplikacji korporacyjnych klasy Enterprise.
Klasa w języku C# jest definicją typu, która pełni rolę szablonu lub projektu architektonicznego dla przyszłych obiektów. Słowo kluczowe class inicjuje deklarację, która może zawierać pola oraz metody. Pola zadeklarowane jako public są dostępne dla kodu zewnątrz klasy, co pozwala na bezpośrednią modyfikację stanu obiektu. Tworzenie obiektu odbywa się za pomocą operatora new, który alokuje pamięć na stercie. Zmienna referencyjna nie przechowuje samego obiektu, lecz adres do miejsca w pamięci, gdzie obiekt się znajduje. Operator kropki służy do uzyskiwania dostępu do składowych obiektu, takich jak właściwości Imie czy metoda PrzedstawSie. Każda instancja klasy posiada własny, niezależny zestaw pól, co pozwala na przechowywanie różnych danych dla różnych studentów. Metoda PrzedstawSie ma dostęp do pól instancyjnych klasy, co demonstruje spójność danych i funkcjonalności w programowaniu obiektowym. Brak słowa static przy metodzie wewnątrz klasy oznacza, że jest to metoda instancyjna, wymagająca obiektu do działania. Konstruktor domyślny jest automatycznie generowany przez kompilator i służy do inicjalizacji nowego obiektu. Paradygmat OOP pozwala na modelowanie rzeczywistości poprzez obiekty, co znacznie ułatwia projektowanie dużych systemów biznesowych. Hermetyzacja, choć tu uproszczona, jest docelowo realizowana poprzez właściwości z akcesorami get i set. Cykl życia obiektu kończy się, gdy przestają do niego prowadzić jakiekolwiek referencje, a pamięć odzyskuje Garbage Collector. Klasy mogą być umieszczane w oddzielnych plikach, co sprzyja organizacji dużych projektów programistycznych. Programowanie obiektowe jest standardem w tworzeniu aplikacji Enterprise, frameworków webowych oraz silników gier. Zrozumienie różnicy między typem a bytem jest fundamentem nowoczesnej inżynierii oprogramowania.
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.
Zadanie stanowi kompleksowe podsumowanie materiału, mające na celu integrację wszystkich poznanych struktur sterujących i typów danych w ramach jednej aplikacji biznesowej. Student nauczy się projektować zaawansowane raporty tekstowe z wykorzystaniem precyzyjnego pozycjonowania kolumn i formatowania dat, co jest kluczowe w systemach raportowych. Celem jest wypracowanie umiejętności tworzenia czytelnych, profesjonalnych zestawień danych, które łączą wyniki obliczeń matematycznych z estetyczną prezentacją wizualną w konsoli.
Zarząd Auto-Premium wymaga generowania czytelnych, miesięcznych raportów z postępów wdrożeń nowych technologii we wszystkich oddziałach firmy. Twoim zadaniem jest stworzenie modułu raportującego, który zintegruje dane o statusach projektów i ich procentowym zaawansowaniu w formie profesjonalnej tabeli. Musisz wykazać się biegłością w precyzyjnym formatowaniu tekstu, aby zestawienia były przejrzyste dla audytorów i dyrekcji. System musi automatycznie obliczać globalne wskaźniki efektywności, co pozwoli na szybką ocenę kondycji całego przedsiębiorstwa. Taki standard raportowania podnosi prestiż firmy i ułatwia podejmowanie kluczowych decyzji biznesowych na podstawie rzetelnych danych. Wykorzystasz do tego zaawansowane techniki manipulacji ciągami znaków, tworząc estetyczny i funkcjonalny interfejs tekstowy. Twoja praca stanowi finalne ogniwo w procesie cyfryzacji obiegu informacji w Auto-Premium.
Zaawansowana interpolacja ciągów znaków pozwala na precyzyjne sterowanie layoutem tabelarycznym za pomocą specyfikatorów wyrównania. Zapis {Zadanie,-25} oznacza, że tekst zostanie wyrównany do lewej strony w polu o stałej szerokości 25 znaków. Wartości dodatnie skutkują wyrównaniem do prawej, co jest przydatne przy prezentacji kolumn numerycznych. Konstrukcja new string('-', 46) dynamicznie tworzy linię oddzielającą o zadanej długości, unikając ręcznego wpisywania znaków. Obliczanie procentowego postępu wymaga rzutowania jednego z operandów na typ double lub decimal, aby uniknąć dzielenia całkowitoliczbowego. Wynik dzielenia w typach całkowitych mógłby wynieść 0, dlatego użycie typów zmiennoprzecinkowych jest tu niezbędne do uzyskania precyzji. Specyfikator formatu :P2 automatycznie mnoży wartość przez 100 i dodaje symbol procenta z dwoma miejscami po przecinku. Pętla for iteruje po zbiorze danych, generując kolejne wiersze raportu w sposób ustrukturyzowany i powtarzalny. Zastosowanie stałych szerokości kolumn sprawia, że raport zachowuje swoją geometrię nawet przy różnej długości nazw zadań. Nagłówek i stopka tabeli są wyświetlane poza pętlą, co tworzy logiczną klamrę spinającą prezentowane dane. C# pozwala na łączenie specyfikatorów wyrównania i formatowania w jednym wyrażeniu. Metoda Console.WriteLine dba o poprawne wyświetlanie znaków specjalnych i separatorów zależnych od regionu. Profesjonalne raporty tekstowe są podstawą systemów logowania, audytu oraz narzędzi diagnostycznych w IT. Czystość i estetyka wyjścia konsolowego bezpośrednio wpływają na użyteczność i odbiór aplikacji przez użytkownika końcowego. Integracja wszystkich poznanych elementów składni w tym zadaniu potwierdza gotowość studenta do budowy samodzielnych modułów. Opanowanie technik formatowania jest niezbędne przy generowaniu plików tekstowych, logów systemowych oraz dokumentacji technicznej.
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.