Wstęp do informatyki

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 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 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 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 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.
  1. 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...
  2. Nie potrafią Państwo słuchać ze zrozumieniem a co ważne słuchać i wykonywać podanych poleceń. Przykłady poniżej
    1. 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...
    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ą.
    3. 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.
  1. 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
    
  2. 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
    
  3. 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