Archiwum kategorii: Język C

Terminy kolokwiów zaliczeniowych/poprawkowych z laboratorium

Uprzejmie informuję, że tryb zaliczania laboratoriów będzie następujący:

  1. Najpóźniej jutro (w niedzielę, 5 czerwca) studenci AiR mający laboratorium w środę, otrzymają propozycję (czasami będzie nie do odrzucenia).
  2. Osoby chcące poprawiać ocenę (lub muszące) piszą kolokwium w środę 8 czerwca).
  3. Studenci mający zajęcia laboratoryjne we wtorki (MTR/AiR), w okolicach czwartku otrzymają odpowiednie propozycje.
  4. Termin kolokwium — wtorek 13 (ups!) czerwca.

Wyniki kolokwium zaliczeniowego AiR

Bardzo przepraszam, że wyniki są tak późno.

Zgodnie z założeniami, do do zaliczenia wystarczyło zrobienie pięciu spośród 7 zadań. (Zrobienie, to znaczy uzyskanie 0,5 lub więcej punktu z każdego zadania). Czyli absolutne minimum to 2,5 punktu.

Nie ustaliłem jeszcze zasad ocen, ale to się zmieni w najbliższych chwilach (czy może raczej dniach).

Poniżej wyniki:

Lp.Nr albumuDFGiJLMsuma
1228970000,910,52,4
22290400,410,8110,40,34,9
32290611010,90,93,8
422847100,900,90,70,53
522905110000,601,6
6228973100110,70,54,2
7228937100,51110,95,4
82290540,510,513
92290700,70110,514,2
11228989100,70,70,40,93,7
122290101010110,74,7
13228955100000,91,9
14229003110,510,910,55,9
15229016100000,71,7
16228939100,3010,42,7
17228965100010,60,83,4
182289350,5010,70,90,94
1922901801,10,8010,90,84,6
2022899210,91,1100,74,7
22228987000,50,710,72,9
23228971101010,20,73,9
24228944100,310103,3
252289720,900,510,80,63,8
2622903610000,31,3
27229049110,70,710,54,9
28231101000,610,92,5
29213663100,3110,30,74,3
302289670011110,94,9
322289341000,80,80,50,63,7
33229047100,310,10,73,1
34228949000,510,72,2
35228985100,5110,94,4
36228981110110,80,95,7
37229025110,50,910,80,75,9
38229031101110,34,3
39228956011110,60,55,1
40228978110,3110,70,75,7
41229004100,510,70,33,5
42229055100,910,90,50,64,9
4322894510,8010,73,5
44231102110,310,50,74,5
4522902000110,50,73,2
4622899310,40,3010,43,1
47229005110,7000,53,2
4822901710,50,30,500,70,53,5
4922894010,80,5100,70,74,7
50228979110,5110,61,16,2
5122895310,30,510,84,6
5222865900,90,50,9100,53,8
53228942110,3010,904,2
5422902211010,50,94,4
56231840000,300,30,6
57228957100010,302,3
59229037101010,50,33,8
602290441000,510,10,93,5
612290561100,510,64,1
62229023010,6110,74,3
63229019000,6110,313,9
64228733100,310,52,8
652289410,90,91,1110,716,6
66229068110,4010,804,2
6722899110,71,1114,8
68228966110,3110,54,8
6922903910,40,6110,40,85,2
71229069100,810,63,4
7222900710,50,3110,60,54,9
73228982100,710,63,3
742289691000,710,73,4
752290011000,810,50,84,1
76229024110,30,914,2
77229048110,300,93,2
78228962110,500,90,90,95,2
7922902910,90,50,50,83,7
8023109910010,613,6
8122901200,41010,60,63,6
8222527410,50,510,53,5
83226435100110,70,54,2
84228947011010,53,5
852290660010,710,50,73,9
86229038110,7114,7
88229033110110,60,75,3
9022899710110,70,40,74,8
912289631111110,56,5
92228958110,5010,30,74,5
932290671000000,31,3
94229030100110,73,7
952289801100,510,10,64,2
96229008100,600,700,73
97229059100,9100,40,74
982289460,90,300,500,42,1
99229000110,5110,85,3
1002290650,100,9010,60,83,4
101229032000,6100,813,4
102229042100,90,90,30,83,9
103229015110,3110,51,15,9
10522873410,810,510,54,8
10622894810,90,3000,70,33,2
10722893610,710,5104,2
10822894310110,910,95,8
109228990100,311115,3
11022900611010,50,54
11122895410,500,510,60,13,7
112225304110,30,910,50,55,2
1142289750,500,4110,503,4
115229011100,510,50,53,5
116229034010,3110,53,8
11722896100010,50,82,3
118229041100,11110,74,8
1192290131110,50,90,44,8
120228960110,70,510,64,8
12122895210,90,2013,1
12222898311111117
12322897710,50,3110,34,1
124229063100,5110,43,9
125229002110,5100,90,54,9
126228938010,610,73,3
12722895110,5000,50,32,3
12822895000,3110,70,33,3
129228994100,30,910,43,6
130228959110110,80,65,4
13122902100,50,3110,50,94,2
132204226000010,80,82,6
133229046111110,716,7
134229052110,300,42,7
135229064100,3110,50,74,5
136229035100,90,60,63,1
137229058010,3102,3
13822899610,50,3000,513,3
139229043111110,75,7

Test, test i co po teście?

Pojawiły się zapytania co robić po kiepskim wyniku testu.
Odpowiedź jest właściwie bardzo prosta: trzeba (wystarczy?) trochę postudiować. Polega to na ćwiczeniu: rozwiązywaniu zadań, studiowaniu dokumentacji i sprawdzaniu wszystkiego co jest niejasne.
Niestety niewiele mogę poradzić tym, którzy nie mogą/nie potrafią/nie chcą zainstalować sobie żadnego środowiska programistycznego na swoim komputerze. Choć akurat w przypadku komputera z linuksem jest to bajecznie proste. Pewnym rozwiązaniem może być trenowanie się na Google Blockly. Bardzo łatwo zainstalować je na własnym komputerze. Nie da się tam nauczyć programowania w C, ale można nauczyć się programowania.

Na program zajęć składają się dwa wątki:

  • nauka elementów języka C,
  • nauka algorytmizacji prostych problemów.

Jedno bez drugiego nie da oczekiwanych efektów.

Podstawowe elementy języka C niezbędne do zaliczenia to:

  • rozumienie różnic między podstawowymi typami danych,
  • umiejętność doboru typu danych do rozwiązywanego problemu,
  • umiejętność deklaracji zmiennych prostych i złożonych,
  • znajomość podstawowych poleceń języka C: instrukcja warunkowa, instrukcje konstruujące pętle,
  • operacje arytmetyczny i postawienia (w tym wszystkie problemy wynikające z mieszania typów),
  • podstawowe operacje na tablicach,
  • istota i idea funkcji; zwłaszcza umiejętność stworzenia niezbyt rozbudowanej funkcji wyposażonej w argument(y) i zwracającej wynik,
  • zakładam, że wskaźniki, struktury, umiejętność obsługi pamięci dynamicznej to elementy zaawansowane…

Znacznie trudniej jest opisać umiejętności związane z algorytmizacją (prostych) problemów. Z drugiej strony nie wymaga to żadnej wymyślnej wiedzy, a jedynie(?) umiejętności logicznego myślenia. Podstawowe umiejętności to:

  • zdolność podzielenia większego zadania na kilka mniejszych, prostszych pod-problemów (które później będzie można zaprogramować jako funkcje!),
  • umiejętność przetłumaczenia zapisu matematycznego wyrażenia na odpowiednie konstrukcje programistyczne,
  • opanowanie konstrukcji powtarzania obliczeń: zadaną liczbę razy albo tak długo dopóki jakiś warunek jest (nie) spełniony,
  • rekurencja to zdecydowanie poziom zaawansowany.

Polecam też archiwalne wpisy: Kilka uwag po kolokwium oraz Kilka uwag… (część 2).

Wyniki kolokwium z 27 kwietnia 2016 (AiR)

Niestety, wyniki nie są optymistyczne. Pytań było 18, ocenę pozytywną gwarantowało zdobycie punktów 9. Niestety aż 40 osobom się to nie udało. Rozkład zdobytych punktów pokazuje poniższy wykres.

air

Lp.Nr albumupunktyocena
1228970103
222904082
3229061103
422847182
6228973123,5
7228937103
822905472
1022897682
1122898982
14229003103
1522901672
1622893962
1722896593
1822893572
19229018103
2222898762
2322897182
24228944103
25228972103
26229036103
2722904993
28231101113,5
2921366372
30228967113,5
3222893482
3322904762
3422894993
3722902593
3822903182
3922895662
40228978123,5
42229055144
43228945123,5
4423110282
45229020103
46228993113,5
47229005123,5
48229017123,5
49228940123,5
50228979113,5
5122895372
52228659113,5
5322894272
5522898872
5722895782
6022904482
6122905682
62229023113,5
6322901993
65228941134
6722899193
6822896662
69229039113,5
7322898282
7422896993
7522900182
7622902493
7722904882
78228962113,5
8023109993
8122901293
8222527482
83226435103
8422894782
8622903893
8822903382
89228986144
9022899793
9122896393
9222895893
9322906772
94229030123,5
95228980113,5
98228946144
99229000113,5
10022906593
102229042113,5
103229015144
105228734123,5
10622894872
107228936134
108228943103
10922899093
110229006103
11122895482
11222530493
11322900982
11422897572
11622903482
117228961123,5
119229013103
12022896093
12122895272
12222898393
12422906382
12522900293
126228938113,5
12722895193
12822895082
130228959123,5
131229021103
133229046103
13422905282
135229064123,5
13722905882
13922904393

Kilka uwag… (część 2)

Oglądając kawałek kodu starajcie się zastanawiać precyzyjnie co oznacza każdy jego fragment.

  1. Widzimy 2 Jest to stała typu int. 2. (dwójka z kropką) to stała typu double. (Jak w tym kontekście wygląda stała typu float?). Co to jest 'a' ? Jest to stała typu char. Natomiast "a" to stała typu char * („char gwiazdka”, czyli wskaźnik do tego miejsca w pamięci, w którym zapisany jest napis o długości dwu znaków składający się ze znaku 'a' i znaku o kodzie 0 ( '\0' ).
  2. Widzimy gwiazdkę (*) patrzymy w jakim kontekście ona występuje. Czy jest to kontekst typu a * b (albo 2 * b)? Jeżeli tak, gwiazdka ma charakter dwuargumentowego operatora mnożenia. gdy występuje na lewo od zmiennej (* a) wówczas jeżeli zmienna zadeklarowana jest jako wskaźnik (na przykład double * a;) to *a oznacza dostęp do zawartości pamięci wskazywanej przez wskaźnik. Gdy po lewej stronie znaku nie ma nic, a po prawej stronie jest stała albo zmienna — będzie błąd.
  3. Przypominam, że identycznie rozróżnia się jednoargumentowy znak - (zmiana znaku, na przykład: -3) od dwuargumentowego operatora - (odejmowanie, na przykład a - b).
  4. O stałych (i zmiennych) typu znakowego pamiętamy, że mogą być traktowane jako stałe (i zmienne) typu całkowitego. W związku z tym wszystkie operacje arytmetyczne są dozwolone. Zatem 'a'/200 interpretujemy tak: Iloraz. Dzielna to stała znakowa (o nieznanej z pamięci wartości całkowitej mieszczącej się pomiędzy 0 a 127). Dzielnik – stała całkowita o wartości 200. Ponieważ po obu stronach znaku dzielenia są stałe zbliżonego typu (char jest równoważne int) dzielenie ma charakter całkowity: coś mniejsze od 200 dzielone przez dwieście, daje w wyniku 0. W żadnym wypadku nie jest todzielenie litery a n 200 części czy kawałków. Poprawny jest również zapis float a = 'a';. Zostanie dokonana tu konwersja z char do int a następnie do float.
  5. Oglądając kawałek kodu nie patrzcie na wcięcia: przecież prawie nigdy ich nie stosujecie! Patrzcie na nawiasy klamrowe i czy są sparowane. Nie jest prawdą, że po każdej instrukcji if, else czy else if musi być para nawiasów. Jak jest tam tylko jedno polecenie — nie musi.
  6. Dynamiczny przydział pamięci to przydział pamięci realizowany za pomocą funkcji malloc (calloc) i odbywa się on w trakcie uruchamiania programu, nie w czasie kompilacji, czy ładowani programu do pamięci.
  7. Wielokrotnie wspominałem o funkcji „swap” i o konieczności realizowania jej za pomocą wskaźników — w przeciwnym razie efekt zamiany nie powoduje żadnych skutków. Jedno z zadań (F) to były różne warianty tego problemu. Nie uważam (w odróżnieniu od niektórych) że przykład ten był niejasny i pogmatwany. Właściwe użycie wskaźników bądź ich brak wpływają na wynik.
  8. Poniżej jak najbardziej poprawna definicja funkcji:

    zwracam uwagę, e nie został tu określony typ argumentu ani typ funkcji. Zgodnie z konwencją języka C w tym przypadku zapis taki jest równoważny int f(int x). W szczególności można zatem napisać  main (){}

Kilka uwag po kolokwium

Nie sądzę, że ktokolwiek to przeczyta, ale sprawdzanie waszych prac, to prawdziwa mordęga.

  1. Jak przepisujecie od kolegi — przetwarzajcie tekst. Żeby się trochę różnił. Chyba, że nie rozumiecie co przepisujecie (obawiam się, że w większości przypadków tak właśnie było).
  2. Przepisujcie tylko od tych, którzy coś wiedzą.
  3. Sprawdźcie treść zadania. Bo czasami przepisywana treść zupełnie do zadania nie przystaje. Ale czytanie ze zrozumieniem, nie musi być łatwe.
  4. Nie jest prawdą, że po każdym poleceniu if albo else powinny wystąpić nawiasy klamrowe (dotyczy to również forwhile). Jeżeli wykonywane jest tylko jedno polecenie — nawiasów może nie być!
  5. Nie jest prawdą, że void f(int x) nie jest funkcją tylko procedurą. W terminologii języka C jest funkcją, którą czasami (przez analogię do innych języków programowania) nazywa sięprocedurą.
  6. Po raz kolejny zwracam uwagę na operatory (dwuargumentowe) & oraz && i parę | oraz ||. Pierwszy (& to operator logiczny I (AND po angielsku) działający na bitach. Drugi (&&) I (AND po angielsku) działające na całych wartościach. Zatem ’1 & 3’ należy interpretować jako 00000001 & 00000011; wynik ostatniej operacji to 00000001 (operator „wynajduje” bity 1 występujące na tych samych pozycjach w obu liczbach. W przypadku operatora && wartości nie są rozbijane na poszczególne bity tylko interpretowane jako całość: wartość równa zeru to fałsz (False) a różna od zera — prawda (True). I tak przeprowadzane są obliczenia. Gdy i zmienia się od 0 do 9 to 1 & i przyjmuje wartości 0, 1, 0, 1 i tak dalej (zero dla liczb parzystych i 1 dla nieparzystych). W przypadku wyrażenia 1 && i — gdy i jest równe zero — wynik całego wyrażenia jest fałsz (bo prawda (1) AND fałsz (0)), dla pozostałych wartości i będzie prawda ANDprawda czyli prawda. W przypadku operatorów LUB (OR) jest bardzo podobnie.
  7. Jeżeli gdzieś Państwo zobaczą coś takiego cards[2] = cards[3]; to nie interpretujcie tego jako „do tablicy dwuelementowej wpisz tablicę trójelementową” tylko jako „trzeci (choć numerowany od zera) element tablicy cards wstaw w miejsce drugiego (też numerowanego od zera)”.
  8. To: "abcdef" to stała tekstowa. Charakter (typ) tej stałej to „tablica znakowa”. "abcdef"[5] to piąty (licząc od zera) element tej tablicy. Tablica ta zawiera sześć znaków (liter), a jej siódmym elementem jest znak o kodzie ASCII 0. W żadnym wypadku "abcdef"[5] nie jest pytaniem o długość napisu. Choć istotnie, "abcdef"[i], gdy i zmienia się od zera do 5 będzie różne od zera, a "abcdef"[6] będzie równe 0, natomiast ile wyniesie "abcdef"[7] nie bardzo wiadomo. Może być, na przykład tak:

(Jest to wynik działania programu: