Operatii de Intrare / Iesire cu tastatura / monitorul
Tastatura si monitorul dispozitive asimilate fisierelor ASCII fac posibile operatiile de intrare/iesire prin realizarea conversiei intre reprezentarea interna si cea externa a datelor. Scrierea (afisarea) pe monitor se face in 2 pasi: datele din memoria principala se convertesc in format extern de reprezentare si sunt transferate intr-o zona-tampon, unde, in faza a doua, sunt preluate si afisate pe ecran. Citirea datelor se face tot in 2 pasi: se preiau datele de la tastatura, se depun in zona-tampon in cod ASCII si in faza a doua se face preluarea lor, conversia in format intern al datelor si depozitarea lor in memoria principala, in zonele parametrilor functiilor de citire. In Limbajul C nu sunt implementate instructiuni de intrare/iesire, acestea realizandu-se prin apelarea unor functii de biblioteca. Cele mai utilizate sunt: PRINTF, PUTS, PUTCH si macroul PUTCHAR. Citirea datelor de la tastatura se poate realize cu functiile: SCANF, GETS, GETCHE si cu macroul GETCHAR. Functiile PRINTF si SCANF sunt functii de intrare.iesire cu format, trebuind sa fie incluse, in programul sursa #include<stdio.h> Exemplu:
descriptori de format
int a, b; printf(nr1=% i; nr2=% i; a, b ); sir de caractere
-1-
Fiecarui descriptor de format trebuie sa-i corespunda, exact, un element din
lista de intrari/iesiri, formatele de intrari/iesiri (in/out) indeplinesc, simultan, rolurile de sabloane si de parametrii. Rolul de sablon ale modului de reprezentare extern al datelor, ofera un control mai bun al citirii/scrierii datelor, iar rolul de parametru, ne indica modul de conversie. Forma generala a unui descriptor este: %[cadraj][latime[.precizie]]cod_conversie
la care, cadrarea se face implicit la dreapta, modul de reprezentare extern fiind
ales automat de compilator, in functie de tipul datei. Descrierea parametrilor: - cadrajul datele se aliniaza la dreapta campului, implicit, doar prezenta caracterului detremina alinierea de la stanga ; - latimea este un numar, care, daca este mai mic decat valoarea explicita, se completeaza cu caractere nesemnificative (de la stanga la dreapta), aceste caractere putand fi spatii sau zero; - precizia acuratetea datei scrise. Pentru o valoare reala, indica numarul de zecimale afisate. Daca partea fractionara este mai mare ca precizia (in caractere) se rotunjeste ultimul character (zecimala). Pentru un sir de caractere, precizia va indica numarul maxim de caractere ce se vor afisa, indiferent de lungimea acestuia. - cod_conversie este format din 1-2 caractere si poate fi: d, i, o, u, x, f, e, g, E, G, c, s l sau L si %, in functie de doruinta folosirii lui si a datelor. Pentru citirea datelor de la tastatura, descriptorul de format poate contine si parametrii optionali: - latimea reprezentata printr-un numar, fiind latimea maxima a campului; - asterisc se va citi de la tastaturavaloare respective, nefiind atribuita nici unei variabile. Functiile de scriere/citire cu format, PRINTF si SCANF sunt definite in biblioteca stdio.h (Standard Input Ouput). PRINTF transfera valori care se vor afisa, iar SCANF transfera adrese (ale variabilelor) care se vor citi. La PRINTF parametrii reali pot fi: variablie, constante, expresii sau apeluri de functii, iar functia returneaza valori. La SCANF parametrii reali trebuie sa fie adresele variabilelor care se citesc; trebuie transmise explicit, folsind operatorul & care extrage adresa unei variabile. Functia PRINTF executa scrierea datelor pe monitor, returnand numarul de caractere (in caz de succes) sau -1 (in caz de eroare), poate fi folosita pentru a afisa unul sau mai multe valori, parametrul <sir descriptor> putand contine caractere si descriptori care definesc conversiile aplicate obiectelor precizate. Primul parametru al functiei are semnificatie prestabilita (sir de character continand descriptori de format pentru datele care urmeaza a fi afisate) putanduse face si verificari asupra rezultatelor de afisare, suplimentar. -2-
Formatul functiei PRINTF poate cuprinde si secvente escape, cum ar fi:
\n newline cursorul trece la inceputul liniei urmatoare; \t orizontal TAB 8 spatii spre dreapta fata de pozitia curenta; \a bell sunet standard; \v vertical TAB 8 spatii (randuri) mai jos fata de pozitia curenta; \b backspace se revine la o pozitie inapoi; \r carriage return se revine la inceputul randului current. Functia SCANF citeste datele de a tastatura si returneaza numarul de campuri, putand contine in afara de cod_conversie si caractere introduce de la tastatura, caractere albe (spatiu, TAB) fiind ignorate. Campul controlat de un specificator de format, merge la primul caracter care nu este alb si se termina la caracterul dupa care urmeaza un caracter alb sau un caracter necorespunzator (litere in loc de cifre) sau la caracterul care ajunge la lungimea maxima a campului. La citire, datele externe se pot separa prin spatiu, TAB, CR/LF, virgule sau pot fi texte cu lungimea prestabilita, iar la descoperirea unei erori, se intrerupe, aceasta fiind cauzata de neconcordantza intre textul introdus si specificatorul de format sau intre data din camp si specificatorul de format. Deoarece masivele (numele acestora) sunt pointeri, atunci cand este posibila specificarea numelui, nu mai este nevoie de operatorul &. Daca parametrul ia valori intre 32-127 se vor afisa caracterele tastaturii centrale, afisabile si imprimabile, iar daca aceste valori sunt in intervalul 128-255 se vor afisa caracterele grafice standard. Daca parametrul are valoarea in afara intervalului 0-255 se va fisa caracterul corespunzator interpretarii, ca valoare in virgule fiza aritmetica, a primului octet (cel mai putin semnificativ).