120 likes | 286 Views
Programare in limbajul C – Cursul 8 Operaţii elementare de intrare – ieşire Prof. univ. dr. Constantin Popescu. Agenda. Functia printf Functia scanf Functia getchar Functia putchar Ordinea evaluării. Funcţia printf (1). Există o serie de specificatori de format pentru funcţia printf.
E N D
Programare in limbajul C – Cursul 8Operaţii elementare de intrare – ieşireProf. univ. dr. Constantin Popescu
Agenda • Functia printf • Functia scanf • Functia getchar • Functia putchar • Ordinea evaluării
Funcţia printf (1) • Există o serie de specificatori de format pentru funcţia printf. Specificator Semnificatie %dtipăreşte argumentul de tip int în format zecimal %ldtipăreşte arg. de tip long int în format zecimal %ctipăreşte un caracter %stipăreşte un şir de caractere %f tipăreşte un argument de tip float sau double %ela fel ca %f, dar foloseşte notaţia exponenţială %gfoloseşte %e sau %f, care e mai bun %otipăreşte un argument de tip int în baza 8 %xtipăreşte un argument de tip int în baza 16 %%tipăreşte %
Funcţia printf (2) • Apelul: printf("%c %d %f %e %s %d%%\n", '1', 2, 3.14, 56000000., "opt", 9); va tipări: 1 2 3.140000 5.600000e+07 opt 9% • Apelul: printf("%d %o %x\n", 100, 100, 100); va tipări: 100 144 64 • Apeluri succesive ale funcţiei printf vor genera ieşirile una după alta, astfel apelurile de mai jos vor afişa Hello, world! (pe o singură linie): printf("Hello, "); printf("world!\n");
Funcţia scanf • Functia scanf esteasemanatoare cu printf: • Este o functie din biblioteca C: <stdio.h> • Specificatorii de format sunt aceeasi ca la functia printf • Exemple: scanf ("%d", &x); /* citeste un numar intreg */ scanf ("%f", &rate); /* citeste un numar real */ int n1, n2; float f; scanf("%d%d%f",&n1,&n2,&f); (Trebuie sa fie adaugate spatii pentru a separa numerele.) • Caracterul & este utilizat pentru adresa unei variabile
Intrare - ieşire pe caractere • Folosind funcţiile getchar() şi putchar(), putem scrie un program simplu, pentru copierea intrării, caracter cu caracter, la ieşire: #include <stdio.h> /* copierea intrării în ieşire */ int main() { int c; c = getchar(); while(c != EOF) { putchar(c); c = getchar(); } return 0; }
Intrare - ieşire pe caractere • Funcţia pentru citirea unei linii: #include <stdio.h> /* Citeste o linie de la intrarea standard, copiind-o in tabloul line. */ /* \n nu va fi plasat in tabloul line. */ /* Returneaza lung. liniei, sau 0 pt. liniile goale, sau EOF pentru sfarsit de fisier */ int getline(char line[], int max) { int nch = 0; int c; max = max - 1; /* lasam spatiu pentru '\0' */ while((c = getchar()) != EOF){ if(c == '\n')break; if(nch < max){ line[nch] = c; nch = nch + 1; } } if(c == EOF && nch == 0)return EOF; line[nch] = '\0'; return nch; }
Intrare - ieşire pe caractere • O buclă echivalentă care să nu folosească instrucţiunea break ar fi: while((c = getchar()) != EOF && c != '\n') { if(nch < max) { line[nch] = c; nch = nch + 1; } } • Dăm mai jos un program de test care apelează funcţia getline, citind din intrare câte o linie o dată şi tipărind linia citită: #include <stdio.h> extern int getline(char [], int); int main() { char line[256]; while(getline(line, 256) != EOF) printf("%s\n", line); return 0; }
Intrare - ieşire pe caractere • Un întreg s-ar putea citi în felul următor: #include <stdlib.h> . . . char line[256]; int n; printf("Scrieti un intreg:\n"); getline(line, 256); n = atoi(line); • Acum variabila n conţine numărul scris de utilizator. • Presupunem că utilizatorul a introdus un număr valid • Functia getline nu a returnat EOF.
Intrare - ieşire pe caractere • Citirea unui număr în virgulă mobilă se face similar: #include <stdlib.h> . . . char line[256]; double x; printf("Scrieti un numar in virgula mobila:\n"); getline(line, 256); x = atof(line);
Ordinea evaluării • Expresia: (c = getchar()) != EOF • atribuie valoarea returnată de funcţia getchar variabilei c şi compară acea valoare cu EOF. • Vom folosi şi expresii care fac trei lucruri deodată, de exemplu: a[i++] = b[j++]; • care atribuie b[j] lui a[i] şi incrementează valorile lui i respectiv j. • Dacă nu suntem atenţi putem scăpa de sub control acest gen de expresii. • De exemplu expresia de mai jos este eronată: a[i++] = b[i++]; /* GREŞIT */
Exemplu-afiseaza restul impartirii #include <stdio.h> #include <conio.h> int main() { int after = 0; printf(“Afiseaza restul impartirii a doua nr. intregi\n\n"); printf(“Introduceti un numar intre 1 si 10: "); scanf("%d",&after); for(int before=1;before<=15;before++) printf("%d %% %d = %d\n",before,after,before%after); printf(“Apasa orice tasta: "); getch(); return 0; }