Zadania przed kolokwium ze Wstępu do informatyki

advertisement
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!
Download