Programarea Calculatoarelor 2 - Laborator 4

La laborator se va propune spre rezolvare o problema de mai jos sau o variatie a acesteia. Cititi si observatiile despre testare si corectitudine de la sfarsit.

Problema 1 Scrieti un program care numără caracterele, cuvintele și liniile citite de la intrarea standard, pana la sfarsitul acesteia. Cuvintele sunt secvențe de caractere despărțite prin unul sau mai multe "spatii albe".
Precizări O linie se numără doar când e încheiată cu '\n'. Programul va tipări la ieșire numărul de linii, cuvinte, și caractere, aliniate la dreapta pe un câmp de lățime 7 (se poate face cu formatul %7d), și separate prin câte un spațiu. Pentru comparație, folosiți programul UNIX wc (word count).
Observație: Pentru a indica sfârșitul fișierului standard de intrare, în cazul introducerii de la tastatură, într-un terminal UNIX se tastează Control-D. Dacă pe linia curentă s-au introdus deja caractere, Control-D trebuie repetat de două ori.

Problema 2 Scrieti un program care numara liniile utile citite de la intrarea standard, pana la sfarsitul acesteia. O linie e utila cand contine si altceva in afara de comentarii (cf. sintaxei C) sau spatii albe.

Problema 3 Scrieti un program care numara cuvintele si liniile citite de la intrarea standard, pana la sfarsitul acesteia. Un cuvant e o secventa de litere, cifre, caractere '.' sau '_' .

Problema 4 Scrieti un program care tipareste la iesire textul citit de la intrarea standard, modificat astfel incat orice litera de la inceputul unui cuvant e transcrisa ca litera mare. La sfarsit, programul va tipari numarul total de cuvinte si numarul maxim de cuvinte pe aceeasi linie. Cuvintele sunt secvențe de caractere despărțite prin unul sau mai multe "spatii albe".

Generarea cazurilor de test

Creati cazuri de test care sa acopere pe cat posibil toate cazurile pentru toate aspecte relevante (si combinatii intre acestea).
De exemplu, pentru programul word count, sunt relevante urmatoarele situatii:

Scrierea programelor corecte

Problemele propuse sunt simple: cu doar cateva decizii si cicluri, si fara structuri de date compuse. Chiar si asa, este util sa dezvoltam programele (si sa incercam sa ne convingem de corectitudinea lor) identificand (si adnotand prin comentarii) conditiile care sunt adevarate in diverse puncte din program, in special conditiile valabile la fiecare iteratie a unui ciclu (invarianti), si la iesirea din cicluri. Exemple:
  l = 0; r = 19;  // cauta x in tablou crescator a[20]
  // a[l-1] < x < a[r+1] (daca limitele exista)
  do {
    m = (l + r) >> 1;	// jumatatea intervalului
    if (x > a[m]) l = m + 1; // x > a[l-1]
    else r = m;	// x <= a[r] deci x < a[r+1]
  } while (l != r);
  // l == r, deci a[l-1] < x < a [l+1]
  if (x == a[l]) printf("gasit la poz. %d\n", l);
  else printf("%f nu e in tablou\n", x);
sau
  if (c == '*') {  // am intrat in comentariu
    do c = getchar(); while (c != '*');
    // c e sigur '*'
    // dar cum poate programul sa forteze aparitia lui '*' ??
  }

Marius Minea
Last modified: Fri Oct 21 16:45:34 EEST 2005