Zadania
Transkrypt
Zadania
Zbiór Zadań do Praktycznego Wstępu do Programowania Przygotował: Maciej Matyka ( [email protected] ) 1. Wejdź na stronę https://studio.code.org/s/20-hour i wykonaj jak najwięcej ćwiczeń z podanych tam zadań w ciągu 1.5 godziny zajęć. Uwaga: na koniec pokaż swoją ocenę zadań (u dołu strony) prowadzącemu zajęcia. Uwaga: w stopce strony można zmienić język na j. polski. (1 pkt) 2. Przepisz (nie wycinaj z pdf) poniższy kod, zapisz do pliku z rozszerzeniem „.cpp” i skompiluj poleceniem „g++”. Następnie uruchom go. Zmodyfikuj go tak, by wypisywał „Witaj X”, gdzie X to Twoje imię. ------------------------------ start #include <iostream> using namespace std; int main() { cout << "Hello world!" << endl; return 0; } ------------------------------ koniec (1 pkt) 3. Przepisz poniższy kod (do funkcji main), skompiluj, uruchom. cout << "\x1b[41m Cześć Maciek!" << endl; cout << "\x1b[42m Cześć Maciek!" << endl; cout << "\x1b[43m Cześć Maciek!" << endl; cout << "\x1b[0m " << endl; (2 pkt) 4. Napisz program, który wyświetli logo z Twoimi inicjałami z użyciem symboli kolorowania tła. Np. wstawienie pojedynczego znaku z tłem w kolorze czerwonym to: cout << "\x1b[41m " << endl; // uwaga na spację przed drugim znakiem " ! Wskazówka: wykorzystaj informacje o kodach ANSI ze strony: http://wiki.fedora.pl/wiki/Kod_ANSI (2 pkt) 5. Wypisz swoje imię i nazwisko wypisując każdą literę osobno na inny kolor z użyciem jednej linijki z instrukcją cout. (2 pkt) 6. Wypisz 100 razy „Hello world” do konsoli, wiersz pod wierszem. Użyj pętli for (2 pkt) 7. Wykonaj zadanie 6. używając konstrukcji do-while. (2 pkt) 8. Wykonaj zadanie 6. używając konstrukcji while-do. (2 pkt) 9. Napisz program, który za pomocą obiektu cout i kodów sterujących wyrysuje w konsoli dowolny rysunek - minimalnie 8*8 pikseli. Po zrobieniu rysunku proszę zrobić zrzut ekranu (do .jpg), wyciąć z niego swój rysunek i przesłać rysunek do wykładowcy wraz z kodem. Rysunki będą zamieszczone na FB kierunku ISSP: https://www.facebook.com/InformatykaStosowanaWFiA/ Adres email wykładowcy: [email protected] (3 pkt) 10. Napisz program, który wypisze do konsoli wartości x, funkcji sin(x) oraz kwadrat tej funkcji dla liczb z zakresu -pi do pi z krokiem co 0.02 (wszystkie dane w kolumnach, oddzielone znakiem tabulacji). (3 pkt) 11. Uruchom program z zadania 10. i przekieruj wyjście do pliku tekstowego (operator > z poziomu wywołania z konsoli) np. wynik.dat. Dane narysuj w programie Gnuplot. Wskazówka: uruchamiamy gnuplot poleceniem 'gnuplot' w konsoli pod Linuxem, potem komenda: plot „wynik.dat”, f(x) gdzie f(x) to funkcja analityczna np. sin(x). (4 pkt) 12. Użyj pętli do sprawdzenia działania kolejnych kodów ANSI (cout do którego przekierowujemy licznik pętli). (3 pkt) 13. Policz silnię liczby N dla coraz większych N (w pętli). Dla jakiej największej wartości N otrzymujesz dobre wyniki? (porównaj się z wynikami z sieci) Dlaczego nie można policzyć większej wartości? (3 pkt) 14. Kalkulator Użyj cout/cin do wykonania prostego kalkulatora wykonującego dwa działania: dodawanie i mnożenie par liczb. Przykładowy scenariusz: 1. „Podaj działanie (0-dodawanie, 1-mnożenie):” 0 2. „Podaj pierwszą liczbę:” 10 3. „Podaj drugą liczbę:” 1.05 4. „Twój wynik dodawania to: 11.05” 5. „Chcesz spróbować jeszcze raz? (T/N)” T (przejście do punktu 1.) Użyj cin.good/fail do weryfikacji poprawności wprowadzonych danych. (4 pkt) 15. Średnia Wypisz na standardowe wyjście średnią N liczb losowych z zakresu 0-1, gdzie N jest podane przez użytkownika. Narysuj wykres w gnuplot, aby zilustrować zależność otrzymanej średniej od N. (4 pkt) 16. Funkcje - podstawy W jednym programie zaimplementuj następujące funkcje: a) funkcję wypisującą do konsoli „Hello world” - bez argumentów b) przyjmującą wartość typu float, wypisującą ją do konsoli (cout) c) przyjmującą dwie wartości typu int wypisującą sumę argumentów d) przyjmującą 1 x int, 2 x float i zwracającą wartość int będącą iloczynem argumentów zrzutowanym na typ int e) przyjmującą tablicę typu int, jej rozmiar jako zmienną int i zwracającą jedną liczbę będącą iloczynem elementów tablicy (można użyć sposobu z sizeof() do wyznaczenia ilości elementów zamiast argumentu) – np. http://stackoverflow.com/questions/37538/how-do-i-determine-the-size-of-my-array-in-c (5pkt) 17. Gra w zgadywanie Napisz grę, w której użytkownik zgaduje liczbę wylosowaną z zakresu 1-1000. Gra powinna zliczać ilość prób i informować na końcu w ilu próbach liczba została zgadnięta. Najprostszy przebieg gry powinien wyglądać tak: Podaj liczbe: 730 Za duża Podaj liczbe: 725 Za duża Podaj liczbe: 722 Za mała Podaj liczbe: 724 Za duża Podaj liczbe: 723 Brawo! Zgadles w 5 probach! (5 pkt) 18. Rozszerzenie gry (grafika) Uzupełnij grę z zadania 3. o ekran powitalny, możliwość rozpoczęcia nowej tury po zgadnięciu, zwiększenie zakresu losowanych liczb w kolejnych turach, ładne formatowanie komunikatów w trybie ANSI. (4 pkt) 19. Kółko i krzyżyk Napisz prostą grę w kółko i krzyżyk (komputer gra z użytkownikiem). Z programistycznego punktu widzenia – proszę użyć w tym zadaniu funkcji. W ramach motywacji video z wykładu: https://www.youtube.com/watch?v=m2Ux2PnJe6E (od 1:30) Uwaga: Proszę by zadanie wykonywać samodzielnie. Przewidywany czas realizacji: 2 tygodnie. Rozwiązanie powinno mieć charakter gry – ekran powitalny, jakieś punkty, informację kto wygrał, grafika ANSI, etc. (20pkt) 20. BMI Napisz program, który wypisze BMI (pl.wikipedia.org/wiki/Wskaźnik_masy_ciała) po wywołaniu kodu poniżej: BMIprint( BMI( readHeight(), readMass() ) ); Specyfikacja funkcji: readHeight – pobiera od użytkownika (cin) jego wzrost i zwraca jako wartość liczbową readMass – pobiera od użytkownika jego wagę i zwraca jako wartość liczbową BMI – wylicza wskaźnik BMI i zwraca jako liczbę typu float BMIprint – wypisuje odpowiedni komunikat na podstawie wyliczonego indeksu BMI (5 pkt) 21. Ciąg Fibonacciego Sprawdź, czy poprawnie wyznaczyłem 45. w kolejności liczba Fibonacciego (1134913170). Użyj wzoru rekurencyjnego (internet) i zapisz odpowiednią funkcję. Uwaga: zadanie jest „trywialne” w tym sensie, że można łatwo znaleźć rozwiązanie w sieci (Google). Proszę podejść ambitnie i spróbować je rozwiązać samodzielnie. Ważne jest to, aby napisać funkcję F(n) w sposób rekurencyjny. (5 pkt za samodzielne rozwiązanie, 1pkt za znalezione w sieci) 22. SFML Przepisz/skopiuj/ściągnij kod keysfml.cpp z wykładu -----------------------------------------------------------------------------------------------------------#include <SFML/Window.hpp> #include <SFML/Graphics.hpp> int main() { int keyonoff=1; sf::RenderWindow window(sf::VideoMode(800, 600), "Nasze okno"); sf::CircleShape shape(400.f); shape.setFillColor(sf::Color::Red); while (window.isOpen()) { // dopoki okno jest otwarte... // w tym obiekcie klasy sf::Event // bedziemy mieli informacje co zrobil uzytkownik sf::Event event; while (window.pollEvent(event)) { // uzytkownik kliknal zamkniecie okna if (event.type == sf::Event::Closed) window.close(); // uzytkownik nacisnal klawisz if(event.type== sf::Event::KeyPressed) keyonoff=1-keyonoff; } // czyszczenie (na czarno) window.clear(sf::Color::Black); // rysuj kolo w zaleznosci od stanu zmiennej keyonoff if(keyonoff) window.draw(shape); window.display(); } return 0; } ------------------------------------------------------------------------------------------------------------ Program skompiluj i uruchom, wykorzystaj wiadomości ze strony: http://www.sfml-dev.org/tutorials/2.3/ (Getting Started) (3 pkt) 23. Dokonaj modyfikacji w poprzednim zadaniu: 1) Kółko jest za duże, zmień jego rozmiar tak by zajmowało ¼ ekranu. (1 pkt) 2) Szerokość i wysokość okna oraz promień koła umieść w stałych. Następnie z tych wielkości wylicz, gdzie powinien się znajdować początek aby koło było wycentrowane. (1 pkt) 3) Wprowadź zmienne „x” i „y” typu float oznaczające pozycję koła i wykorzystaj funkcję setPosition aby je odpowiednio ustawić: http://www.sfml-dev.org/tutorials/2.3/graphics-transform.php (1 pkt) 4) Rozszerz program tak, aby zamykał okno po nacśnięciu „Esc”. Wskazówka: kody klawiszy znajdują się w dokumentacji api biblioteki SFML (1 pkt) 5) Dodaj do programu zmienne „vx” i „vy” typu float oznaczające prędkość koła. Początkowe wartości mogą być np. 0.05. Dopisz przesuwanie koła: x=x+vx*dt, y=y+vy*dt. (1 pkt) 6) Uwzględnij, że koło może wyjść poza ekran i w takich przypadkach odbij prędkość zgodnie z zasadą, że ruch w kierunku „x” jest niezależny od ruchu w kierunku „y”. (1 pkt) 7) Wprowadź stałą „N” oznaczającą ilość elementów. Wykorzystaj tablice jednowymiarowe (wprost zamień zmienne x,y,vx oraz vy na tablice) oraz dodaj tablicę kształtów „shapes” tak, aby obsłużyć N poruszających się kółek, zamiast jednego. (2 pkt) 8) Dodaj grawitację, która zmieni w każdym kroku prędkość poruszających się kół (może być najprostsza metoda Eulera) tak, aby punkty odbijały się i poruszały po parabolach, zamiast po prostych. (2 pkt) 9) Dopisz oddziaływanie N^2, dopisz uzależnienie koloru od prędkości ciał, dopisz kolizje pomiędzy ciałami itp. etc. (2 pkt) (max 12 pkt) 24. Projekt GRA Został tydzień do premiery systemu operacyjnego Windows. Zostałeś właśnie wezwany do Billa Gates'a, który wskazał, że w jego nowym produkcie brakuje elementu rozrywkowego – gry, która będzie prosta i pozwoli użytkownikom na chwilę relaksu w trakcie ciężkiej pracy. Wymyśl swoją grę (lub zaimplementuj klasycznego sapera), która posiada następujące cechy: a) Gra jest grą - zdobywamy punkty, mamy cel, możemy zginąć w grze, gra wciąga (10 pkt) b) Stan gry/mapa/układy muszą być przechowywane w tablicach 1D/2D - (3 pkt) c) Gra zawiera element losowy (przy uruchomieniu różny układ przeszkód / korytarzy etc) (3 pkt) d) Gra powinna posiadać ładną wizualizację stanu gry (np. SFML lub tryb ANSI) (5 pkt) e) Gra umożliwia zapisanie i odczytanie stanu do pliku tekstowego (2 pkt) f) Kod gry jest strukturalny - używa funkcji, przekazuje parametry, nie ma zmiennych globalnych (4 pkt) g) Gra będzie oryginalna (niespotykana w sieci, etc.) (3 pkt) (max 30pkt) 25. Rysunek Napisz program, który generuje dowolny, losowy rysunek w jeden ze sposobów: - losowo rozrzucone koła, kwadraty i linie - grafika wygenerowana innym (np. własnym) algorytmem Uwaga: program powinien być wykonany z użyciem funkcji (oczywiście wg uznania) , np. koło z podaniem promienia, pozycji oraz adresu tablicy z rysunkiem gdzie ma być wrysowane. Wskazówka:Program powinien trzymać w pamięci rysunek w postaci tablicy dwuwymiarowej struktur RGB: struct RGB rysunek[H][W]; gdzie H to wysokość rysunku, W jego szerokość, a struktura RGB zdefiniowana jest jako: struct RGB { int R; int G; int B; }; (7pkt) 26. Zapis .ppm Dopisz do programu z zad. 1 funkcję saveppm, która pobierze nazwę pliku jako char * lub string oraz tablicę rysunek i zapisze te dane rysunku na dysku w formacie .ppm. (3pkt) 27. Animacja Wykorzystaj zadanie 26 i wygeneruj kilka klatek animacji, tzn. plików w formacie .ppm, nazwanych np. frame001.ppm, frame002.ppm itd. które przedstawiają ruch jakiegoś obiektu (np. jednego z kół). Tu można popuścić wodze fantazji i pobawić się trochę ruchem obiektów, zachęcam do eksperymentów! (4 pkt) Klatki przekonwertuj do postaci animacji .mpg lub .avi (jest na to wiele sposobów, proszę próbować samodzielnie lub skorzystać z programów: ppmtojpg i avconv pod linux lub IrfanView i VirtualDub pod Windows). Animację (lub link do pliku animacji w youtube/vimeo/FB) wyślij emailem do prowadzącego kurs: [email protected] (4pkt) Wskazówka: do generowania nazw plików można użyć np. stringstreams: https://cs50.harvard.edu/resources/cppreference.com/cppsstream/all.html (max 8pkt) 28. Fraktal 1.1) Zaimplementuj algorytm z Wikipedii i wyrysuj fraktal ze zbioru Mandelbrota dla kilku ustawień parametrów: Dla każdego piksla rysunku (Px, Py) wykonaj: { x0 = przeskalowana współrzędna x (np. leżąca w przedziale (-2.5, 1)) y0 = przeskalowana współrzędna y (np. leżąca w przedziale (-1, 1)) x = 0.0 y = 0.0 iteracja = 0 max_iteracji = 1000 dopóki ( x*x + y*y < 2*2 ORAZ iteracja < max_iteracji ) { xtemp = x*x - y*y + x0 y = 2*x*y + y0 x = xtemp iteracja = iteracja + 1 } kolor = alfa * (iteracja / max_iteracji) narysuj pixel w pozycji (Px, Py) o kolorze kolor } Uwaga: współczynnik alfa proszę dobrać eksperymentalnie. (źródło: http://en.wikipedia.org/wiki/Mandelbrot_set#Escape_time_algorithm) Obraz zapisz na dysku w formacie PPM. (7pkt) 29. Dopisz do swojego programu możliwość wygenerowania klatek (dla zmieniającego się parametru zbioru Mandelbrot-a). Animację wyślij na YouTube, profil Facebook i poinformuj wykładowcę ([email protected]). (5 pkt) 30. Wykorzystaj wiedzę z kursu do stworzenia programu, gry, rysunku lub animacji wg własnego oryginalnego pomysłu. Pomysł skonsultuj z prowadzącym. Wynik wyślij do wykładowcy. (40pkt) Zachęcam do poświęcenia czasu na dopracowanie strony wizualnej - najlepsze programy, rysunki, gry i animacje (ale naprawdę wyglądające b. dobrze!) będą wyświetlane na naszych stronach FB, na parterze w korytarzu budynku WFA i będą służyły do promocji naszych zajęć, wydziału. - Maciej Matyka Literatura do całego kursu (książka jest dostępna w czytelni WFiA): Brian W. Kernighan, Dennis M. Ritchie, Język C Programowanie, Wydanie 2, Helion 2010 http://wiki.fedora.pl/wiki/Kod_ANSI