Sunteți pe pagina 1din 29

Limbajul C++ Elemente de baza ale limbajului 1 Structura programelor C++ 2 Elemente lexicale 3 Date in C++ 4 Operatori 5 Implementarea

structurilor de control Instructiunea vida, if si switch Instructiuni repetitive 6 Siruri de caractere 7 Tablouri unuidimensionale (vectori) http://infoscience.3x.ro/c++.html Elemente de baza ale limbajului C++ La inceputul anulor 70 a aparut limbajul C, creatia lui Dennis Ritchie si Brian Kernighan. Limbajul C++ -creatia lui Bjarne Stroustrup- e o extensie a limbajului C care permite programarea pe obiecte.
Limbajul C a aprut n anii 1970 i a fost creat de Dennis Ritchie n laboratoarele AT&T Bell. Limbajul C face parte din familia de limbaje concepute pe principiile programrii structurate, la care ideea central este structureaz pentru a stpni o aplicaie. Popularitatea limbajului a crescut rapid datorit eleganei i a multiplelor posibiliti oferite programatorului (puterea i flexibilitatea unui limbaj de asamblare); ca urmare, au aprut numeroase alte implementri. De aceea, n anii 80 se impune necesitatea standardizrii acestui limbaj. n perioada 1983-1990, un comitet desemnat de ANSI (American National Standards Institute) a elaborat un compilator ANSI C, care permite scrierea unor programe care pot fi portate fr modificri, pe orice sistem.

Limbajul C++ apare la nceputul anilor 80 i l are ca autor pe Bjarne Stroustrup. El este o variant de limbaj C mbuntit, mai riguroas i mai puternic, completat cu construciile necesare aplicrii principiilor programrii orientate pe obiecte (POO). Limbajul C++ pstreaz toate elementele limbajului C, beneficiind de eficiena i flexibilitatea acestuia. Limbajul C++ este un superset al limbajului C. Incompatibilitile sunt minore, de aceea, modulele C pot fi ncorporate n proiecte C++ cu un efort minim. Structura programelor C/ C++ Un program scris n limbajul C (sau C++) este compus din unul sau mai multe fiiere surs. Un fiier surs este un fiier text care conine codul surs (n limbajul C) al unui program. Fiecare fiier surs conine una sau mai multe funcii i eventual, referine ctre unul sau mai multe fiiere header .

Funcia principal a unui program este numit main. Execuia programului ncepe cu execuia acestei funcii, care poate apela, la rndul ei, alte funcii. Toate funciile folosite n program trebuie descrise n fiierele surs (cele scrise de ctre programator), n fiiere header (funciile predefinite, existente n limbaj), sau n biblioteci de funcii. Un fiier header este un fiier aflat n sistem sau creat de ctre programator, care conine declaraii i definiii de funcii i variabile. Aciunile din fiecare funcie sunt codificate prin instruciuni . Exist mai multe tipuri de instruciuni, care vor fi discutate n capitolul urmtor. O instruciune este orice expresie valid (de obicei, o asignare sau un apel de funcie), urmat de simbolul ;. n figura 2.2.b. este dat un exemplu de instruciune simpl. Uneori, ca instruciune poate apare instruciunea nul (doar ;), sau instruciunea compus (privit ca o succesiune de instruciuni simple, ncadrate ntre acoladele delimitatoare {}.

FUNCII Instruciunea1 Instruciunea2 Instruciunea3

INSTRUCIUNI Expresie;

EXPRESII Operanzi

. . . .
2.2.a. 2.2.b.

Operatori 2.2.c.

Figura 2.2. Funcie, instruciune, expresie

Functiile trebuie descrise fie in fisierele sursa, fie in fisiere separate numite fisiere header, fie in biblioteci de functii Functia main are urmatoarea forma: void main( ) {instructiuni; }
Pentru a nelege mai bine noiunile prezentate, s considerm un exemplu foarte simplu. Programul urmtor afieaz pe ecran un mesaj (mesajul Primul meu program). Informaia de prelucrat (de intrare) este nsui mesajul (o constant ir), iar prelucrarea ei const n afiarea pe ecran. Exemplu: #include <iostream.h> // linia 1 void main() // linia 2 antetul funciei main { /* linia 3 - nceputul corpului funciei, a unei intruciuni compuse */ cout<<Primul meu program in limbajul C++; // linia 5 } // linia6sfritul corpului funciei Prima linie este o directiv preprocesor (indicat de simbolul #) care determin includerea n fiierul surs a fiierului header cu numele iostream.h. Acest header permite realizarea afirii pe monitor. Programul conine o singur funcie, funcia principal, numit main, al crui antet (linia 2) indic: - tipul valorii returnate de funcie (void, ceea ce nseamn c funcia nu returneaz nici o valoare) - numele funciei (main) - lista argumentelor primite de funcie, ncadrat de cele 2 paranteze rotunde. Funciile comunic ntre ele prin argumente. Aceste argumente reprezint datele de intrare ale funciei. n cazul nostru, nu avem nici un argument n acea list, deci puteam s scriem antetul funciei i astfel:

void main(void)
Ceea ce urmeaz dup simbolul //, pn la sfritul liniei, este un comentariu, care va fi ignorat de ctre compilator. Comentariul poate conine un text explicativ; informaii lmuritoare la anumite aspecte ale problemei sau observaii. Dac vrem s folosim un comentariu care cuprinde mai multe linii, vom delimita nceputul acestuia indicat prin simbolulurile /*, iar sfritul - prin */ (vezi liniile 3, 4). Introducerea comentariilor n programele surs uureaz nelegerea acestora. n general, se recomand introducerea unor comentarii dup antetul unei funciei, pentru a preciza prelucrrile efectuate n funcie, anumite limite impuse datelor de intrare, etc.

Cele doua paranteze se ataseaza oricarei functii. Intre ele se scriu optional anumiti parametri ( in acest caz lipsesc) O functie poate intoarce un rezultat. Daca nu intoarce nici un rezultat spunem ca tipul

rezultatului este void. Exista functii cu rezultat de tip real, intreg etc. De asemenea, programul poate contine si declaratii de variabile globale - adica variabile cu care pot lucra toate functiile care il alcatuiesc. Instructiunile care pot aparea sunt fie expresii fie implementari ale structurilor de control ca if, for, while etc.
nceputul i sfritul corpului funciei main sunt indicate de cele dou acoalade { (linia3) i } (linia 6). Corpul funciei (linia 5) este format dintr-o singur instruciune, care implementeaz o operaie de scriere. Cuvantul cout este un cuvnt predefinit al limbajului C++ - console output - care desemneaz dispozitivul logic de iesire; simbolul << este operatorul de transfer a informaiei. Folosite astfel, se deschide un canal de comunicaie a datelor ctre dispozitivul de ieire, n cazul acesta, monitorul. Dup operator se specific informaiile care vor fi afiate (n acest exemplu, un ir de caractere constant). Faptul c este un ir constant de caractere este indicat de ghilimelele care l ncadreaz.

La sfritul instruciunii care implementeaz operaia de scriere, apare ; Etapele rezolvrii unei probleme cu ajutorul calculatorului
S detaliem n continuare etapa de implementare. Dup analiza problemei i stabilirea algoritmului, acesta trebuie tradus (implementat) ntr-un limbaj de programare.

Scrierea (editarea) programului surs. Programele surs sunt fiiere text care conin instruciuni (cu sintactica i semantica proprii limbajului utilizat). Programul (fiierul) surs este creat cu ajutorul unui editor de texte i va fi salvat pe disc (programele surs C primesc, de obicei, extensia .c, iar cele C++, extensia .cpp). Pentru a putea fi executat, programul surs trebuie compilat i linkeditat. Compilarea Procesul de compilare este realizat cu ajutorul compilatorului, care translateaz codul surs n cod obiect (cod main), pentru ca programul s poat fi neles de calculator. n cazul limbajului C, n prima faz a compilrii este invocat preprocesorul. Acesta recunoate i analizeaz mai nti o serie de instruciuni speciale, numite directive procesor. Verific apoi codul surs pentru a constata dac acesta respect sintaxa i semantica limbajului. Dac exist erori, acestea sunt semnalate utilizatorului. Utilizatorul trebuie s corecteze erorile (modificnd programul surs). Abia apoi codul surs este translatat n cod de asamblare, iar n final, n cod main, binar, propriu calculatorului. Acest cod binar este numit cod obiect i de obicei este memorat ntr-un alt fiier, numit fiier obiect. Fiierul obiect va avea, de obicei, acelai nume cu fiierul surs i extensia .obj. Linkeditarea

Dupa ce programul surs a fost translatat n program obiect, el este va fi supus operaiei de linkeditare. Scopul fazei de linkeditare este acela de a obine o form final a programului, n vederea execuiei acestuia. Linkeditorul leag modulele obiect, rezolv referinele ctre funciile externe i rutinele din biblioteci i produce cod executabil, memorat ntr-un alt fisier, numit fiier executabil (acelai nume, extensia .exe)

Execuia

Lansarea n execuie const n ncrcarea programului executabil n memorie i startarea execuiei sale.

Cod surs

(Preprocesor) Compilator

Cod obiect

Linkeditor

Cod executabil

Etapele necesare obinerii fiierului executabil

Observaii: 1. Mediile de programare integrate (BORLANDC, TURBOC) nglobeaz editorul, compilatorul, linkeditorul i depanatorul (utilizat n situaiile n care apar erori la execuie); 2. Dac nu se utilizeaz un mediu integrat, programatorul va apela n mod explicit (n linie de comand) un editor de texte, compilatorul, linkeditorul. Lansarea n execuie se va face tot din linie de comand.

3. Extensiile specificate pentru fiierele surs, obiect i executabile sunt CPP (sau C), OBJ respectiv EXE. Preprocesorul In prima faza a etapei de compilare este apelat preprocesorul C. Acesta va trata o serie de directive speciale numite directive preprocesor pe care le gaseste in fisierul sursa. O directiva preprocesor incepe cu simbolul # Directivele preprocesor se folosesc in urmatoarele situatii: 1. Includerea fisierelor header in codul sursa. Exemplu: directiva include: # include<iostream.h> pentru citiri sau scrieri
parantezele unghiulare < > indic faptul c este vorba de un fiier header sistem (predefinit). Cnd procesorul ntlnete aceast linie, datorit simbolului #, o recunoate ca fiind o directiv preprocesor, localizeaz fiierul header indicat.

Programatorul isi poate crea propriile fisiere header caz in care acesta va fi incadrat intre " " . De exemplu: #include "headerul_meu.h"

Numele fiierului header inclus ntre ghilimele, indic faptul c headerul_meu.h este un fiier header creat de utilizator. Preprocesorul va cuta s localizeze acest fiier n directorul curent de lucru al utilizatorului. n cazul n care fiierul header nu se afl n directorul curent, se va indica i calea ctre acesta.
Exemplu:

#include "c:\\bc\\head\\headerul_meu.h"
n acest exemplu, pentru interpretarea corect a caracterului backslash \, a fost necesar "dublarea" acestuia, din motive pe care le vom prezenta n paragrafele urmatoare.

2. Asignarea unor nume simbolice pentru constante. De exemplu: #define PI 3.14 PI este numele constantei simbolice iar 3.14 este valoarea constantei In locurile in care in codul sursa apar numele constantelor simbolice carora li s-a asignat o valoare printr-o directiva define in mod automat numele constantei este inlocuit prin valoarea acestora
Exemplu:

#define TRUE #define FALSE

1 0

Tratarea acestor directive preprocesor are ca efect asignarea (atribuirea) valorii ntregi 1 numelui (constantei simbolice) TRUE, i a valorii 0 numelui simbolic FALSE. Ca urmare, naintea compilrii propriu-zise, n programul surs, apariiile numelor TRUE i FALSE vor fi nlocuite cu valorile 1, respectiv 0. Un prim exemplu de program C++: #include <iostream.h> void main( ) { int a; // acesta este un comentariu de sfarsit de linie - am declarat o variabila de tip intreg cout << "Tastati un numar intreg "; cin >> a; cout << "Ati tastat numarul " << a ; } Obs.: << este operatorul de insertie >> este operatorul de extractie cin este "console in" - pentru citire de date http://infoscience.3x.ro/c++/lectii/elemente%20de%20baza%20ale%20limbajului.html

Unitatile lexicale Unitatile lexicale, numite si lexeme (engl. token, lexeme) sunt constructiile elementare ale limbajului ("atomii" acestuia). Acestea sunt simboluri, formate din unul sau mai multe caractere, care au o anumita semnificatie in limbaj. Dupa rolul indeplinit, unitatile lexicale sunt:

identificatori cuvinte cheie literali separatori operatori comentarii si spatii

Identificatori Numele date programelor sau componentelor acestora (clase, variabile, functii etc.) se numesc identificatori. Identificatorii se aleg de catre programator, respectand anumite reguli. In limbajul C++, identificatorii sunt siruri formate din litere, cifre si caractere de subliniere ('_'), care nu pot incepe cu o cifra. Lungimea identificatorului nu prezinta importanta, insa acesta nu poate contine spatii libere sau alte caractere, decat cele mentionate aici. Exemple de identificatori valabili: viteza v15XB7 pretDeVanzare pret_de_vanzare Este de preferat ca identificatorii sa aiba nume sugestive, amintim insa ca, pentru calculator, identificatorii nu au nici o alta semnificatie, deci, din acest punct de vedere, toate exemplele de identificatori date aici sunt la fel de bune. Cuvinte cheie In orice limbaj de programare, exista un set de cuvinte, numite cuvinte cheie, care sunt considerate simboluri sintactice si nu pot fi folosite in program ca identificatori. De exemplu: for, while, pentru ca acestea sunt nume de instructiuni. Literali (constante) Literalii sunt reprezentarile in fisierele sursa ale valorilor constante. Exemple de literali: - caractere: 'a', 'A', '+', '$', '5'; - siruri de caractere: "sir de caractere", "abc$79.28#^z"; - numere intregi: 14726, -25413; - numere reale: 12.7389, -0.05673, 2.3075E12, -1.4237E-5;

Separatori Separatorul este un caracter care delimiteaza formele sintactice sau le separa intre ele. In limbajul C++ se folosesc urmatorii separatori: spatiul, caracterul CR, sfarsit de linie sau ';'. Comentariile Comentariile sunt texte care pot fi introduse in programul sursa, dar nu sunt luate in consideratie de compilator si deci nu au efect in timpul executarii programului. Comentariile sunt utile pentru o mai buna intelegere a programului de catre om. In programele C++, se pot folosi doua feluri de comentarii: a) comentarii care se pot extinde pe una sau mai multe linii si au forma /* <comentariu> */ b) comentarii de sfarsit de linie, care incep cu simbolul // si continua pana la sfarsitul liniei respective, deci au forma // <comentariu> #include<iostream.h> /* functia main este functia principala, cu care incepe executarea programului */ void main( ) { /* Urmeaza instructiunea prin care se afiseaza un text */ cout<<"Prima noastra aplicatie a reusit!"; } // sfarsitul functiei main Observatie :comentariile sunt absolut necesare pentru intelegerea programului. In acelasi timp, abuzul de comentarii poate sa faca urmarirea acestuia dificila. Este, deci, recomandabil sa se introduca in program toate comentariile necesare pentru o buna intelegere a acestuia, dar nu mai mult. http://infoscience.3x.ro/c++/lectii/vocabularul%20limbajului.html

IMPLEMENTAREA STRUCTURILOR DE CONTROL


Algoritmul proiectat pentru rezolvarea unei anumite probleme trebuie implementat intrun limbaj de programare; prelucrarea datelor se realizeaza cu ajutorul instructiunilor. Instructiunea descrie un proces de prelucrare pe care un calculator il poate executa. O instructiune este o constructie valida (care respecta sintaxa limbajului) urmata de ; (punct si virgula). Ordinea

in care se executa instructiunile unui program defineste asa-numita structura de control a programului. Limbajele moderne sunt alcatuite pe principiile programarii structurate. Conform lui C. Bohm si G. Jacopini, orice algoritm poate fi realizat prin combinarea a trei structuri fundamentale:
structura secventiala

structura alternativa (de decizie, de selectie) structura repetitiva (ciclica)

IMPLEMENTAREA STRUCTURII SECVENTIALE


Structura secventiala este o insiruire de secvente de prelucrare (instructiuni), plasate una dupa alta, in ordinea in care se doreste executia acestora.

Instructiunea vida
Sintaxa: ; Instructiunea vida nu are nici un efect. Se utilizeaza in constructii in care se cere prezenta unei instructiuni, dar nu se executa nimic (de obicei, in instructiunile repetitive). Exemple: int a; for (;;) {}

Instructiunea expresie
Sintaxa: Exemple: int b, a=9; double c; b=a+9; cout<<a; expresie;

Instructiunea compusa (instructiunea bloc)


Sintaxa: { declaratii de variabile; instr1; instr2; .... } Intr-un bloc se pot declara si variabile care pot fi accesate doar in corpul blocului. Instructiunea bloc este utilizata in locurile in care este necesara prezenta unei singure instructiuni, insa procesul de calcul este mai complex, deci trebuie descris in mai multe secvente. Probleme propuse: Sa se interschimbe continutul a doua variabile intregi. Valorile initiale se citesc de la tastatura

Se cieste un numar format din 3 cifre. Sa se interschimbe cifra unitatilor cu a sutelor Se citeste un numar format din 5 cifre. Sa se elimine cifra din mijloc Se citeste un numar natural sa se afiseze cea de a p cifra. (numarul are cel putin p cifre) Sa se afiseze puterea x a unui numar intreg si radicalul acestuia Se citesc lungimea si latimea unui dreptunghi. Sa se determine aria si perimetrul Sa se determine suma cuburilor cifrelor unui nr de cel mult 3 cifre Sa se determine suma valorilor 1+2+3++n, pt un n natural citit Sa se determine distanta dintre doua puncte. Se cunosc coordonatele celor doua puncte. Se dau coordonatele a 3 puncte in plan. Sa se determine aria si perimetrul triunghiului determinat de cele 3 puncte. Sa se determine suma si produsul a doua fractii

IMPLEMENTAREA STRUCTURII DE DECIZIE (ALTERNATIVE, DE SELECTIE) Instructiunea if:


Sintaxa: if (expresie) instructiune1 [ else instructiune2 ] Ramura else este optionala. La intalnirea instructiunii if, se evalueaza expresie (care reprezinta o conditie) din paranteze. Daca valoarea expresiei este 1, sau diferita de 0 (conditia este indeplinita) se executa instructiune1; daca valoarea expresiei este 0 (conditia nu este indeplinita), se executa instructiune2. Deci, la un moment dat, se executa doar una dintre cele doua instructiuni: fie instructiune1, fie instructiune2. Dupa executia instructiunii if se trece la executia instructiunii care urmeaza acesteia. Observatii: 1. Instructiune1 si instructiune2 pot fi instructiuni compuse (blocuri), sau chiar alte instructiuni if (if-uri imbricate). 2. Deoarece instructiunea if testeaza valoarea numerica a expresiei (conditiei), este posibila prescurtarea: if (expresie), in loc de if (expresie != 0). 3. Deoarece ramura else a instructiunii if este optionala, in cazul in care aceasta este omisa din secventele if-else imbricate, se produce o ambiguitate. De obicei, ramura else se asociaza ultimei instructiuni if. Exemplu:
if (a*b!=0) if (a>b) z=a; else z=b;

4. Pentru claritatea programelor sursa se recomanda alinierea instructiunilor prin utilizarea tabulatorului orizontal. 5. Deseori, apare constructia:
if (expresie1) instructiune1; else if (expresie2) instructiune2; else if (expresie3) instructiune3; . . . . . . . . . else instructiune_n;

Expresiile sunt evaluate in ordine; daca una dintre expresii are valoarea nenula, se executa instructiunea corespunzatoare si se termina intreaga inlantuire. Instructiunea n se executa in situatia in care nici una dintre expresiile 1,2,. . ., n-1 nu are valoarea nenula. Instructiunea alternativa if. Aplicatii 1. Scrieti un algorim care sa determine cel mai mare dintre 3 numere intregi citite. 2. Sa se determine daca un numar natural este sau nu patrat perfect. 3. Se citeste un numar natural format n din exact trei cifre. Sa se determine cel mai mare numar avand aceleasi cifre ca si numarul initial. Exemplu: pentru n=276 se genereaza 762 iar pentru 838 se genereaza 883. 4. Se citesc trei numere intregi a, b, c. Sa se verifice daca aceste numere (nu are importanta ordinea in care s-au citit) sunt in progresie aritmetica si afisati ratia progresiei in caz afirmativ. Exemplu: (10, 3, 17) este o progresie aritmetica cu ratia 7; (1, 2, 4) nu este progresie aritmetica. 5. se citeste un numar natural n. Sa se determine ultima cifra a produsului 1*2*3*...*n 6. Sa se verifica daca o fractie a/b se poate simplifica prin k (k numar natural nenul). Sa va afisa DA sau NU. 7. Sa se determine ultima cifra a lui 2x (x nenul). 8. Se citesc 3 numere naturale x, y, z (x,y,z>=100 si n<=3). Sa se genereze un nou numar w format din cea de a n-a cifra incepand de la unitati din fiecare dintre cele 3 numere x , y si z. Sa se determine daca numarul nou astfel obtinut este patrat perfect. Exemplu1: x=23244 y=7588 z=638 n=3 se genereaza: 256 care este patrat perfect Exemplu2: x=23044 y=7588 z=638 n=3 se genereaza: 56 care NU este patrat perfect

9. Se citesc 5 cifre binare sa se determine daca numarul in baza 10 asociat este un numar din intervalul [10, 20]. Exemplu: 11001(2)=25(10) 10. Se cunosc: coordonatele centrului unui cerc intr-un sistem de coordonate cartezian, raza cercului si coordonatele unui punct A. Sa se determine pozitia punctului fata de cerc: in afara cercului, in interior sau daca este situat pe cerc.

Instructiunea switch
In unele cazuri este necesara o decizie multipla speciala. Instructiunea switch permite acest lucru. Reprezentare prin schema logica:

expr esie =exp_const _1 Instructiune1 =exp_const _2 Instructiune2 =exp_const_n1 Instructiunen-1 altfel Instructiunen

Reprezentare prin pseudocod:


Dac expresie=expr_const_1 instructiune1; [iesire;] Altfel daca expresie=expr_const_2 instructiune2; [iesire;] . . . . . . . . Altfel daca expresie=expr_const_n-1 instructiune_n-1; [iesire;] Altfel instructiune_n;

Se testeaza daca valoarea pentru expresie este una dintre constantele specificate (expr_const_1, expr_const_2, etc.) si se executa instructiunea de pe ramura corespunzatoare. In schema logica test_expresie este una din conditiile: expresie=expr_const_1, expresie=expr_const_2, etc. Sintaxa:
switch (expresie) { case expresie_const_1: instructiune_1; [break;] case expresie_const_2: instructiune_2; [break;] . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

case expresie_const_n-1: instructiune_n-1; [break;] [ default: instructiune_n; ] }

Este evaluata expresie (expresie aritmetica), iar valoarea ei este comparata cu valoarea expresiilor constante 1, 2, etc. (expresii constante=expresii care nu contin variabile). In situatia in care valoarea expresie este egala cu valoarea expr_const_k, se executa instructiunea corespunzatoare acelei ramuri (instructiune_k). Daca se intalneste instructiunea break, parcurgerea este intrerupta, deci se va trece la executia primei instructiuni de dupa switch. Daca nu este intalnita instructiunea break, parcurgerea continua. Break-ul cauzeaza deci, iesirea imediata din switch. In cazul in care valoarea expresiei nu este gasita printre valorile expresiilor constante, se executa cazul marcat cu eticheta default (cand acesta exista). Expresiile expresie, expresie_const_1, expresie_const_2,etc., trebuie sa fie intregi.

Probleme propuse:
1. 2. 3. 4. Sa se verifice daca un numar este par sau impar. Scrieti un algoritm care sa determine cel mai mare dintre doua numere intregi citite. Scrieti un algorim care sa determine cel mai mare dintre 3 numere intregi citite. Scrieti un program care citeste de la tastatura trei valori numerice a, b, c si apoi afiseaza pe ecran cea mai mare diferenta dintre oricare doua valori date. Ex. a=100, b=15, c=105. Se va afisa 90. 5. Se da un numar din 3 cifre.Sa se genereze cel mai mare numar care are aceleasi cifre ca el. 6. Intr-un parc se joaca 3 copii care au greutatile a,b,c. Sa se stabileasca daca se pot aseza pe un balansoar astfel incat acesta sa stea in echilibru. 7. Sa se rezolve ecuatia de gradul I cu o necunoscuta: ax+b=0 unde a si b sunt coeficienti reali cititi. Discutie. 8. Sa se rezolve ecuatia de gradul al II-lea cu 2 necunoscute: ax2+bx+c=0 unde a,b,c sunt coeficienti reali cititi. Discutie. 9. Sa se verifice daca 3 numere a,b,c sunt pitagorice. 10. Fie 2 numere cu 4 cifre. Sa se afiseze acela care are suma cifrelor mai mare. 11. Se citesc de la tastatura coordonatele x si y ale celor trei varfuri ale unui triunghi. Sa se scrie un algoritm care citeste aceste valori si verifica daca acestea pot constitui varfurile triunghiului. In caz afirmativ se va afisa tipul triunghiului (oarecare, isoscel sau echilateral). 12. Sa se verifica daca o fractie a/b se poate simplifica prin k. Sa va afisa DA sau NU. 13. Se citesc coordonatele unui punct in plan. Sa se afiseze cadranul caruia ii apartine. 14. Se citesc varsta, inaltimea si sexul unei persoane. Sa se calculeze greutatea ideala, dupa formula : G=50+0.75*(i-150)+(v-20)/4, pentru baieti G=G*0.9, pentru fete 15. Sa se determine ultima cifra a lui 2x. 16. Se citesc de la tastatura 2 numere naturale a si b si un operator op. Sa se calculeze expresia a op b. 17. Sa se calculeze ultima cifra a lui ab. 18. Sa se calculeze ultima cifra a lui 1*2*3**n 19. Se citesc valorile intregi a 3 numere a,b,c si inca o variabila x. Daca x=1, sa se afiseze maximul dintre cele 3 numere. Daca x=2, sa se afiseze minimul dintre cele 3 numere. Daca x=3, sa se calculeze media lor aritmetica. Daca x=4, sa se afiseze valoarea expresiei

a 2 + b 2 + c 2 . Daca x=5, sa se afiseze valoarea expresiei


afisa ultima cifra a lui |a*b*c|.

ab +

a * | c | ] . Altfel, se va b

20. Se citesc 3 numere naturale x,y,z. Sa se stabileasca daca pot forma laturile unui triunghi.
Daca da, sa se testeze natura triunghiului. Daca este isoscel, sa se calculeze perimetrul. Daca este echilateral, sa se calculeze inaltimea. Daca este dreptunghic, sa se calculeze lungimea medianei corespunzatoare unghiului drept. Daca este oarecare, se va calcula aria triunghiului. 21. Fiind dat un numar n de maxim trei cifre, sa se verifice daca patratul numarului are ultimele cifre egale cu n. (Ex : n=5, n=6, n=25) http://infoscience.3x.ro/c++/struct/instruct.htm

SIRURI DE CARACTERE
O constanta de tip sir de caractere de declara intre doua caractere . In memoria interna, o constanta de acest tip este retinuta sub forma unui vector de caractere. Fiecare componenta a sirului (incepand cu cea de indice 0) retine codul ASCII al caracterului pe care il memoreaza. Conventia este ca ultimul octet sa retina 0 (codul caracterului nul). Caracterul nul este memorat automat. Trebuie rezervate lungimea_sirului+1 caractere char (+1 pentru caracterul nul).
Limbajul C/C++ permite initializarea unui tablou de caractere printr-o constanta sir, care include automat caracterul null. Exemplu :
char vect[11]=calculator; char vect[]=calculator; (compilatorul

face calculul numarului de octeti

necesari)
char vect[100]=calculator;

(s-au rezervat mai multi octeti decat era

necesar)
Sirurile de caractere sunt de fapt tablouri de caractere, care au ca ultim element un terminator de sir, caracterul null. Exemplu: char tc[5] = {a, b, c, d, e}; // tablou de caractere char sc[5] = {a, b, c, d, \0}; // sir de caractere cu elementele abcd Ultima initializare este echivalenta cu: char sc[5] = abcd; //sau char sc[] = abcd;
char sc1[5] = abcd; char s[10]; cout<<sc<<endln; //afiseaza abcd cout<<tc<<endl; //eroare: tabloul de caractere nu contine terminatorul de sir, deci

nu poate fi afisat ca sir


cout<<s<<endl; cout<<sc1[0]; cout<<sc1[2]; sc1[1]=K;

// eroare: tablou neinitializat // afiseaza primul caracter din sirul sc1 // afiseaza al treilea element din sirul sc1 // elementului din sir de indice 1 i se atribuie valoarea K;

CITIREA / AFISAREA SIRURILOR DE CARACTERE


Sirurile de caractere pot fi initializate inca de la declarare sau citite pe parcursul programului.

a.Citirea unui sir de caractere se poate face ca citirea oricarui tablou, intr-un for, caracter cu caracter (desi nu este recomandata). In acest caz, terminatorul
de sir nu este memorat automat, el trebuie pus explicit dupa ultimul caracter din sir. Exemplu:
char c[20]; for(int i=0;i<=5;i++) cin>>c[i]; cout<<c<<endl; //se va afisa sirul format din cele 6 caractere, urmat de

caractere reziduale, //initializate implicit la compilare, din cauza ca n-a fost pus terminatorul de sir
c[6]=0; cout<<c<<endl;

//a fost pus terminatorul de sir, deci sirul va fi afisat

corect

b. Se poate face pur si simplu, folosind cin>>. Caracterul nul este adaugat automat. Dezavantajul este ca in acest fel nu se pot citi siruri care contin mai multe cuvinte separate prin spatii. Citirea sirului se sfarseste la intalnirea primului caracter blank (de ex, daca se citeste ora de informatica, variabila c va retine numai ora).
Exemplu
char c[30]; cin>>c; cout<<c;

c. Se poate folosi o functie speciala pentru citirea sirurilor de caractere, inclusa in biblioteca string.h (varianta recomandata).
Exemplu
char a[30],x;int nr; cin.get(a,nr,x);

Functia cin.get citeste un sir de caractere sau pana cand au fost citite nr-1 caractere, sau daca s-a intalnit caracterul x. Al treilea parametru poate lipsi, caz in care el este implicit caracterul \n (new line). Sunt citite si caracterele albe, caracterul nul este inserat automat iar caracterul transmis ca ultim parametru nu este inserat in sir.
Exemplu
char a[30]; cin.get(a,5,s);

//daca se citeste sirul maimuta, variabila a va

retine maim
cin.get(a,15,s); //daca se citeste sirul maimuta, variabila a va retine

maimuta
cin.get(a,15,t); //daca se citeste sirul maimuta, variabila a va retine

maimu

cin.get(a,4,t);

//daca se citeste sirul maimuta, variabila a va //daca se citeste sirul maimuta, variabila a va

retine mai
cin.get(a,10);

retine maimuta

Functia cin.get( ) fara parametri are rolul de a citi un caracter (alb sau nu). Functia cin.get(char c) are rolul de a citi un caracter (alb sau nu) pe care il incarca in variabila c. Observatie: In cazul utilizarii repetate a functiei cin.get(a,nr,x), dupa fiecare folosire trebuie citit caracterul de la sfarsitul fiecarui sir , adica \n (in caz contrar, acest caracter va fi incarcat la inceputul urmatorului sir, a carui citire se termina la caracterul Enter, deci citirea celui de-al doilea sir se termina inainte de a incepe, iar al doilea sir va fi sirul vid). Aceasta citire a caracterului \n se realizeaza folosind cin.get() fara parametri.
Exemplu
char a[30],b[30]; cin.get(a,15); cin.get(b,10);

Daca se incearca citirea sirurilor sarbatoare si vacanta, se observa ca a=sarbatoare, b= (nici nu apucam sa citim sirul b). Varianta corecta este:
cin.get(a,15); cin.get(); cin.get(b,10);

Afisarea unui sir de caractere se face folosind cout.


cout<<a;

Se poate afisa si caracter cu caracter, ca in cazul tablourilor, dar aceasta varianta nu este recomandata.

FUNCTII PENTRU OPERATII CU SIRURI DE CARACTERE


Functiile pentru operatii cu siruri se gasesc in header-ul <string.h>.

Functia strlen
int strlen(nume_sir);

returneaza lungimea efectiva a unui sir (fara a strlen(a) = 18

numara terminatorul de sir). Exemplu:


char a[50]=ora de informatica;

Functia strcpy
strcpy(sir_destinatie,sir_sursa); sir_destinatie (se simuleaza atribuirea

copiaza sirul sir_ sursa in a=b).

ATENTIE!! Nu este permisa atribuirea intre doua siruri de caractere folosind

operatorul =. Atribuirea se face folosind functia strcpy.


Exemplu:
char a[50]=primul sir,b[40]=al doilea sir; a=b; //eroare strcpy(a,b); a = al doilea sir; b=al doilea sir;

Functia strcat adauga sirului dest sirul sursa. Sirul sursa ramane nemodificat. Operatia se numeste concatenare si nu este comutativa.
strcat(dest,sursa);

Exemplu:
char *a=vine ,*b=vacanta?; strcat(a,b); a = vine vacanta?;

Functia strncat
strncat(dest,sursa,nr); adauga dest sursa. Sirul sursa ramane nemodificat.

primele nr caractere din sirul

Exemplu:
char *a=vine ,*b=vacanta?; strncat(a,b,4); a = vine vaca;

Functia strchr are rolul de a cauta caracterul c in sirul sir. Cautarea se face de la stanga la dreapta, iar functia intoarce adresa subsirului care incepe cu prima aparitie a caracterului c. Daca nu este gasit caracterul, functia returneaza 0. Diferenta dintre adresa sirului initial si cea a subsirului returnat reprezinta chiar pozitia caracterului cautat in sirul dat. Exemplu:
strchr(sir,c); char *a=acesta este un sir,b=t,c=x,d; cout<<strchr(a,b); se tipareste ta este un sir; cout<<strchr(a,c); nu se tipareste nimic (se tipareste 0 face o conversie la int a lui strchr(a,c) ; d= strchr(a,b); cout<<Caracterul apare prima data la pozitia <<d-a;

daca se

Ex: Sa se afiseze toate pozitiile unui caracter intr-un sir #include <iostream.h> #include <string.h> void main() {char a[100],*p,c; cin.get(a,100); cin>>c; p=strchr(a,c); while (p) {cout<<"Pozitia "<<p-a<<endl; p++; p=strchr(p,c);}}

Functia strrchr are acelasi rol cu strchr, cu deosebirea ca returneaza adresa ultimei aparitii a caracterului (cautarea se face de la dreapta spre stanga; r = right)
strrchr(sir,c);

Functia strcmp are rolul de a compara doua siruri de caractere. Valoarea returnata este <0 (daca sir1<sir2), =0 (daca sir1=sir2) si >0 (daca sir1>sir2). Functia strcmp face distinctie intre literele mari si cele mici ale alfabetului. Obs: Functia strcmp returneaza diferenta dintre codurile ASCII ale primelor caractere care nu coincid
int strcmp(sir1,sir2);

Functia stricmp are acelasi rol cu strcmp, cu deosebirea ca nu face distinctie intre literele mari si cele mici ale alfabetului (i = ignore).
int stricmp(sir1,sir2);

Functia strstr
strstr(sir1,sir2); are rolul de a identifica daca sirul sir2 este subsir al sirului sir1. Daca este, functia returneaza adresa de inceput a subsirului sir2 in sirul sir1, altfel returneaza adresa 0. In cazul in care sir2 apare de mai multe ori in sir1, se returneaza adresa de inceput a primei aparitii. Cautarea se face de la

stanga la dreapta Functia strtok are rolul de a separa sirul sir1 in mai multe siruri (cuvinte) separate intre ele prin unul sau mai multe caractere cu rol de separator. Sirul sir2 este alcatuit din unul sau mai multe caractere cu rol de separator. Functia strtok actioneaza in felul urmator: o Primul apel trebuie sa fie de forma strtok(sir1,sir2); Functia intoarce adresa primului caracter al primei entitati. Dupa prima entitate, separatorul este inlocuit automat prin caracterul nul. o Urmatoarele apeluri sunt de forma strtok(NULL,sir2); De fiecare data, functia intoarce adresa de inceput a urmatoarei entitati, adaugand automat dupa ea caracterul nul. o Cand sirul nu mai contine entitati, functia returneaza adresa nula.
strtok(sir1,sir2);

Exemplu:
//Sa se separe cuvintele dintr-un text. #include <iostream.h> #include <conio.h> #include <string.h> void main() {char text[100],cuv[10][10],*p,*r,separator[]=",. !?";int i=0,nr=0; clrscr(); cout<<"Dati sirul:";cin.get(text,100); strcpy(p,text); p=strtok(p,separator);

while (p) {strcpy(cuv[++nr],p); p=strtok(NULL,separator);} cout<<"Sunt "<<nr<<" cuvinte:"<<endl; for (i=1;i<=nr;i++) cout<<cuv[i]<<endl; getch();}

Functia strspn cu forma generala int strspn(sir1,sir2); are rolul de a returna numarul de caractere ale sirului sir1 (caractere consecutive care incep obligatoriu cu primul caracter) care se gasesc in sirul sir2. Exemplu: strspn(AB2def,1B3AQW); returneaza 2, pentru ca primele 2 caractere A si B din sir1 se gasesc in sir2. strspn(FAB2def,16A32BF); returneaza 0, deoarece caracterul F cu care incepe sir1 nu se gaseste in sir2. Functia strcspn cu forma generala int strspn(sir1,sir2); are rolul de a returna numarul de caractere ale sirului sir1 (caractere consecutive care incep obligatoriu cu primul caracter) care nu se gasesc in sirul sir2. Exemplu: strspn(AB2def,123); returneaza 2, pentru ca primele 2 caractere din sir1 nu se gasesc in sir2.
//Se citeste un sir de caractere care nu contine caractere albe. Sa se decida daca sirul este alcatuit exclusiv din caractere numerice. #include <iostream.h> #include <conio.h> #include <string.h> void main() {char text[100],cifre[]="0123456789"; clrscr(); cout<<"Dati sirul:";cin.get(text,100); if (strcspn(cifre,text)==strlen(text)) cout<<"exclusiv numeric"; else cout<<nenumeric; getch();}

Functia strlwr cu forma generala strlwr(sir); are rolul de a converti toate literele mari din sir in litere mici. Restul caracterelor raman neschimbate. Functia strupr cu forma generala strupr(sir); are rolul de a converti toate literele mici din sir in litere mari.

Restul caracterelor raman neschimbate Functia strbrk cu forma generala strpbrk(sir1,sir2); actioneaza in felul urmator: o Cauta primul caracter al sirului sir1 in sir2. Daca este gasit, returneaza adresa sa din cadrul sirului sir1 si executia se termina. Altfel, se trece la pasul urmator. o Cauta al doilea caracter al sirului sir1 in sir2. Daca este gasit, returneaza adresa sa din cadrul sirului sir1 si executia se termina. Altfel, se trece la pasul urmator. o o Daca nici un caracter al sirului sir1 nu apartine sirului sir2, functia returneaza adresa nula. Functia atof cu forma generala double atof(sir); converteste un sir catre tipul double. Daca aceasta conversie esueaza (se intalneste un caracter nenumeric), valoarea intoarsa este 0. Aceasta functie (ca si cele similare) necesita includerea librariei stdlib.h. Functia _atold cu forma generala long double _atold(sir); converteste un sir catre tipul long double. Daca aceasta conversie esueaza, valoarea intoarsa este 0. Functia atoi cu forma generala int atoi(sir); converteste un sir catre tipul int. Daca aceasta conversie esueaza (se intalneste un caracter nenumeric), valoarea intoarsa este 0. Functia atol cu forma generala long atol(sir); converteste un sir catre tipul long. Daca aceasta conversie esueaza (se intalneste un caracter nenumeric), valoarea intoarsa este 0. Functia itoa cu forma generala
itoa(int valoare,sir,int baza); converteste o valoare de tip int in sir, care este memorat in variabila sir. Baza retine baza de numeratie catre care sa se

faca conversia. In cazul bazei 10, sirul retine si eventualul semn -. Functia ltoa cu forma generala
ltoa(long valoare,sir,int baza); in sir, care este memorat in variabila sir.

converteste o valoare de tip long int

Functia ultoa cu forma generala


ultoa(unsigned long valoare,sir,int baza); converteste unsigned long in sir, care este memorat in variabila sir.

o valoare de tip

Probleme propuse: 1. 2. 3. 4. 5. 6. 7. Sa se verifice daca un cuvant este palindrom. Sa se transforme un sir din litere mici in litere mari. Sa se transforme un sir din litere mari in litere mici. Sa se determine frecventa de aparitie a unui caracter intr-un text. Sa se genereze toate prefixele / sufixele unui cuvant. Se citeste un text dintr-un fisier si un caracter c. Sa se determine de cate ori se gaseste caracterul in text (nu se face distinctie intre literele mari si literele mici). Se citeste un text de la tastatura astfel incat cuvintele sa fie separate printr-un singur spatiu si imediat dupa ultimul cuvant se scrie punct. Textul va fi scris pe un singur rand. a) Sa se determine cate cuvinte contine textul. De ex : "Ana are mere." Contine 3 cuvinte. b) Sa se determine daca textul are cuvinte distincte (se ignora diferenta de cheie). c) Sa se determine daca textul contine cifre. Sa se determine de cate ori se gaseste un cuvant intr-un text. Codificati un text astfel incat litera a sa devina c, b sa devina e s.a.m.d. Sa se sorteze alfabetic un sir de cuvinte (eventual, fara a distinge literele mici de cele mari). Codificarea pasareasca a unui cuvant (dupa fiecare vocala, se pune litera p urmata de acea vocala). Ex : informatica ipinfopormapatipicapa Se citesc n cuvinte. Sa se afiseseze grupurile de cuvinte care rimeaza (au ultimele 2 caractere identice). Sa se desparta un text in cuvinte si sa se afiseze cuvintele separate. Sa se afiseze cuvantul de lungime maxima. Sa se verifice daca doua cuvinte sunt sau nu anagrame. Sa se numere aparitiile unui cuvant intr-un text. Se citeste un numar real de la tastatura. Sa se trunchieze astfel incat cifrele ramase sa formeze o secventa monotona. Ex. 34.59483 34.59 ; 24.1276 24 Se citeste un sir de caractere alfanumerice. Consideram ca literele sunt separatorii numerelor. Afisati datele de tip numeric preluate in ordine din sirul citit. Numerele vor fi scrise cate unul pe o linie. Ex.
in.txt a23sc345ss5e out.txt 23 345 5

8. 9. 10. 11. 12. 13. 14. 15. 16. 17.

18. In directorul curent se afla fisierul cuvinte.txt care contine mai multe linii de text formate din cuvinte separate de cate un spatiu. Sa se afiseze cuvintele care au cel putin 3 consoane sau 3 vocale consecutive. 19. Se citeste un sir de caractere. Sa se afiseze sirul oglindit din care lipsesc vocalele. 20. Se da un text de maxim 30 de caractere. Sa se listeze toate cuvintele de doua caractere din acest text. 21. Se introduc de la tastatura cuvinte pana la citirea cuvantului stop. Afisati pe ecran cuvintele mai mari in sens lexicografic decat primul citit. 22. Se dau doua texte. Sa se stabileasca o vocala comuna celor doua texte, care apare de cele mai putine ori. 23. Dintr-un fisier se citeste un text. Textul contine cuvinte separate printr-un spatiu. Sa se determine cate cuvinte contine textul. 24. Dintr-un fisier se citeste un text. Textul contine cuvinte separate printr-un spatiu. Se va genera un nou text care va contine cuvintele ordonate alfabetic 25. Dintr-un fisier se citeste un text. Textul contine cuvinte separate printr-un spatiu. Sa se scrie intr-un alt fisier, pe linii separate, fiecare cuvant care apare in text urmat de un numar care va reprezenta de cate ori apare cuvantul in text. Sa se determine cuvantul care apare de cele mai multe ori. 26. Dintr-un fisier se citeste un text. Textul contine cuvinte separate printr-un spatiu. Intr-un alt fisier se va scrie pe linii separate fiecare cuvant si liniile pe care apare. 27. Dintr-un fisier se citeste un text. Textul contine cuvinte separate printr-un spatiu sau mai multe. Se va genera un nou fisier care va contine textul initial avand spatiile de prisos eliminate (intre cuvinte va ramane numai cate un spatiu). 28. Se citesc de la tastatura elementele unei matrici de caractere (nr. linii=nr. coloane),
A(NXN), N<=10. a) Sa se afiseze matricea A; b) Sa se formeze si sa se afiseze cuvantul format din caracterele pe pe diagonala principala a matricii A; c) Sa se calculeze si sa se afiseze numarul de litere mari, litere mici si cifre din matrice; d) Sa se afiseze cuvantul format din caracterele de pe diagonala secundara; e) Sa se afiseze procentul literelor mari, al literelor mici si al cifrelor de pe cele 2 diagonale; f) Sa se afiseze caracterele comune aflate pe liniile p si q (p, q < N, p si q citite de la tastatura); g) Sa se afiseze in ordine alfabetica, crescatoare, literele mari aflate pe coloanele impare. 29. Simulati comanda REPLACE astfel incat intr-un text veti inlocui un caracter x citit de la tastatura cu un alt caracter y citit de la tastatura. Se ignora sau nu diferenta de cheie dupa optiunea utilizatorului. 30. Simulati comanda REPLACE astfel incat intr-un text veti inlocui un sir x citit de la tastatura cu un alt caracter sir y citit de la tastatura. Se ignora sau nu diferenta de cheie dupa optiunea utilizatorului. 31. Se citeste de la tastatura un cuvant. Sa se stabileasca daca el contine doua litere alaturate identice, afisandu-se un mesaj corespunzator.

32. Dintr-un fisier se citesc numele a n persoane. Sa se modifice continutul fisierului astfel incat toate numele sa fie scrise astfel: prima litera mare si restul litere mici. 33. Se citesc n siruri. Pentru fiecare sir se va determina suma codurilor ASCII. 34. Intr-un fisier sunt scrise cuvinte pe linii separate. Sa se afiseze cuvintele care contin majuscule. 35. Intr-un fisier sunt scrise pe randuri diferite numele a n copii. Sa se modifice continutul fisierului astfel incat sa contina numele ordonate crescator. 36. Sa se afiseze vocalele unui cuvant. 37. Sa se afiseze cuvintele care incep si se termina cu consoana, (vocala) etc. 38. Sa se desparta un text in cuvinte si sa se afiseze cuvintele separate. Sa se afiseze cuvantul de lungime maxima. 39. Intr-un text exista un cuvant. Codificati/decodificati cuvantul dupa un algoritm generat de voi. 40. Aceeasi problema pentru un text. 41. Se dau doua texte. Sa se stabileasca o vocala comuna celor doua texte, care apare de cele mai putine ori. 42. Dintr-un fisier se citeste un text. Textul contine cuvinte separate printr-un spatiu. Sa se determine cate cuvinte contine textul. 43. Se citesc n cuvinte. Sa se afiseze perechile de 2 cuvinte care rimeaza. 44. Aceeasi problema, numai ca se vor afisa grupurilede cuvinte care rimeaza 45. Se citesc cuvinte pana la citirea cuvantului "stop". Sa se afiseze cate dintre cuvintele citite sunt egale cu primul cuvant citit. 46. Se citeste un text. Textul contine cuvinte separate printr-un spatiu. Se va genera un nou text care va contine cuvintele ordonate alfabetic 47. Se citeste un text. Textul contine cuvinte separate printr-un spatiu. Sa se scrie, pe linii separate, fiecare cuvant care apare in text urmat de un numar care va reprezenta de cate ori apare cuvantul in text. Sa se determine cuvantul care apare de cele mai multe ori. 48. Se citeste un text. Textul contine cuvinte separate printr-un spatiu. Sa se scrie, pe linii separate, fiecare cuvant si liniile pe care apare. 49. Se citeste un text care contine cuvinte separate printr-un spatiu sau mai multe. Se va genera un nou text care va contine textul initial avand spatiile de prisos eliminate (intre cuvinte va ramane numai cate un spatiu). 50. Simulati scrierea unei parole intr-un fisier. La tastarea parolei pe ecran in locul fiecarui caracter se va scrie caracterul '*'. Eventual realizati si incriptarea parolei inainte de a fi scrisa intr-un fisier. 51. Fie un sir de forma: cifra-litera, cifra litera etc. Ex 2a4b5c. Sa se genereze un astfel de sir: aabbbbccccc. 52. Fie un sir format din replicarea de un numar de ori a unui subsir redundant. Sa se determine cea mai scurta secventa redundanta. Se va afisa subsirul redundant si numarul sau de aparitii. Ex pt: aabcaabcaabcaabc se va fisa: aabc si nu aabcaabc. Numarul de aparitii este 4 si nu 2. 53. http://infoscience.3x.ro/c++/siruridecaractere.htm

TABLOURI UNIDIMENSIONALE
DECLARAREA TABLOURILOR
Numim tablou o colectie (grup, multime ordonata) de date, de acelasi tip, situate intr-o zona de memorie continua (elementele tabloului se afla la adrese succesive). Tablourile sunt variabile compuse (structurate), deoarece grupeaza mai multe elemente. Variabilele tablou au nume, iar tipul tabloului este dat de tipul elementelor sale. Elementele tabloului pot fi referite prin numele tabloului si indicii (numere intregi) care reprezinta pozitia elementului in cadrul tabloului. In functie de numarul indicilor utilizati pentru a referi elementele tabloului, putem intalni tablouri unidimensionale (vectorii) sau multidimensionale (matricile sunt tablouri bidimensionale). Ca si variabilele simple, variabilele tablou trebuie declarate inainte de utilizare. Modul de declarare: tip nume_tablou[dim_1][dim_2][dim_n]; unde: tip reprezinta tipul elementelor tabloului; dim_1,dim_2,...,dim_n sunt numere intregi sau expresii constante intregi (a caror valoare este evaluata la compilare) care reprezinta limitele superioare ale indicilor tabloului.

TABLOURI UNIDIMENSIONALE
Tablourile unidimensionale sunt tablouri cu un singur indice (vectori). Daca tabloul contine dim elemente, indicii elementelor au valori intregi din intervalul [0, dim-1]. Un element al unui tablou poate fi utilizat ca orice alta variabila. Adresarea unei componente se face proin indicele ei, trecut intre paranteze drepte. Se pot efectua operatii asupra fiecarui element al tabloului, nu asupra intregului tablou. Exemple: int vect[20]; /* declararea tabloului vect, de maximum 20 de elemente, de tipul int. Elementele tabloului vect sunt : vect[0], vect[1], , vect[19] date de tip int*/ double p,q,tab[10]; // declararea variabilelor simple p, q si a vectorului tab, de maximum 10 elemente, tip double #define MAX 10 char tab[MAX]; /*declararea tabloului tab, de maximum MAX (10) elemente de tip char*/

Consideram declaratia tabloului v cu maxim 6 elemente de tip int int v[6]; Elementele tabloului pot fi initializate prin atribuire: v[0]=100; v[1]=101; v[2]=102; v[3]=103; v[4]=104; v[5]=105; 100 v[0] 101 v[1] 102 v[2] 103 v[3] 104 v[4] 105 v[5]

Exemplu: double alpha[5], beta[5], gama[5]; int i=2; alpha[2*i-1] = 5.78; alpha[0]=2*beta[i]+3.5; gama[i]=aplha[i]+beta[i]; //permis gama=alpha+beta; //nepermis Variabilele tablou pot fi initializate in momentul declararii: declaratie_tablou=lista_valori; Valorile din lista de valori sunt separate prin virgula, iar intreaga lista este inclusa intre acolade: Exemple: int v[6]={100,101,102,103,104,105}; double x=9.8; double a[5]={1.2, 3.5, x, x-1, 7.5}; La declararea unui vector cu initializarea elementelor sale, numarul maxim de elemente ale tabloului poate fi omis, caz in care compilatorul determina automat marimea tabloului, in functie de numarul elementelor initializate. Exemplu: char tab[]={ A, C, D, C}; tab A B C D 1 [0] [3]

float data[5]={ 1.2, 2.3, 3.4 }; data 1.2 [0] 2.3 3.4 ? ? [4]

Citirea elementelor unui vector: double a[5]; int i; for (i=0; i<5; i++) { cout<<a["<<i<<]=; //afisarea unui mesaj prealabil citirii fiecarui element cin>>a[i]; //citirea valorii elementului de indice i } Sau, pentru un vector cu n componente (n 20): double a[20]; int i, n; cout<<Dim. Max. =; cin>>n; for (i=0; i<n; i++) { cout<<a[<<i<<]=; cin>>a[i]; } Pentru simplitate, se pot considera elementele vectorului incepand cu pozitia 1. In acest caz, primul element al tabloului ramane neutilizat, iar valoarea sa este cea alocata implicit la compilare. double a[20]; int i, n; cout<<Dim. Max. =; cin>>n; for (i=1; i<=n; i++) { cout<<a[<<i<<]=; cin>>a[i]; } Afisarea elementelor unui vector: cout<<Vectorul introdus este:\n; for (i=0; i<n i++) cout<<a[i]<< ; Probleme propuse: 2. 3. 4. 5. 1. Se citeste un vector cu n componente numere intregi. Sa se calculeze media aritmetica a componentelor vectorului. 2. Se citeste un sir de n numere intregi, n dat. Sa se numere elementele pozitive si pare. Calculati produsul elementelor negative. Sa se calculeze media aritmetica a elementelor pozitive din vector. 3. Fie n numere naturale date. Sa se afiseze acelea dintre ele care sunt prime. 4. Sa se afiseze si sa se numere elementele pare de pe pozitiile impare ale unui vector.

6.

5.

7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31.

6. 7. apar. 8. Sa se roteasca un vector cu o pozitie la dreapta / stanga (ultimul element devine primul, respectiv primul element devine ultimul). 9. Rotirea unui vector cu k pozitii la stanga (dreapta). 10. Sa se mute la sfarsitul unui tablou toate elementele nule. 11. Construiti un vector care sa contina primele n numere prime. 12. Sa se puna intr-un vector toate numerele prime pana la n care, inversate, sunt tot prime. 13. Suma si produsul a doua polinoame. Valoarea unui polinom intr-un punct. 14. Sa se verifice daca un vector este ordonat (crescator sau descrescator). 15. Dandu-se un vector neordonat cu n componente diferite, sa se determine elementul cu numarul de ordine k din tabloul ordonat crescator, fara a se ordona tabloul. 16. Dandu-se un vector neordonat cu n componente diferite, sa se determine pozitia elementului a[k] in tabloul ordonat crescator, fara a se ordona tabloul. 17. Sa se gaseasca un element k printre elementele unui vector. Daca se gaseste, sa se afiseze pozitiile pe care apare. Daca nu, sa se dea un mesaj. 18. Sa se verifice daca un vector contine elementele in ordinea pozitiv negativ pozitiv negativ etc. Se va afisa DA sau NU. 19. Sa se verifice daca un vector contine elementele in ordinea pozitiv negativ pozitiv pozitiv negativ negativ pozitiv pozitiv pozitiv etc. Se va afisa DA sau NU. 20. Un vector se numeste alternativ daca pentru orice i, a[i]*a[i+1]=0. Scrieti un program care decide daca un vector este alternativ sau nu. 21. Interclasarea a doi vectori ordonati 22. Sa se numere de cate ori se intampla ca intr-un vector, un element sa fie egal cu suma (produsul, media aritmetica, geometrica) vecinilor sai. 23. Sa se determine media aritmetica a elementelor unui vector, in care elementele egale se vor lua o singura data. 24. Sa se verifice daca elementele unui sir pot forma o progresie aritmetica (geometrica). Daca da, sa se afiseze ratia. 25. Sa se inverseze un vector in el insusi. 26. 27. Sa se insereze un element intr-un vector, la pozitia k. Sa se repete operatia de mai multe ori. 28. Sa se stearga un elementul din pozitia k dintr-un vector. 29. Sa se calculeze cmmdc a n numere naturale. 30. Sa se afiseze cifrele distincte ale unui numar, si frecventa lor de aparitie.

Fie doi vectori x si y, de marime n. Sa se calculeze: a) a) E=(x1+y1)* (x2+y2)* ......*(xn+yn) b) b) E=x1y1+ x2y2 +......+xnyn c) c) E=min(x1,y1)+min(x2,y2)+ ......min(xn,yn) d) d) E=min(x1,yn)+min(x2,yn-1)+ ......min(xn,y1) Sa se ordoneze crescator / descrescator un vector. Determinarea maximului / minimului unui vector si afisarea pozitiilor pe care

32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42.

43.

44.

45. 46. 47. 48.

31. Se citeste un vector cu n componente numere intregi. Sa se construiasca vectorul format din suma (produsul) cifrelor elementelor din primul vector. 32. Fie doi vectori a si b cu m, respectiv n elemente numere reale. Sa se afiseze cate din componentele vectorului a sunt strict mai mici decat toate componentele vectorului b. 33. Sa se afiseze primele n elemente din sirul lui Fibonacci (F[0]=1, F[1]=1, F[n]=F[n-1]+F[n-2], n>1). 34. Sa se decida daca elementele unui vector sunt distincte. 35. Sa se afiseze diferenta, intersectia, reuniunea si produsul cartezian a doua multimi de numere reale. 36. Fie un vector de numere intregi. Sa se determine, daca exista, un numar p care sa fie cel mai mare element prim din vector. Daca nu exista, atunci p sa fie 0. Daca p este nenul, sa se imparta toate componentele vectorului la suma cifrelor lui p. 37. Sa se inmulteasca un numar foarte mare cu un numar format dintr-o singura cifra. 38. Suma a doua numere mari. 39. Sa se transforme un numar din baza 10 in baza 2. Generalizare pentru baza b, 2<=b<=16. 40. Sa se elimine zerourile dintr-un vector, fara a schimba ordinea elementelor nenule. 41. Mos Craciun a primit scrisori de la toti copiii cuminti, scrisori pe care le-a numerotat in ordinea sosirii, incepand de la 1. Plecand la drum, si-a dat seama ca, in graba, a uitat cateva scrisori. Scoate din sac cate o scrisoare, notand pe o foaie numarul fiecareia. Stiind ca a primit n scrisori, scrieti un program care le afiseaza pe cele pe care le-a uitat acasa. Se da numarul de scrisori n si numerele scrisorilor existente in sac. Enumerarea lor se va termina cu 0 42. Un grup de teroristi ce pregatesc o lovitura de stat isi propun sa ocupe un aeroport strategic. Ei detin harta zborurilor intre cele n aeroporturi, adica m perechi (i,j) ce indica faptul ca exista zbor din aeroportul i in aeroportul j. Ei vor ocupa acel aeroport din care se poate ajunge in fiecare din celelalte aeroporturi, dar in care nu se poate ajunge. Scrieti un program care gaseste aeroportul care trebuie ocupat 43. Intr-un zoo-magazin sunt n colivii cu papagali, toate inchise. O maimuta jucausa pleaca de la prima colivie si, din 2 in 2, deschide usile coliviilor. Apoi porneste iar de la prima colivie si, din 3 in 3, deschide usile inchise si inchide usile deschise. Face acelasi lucru din 4 in 4, samd..., din k in k (k<n). Scrieti un program care afiseaza coliviile care in final vor ramane deschise 44. Numerele de la 1 la n sunt asezate pe circumferinta unui unui cerc, astfel incat n ajunge langa 1. Incepand cu numarul s, se elimina numerele din k in k, dupa fiecare eliminare cercul strangandu-se. Care va fi numarul ramas? 45. Aceeasi problema, dar numerele nu se elimina, ci se marcheaza, pana cand un numar va fi marcat de 2 ori. Cate numere au ramas nemarcate ? 46. Sa se determine cea mai lunga secventa de numere crescatoare consecutive intr-un vector. 47. Sa se determine cel mai lung sir de numere crescatoare dintr-un sir. Numerele nu vor fi neaparat consecutive, dar se va pastra ordinea lor.

49. 50.

48. Sa se determine cea mai lunga secventa palindromica dintr-un sir. (elemente consecutive) 49. Se citeste un numar intreg foarte mare(care depaseste orice domeniu), cifra cu cifra. Sa se verifice daca numarul citit poate reprezenta factorialul vreunui numar natural. Daca da, sa se afiseze acel numar. Daca nu, sa se dea un mesaj.

Ex: (n!=1*2*3*...*n factorialul lui n) 40320=8! 1307674368000=15! 1=1! 12 Nu este factorialul nici unui numar natural

51.

50. Un alpinist parcurge un munte si masoara cotele de altitudine in diverse puncte prin care trece. Seara, in popas, vrea sa afle: a) a) numarul piscurilor traversate (cotele alaturate piscului sunt strict mai mici decat acesta) b) b) numarul vailor traversate c) c) numarul platformelor traversate d) d) cea mai mare panta urcata, ca diferenta de altitudine e) e) cea ai mare panta coborata, tot ca diferenta de altitudine Exemplu:
Pentru n=13 si 4,8,6,7,7,3,2,1,3,8,8,8,7 se va afisa : piscuri 1 vai 2 platforme 2 cea mai lunga panta in urcare 1 3 8 cea mai lunga panta in coborare 7 3 2 1

52. 53. 54.

55.

51. Sa se genereze toate submultimile multimii {1,2,3n} 52. Sa se genereze toate submultimile multimii {a[1],a[2],a[3]a[n]} 53. Fie un sir de n numere naturale. Sa se determine cel mai lung subsir cu proprietatea ca elementele sunt in ordine crescatoare. Daca exista mai multe astfel de siruri, se va afisa macar unul. Elementele din subsir nu trebuie sa fie consecutive in sirul dat. 54. Fie un numar de n cifre, citit cifra cu cifra. Sa se elimine k cifre astfel incat numarul ramas sa fie maxim, fara a schimba ordinea cifrelor ramase.

http://infoscience.3x.ro/c++/vectori.htm

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