Biologie | Chimie | Didactica | Fizica | Geografie | Informatica | |
Istorie | Literatura | Matematica | Psihologie |
UNIVERSITATEA DE VEST TIMISOARA
FACULTATEA DE MATEMATICA SI INFORMATICA
Centru de testare offline
Descrierea designului aplicatiei
1. Introducere
1.1. Tinta documentului
Acest document furnizeaza detaliile de design ale aplicatiei de testare offline. Publicul tinta sunt studentii Facultatii de Informatica din cadrul Universitatii de Vest Timisoara.
1.2. Abrevieri
CLI - Command Line Interface
GUI - Graphical User Interface
2. Arhitectura aplicatiei
vezi pag urmatoare
2.1. Server-ul
2.1.1. Nume
server
2.1.2. Tip
program C
2.1.3. Descriere
Aplicatia principala care primeste conexiuni de la diferiti clienti si rezolva cererile acestora prin intermediul comunicatiei cu o baza de date MySQL. Intotdeauna le returneaza un raspuns.
2.1.4. Functii
sigHandler
descriere: handler pentru semnale. Gestioneaza semnalele primite si
scrie in fisierul de log interpretarea semnalelor primite
parametri: numarul semnalului primit
returneaza: nimic
recvtimeout
descriere: functia care citeste datele trimise de clienti, insa nu asteapta mai mult de un anumit interval de timp
parametri: descriptorul de socket, un pointer la un sir de caractere in care se va depune informatia citita, numarul maxim de caractere ce se doresc a fi citite si timpul de asteptare (in secunde)
returneaza: un numar pozitiv - in caz de succes (numarul de caractere
citite efectiv)
2 - in cazul in care clientul nu a trimis nimic in intervalul
precizat
- 1 - in cazul in care apare o eroare
scrieLog
descriere: scrie un mesaj in fisierul de log
parametri: mesajul de adaugat in fisierul de log
returneaza: void
transformaComanda
descriere: transforma comanda primita de la client (un sir de caractere) intr-un numar (pentru a fi folosit dupa aceea intr-un switch)
parametri: mesajul primit de la client
returneaza: - 1 in cazul in care primeste o comanda necunoscuta
un numar pozitiv (reprezantand tipul comenzii) in rest
stergeNewlineDinCoada
descriere: sterge caracterul de newline de la sfarsitul unei comenzi daca exista (pentru a putea folosi si telnet-ul pe post de client)
parametri: un sir de caractere
returneaza: acelasi sir de carectere (fara caracterul de rand nou de la sfarsit, daca a existat)
citesteSubiectul
descriere: citeste mesajul primit de la clientul "profesor" care contine domeniul, tipul, gradul de dificultate, raspunsul (daca e cazul) si enuntul subiectului ce se doreste adaugat in baza de date, il valideaza si daca este ok va adauga acel subiect in baza de date
parametri: mesajul primit, un pointer la un sir de caractere care reprezinta mesajul ce va fi returnat clientului (care va fi codul subiectului nou introdus in caz de succes) si un pointer la un sir de caractere ce reprezinta mesajul care se va scrie in fisierul de log
returneaza: 0 daca a reusit introducerea subiectului in baza de date
un numar pozitiv in caz de esec (care depinde de tipul de esec)
schimbaStatusulSubiectului
descriere: citeste mesajul primit de la clientul "profesor" care contine dorinta de "activare" sau "dezactivare" a subiectului, precum si codul subiectului de modificat, il valideaza si daca este ok va incerca schimabarea status-ului subiectului respectiv
parametri: mesajul primit, un pointer la un sir de caractere care reprezinta mesajul ce va fi returnat clientului si un pointer la un sir de caractere ce reprezinta mesajul care se va scrie in fisierul de log
returneaza:
0 daca a reusit schimbarea statusului subiectului in baza de date
un numar pozitiv in caz de esec (care depinde de tipul de esec)
daTest
descriere: citeste mesajul primit de la clientul "elev" care contine domeniul dorit pentru test, si numele "elevului", il vlideaza, iar daca este ok cauta in baza de date daca gaseste un test nerezolvat pe domeniul respectiv si numele respectiv, daca il gaseste il trimite pe ala, daca nu, construieste un test care va contine urmatoarele tipuri de subiecte:
2 intrebari usoare de tip grila
2 intrebari de grad mediu de dificultate de tip grila
2 intrebari mai grele de tip grila
o intrebare usoara cu raspuns
(raspunsul va fi un numar real)
o intrebare cu grad mediu de dificultate cu raspuns (raspunsul va fi un program)
o intrebare mai dificila cu raspuns
(raspunsul va fi de asemenea un program)
Domeniul poate fi C sau Java.
Intrebarile se vor alege aleator din baza de date.
parametri: mesajul primit, un pointer la un sir de caractere care reprezinta mesajul ce va fi returnat clientului (care va fi chiar testul in caz de succes) si un pointer la un sir de caractere ce reprezinta mesajul care se va scrie in fisierul de log
returneaza: 0 daca a reusit citirea (construirea) si trimiterea testului
un numar pozitiv in caz de esec (care depinde de tipul de esec)
citesteRezolvarea
descriere: citeste mesajul primit de la clientul "elev" care contine numarul testului, numele "elevului" si rezolvarile la fiecare subiect, il valideaza, iar daca este ok cauta in baza de date raspunsurile corecte la primele 7 subiecte determina punctajul obtinut de "elev", introduce in baza de date raspunsurile "elevului" si punctajul obtinut de acesta la fiecare subiect in parte (chiar si la subiectele 8 sau 9 daca nu a primit rezolvare la acestea, iar in cazul in care nu a primit rezolvare la niciunul din subiectele 8 si 9 ii calculeaza direct nota finala)
parametri: mesajul primit, un pointer la un sir de caractere care reprezinta mesajul ce va fi returnat clientului (care, in caz de succes va contine raspunsurile corecte la primele 7 subiecte, raspunsurile date de "elev" precum si punctajul obinut la fiecare dintre acestea, chiar mai mult, daca nu exista rezolvare la subiectele 8 sau 9 i se da da direct punctajul (0) pe acestea, precum si nota obtinuta pana in prezent, care poate sa fie definitiva daca nu exista rezolvare la nici unul din subiectele 8 si 9 sau partiala in caz contrar) si un pointer la un sir de caractere ce reprezinta mesajul care se va scrie in fisierul de log
returneaza: 0 daca a reusit citirea rezolvarii si acordare punctajelor
un numar pozitiv in caz de esec (care depinde de tipul de esec)
trimiteRezolvarea
descriere: cauta in baza de date daca exista un test care are rezolvare la subiectele 8 si/sau 9
parametri: un pointer la un sir de caractere care reprezinta mesajul ce va fi returnat clientului (care, in caz de succes va contine enuntul si rezolvarea problemei (problemelor) pentru care exista rezolvare si un pointer la un sir de caractere ce reprezinta mesajul care se va scrie in fisierul de log
returneaza: 0 daca a reusit comunicarea cu baza de date (se poate sa nu existe o astfel de rezolvare)
un numar pozitiv in caz de esec (care depinde de tipul de esec)
citestePunctajele
descriere: citeste mesajul primit de la clientul "profesor" care contine numarul testului, numele elevului (pentru securitate), si punctajul obtinut de acesta pentru subiectele 8 si/sau 9, il valideaza si daca este ok va testa prin intermediul bazei de date daca nu exista punctajul pe un subiect primit, sau, din contra, nu a primit puncajul pentru un subiect care nu are punctaj, iar daca este ok va introduce punctajele in baza de date si va calcula nota finala
parametri: mesajul primit, un pointer la un sir de caractere care reprezinta mesajul ce va fi returnat clientului (care, in caz de succes va fi "ok" si un pointer la un sir de caractere ce reprezinta mesajul care se va scrie in fisierul de log
returneaza: 0 daca a reusit acordarea notei finale
un numar pozitiv in caz de esec (care depinde de tipul de esec)
trimiteNota
descriere: citeste mesajul primit de la clientul "elev" care contine numarul testului si numele "elevului" (pentru securitate) iar daca este ok cauta in baza de date testul cu datele respective, care poate sau nu sa aiba nota finala
parametri: mesajul primit, un pointer la un sir de caractere care reprezinta mesajul ce va fi returnat clientului (care, in caz de succes va fi "NU" daca nu este calculata inca nota finala, sau nota, daca aceasta a fost calculata si un pointer la un sir de caractere ce reprezinta mesajul care se va scrie in fisierul de log
returneaza: 0 in caz de succes
un numar pozitiv in caz de esec (care depinde de tipul de esec)
main
descriere: deschide un socket si asteapta o noua conexiune. Cand apare o conexiune, preda sarcina comunicarii cu clientul unui proces copil dupa care revine la asteptarea unei noi conexiuni.
parametri: numele si parola (daca exista) a unui utilizator al bazei de date
returneaza: 0 in caz de succes
un numar pozitiv in caz de eroare (care depinde de tipul de eroare)
2.2. Administratorul de server
2.2.1. Nume
Administrator de server
2.2.2. Tip
program C
2.2.3. Descriere
Aplicatia care lanseaza serverul in executie si il controleaza.
2.2.4. Functii
main
descriere: implementeaza o interfata prietenoasa cu utilizatorul prin care acesta poate controla serverul.
parametri: nu exista
returneaza: 0 in caz de succes
un numar pozitiv in caz de eroare (care depinde de tipul de eroare)
2.3. Clientul "profesor"
2.2.1. Nume
client "profesor"
2.2.2. Tip
program C
2.2.3. Descriere
Aplicatia care se conecteaza la server si poate introduce subiecte noi in baza de date, schimba status-ul unui subiect deja existent in baza de date, cere spre corectare rezolvari de teste (subiectele 8 si 9) si trimite punctajul acestora
2.2.4. Functii
readquestion
descriere: citeste o intrebare de la tastatura
parametri: un vector de caractere in care se va pune intrebarea pe care o citesc de la tastaura si o lungime de tipul int care reprezinta lungimea intrebarii
returneaza: nimic
void conection(void);
descriere: realizeaza conexiunea la server
parametri: nu exista
returneaza: nimic
caz_intai
descriere: adauga un subiect in baza de date
parametri: nici unul
returneaza: nimic
caz_doi
descriere: schimba statusul unui subiect, adica activeaza sau dezactiveaza un subiect din baza de date
parametri: nici unul
returneaza: nimic
caz_trei
descriere: emite o cerere de corectare a unei rezolvari a unui test
parametri: nici unul
returneaza: nimic
caz_patru
descriere: trimite corectarea rezolvarii unui test (punctajele obtinute)
parametri: nici unul
returneaza: nimic
raspuns1
descriere: traduce raspunsul primit de la server in urma cererii de adaugare a unui nou subiect in baza de date
parametri: nici unul
returneaza: nimic
raspuns2
descriere: traduce raspunsul primit de la server in urma cererii de schimbare a statusului unui subiect in baza de date
parametri: nici unul
returneaza: nimic
raspuns3
descriere: traduce raspunsul primit de la server in urma cererii de corectare a unei rezolvari
parametri: nici unul
returneaza: nimic
raspuns4
descriere: traduce raspunsul primit de la server in urma cererii de trimitere a punctajelor obtinute
parametri: nici unul
returneaza: nimic
main
descriere: implementeaza o interfata pritenoasa cu utilizatorul prin care acesta isi poate exprima o anumita dorinta.
parametri: IP -ul calculatorului pe care ruleaza serverul si portul de acces
returneaza:
2.4. Clientul "elev" - Unix local
. in curs de definitivare .
2.5. Clientul "elev" - Unix remote
. in curs de definitivare .
2.6. Clientul "elev" - Windows (remote)
. in curs de definitivare .
3. Utilizare
Toate programele au interfete grafice prietenoase utilizatorului, prin care acesta poate realiza operatiunea dorita.
4. Protocolul de comunicare
OBSERVATIE FOARTE IMPORTANTA
Peste tot in cele ce urmeaza vom considera comenzile schimbate intre server si clienti cu apostrof
(pentru lizibilitate)
NU se folosesc apostrofurile pentru comenzi
4.1. Clientul "profesor" adauga un subiect in baza de date
Clientul trimite: 'AS' (Adauga Subiect)
Serverul trimite: 'ts' (Trimiteti Subiectul)
si se asteapta sa primeasca inapoi un sir de caractere construit astfel:
- primul caracter este 'C' sau 'J' (corespunzator limbajelor de programare C respectiv Java)
- al doilea caracter: 'G' sau 'R' (subiectul este Grila sau cu Raspuns)
- al treilea caracter: 'U', 'M' sau 'G' (corespunzator nivelului de dificultate
Usor, Mediu sau Greu)
- al patrulea caracter: '*'
-> daca este vorba de un subiect grila urmeaza raspunsul (o litera mica)
apoi '*'
-> daca este vorba de un subiect cu raspuns si usor ca nivel de dificultate
urmeaza: - o cifra care precizeaza cate cifre are partea intreaga
- o cifra care precizeaza cate cifre are partea zecimala
- o cifra care nu poate sa fie decat 0 sau 1 cu urmatoarea semnificatie
0 daca numarul care urmeaza este pozitiv
1 daca numarul care urmeaza este negativ (iar semnul '-' nu se foloseste)
- '*'
- raspunsul (de forma aaaa.bb - nu neaparat atatea cifre
sau aaaa daca partea numarul de cifre a partii zecimale este 0)
iar prima cifra poate sa fie si '-' daca numarul e negativ
- '*'
- textul subiectului
- '##' la sfarsit, pentru a fi siguri ca am primit tot mesajul de la client
ex: CGM*a*enunt_subiect##
JRU*320*234.12*enunt_subiect## //in acest caz raspunsul este 234.12
CRU*321*234.12*enunt_subiect## //in acest caz raspunsul este -234.12
CRU*200*11*enunt_subiect## //in acest caz raspunsul este 11
JRU*301*321*enunt_subiect## //in acest caz raspunsul este -321
JRM*enunt_subiect##
CRG*enunt_subiect##
OBS:textul subiectului trebuie sa fie in format de printf (adica 'n' unde trebuie un rand nou,
't' pentru tab, etc), si sa nu aiba mai mult de 2000 de caractere (asta se mai poate modifica
pe parcurs, daca e nevoie)
Raspunsurile serverului:
Daca totul decurge bine serverul returneaza 6 caractere care reprezinta codul subiectului in baza
de date (de ex: CRM005 sau JGU012)
daca nu, astea sunt raspunsurile sale:
- 'nl' = nu avem '##' la sfarsitul mesajului
- 'pc' = primul caracter din mesaj nu este 'C' sau 'J'
- 'dc' = al doilea caracter ce compune mesajul nu este 'G' sau 'R'
- 'tc' = al treilea caracter ce compune mesajul nu este 'U', 'M' sau 'G'
- '4*' = al patrulea caracter ce compune mesajul nu este '*' (idem pt alte nr)
- 'n*' = pentru subiect cu raspuns, usor, nu gasim '*' dupa rezultat
- 'rg' = al cincilea caracter ce compune mesajul nu este raspunsul la grila
- 'pi' = al cincilea car ce compune mesajul nu este nr de cifre a partii intregi
- 'pz' = al saselea car ce compune mesajul nu este nr de cifre a partii zecimale
- 'nn' = al saptelea car ce compune mesajul nu este '0' sau '1'
- 'n.' = pentru subiect cu raspuns, usor, nu gasim '.' dupa cifrele de la partea intreaga
a rezultatului
- 'ne' = numarul de caractere al enuntului este mai mic de 10
(acestea n-ar trebui sa apara daca clientul este bine construit)
- 'ms' = probleme cu MySQL, reveniti mai tarziu
- 'fl' = deja sunt 999 de subiecte de acest gen baza de date. Nu mai pot fi adaugate altele.
4.2. Clientul "profesor" doreste ca un subiect sa nu mai fomeze teste (sa il 'dezactiveze') sau reciproc, daca e 'dezactivat' sa il 'activeze'
Clientul trimite: 'SS' (Schimba Status)
Serverul trimite: 'ct' (Codul Testului)
si se asteapta sa primeasca inapoi un sir de caractere construit astfel:
- primul caracter este '1' (activare) sau '0' (dezactivare)
- urmatoarele 6 caractere reprezinta codul subiectului in baza de date
- primul caracter 'C' sau 'J' (domeniul: C, Java)
- urmatorul caracter 'G' sau 'R' (tipul: Grila, cu Raspuns)
- urmatorul caracter 'U', 'M' sau 'G' (gradul de dificultate: Usor, Mediu, Greu
- inca 3 cifre
OBS: dezactivarea unui subiect presupune ca acel subiect nu va mai intra in componenta niciunui
test construit ulterior, insa un subiect nu poate fi sters fizic din baza de date, deoarece in
baza de date testele nu contin enunturile subiectelor, ci doar referinte la acestea. De aceea
daca acel subiect a intrat in componenta a cel putin unui test, n-ar trebui sters
Raspunsurile serverului:
- 'nl' = lungimea codului trimis nu are 7 caractere
- 'pc' = primul caracter din mesaj nu este '0' sau '1'
- 'dc' = al doilea caracter ce compune mesajul nu este 'C' sau 'J'
- 'tc' = al treilea caracter ce compune mesajul nu este 'G' sau 'R'
- 'pc' = al patrulea caracter ce compune mesajul nu este 'U', 'M' sau 'G'
- 'cc' = al cincilea caracter ce compune mesajul nu este o cifra
- 'sc' = al saselea caracter ce compune mesajul nu este o cifra
- 'uc' = al saptelea (ultimul) caracter ce compune mesajul nu este o cifra
(acestea n-ar trebui sa apara daca clientul este bine construit)
- 'ms' = probleme cu MySQL, reveniti mai tarziu
- 'ne' = subiectul cu codul respectiv nu exista in baza de date
- 'ee' = subiectul exista in baza de date, dar deja este activat (dazactivat)
- 'es' = subiectul exista in baza de date si a i-a fost schimat statusul (ok)
4.3. Clientul "profesor" doreste sa corecteze rezolvarea unui test
Clientul trimite: 'CR' (Cer Rezolvarea unui test pentru corectare)
Serverul cauta in baza de date un test care are rezolvarea la cel putin unul din subiectele
8 sau 9, dar nu are punctajul.
Daca nu gaseste un astfel de test, trimite 'NU'
Daca il gaseste, trimite un mesaj construit astfel:
nr_test*autor_test*msg##
unde nr_test - numarul testului in baza de date
autor_test - numele elevului (pentru verificare, la inapoierea punctajului)
msg - reprezinta un sir de caractere ce contine enuntul subiectului/subiectelor
precum si rezolvarea acestuia/acestora. Daca lipseste o rezolvare, nici enuntul
acesteia nu va mai fi. Va fi preformatat, astfel incat nu trebuie decat afisat
(dar poate avea lungimea pana in 44 000 de caractere!).
Evident ca daca sunt probleme cu conexiunea la baza de date serverul trimite mesajul 'ms'
4.4. Clientul "profesor" doreste sa trimita punctajul/punctajele obtinute in urma corectarii
Clientul trimite: 'TR' (Trimit punctajele obtinute pentru o anumita Rezolvare)
Serverul trimite: 'tp' (Trimite Punctajele)
si se asteapta sa primeasca inapoi un sir de caractere construit astfel:
numar_test*autor*8*punctaj_sub8*9*punctaj_sub9## (daca a avut de corectat ambele subiecte)
numar_test*autor*8*punctaj_sub8## (daca a avut de corectat numai subiectul 8)
numar_test*autor*9*punctaj_sub9## (daca a avut de corectat numai subiectul 9)
unde numar_test - numarul testului in baza de date
autor - numele 'elevului'
(ambele informatii sunt furnizate in momentul trimiterii rezolvarii)
punctaj - punctajul obtinut la subiectul respectiv. Poate fi 0, 1 sau un numar subunitar
cu maxim 2 zecimale (0.25, 0.33, 0.5 etc)
Raspunsurile serverului:
- 'nl' = nu gasim '##' la sfarsitul mesajului
- 'pc' = primul caracter din mesaj nu este o cifra
- 'tl' = numarul testului are mai mult de 9 cifre (este prea lung)
- '1*' = dupa numarul testului nu urmeaza '*'
- 'nL' = numele 'elevului' are mai mult de 15 caractere
- 'nn' = nu exista numele 'elevului'
- '2*' = dupa numele 'elevului' nu urmeaza '*'
- 'ns' = numarul unui subiect lipseste (sau nu este unde ar trebui)
- '3*' = al treilea '*' nu se gaseste la locul sau
- '8p' = primul caracter al punctajului de la subiectul 8 nu este '0' sau '1'
- '8.' = punctajul la subiectul 8 este de forma '0.' dar nu urmeaza o cifra dupa
- '4*' = al patrulea '*' nu se gaseste la locul sau (adica ne asteptam sa gasim
punctajul ambelor subiecte)
- '5*' = al cincilea '*' nu se gaseste la locul sau (la al doilea subiect (9))
- '9p' = primul caracter al punctajului de la subiectul 9 nu este '0' sau '1'
- '9.' = punctajul la subiectul 9 este de forma '0.' dar nu urmeaza o cifra dupa
- 'n#' = dupa punctajul subiectului 9 nu urmeaza '#'
- 'pl' = avem caractere in plus la sfarsitul mesajului
- 'tn' = testul cu codul precizat nu exista in baza de date
- 'nt' = testul exista in baza de date, dar e pe alt nume :D
- '8e' = testul exista in baza de date, numele e bun, dar deja are punctajul la subiectul 8
- '9e' = testul exista in baza de date, numele e bun, dar deja are punctajul la subiectul 9
- 'n8' = nu ati transmis punctajul la sub 8 (si nu exista in baza de date)
- 'n9' = nu ati transmis punctajul la sub 9 (si nu exista in baza de date)
(toate aceste cazuri n-ar trebui sa apara daca clientul este bine implementat)
- 'ms' = probleme cu MySQL, reveniti mai tarziu
- 'ok' = notele sunt bune, a fost finalizat testul.
4.5. Clientul "elev" solicita un test
Clientul trimite: 'ct' (Cer Test)
Serverul trimite: 'dn' (Domeniul si Numele)
si se asteapta sa primeasca inapoi un sir de caractere construit astfel:
- primul caracter este 'C' sau 'J' (corespunzatoare domeniului),
- apoi '*',
- apoi cel mult 15 litere mici(numele)
- la sfarsit '##'
ex: 'C*popescu##'
In acest moment serverul cauta daca nu are deja construit un test pentru acel nume,
caruia nu i-a primit inca rezolvarea. Daca gaseste un astfel de test atunci il trimite pe ala,
daca nu, construieste unul luand la intamplare 2 subiecte GU, 2 GM, 2 GG, 1 RU, 1 RM, 1RG.
Raspunsurile serverului:
- 'nl' = nu gasim '##' la sfarsitul mesajului
- 'nd' = nu-i bun domeniul (primul caracter din mesaj nu este 'C' sau 'J')
- 'n*' = al doilea caracter ce compune mesajul nu este '*'
- 'pl' = numele este prea lung (are mai mult de 15 caractere)
- 'nm' = o litera din nume nu e litera mica
(acestea n-ar trebui sa apara daca clientul este bine construit)
- 'ms' = probleme cu MySQL, reveniti mai tarziu
- 'np' = nu putem construi un test pe acest domeniu (in baza de date nu sunt suficiente
subiecte din domeniul repectiv pt a face un test)
- '*nr_testntest##' in caz de succes
unde: nr_test = nr testului din baza de date
test = enuntul testului (pana in 20 000 caractere)
4.6. Clientul "elev" trimite rezolvarea unui test
Clientul trimite: 'tt' (doresc sa Trimit rezolvarea unui Test)
Serverul trimite: 'at' (Astept rezolvarea Testului)
si se asteapta sa primeasca inapoi un sir de caractere construit astfel:
nr_test*rrrrrr*rasp_7*nr_caract_rez8*rez_8*nr_caract_rez9*rez_9*nume##
unde: nr_test = numarul testului
r = litera mica reprezentand raspunsul la intrebarea a cata litera e 'r'
rasp_7 = raspunsul la subiectul nr 7 (un nr real)
nr_caract_rez8 = cate caractere contine rezolvarea subiectului 8 (poate fi si 0 in
cazul in care cel ce a rezolvat testul nu a facut nimic la sub 8)
rez_8 = rezolvarea la subiectul nr 8 (un program)
nr_caract_rez9 = idem cu nr_caract_rez8
rez_9 = idem cu rez_8
nume = trebuie sa fie identic cu numele dat in momentul cererii testului
ex: 23*abbdac*-1.23*7548*un-text-care-are-7548-de-caractere*0**popescu##
(in acest caz lipseste raspunsul la intrebarea nr 9)
OBS: clientul trebuie sa se asigure ca
nr_test <= 999 999 999
rasp_7 nu are peste 9 cifre nici la partea intreaga, nici la cea zecimala
rez_8 si rez_9 au fiecare sub 20 000 de caractere
nu are voie sa lipseasca nici un raspuns (daca cel care a rezolvat testul nu a dat raspunsul
la un subiect, va fi completat automat cu 'x' (fara apostrof), exceptand raspunsurile la
subiectele 8 si 9 unde un raspuns lipsa va fi marcat prin 0 ca nr de caractere)
numele trebuie sa fie identic cu numele dat in momentul cererii testului
(un mesaj de eroare va fi emis in caz contrar)
Raspunsurile serverului:
- 'nl' = ultimele 2 caractere citite nu sunt '##'
- 'pc' = primul caracter din mesaj nu este cifra
- 'tl' = numarul testului are mai mult de 9 cifre (este prea lung)
- '1*' = dupa numarul testului nu urmeaza '*'
- '1i' = raspunsul la primul subiect nu e litera mica
- '2i' = raspunsul la al doilea subiect nu e litera mica
- '3i' = raspunsul la al treilea subiect nu e litera mica
- '4i' = raspunsul la al patrulea subiect nu e litera mica
- '5i' = raspunsul la al cincilea subiect nu e litera mica
- '6i' = raspunsul la al saselea subiect nu e litera mica
- '2*' = dupa raspunsurile la primele 6 subiecte nu urmeaza '*'
- '7p' = primul caracter de la raspunsul pt sub 7 nu e cifra sau '-' (sau x)
- '7n' = raspunsul la sub 7 incepe cu '-' dar urm caracter nu e o cifra
- '7L' = raspunsul la sub 7 are peste 9 cifre la partea intreaga
- '7.' = raspunsul la sub 7 are si parte zecimala, dar dupa . nu urmeaza o cifra
- '7l' = raspunsul la sub 7 are peste 9 cifre la partea zecimala
- '3*' = dupa raspunsul la subiectul 7 nu urmeaza '*'
- '8p' = caracterul unde ar trebui sa inceapa cate cifre are rez subiectului 8 nu e cifra
- '8L' = numarul de caractere al rezolvarii subiectului 8 este cel putin 20 000
- '4*' = dupa numarul de caractere de la rezolvarea subiectului 8 nu urmeaza '*'
- '8e' = nu avem suficiente caractere in mesaj pentru a gasi rez subiectului 8 ! !!!
- '5*' = dupa rezolvarea subiectului 8 nu urmeaza '*'
- '9p' = caracterul unde ar trebui sa inceapa cate cifre are rez subiectului 9 nu e cifra
- '9L' = numarul de caractere al rezolvarii subiectului 9 este cel putin 20 000
- '6*' = dupa numarul de caractere de la rezolvarea subiectului 9 nu urmeaza '*'
- '9e' = nu avem suficiente caractere in mesaj pentru a gasi rez subiectului 9 ! !!!
- '7*' = dupa rezolvarea subiectului 9 nu urmeaza '*'
- 'nL' = numele 'elevului' are mai mult de 15 caractere
- 'nn' = nu exista numele 'elevului'
- 'ng' = numele este gresit (contine si alte caractere in afara de litere mici)
- 'nt' = testul exista in baza de date, dar e pe alt nume :D
- 'rt' = testul exista in baza de date, numele e bun, dar deja e rezolvat
- 'tn' = testul cu codul precizat nu exista in baza de date
(toate aceste cazuri n-ar trebui sa apara daca clientul este bine implementat)
- 'ms' = probleme cu MySQL, reveniti mai tarziu
In cazul in care totul este ok, serverul trimite clientului un mesaj, care afisat apare cam asa:
Var cor Var dvs Punctaj
1) d a 0
2) b b 1
3) c c 1
4) a b 0
5) c c 1
6) d d 1
?
0
Oficiu 1
TOTAL (partial): 6
Trebuie sa precizam ca daca 'elevul' nu scrie nimic la rezolvarea subiectelor 8 sau 9 deja i se
poate da punctajul (adica 0), rezolvarea subiectului respectiv nemaiavand nevoie sa fie corectata
de profesor :D. In exemplul de mai sus 'elevul' nu a rezolvat decat subiectul 8 (de aceea acolo
apare '?' ca punctaj, deoarece rezolvarea respectiva urmeaza sa fie corectata) iar pentru ca nu
a scris nimic la subiectul 9 primeste direct punctajul (0) pe acel subiect. In cazul in care
'elevul' nu rezolva niciunul din subiectele 8 si 9 primeste direct punctajul 0 pe acele subiecte,
iar la sfarsit o sa scrie: 'TOTAL (final):'
4.7. Clientul "elev" doreste sa stie daca i-a fost corectat testul (problemele 8 si 9)
Clientul trimite: 'nt' (vreau Nota unui Test)
Serverul trimite: 'cn' (Codul si Numele)
si se asteapta sa primeasca inapoi un sir de caractere construit astfel:
numar_test*autor##
unde numar_test - numarul testului in baza de date
autor - numele 'elevului' (ca o minima securitate)
(ambele informatii sunt furnizate in momentul trimiterii testului)
Raspunsurile serverului:
- 'nl' = nu gasim '##' la sfarsitul mesajului
- 'pc' = primul caracter din mesaj nu este o cifra
- 'tl' = numarul testului are mai mult de 9 cifre (este prea lung)
- 'n*' = dupa numarul testului nu urmeaza '*'
- 'nL' = numele 'elevului' are mai mult de 15 caractere
- 'nn' = nu exista numele 'elevului'
- 'n*' = dupa numele 'elevului' nu urmeaza '#'
- 'pl' = mesajul primit este prea lung (in sensul ca mai avem caractere la sfarsit)
- 'tn' = testul cu codul precizat nu exista in baza de date
- 'nt' = testul exista in baza de date, dar e pe alt nume :D
(toate aceste cazuri n-ar trebui sa apara daca clientul este bine implementat)
- 'ms' = probleme cu MySQL, reveniti mai tarziu
- 'NU' = testul nu este inca corectat
in caz de succes, serverul trimite un sir de caractere preformatat, care, afisat arata astfel:
4*mosmartin
1
0
1
1
1
0
1
0.25
0
Oficiu: 1
Nota: 6.25
(numarul testului, numele autorului, punctajele pe fiecare subiect in parte si nota finala)
5. Bibliografie
- Beej's Guide to Network Programing
- Mark Mitchell, Jeffrey Oldham, Alex Samuel: Advanced Linux Programming
- Kurt Wall, Mark Watson, Mark Whitis: Linux Programming Unleashed
- paginile man din Unix
- documentatia oficiala MySql
- www.google.ro ;)
Copyright © 2024 - Toate drepturile rezervate