Programarea Calculatoarelor 2: Laborator 2

Obiective: Citirea datelor de intrare după un format simplu, și caracter cu caracter. Calcule numerice simple. Structuri de control repetitive.

Problema 1 Se citește de la intrare o listă de studenți și notele lor la o disciplină. Pe prima linie se dă numărul de studenți. Pe fiecare linie următoare se dă numele complet al studentului, urmat de : și urmat apoi de două numere reale, reprezentând nota la laborator și nota la examen. Să se afișeze la ieșire lista studenților, fiecare nume fiind urmat de trei note: cele două citite, și media ponderată (40% laborator, 60% examen). Dacă una din cele două note e sub 5, în locul mediei se afișează -- .
Indicații de rezolvare În această problemă, formatul datelor de intrare e cunoscut dinainte. Programul nu trebuie să invite utilizatorul în mod repetat să introducă datele dorite, ci trebuie realizat în așa fel încât să citească la fiecare pas datele specificate conform formatului. Presupunem pe moment că datele de intrare sunt corecte; tratarea erorilor se va discuta ulterior. După scrierea programului vom discuta cum el poate fi folosit să prelucreze automat datele dintr-un fișier. prin redirectarea intrării din linia de comandă.
Încercați să rezolvați problema incremental, în următorii pași:

Obs.Pentru citirea unui caracter, se poate folosi (mai simplu decât scanf cu formatul %c), functia getchar(), care citește următorul caracter de la intrare și îl returnează. Pentru a ignora caracterele rămase până la sfârșitul unei linii (după ce s-au citit toate informațiile relevante) se poate apela getchar() până la citirea caracterului \n (în Pascal, s-ar folosi Readln pentru a citi ultima notă de pe linie în problema dată). Scrierea unui caracter se poate face cu funcția putchar având ca argument caracterul de scris, sau cu printf și formatul %c.

Problema 2 Scrieți un program C care citește de la intrare un program și îl afișează după ce a eliminat comentariile. La început, se va solicita precizarea caracterelor cu care încep și se termină comentariile, în următorul format: un număr (1 sau 2) urmată de șirul de caractere cu care începe un comentariu (cu lungimea dată de cifra citită); apoi un alt număr (1 sau 2) urmat de șirul de caractere care încheie comentariul. Exemple: 1{1} (Pascal) 2/*2*/ (C), 2//1<Enter> (C++).
Obs. Sfârșitul intrării e semnalat de funcția getchar() prin returnarea valorii EOF (definită tot în stdio.h). Aceasta e în afara domeniului de valori pentru tipul char, pentru a nu fi confundată cu un caracter. De aceea, getchar() returnează un int (care are un domeniu de valori mai mare decât char), și pentru a trata corect cazul EOF, rezultatul trebuie atribuit tot unei variabile int. Dacă valoarea returnată de getchar() nu este EOF, ea poate fi apoi utilizată normal ca un caracter (comparată, atribuită, etc.).
Suplimentar: țineți cont de cazul în care caracterele specifice comentariilor apar în interiorul șirurilor de caractere (delimitate prin ghilimele duble " și nu au un rol special în acest caz.


Marius Minea
Last modified: Wed Oct 8 12:04:06 EEST 2003