Zadania przed kolokwium ze Wstępu do informatyki grudzień 2012 Proponują: M.Bodnar, P.Kowalczyk, P.Krzyżanowski, L.A.Nguyen, D.Ślęzak Pisząc zarówno algorytmy, jak programy, pamiętajcie Państwo, by zamieszczać komentarze, dokumentujące je oraz objaśniające i uzasadniające poprawność ich działania. Gdy w zadaniu trzeba zapisać algorytm, zazwyczaj trzeba zrobić to w pseudokodzie języka C (co to jest, widzieliśmy na wykładzie). Czasem wystarczy opis słowny. Poniższe zadania są różnej skali trudności, od za łatwych, przez proste i średnie. Na kolokwium należy spodziewać się nie więcej niż jednego zadania istotnie trudniejszego od tu zaprezentowanych. Życzymy miłej zabawy! 1. Napisz algorytm, jak przygotować kanapkę z dżemem malinowym. Przetestuj go na rodzinie (najlepiej na młodszym rodzeństwie) lub przybyszu z obcej planety (znającym wszakże język polski) sprawdzając, czy twoje rozwiązanie ma wszystkie cechy algorytmu. W rozwiązaniu, ze względów bezpieczeństwa, nie wolno wykorzystywać ostrego noża. Uwaga: Za łatwe na kolokwium, ale może być przy nim dużo zabawy, zwłaszcza w wersji wzbogaconej twarożkiem! 2. Napisz w języku C funkcję float ocena z wdi(float punkty), która będzie zwracać ocenę końcową z WdI, obliczoną na podstawie zgromadzonej na końcu semestru liczby punktów (z przedziału [0,130]). Skalę ocen opracuj zgodnie z własnym pomysłem; wymyśl także, co funkcja powinna zwracać, gdy dane są spoza tego przedziału. Następnie wykorzystaj tę funkcję w prostym programie, który wczytuje z klawiatury punkty i wypisuje na ekran ocenę. 3. Napisz algorytm, jak przy pomocy cyrkla i linijki wykonać konstrukcję trójkąta o zadanych bokach. Zapisz go w postaci schematu blokowego. Uwzględnij przypadki patologiczne. Uwaga: Na pewno za łatwe na kolokwium. 4. Napisz program, który wyznaczy k-ty wyraz ciągu zadanego wzorem rekurencyjnym ak+1 = ak + 1/k!, przy czym a0 = 1. Liczbę k wczytujemy z klawiatury. 5. Napisz program, który dla zadanego z klawiatury k wyznaczy sumę 1+ 1 1 1 + + ... + . 1! 2! k! 6. Napisz algorytm, która wyznacza liczbę różnych elementów tablicy x, zawierającej N liczb rzeczywistych uporządkowanych niemalejąco. Następnie zaimplementuj go w krótkim programie w języku C, który zbada liczbę różnych elementów w pięcioelementowej tablicy 1, 1, 1, 3, 3. 7. Niech X będzie stuelementową tablicą liczb rzeczywistych. Napisz fragment programu w C, który wyznaczy sumę czwartych potęg wszystkich elementów tej tablicy i wypisze ją na ekran. 8. Niech X będzie N -elementową tablicą liczb rzeczywistych. Napisz fragment programu w C, który odwróci kolejność wszystkich elementów tej tablicy. Uwaga: nie można korzystać z dodatkowej tablicy. 9. Elementy tablicy A rozmiaru N są liczbami całkowitymi z zakresu 0..127. Napisz algorytm, który wypisze, ile razy każda z wartości pojawiła się w tej tablicy. 10. Napisz pełnokrwistą funkcję w języku C, int sumuj wczytane(int N), która wczyta z klawiatury N liczb całkowitych i zwróci ich sumę jako wynik. Następnie użyj tej funkcji w programie w C, który najpierw zapyta użytkownika o N , a następnie wywoła sumuj wczytane dla podanego parametru. 11. Dana jest tablica długości N − 1 (zakładamy, że N jest dużą liczbą), zawierająca wszystkie liczby naturalne z zakresu 1, . . . , N , z wyjątkiem jednej (nieznanej nam a priori). Podaj szybko działający algorytm wskazujący liczbę, której brakuje w tablicy. 12. Zmienne a, b, i są typu int. Kolejnymi elementami czteroelementowej tablicy liczb całkowitych X są 1, 2, 5, 1. Napisz, jaka będzie zawartość tablicy X po wykonaniu poniższych instrukcji języka C: b = X[1]; a = 1; i = 4 − b/2; while(i >= 2) { a = a + b; b = a; X[i] += X[i−1]; X[i−1] = X[i−1] / b; i −= 1; } X[4−1] = a % 2; 13. W tablicy T dany jest zestaw N różnych liczb naturalnych. Zapisz algorytm, który obliczy NWD dla wszystkich tych liczb. 14. Zmienna x jest typu double, zmienne i, j są typu int, a zmienna A jest 10-elementową tablicą liczb typu double. Zapisz w języku C instrukcje realizujące następujące zadania: • wczytanie kolejno do x, i, j trzech podanych z klawiatury wartości (zakładamy, że poprawnych); • nadanie wszystkim elementom tablicy A wartości równej połowie i; • wypisanie na ekran ostatniego elementu tablicy A; • nadanie x wartości równej liczbie wszystkich elementów A, które są równe komputerowej reprezentacji liczby 0.1. 15. Napisz kompletny program w języku C, który będzie wczytywać wpisaną z klawiatury terminala liczbę rzeczywistą x ∈ (−1, 1033 ), oraz K ∈ {1, 2}, a następnie sprawdzi, czy x elementem ciągu zadanego wzorem rekurencyjnym K 0 = K, = K Kn , Kn+1 n = 1, 2, 3, . . . . Wyjaśnij, dlaczego Twój program daje poprawny wynik. 16. Od zmiennych i parametrów o nazwie i w poniższym kodzie może rozboleć głowa, ale. . . co wypisze następujący program? (to może być trudne pytanie) #include <stdio.h> int main ( void ) { int i = 7; oblicz1 ( i = 3 ); printf ( ”%d\n” , i ); if ( 2 ∗ ( i / 2) + i % 2 == 3 ) i = oblicz1 ( i++ ); else i = 1; printf ( ”%d\n” , i ); i = oblicz2 ( i / 2 ); printf ( ”%d\n” , i ); return i; } int i = 1; int oblicz1 ( int i ) { i = i % 2 + i / 2; return i; } int oblicz2 ( int i ) { i = i < 3 ? 7 : 0; return i; } 17. Napisz program w języku C, który wczyta podany przez użytkownika ciąg rzeczywistych liczb dodatnich, a następnie obliczy ich średnią harmoniczną i arytmetyczną. Wsk.: Przemyśl, jak najwygodniej zakończyć wczytywanie danych! 18. Dana jest N -elementowa tablica A zawierająca pewien ciąg liczb rzeczywistych. Podaj algorytm wyznaczający niepusty podciąg tego ciągu, złożony z jego kolejnych elementów, którego suma ma najmniejszą wartość bezwzględną. Algorytm ma zwracać indeksy pierwszego i ostatniego elementu wyznaczonego podciągu. 19. Dane są dwie N -elementowe tablice liczb całkowitych A i B uporządkowane rosnąco. Napisz program, który wypisze elementy tablicy A, których nie ma w B i elementy tablicy B, których nie ma w A. 20. Zmienna k jest typu całkowitego, b jest typu rzeczywistego, natomiast A jest N -elementową tablicą liczb typu całkowitego. Popraw następujące błędne fragmenty programu w języku C tak, aby realizowały podane zadanie: a) Odjęcie od wszystkich elementów tablicy A liczby 1: for( k = 0; k <= N; k++ ) A[k] =- 1; c) Nadanie zmiennej k wartości ilorazu całkowitego ostatniego elementu A przez 2: k = A[N] / 2.0; b) Nadanie zmiennej b wartości rzeczywistej podanej przez użytkownika z klawiatury: d) Jeśli k 6= 0 i b 6= 0, wypisanie wartości zmiennej b na ekran terminala: if( k != 0 || b != 0 ) printf( "f", &b ); scanf( "%d, b" ); 21. Dane są dwa N -elementowe ciągi liczb całkowitych x, y. Obliczyć liczby N m= N X xj yj − j=1 N N X xj j=1 N X j=1 x2j − N X j=1 N X j=1 2 x2j N X yj , b= N X yj j=1 N −m xj j=1 N oraz znaleźć taki indeks j0 , że wartość wyrażenia yj0 − mxj0 + b !2 będzie najmniejsza. 22. Dany jest ciąg N liczb całkowitych zapisany w tablicy int a[N]. Znaleźć długość najdłuższego fragmentu tablicy a, na którym liczby są uporządkowane rosnąco. 23. Poprawić błędne fragmenty kodu, tak aby realizowały podane zadania. a) Zwiększenie wartości zmiennej całkowitej k o 5: k += k+5; b) Nadanie zmiennej całkowitej k wartości sumy liczb tablicy liczb całkowitych A for ( i=0; i<N; i++) k += A[N]; c) Nadanie zmiennej x typu float średniej z dwóch zmiennych a i b typu int liczb całkowitych A (zakładamy, że w tablicy A istnieje co najmniej jedna liczba różna od 0) k = 0; while ( A[k] = 0 ) k++; f) Nadanie zmiennej całkowitej a wartości minimum z liczb a i b a zmiennej b wartości maksimum tych liczb: s = (a+b)/2; d) Nadanie zmiennej całkowitej k wartości wprowadzonej z klawiatury scanf(”%d”, k); e) Nadanie zmiennej k indeksu pierwszego wystąpienia liczby różnej od 0 w tablicy if (a>b) { k=a; b=k; a=b; } 24. Dana jest tablica a zawierająca n liczb naturalnych. Napisz fragmenty kodu do wyświetlenia elementów tej tablicy w odwrotnej kolejności używając: i) pętli for, ii) pętli while. 25. W tablicy int a[2∗N] znajduje się dokładnie N liczb dodatnich i dokładnie N liczb ujemnych. Napisać algorytm, który uporządkuje liczby w tablicy w ten sposób, by liczby dodatnie i ujemne były położone na przemian. 26. Dany jest skończony ciąg N liczb całkowitych zapisany w tablicy int a[N]. Napisać fragment programu w języku C, który obliczy średnią arytmetyczną różnic między kolejnymi wyrazami, czyli wartość wyrażenia −2 1 NX (aj+1 − aj ) N − 1 j=0 27. Napisz, jaka będzie zawartość tablicy a po wykonaniu następującego fragmentu kodu. Jaki jest cel tego fragmentu kodu? int a[4] = {1,3,4,2}; int n = 4; int i, j, k, x; for (i = 0; i < n; i++) { k = i; for (j = i+1; j < n; j++) if (a[j] > a[k]) k = j; x = a[i]; a[i] = a[k]; a[k] = x; } 28. Dana jest tablica a zawierająca n liczb naturalnych (a i n są zmiennymi). Napisz fragment kodu (w języku C) do sprawdzenia, czy jakiś element tablicy powtarza się. (Niech wynik będzie w zmiennej o nazwie powtarza sie). 29. Następujący fragment kodu ma sprawdzić, czy element k występuje w tablicy A. Zawiera jeden błąd. Popraw go. int wystepuje; for (int i = 0; i < n && !wystepuje; i++) if (A[i] == k) wystepuje = 1; 30. Następujący fragment kodu ma sprawdzić, czy tablica A jest rosnąca. Zawiera dwa błędy. Popraw go. int rosnacy; for (int i = 0; i < n && rosnacy; i++) if (A[i] <= A[i−1]) rosnacy = 0; 31. Dana jest tablica a zawierająca n liczb naturalnych (a i n są zmiennymi). Napisz fragment kodu (w języku C) do obliczenia ilości maksymalnych elementów tej tablicy. (Niech wynik będzie w zmiennej ilosc max). Verte! −→ Zadania przed sprawdzianem laboratoryjnym ze Wstępu do informatyki grudzień 2013 Proponują: P.Kowalczyk, P.Krzyżanowski, M.Małogrosz, L.A.Nguyen, P.Siedlecki, S.Stawicki Pisząc programy, pamiętajcie Państwo, by zamieszczać komentarze, dokumentujące je oraz objaśniające i uzasadniające poprawność ich działania. Nie zapomnijcie też o przetestowaniu programów! Poniższe zadania są różnej skali trudności, od za łatwych, przez proste i średnie, aż po bardzo trudne (jak na sprawdzian przy klawiaturze). Na sprawdzianie nie należy spodziewać się zadania istotnie trudniejszego od tu zaprezentowanych. Jeśli nie powiedziano inaczej, w rozwiązaniach należy przyjąć, że dane wejściowe są poprawne. Prosimy nigdy nie zaczynać rozwiązywania zadania od wpisania kodu źródłowego programu do edytora: najpierw warto pomyśleć i np. naszkicować na kartce papieru schemat algorytmu. Życzymy miłej zabawy przy kartce papieru i klawiaturze! Przyjmijmy, że wszystkie pliki, o których mowa poniżej, są plikami tekstowymi oraz • w.txt zawiera liczby rzeczywiste oddzielone od siebie spacjami • z.txt zawiera pewien tekst po angielsku (czyli zapisany znakami ASCII) W zadaniach mogą pojawić się dodatkowe ograniczenia zawartości tych plików. 1. Napisz program, który sprawdzi, czy liczby w pliku w.txt są posortowane. Uwaga: Za łatwe na sprawdzian, ale od czegoś trzeba zacząć. . . 2. Załóżmy, że liczby zapisane w pliku w.txt są ułożone w kolejności od najmniejszej do największej. Napisz program, który sprawdzi, czy w pliku w.txt znajduje się liczba 2013.12 3. Napisz program, który do pliku pierwsze.txt wypisze wszystkie znajdujące się w pliku w.txt liczby całkowite, które jednocześnie są liczbami pierwszymi. 4. Przepisz zawartość z.txt na zm.txt, pomijając wszystkie wystąpienia sekwencji znaków monitor. Uwaga: Dlaczego zadanie usunięcia wszystkich wyrazów „monitor” jest trudniejsze? 5. Napisz program, który w pliku z.txt każdą liczbę zastąpi sekwencją znaków ****. 6. Napisz program, który z tekstu z.txt usunie nadmiarowe spacje, a wynik wypisze na ekran. 7. W pliku w.txt jest nie więcej niż 2013 liczb całkowitych. Napisz program, który do pliku tekstowego ws.txt zapisze te liczby — posortowane w kolejności od największej do najmniejszej — tak, by każda liczba znajdowała się w osobnym wierszu. 8. Niech N = 32 i niech liczby zawarte w pliku w.txt określają relację na zbiorze {1, 2, 3, . . . , N }2 przez N następujących po sobie par liczb naturalnych odpowiedniej wielkości. Napisz program, który sprawdzi, czy wczytana relacja jest funkcją {1, 2, 3, . . . , N } → {1, 2, 3, . . . , N }. Jeśli relacja ta jest funkcją, to program ma dodatkowo określić, czy funkcja ta jest iniekcją. 9. Wczytaj z klawiatury liczbę naturalną dodatnią N . Znajdź jej przedstawienie (tzw. kodowanie Fibonacciego) w postaci N= m X fk · Fk , k=2 gdzie fm = 1, fk ∈ {0, 1} zaś Fk to wyrazy ciągu Fibonacciego (dla przypomnienia: F0 = 0, F1 = 1 oraz Fk = Fk−1 + Fk−2 dla k > 1). Wypisz liczby fm , fm−1 , . . . , f2 na ekran, z kopią do pliku w.txt. 10. Na odcinku [0, 1] w punkcie xi = i/101 gdzie i = 1, 2, . . . , 100 siedzi mrówka mi . W chwili t = 0 mrówka mi zaczyna iść z szybkością v ze zwrotem zi . Jeżeli dwie mrówki się spotkają, to zmienia się zwrot ich marszu na przeciwny. Jeżeli mrówka dojdzie do końca odcinka, to z niego spada. Napisz program, który wczyta z pliku ciąg z1 z2 . . . z100 liczb ze zbioru {−1, 1} wyznaczających początkowe zwroty marszu mrówek (−1 = lewo, 1 = prawo) oraz szybkość v i zwróci na ekran czas, po jakim ostatnia mrówka spadnie z odcinka. 11. W pliku w.txt znajdują się cztery wiersze, zawierające kolejno: • liczbę naturalną dodatnią n, • liczbę naturalną dodatnią k, • ciąg liczb a0 , a1 , . . . , ak−1 oddzielonych spacjami, • ciąg b0 , b1 , . . . , bk−1 oddzielonych spacjami. Program ma wypisać na ekran liczbę xn , gdzie ciąg (xm )∞ m=0 spełnia równanie rekurencyjne x0 = a0 , . . . , xk−1 = ak−1 , xm = bk−1 xm−1 + bk−2 xm−2 + . . . + b0 xm−k , dla m ­ k. 12. W pierwszej linii pliku tekstowego tin.txt podane są dwie liczby m, n ¬ 72, oddzielone spacją i oznaczające wymiary pewnej prostokątnej tablicy znaków. W każdym z następnych m wierszy znajduje się n znaków. Kolejny wiersz jest ostatni w pliku i znajduje się w nim sekwencja kilku liczb oddzielonych spacjami. Oznaczają one ciąg operacji, które chcemy wykonać na wczytanej tablicy znaków, o następującym znaczeniu: • 3 — symetria osiowa względem osi pionowej przechodzącej przez środek obrazka • 4 — jw. względem osi poziomej • 5 — symetria środkowa Na wczytanej tablicy należy wykonać zadane operacje, a wynik — końcową postać tablicy znaków — zapisać do pliku wyjściowego tout.txt Uwaga: To zadanie można oczywiście rozbudować (dla własnej satysfakcji) o implementację innych operacji, np. obrotów o wielokrotność kąta prostego lub wypełnianie wzorkiem, itp.... 13. Uwaga: więcej zadań — na sprawdzianie!