590 likes | 698 Views
Intr ările în program. Scrierea aplicaţiilor. Programarea calculatoarelor şi limbaje de programare I C apitolul 4. Introducere. Vom vedea cum putem introduce date în program chiar în timpul rulării lui c um se citesc date din fi şiere şi cum se scriu date în fişiere
E N D
Intrările în program. Scrierea aplicaţiilor Programarea calculatoarelor şi limbaje de programare I Capitolul4
Introducere • Vom vedea • cum putem introduce date în program chiar în timpul rulării lui • cum se citesc date din fişiere şi cum se scriu date în fişiere • cum se pot scrie aplicaţiiprin • descompunere funcţională • proiectare orientată pe obiecte Programarea calculatoarelor şi limbaje de programare I
Sumar • Transmiterea datelor către programe • Intrări şi ieşiri din fişiere • Erori de citire • Scrierea aplicaţiilor Programarea calculatoarelor şi limbaje de programare I
Transmiterea datelor către programe • În programele pe care le-am scris până acum, valorile datelor se găsesc chiar în program, în constante simbolice sau literale • Dacă dorim să modificăm o dată, trebuie să facem o mică modificare în program, să îl recompilăm şi să îl executăm din nou • Vom vedea cum putem introduce date în program chiar în timpul rulării lui Programarea calculatoarelor şi limbaje de programare I
Transmiterea datelor către programe • Unul dintre marile avantaje ale calculatorului este că un program poate fi folosit cu diverse seturi de date • Pentru aceasta trebuie să separăm datele de program până în momentul execuţiei • Anumite instrucţiuni din program copiază valori în variabilele din program • După stocarea acestor valori în variabile, programul poate să le folosească în calcule Programarea calculatoarelor şi limbaje de programare I
Transmiterea datelor către programe • Procesul de plasare a unor valori dintr-o mulţime de date în variabile din program se numeşte intrare (input) • Într-o terminologie mai largă, calculatorul se spune că citeşte date din exterior în variabile • Datele pot proveni dintr-un fişier, de la tastatură etc. • Dispozitivul standard de intrare este tastatura Programarea calculatoarelor şi limbaje de programare I
Stream-uri de intrare şi operatorul de extracţie >> • În C++, conceptul de stream este esenţial • Putem gândi un stream de ieşire ca pe o secvenţă infinită de date care circulă dinspre program înspre un dispozitiv de ieşire • Un stream de intrare este o secvenţă infinită de caractere care porneşte de la un dispozitiv de intrare şi este dirijată către program Programarea calculatoarelor şi limbaje de programare I
Stream-uri de intrare şi operatorul de extracţie >> • Fişierul header iostream conţine, printre altele, definiţiile a două tipuri de date: istream şi ostream • Aceste tipuri de date reprezintă stream-uri de intrare şi stream-uri de ieşire • Acest fişier header mai conţine două declaraţii care arată aproximativ astfel istream cin; ostream cout; Programarea calculatoarelor şi limbaje de programare I
Stream-uri de intrare şi operatorul de extracţie >> • Cele două declaraţii arată că cin este un obiect de tip istream şi cout este un obiect de tip ostream • În mod explicit, cin este asociat cu tastatura, iar cout cu display-ul • Trimiterea unor valori către cout se face folosind operatorul de inserţie<< cout << 3 * pret; • Similar, putem citi date din cin folosind operatorul de extracţie>> cin >> cost; Programarea calculatoarelor şi limbaje de programare I
Stream-uri de intrare şi operatorul de extracţie >> • Operatorul de extracţie >> are doi operanzi • În stânga se găseşte un stream, în cel mai simplu caz cin, iar în dreapta se găseşte o variabilă având un tip predefinit (char, int, float etc.). • Putem folosi operatorul de mai multe ori într-o instrucţiune cin >> lungime >> latime; • echivalentă cu cin >> lungime; cin >> latime; • cin poate fi folosit doar în combinaţie cu >> • cout poate fi folosit doar în combinaţie cu << Programarea calculatoarelor şi limbaje de programare I
Stream-uri de intrare şi operatorul de extracţie >> • Într-o instrucţiune de afişare putem folosi constante, variabile şi chiar expresii foarte complicate • Într-o instrucţiune de intrare nu putem folosi decât nume de variabile • O instrucţiune de intrare trebuie să precizeze clar unde se stochează valoarea unei date de intrare • Doar numele de variabile referă locaţii de memorie ale căror valori pot fi modificate în timpul execuţiei unui program Programarea calculatoarelor şi limbaje de programare I
Stream-uri de intrare şi operatorul de extracţie >> • Atunci când introducem o dată de la tastatură, trebuie să ne asigurăm că tipul introdus şi cel aşteptat de program se potrivesc • Un număr întreg este forţat automat la un număr real • Operaţia inversă poate conduce la rezultate eronate Programarea calculatoarelor şi limbaje de programare I
Stream-uri de intrare şi operatorul de extracţie >> • Când extrage valori dintr-un stream, operatorul >> ignoră orice spaţiu de la început • Ignoră caracterul care marchează sfârşitul liniei • Dacă data aşteptată este un char, intrarea se întrerupe după primul caracter • Dacă este vorba de un int sau double, intrarea se întrerupe la primul caracter care nu se potriveşte ca tip de dată, cum ar fi un spaţiu Programarea calculatoarelor şi limbaje de programare I
Stream-uri de intrare şi operatorul de extracţie >> • Exemplu int i, j, k; char ch; float x; Programarea calculatoarelor şi limbaje de programare I
Caracterul newline • Fiecare linie are un caracter invizibil care marchează sfârşitul său – caracterul newline • Pentru a determina următoarea valoare de intrare, operatorul >> trece peste caracterul newline, în cazul în care acesta există Programarea calculatoarelor şi limbaje de programare I
Caracterul newline • Atunci când utilizăm tastatura, caracterul newline este introdus prin apăsarea lui Return sau Enter • Programul poate genera un newline folosind manipulatorul endl într-o instrucţiune de ieşire • C++ putem să ne referim la caracterul newline folosind simbolurile \n Programarea calculatoarelor şi limbaje de programare I
Caracterul newline • Deşi \n constă din două caractere, el se referă la unul singur – caracterul newline • Aşa cum putem păstra litera A în variabila ch de tip char prin instrucţiunea char ch = ’A’; tot aşa putem păstra caracterul newline într-o variabilă ch = ’\n’; Programarea calculatoarelor şi limbaje de programare I
Caracterul newline • Exemplu Când avem o secvenţă de citiri, putem introduce valorile în mai multe feluri După citire, variabilele vor avea următoarele valori: i = 25 ch = ’A’ x = 16.9 Programarea calculatoarelor şi limbaje de programare I
Citirea datelor de tip caracter folosind instrucţiunea get • Operatorul >> ignoră orice spaţiu apărut în stream-ul de intrare • Exemplu Dacă ch1 şi ch2 sunt variabile de tip char, atunci când se execută instrucţiunea cin >> ch1 >> ch2; pentru stream-ul de intrare R 1 se va stoca R în ch1 şi 1 în ch2 • Ce se întâmplă, însă, dacă am fi dorit, de fapt, să introducem trei caractere: R, spaţiu şi 1? • Cu operatorul de extracţie acest lucru nu este posibil Programarea calculatoarelor şi limbaje de programare I
Citirea datelor de tip caracter folosind instrucţiunea get • Funcţia get încarcă următorul caracter fără a ignora spaţiile cin.get(ch); • Specificăm numele istream-ului, adică cin, apoi punem semnul . (punct) urmat de numele funcţiei şi lista ei de parametri • Apelul funcţiei get foloseşte sintaxa apelului funcţiilor void şi nu a celor care întorc o valoare • Acest apel de funcţie este, deci, o instrucţiune de sinestătătoare Programarea calculatoarelor şi limbaje de programare I
Citirea datelor de tip caracter folosind instrucţiunea get • Parametrul funcţiei get trebuie să fie o variabilă • Acesta este un exemplu prin care se apelează o funcţie din clasa istream – funcţia get – pentru un obiect al acestei clase – obiectul cin Programarea calculatoarelor şi limbaje de programare I
Citirea datelor de tip caracter folosind instrucţiunea get • Exemplu Pentru instrucţiunile cin.get(ch1); cin.get(ch2); cin.get(ch3); sau cin >> ch1; cin.get(ch2); cin >> ch3; şi stream-ul de intrare R 1 atunci variabilele ch1, ch2 şi ch3 vor stoca ch1 = ’R’; ch2 = ’ ’; ch3 = ’1’; Programarea calculatoarelor şi limbaje de programare I
Citirea datelor de tip caracter folosind instrucţiunea get • Exemple Programarea calculatoarelor şi limbaje de programare I
Ignorarea caracterelor folosind funcţia ignore • Funcţia ignore este asociată cu tipul de dată istream, fiind o funcţie definită în această clasa istream • Este folosită pentru a „sări” peste caractere din stream-ul de intrare • Este o funcţie cu doi parametri Programarea calculatoarelor şi limbaje de programare I
Ignorarea caracterelor folosind funcţia ignore • Exemplu cin.ignore(200, ’\n’); Acest apel al funcţiei spune calculatorului să ignore următoarele 200 de caractere de intrare sau să sară până întâlneşte caracterul newline, în funcţie de care dintre ele apare prima • Primul parametru este o expresie int, iar al doilea una char Programarea calculatoarelor şi limbaje de programare I
Exemple Ignorarea caracterelor folosind funcţia ignore Programarea calculatoarelor şi limbaje de programare I
Intrări şi ieşiri interactive • Un program interactiv este unul prin care utilizatorul comunică direct cu calculatorul • Atunci când dorim să cerem utilizatorului să introducă o dată în program, este util să îi afişăm înainte un mesaj prin care să îi explicăm ce trebuie să introducă • Programul ar trebui să tipărească toate datele introduse pentru ca utilizatorul să se poată verifica • Aceasta se numeşte tipărire în ecou Programarea calculatoarelor şi limbaje de programare I
Intrări şi ieşiri interactive #include <iostream> #include <iomanip> using namespace std; int main() { int codNumeric; int cantitate; double pretUnitar; double pretTotal; cout << "Introduceti codul numeric al produsului comandat:" << endl; cin >> codNumeric; cout << "Introduceti cantitatea:" << endl; cin >> cantitate; cout << "Introduceti pretul unitar pentru acest produs:" << endl; cin >> pretUnitar; pretTotal = cantitate * pretUnitar; cout.setf(ios::fixed, ios::floatfield); cout << "Produsul " << codNumeric << ", cantitatea " << cantitate << ", pretul unitar " << setprecision(2) << pretUnitar << " lei " << endl; cout << "Total: " << pretTotal << endl; return 0; } Programarea calculatoarelor şi limbaje de programare I
Intrări şi ieşiri interactive • În timpul rulării acestui program se va tipări câte un text care va arăta utilizatorului care este următoarea valoare aşteptată Introduceti codul numeric al produsului comandat 4671 Introduceti cantitatea: 10 Introduceti pretul unitar pentru acest produs: 272.55 Produsul 4671, cantitatea 10, pretul unitar 272.55 lei Total: 2725.50 Programarea calculatoarelor şi limbaje de programare I
Intrări şi ieşiri neinteractive • Deşi tindem să dăm exemple de programe interactive, multe dintre programele folosite în viaţa reală sunt neinteractive • Acestea sunt programe care prelucrează cantităţi mari de date, greu de introdus interactiv fără erori • Pentru acest tip de programe, datele se păstrează în fişiere de date pregătite anterior • Aceasta permite verificare şi corectarea datelor înainte de rularea programului Programarea calculatoarelor şi limbaje de programare I
Sumar • Transmiterea datelor către programe • Intrări şi ieşiri din fişiere • Erori de citire • Scrierea aplicaţiilor Programarea calculatoarelor şi limbaje de programare I
Intrări şi ieşiri din fişiere • Fişierul este o zonă pe un suport de stocare, de exemplu hard disc, desemnată printr-un nume, care păstrează o colecţie de date, de exemplu codul programului scris cu un editor • Un program poate citi datele dintr-un fişier în aceeaşi manieră în care le citeşte de la tastatură • Se poate scrie în fişier la fel cum se scrie pe ecran Programarea calculatoarelor şi limbaje de programare I
Modul de utilizare a fişierelor • Cerem preprocesorului să includă fişierul header fstream • Folosim instrucţiuni de declarare pentru a declara stream-urile • Pregătim fişierele pentru citire şi scriere prin instrucţiunea open • Specificăm numele stream-ului în fiecare instrucţiune de citire sau de scriere Programarea calculatoarelor şi limbaje de programare I
1. Includerea fişierului header fstream #include <fstream> using namespace std; int main() { float cant1; float cant2; float cant3; float cant4; float indicatiePlecare; float indicatieSosire; float litriPerKm; ifstream inConsum; ofstream outConsum; inConsum.open("incons.dat"); outConsum.open("outcons.dat"); inConsum >> cant1 >> cant2 >> cant3 >> cant4>> indicatiePlecare >> indicatieSosire; litriPerKm = (cant1 + cant2 + cant3 + cant4)*100.0/(indicatieSosire - indicatiePlecare); outConsum << "Consumul este " << litriPerKm<< " litri per km." << endl; return 0; } Programarea calculatoarelor şi limbaje de programare I
1. Includerea fişierului header fstream • Se foloseşte directiva de preprocesare #include <fstream> • Prin acest header se definesc două noi tipuri de date • ifstream • ofstream • Cele două tipuri de dată reprezintă, primul, un stream de caractere provenind de la un fişier, iar al doilea un stream de caractere care conduce către un fişier • Pentru tipulifstreamrămân valabile operaţiile • >> • get • ignore • Pentru tipul ofstream se pot folosi • << • endl • Setw • setprecision Programarea calculatoarelor şi limbaje de programare I
2. Declararea stream-urilor pentru fişiere • Obiectele de tip stream se declară la fel ca orice variabilă • Exemplu int unInt; float unFloat; ifstream unFisier; ofstream altFisier; Programarea calculatoarelor şi limbaje de programare I
2. Declararea stream-urilor pentru fişiere • Obiectele cin şi cout nu trebuie declarate în fiecare program pentru că ele sunt declarate în fişierul iostream • Stream-urile pentru lucrul cu fişiere trebuie declarate în program pentru că fiecare aplicaţie foloseşte propriile fişiere de date Programarea calculatoarelor şi limbaje de programare I
2. Declararea stream-urilor pentru fişiere • În programul anterior am declarat ifstream inConsum; ofstream outConsum; • ifstream se utilizează doar pentru fişiere de intrare • ofstreamse foloseşte doar pentru fişiere de ieşire • Prin intermediul unui obiect ifstream se pot face doar citiri • Prin intermediul unui obiect ofstream se pot face doar scrieri Programarea calculatoarelor şi limbaje de programare I
3. Deschiderea fişierelor • Pregătirea fişierelor pentru citire sau scriere se numeşte deschidere • Ne propunem să citim din stream-ul tip fişier inConsum şi să scriem în stream-ul outConsum • Deschidem fişierele folosind următoarele instrucţiuni: inConsum.open("incons.dat"); outConsum.open("outcons.dat"); • Funcţia open asociază variabila stream din program cu un fişier fizic pe disc • Prima instrucţiune este un apel al funcţiei open asociate cu tipul de dată ifstream • A doua apelează funcţia open asociată cu ofstream Programarea calculatoarelor şi limbaje de programare I
3. Deschiderea fişierelor • Pentru un fişier de intrare, funcţia open poziţionează markerul de citire pe primul element din fişier • Pentru un fişier de ieşire, funcţia verifică dacă acesta există • Dacă există, şterge vechiul conţinut al său • Dacă nu există, îl creează • Apoi markerul de scriere este aşezat pe prima poziţie Programarea calculatoarelor şi limbaje de programare I
3. Deschiderea fişierelor • Exemplu inConsum outConsum 23.2 _ 17.4 19.8 16.7 22451 23544 • Deschiderea fişierelor trebuie realizată înaintea oricărei utilizări a lor deoarece funcţia open le pregăteşte pentru citire sau scriere Programarea calculatoarelor şi limbaje de programare I
4. Specificarea stream-urilor în instrucţiuni I/O • Pentru citirea şi scrierea din fişier se înlocuiesc obiectele cin şi cout cu obiectele de tip stream de fişier declarate mai devreme • Exemplu inConsum >> cant1 >> cant2 >> cant3 >> cant4 >> indicatiePlecare >> indicatieSosire; outConsum << "Consumul este " << litriPerKm << " litri per km." << endl; • C++ foloseşte o sintaxă uniformă pentru operaţiile I/O, indiferent dacă este vorba despre fişiere sau dispozitive I/O Programarea calculatoarelor şi limbaje de programare I
Sumar • Transmiterea datelor către programe • Intrări şi ieşiri din fişiere • Erori de citire • Scrierea aplicaţiilor Programarea calculatoarelor şi limbaje de programare I
Erori de citire • La citirea datelor de la tastatură sau dintr-un fişier pot apărea erori • Dacă programul ne cere să introducem un număr întreg, iar noi introducem caractere,operaţia de intrare eşuează datorită datelor de intrare invalide • În terminologia C++ stream-ul cin intră într-o stare de eroare - fail state • Dacă un stream intră într-o astfel de stare, orice altă operaţie ulterioară asupra sa este anulată Programarea calculatoarelor şi limbaje de programare I
Erori de citire • De cele mai multe ori erorile de intrare apar din cauza nepotrivirii tipurilor de dată. • Exemplu int i = 10; int j = 20; int k = 30; cin >> i >> j >> k; cout << “i: “ << i << “j: “ << j << “k: “ << k; Dacă tastăm 1234.56 7 89 programul afişează i: 1234 j: 20 k: 30 Programarea calculatoarelor şi limbaje de programare I
Erori de citire • Un alt motiv pentru care un stream intră în fail state este incercarea de deschidere a unui fişier de intrare care nu există • Exemplu Să presupunem că avem pe disc fişierul myfile.dat şi scriem următoarele instrucţiuni care îşi propun să lucreze cu acest fişier: ifstream inFisier; inFisier.open(”myfil.dat”); inFisier >> i >> j >> k; Datorită scrierii incorecte a numelui de fişier, inFisier va intra în fail state Ca urmare, variabilele i, j şi k vor avea nişte valori nedeteminate Programarea calculatoarelor şi limbaje de programare I
Sumar • Transmiterea datelor către programe • Intrări şi ieşiri din fişiere • Erori de citire • Scrierea aplicaţiilor Programarea calculatoarelor şi limbaje de programare I
Scrierea aplicaţiilor • Cunoştinţele de până acum ne permit să scriem şi aplicaţii mai complexe şi de aceea trebuie să vedem cum putem concepe corect o aplicaţie • Vom prezenta • descompunerea funcţională • proiectarea orientată pe obiecte Programarea calculatoarelor şi limbaje de programare I
Descompunerea funcţională • Această este o tehnică de dezvoltare a unei părţi a unui program sau chiar a unui program de dimensiuni reduse prin care • problema este împărţită în subprobleme mai uşor de rezolvat • soluţii acestora creează o soluţie globală a întregii probleme • Printr-o astfel de descompunere creăm o structură ierarhică numită structură arborescentă Programarea calculatoarelor şi limbaje de programare I
Rezolvarea problemei abstract Pas I Pas II Pas III Nivelul 0 pas abstract Subproblema I Subproblema II Subproblema III Pas A Pas B Nivelul 1 Subproblema A Subproblema B Subproblema C Subproblema F Pas 1 Pas 4 Pas 7 Nivelul 2 Pas 8 Pas 5 Pas 6 Subproblema 2 pas concret Pas a Pas b Nivelul 3 Pas c concret Pas C Pas 2 Pas E Pas 3 Pas D Pas F Descompunerea funcţională Programarea calculatoarelor şi limbaje de programare I