Zainteresowania zawodowe: programowanie (C++, Java, C#, F#), technologie webowe, szeroko rozumiana algorytmika, metematyka klasyczna.
Data ostatniej modyfikacji dokumentu (wip.phtml) to piątek 7 lutego 2020 roku (o godzinie 22:32).
6 dzisiaj
85 w obecnym miesiącu
262 w bieżącym roku
4183 od powstania strony
Celem tych zajęć jest zapoznanie studentów z podstawowymi zagadnieniami algorytmicznymi oraz metodami ich skutecznego rozwiązywania za pomocą programów pisanych w języku C# i F# w środowisku programistycznym Mono Develop pod Linuxem albo Visual Studio na platformie .Net pod Windowsem.
Na wykładzie prezentowanych będzie wiele różnorodych problemów obliczeniowych oraz skutecznych i efektywnych metod ich rozwiązywania. Omawiane będą podstawowe techniki konstuowania algorytmów i analizy ich złożoności obliczeniowej. Szczególny nacisk będzie położony na sposób w jaki dane są przechowywane w pamięci komputera, gdyż od organizacji danych bardzo często zależy czas działania programu rozwiązującego określone zadanie.
W ramach konwersatorium będzie omawiany język programowania C# na poziomie programowania strukturalnego proceduralnego z elementami obiektowości oraz podstawowe elementy z biblioteki standardowej; następnie język programowania F# na poziomie programowania funkcyjnego. Krótkie i proste przykłady powinny wspomóc naukę programowania w tych językach.
17 stycznia 2020 r: automaty skończone, gramatyki regularne, gramatyki bezkontekstowe
f(n) mikrosekund | czas t | ||||
sekunda | minuta | godzina | dzień | miesiąc | |
log(n) | |||||
√n | |||||
n | |||||
n2 | |||||
2n |
let
let rec
if
match with
Zadady zaliczenia laboratorium.
Zapoznanie ze środowiskiem programistycznym MonoDevelop.
Zadanie 1 (pokazowe).
Przeanalizuj program powitalny hello world w MonoDevelop albo na repl.it,
skompiluj go i uruchom.
Zadanie 2.
Napisz program, który obliczy kwadrat i sześcian zadanej liczby rzeczywistej.
Użyj metody Convert.ToDouble()
do konwersji wczytanego łańcucha
na liczbę zmiennopozycyjną.
Zadanie 3.
Napisz program, który obliczy pierwiastek z zadanej dodatniej liczby rzeczywistej.
Użyj metody Math.Sqrt()
do policzenia pierwiastka.
Zadanie 4.
Napisz program, który obliczy wartości liczb rzeczywistych a
i b
dla podanej sumy a+b
i różnicy a-b
.
Zadanie 1 (pokazowe).
Napisz program, który obliczy wartość bezwzględną zadanej liczby rzeczywistej x
.
Obliczenie Abs(x) zrealizuj za pomocą funkcji.
Zadanie 2.
Napisz program, który wyznaczy znak zadanej liczby rzeczywistej x
.
Obliczenie Sgn(x) zrealizuj za pomocą funkcji.
Zadanie 3.
Napisz program, który sprawdzi czy podany rok r
jest przestępny.
Sprawdzenie przestępności Przestępny(r) zrealizuj za pomocą funkcji.
Zgłoś wyjątek ArgumentException
, gdy użytkownik wprowadzi rok ≤0.
Zadanie 4.
Napisz program, który rozwiąże równanie kwadratowe z jedną niewiadomą ax2+bx+c = 0.
Wypisz wszystkie rozwiązania rzeczywiste takiego równania dla podanych parametrów rzeczywistych
a
, b
i c
.
Zgłoś wyjątek ArgumentException
, gdy użytkownik wprowadzi parametr a
&eq;0.
Zadanie 5 (dodatkowe).
Każdy rok w kalendarzu chińskim ma swojego patrona - jest 12 zwierząt, które są
cyklicznie patronami kolejnych lat: szczur, bawół, tygrys, królik, smok, wąż, koń, baran, małpa,
kogut, pies, świnia (patronem 2019 roku jest właśnie świnia).
Napisz program, który dla podanego roku r
wyznaczy i wypisze patrona tego roku.
Zgłoś wyjątek ArgumentException
, gdy użytkownik wprowadzi rok ≤0.
Użyj instrukcji wyboru switch-case.
Zadanie 1 (pokazowe).
Napisz program, który dla podanej liczby całkowitej n
wypisze n gwiazdek
w wierszu.
Gdy n będzie miało wartość ujemną albo zero, to nie wypisuj żadnej gwiazdki.
Użyj pętli while.
Zadanie 2.
Napisz program, który dla podanej liczby całkowitej n
wypisze kolejne liczby całkowite,
zaczynając od 0 a kończąc na wartości n.
Gdy n będzie miało wartość ujemną, to wypisany ciąg ma być malejący (na przykład dla
n = -3 należy wypisać: 0 -1 -2 -3).
Użyj pętli do-while.
Zadanie 3.
Napisz program, który podanej liczby całkowitej n
wypisze i sformatuje tabliczkę mnożenia
o rozmiarze n × n.
Gdy n będzie ≤2, to przyjmij, że n = 2.
Gdy n będzie ≥30, to przyjmij, że n = 30.
Użyj zagnieżdżonych pętli for.
Zadanie 4.
Napisz program, który podanej liczby całkowitej n
wypisze kolejno jej podzielniki
naturalne (zacznij od 1 a zakończ na |n|).
Gdy n będzie miało wartość 0, to wypisz tylko liczbę 0.
Zadanie 5 (dodatkowe).
Napisz program, który podanych liczb całkowitych a
i b
wypisze
kolejno wszytkie liczby parzyste z przedziału [a, b].
Zgłoś wyjątek ArgumentException
, gdy a > b.
Użyj pętli for.
Zadanie 6 (dodatkowe).
Napisz program, który podanych liczb całkowitych a
, b
oraz
k
wypisze kolejno wszytkie liczby z przedziału [a, b], które są
podzielne przez k.
Zgłoś wyjątek ArgumentException
, gdy a > b lub k = 0.
Użyj pętli for.
Zadanie 1 (pokazowe).
Napisz program, który podanej liczby naturalnej n
policzy i wypisze
n! (silnia).
Zdefiniuj funkcję rekurencyjną do policzenia silni.
Zadanie 2.
Napisz program, który podanej liczby naturalnej n
policzy i wypisze
sumę kwadratów kolejnych liczb 12 + 22 + ... + n2.
Zdefiniuj funkcję rekurencyjną, która to policzy.
Zadanie 3.
Napisz program, który podanej liczby naturalnej n
policzy i wypisze
n-tą liczbę Fibonacciego (F0 = 0, F1 = 1,
Fn = Fn-1 + Fn-2 dla n ≥ 2).
Zdefiniuj funkcję rekurencyjną do policzenia n-tej liczby Fibonacciego.
Zadanie 4.
Napisz program, który podanych liczb naturalnych n
i k
policzy i wypisze
współczynnik dwumianowy (nk).
Zdefiniuj funkcję rekurencyjną do policzenia współczynnika dwumianowego.
Zadanie 5 (dodatkowe).
Napisz program, który podanej liczby naturalnej n
policzy i wypisze
n-tą liczbę Lucasa (L0 = 2, L1 = 1,
Ln = Ln-1 + Ln-2 dla n ≥ 2).
Zdefiniuj funkcję rekurencyjną do policzenia n-tej liczby Lucasa.
Zadanie 6 (dodatkowe).
Napisz program, który podanych liczb naturalnych m
i n
policzy i wypisze
wartość funkcji Ackermanna A(m, n) (A(0, n) = n+1 gdy m = 0,
A(m, 0) = A(m-1, 0) gdy m > 0 i n = 0,
A(m, n) = A(m-1, A(m, n-1)) gdy m > 0 i n > 0).
Zdefiniuj funkcję rekurencyjną do policzenia funkcji Ackermanna.
Zadanie 1 (pokazowe).
Napisz program, który najpierw wczyta ze standardowego wejścia liczbę naturalną n a potem utworzy n-elementową tablicę liczb całkowitych i wczyta do niej wartości podane przez użytkownika. Program ma wypisać wszystkie wczytane do tablicy liczby od końca, pomijając liczby ujemne i zera.
Zadanie 2.
Napisz program, który najpierw wczyta ze standardowego wejścia liczbę naturalną n a potem utworzy n-elementową tablicę liczb całkowitych i wpisze do niej losowe wartości ze zbioru {2, ..., 5}. Program ma wypisać wszystkie wylosowane i wpisane do tablicy wartości.
Na koniec program ma wypisać średnią arytmetyczną, odchylenie standardowe i wariancję dla liczb w tablicy. Do wyznaczenia średniej, odchylenia i wariancji zdefiniuj osobne funkcje.
Zadanie 3.
Napisz program, który najpierw wczyta ze standardowego wejścia liczbę naturalną n a potem utworzy n-elementową tablicę liczb rzeczywistych i wpisze do niej losowe wartości ze zakresu [0, 100).
Na koniec program ma wypisać minimalną i maksymalną wartość wpisaną do tablicy. Do wyznaczenia wartości minimalnej i maksymalnej zdefiniuj osobne funkcje.
Zadanie 4.
Napisz program, który wczyta linię tekstu ze standardowego wejścia. Następnie z przeczytanej linii przekopiuj do tablicy znaków tylko litery i cyfry (powinieneś najpierw policzyć ile ich jest w tekście).
Na koniec program ma sprawdzić czy podany przez użytkownika napis jest palindromem. Do sprawdzenia czy dane w tablicy tworzą palindrom zdefiniuj osobną funkcję.
Zadanie 1 (pokazowe).
Zdefiniuj klasę reprezentującą punkt na płaszczyźnie.
Klasa Punkt
powinna zawierać dwa niepubliczne pola typu double
do pamiętania współrzędnych.
W klasie Punkt
zdefuniuj konstruktory - jeden bezargumentowy
a drugi nadający konkretne wartości współrzędnym punktu.
Wyposaż tą klasę w gettery umożliwiające odczytanie współrzędnych oraz nadpisz metodę ToString()
zwracającą tekstową reprezentację współrzędnych punktu.
Zadanie 2.
Zdefiniuj klasę reprezentującą odcinek na płaszczyźnie.
Klasa Odcinek
powinna być reprezentowana za pomocą dwóch różnych punktów na płaszczyźnie.
W klasie Odcinek
zdefuniuj konstruktor, który sprawdzi czy podane punkty końcowe nie są identyczne
(jeśli tak, to należy zgłosić wyjątek).
Wyposaż tą klasę w gettery udostępniające końce odcinka oraz nadpisz metodę ToString()
.
Zadanie 3.
Zdefiniuj klasę reprezentującą trójkąt na płaszczyźnie.
Klasa Trojkat
powinna być reprezentowana za pomocą trzech różnych i niewspółliniowych punktów na płaszczyźnie.
W klasie Trojkat
zdefuniuj konstruktor, który sprawdzi czy podane punkty końcowe nie są niewspółliniowe
(jeśli tak, to należy zgłosić wyjątek).
Wyposaż tą klasę w gettery udostępniające rogi trójkąta oraz nadpisz metodę ToString()
.
Zadanie 4 (dodatkowe).
W klasach reprezentujących punkt, odcinek i trójkąt na płaszczyźnie zaimplementuj metody dokonujące trzech zasadnich przekształceń:
Przesuń(Wektor w)
- przesunięcie (translacja), polegające na przemieszczeniu wszystkich punktów
figury o tę samą odległość w ustalonym kierunku (za pomocą obiektu klasy Wektor
);Obróć(Punkt p, double kąt)
- obrót wokół ustalonego punktu wszystkich punktów figury
o zadany kąt;Odbij(Prosta p)
- symetria (odbicie) względem osi wszystkich punktów figury (za pomocą obiektu
klasy Prosta
).Wektor
i Prosta
zdefiniuj tak, aby obiekty tych klas były niemodyfikowalne.
Klasa Wektor
ma zawierać dwa publiczne i finalne pola dx
i dy
typu
double
do pamiętania kierunku przesunięcia; w klasie tej umieść statyczną metodę do składania wektorów
i mnożenia przez skalar.
Natomiast klasa Prosta
ma reprezentować prostą na płaszczyźnie w postaci ogólnej Ax + By + C = 0,
a więc w klasie tej powinny być zadeklarowane trzy publiczne i finalne pola a
, b
i c
do zapamiętania tych współczynników; w klasie tej umieść statyczne metody do sprawdzania, czy proste są równoległe oraz
czy są prostopadłe.
Zadanie 1 (pokazowe).
Zdefiniuj klasę abstrakcyjną reprezentującą wyrażenie arytmetyczne działające na liczbach rzeczywistych.
Klasa Wyrażenie
powinna zawierać abstrakcyjną metodę oblicz()
do obliczania wartości wyrażenia.
Klasa ta będzie bazą dla potomnych klas realizujących określone zadania obliczeniowe w wyrażeniu.
Zadanie 2.
Zdefiniuj klasy operandów dziedziczące po wyrażeniu: Liczba
reprezentująca liczbę zmiennopozycyjną
oraz Stała
reprezentująca nazwaną stałą (liczby π, e, φ, itp).
W klasie Stała
zdefiniuj statyczne pole finalne do przechowywania zbioru
wszystlich stałych (pary identyfikator--liczba).
Do przechowywania stałych wykorzystaj kolekcję Dictionary
.
Odczytywanie wartości stałej ma polegać na zidentyfikowaniu pary w tym zbiorze
i odczytaniu wartości związanej z kluczem.
W klasach tych nadpisz metody ToString()
, które będą zwracać napis reprezentujący operancy.
Zadanie 3.
Zdefiniuj klasy operatorów dziedziczące po wyrażeniu, reprezentujące operacje arytmetyczne dodawania, odejmowania, mnożenia i dzielenia oraz jednoargumentowe operacje zmiany znaku na przeciwny i odwrotności. Klasy te powinny być tak zaprojektowane, aby można z nich było zbudować drzewo wyrażenia: argumentami operatorów mają być wyrażenia.
W klasach tych nadpisz metody ToString()
, które będą zwracać napis reprezentujący wyrażenia
używające tych operatorów (dopisz niezbędne nawiasy).
Zrób zadania z listy 1 (cz.1) (autor: P.Schmidt).
Zrób zadania z listy 1 (cz.2) (autor: P.Schmidt).
Zrób zadania z listy 2 (autor: P.Schmidt).
Zrób zadania z listy 3 (autor: P.Schmidt).
Zrób zadania z listy 4 (autor: P.Schmidt).
Zrób zadania z listy 4 (autor: P.Schmidt).
Zrób zadania z listy 5 (autor: P.Schmidt).
Ranking osiągnięć na laboratorium w grupie PRz.
Ranking osiągnięć na ćwiczeniach w grupie PRz.