Programarea Calculatoarelor: Laborator 7

Tema: citire de la intrare si tiparirea in diverse formate (linii, cuvinte, numere).

#include <math.h>
#include <stdio.h>

/* Exemplu: citim pana la EOF linii presupuse in urmatorul format:
 * Nume Prenume , Nota1 , Nota2 , Nota3 , Media , Observatii
 * sa se afiseze doar: Nume Prenume , Media , Observatii
 * si sa se verifice daca formatul e corect, si
 * Media = 0.2*Nota1 + 0.3*Nota2 + 0.5 * Nota3
 * altfel sa se afiseze un mesaj de eroare in observatii
 * Presupuneri: Nume si Prenume au cel mult 32 de caractere */

// ignora totul pana la linie noua, folosita in caz de eroare
void clreol(void)
{
  int c;
  do c = getchar(); while (c != '\n' && c != EOF);
}

// copiaza tot (observatii) pana la sfarsit de linie (inclusiv)
void copyeol(void)
{
  int c;
  while ((c = getchar()) != EOF) {
    putchar(c);
    if (c == '\n') break;
  }
}

int main(void)
{
  char cuv[33];
  double n1, n2, n3, med;
  while (scanf("%32s", cuv) == 1) {	// cat timp citim corect cuvant 
    // permitem ca nume un cuvant arbitrar; altfel putem folosi
    // scanf("%32[A-Za-z]", cuv) , eventual permite liniute, etc.
    printf("%s ", cuv);	// tiparim numele si un spatiu
    if (scanf("%32s", cuv) != 1) {
      printf(", 0, eroare: lipsa prenume\n");	// medie 0, mesaj eroare
      clreol();	// ignora restul liniei
    } else {
      printf("%s, ", cuv);	// prenume, virgula, spatiu
      if (scanf(" ,%lf ,%lf ,%lf ,%lf ,", &n1, &n2, &n3, &med) != 4) {
	// %lf si nu %f pentru double (nu float)
	// spatiu in format permite dar nu obliga la spatii inainte de virgula
	// spatii dupa virgula inainte de nr. sunt permise implicit de %lf
	printf("0, eroare: citire note\n");
	clreol();	// ignora restul liniei
      } else {
	printf("%.2f, ", med);
	if (fabs(0.2*n1 + 0.3*n2 + 0.5*n3 - med) > 0.005)
	  printf("eroare: medie imprecisa");
	copyeol();
      }
    }
  }
  return 0;
}


Marius Minea
Last modified: Sun Mar 5 17:38:25 EET 2006