curs infoacademy c++

Upload: mvpro-mvp

Post on 18-Jul-2015

1.452 views

Category:

Documents


19 download

TRANSCRIPT

Adonis Butufei

1. INTRODUCERECUPRINS1.Introducere.................................................................................................................................................2 1.1 Roata invatarii....................................................................................................................................2 1.1.1 Intrebare......................................................................................................................................2 1.1.2 Teoria..........................................................................................................................................2 1.1.3 Aplicarea teoriei..........................................................................................................................2 1.1.4 Reflectia......................................................................................................................................3 1.2 Cele cinci dificultati ale programatorului incepator...........................................................................3 1.3 Organizarea cursului...........................................................................................................................4 1.4 Limbaje de programare: tipuri si caracteristici.................................................................................4 1.4.1 Ce este un limbaj de programare?..............................................................................................4 1.4.2 Generatiile limbajelor de programare.........................................................................................4 1.5 Ce este C++?......................................................................................................................................6 1.5.1 Modelele de programare suportate de C++................................................................................6 1.5.2 Documentatia online pentru limbajul C++.................................................................................7 1.6 Ciclul de viata al programelor software.............................................................................................8 1.6.1 Procesul programarii...................................................................................................................8 1.6.2 Metodologii de dezvoltare a programelor..................................................................................8 1.6.2.1 Programeaza si depaneaza .................................................................................................8 1.6.2.2 Spirala.................................................................................................................................9 1.7 Medii de dezvoltare integrata (IDE)...................................................................................................9 1.8 Scrierea primului program...............................................................................................................10 1.8.1 Crearea proiectului n Visual C++............................................................................................10 1.8.2 Scrierea codului........................................................................................................................14 1.8.3 Compilarea programului...........................................................................................................15 1.9 Sumar...............................................................................................................................................15 1.10 Intrebari si exercitii........................................................................................................................15 1.11 Bibliografie.....................................................................................................................................16

1 1

Adonis Butufei

1. INTRODUCERE1.1 Roata invatarii

Invatarea unui limbaj de programare presupune pe langa o implicare activa in lectura cartilor de specialitate si activitati practice de scriere a codului si depanare a programelor. Simpla intelegere intelectuala a conceptelor nu este suficienta. Pentru fixarea cunostintelor si formarea deprinderilor este necesara aplicarea acestor cunostinte atat in timpul studiului dar mai ales dupa aceea. Fara o repetare periodica a conceptelor notiunile invatate sunt uitate. Roata invatarii este un sistem format din patru pasi care permite asmilarea si fixarea cunostintelor in mod eficient: intrebarea, teoria, testarea teoriei si reflectia. Aceste etape se pot aplica pentru intregul studiu cat si pentru fiecare concept in parte.

1.1.1

Intrebare

In aceasta etapa se clarifica scopul invatarii si permite canalizarea eforturilor intr-o directie precisa. De ce vreau sa invat un limbaj de programare? Ce anume vreau sa stiu? (stabilit cat mai detaliat). Ce anume trebuie sa fac pentru a invata? Cat de multe resurse sunt dispus sa aloc pentru invatare? Cum stiu ca am invatat? Ce stiu deja despre acest subiect? Scopul acestei intrebari este de a constientiza ce stiu si ce am nevoie sa invat. De unde pot afla ceea ce nu stiu? Care sunt sursele corecte de informare de care dispun?

1.1.2

Teoria

Dupa ce am stabilit scopul si am decis ce material se potriveste cu nivelul de intelegere este necesara studierea teoriei din acele materiale. Studiul cartilor de obicei se refera la citirea si intelegerea textului. Studiul programarii presupune scrierea de cod. Pentru a putea scrie cod este necesara mai intai invatarea sintaxei1 si apoi citirea unor exemple.Urmatorul set de intrebari ne ajuta sa participam activ in parcurgerea materialului intr-un timp mai scurt: Cum este organizat materialul? Care este ideea prinpcipala? Care sunt termenii si conceptele? Ce informatie este importanta aici? Ce intrebari imi ridica aceasta informatie (Cine? Ce? Unde? Cand? De ce? Cum?) Cum pot reformula si sumariza informatia? Cum pot reorganiza informatia pentru a raspunde nevoilor mele? Cum pot vizualiza informatia? (harti mentale 2, diagrame, tabele) Cum se incadreaza aceasta informatie in ceea ce stiu deja?

1.1.3

Aplicarea teoriei

Rularea exemplelor. Aceasta etapa presupune scrierea manuala a exempelor (fara copy/paste). In momentul scrierii codului mintea poate asimila detaliile. Este posibil sa apara erori de compilare3 datorita unor greseli de scriere. Aceasta este un prilej foarte bun de invatare a sintaxei.1 Scrierea programelor presupune respectarea anumitor reguli similare cu cele gramaticale. 2 Mind-map. 3 Compilarea reprezinta transformarea codului scris in fisier care poate fi executat de calculator.

2 2

Adonis Butufei Folosirea debuggerului4 pentru rularea programelor pas cu pas si verificarea codului scris. Scrierea codului propriu, schimb exemplele, vad ce se intampla. Identificarea lucrurilor pe care nu le inteleg. Reformularea lor in cuvinte proprii. Adresarea intrebarilor detaliate.

1.1.4

Reflectia

Aceasta etapa ajuta la organizarea intelegerii si la internalizarea cunoasterii. Urmatorul set de intrebari poatre ajuta la definirea contextului: Care este sintaxa? Care este tiparul aici? Exista cazuri speciale? Daca schimb asta ce altceva se mai schimba? In cate feluri diferite pot rezolva aceasta problema? Exista o solutie mai simpla? Se pot rezolva si alte probleme cu ce am invatat?

1.2

Cele cinci dificultati ale programatorului incepator1.1. Alegerea limbajului de programare. 1.2. Alegerea unui mediu de dezvoltare. 1.3. Alegerea unui tutorial.

1. Materialele necesare:

2. Formarea modului de gandire al programatorului: 2.1. La inceput prin imitarea pasilor prezentati in tutorial si aplicand roata invatarii. 2.2. Separarea unei probleme complexe in probleme mai simple. 2.3. Recunoasterea unor tipare similare in probleme diferite. 3. Mesajele de eroare 3.1. La inceput necesita un efort de intelegere. 3.2. Cu timpul ele devin elemente ajutatoare care permit scrierea programelor la un standard de calitate profesional. 4. Depanarea programelor 4.1. Este o abilitate importanta care se poate froma. 4.2. Permite verificarea corectitudinii.

4 Debuggerul este un program care permite rularea programului pas cu pas.

3 3

Adonis Butufei 5. Designul programelor 5.1. Cum se organizeaza codul programelor pentru a obtine functionalitatea dorita. 5.2. Cum se descompun problemele complexe intr-un set minimal de probleme simple. 5.3. Este o activitate care se dezvolta odata cu formarea modului de gandire al programatorului.

1.3

Organizarea cursului

Cursul este organizat in 15 capitole. Fiecare capitol cuprinde un set de intrebari si exercitii care vor permite asimilarea si evaluarea cunostintelor. De asemenea, pe masura introducerii conceptelor vor fi oferite si recomandari practice care vor asigura scrierea unui cod de calitate. Pentru o mai buna asimilare, notiunile vor fi introduse de la ansamblu catre detalii. In primul capitol sunt prezentate notiunile introductive legate de limbaje de programare si mediu de dezvoltare. Vom incepe prin a defini limbajele de programare. Apoi vom explora generatiile limbajelor de programare, vom analiza modelele de programare suportate de C++, vom trece in revista cateva elemente legate de ciclul de viata al programelor software. La final vom crea primul program folosind mediul de dezvoltare Visual C++ Express Edition.

1.4 1.4.1

Limbaje de programare: tipuri si caracteristici Ce este un limbaj de programare?

Un limbaj de programare contine un set de reguli si expresii care permit scrierea programelor. Programele descriu pasii pentru rezolvarea unor probleme. Fiecare pas este exprimat in comenzi care sunt executate de calculator.

1.4.2

Generatiile limbajelor de programare

Prima generatie Programele din aceasta generatie erau scrise la inceput in limbaj binar, care putea fi procesat direct de calculatoare. Pentru imbunatatirea productivitatii au fost create limbajele de asamblare. Aceste tipuri de limbaje contineau un set de instructiuni specifice tipului de calculator. Pentru a transfera programul pe alt tip de calculator era necesara rescrierea lui folosind un nou set de instructiuni. A doua generatie Aceasta generatie a aparut cu limbajul FORTRAN. El permitea scrierea programului folosind un set de instructiuni care erau mai usor de scris si depanat si erau independente de platforma hardware pe care lucrau. Pentru a putea fi rulat pe o masina, codul scris de programator trebuia transformat in instructiuni binare (cod obiect) si aceasta se realiza cu ajutorul unui program numit compilator. Deoarece codul sursa putea avea mai multe fisiere, dupa compilare rezultau mai multe fisiere binare care trebuiau grupate impreuna pentru a crea programul. Aceasta se realiza cu ajutorul unui program numit linker. Pentru a putea fi transferat pe o alta platforma hardware programul trebuia recompilat cu un 4 4

Adonis Butufei compilator specific acelei platforme. A treia generatie Daca a doua generatie a imbunatatit structura logica a limbajelor, a treia generatie a devenit mult mai usor accesibila dezvoltatorilor. Multe limbaje de uz general folosite astazi, BASIC, C, C++, Java, C# apartin acestei generatii. Brian Kernighan si Denis Richie au creat limbajul de programare C. Acest limbaj a fost folosit pentru rescrierea sistemului de operare UNIX care avut un succes deosebit. Multe platforme hardware au adoptat variante ale acestui sistem de operare. Dupa raspandirea acestui sistem de operare, scrierea programelor a devenit mult mai usoara pentru ca dezvoltatorii nu mai erau nevoiti sa interactioneze direct cu particularitatile platformei hardware ci cu resursele oferite de sistemul de operare. In aceasta generatie, pe langa compilatoare, care transformau intregul program in comenzi binare, au aparut interpretoarele care executau programul instructiune cu instructiune. Acest mod de lucru permitea obtinerea raspunsului imediat fara a mai fi necesara compilarea. Este potrivit pentru interactiunea cu sistemul de operare. Probabil fiecare am deschis un comand prompt in Windows si am executat comenzi pentru a rezolva anumite probleme simple. Deoarece procesul de compilare pentru programele mari era consumator de timp, dezvoltatorii s-au gandit oare nu putem sa facem ceva invers? In loc sa compilam codul in limbaj binar, sa dezvoltam un program care sa fie capabil sa execute comenzi complexe si compilarea sa se execute in momentul executiei. Asa au aparut masinile virtuale care erau capabile sa execute comenzi si compilatoarele Just in time folosite de limbajele Small Talk, Java si mai tarziu C#. In acest mod era suficient sa se implementeze o masina virtuala pentru fiecare platforma iar codul scris in acel limbaj putea, cel putin teoretic, sa fie rulat pe toate platformele. A patra generatie Cu limbajele de uz general din a treia generatie puteau fi dezvoltate o multitudine de programe. Insa pentru anumite domenii specifice cum ar fi interogarea bazelor de date, calcule statistice si altele nu era eficienta folosirea acestor limbaje. Din acest motiv, limbajele din a patra generatie s-au concentrat pe rezolvarea problemelor specifice unor domenii. Scopul acestor limbaje este sa reduca eforturile si costurile de dezvoltare a programelor, oferind un nivel inalt de abstractizare al domeniului respectiv. Cateva exemple de limbaje: FoxPro, SQL, PL/SQL, LabView, S, R, Mathematica, ABAP. A cincea generatie Aceste limbaje sunt dezvoltate cu intentia de a lasa programul sa rezolve probleme fara interventia programatorului si sunt folosite in cercetarile legate de inteligenta artificiala. Eforturile in acest domeniu au ramas inca in faza cercetarilor. Cateva exemple de limbaje: Prolog, OPS5, Mercury.

5 5

Adonis Butufei

1.5

Ce este C++?

Asa cum am vazut in paragraful anterior C++ este un limbaj care apartine generatiei a treia. A fost creat de Bjarne Strostrup in anul 1980. Dupa cum o sugereaza si numele, este bazat pe limbajul C si ofera imbunatatiri radicale acestui limbaj. In mai bine de trei decenii de existenta limbajele C si C++ s-au influentat si completat reciproc. De ce a fost ales C ca limbaj de baza pentru C++? Pentru ca este un limbaj eficient si permite dezvoltarea apropiata de nivelul masina. Pentru ca oferea solutia optima pentru cele mai multe activitati de programare. Pentru ca ruleaza pe orice platforma hardware.

1.5.1

Modelele de programare suportate de C++

Programare procedurala Aceasta model imparte functionalitatea programului in proceduri (functii) si foloseste algoritmii optimi pentru implementarea functiilor. Atentia principala este indreptata catre transmiterea si returnarea rezultatelor. Programare modulara Pe masura ce dimensiunea si complexitatea programelor creste, apare necesitatea unei organizari la nivel mai inalt. Functionalitatea este impartita in module. Aceste module contin datele si procedurile care lucreaza cu aceste date. Abstractizarea datelor Progamarea modulara este un aspect pentru toate programele mari de succes. Pe masura ce aceste programe cauta sa rezolve probleme reale, exprimarea conceptelor este destul de dificila folosind doar tipurile de date oferite de limbajul de programare. Pentru a rezolva acest aspect C++ asigura dezvolatorilor posibilitatea definirii propriilor tipuri de date. Acestea se numesc tipCuri abstracte de date sau tipuri definite de utilizator. Programare obiectuala Abstractizarea datelor este un element esential al designului de calitate. Totusi, doar tipurile utilizator nu rezolva o serie de aspecte importante ale programelor reale. Primul aspect important al programarii obiectuale este incapsularea. Aceasta se realizeaza prin gruparea datelor care descriu un concept cu functiile care acceseaza acele date intr-o clasa. Mai mult, accesul la unele date este permis numai functiilor clasei. Este foarte usor sa intelegem acest concept daca privim in jur la toate dispozitivele inconjuratoare. De exemplu o telecomanda: toata complexitatea functionarii este ascunsa utilizatorului care o foloseste. Acesta poate interactiona prin intermediul tastaturii (interfetei) oferite pentru indeplinirea obiectivelor.

6 6

Adonis Butufei Al doilea aspect important al programarii obiectuale este mostenirea. Mostenirea permite extinderea unei clase si adaugarea de alte functionalitati. Acest mecanism, folosit corect, permite reutilizarea codului intr-un grad mult mai mare decat era posibil folosind modelele anterioare. De exemplu putem avea o clasa Angajat. Deoarece un manager este un angajat dar are atributii diferite de ale angajatului putem deriva clasa Manager si adauga functionalitatea specifica, asa cum este schitat in exemplul de mai jos. Clasa Angajat se numeste clasa de baza, sau parinte pentru clasa Manager. Clasa Manager se numeste clasa derivata. Al treilea aspect important al programarii obiectuale este polimorfismul. Acest mecanism permite claselor derivate sa specializeze comportamentul claselor de baza. De exemplu tramvaiul si autobuzul sunt ambele mijloace de transport n comun. Toate mijoloacele de transport n comun se deplaseaza intre statii. Modul n care se realizeaza aceasta deplasare difera si polimorfismul ne ajuta sa implementam diferit deplasarea intre statii pentru autobuz si tramvai. Programare generica Aplicarea programarii obiectuale in productie a permis reducerea timpului de dezvoltare a proiectelor de la luni la saptamani si de la ani la trimestre. De asemenea, a permis dezvoltarea mai eficienta a versiunilor urmatoare ale programelor lansate pe piata. Exista tipuri de prelucrari care sunt similare indiferent de tipul de date asupra carora se executa aceste prelucrari. O stiva de caramizi si o stiva de farfurii folosesc acelasi tipar de organizare a elementelor. Folosind programarea generica putem implementa tiparul, stiva, o singura data si apoi sa-l folosim pentru diferite tipuri de date.

1.5.2

Documentatia online pentru limbajul C++

Acest curs prezinta elementele de baza ale limbajului. Pentru informatii detaliate despre limbaj, aprofundarea cunostintelor si rezolvarea problemelor practice este necesara consultarea documentatiei online. In aceasta sectiune sunt recomandate sursele de informare utile: 1. Documentatia standard C++ poate fi consultata la: http://www.cplusplus.com/. Acest site contine informatii de referinta legate in C++. 2. O alta sursa importanta de informatii despre programarea C++ se gaseste la: http://www.cprogramming.com/ 3. Informatii introductive pot fi gasite la: http://www.cpp4u.com/ 4. C++ FAQ5 pot fi gasite la: http://www.parashift.com/c++-faq-lite/ 5. Danny Kalev are un blog cu informatii utile despre C++ care poate fi accesat la: http://www.informit.com/guides/guide.aspx?g=cplusplus

5 Intrebari frecvente despre C++, este o versiune online a unei carti excelente C++ FAQ de Marshall Cline

7 7

Adonis Butufei

1.6 1.6.1

Ciclul de viata al programelor software Procesul programarii

Dezvoltarea programelor nu trebuie sa se desfasoare intamplator. Progamarea este mai mult decat scrierea codului. Intelegerea ciclului de viata este importanta pentru ca in profesia de programator numai o mica parte din timp este petrecuta cu scrierea codului nou. O parte insemnata a timpului este petrecuta cu modificarea, depanarea codului existent. Programele trebuie documentate, mentinute, dezvoltate si vandute. Etapele majore ale dezvotarii unui program sunt: 1. Design Programatorul va face designul codului. Designul va contine algoritmii principali, clasele, modulele, formatul fisierelor si structurile de date. Modularitatea si incapsularea prezentate anterior sunt elementele cheie ale unui design bun. 2. Implementarea In aceasta etapa se scrie codul care implementeaza designul. 3. Testarea Programatorul trebuie sa defineasca un plan de testare si sa-l foloseasca pentru testarea codului. Acesta este primul nivel al testarii. Urmatorul este trimiterea codului echipei testare a calitatii. 4. Depanarea Datorita complexitatii programelor este o foarte mica sansa ca implementarea sa fie fara defecte. Depanarea este procesul de corectare a defectelor programului. In practica sunt necesare mai multe treceri prin fiecare etapa pana la finalizarea unui proiect.

1.6.2

Metodologii de dezvoltare a programelor

De-a lungul timpului, in dezvoltarea programelor au fost folosite mai multe metodologii de dezvoltare. Vom examina mai jos doua dintre cele mai raspandite.1.6.2.1 Programeaza si depaneaza

Acest model este foarte raspandit. Daca nu folositi in mod explicit alt model probabil ca acesta este cel implicit. Acest model porneste cu o idee despre ce trebuie implementat. Este posibil sa aveti o specificatie formala sau nu. Dupa aceea, se foloseste orice combinatie de design, implementare, depanare si testare pana produsul este gata de lansare. Avantajele acestui model: Nu prezinta nicio complicatie deoarece nu se consuma timp cu planificare, documentatie, testarea calitatii. Singura activitate este scrierea codului. Necesita foarte putina expertiza. Oricine a scris vreodata un program il poate folosi. Acest model poate fi util pentru: proiecte foarte mici, de verificare a unui concept, demo, sau prototipuri care se abandoneaza. 8 8

Adonis Butufei

Pentru orice alt tip de proiect, acest model este periculos. Poate sa nu aduca nicio complicatie dar, de asemenea, nu aduce nicio modalitate de evaluare a progresului, calitatii sau identificarii riscurilor. Este posibil ca dupa aproape un an de munca sa constatam ca designul este fundamental gresit si singura solutie este sa aruncam codul si sa o luam de la inceput pe cand alte modele ar fi putut detecta aceasta mult mai devreme.1.6.2.2 Spirala

Acest model constituie una din cele mai bune abordari practice a dezvoltarii programelor deoarece se orienteaza pe reducerea riscurilor. Fiecare proiect este descompus in mini proiecte. Fiecare miniproiect adreseaza unul sau mai multe riscuri majore pana ce toate riscurile au fost adresate. In acest context riscurile pot fi reprezentate de intelegerea defectuoasa a cerintelor, arhitecturii, problemelor de performanta, problemelor tehnologice etc. Fiecare iteratie este compusa din cinci pasi: 1. Determinarea obiectivelor, alternativelor si constrangerilor 2. Indentificarea si adresarea riscurilor 3. Evaluarea alternativelor 4. Implementarea codului pentru iteratie si verificarea corectitudinii 5. Planificarea iteratiei urmatoare

1. Determinare obiective

Progres

2. identificare si adresare riscuri

3. Evaluare alternative

3

2

1

Livrare 5. Planificarea noii faze 4. Implementare si verificare

9 9

Adonis Butufei Acest model se poate combina cu alte modele in mai multe moduri. Se poate incepe proiectul cu cateva iteratii ale spiralei pentru reducerea riscurilor dupa aceea se schimba modelul. Se pot incorpora alte modele in iteratiile spiralei.

1.7

Medii de dezvoltare integrata (IDE)

Mediile de dezvoltare integrata sunt programe care reduc eforturile de dezvoltare. Ele cuprind printre altele functionalitati de editare a codului, organizarea fisierelor, compilare, depanare. Pentru acest curs vom folosi varianta free a mediului Visual C++ 2010 Express edition. Aceasta varianta se poate downloada de la http://www.microsoft.com/visualstudio/en-us/products/2010-editions/visualcpp-express. Dupa instalare, la prima rulare, este necesara introducerea unui cod de inregistrare care se obtine de pe site-ul Microsoft urmarind indicatiile. Documentatia detaliata pentru Visual C++ se poate accesa online de la adresa: http://msdn.microsoft.com/en-us/library/60k1461a.aspx. Fisierele programelor, in Visual C++ sunt organizate intr-un proiecte. Unul sau mai multe programe pot fi organizate in solutii. Solutiile sunt fisiere create de Visual C++ care au extensia sln.

10 10

Adonis Butufei

1.8 1.8.1

Scrierea primului program Crearea proiectului n Visual C++

In incheierea acestei lectii vom scrie un program care afiseaza clasicul Hello World! pe ecran. Pentru aceasta vom lansa Visual C++.

Din meniul File alegem New project, selectam Win32 din lista de Project Templates si Win32 Console Application.

11 11

Adonis Butufei

Apoi introducem numele proiectului HelloWorld si apasam butonul OK6.

Apasam next in dialogul care se afiseaza6 In cazul proiectelor de laborator, pentru primul proiect vom selecta Create directory for solution si vom introduce numele laboratorului in campul Solution Name

12 12

Adonis Butufei

Si apoi verificam daca avem selectat Console application, selectam Empty Project si apasam finish.

13 13

Adonis Butufei Acum va trebui sa cream fisierul programului. Pentru aceasta selectam folderul Source Files si dam click cu butonul din dreapta.

Alegem C++ file (.cpp), introducem numele HelloWorld.cpp si apasam Add.

14 14

Adonis Butufei

1.8.2

Scrierea codului

Acum trebuie sa scriem urmatorul cod in HelloWorld.cpp.1: #include 2: using namespace std; 3: 4: int main () 5: { 6: 7: 8: } cout