... przypominam że należy napisać sprawozdanie z wykonania każdego zadania i pod koniec zajęć przesłać je na odpowiedni adres email-owy

sprawozdanie powinno zawierać:

(są też zadania domowe !!!)
 
 

Zadanie 14


Zdefiniuj następujące funkcje (używając rekurencji): Należy wypróbować działanie tych funkcji dla małych liczb.
UWAGA 1 : pamiętaj o używaniu "dużych" zmiennych całkowitych.
UWAGA 2 : pamiętaj że rekurencja nie może być "nieskończona" !!!
 

Zadanie 15


Zaimplementuj procedury wypisujące wszystkie "obiekty kombinatoryczne" danego typu (np K-elementowe kombinacje zbioru N-elementowego). Przy użyciu rekurencji jest to bardzo proste zadanie !

Kazda procedura ma wypisywać wszystkie obiekty (ponumerowane) a na końcu - dla kontroli - powinna wypisywać prawidłową liczbę obiektów (tu będą przydatne funkcje zdefiniowane w zadaniu 14; np liczba wspomnianych kombinacji to Newton(N,K)).

Należy zaimplementować procedury wypisujące następujące obiekty:

Należy używać podanych niżej stałych, zmiennych, typów i procedur: Wskazówka:
jak zaprogramować WariacjeZPowtorzeniami(i) ???
... użyjemy tablicy "Wynik" do przechowywania pojedynczej wariacji;
w procedurze WariacjeZPowtorzeniami
w pętli "for j:=1 to N do" robimy następujące rzeczy:
  • Wynik[1]:=j
  • uruchamiamy całą procedure rekurencyjnie ale w taki sposób aby modyfikowała tablicę Wynik od drugiego elementu (taka jest właśnie interpretacja parametru "i" procedury WariacjeZPowtórzeniami - jego wartość to indeks elementu tablicy Wynik ktory procedura powinna bezpośrednio modyfikować )

  •  
    UWAGA: nie wolno używać parametrów i zmiennych lokalnych o nazwach "n" i "k" gdyż są już stałe o tych nazwach.
     
     

    Zadanie 16


    Dana jest "kostka" V[1..n,1..m,1..p]. Posortuj jej elementy przy pomocy procedury znajdującej element maksymalny. Sortowanie ma wyglądać następująco:
        V[1,1,1]<= ...         <=V[1,m,1]<=
        V[2,1,1]<= ...         <=V[2,m,1]<=
        .................................
        V[n,1,1]<= ...         <=V[n,m,1]<=
    
        V[1,1,2]<= ...         <=V[1,m,2]<=
        V[2,1,2]<= ...         <=V[2,m,2]<=
        .................................
        V[n,1,2]<= ...         <=V[n,m,2]<=
    
        .................................
    
        V[1,1,p]<= ...         <=V[1,m,p]<=
        V[2,1,p]<= ...         <=V[2,m,p]<=
        .................................
        V[n,1,p]<= ...         <=V[n,m,p]
    Wygeneruj losową kostkę i ją wydrukuj (warstwa po warstwie). Następnie posortuj i znów ją wydrukuj.
     
     
     
     

    Zadania domowe.

    Zadanie domowe 1

    Lista jednokierunkowa wygląda następująco:

    Zaimplementuj następujące operacje na liście jednokierunkowej:
        struct ElementListy {...};
          // struktura reprezentujące pojedynczy element listy
    
        struct Lista {...};
          // struktura reprezentujące listę
    
        void NowaLista(Lista &l);
          // inicjowanie struktury Lista
    
        void DodajElementOdGłowy(Lista &l, ElementListy &elem);
    
        void UsunElementOdGłowy(Lista &l);
    
        void DodajElementOdOgona(Lista &l, ElementListy &elem);
    
        void PokazListe(Lista &l);
          // pokazuje elementy listy począwszy od "głowy"
    
        void PolaczListy(Lista &l1, Lista &l2);
          // lista "l2" zostaje dołączona na koniec listy "l1" 
          // ("l2" staje się pustą listą)
    Wszystkie operacje (także DodajElementOdOgona !) mają działać "w stałym czasie", tj w czasie który nie zależy od liczby elementów list. Elementy list należy tworzyć dynamicznie (język C: operatory new/delete lub funkcje malloc/free, język Pascal: funkcje new/dispose).
     

    Zadanie domowe 2


    Wiadomo że "naiwne" algorytmy sortujące działają w czasie O(n^2) a te bardziej wyrafinowane (jak QuickSort i MergeSort) w czasie O(n log n) ...
    Zaplanuj eksperyment pokazujący że istotnie tak jest.
  • Przez czas działania rozumiemy: A) liczbę porównań elementów ciągu, B) liczbę przypisać elementu tablicy.
  • Należy używać losowych ciągów danych.
  • Należy użyć jednego algorytmu naiwnego (przez wstawianie, przez selekcje) i jednego nie-naiwnego.
  • Należy zmieniać odpowiednio wartość "n" (=liczby elementów) i dla każdego "n" obliczać czas działania obu algorytmów na ciągu tych samych n-liczb. Następnie czas działania algorytmów należy zestawić z wartościami funkcji (n^2) i (n log n) w formie tabelki:
  • Należy kilkakrotnie powtórzyć obliczenia dla ustalonego "n" i wynik uśrednić, gdyż czas działania może zależeć od rodzaju danych wejściowych.

  •