Zadania do kursu .NET --------------------- * Napisz metodę rozszerzającą (rozszerzenie) dla typu string o nazwie Reverse, która przyjmuje łańcuch i zwraca nowy łańcuch o znakach w odwróconej kolejności. * Do metody dodaj argument-delegację, która zostanie wywołana po odwróceniu łańcucha i przekaże odwrócony łańcuch (tzw. call-back). * Napisz klasę, która przyjmuje łańcuch, odwraca go i powiadamia zdarzeniem, że wynik można odebrać z własności. Odwrócony łańcuch jest także przekazywany przez argumenty zdarzenia. * Napisz klasę, która korzystając z narzędzi w przestrzeni nazw System.IO umie asynchronicznie przejrzeć podfoldery wskazanej ścieżki na dysku i gromadzi wszystkie ścieżki plików. a. Do przechowania ścieżek plików użyj kolekcji. b. Do przechowania ścieżek plików użyj instancji klasy StringBuilder (ścieżki rozdzielone znakiem |). * Zmodyfikuj powyższą klasę w wersji a tak, żeby implementowała interfejs IEnumerable i przygotuj zapytania pobierające ścieżki zawierające w nazwie określony fragment tekstu. * W klasie z zadań 2 i 3 zdefiniuj zdarzenia informujące o znalezieniu nowego pliku i zakończeniu przeszukiwania. * Rozszerz klasę o możliwość zapisu zebranych ścieżek do pliku (metoda Zapisz) oraz możliwość wczytywania ich z pliku (pseudokonstruktor Wczytaj). * Napisz metodę, która przyjmuje przez argument-delegację referencję do funkcji o sygnaturze "double f(double x)". Metoda powinna obliczać wartość pochodnej funkcji dla wskazanego argumentu x korzystając z ilorazu różnicowego lub wzoru trójpunktowego poznanego na wykładzie "Fizyka dla informatyków, cz. 2". * Zdefiniuj strukturę, która opisuje liczbę wymierną (ułamek z dwóch liczb całkowitych) spełniająca następujące warunki z operatorami dodawania, odejmowania, mnożenia i dzielenia, własnościami zwracającymi część rzeczywistą i urojoną oraz helper pozwalający na obliczenie pierwiastka z podanej w argumencie liczby. * Strukturę z powyższego zadania obłóż testami jednostkowymi. * Zmodyfikuj strukturę Ulamek w taki sposób, żeby implementowała interfejs IConvertible. W przypadku metod konwertujących na typy, które nie są liczbami (np. DateTime) zgłoś wyjątek. Przygotuj testy jednostkowe dla metod deklarowanych w tym interfejsie. * Zdefiniuj rozszerzenie dla klasy Ułamek, które z obiektu przesłanego w argumencie wyznacza i zwraca w postaci krotki trzy liczby: część całkowitą oraz licznik i mianownik ułamka właściwego. Jeżeli przesłany do rozszerzenia ułamek jest właściwy, to wynikiem jest zero oraz licznik i mianownik tego ułamka. Jeżeli jednak jest to ułamek niewłaściwy, to wynikiem jest całość oraz licznik i mianownik liczby mieszanej. * Wykorzystaj zdarzenie zdefiniowane w klasie "procesora" maszyny Turinga, żeby bez ingerencji w kod tej klasy wykryć, czy nie doszło do zapętlenia maszyny. * Zdefiniuj klasę o nazwie KlasaZLicznikiem, która w statycznym prywatnym polu przechowuje liczbę utworzonych instancji, zwiększaną w konstruktorze, który trzeba zdefiniować. Udostępnij tę liczbę w publicznej własności. Napisz testy jednostkowe sprawdzające działanie klasy. * Korzystając z możliwości definiowania typów ogólnych (generic) czyli typów z parametrem postaraj się napisać własną implementację klas Nullable<> i Lazy<>. * Przećwicz korzystanie z LINQ na prostej kolekcji. W tym celu w aplikacji konsolowej zdefiniuj tablicę łańcuchów: string[] slowa = { "czereśnia", "jabłko", "borówka", "wiśnia", "jagoda", "gruszka", "śliwka", "malina" }; * Następnie korzystając z metod rozszerzających LINQ, wyświetl: a. najdłuższą i najkrótszą długość słowa (rozszerzenia Min i Max), b. średnią długość słów (Average), c. całkowitą liczbę liter we wszystkich słowach (Sum). * Przygotuj zapytania LINQ, które: a. zwraca wszystkie słowa o długości większej niż 6 liter posortowane alfabetycznie, b. zwraca wszystkie słowa o długości większej niż 6 liter posortowane według ich długości, c. zwraca wszystkie słowa kończące się na „a” posortowane według ostatniej litery, d. zwraca długości poszczególnych słów posortowane według alfabetycznej kolejności tych słów, e. jak w podpunkcie d), ale tylko dla słów, które zawierają literę „o”, f. zwraca słowa z tablicy ze zmienionymi literami na duże. Korzystając z technologii P/Invoke * Zaimportuj metodę Beep i odegraj "Wlazł kotek na płotek" (lub marsz imperialny). * Odczytaj ilość wolnego miejsca na dysku (można to też zrobić nie korzystając z P/Invoke). * W aplikacji konsolowej wczytać i wyświetlić za pomocą LINQ to XML aktualne kursy walut USD i EUR odczytane z pliku https://static.nbp.pl/dane/kursy/xml/LastA.xml * Zmodyfikować klasę BazaDanych z projektu dotyczącego EF + SQLite, aby można było wskazać dowolną klasę Osoba jako jej parametr (adresy można pominąć) Próbne kolokwium: ----------------- Zestawy obejmują zagadnienia, które mogły być jeszcze nie omówione na zajęciach, w szczególności obsługę danych (np. CSV, XML, EF/SQLite). Zestaw 1 -------- 1. Zdefiniuj strukturę-rekord 'Słowo' zawierającą łańcuch (tekst słowa), dwa pola typu int (długość słowa i liczba samogłosek) i pole typu double (procent samogłosek). Z kolekcji 'słowa' (z zadania powyżej) wybierz za pomocą zapytania LINQ łańcuchy, które mają długość 6 i umieść informacje o nich w kolekcji List. Zrealizuj to za pomocą jednego zapytania LINQ. 2. Korzystając z LINQ to XML (XDocument) umieść słowa z listy List w pliku XML o korzeniu 'słowa' i elementach 'słowo'. Obie liczby umieść atrybutach elementu 'słowo', natomiast tekst powinien być jego zawartością. Zadbaj, aby liczba double z ostatniej kolumny została zapisana z formatowaniem Invariant (kropka zamiast przecinka). 3. Do bazy danych SQLite zapisz cztery kolumny danych odpowiadające elementom z oryginalnej kolekcji 'słowa': tekst słowa, długość wyrazu, liczbę samogłosek oraz procent samogłosek wśród liter. Użyj EF. 4. Przygotuj metodę odczytującą tabelę z SQLite i zwracającą tablicę krotek z nazwanymi danymi z wszystkich kolumn. Kod metody powinien być otoczony konstrukcją try..catch, a metoda powinna zwracać wartość bool świadczącą o tym, czy plik udało się zapisać bez wyjątku. 5. Metodę odpowiedzialną za odczyt danych z SQLite przekształć w metodę asynchroniczną (zwracającą obiekt zadania Task). Zestaw 2 -------- 1. Zdefniuj strukturę-rekord 'InformacjeODysku' przechowującą następujące informacje o dyskach: litera, etykieta, procent wolnego miejsca (jako liczba double). Utwórz kolekcję takich rekordów na podstawie informacji podanych poniżej wybierając tylko te dyski, które mają więcej niż 20% wolnego miejsca i posiadają etykietę (użyj zapytania LINQ). 2. Do pliku XML zapisz informacje o dyskach logicznych z kolekcji. Korzeń 'dyski', a poszczególne informacje w elementach 'dysk' z poszczególnymi parametrami w atrybutach. Zadbaj, aby liczba double z ostatniej kolumny została zapisana z formatowaniem Invariant (kropka zamiast przecinka). Wykorzystaj LINQ to XML 3. Te same informacje zapisz do jednej tabeli w bazie SQLite korzystając z EF. 4. Przygotuj metodę, która będzie odczytywała te informacje z tabeli. Kod metody powinien być otoczony konstrukcją try..catch, a metoda powinna zwracać wartość bool świadczącą o tym, czy plik udało się zapisać bez wyjątku. 5. Metodę odpowiedzialną za odczyt danych z SQLite przekształć w metodę asynchroniczną (zwracającą obiekt zadania Task). C: System 0.345 D: Dane 0.123 E: CD-ROM 1.000 N: 0.456 M: Media 0.005 Z: Sieciowy 0.567 Zestaw 3 -------- 1. Zdefiniuj strukturę-rekord 'Liczba', która przechowuje wartość liczby całkowitej typu int, dwa pola typu bool przechowujące informację o tym, czy liczba jest parzysta i czy mieści się w przedziale od 20 do 40 (z obu stron włącznie) oraz pole typu double zawierające liczbę podzieloną przez Math.PI. Wylosuj 100 liczb całkowitych (int) z zakresu od 0 do 100 i umieść w kolekcji 'liczby' typu List te z nich, które są podzielne przez 3 i mają wartości mniejsze od 50 (użyj zapytania LINQ). 2. Korzystając z LINQ to XML umieść liczby z listy typu List w pliku XML o korzeniu 'liczby' i elementach 'liczba'. Wartość ma być umieszczona w zawartości elementu 'liczba', a parzystość i należenie do przedziału [20,40] - w atrybutach. 3. Te same dane zapisz także do tabeli w bazie SQLite z czterema kolumnami: wartość liczby, wartość zaokrągloną do dziesiątek i słowa 'tak' lub 'nie' w zależności od tego, czy jest parzysta i czy należy do przedziału [20,40]. 4. Przygotuj metodę, która będzie odczytywała te informacje z tabeli. Kod metody powinien być otoczony konstrukcją try..catch, a metoda powinna zwracać wartość bool świadczącą o tym, czy plik udało się zapisać bez wyjątku. 5. Metodę odpowiedzialną za odczyt danych z SQLite przekształć w metodę asynchroniczną (zwracającą obiekt zadania Task). Zestaw 4 -------- 1. Przygotuj metodę wczytującą plik CSV rozdzielany średnikami 'dplyr_starwars.csv' i zapisującą do dowolnej kolekcji danych nazwę, wysokość i kolor skóry postaci. Elementem kolekcji powinna być krotka (nowa z C# 8.0), która powinna przechowywać wymienione wyżej cechy (łańcuch, liczba całkowita i typ wyliczeniowy). Link do pliku: https://jacekmatulewski.fizyka.umk.pl/dydaktyka/net/zrodla/2023Z/dane/dplyr_starwars.csv 2. Przygotuj zapytanie LINQ, które wyświetla nazwy osób z kolekcji stworzonej w pierwszym zadaniu o wzroście większym lub równym 200. 3. Do pliku XML zapisz informacje o postaciach z poprzednich zadań (tylko te trzy kolumny, które były wczytane do kolekcji). Korzeń struktury powinien mieć nazwę 'postaci', a elementy zawierające poszczególne informacje o postaciach powinny nazywać się 'postac'. Wartości z kolumn powinny być zapisane w atrybutach elementu 'postac'. 4. Kod odpowiedzialny za zapis do pliku XML powinien być otoczony konstrukcją try..catch, a metoda powinna zwracać wartość bool świadczącą o tym, czy plik udało się zapisać bez wyjątku. 5. Pliki XML zapisz do katalogu domowego użytkownika odczytanego za pomocą metod klasy Environment. 6. Przygotuj test jednostkowy, który sprawdza metodę z zadania 1, weryfikując liczbę pobranych elementów z pliku CSV. Zestaw 5 -------- 1. Przygotuj metodę wczytującą plik CSV rozdzielany przecinkami 'oscar_age_female.csv' i zapisującą do dowolnej kolekcji danych personalia, wiek i rok przyznania oskara. Elementem kolekcji powinna być krotka (nowa z C# 8.0), która powinna przechowywać wymienione wyżej cechy (łańcuch i dwie liczby całkowite). Link do pliku: https://jacekmatulewski.fizyka.umk.pl/dydaktyka/net/zrodla/2023Z/dane/oscar_age_female.csv 2. Przygotuj zapytanie LINQ, które wyświetla nazwy osób z kolekcji stworzonej w pierwszym zadaniu, które w chwili przyznania nagrody miały mniej niż 30 lat. 3. Do pliku XML zapisz informacje o laureatach z poprzednich zadań (te trzy kolumny, które były wczytane do kolekcji). Korzeń struktury powinien mieć nazwę 'laureaci', a elementy zawierające poszczególne informacje o postaciach powinny nazywać się 'laureat'. Wartości z kolumn powinny być zapisane w atrybutach elementu 'laureat'. 4. Kod odpowiedzialny za zapis do pliku XML powinien być otoczony konstrukcją try..catch, a metoda powinna zwracać wartość bool świadczącą o tym, czy plik udało się zapisać bez wyjątku. 5. Pliki XML zapisz do katalogu domowego użytkownika odczytanego za pomocą metod klasy Environment. 6. Przygotuj test jednostkowy, który sprawdza metodę z zadania 1, weryfikując liczbę pobranych elementów z pliku CSV. Zestaw 6 -------- 1. Przygotuj metodę wczytującą plik CSV rozdzielany przecinkami 'deniro.csv' i zapisującą do dowolnej kolekcji danych tytuły filmów, punkty i rok powstania. Elementem kolekcji powinna być krotka (nowa z C# 8.0), która powinna przechowywać wymienione wyżej cechy (łańcuch i dwie liczby całkowite). Link do pliku: https://jacekmatulewski.fizyka.umk.pl/dydaktyka/net/zrodla/2023Z/dane/deniro.csv 2. Przygotuj zapytanie LINQ, które wyświetla nazwy filmów z kolekcji stworzonej w pierwszym zadaniu, które mają więcej niż 90 punktów. 3. Do pliku XML zapisz informacje o filmach z poprzednich zadań (te trzy kolumny, które były wczytane do kolekcji). Korzeń struktury powinien mieć nazwę 'filmy', a elementy zawierające poszczególne informacje o postaciach powinny nazywać się 'film'. Wartości z kolumn powinny być zapisane w atrybutach elementu 'film'. 4. Kod odpowiedzialny za zapis do pliku XML powinien być otoczony konstrukcją try..catch, a metoda powinna zwracać wartość bool świadczącą o tym, czy plik udało się zapisać bez wyjątku. 5. Pliki XML zapisz do katalogu domowego użytkownika odczytanego za pomocą metod klasy Environment. 6. Przygotuj test jednostkowy, który sprawdza metodę z zadania 1, weryfikując liczbę pobranych elementów z pliku CSV.