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