Uwaga: dziekanat zyczy sobie wystawienia ocen _przed_ 4 lutym 2002, a jak ktos nie zdazy, to nastepny termin jest 9 marca, i potem juz chyba nie mozna, w zwiazku z tym czas na zaliczenia jest dosc ograniczony!

I w zwiazku z tym informuje: bede bral pod uwage raczej to, co kto umie, niz to, na ile dopracuje program; trzeba raczej wiedziec, jak nalezaloby go dopracowac, zeby dzialal lepiej, niz miec to zrobione.

Co do samego C: w zasadzie wypadaloby go znac, ale jest sciagawka:
z jezyka, fragment z biblioteki, i innych wiadomosci; mozna tez ja sciagnac jako calosc w postaci tgz; bylo to pisane do TurboC, wiec nie wszystko jest aktualne - C na Linuxie nie ma 'bios.h', ani 'conio.h' (zamiast tego jest ncurses).

Zadania zaliczeniowe Programowanie II, 2001/2002.

 

  1. przerobic hh.c (lub hp.c) na serwer proxy:
     
  2. SMTP: prosty serwer odbierajacy poczte dla lokalnych uzytkownikow, lista uzytkownikow podana na pliku, jesli lista trzymana w pamieci, to na sygnal SIGHUP wczytywanie listy;
    Uwaga na rozpoznawanie i usuwanie kropek w tekstach listow!
    (linia zaczynajaca sie od kropki otrzymuje dodatkowa kropke na poczatku przy wysylaniu listu, usuwa sie ja przy odbieraniu)
     
  3. SMTP: klient do wysylania poczty z plikow (przeszukac katalog, sprawdzic pliki o nazwach wedlug wzorca, czy zawieraja list do wyslania, jesli tak, to polaczyc sie z serwerem SMTP i wyslac list) - wymyslec jaki ma byc format listu, lub uzyc formatu PMAIL-a: pierwsza linia $$adres_nadawcy, potem kolejne zawieraja adresy odbiorcow, potem pusta linia, potem zawartosc listu (to, co klient ma wyslac po DATA).
    Uwaga na kropki - to klient SMTP ma je dodac gdy sa potrzebne!
     
  4. SMTP: serwer posredniczacy w przesylaniu poczty - np. podobnie jak hh posredniczy w przesylaniu HTTP - zdefiniowy (np. parametr przy uruchamianiu programu) serwer do ktorego przesyla
     
  5. serwer czegos w stylu CHAT: wysyla kazdemu, kto jest z nim polaczony wszystko, co mu ktokolwiek wysle, z identyfikatorem tego, kto to wyslal (identyfikator: tekst); oprocz tego podaje informacje o dolaczeniu sie lub odlaczeniu dyskutantow; jesli mozliwe uzyskuje informacje o uzytkowniku z uslugi IDENT; ma obslugiwac wiele polaczen naraz - uzyc poll() albo select()
     
  6. klient do tego serwera: powinien wymagac podania: komputera i portu serwera, identyfikatora uzytkownika; proponuje, zeby tekst wpisywany przez uzytkownika pokazywac na gorze, a kiedy serwer cos przysle dopisywac to na dole (z przewijaniem ekranu) i ponownie wyswietlac tekst wprowadzany przez uzytkownika na gorze ekranu; tez potrzebny poll() lub select(), bo trzeba pokazywac na biezaco, co inni przyslali; wpisywany tekst moze byc poprawiany przez Ctrl-H (cofniecie kursora) i Backspace kasowanie znaku przed kursorem (to trzeba obslugiwac "recznie"); program waz.c pokazuje prosty sposob czytania z terminala bez czekania, i wyswietlania z adresowaniem ekranu
     
    (wskazane, zeby osoby robiace dwa powyzsze porozumiewaly sie ze soba, zeby wspolnie testowac, i razem zglosily sie do zaliczania)
     
  7. przerobic program waz.c na "zamkniecie sesji" - zeby sie konczyl po wpisaniu hasla; moze by tez cos ciekawszego wyswietlac? Uwaga: moze byc problem, jesli uzytkownik zapomni hasla i przerwie program przez 'kill' z innej konsoli - trzeba jakos wrocic do normalnych ustawien terminala - moze utworzyc dodatkowy proces, ktory wykryje, ze pierwszy sie skonczyl, i wtedy przywroci ustawienia?
     
  8. ten sam program mozna przerobic na gre "dlugi waz" - waz, ktory robi sie coraz dluzszy, i ktorym trzeba kierowac uwazajac, zeby nie zderzyc sie z nim samym lub z brzegiem ekranu, i zbierac punkty przez "zjadanie" cyferek, ktore od czasu do czasu sie pojawiaja na ekranie (i znikaja, jesli waz nie zdazy ich zjesc np. przez minute)
     
  9. lub przerobic na kilka wezy w roznych kolorach, zeby moglo grac kilka osob, weze oczywiscie rosna, i zderzenie konczy gre tego, ktory wpadnie na przeszkode; kierowanie najprosciej chyba bedzie zrobic dajac kazdemu graczowi dwa klawisze (skret w lewo/w prawo), na przyklad a/s, f/g, j/k i ;/' - a moze podawac klawisze w parametrach wywolania programu?
     
  10. inny pomysl na gre: "roboty" - przed ktorymi trzeba uciekac, bo jak zlapia, to sie przegrywa, ale gonia w glupi sposob, bo robia ruch w takim z osmiu kierunkow, zeby najbardziej zblizec sie do sciganego, nie sprawdzajac, czy tam na cos nie wpadna, a jak wpadna na siebie, to zostaje z nich kupa zlomu - jak ktorys potem na nia wpadnie, to tez zamienia sie w zlom - i w ten sposob mozna z nimi walczyc, uciekajac tak, zeby sie zderzaly; dodatkowo, mozna wcisnac 't', zeby wykonac "teleport" - przeniesc sie w losowe miejsce na ekranie - ryzykowne, ale jak nie bedzie innego wyjscia, to zawsze to jakas szansa
     
  11. choinka z edycja: zeby mozna bylo na ogladanej choince dodawac ozdoby (lub usuwac - np. spacja, lub przez Del); trzeba pamietac polozenie kursora, i ustawiac kursor po pokazaniu migniecia, i moze by wymyslec sposob na synchroniczne miganie kilku ozdob?
     
  12. synchronizacja czasu z innego komputera w sieci: majac program in_timed_client.c, ktory wypisuje roznice czasu lokalnego i odczytanego z serwera przez protokol 'time' zrobic program sprawdzajacy rzeczywista roznice z dokladnoscia do 0.01 sekundy, o ile nie utrudnia tego zbyt duze opoznienie (jest mozliwa jego ocena); unikac zapychania sieci duza iloscia zapytan; metoda polegac ma na tym, zeby pytac o czas wtedy, gdy da to jakas informacje; do odczekania uzyc poll(NULL,0,milisekundy); - jesli komputer nie jest za bardzo obciazony, to tym mozna trafic w zaplanowany czas z dokladnoscia do 0.01 sekundy.
    Wskazowka: jesli czas lokalny przed odczytem czasu z serwera jest tl0, a po odczycie czasu z serwera rownym tr jest tl1, to roznica czasu (czas lokalny - czas serwera) jest pomiedzy tl0-tr-1 a tl1-tr - pierwszy odczyt daje ponad sekunde nieoznaczonosci, ale teraz mozna wybrac czas nastepnego odczytu tak, by jednej z wartosci, jakie moga wyjsc odpowiadala mniej niz polowa tej sekundym a drugiej - wiecej niz polowa; przy odrobinie szczescia po siedmiu probach dokladnosc osiagnie 0.01 sekundy.
    Uwaga: program dziala tylko w sieci lokalnej - jak to zmienic?
     
  13. program pokazujacy zegar z innego komputera (nazwe podaje sie przy wywolaniu, do sciagania czasu mozna uzyc in_timed_client.c) w trybie tekstowym, ale: albo duze cyfry skladane z segmentow, albo wskazowki; do wypisywania na ekran uzyc fragmentow z programu choinka.c.
      
  14. gra na refleks, wykorzystujaca komunikacje przez semafory: komputer losuje czas, w ktorym cos sie zmieni na ekranie, kto pierwszy wcisnie Enter, otrzymuje punkt; oczywiscie trzeba wykrywac falstart - wcisniecie Enter przed sygnalem; potrzeba do tego kilku semaforow: licznik graczy, sygnalizator startu (zwiekszany o ilosc graczy), sygnalizator wcisniecia Enter (zmniejszany w chwili wcisniecia); zeby to dzialalo, trzeba zeby wszyscy gracze byli zalogowani na tym samym serwerze.
    Przyklad wykorzystania semafora: program sem.c
     
  15. zadanie dla fizyka: wyniki eksperymentu zostaly zapisane przez program w Fortranie przy uzyciu WRITE nieformatowanego, pierwszy rekord opisujacy eksperyment nawiera po kolei: date (integer*4, 0 = 1 styczen 1900) i czas (integer*4, milisekundy od polnocy) rozpoczecia eksperymentu, tytul (20 liczb integer*4 zawierajacych tekst przeczytany formatem 20A4); nastepne zawieraja dane odczytane z detektorow, i kazdy z nich zawiera po kolei:
    1. czas od poczatku eksperymentu (integer*4, w milisekundach),
    2. ilosc detektorow, z ktorych przyszly jakies sygnaly,
    3. dane - ta ilosc razy:
      1. numer detektora (integer*2)
      2. maksywalna wartosc impulsu z detektora (real*4)
      3. wartosc calki z impulsu z detektora (real*4)
    4. czas martwy ukladu odczytu (integer*4, w mikrosekundach),
    i na koncu jest rekord z iloscia odczytow 0, podajacy czas trwania eksperymentu, jego "czas martwy" mozna zignorowac; trzeba to przeczytac, wybrac z tego dane do dalszego przetwarzania, i zapisac w postaci, ktora moglby przeczytac program napisany w jakims mniej "egzotycznym" jezyku, na przyklad w C - najlepiej jako tekst w postaci rowno ulozonej tabelki, mogloby to wygladac na przyklad tak:
    	tytul bardzo waznego eksperymentu
    	Data: nnnnnnnnn dd-mm-yyyy
    	Czas: nnnnnnnnn hh:mm:ss.sss
    	Rekord 0000001 czas nnnnnnnnn hh:mm:ss.sss, danych nn, wybrano nn
    	nn nnnnnnn.nnnn nnnnnnnn.nnnn  nn nnnnnnn.nnnn nnnnnnnn.nnnn
    	nn nnnnnnn.nnnn nnnnnnnn.nnnn  nn nnnnnnn.nnnn nnnnnnnn.nnnn
    Dodatkowo nalezy wypisac na koncu pare danych "statystycznych": calkowity czas trwania eksperymentu, laczny czas martwy i aktywny, ilosc sygnalow ze wszystkich detektorow, ilosc sygnalow z tych rekordow, ktore zostaly wybrane, ilosc sygnalow pokazanych w wybranych rekordach. Wybieranie ma polegac na wybraniu tych rekordow, dla ktorych byl sygnal z choc jednego detektora z podanej listy (czytac ja ze standardowego wejscia), i danych tylko dla tych detektorow (moze lepiej nie probowac bardziej zaawansowanych wyborow, ktore fizykowi sie przydaja, jak wymog, by z jakiejs grupy detektorow co najmniej N dalo sygnal, albo by bylo N grup, w ktorych jakis detektor dal sygnal, lub by sygnaly z jakichs detektorow zabranialy wybrania danego rekordu - moze to byloby blizsze temu, co sie naprawde robi, ale za trudne).
     

Jerzy Tarasiuk