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)
{
...
}
−1k
4. Napisz funkcję float wyraz(int) obliczającą ciąg o wyrazie ogólnym: a k = 1 4
,
5k 2k 35k 24k 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.

Podobne dokumenty