Sunteți pe pagina 1din 8

4. Aplicaii cu funcii i intrri/ieiri n C/C++.

(C/C++ applications
using functions and input/output operations)


1. Obiective:
nelegerea noiunii de flux (stream)
nelegerea sintaxei funciilor printf() i scanf()
Utilizarea specificatorilor de format pentru printf() i scanf()
nelegerea sintaxei operatorilor >> (extracie) i << (inserie)
Scrierea i testarea unor programe simple ce folosesc intrri/ieiri C/C++

2. Breviar teorectic

2.1. Flux (stream)
Sistemul de intrri-ieiri din C/C++ opereaz prin stream-uri (fluxuri). Un stream (flux) este un
dispozitiv logic, care fie produce, fie consum informaie. Altfel spus, reprezint totalitatea
modalitilor de realizare a unor operaii de citire sau scriere.
Transferurile cu dispozitivele periferice (consol, disc, imprimant) se fac prin
intermediul fluxurilor i prin intermediul sistemului de operare. n acest mod, detaliile
funcionale ale dispozitivelor periferice pot fi ignorate la nivelul programului.
Un flux poate fi de intrare, de ieire sau bidirecional.
Exist fluxuri predefinite (standard) care se creaz automat la lansarea n execuie a unui program
i sunt nchise automat la ncheierea execuiei programului.

2.2. Intrri/ieiri C
Cele mai importante fluxuri predefinite (standard) din limbajul C sunt urmtoarele:
- stdin: intrare standard, asociat consolei n intrare, adic tastaturii;
- stdout: ieire standard, asociat consolei n ieire, adic ecranului;

n limbajul C, sistemul de intrri/ieiri nu este o parte a limbajului, ci este adugat printr-
un set de funcii din biblioteca standard. Funciile de intrare/ieire pentru consol utilizeaz
implicit dispozitivele predefinite stdin (tastatura) i stdout (ecranul), n mod transparent pentru
programator.

Funcia printf() :
permite formatarea i afiarea de caractere i valori ctre ieirea standard, stdout.
se apeleaz astfel: printf(format[,arg
i
]);
o unde format este un ir de caractere care definete textele, secvenele escape i
formatele de scriere a datelor precizate prin specificatori de format care se scriu
n caz c exist arg
i
;
o arg
i
, sunt argumente care trebuie s corespund specificatorilor de format
corespunznd specificatorului i: de forma
%[-,+] dimensiune_minim_cmp.precizie_afiare format_ tip_ dat

Datele gestionate de ctre printf() sunt supuse unor transformri din cauza existenei unui
format intern (ce depinde de tipul datelor) i a altuia extern a datelor (uzual ASCII).
Specificatorii de format definesc aceste conversii.

Specificatorii de format ncep totdeauna cu caracterul %. Formatele specifice utilizate n
printf() sunt:
- %c afiare caracter unic; valoarea lui este interpretat ca fiind codul ASCII
al caracterului;
- %s afiare ir de caractere pn la caracterul NULL;
- %d afiare numr ntreg n baza zece cu semn;
- %i afiare numr ntreg n baza zece cu semn;
- %u afiare numr ntreg n baza zece fr semn realiznd conversia unei date
binare de tip unsigned n zecimal;
- %f afiare numr real, notaia zecimal realiznd conversia datei de tip float
sau double la forma, ntreg.fractionar;
- %e(E) afiare numr real, notaia exponenial realiznd conversia datei de tip
float sau double la forma, ntreg.fractionarE[+,-]exp;
- %g(G) afiare numr real, cea mai scurt reprezentare dintre %f i %e;
- %a afiare numr real n hexazecimal -
- %A afiare numr real n hexazecimal, caractere majuscule -
- %x afiare numr hexazecimal ntreg fr semn convertind datele int sau
unsigned;
- %o afiare numr octal ntreg fr semn convertind datele int sau unsigned;
- %p afiarea unui pointer la void (ori ce tip de dat) sub forma unei adrese
compuse din segment i offset n afiare cu cifre hexa;
- %n afiarea unui pointer la int sub forma unei adrese compuse din segment i
offset (deplasament) n afiare cu cifre hexa, valoarea fiind memorat n
ntregul a crui adres este dat ca i argument.

n plus, mai pot fi utilizate urmtoarele prefixe:
l - cu d, i, u, x, o, pentru date de tip long;
- cu f, e, g, pentru date de tip double;
L - cu f, e, g, pentru date de tip double;
h - cu d, i, u, x, o, pentru date de tip short.

Pentru a specifica:
- dimensiunea cmpului de afiare i precizia de afiare a datelor, n cadrul datelor,
specificatorul de format va arta astfel:

%[-,+]a.b f unde:

% este semnul nceputului specificatorului de format;
- indic faptul c alinierea are loc la stnga;
+ dac se afieaz o valoare pozitiv, aceasta va fi precedat de semnul +
a precizeaz dimensiunea minim a cmpului (inclusiv punctul care se scrie
dac este cazul);
b d precizia de afiare;
f arat formatul tipului de dat specific, f pentru real, d pentru ntreg, s pentru ir.

Observaii:
1. precizia poate fi stabilit i folosind caracterul * dup caracterul ., valoarea preciziei
fiind dat printr-un argument suplimentar al funciei printf(), care precede argumentul ce
trebuie formatat.
2. Dimensiunea minim poate fi specificat n mod similar, folosind caracterul * ntre %
i specificatorul de format, valoarea dimensiunii minime a cmpului fiind specificat
printr-un argument suplimentar plasat naintea argumentului care va fi formatat.


Funcia scanf():
permite introducerea de date tastate la terminalul standard de intrare stdin, date
specificate de argumentele arg
i
sub controlul unor formate.
se apeleaz astfel: scanf(format [,arg
i
]);
o unde format este un ir de caractere care d formatele datelor i eventual textele
aflate la stdin; caracterele albe sunt neglijate; n rest sunt specificatori de format
i alte caractere care trebuie s existe la intrare n poziiile corespunztoare,
caractere n general folosite la efectuarea de controale asupra datelor citite.
o arg
i
, sunt argumente care corespund adreselor zonelor n care se pstreaz datele
citite dup ce au fost convertite din formatul lor extern n cel intern
corespunztor: de forma % format_ tip_ dat

Specificatorii de format sunt similari cu cei de la funcia printf(), doar c funcia scanf() nu
accept formatele %i i %g.
ntre caracterul % i literele specifice specificatorului de format se mai pot utiliza:
- un caracter * opional, preciznd faptul c ceea ce urmeaz a fi preluat i interpretat este
funcie de tipul specificat, dar nu este memorat;
- un ir de cifre opional care definete lungimea maxim a cmpului din care se citete
data sub controlul formatului respectiv.

Funcia scanf() citete toate cmpurile care corespund specificatorului de format, inclusiv
eventuale texte prezente n cmpul format. n caz de eroare, citirea se oprete, funcia scanf()
returnnd numrul de cmpuri citite corect.

2.3. Intrri/ieiri C++
Limbajul C++ conine toate rutinele din biblioteca de intrri/ieiri a limbajului C, dar ne pune la
dispoziie i un sistem propriu de intrri/ieiri orientat pe obiecte, implementat prin aa numita
bibliotec iostream.

n limbajul C++ sunt predefinite dispozitivele logice de intrare/ieire standard similare celor din
C:
cin (console input): dispozitiv de intrare consol, asociat tastaturii (echivalentul lui stdin);
cout (console output): dispozitiv de ieire consol, asociat monitorului (echivalentul lui
stdout).

Transferul informaiei cu formatare se poate face cu operatori (fac parte din limbaj) specializai:
>> (extracie) pentru intrare (de la cin): cin >> var;
<< (inserie) pentru ieire (ctre cout): cout << var;

Sunt posibile operaii multiple:
cout << var
1
<< var
2
...<< var
n
;
cin >> var
1
>> var
2
...>> var
n
;
chiar dac variabilele implicate au tipuri diferite.

Utilizarea dispozitivelor i operatorilor de intrare/ieire C++ impune includerea fiierului antet
iostream.h.
Aceti operatori nu necesit specificatori de format pentru fiecare tip de dat deoarece se
folosete un format implicit. Particularizarea formatului este posibil, dar este mai dificil fa de
lucrul cu funciile printf()/scanf().

3. Exemple:

Exemplul 1: program ce afieaz un ntreg n zecimal, octal i hexazecimal.

// directive preprocesor de includere
#include <stdio.h>
#include <conio.h>

// definire constanta simbolica
#define V 12345

void main(void)
{
printf("Zecimal: %d\n", V);
printf("Octal: %o\n", V);
printf("Hexazecimal: %x\n", V);
printf ("Afisare intreg intr-un camp cu dimensiunea 10:%*d\n", 10, V);
puts("Actionati o tasta pentru a continua");
getch();
}//end main

Exemplul 2: program ce citete un caracter folosind funcia scanf(); afieaz codul ASCII al
caracterului respectiv.
// directive preprocesor de includere
#include <stdio.h>
#include <conio.h>

void main(void)
{
// declaratii locale
char car;

printf("\nIntroduceti un caracter : ");
scanf("%c", &car);
printf("\n Codul ASCII al caracterului introdus : %d\n", car);
puts("Actionati o tasta pentru a continua");
getch();
}//end main


Exemplul 3: program ce afieaz valoarea Pi n diferite formate.
// directive preprocesor de includere
#ifndef _USE_MATH_DEFINES
#define _USE_MATH_DEFINES
#endif

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

void main(void)
{
printf("\nPi=%f",M_PI); // Pi=3.142857
printf("\nPi=%-10f",M_PI); // Pi=3.142857, pe 10 pozitii, aliniere la stanga
printf("\nPi=%10f",M_PI); // Pi=3.142857, pe 10 pozitii, aliniere la dreapta
printf(\nPi=%e,M_PI); // Pi=3.142857e+00 (notatia stiintifica)
printf("\nPi=%06.2f",M_PI);// Pi=003.14, pe 6 pozitii, din care 2 zecimale si
// completare cu zerouri la stanga
getch();
}


Exemplul 4: program ce citete numele, prenumele i anul naterii unei persoane separate prin
spaii albe, dup care afieaz informaiile obinute pe un singur rnd (intrri - ieiri C).
// directive preprocesor de includere
#include <stdio.h>
#include <conio.h>

void main(void)
{
// declaratii locale
char nume[255], prenume[255];
int an;

printf( "\nIntroduceti numele: ");
scanf(%s, nume);
printf("\nIntroduceti prenumele: ");
scanf(%s, prenume);
printf("\nIntroduceti anul nasterii: ");
scanf(%d, &an);

printf("\nDatele persoanei: %s, %s, %d", nume, prenume, an);
printf("\nActionati o tasta pentru a continua\n");
getch();
}//end main


Exemplul 5: program ce citete numele, prenumele i anul naterii unei persoane separate prin
spaii albe; afieaz informaiile obinute pe un singur rnd (intrri/ieiri C++).

// directive preprocesor de includere

#include <iostream>
#include <conio.h>

using namespace std;

void main(void)
{
// declaratii locale
char nume[255], prenume[255];
int an;

cout << "\nIntroduceti numele: ";
cin >> nume;
cout << "\nIntroduceti prenumele: ";
cin >> prenume;
cout << "\nIntroduceti anul nasterii: ";
cin >> an;

cout <<endl<<"Datele persoanei: "<<nume<<" "<<prenume << ", " << an;
cout << endl <<"Actionati o tasta pentru a continua";
getch();
}//end main


Exemplul 6: program ce citete o dat calendaristic sub forma: zz ll aa i o afieaz sub forma:
aa/ll/zz.

// directive preprocesor de includere
#include <iostream>

using namespace std;

void main(void)
{
// declaratii locale
int zi, luna, an;

cout << "\nIntroduceti data (zz ll aa): ";
cin >> zi >> luna >> an;
cout << endl << an << "/"<< luna <<"/"<< zi<<\n;
}//end main


4. ntrebri:
1. Ce este un flux (stream) ?
2. Care sunt cele mai importante fluxuri n limbajul C ?
3. Care sunt cele mai importante fluxuri n limbajul C++ ?
4. Care sunt principalele funcii ce permit efectuarea operaiilor de intrare/ieire n limbajul
C ?
5. Care sunt operatorii ce permit efectuarea operaiilor de intrare/ieire n limbajul C++ ?

5. Teme:
1. Realizai o aplicaie care citete de la intrarea standard dou valori pentru variabilele R1
i R2, reprezentnd valoarea rezistenelor R1 i R2, iar apoi apeleaz funcii ce calculeaz
rezistena echivalent gruprii serie, respectiv gruprii paralel, dup care afieaz valorile
returnate cu 3 zecimale i aliniere la dreapta.

2. Scriei o aplicaie care citete de la intrarea standard dou valori pentru variabilele C1 i
C2, reprezentnd valori de capacitati, iar apoi apeleaz funcii ce calculeaz capacitatea
echivalent gruprii serie, respectiv gruprii paralel, dup care afieaz valorile returnate
cu 4 zecimale i aliniere la stnga.

3. Citii de la tastatur dou valori ntregi care reprezint catetele unui triunghi dreptunghic.
Determinai ipotenuza i perimetrul triunghiului. Afiai rezultatul pe linii diferite.

4. Citii de la tastatur dou valori ntregi a i b (a0), unde a i b sunt coeficienii ecuaiei
ax+b=0. Rezolvai ecuaia i afiai rezultatul.

5. Considernd c n problema 1 valorile ntregi sunt capaciti, calculai valorile
corespunztoare gruprii serie i paralel. Includei i situaia cu rezistenele i cea cu
capacitile ntr-un acelai program.

6. Se citesc de la tastatur numele a 2 studeni i nota fiecruia la programare. S se afieze
pe linii separate numele fiecrui student ntr-un cmp de afiare cu dimensiunea 20,
aliniat la dreapta, respectiv la stnga i media notelor lor, cu o precizie de 2 zecimale.

7. Se citete de la tastatur un numr ntreg, ce reprezint raza unui cerc. S se afieze
lungimea i aria cercului de raz dat, cu o precizie de 3 zecimale, ntr-un cmp de afiare
cu dimensiunea 10. Pentru valoarea lui PI definii o constant simbolic.

8. Se citesc de la tastatur ora plecrii unui tren din Cluj i ora la care ajunge la Braov (or
i minute). S se afieze durata cltoriei (n ore i minute).

9. Dou maini se deplaseaz una spre cealalt cu vitezele v1 i v2, plecnd din dou orae
situate la distana d=100km. Vitezele celor dou maini se citesc de la tastatur. Afisai
timpul dup care se ntlnesc, exprimat n minute.


4. Questions
1. What is a data stream?
2. Which are the most important streams in the C language?
3. Which are the most important streams in the C++ language?
4. Which are the main functions that allow I/O operations in the C language?
5. Which are the operators that allow I/O operations in the C++ language?

5. Homework
1. Implement an application that reads from the standard input 2 values for 2 resistors
identified with the R1 and R2 variables. The program calls 2 functions that calculate the
series and parallel equivalent resistance. After that, it displays the results right aligned
and with 3 digits precision in the fractional part.
2. Implement an application that reads from the standard input 2 values for 2 capacitors
identified with the C1 and C2 variables. The program calls 2 functions that calculate the
series and parallel equivalent capacity. After that, it displays the results left aligned and
with 4 digits precision in the fractional part.
3. Read from the standard input 2 integer values that represent the catheters of a rectangular
triangle. Determine the hypotenuse and the perimeter of the triangle. Display the results
on different lines.
4. Read from the keyboard 2 integer values, a and b (a0), representing the coefficients of
the equation ax+b=0. Solve the equation and display the result.
5. Implement the 1-st and 2-nd problems in a single program. Make use of all the possible
similarities.
6. Read from the keyboard the names and the marks of 2 students (each student has a single
mark). Display, on separate lines, the name of each student (right aligned and left
aligned) in two 20 characters fields and their marks with 2 digits precision.
7. Read from the keyboard an integer number that represents the radius of a circle. Display
the length and area of the circle with 3 digits precision, in a field that can store 10
characters. Use a symbolic constant for the value of PI.
8. Read from the keyboard a trains exact departure time from Cluj (hour and minutes) and
arrival time in Brasov. Calculate and display the travelling time, represented in hours and
minutes.
9. Two cars move towards each other, having the speeds v1 and v2 and starting from two
cities 100km apart. The speeds values are read from the keyboard. Display how many
minutes will pass until the two cars meet in the same point.

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