Przykładowe kolokwium z laboratoriów Wstępu do - e-WMP
Transkrypt
Przykładowe kolokwium z laboratoriów Wstępu do - e-WMP
Przykładowe kolokwium z laboratoriów Wstępu do informatyki I 1. Znajdź pięć błędów w poniższym kodzie źródłowym i przepisz go w poprawionej wersji. #include <stdio> int main() { int i; int n; scanf("%d",n); printf("Napisz to %c razy...\n",n); for(i=0,i<n;i++) { printf('%d.\tWreszcie zaczne uczyc sie programowania!\n',i+1); } return 0; } 2. Napisz pełny kod programu, który wydrukuje na ekran znaki tworzące poniższy obrazek. __ /\||__ /\ /[]\ \ / \ /| |\___\ / \ | | [] | /____\ | | | || -----------------* Spróbuj wykonać zadanie bez użycia explicite znaku spacji. 3. Uzupełnij poniższy kod implementując zadeklarowane funkcje. Najpierw napisz funkcję float silnia(int) obliczającą silnię, a następnie wykorzystaj tę funkcję do napisanie funkcji float newton(int,int), która oblicza dwumian Newtona. Narysuj schemat blokowy funkcji float silnia(int). #include <stdio.h> float silnia(int); float newton(int,int); int main() { printf("Podzbior 3-elementowy zbioru 5-elementowego mozemy wybrac na %f sposobow,",newton(5,3)); printf("a podzbior 5-elementowy -- tylko w %f sposob.\n",newton(5,5)); return 0; } float silnia(int k) { ... } float newton(int n, int k) { ... } −1k 4. Napisz funkcję float wyraz(int) obliczającą ciąg o wyrazie ogólnym: a k = 1 4 , 5k 2k 35k 24k 8 gdzie k ∈ {0,1,2,...}. * Zadbaj o poprawność danych pobieranych przez funkcję: trzeba się upewnić, że podany argument nie jest liczbą ujemną. 5. Napisz program, który pobiera od użytkownika liczbę n ∈ ℕ0 (całkowitą nieujemną) i tworzy tablicę float a[n], a następnie – za pomocą funkcji float wyraz(int) – wypełnia ją pierwszymi n wyrazami ciągu a[k] = a k dla k ∈ {0,...,n−1}. Program ma wydrukować na ekran a k ∞ k=0 tak, aby ∞ (A) Program ma wydrukować na ekran pierwsze n wyrazów ciągu a k k=0. Ma to zrobić w dwóch kolumnach: w pierwszej kolumnie ma się znaleźć numer wyrazu, a w drugiej – odpowiadająca temu numerowi wartość ciągu (z dokładnością do 20 cyfr po przecinku); wg poniższego wzorca formatowania. k | a_k ---+----------------------0 | 1.12500000000000000000 1 | 0.95833331346511841000 2 | 1.00757575035095210000 Uwaga! Można przyjąć, że numer wyrazu ciągu jest liczbą dwucyfrową. Warto zauważyć, że ciąg przyjmuje tylko wartości dodatnie i nie przekraczają one dwóch. (B). Program ma wydrukować na ekran liczbę elementów: ● większych od jeden, ● mniejszych od jeden, ● należących do przedziału [0.99999,1.00001]. (C) Program ma wydrukować na ekran (z dokładnością do 20 cyfr po przecinku) najmniejszą większą od jeden wartość spośród występujących w tablicy a (czyli min{ a k : a k 1 ∧ k =0,...,n−1 }) oraz indeksy elementów, które ją przyjmują. (*D) Program ma sprawdzić, czy w tablicy a istnieją dwa elementy przyjmujące tą samą wartość. Jeśli każdy element ma inną wartość, program powinien wydrukować na ekran stosowne oświadczenie. W przeciwnym wypadku zadaniem programu jest wydrukowanie na ekran wartości, która powtórzyła się w trakcie sprawdzania, oraz indeksów elementów, których to dotyczyło. (*E) Program ma posortować rosnąco tablicę a i wydrukować ją na ekran (w formacie naukowym o dokładności 20 cyfr znaczących) wg poniższego wzorca formatowania. a[k] -------------------------9.5833331346511841000e-001 9.9809157848358154000e-001 9.9971657991409302000e-001 (*F) Program ma wykonać podpunkt (*D) dla posortowanej w punkcie (*E) tablicy a. Życzę powodzenia! Rozwiązania zadań z przykładowego kolokwium Oto rozwiązania zadań z przykładowego kolokwium. Dla każdego zadania istnieje stosowny projekt programu Code::Blocks. Katalogi z plikami projektów spakowane są w formacie ZIP. Można je pobrać z następujących lokalizacji: ● www.wmp.uksw.edu.pl/math-ja/literowki.zip, ● www.wmp.uksw.edu.pl/math-ja/rysunek.zip, ● www.wmp.uksw.edu.pl/math-ja/newton.zip, ● www.wmp.uksw.edu.pl/math-ja/coloquium.zip. Do rozpakowania można użyć np. programu 7-Zip albo WinRAR. Rozwiązanie zadania 1. #include <stdio.h> int main() { int i; int n; scanf("%d",&n); printf("Napisz to %d razy...\n",n); for(i=0;i<n;i++) { printf("%10d. Wreszcie zaczne uczyc sie programowania!\n",i+1); } return 0; } Patrz: projekt literowki.cbp. Rozwiązanie zadania 2. Przedstawiam cztery różne sposoby. Pierwszy jest najprostszy, ale nie spełnia założenia o nieużywaniu spacji w sposób jawny. Pozostałe czynią za dość temu założeniu. Proszę zapoznać się z projektem rysunek.cbp. Sposób I: łańcuch sterujący ze spacjami czyli WYSIWYG #include <stdio.h> int main() { printf(" __\n"); printf(" /\\||__ /\\\n"); printf(" /[]\\ \\ / \\\n"); printf(" /| |\\___\\ / \\\n"); printf(" | | [] | /____\\\n"); printf(" | | | ||\n"); printf(" ------------------\n"); return 0; } Sposób II: stałe znakowe #include <stdio.h> int main() { printf("%6c%c\n",'_','_'); printf("%4c%c%c%c%c%c%7c%c\n",'/','\\','|','|','_','_','/','\\'); printf("%3c%c%c%c%4c%5c%3c\n",'/','[',']','\\','\\','/','\\'); printf("%2c%c%3c%c%c%c%c%c%4c%3c\n",'/','|','|','\\','_','_','_','\\','/','\\'); printf("%3c%3c%2c%c%2c%3c%c%c%c%c%c\n",'|','|','[',']','|','/','_','_','_','_','\\'); printf("%3c%3c%5c%5c%c\n",'|','|','|','|','|'); printf("%2c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c\n",'-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-'); return 0; } Sposób III: stałe znakowe i znaki w łańcuchu sterującym #include <stdio.h> int main() { printf("%6c_\n",'_'); printf("%4c\\||__%7c\\\n",'/','/'); printf("%3c[]\\%4c%5c%3c\n",'/','\\','/','\\'); printf("%2c|%3c\\___\\%4c%3c\n",'/','|','/','\\'); printf("%3c%3c%2c]%2c%3c____\\\n",'|','|','[','|','/'); printf("%3c%3c%5c%5c|\n",'|','|','|','|'); printf("%2c-----------------\n",'-'); return 0; } Sposób IV: stałe znakowe i stałe łańcuchy #include <stdio.h> int main() { printf("%7s\n","__"); printf("%9s%8s\n","/\\||__","/\\"); printf("%6s%4c%5c%3c\n","/[]\\",'\\','/','\\'); printf("%3s%8s%4c%3c\n","/|","|\\___\\",'/','\\'); printf("%3c%3c%3s%2c%3c____\\\n",'|','|',"[]",'|','/'); printf("%3c%3c%5c%5c|\n",'|','|','|','|'); printf("%19s-----------------\n","-----------------"); return 0; } Rozwiązanie zadania 3. Proszę zapoznać się z projektem newton.cbp. Schemat blokowy był na zajęciach. #include <stdio.h> float silnia(int); float newton(int,int); int main() { printf("Podzbior 3-elementowy zbioru 5-elementowego mozemy wybrac na %.0f sposobow, ",newton(5,3)); printf("a podzbior 5-elementowy -- tylko w %.0f sposob.\n",newton(5,5)); return 0; } float silnia(int k) { if(k == 1 || k == 0) { return 1; } else { return k*silnia(k-1); } } float newton(int n, int k) { return silnia(n)/(silnia(k)*silnia(n-k)); } Rozwiązanie zadania 4. Poniższy kod jest zaimplementowany w projekcie coloquium.cbp, który stanowi rozwiązanie zadania 5. float wyraz(int k) { if(k < 0) { printf("\nNie ma takiego wyrazu!\n"); return 0; } else { if(k % 2 == 0) { return 1 + 1.0/(5*k*k*k*k+ 2*k*k*k + 5*k*k + 4*k + 8); } else { return 1 - 1.0/(5*k*k*k*k + 2*k*k*k + 5*k*k + 4*k + 8); } } } Rozwiązanie zadania 5. Rozwiązaniem tego zadania jest projekt coloquium.cbp. W komentarzach pliku źródłowego main.c zaznaczyłem, jak poszczególne fragmenty kodu odnoszą się do podpunktów zadania.