Zadania

Tu będą pojawiać sie zadania do rozwiązania na zajęciach lub w domu. Za kazde rozwiązanie zaprezentowane na zajęciach można otrzymać 5 pkt. Nie można otrzymac więcej niż 10 pkt za jedne ćwiczenia.

środa, 1 grudnia 2010

Omawianie regulaminu ćwiczeń, wstęp do Schema

Zadania: zadanie T1 i T2 z testerki, za dwa poprawne 5 pkt, za jedno 3 pkt.

piątek, 3 grudnia 2010

Scheme, wbudowane funkcje, definiowanie własnych funkcji, funkcja if, funkcje rekurencyjne, operacje na listach.

Scheme w 5 minut

Zadania:

  1. Napisać własną funkcję dodawanania trzech liczb add3 zwracającą dla parametrów a,b,c wartość a+b+c.

    Napisać funkcje przyjmującą trzy parametry: op, a, b. Funkcja ma zwracać następujące wyniki w zależności od wartości parametru op:
    op = 1: a+b
    op = 2: a-b
    op = 3: a*b
    op = 4: a/b
  2. Napisać funkcję która przyjmuje liczbę n i zwraca n-ty wyraz ciągu fibonacciego (f[0] = 0, f[1] = 1, f[n] = f[n-1] + f[n-2])

  3. Napisać funkcję która otrzymuje jako parametr listę i wyświetla jej elementy oddzielone przecinkami.
    Przykład:
    (printlist '(1 2 3 4))
    1, 2, 3, 4,
  4. Napisać funckję, która przyjmuje wartość n i zwraca listę liczb od 1 do n.
    Przykład:
    (nlist 10)
    (1 2 3 4 5 6 7 8 9 10)
  5. Napisać funkcję która przyjmuje jako parametr listę oraz liczbę n a zwraca listę list zawierających kolejne n-elementowe fragmenty listy wejsciowej (zakładamy że długość listy wejściowej dzieli się przez n).
    Przykład:
    (splitlist '(1 2 3 4 5 6 7 8 9 10 11 12) 3)
    ((1 2 3) (4 5 6) (7 8 9) (10 11 12))

Przy pisaniu powyższych funkcji można (a nawet czasem trzeba) definiować funkcje pomocnicze!

środa, 8 grudnia 2010

Scheme, przekazywanie funkcji jako argumentów do funkcji, przydatna konstrukcja: map, zwracanie funkcji przez funkcję, funktory.

Zadania:

  1. Napisac funkcję, która przyjmuje jako parametry listę oraz funkcję f i stosuje f do wszystkich elementów listy zwracając listę elementów po zastosowaniu f (nie wolno stosować funkcji map!).

    Przykład:
    (define f (lambda (x) (* x x)))
    (fnaliscie '(1 2 3 4) f)
    (1 4 9 16)

    Wypróbować anonimowe definiowanie funkcji "w locie", bez definiowania dla niej nazwy.
    Zastosować wbudowana funkcję map do tych samych przykładów
  2. Napisac funkcję, która przyjmuje jako parametr liczbę n, a na wyjściu zwróci funkcję x^n (tzn. funkcję przyjmującą liczbe rzeczywista jako parametr i zwracającą jej n-tą potęgę).
    Przykład:
    ((ntapotega 2) 10)
    10
    ((ntapotega 10) 2)
    1024
  3. Napisac funkcję (funktor), która jako argumenty przyjmuje dwie funkcje f i g, a jako wynik zwraca ich złożenie, tzn f(g(.)).
    Przykład:
    (define f (lambda (x) (* x x)))
    (define g (lambda (x) (* x 2)))
    ((zlozenie f g) 2)
    16
    ((zlozenie f g) 10)
    400
    ((zlozenie g f) 2)
    8
    ((zlozenie g f) 10)
    200
  4. Napisać funkcję (Funktor), która jako argument przyjmuje funkcję f i liczbę n i zwraca n-krotne złożenie funkcji f ze sobą.
    Następnie zakładając że funkcja f jest jest zalezna od dwóch parametrów, z których pierwszy jest numerem iteracji stworzyć (pseudo)pętle for, której wywołanie będzie miało postać np. (for n f).

piątek, 10 grudnia 2010

C++: typy danych, zmienne, stałe, operatory, tablice, tablice a wskaźniki, preprocesor

Makefile by example

Zadania:

  1. Dyskusja na zajęciach
  2. Stwórz makro, które bedzie tworzyć pętlę for wykonującą się dla zmiennej sterującej (której nazwa będzia parametrem makra) od wartości początkowej a do końcowej b. Preprocesor powinen prztłumaczyć wywołanie makrodefinicji na wywołanie: for (i=a;i<b;i++)
  3. Stwórz makro "wypisujące na ekran" podczas działania programu nazwę zmiennej i jej wartość (zmienna przekazana w parametrze makra podczas jego wywołania). Dlaczego stwierdzenie "wypisujące na ekran" podczas wykonania programu nie jest dobrym sformułowaniem w tym przypadku.
  4. test.cpp
    test.h
    Pobierz powyższe pliki i spróbuj je skompilować. Dlaczego kompilacja sie nie powiodła? Jak to naprawić modyfikując tylko plik .h?
  5. Ciekawostka
    W poniższym kodzie dodaj lub zmień jeden znak tak, aby wypisał dokładnie 20 znaków X na ekran.
    Pierwsze wysłane do mnie na maila rozwiązanie zawierające co najmniej trzy poprawne, kompilujące się zamiany (każda zamiana na orginalym kodzie!) otrzyma 5 punktów.
    int i, n = 20;
    for (i = 0; i < n; i--)
    {
              printf("X");
    }
  6. Ciekawostka
    Proszę się zastanowic, co robi poniższy kod w C/C++:
    Za 5 punktów dla pierwszej osoby która wyśle poprawną odpowiedź na mojego e-maila.
    void foo(short* a, short* b, int c){
    	register short *d = a, *e = b;
    	register int f = c;	
    	{
    		register int n=(f+7)/8;
    		switch(f%8){
    		case 0:	do{	*a++ = *b++;
    		case 7:		*a++ = *b++;
    		case 6:		*a++ = *b++;
    		case 5:		*a++ = *b++;
    		case 4:		*a++ = *b++;
    		case 3:		*a++ = *b++;
    		case 2:		*a++ = *b++;
    		case 1:		*a++ = *b++;
    			}while(--n>0);
    		}
    	}
    }
  7. Ciekawostka
    Napisać program "Hello world" bez użycia ani jednego średnika, rozwiązanie wysłać jak wyżej - na mój adres e-mail.

Jedna osoba możne otrzymać tylko dwa z powyższych bonusów (w sumie 10 punktów).

Środa, 15 grudnia 2010

C++: wskaźniki, referancje, dynamiczny przydział pamięci.

Zadania:

  1. Napisz klasę wektor działającą jak dynamiczna tablica: kiedy brakuje miejsca rezerwowana jest nowa pamięć (2 razy większa niz dotychczas), kiedy ilość elementów w tablicy spada poniżej 1/4 aktualnie zarezerwowanego miejsca, zmniejsz ilość tego miejsca o połowę.
    przyjmij że tablicę trzymasz jako strukturę:
    struct wektor{
    	int* elementy; //tutaj trzymamy dane
    	int pojemnosc; //ile miejsca mamy zarezerwowane
    	int zajete; //ile elementów jest wstawionych
    };
    

    Wymagane operacje:
    void dodaj_na_koniec(wektor &docelowy, int element){
    	...
    }
    
    void usun_z_konca(wektor &docelowy){
    	...
    }
    
    void wypisz(wektor &do_wypisania){
    	...
    }
    

  2. Czy da się w podobny sposób zorganizować strukturę, która będzie pozwlać na dodawanie elementów na początku i na końcu?
  3. Zaimplementuj struktury (struct) A, B i C. A ma mieć pole będące wskaźnikiem do obiektu typu B, B pole będące wskaźnikiem do obiektu typu C, a C pole będące wskaźnikiem do obiektu typu A.
    Czy poniższy kod ma szanse zadziałać?
    A a;
    a.b = new B();
    a.b->c = new C();
    a.b->c->a = a;
    
  4. Które z poniższych kodów mają sens? Dlaczego? Dlaczego nie?
    //1.
    int& foo(){
    	int a = 200;
    	return a;
    }
    

    //2.
    int& foo(int a){
    	return &a;
    }
    

    //3.
    int& foo(int &a){
    	return a;
    }
    
    int a = 200;
    foo(++a)++;
    

    //4.
    int foo(int &a){
    	return a;
    }
    
    int a = 200;
    foo(++a)++;
    

    //5.
    int* foo(){
    	int a = 200;
    	return &a;
    }
    

    //6.
    int* foo(){
    	int a = 200;
    	return (int*)a;
    }
    

Środa, 5 stycznia 2011

C++: wiązane struktury danych, operacje na plikach stylu C

Zadania:

  1. Zaimplementuj operacje dodawania elementów do listy na początek i koniec listy. Zaimplementuj usuwanie elementów z początku listy. Zaimplementuj czyszczenie listy i wypisywanie jej na ekran.
  2. Zaimplementuj opercje przesunięcia elementu z początku listy o n pozycji "w głab listy" tzn. element z pozycji 1 powinien się znaleźć na miejscu n po wykonaniu operacji.
  3. Napisz program który z linii parametrów wcztuje nazwę pliku, po czym do niego (i na ekran) wpisuje wszystko to co wprowadził użytkownik na klawiaturze, aż do znaku końca pliku (Ctrl+Z).
  4. Napisz program, który podaje wielkości plików, których nazwy są przekazane w linii komend.
  5. Napisz program, który w podanym z linii komend pliku tekstowym zamieni wszystkie litery na DUŻE.

Piątek, 7 stycznia 2011

C++: Klasy i obiekty: enkapsulacja, konstruktory, destruktory, metody.

Zadania:

  1. Stwórz strukturę klas (dowolny model np. dom i jego wnętrze, samochód i jego wyposażenie, gra komputerowa (tekstowa)), w której wykorzystasz:
    • Co najmniej 5 klas
    • W każdej klasie co najmniej dwie metody
    • Przedefiniujesz co najmniej jeden konstruktor domyślny (wystarczy w jednej z klas)
    • Stworzysz co najmniej jeden konstruktor kopiujący (wystarczy w jednej z klas)
    • Co najmniej jeden konstrktor, który jako parametry będzie przyjmował obiekty innych klas
    • Zastosujesz składanie obiektów, aby stworzyć nowe bardziej skomplikowane klasy obiektów
    • Wykorzystasz listę inicjalizacyjną konstruktora
    • Co najmniej jeden destruktor (wystarczy w jednej z klas)
    • Co najmniej jedną klasę zagnieżdzoną z co najmniej dwiema metodami
    • Zabezpieczenie ważnych pól i prywatnych (pomocniczych) metod poprzez enkapsulację
    Struktura klas powinna być podzielona na pliki nagłówkowe i z kodem. Przyjmij, że w kazdej klasie co najmniej jedna z metod musi być zaimplementowana w pliku z kodem. Zabezpiecz pliki nagłówowe przed ponownym włączeniem.
  2. Stwórz program, który w jakiś sposób będzie umozliwiałprzetestowanie wszystkich zastosowanych konstrukcji

Czwartek, 13 stycznia 2011

C++: Klasy i obiekty: enkapsulacja, konstruktory, destruktory, metody cd.

Zadania:

  1. Rozbuduj przykład z poprzedniego tygodnia, lub stwórz nowy (jesli nie zrobiłeś tego w zeszłym tygodniu), który będzie:
    • Zastosujesz przestrzeń nazw
    • Proste dziedziczenie klas (publiczne, prywatne i protected - jakie są różnice?)
    • Zaprzyjaźnisz: funkcję z klasą, klasę z klasą, metodę z pewnej klasy z klasą (słowo kluczowe: friend)
    • Stworzysz klasę, której obiektu nie będzie się dało stworzyć poza klasą (hint: zabezpiecz konstruktory, jakie?)
    • Stwórz klasę która ma dokładnie jeden konstruktor. Czy obiekt takiej klasy da się stworzyć?
    • Stwórz metodę, którą będzie można wywoływać w następujący sposób: A a; a.metoda().metoda().metoda(); (dowolna (skonczona ;)) liczba wywołań metoda w jednej linii).
    • Niech A bedzie klasą bez publicznego konstruktora kopiującego. W klase B stwórz metodę, która mimo tego będzie potrafiła w pewien sposób przyjmować parametry będące obiektami klasy A. (hint: referancja, wskaźnik)
    • Stwórz metodę, która będzie mogła operować na obiektach które zostały zadeklarowane jako const
  2. Stwórz przykład, który obrazuje działanie powyższych konstrukcji.

Środa, 19 stycznia 2011 (zajęcia podwójne)

C++: przeładowanie operatorów i operatory konwersji.

Zadania:

  1. Lista operatorów w C++
    Prześledź w powyższej liście, które operatory można przeładować, a których nie, zastanów się dlaczego tak a nie inaczej dokonano wyboru.
    Podaj zastosowanie i definicję operatora, dla każdego możliwego operatora z listy, poza operatorami new, delete, new[], delete[], *(odniesienie do wartości - operator wyłuskania), & - operator pobrania adresu.
  2. Przeładuj operatory new i delete dla pewnej klasy z poprzednich zajęć, tak aby operatory zwracały wskaźnik do elementu tablicy w którym będziesz przetrzymywac stworzone obiekty. Tablica może mieć stałą długość, jesli skończy się miejsce zastosuj konstrukcję: throw -1; - o throw będziemy mówić kiedyś.
    Hint
  3. Przeładuj operator & w sensowny sposób, np. aby zliczał ilość pobrań adresu do obiektu. Hint
  4. W zadaniu z poprzednich ćwiczeń dodaj operatory wypisywania i czytania ze strumienia w co najmniej jednej z klas.
  5. Stwórz klasę liczb zespolonych Complex ALBO Stwórz klasę do obsługi dowolnie długich liczb całkowitych BigInt ALBO Stwórz klasę do obsługi macierzy Matrix ALBO stwórz klasę do obsługi funkcji R -> R, ze składaniem funkcji ALBO stwórz klasę do obsługi abelowych grup skończonych (na tebalkach działania).
  6. W klasie którą stworzyłeś zastanów się nad mozliwością implementacji operatorów rzutowania z twojej klasy do typów podstawowych i z typów podstawowych do własnej klasy. Zaimplementuj kilka.