Projekt semestralny

Ten projekt powinien być zrealizowany w trakcie zajęć laboratoryjnych oraz w miarę potrzeb dokończony w domu. Ostateczny termin realizacji: przedostatnie zajęcia w semestrze (na ostatnich jest wystawianie ocen). Łagodniej oceniane są projekty ukończone we wcześniejszym terminie, promowana jest systematyczna i samodzielna praca. Lepiej oddać projekt mniej skomplikowany, ale wykonany samodzielnie, niż kopiować w części lub w całości gotowe rozwiązanie bez zrozumienia jego treści.
Projekty mają różny stopień trudności, więc każdy powinien znaleźć coś odpowiadającego własnym umiejętnościom.

Równocześnie w trakcie zajęć nadal będą realizowane zadania bieżące (listy), które w większości przypadków mogą być zaadaptowane do potrzeb projektów semestralnych. Wiedza, którą już zdobyliście, wystarczy do realizacji większości poniższych zadań. Dalsze instrukcje laboratoryjne będą pozwalały zapoznać się z bardziej zaawansowanymi technikami programowania w językach C i C++, wprowadzą was w programowanie zorientowane obiektowo (na razie na bardzo podstawowym poziomie). Poznacie bardziej wyszukane techniki kodowania i organizacji danych optymalizowane dla zastosowań takich jak szybki dostęp, szybki zapis, szybkie sortowanie, wydajna obróbka dużych ilości danych.

Realizacja projektów z poprzedniego semestru

  1. "Baza danych stacji meteorologicznej"
  • na tym etapie odczyt temperatury, ciśnienia, wilgotności może być pobierany z klawiatury lub z zewnętrznego pliku tekstowego
  • dane są zapisane w formacie: RRRR/MM/DD GG:MM [nazwa czujnika] [wartość] [jednostka] <CR>
  • przykład: 2011/04/20 12:32 [temperatura1] [23.6] [st.C]
  • aplikacja powinna przygotować się na to, że lista czujników może się zmieniać w czasie (np. dołączane są nowe czujniki do systemu)
  • listowanie dostępnych czujników (tzn. takich, których nazwy pojawiły się wśród danych w pliku)
  • wyświetlanie wyników pomiarów z zadanego okresu czasu oraz zadanego czujnika
  • obliczanie minimalnych, maksymalnych, średnich wartości z zadanego okresu czasu (np. dnia, miesiąca)
Wbrew pozorom nie jest to zadanie bardzo trudne, stopień trudności jest porównywalny z bazą studentów czy książek.
  1. "Gra kółko i krzyżyk"
  • zastosowanie podstaw programowania obiektowego
  • plansza 3 x 3
  • gra człowiek-człowiek oraz człowiek-maszyna
  1. "Gra kółko i krzyżyk"
  • możliwość zapisywania stanu gry na dysk i odtwarzanie stanu gry z dysku. Obejmuje to zapamiętanie bieżącego stanu planszy oraz informacji o tym, kto w danej chwili wykonuje ruch,
  • plansze [3..5] x [3..5] (wielkość planszy zadawana przed rozpoczęciem rozgrywki)
  • gra człowiek-maszyna
  1. "Baza rekordów książkowych"
  • Sortowanie po tytule, roku wydania, autorze. 
  • Przeszukiwanie bazy (wyszukiwanie książki na podstawie autora, tytułu)
  • Początkowo baza jest pusta. Dane najlepiej załadować z pliku tekstowego "bliblioteka.txt", w kolejnych wierszach pliku zapisane będą Autor (autorzy)\nTytuł\nRok wydania
  • Rekord opisujący każdą książkę może być strukturą zawierającą te 3 pola. Ponieważ zarówno tytuł, jak i autorzy mogą być polami o różnej długości, warto użyć tutaj wskaźnika znakowego (char*) i dynamicznie alokowanej pamięci.
  • Cała biblioteka może mieć kilka sztuk jak i kilkadziesiąt tysięcy sztuk książek. Nawet wtedy można użyć tablicy o założonej z góry pojemności. Pojedynczy element tablicy powinien zajmować 12 B przy powyższych założeniach. Zastosowanie tablicy zamiast np. listy jednokierunkowej ułatwi sortowanie elementów tablicy
  • Warto zapewnić możliwość dodawania nowych rekordów do bazy oraz zapisanie posortowanej bazy do pliku (może to być ten sam plik, z którego została wczytana
struct Ksiazka { 
    char* autor; 
    char *tytul; 
    int rok_wydania; 
};
void wyswietl(Ksiazka *k)
{
    printf(...);
}

albo

class Ksiazka {
private:
    char* autor; 
    char *tytul; 
    int rok_wydania; 
public:
    Ksiazka(char* autor; char *tytul; int rok_wydania);
    ~Ksiazka();
    void wyswietl();
};

Projekty dla zaawansowanych (realizowane na PC oraz uC)


A) Oprogramowanie terminala znakowego w C. Powinny być akceptowane rozkazy z parametrami jak i bez parametrów. Kod powinien być kompilowalny w środowisku CodeWarrior 7.2 albo 5.1. Obsługa liczb całkowitych dziesiętnych lub szesnastkowych wśród parametrów.
> beep(1000, 100) -- dzwiek 1000 Hz przez 100 ms
> led(FF,00,FF) -- zapal diode duzej mocy RR GG BB
> temp -- odczytaj temperature z czujnika
itp.

B) Konsola tekstowa dla telefonu GSM. Wysyłanie/odbieranie SMSów, zdalne wykonanie rozkazów zapisanych w SMS. Kod przenosny miedzy środowiskiem CW a PC.

C) Rejestracja i obsługa kart RFID (np. legitymacji studenckich), przekazywanie i odczyt danych z bazy zapisanej w komputerze stacjonarnym.


Przykładowe projekty dla wszystkich uczestników zajęć

1. Macierze: wprowadzanie danych, wyswietlanie, iloczyn, macierz odwrotna, wyznacznik. Matematyczna wiedza z zakresu algebry macierzy jest tu niezbędnie potrzebna do szczęścia, nie wystarczy obsługa macierzy 2x2 albo 3x3, rozsądnie jest założyć, że aplikacja będzie wspierać obliczenia dla macierzy 4x4, 5x5. Większe macierze nie wnoszą nic nowego, a trudniej je wyświetlać i więcej czasu marnujemy na wprowadzanie danych.

2. Namiastka bazy przechowującej na dysku studentów. Wprowadzanie, usuwanie, modyfikacja, wyszukiwanie rekordów. Podstawowa obróbka danych, np. liczenie średniej ocen.
Implementacja w postaci listy jednokierunkowej.

3. j.w., tablica mieszająca

4. j.w., cała baza i każdy student jako klasy (elementy programowania obiektowego)

5. baza rekordów książkowych. Sortowanie po tytule, roku wydania, autorze. Przeszukiwanie bazy.

6. baza wyników pomiarów (np. ze stacji meteo). Zestawienia wyników z wybranych okresów czasu, średnie, ekstrema.

7. Wczytywanie danych z pliku tekstowego o wybranej strukturze, np. access_log albo plików CSV. PRzechowywanie w pamięci w postaci wybranej struktury dynamicznej.

8. Gra logiczna (okręty, kółko i krzyżyk, ...)

W przypadku baz danych nie wystarcza tablica 10 rekordów w postaci statycznej tablicy, byłoby to zadanie na poziomie pojedynczych zajęć laboratoryjnych. 
W przypadku gier logicznych najlepiej wybrać takie, które nie będą wymagały poświęcania dużego wysiłku na interfejs użytkownika (najlepiej gdyby działały z użyciem mechanizmów stdio).
Dane w bazach i wyniki ich przetwarzania powinny być przechowywane w plikach, najlepiej tekstowych, aby nie było konieczne każdorazowe wpisywanie rekordów ręcznie.