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

Podobne dokumenty