Informacje odnośnie poprawy z dnia 2014-02-12
Ostatnią poprawę zaliczyła jedna osoba: 287804
Informacje odnośnie poprawy z dnia 2014-01-30
Szanowni Państwo,
Podobnie jak poprzednio, najpierw będą wyniki a potem uwagi.
Wyniki
- 345313 2
- 346179 3
- 345300 2
- 345321 2
- 345319 2
A teraz uwagi.
Tym razem dostali Państwo takie oto zadanie:
Narysuj schemat blokowy algorytmu pozwalającego zamienić liczbę szesnastkową na dziesiętną.
W praktyce robi się to w następujący sposób: bierzemy kolejne cyfry, mnożymy je przez kolejne potęgi systemu źródłowego (16) zapisując wyniki w systemie dziesiętnym; na zakończenie wyniki te sumujemy. Z pewnością nie robimy tego przez dzielenie (co miało miejsce w zadanich z dwóch poprzednich popraw) tak jak to Państwo napisali.
Co się zaś tyczy zadania 1:
Napisz pseudokod algorytmu wypisującego z tablicy jednowymiarowej zawierającej liczby całkowite tyle elementów (począwszy od drugiego) ile wynosi wartość wpisana do pierwszej komórki. Zakładamy, że tablica ma wymaganą długość.
Na przykład, dla tablicy T = [3 4 5 6 7 8 9]
algorytm powinien wypisać 4, 5, 6.
to widziałem wiele odpowiedzi podobnych do tej
funkcja foo(T: tab[], x:integer)
begin
x = t'first
for i in t'first+1 .. t'first + x loop
....
Moim zdaniem, nie jest to dobre rozwiązanie, no chyba że mnie Państwo przekonają, że jest inaczej. Jakie jest bowiem znaczenie
t'first? Jest to wartość pierwszego elementu z tablicy? A może indeks pierwszego elementu? A może...
Informacje odnośnie poprawy z dnia 2014-01-27
Szanowni Państwo,
Podobnie jak poprzednio, najpierw będą wyniki a potem uwagi.
Wyniki
- 345300 2
- 345231 2 (poprawa 1 kolokwium)
- 345231 2 (poprawa 3 kolokwium)
- 345312 2 (poprawa 1 kolokwium)
- 345312 2 (poprawa 3 kolokwium)
- 345313 2
- 345314 2 (poprawa 1 kolokwium)
- 345314 2 (poprawa 3 kolokwium)
- 345315 2
- 287804 2
- 346179 2 (poprawa 1 kolokwium)
- 346179 3 (poprawa 3 kolokwium)
- 345319 2
- 345321 2
A teraz uwagi.
Na poprzednim kolokwium dałem Państwu takie oto zadanie:
Napisz schemat blokowy algorytmu pozwalającego zamienić liczbę dziesiętną na dwójkową.
i w drugiej grupie właściwie identyczne:
Napisz schemat blokowy algorytmu pozwalającego zamienić liczbę dziesiętną na szesnastkową.
O dziwo, mieli Państwo z nim straszne problemy, ale zdążyli sobie do dziś przypomnieć, iż zamiany tej dokonujemy przez wielokrotne dzielenie zadanej liczby DZIESIĘTNEJ przez podstawę systemu docelowego a więc 2 lub 16. Właściwie to nie tyle przypomnieli sobie Państwo, ale nauczyli się na pamięć zupełnie bez zrozumienie (a powinni Państwo teoretycznie to rozumieć, gdyż kolokwium z systemów liczbowych już było), że tak się to robi. Skąd wniosek o wyuczeniu się na pamięć? Otóż dziś dostali Państwo, całkiem świadomie, zadanie takiej oto treści
Narysuj schemat blokowy algorytmu pozwalającego zamienić liczbę szesnastkową na dwójkową.
Świadomie, gdyż interesowało mnie nie tyle to, kto zrobi je bezbłędnie, ale kto zauważy, iż pozornie takie samo, to zupełnie inaczej robi się je w praktyce. Możliwości są dwie
- Dokonują Państwo konwersji z systemu 16 na 10 i dopiero z 10 na 2.
- Znacznie szybsza metoda wykorzystuje fakt, że jednej cyfrze szesnastkowej odpowiada ciąg 4 bitów, czyli ,,zasada grupowania''. Tak więc wystarczy każdej cyfrze szesnastkowej przypisać odpowiedni ciąg.
Tak czy inaczej postępowanie jest zupełnie inne niż przy zamianie liczby DZIESIĘTNEJ na 2. Niestety zupełnie nie przeszkodziło to Państwu w napisaniu algorytmu odpowiadającego ,,starej'' wersji tego pytania a więc z poprzedniego kolokwium. Moja teza jest taka: nauczyli się go Państwo na pamięć, zobaczyli dziś coś co wyglądało prawie jak poprzednio (a różnica była niewielka, ale istotna), i zupełnie bezmyślnie odtworzyli to Państwo (popełniając przy tym błędy).
I teraz moja kolejna uwaga na przyszłość: informatyki nie można nauczyć się na pamięć. Trzeba ją zrozumieć, tak jak trzeba zrozumieć gdzie tkwi różnica w zamianie systemu 10 na 2 a 16 na 2. A na to potrzeba dużo, baaaardzo dużo godzin ćwiczeń i (samodzielnej) pracy.
Informacje odnośnie poprawy z dnia 2014-01-24
Szanowni Państwo,
Przepraszam za małe opóźnienie (obiecałem wyniki od końca 25 stycznia 2014 a jest 26 stycznia 2014, godzina 00:17), ale musiałem dopisać kilka uwag, czego wcześniej nie planowałem robić. Najpierw będą wyniki a potem uwagi.
Wyniki
- 345300 2
- 345305 3
- 345313 3 (poprawa 1 kolokwium)
- 345313 2 (poprawa 3 kolokwium)
- 345315 2
- 346028 3
- 346179 3
- 345319 2
- 345321 2
A teraz uwagi.
Odnośnie tego co Państwo zaprezentowali na kolokwiach z algorytmów mam kilka uwag, które radzę sobie wziąć do serca bez względu na to czy Państwo zaliczyli ćwiczenia a nawet cały przedmiot czy jeszcze nie.
- Wyraźnie widać, iż mają Państwo duże kłopoty z algorytmem jako takim, to znaczy z uświadomnieiem sobie jakie czynności i w jakiej kolejności należy wykonać aby osiągnąć postawiony cel. Czeka Państwa jeszcze bardzo dużo pracy SAMODZIELNEJ zanim jakoś zaczną sobie z tym radzić. Podkreślam - SAMODZIELNEJ. Nie oznacza to, że nie można przyjść do prowadzących i zadawać im pytań, ale nie należy poprzestawać na tym co było, jest i będzie na zajęciach. Zajęcia to jedynie malutki wierzchołek wielkiej góry...
- Nie potrafią Państwo słuchać ze zrozumieniem a co ważne słuchać i wykonywać podanych poleceń. Przykłady poniżej
- Wydawało mi się, że do znudzenia mówiłem na ćwiczeniach, iż odwołując się do elementów tablicy n-wymiarowej należy użyć n indeksów. Tak więc jak may tablicę dwuwymiarową to MUSZĄ BYĆ DWA indeksy. Mówiłem nie raz, nie dwa... Za każdym razem. A mimo to wciąż w tym co Państwo oddają znajduję takie oto rzeczy (przykład z pracy jaką ktoś mi oddał)
Function wypisz( T: array[][], w: integer)
begin
for i in 1 .. w loop
wypisz T(i*2) // Aaaaaaaaaa!!! T jest tablicą DWUWYMIAROWĄ!!!
end loop
end
Drugi przykład związany z tym zagadnieniem będzie dalej. Na marginesie, to dla części osób nie ma znaczenie czy napiszą T(i*2) czy T(i)*2...
- Podobnie do znudzenia mówiłem, że jeśli w algorytmie używa się zmiennych to muszą one być gdzieś określone / opisane / zdefiniowane. Mogą być przed algorytmem, w części opisowej, np
argument1 - zmienna typu tablicowego reprezentująca tablicę dwuwymiarową służącą do przechowywania
liczb całkowitych. W algorytmie pełni rolę struktury przechowującej dane na których ma
zostać wykonana operacja.
argument2 - zmienna będąca liczbą rzeczywistą. W algorytmie pełni rolę mnożnika.
funkcja nazwaFunkcji (argument1, argument2)
begin
/* instrukcje */
end
lub w części nagłówkowej, np.
argument1 - struktura przechowująca dane na których ma zostać wykonana operacja
argument2 - mnożnik
funkcja nazwaFunkcji (argument1: array[][], argument2: integer)
begin
/* instrukcje */
end
lub gdziekolwiek indziej (no prawie gdziekolwiek indziej), byle tylko były. Tym czasem praktycznie nikt z Państwa tego nie robi. Piszą Państwo na przykład tak (przykład z pracy jaką ktoś mi oddał)
for w in 1 .. c loop
for k in 1 .. d loop
wypisz (t[w*2]t[k]); // Eeeeee... Bardzo ciekawa konstrukcja, baaaardzo...
end loop;
end loop;
To jest cała odpowiedź. Oświadczam: nie jestem wróżką ani jasnowidzem i nie mam zielonego pojęcia czym są / jaką pełnią rolę / co reprezentują zmienne c, d, t. Pojęcia tego nie będzie miała także żadna inna osoba w całym Wszechświecie włączając samego wszechwiedzącego Pana Boga. Oczywiście, że znając treść zadania można DOMYŚLEĆ czym te zmienne są. Ja jednak mam sprawdzić po pierwsze Państwa wiedzę a po drugie, czy potrafią Państwo, a jeśli tak to w jakim stopniu, myśleć i z owej wiedzy korzystać. Nie zamierzam niczego się domyślać ani odgadywać Państwa myśli i intencji.
Kłopot polega na tym, że na ćwiczeniach tylko o tym mówiłem, ale nigdy tego nie pisaliśmy. To nic. Jeśli Państwo nie wiedzieli jak to zapisać, trzeba było pytać. A nie pisaliśmy celowo - byłem bardzo ciekawy dwóch rzeczy: ile osób przyjdzie do mnie na dyżur i zapyta jak to ewentualnie zrobić (nie przyszedł nikt), oraz jak zrealizują to Państwo na kolokwium, czyli inaczej mówiąc - na ile uważnie i ze zrozumieniem Państwo słuchają.
- Kolejna rzecz, która wyprowadza mnie z równowagi, a na którą zwracałem Państwu wielokrotnie uwagę. Otóż zgodnie z ogólnie przyjętą definicją funkcja lub procedura (ogólnie: podprogram) to wydzielona część programu wykonująca jakieś operacje. Podprogramy stosuje się, aby uprościć program główny i zwiększyć czytelność kodu. Często podprogram traktujemy jako czarną skrzynkę, która ma wykonać jakieś zadanie. Nie interesuje nas jak to robi, ale jedynie sam fakt, że to robi. Jedyne o czym musimy pamiętać, to ewentualnie o dostarczeniu odpowiednich danych aby podprogram mógł wykonać pracę. I tak na przykład podprogramowi rysującemu odcinek na ekranie trzeba dostarczyć współrzędne początku i końca tego odcinka. Tak czy inaczej to WYWOŁUJĄCY martwi się o dostarczenie odpowiednich argumentów a nie twórac podprogramu. Twórca podprogramu zakłada, że te dane są jemu dostarczone (no chyba, że celem podprogramu jest pobranie danych od użytkownika czy też ich wczytanie z nośnika). Tym czasem znaczna część z Państwa nie wyobraża sobie chyba programu / podporgramu / funkcji bez wczytywania czegoś od użytkownika.
Ogólnie mówiąc: jeśli jakaś zmienna wystąpi w nagłówku funkcji to zakładamy, że ktoś już się zatroszczył o jej przygotowanie i NIE MUSIMY JEJ WCZYTYWAĆ!!!
Będę niezmiernie wdzięczy jeśli wezmą sobie Państwo powyższe uwagi do serca. Po pierwsze ja będę się mniej denerwował a po drugie znacząco przybliży to Państwa do zdania egzaminów. Nie chodzi tutaj bowie tylko o egzamin ze Wstępu do informatyki, ale wielu inych przedmiotów na jakie, mam nadzieję, będą mieli Państwo przyjemność uczęszczać.
Oczywiście wszystkiego tego co powyżej wcale nie musiałem pisać - zaoszczędził bym w ten sposób jakieś półtorej godziny. Mam nadzieję, żę doceną to Państwo. Mam nadzieję, że wyciągną właściwe wnioski na przyszłość. Mam nadzieję, że zrozumieją, iż nie wyśmiewam nikogo, ale zwracam uwagę na pewne bardzo istotne sprawy. A zwracam po to aby wiedzieli Państwo czego mają się jeszcze uczyć i jak zmienić podejście od nauki. Jak by na to nie patrzeć, są Państwo studentami:
Student (łac. studere -- starać się, przykładać się do czegoś)
Oto jak ja bym rozwiązywał Państwa zadania.
-
Napisz pseudokod algorytmu wypisującego z tablicy jednowymiarowej co drugi element.
Algorytm
T - tablica jednowymiarowa.
W algorytmie pełni rolę struktury przechowującej dane na których ma
zostać wykonana operacja. W algorytmie przyjmuję, że tablica
indeksowana jest od 1.
e - liczba całkowita określająca ilość elementów tablicy T
i jeśli ktoś chce być bardzo precyzyjny to może dopisać
i - zmienna pomocnicza typu całkowitego pełniąca rolę licznika pętli
ale to akurat widać w algorytmie w użytych konstrukcjach
funkcja foo(T, e)
begin
for i in 1 .. e step 2 loop
wypisz(T[i])
end loop
end
lub
funkcja foo(T, e)
begin
i = 1 // zmienna pomocnicza - licznik pętli
while (i < e) loop
wypisz(T[i])
i := i + 2
end loop
end
lub
funkcja foo(T, e)
begin
for (i := 1; i < e; i+=2 )
wypisz(T[i])
end
end
-
Napisz pseudokod algorytmu wypisującego z tablicy dwuwymiarowej elementy większe od zadanego elementu e
Algorytm
T - tablica dwuwymiarowa zawierająca liczby rzeczywiste.
W algorytmie pełni rolę struktury przechowującej dane na których ma
zostać wykonana operacja. W algorytmie przyjmuję, że tablica
indeksowana jest od (1,1) a pierwszy indeks w parze jest indeksem
wiersza, tj. (indeksWiersza, indeksKolumny)
w - liczba całkowita określająca ilość wierszy w tablicy T
k - liczba całkowita określająca ilość kolumn w tablicy T
e - liczba rzeczywista - zadany element
funkcja foo(T, w, k, e)
begin
for i in 1 .. w loop
for j in 1 .. k loop
if( T[i][j] > e) then
wypisz(T[i])
end if
end loop
end loop
end
- Napisz algorytm łączący dwie macierze: A o ilości wierszy n i ilości kolumn a oraz B o ilości wierszy n i ilości kolumn b w jedną macierz M o ilości wierszy n i ilości kolumn a+b. Przykład działania
|1| |4 5| |1 4 5|
A:=|2| B:=|6 7| M=A+B=|2 6 7|
|3| |8 9| |3 8 9|
Algorytm
A - tablica dwuwymiarowa zawierająca liczby rzeczywiste.
W algorytmie pełni rolę struktury przechowującej dane na których ma
zostać wykonana operacja. W algorytmie przyjmuję, że tablica
indeksowana jest od (1,1) a pierwszy indeks w parze jest indeksem
wiersza, tj. (indeksWiersza, indeksKolumny)
B - jak A
n - liczba całkowita określająca ilość wierszy w tablicy A (B)
a - liczba całkowita określająca ilość kolumn w tablicy A
b - liczba całkowita określająca ilość kolumn w tablicy B
M - tablica dwuwymiarowa o wierszach i a+b kolumnach mogąca przechowywać liczby rzeczywiste.
(w tym przypadku ten opis nie jest konieczny, gdyż zasadniczo powiela opis z treści zadania;
jedyna istotna informacja, którą warto zamieścić to fragment:
[...]W algorytmie przyjmuję, że tablica
indeksowana jest od (1,1) a pierwszy indeks w parze jest indeksem
wiersza, tj. (indeksWiersza, indeksKolumny)
)
funkcja foo(A, n, a, B, n, b, M)
begin
for i in 1 .. n loop
for j in 1 .. a loop
M[i][j] := A[i][j]
end loop
end loop
for i in 1 .. n loop
for j in 1 .. b loop
M[i][a + j] := A[i][j]
end loop
end loop
end