Sunteți pe pagina 1din 5

Funcția intrare si funcția ieșire în C

1. Funcțiile scanf/printf în C
În limbajul C, nu există instrucțiuni de intrare/ieșire (citire/scriere) pentru a mări portabilitatea
limbajului. Pentru a realiza citiri și scrieri se apelează funcții de intrare/ieșire din bibliotecile
mediului de programare. Pentru operații de citire a datelor și de afișare a rezultatelor sunt definite
funcții standard, declarate în fișierul antet sdtio.h . Un fișier text este un fișier care conține numai
caractere ASCII grupate în linii (de lungimi diferite), fiecare linie terminată cu un terminator de
linie format din unul sau două caractere. În sistemele Windows se folosesc două caractere ca
terminator de linie: \n - newline (trecere la linie nouă) și \r-return (trecere la început de linie).
Funcțiile intrare/ieșire (input/output) din C pot fi grupate în câteva familii:

 Funcții de citire/scriere de caractere individuale : getchar, putchar, getch, putch;


 Funcții de citire/scriere de linii de text : gets, puts;
 Funcții de citire/scriere cu format : scanf, printf.
Descriere a funcțiilor pentru intrare/ieșire la nivel de caracter:
a) int getchar(); // citește un caracter, iar ca rezultat este codul unui caracter citit de la tastatura
exemplu de folosire : char c; c=getchar();
b) int putchar (int c); // afișează pe ecran caracterul transmis ca parametru

Descriere a funcțiilor pentru intrare/ieșire cu șiruri de caractere:


a) char * gets(char * s); // citește caractere până la întâlnirea lui Enter, iar după Enter se adaugă
\0 la sfârșitul lui s.
exemplu de scriere : char s[10];gets(s);
b) int puts(const char * s); // tipărește șirul primit ca parametru, apoi o nouă linie , cursorul
trecând la începutul rândului următor
exemplu de scriere :char s[10];puts(s);

Un programator trebuie să asigure concordanța dintre descriptori de format și tipul variabilelor sau
expresiilor care urmează argumentul, deoarece funcțiile scanf și printf nu fac nicio verificare și nu
semnalează neconcordanțe. Exemplele următoare trec de compilare, dar primești avertisment pentru
utilizarea incorectă a specificatorilor de format și afișează incorect valorile variabilelor :
#include <stdio.h>
#include <stdlib.h>
int main()
{int a=3;
float b=3.14;
printf("%f \n ",a); ///afișează 0.00000
printf("%d \n ",b); ///afișează 1610612736

return 0;
}
Între caracterul ‚%’ și literele care desemnează tipul valorilor scrise mai pot apărea :
a) Un caracter ce exprimă anumite opțiuni de scriere :
-(minus): aliniere la stânga în câmpul de lungime specificată
+(plus): se afișează și semnul ‚+’ pentru numere pozitive
0:numerele se completează la stânga cu zerouri pe lungime X
#:formă alternativă de scriere pentru numere
b) Un număr întreg X ce arată lungimea câmpului pe care se scrie o valoare sau caracterul *
dacă lungimea câmpului se dă într-o variabilă de tip int care precede variabila a cărei valoare
se scrie.
c) Punct urmat de un întreg, care arată precizia cu care se scriu numerele neîntregi.
d) Una din literele ‚h’ ‚l’ care modifică lungimea tipului numeric.
Exemplu de utilizare a opțiunii ‚0’
#include <stdio.h>
#include <stdlib.h>
int main()
{int ora=9, min=7, sec=30;
printf ("%02d:%02d:%02d\n",ora, min, sec); /// scrie 09:07:30
return 0;
}

***De reținut diferența de utilizare a funcțiilor scanf și printf !


Exemplu:
#include <stdio.h>
#include <stdlib.h>
int main()
{int a,b;
scanf("%d %d", &a, &b); /// citește două numere întregi în a și b
printf("%d %d", a, b); /// scrie valorile din a și b separate de un spațiu
return 0;
}
Observații:
Toate funcțiile de citire menționate (excepție getch,getche) folosesc o zonă tampon în care se adună
caracterele tastate până la apăsarea tastei Enter, moment în care conținutul zonei buffer este transmis
programului. În acest fel este posibilă corectarea unor caractere introduse greșit înainte de apăsarea
taste Enter.
Caracterul „\n” este prezent în zona buffer numai la funcțiile getchar și scanf, dar funcția gets
înlocuiește acest caracter cu un octet zero, ca terminator de șir în memorie (rezultatul funcției “gets”
este un șir terminat cu zero). Funcția scanf recunoaște în zona buffer unul sau mai multe câmpuri ,
separate și terminate prin caractere spațiu alb (blanc, ‘\n’, ‘\r’,’\f’); drept consecință, preluarea de
caractere din buffer se oprește la primul spațiu alb, care poate fi și caracterul terminator de linie.
Următorul apel al funcției getchar sau scanf se uită în zona buffer dacă mai sunt caractere, înainte de a
aștepta introducerea de la taste și va găsi caracterul terminator de linie rămas de la citirea anterioară.
Pentru ca un program să citească corect un singur caracter de la tastatură avem mai multe soluții:
1. Apelarea funcției fflush(stdin) înainte de oricare citire; această funcție golește zona buffer
asociată tastaturii și este singura posibilitate de acces la această zonă tampon.
2. Introducerea unei citiri false care să preia terminatorul de linie din buffer( cu getchar(),de
exemplu).
3. Utilizarea funcției getch(care trebuie declarată in conio.h) funcție care nu folosește o zonă
buffer la citire
4. Citirea unui singur caracter cu un șir de lungime 1

#include <stdio.h>
#include <stdlib.h>
int main()
{char c[2]; /// memorie pentru un caracter și pentru terminator de șir
scanf ("%1s",c); /// citește șir de lungime 1
return 0;
}

Exemple pentru utilizarea funcție printf


1. Tipărirea unei valori întregi octale sau hexazecimale
#include <stdio.h>
#include <stdlib.h>
int main()
{int valoare = 255;
printf("Valoarea zecimala %d este %o in octal\n",
valoare, valoare);
printf("Valoarea zecimala %d este %x in hexazecimal\n",
valoare, valoare);
return 0;
}
Valoarea zecimala 255 este 377 in octal
Valoarea zecimala 255 este ff in hexazecimal
2. Afișarea unui prefix înaintea valorilor octale și hexazecimale
#include <stdio.h>
#include <stdlib.h>
int main()
{int valoare = 255;
printf("Valoarea zecimala %d este %#o in octal\n", valoare);
printf("Valoarea zecimala %d este %#x in hexazecimal\n", valoare);
return 0;
}
Valoarea zecimala 255 este 0377 in octal
Valoarea zecimala 255 este 0xff in hexazecimal
3. Formatare cu virgulă mobilă
#include <stdio.h>
#include <stdlib.h>
int main()
{float valoare = 1.23456;
printf("%8.1f\n", valoare);
printf("%8.3f\n", valoare);
printf("%8.5f\n", valoare);
return 0;
}
Programul va afișa : 1.2
1.235
1.23456
Probleme rezolvate pentru funcția printf
1.
#include <stdio.h>
#include <stdlib.h>
int main()
{

for (int i = 33; i < 127; i++ )


if ( i % 10 == 1 )
printf("%c = %d \n", i, i );
else
printf("%c = %d \n", i, i );
return 0;
}
// afișează pentru fiecare caracter codul ASCII

Probleme rezolvate cu funcția scanf și printf


1.
#include <stdio.h>
#include <stdlib.h>
int main()
{int i, n, m;
scanf("%d%d", &n, &m);
for (i = 1; i <= n; i++){
printf("%6d", i);
// conditie de test pentru trecerea la linie noua
if (i % m == 0)
printf("\n");
// conditie de test pentru intreruperea afisarii
if (i % (24 * m) == 0){
fflush(stdin);
getchar();
}
}

return 0;
}
2.
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
int main()
{
float x, r1, r2, EPS = 0.001;
scanf("%f", &x);
r1 = r2 = x / 2 ;
do
{r1 = r2;
r2 = ( r1 + x/r1 ) / 2;
} while ( fabs( r1 - r2 )>EPS);
printf("rad(%2.0f) = %.3f | %.3f \n", x, r2, sqrt(x));
for(int i = 1; i <= 50; i++)
printf("rad(%d) = %.3f\n", 2 * i, sqrt(2 * i));
return 0;
}
// Acest program afișează radicalul numerelor cuprinse în intervalul [1,100] cu 3 zecimale după virgulă

Referat realizat de : Lazăr Sergiu-Eusebiu


Automatică și Informatică aplicată
Semi-grupă :3212b

S-ar putea să vă placă și