Programowanie w języku C 2 - instrukcja do laboratorium nr 2
Autor: Mariusz Wiśniewski


  1. Informacje podstawowe o bibliotece CURSES
    Biblioteka curses umożliwia tworzenie programów korzystających z konsoli. Dzięki niej można tworzyć okienka i zarządzać nimi. Różne wersje biblioteki: ncurses (Linux), pdcurses (różne systemy).

    Korzystanie z biblioteki:
        #include <curses.h>

    Kompilowanie programów używających curses:
        gcc prog.c -o prog -lcurses

    Podstawowe struktury i stałe:
        WINDOW *okno; - Wskaźnik na strukturę WINDOW,
        LINES, COLS - Informacja o rozmiarze ekranu fizycznego (konsoli),
        WINDOW *stdscr; - Reprezentacja całego ekranu (zmienna predefiniowana).
    Początek ekranu znajduje się w punkcie (0,0) w lewym górnym rogu. Współrzędne rosną w prawo i w dół.

    Podstawowe funkcje biblioteki:
    initscr(); - inicjalizacja - funkcję należy uruchomić jako pierwszą,
    endwin(); - zakończenie działania biblioteki,
    okno = newwin(rozm_y, rozm_x, y, x); - tworzenie okna (zarezerwowanie obszaru w pamięci),
    delwin(okno); - zniszczenie okna (usunięcie z pamięci),
    wnoutrefresh(okno); - funkcja odwzorowuje obszar pamięci okna na ekranie wirtualnym,
    doupdate(); - funkcja wyświetla ekran wirtualny na ekranie fizycznym.

  2. Przykładowy program korzystający z biblioteki CURSES
    Poniższy program należy skompilować i uruchomić.

    #include <time.h>
    #include <curses.h>
    
    int current_getch;
    int doloop = 1;
    static WINDOW *mainwnd;
    static WINDOW *screen;
    WINDOW *my_win;
    
    int now_sec, now_min, now_hour, now_day, now_wday, now_month, now_year;
    time_t now;
    struct tm *now_tm;
    
    void screen_init(void)
    {
      mainwnd = initscr();
      noecho();
      cbreak();
      nodelay(mainwnd, TRUE);
      refresh();
      wrefresh(mainwnd);
      screen = newwin(13, 27, 1, 1);
      box(screen, ACS_VLINE, ACS_HLINE);
    }
    
    static void update_display(void)
    {
      curs_set(0);
      mvwprintw(screen,3,6,"TIME: %d:%d:%d", now_hour, now_min, now_sec);
      mvwprintw(screen,5,6,"DATE: %d-%d-%d", now_day, now_month, now_year);     
      mvwprintw(screen,7,6,"PRESS q TO END");
      wrefresh(screen);
      refresh();
    }
    
    void screen_end(void)
    {
      endwin();
    }
    
    void maketime(void)
    {
      now = time (NULL);
      now_tm = localtime(&now);
      now_sec = now_tm->tm_sec;
      now_min = now_tm->tm_min;
      now_hour = now_tm->tm_hour;
      now_day = now_tm->tm_mday;
      now_wday = now_tm->tm_wday;
      now_month = now_tm->tm_mon + 1;
      now_year = now_tm->tm_year + 1900;
    }
    
    int main(void)
    {
      screen_init();
      while (doloop)
      {
        current_getch = getch();
        if (current_getch == 113) doloop = 0;
        maketime();
        update_display();
        sleep(1);
      }
      screen_end();
      return 0;
    }
       

  3. Biblioteka CURSES - odczytywanie znaków z klawiatury
    Funkcje odczytujące znaki są zdefiniowane dla bierzącego okna lub dowolnego okna.

    Funkcje służące do odczytywania znaków z klawiatury:
    znak = getch(); - odczytanie znaku z klawiatury i umieszczenie go w miejscu kursora w bierzącym oknie,
    znak = mvgetch(y, x);   - odczytanie znaku z klawiatury i umieszczenie go w pozycji (y, x),
    znak = wgetch(w); - odczytanie znaku z klawiatury i umieszczenie go w miejscu kursora w oknie określonym przez w,
    echo(); - wywołanie funkcji spowoduje, że wprowadzane znaki będą widoczne,
    noecho(); - wywołanie funkcji spowoduje, że wprowadzane znaki NIE będą widoczne,
    nodelay(okno, 1); - powyższe wywołanie funkcji powoduje, że funkcja getch NIE oczekuje na znak,
    nodelay(okno, 0); - powyższe wywołanie funkcji powoduje, że funkcja getch oczekuje na znak (program jest wstrzymywany).

    Funkcje służące do wprowadzania ciągów znaków:
    getstr(char *buf) - funkcja wczytuje ciąg znaków,
    getnstr(char *buf, int n) - funkcja wczytuje co najwyżej n znaków,
    Powyższe funkcje występują w odmianach +mw i +w.

    Funkcje służące do formatowania tekstów:
    printw(...) - odmiana funkcji printf(), która działa w oknach,
    scanw(...) - odmiana funkcji scanf(), która działa w oknach,
    Powyższe funkcje występują w odmianach +mw i +w.

  4. Zadania do samodzielnego wykonania
    Każdy zespół wykonuje wszystkie zadania. Programy muszą korzystać z biblioteki CURSES.

    1. Wykonać program wyświetlający na ekranie okno o podanych z wiersza poleceń parametrach: wysokość i szerokość okna, położenie początkowe, obecnośc ramki (lub jej brak), tytuł okna.
      Program powinien kończyć działanie po naciśnieciu klawisza ESC.

    2. Wykonać program wyświetlający w oknie zawartość (fragment) pliku testowego. Program powinien kończyć działanie po naciśnieciu klawisza ESC.

    3. Wykonać program rysujący szachownice o zadanej ilości pól (pola muszą mieć szerokość i wysokość podawają jako parametr wywołania programu). Program powinien kończyć działanie po naciśnieciu klawisza ESC.

    4. Wykonać program umożliwiający grę w kółko i krzyżyk w oknie o rozmiarze i kolorach podawanych po uruchomieniu programu. Rozmiar okna nie powinien być mniejszy niż 10x10, program musi zapeniać ruch kursora za pomocą klawiszy strzałek. Wstawianie kółka lub krzyżyka ma odbywać się naprzemiennie (za pomocą klawisz x i o) - program powinien wskazywać który gracz wykonuje ruch i tylko temu graczowi umożliwiać wstawianie odpowiedniego znaków.