PO2017: Wejściówka na lab.8

Napisz program, który pobiera od użytkownika jego nick oraz niewielką liczbę naturalną. Umieść w kodzie asercję, która sprawdza czy liczba jest rzeczywiście naturalna. Następnie program przystępuje do testu zręczności użytkownika: losuje znak alfanumeryczny występujący na klawiaturze (nie losuje znaków interpunkcyjnych, matematycznych i pozostałych “symboli”) i wypisuje go w oknie konsoli, po czym oczekuje na naciśnięcie przez użytkownika klawisza odpowiadającego wypisanemu znakowi. Wtedy natychmiast wypisuje następny znak i ponownie czeka na reakcję użytkownika. Jeżeli użytkownik się pomylił, również natychmiast wypisuje następny znak. Program wykonuje test tyle razy, ile wynosiła pobrana liczba naturalna.

Po zakończeniu testu wyświetlany jest czas trwania testu (liczony od wypisania pierwszej litery aż do ostatniej odpowiedzi użytkownika) i liczba trafnych odpowiedzi. Do pomiaru czasu użyj funkcji timedifftime. Dodatkowo zostaje otwarty plik txt o nazwie takiej jak podany nick, tj. “nick.txt” i do niego w kolejnym wierszu są dopisywane uzyskane wyniki (czas i liczba trafień). Jeżeli takiego pliku jeszcze nie ma, program wypisuje w oknie konsoli komunikat o tym, że taki plik jest właśnie zakładany. W komunikacie podana jest pełna ścieżka do folderu, w którym plik zostanie utworzony wraz z jego nazwą. Hint: pełną ścieżkę do bieżącego folderu można pobrać z argv[0].

Każda akcja jest odnotowywana w pliku “log.txt”: pobranie nicka i liczby naturalnej, wypisanie litery na ekranie, odpowiedź użytkownika (wraz z informacją, czy była poprawna). Każdy wpis w pliku “log.txt” zaczyna się od daty i czasu dokonania wpisu z dokładnością do sekund. Następnie wypisywany jest komunikat o zdarzeniu. Plik “log.txt” należy otwierać tak, aby nie stracić jego dotychczasowej zawartości i aby nowe informacje były dołączane na końcu.

Uwagi:

  1. Zaproponuj własny sposób sprawdzenia, czy plik o podanej nazwie istnieje. Następnie napisz funkcję, która jako argument wywołania przyjmuje nazwę pliku, a zwraca wartość zero, jeżeli pliku nie ma, oraz 1 – jeżeli istnieje. Użyj tej funkcji do sprawdzenia, czy plik “nick.txt” istnieje.
  2. Do sprawdzania błędów związanych z dostępem do pliku “log.txt” wykorzystaj stałą errno, a do generowania komunikatów – funkcje strerrorperror. Wszelkie komunikaty o sytuacjach błędnych, jakie wystąpiły w trakcie pracy programu związane np. z dostępem do plików, wysyłaj do standardowego strumienia dla komunikatów o błędach stderr. Hint: aby wygenerować np. błąd 13 (brak prawa dostępu do pliku) wystarczy wcześniej otworzyć plik za pomocą edytora typu MS Word albo OpenOffice Writer i pozostawić otwartym. Wtedy próba otwarcia tego pliku w trybie “w”, “a” lub “a+” przez nasz program powinna zakończyć się niepowodzeniem.