Documente Academic
Documente Profesional
Documente Cultură
Adriana Kentsch
2 n continuare vom studia pentru nceput stream-urile de intrare i ieire standard istream i ostream. ATENIE tot ce nvm la ele este valabil i pentru fiiere. De ce? datorit motenirii.
//daca tastm 'a' se tip 'a' //daca tastm ' a' se tip 'a' //se cit val pentru a, apoi b, apoi c //se afieaz var a i b iar pe urmt. linie c
Variabile numerice (citire/scriere): Citire : se face ncepnd cu poziia curent; se sare peste caracterele albe; citirea se face pn cnd este ntlnit un caracter ce nu poate face parte din acel tip de dat Scriere: se face ncepnd cu poziia curent curent Ex: include<iostream.h> dac se tasteaz 12 se tip 12 void main(void) dac se tasteaz ' 17ab' se tip 17 { dac se tasteaz 123.78 se tip 123 int n;
cin>>n; cout<<n; } include<iostream.h>
Ex:
iruri de caractere (citire/scriere): Citire : Se face ncepnd cu poziia curent; se sare peste caracterele albe; citirea se face pn cnd este ntlnit un caracter alb irului astfel obinut i se adaug caracterul nul, dup care este memorat. Scriere: se face ncepnd cu poziia curent pn este ntlnit caracterul nul. Ex: include<iostream.h> void main(void) dac se tasteaz acesta este un text { se va afia acesta char sir[20];
cin>>sir; cout<<sir; }
n continuare vom vedea cum tratm erorile generate de aceste obiecte. 2.2.Tratarea erorilor Presupunem c dorim s citim o variabil de tip int. Din greeal sau intenionat introducem un ir care ncepe cu o liter, n acest caz citirea eueaz:
#include<iostream.h> Dac se introduce x89 se va afia 2t3. De ce? void main(void) - var a nu a putut fi citit('x' nu este numr) i atunci valoarea { ei anterioar rmne aceeai (adic a = 2) int a=2,b=3; - toate citirile sunt blocate din aceast cauz, deci b i c char c='t'; cin>>a>>b>>c; rmn nemodificate cout<<a<<c<<b; }
Variabila state din clasa ios reine modul n care s-a efectuat ultima operaia de intrare/ieire, astfel: Dac "operaia s-a efectuat corect" atunci state = 0
4 altfel
state = valoarea corespunztoare const. de mai sus
Coninutul variabilei state poate fi obinut cu ajutorul metodei rdstate() a clasei ios:
int rdstate()
Ex: 1)
#include<iostream.h> void main(void) { int a; cin>>a; cout<<cin.rdstate; }
- dac se introduce 1 se tiprete 0 (citire corect) - dac se introduce 's' se tiprete 2 (eroare reparabil) - dac se introduce ^Z se tiprete 3 (sf de fiier + eroare reparabil)
Ex: 2) Se introduc numere pn la apsarea caracterului ^Z, se cere s se afieze numerele pare introduse
#include<iostream.h> #include<conio.h> void main(void) { int a; clrscr(); while (cin>>a,cin.rdstate() == 0) if (a%2 == 0) cout<<a<<" "; }
Condiia din while conine dou expresii: prima citete o valoare n a, iar cea de-a doua verific dac citirea a fost corect. Ct timp citirea este corect se execut instruciunea de verificare dac acel numr este par sau nu. Am vzut c prin cin>>a>>b>>c; variabilele b i c pot fi iniializate prin citire numai dac citirea variabilei a este corect. Clasa ios mai conine metoda: void clear ( int = 0 ) ce permite setarea variabilei state cu o valoare. Dac parametrul lipsete aceast valoare este 0. Ex: 1)
#include<iostream.h> void main(void) Dac se introduce x9 se tiprete 2x9 deoarece variabila a nu a { fost citit (ea va avea valoarea cu care a fost iniializat, adic 2), int a = 2,b = 3; dar b i c au fost citite. char c = 't'; cin>>a; cin.clear(); cin>>b>>c; cout<<a<<b<<c; }
Expresia cin>>a,cin.rdstate() se evalueaz de la stnga la dreapta, deci se ncearc citirea variabilei a, dac tentativa reuete atunci STOP (cin.rdstate() ==
char c; 0), altfel variabila state = 0 i caracterul de pe poziia while(cin>>a,cin.rdstate()) curent este atribuit variabilei c. Procedeul se repet cin.clear(),cin>>c; }
pn cnd n a va fi citit primul numr introdus. Dac se introduce abc34sr56 o variabila a = 34.
Clasa ios mai conine urmtoarele metode utile n tratarea erorilor: int fail() - dac operaia de intrare/ieire a euat atunci returneaz val. 0 altfel returneaz val = 0 int good() - dac operaia de intrare/ieire a reuit atunci returneaz val. 0 altfel returneaz val = 0 #include<iostream.h>//aplicaia numr cte numere ntregi s-au introdus
#include<conio.h> void main(void) { int a,n; clrscr(); n=0; while (cin>>a,cin.good()) n++; cout<<"Ati introdus "<<n<<" numere"; getch();}
<iomanip.h>
Este comod s efectum citiri i scrieri fr format dar aceast modalitate uneori este insuficient. n C++ este posibil s efectum citiri/scrieri cu format fr a utiliza funciile printf i scanf. CITIRE:
cin >>manipulator_1>>...>>manipulator_n>>variabil
SCRIERE: cout <<manipulator_1<<...<<manipulator_n<<variabil | constant unde variabil | constant - nume_de_var sau nume_de_const sau o constant manipulatori - sunt funcii de sistem ce pot fi apelate n stream-uri la citire/scriere (pentru aceasta trebuie apelat n program fiierul iomanip.h)
Scop
Stabilete numrul de zecimale (x) pt. un nr. real nr. de poz. pe care se face afiarea
6
setfill(x)
char
x_fill
Ex:
#include<iostream.h> #include<iomanip.h> void main(void) { float a = 0.123456; cout<<setprecision(2)<<setw(5)<<setfill('f')<<a; } Se va afia pe ecram: f0.12
Manipulatori:
Acces la variabila de mem. sistem: setioflags(masca) seteaz x_flags
resetioflags(masca)
Manipulator
Scop
precizai precizai n n
x_flags
unde cont_1...const_n sunt constante simbolice cu anumite efecte asupra datelor, explicate n tabelul urmtor: Constanta Const. simbolic Semnificaie 0x0001 skipws caracterele albe care preced valoarea sunt ignorate 0x0002 left afiarea datelor se face cu aliniere la stnga 0x0004 right afiarea datelor se face cu aliniere la dreapta 0x0008 internal dac spaiul unde se va afia numrul este mai mare atunci semnul va fi aliniat la stnga i numrul la dreapta 0x0010 dec conversie n zecimal 0x0020 oct conversie n octal 0x0040 hex conversie n hexazecimal 0x0080 showbase se utilizeaz indicatorul bazei de numeraie 0x0100 showpoint Nr. real se afieaz cu punct chiar dac acestea are val. ntreag 0x0200 uppercase se folosesc litere mari pt. sistemul hexa 0x0400 showpos pentru val. numerice pozitive se afieaz semnul '+' 0x0800 scientific pentru nr. reale se folosete notaia tiinific 0x1000 fixed pentru date reale se afieaz n forma normal(-343.5656) urmtorii manipulatori pot fi folosii i fr masc: Manipulator Efect oct conversie n octal
7
dec hex
Ex:
#include<iostream.h> #include<conio.h> #include<iomanip.h> void main(void) { int n; float m; clrscr(); cout<<setw(5)<<"n= ";cin>>n; cout<<setw(5)<<"m= ";cin>>m; cout<<"Numarul n in baza 16 este: "; cout<<setw(10)<<setiosflags(ios::hex|ios::uppercase|ios::right| ios::showbase)<<n<<endl; cout<<"Numarul n in baza 8 este: "; cout<<setw(10)<<oct<<setiosflags(ios::right|ios::showbase)<<n<<endl; cout<<"Numarul m scris cu E este: "; cout<<setw(10)<<setiosflags(ios::scientific)<<m; getch(); } Dac se introduc valorile n = 12 i m = 9.8 se va afia: