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 apărut î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 programării
structurate, la care ideea centrală este ”structurează pentru a stăpâni o aplicaţie”. Popularitatea
limbajului a crescut rapid datorită eleganţei şi a multiplelor posibilităţi oferite programatorului
(puterea şi flexibilitatea unui limbaj de asamblare); ca urmare, au apărut numeroase alte
implementări. De aceea, în anii ’80 se impune necesitatea standardizării 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 fără
modificări, 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 îmbunătăţit, mai riguroasă şi mai puternică,
completată cu construcţiile necesare aplicării principiilor programării orientate pe obiecte
(POO). Limbajul C++ păstrează toate elementele limbajului C, beneficiind de eficienţa
şi flexibilitatea acestuia. Limbajul C++ este un superset al limbajului C.
Incompatibilităţile 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 fişiere
sursă. Un fişier sursă este un fişier text care conţine codul sursă (în limbajul C) al unui
program. Fiecare fişier sursă conţine una sau mai multe funcţii şi eventual, referinţe către
unul sau mai multe fişiere header .
Funcţia principală a unui program este numită main. Execuţia programului începe cu
execuţia acestei funcţii, care poate apela, la rândul ei, alte funcţii. Toate funcţiile folosite în
program trebuie descrise în fişierele sursă (cele scrise de către programator), în fişiere header
(funcţiile predefinite, existente în limbaj), sau în biblioteci de funcţii.

Un fişier header este un fişier aflat în sistem sau creat de către programator, care conţine
declaraţii şi definiţii de funcţii şi variabile.

Acţiunile din fiecare funcţie sunt codificate prin instrucţiuni . Există mai multe tipuri de
instrucţiuni, care vor fi discutate în capitolul următor.

O instrucţiune este orice expresie validă (de obicei, o asignare sau un apel de funcţie),
urmată de simbolul ;. În figura 2.2.b. este dat un exemplu de instrucţiune simplă. Uneori, ca
instrucţiune poate apare instrucţiunea nulă (doar ;), sau instrucţiunea compusă (privită ca o
succesiune de instrucţiuni simple, încadrate între acoladele delimitatoare {}.

FUNCŢII INSTRUCŢIUNI EXPRESII


Instrucţiunea1 Operanzi
Instrucţiunea2
Instrucţiunea3 Expresie;
.
.
.
.
Operatori
2.2.a. 2.2.b. 2.2.c.
Figura 2.2. Funcţie, instrucţiune, 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 înţelege mai bine noţiunile prezentate, să considerăm un exemplu foarte simplu.
Programul următor afişează pe ecran un mesaj (mesajul Primul meu program). Informaţia de
prelucrat (de intrare) este însuşi mesajul (o constantă şir), iar prelucrarea ei constă în afişarea pe
ecran.
Exemplu:
#include <iostream.h> // linia 1
void main() // linia 2 -
antetul funcţiei main
{ /* linia 3 - începutul corpului funcţiei, a unei intrucţiuni
compuse */
cout<<”Primul meu program in limbajul C++”; // linia 5
} // linia6-
sfârşitul corpului funcţiei

Prima linie este o directivă preprocesor (indicată de simbolul #) care determină includerea în
fişierul sursă a fişierului header cu numele iostream.h. Acest header permite realizarea
afişării pe monitor.

Programul conţine o singură funcţie, funcţia principală, numită main, al cărui antet (linia 2)
indică:
- tipul valorii returnate de funcţie (void, ceea ce înseamnă că funcţia nu returnează nici o
valoare)
- numele funcţiei (main)
- lista argumentelor primite de funcţie, încadrată de cele 2 paranteze rotunde.
Funcţiile comunică între ele prin argumente. Aceste argumente reprezintă datele de intrare ale
funcţiei. În cazul nostru, nu avem nici un argument în acea listă, deci puteam să scriem antetul
funcţiei şi astfel:
void main(void)

Ceea ce urmează după simbolul //, până la sfărşitul liniei, este un comentariu, care va fi ignorat
de către compilator. Comentariul poate conţine un text explicativ; informaţii lămuritoare la
anumite aspecte ale problemei sau observaţii. Dacă vrem să folosim un comentariu care cuprinde
mai multe linii, vom delimita începutul acestuia indicat prin simbolulurile /*, iar sfârşitul - prin
*/ (vezi liniile 3, 4). Introducerea comentariilor în programele sursă uşurează înţelegerea
acestora. În general, se recomandă introducerea unor comentarii după antetul unei funcţiei, pentru
a preciza prelucrările efectuate în funcţie, 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 sfârşitul corpului funcţiei main sunt indicate de cele două acoalade { (linia3) şi }
(linia 6).

Corpul funcţiei (linia 5) este format dintr-o singură instrucţiune, care implementează o operaţie
de scriere.

Cuvantul cout este un cuvânt predefinit al limbajului C++ - console output - care desemnează
dispozitivul logic de iesire;

simbolul << este operatorul de transfer a informaţiei. Folosite astfel, se deschide un canal de
comunicaţie a datelor către dispozitivul de ieşire, în cazul acesta, monitorul.

După operator se specifică informaţiile care vor fi afişate (în acest exemplu, un şir de caractere
constant). Faptul că este un şir constant de caractere este indicat de ghilimelele care îl încadrează.

La sfârşitul instrucţiunii care implementează operaţia de scriere, apare ;

Etapele rezolvării 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 fişiere text care conţin instrucţiuni (cu sintactica şi semantica proprii
limbajului utilizat). Programul (fişierul) 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 maşină), pentru ca programul să poată fi înţeles de calculator. În cazul
limbajului C, în prima fază a compilării este invocat preprocesorul. Acesta recunoaşte şi
analizează mai întâi o serie de instrucţiuni 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
(modificând programul sursă). Abia apoi codul sursă este translatat în cod de asamblare, iar
în final, în cod maşină, binar, propriu calculatorului. Acest cod binar este numit cod obiect şi
de obicei este memorat într-un alt fişier, numit fişier obiect. Fişierul obiect va avea, de obicei,
acelaşi nume cu fişierul sursă şi extensia .obj.

 Linkeditarea
Dupa ce programul sursă a fost translatat în program obiect, el este va fi supus operaţiei de
linkeditare. Scopul fazei de linkeditare este acela de a obţine o formă finală a programului, în
vederea execuţiei acestuia. Linkeditorul “leagă” modulele obiect, rezolvă referinţele către
funcţiile externe şi rutinele din biblioteci şi produce cod executabil, memorat într-un alt fisier,
numit fişier executabil (acelaşi nume, extensia .exe)

 Execuţia
Lansarea în execuţie constă în încărcarea programului executabil în
memorie şi startarea execuţiei sale.

(Preprocesor) Cod
Cod sursă Cod obiect Linkeditor
Compilator executabil

Etapele necesare obţinerii fişierului executabil

Observaţii:
1. Mediile de programare integrate (BORLANDC, TURBOC) înglobează editorul,
compilatorul, linkeditorul şi depanatorul (utilizat în situaţiile în care apar erori la execuţie);
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 execuţie se va face tot
din linie de comandă.
3. Extensiile specificate pentru fişierele 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 fişier header sistem (predefinit).
Când procesorul întâlneşte această linie, datorită simbolului #, o recunoaşte ca fiind o directivă
preprocesor, localizează fişierul header indicat.

Programatorul isi poate crea propriile fisiere header caz in care acesta va fi incadrat
intre " " . De exemplu:
#include "headerul_meu.h"
Numele fişierului header inclus între ghilimele, indică faptul că headerul_meu.h este un
fişier header creat de utilizator. Preprocesorul va căuta să localizeze acest fişier în
directorul curent de lucru al utilizatorului. În cazul în care fişierul header nu se află în
directorul curent, se va indica şi calea către 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 1
#define FALSE 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 compilării propriu-zise, în programul sursă, apariţiile 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 intr-
un 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: expresie;

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

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 =exp_const =exp_const_n- altfel
_1 _2 1

Instructiune1 Instructiune2 Instructiunen-1 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. Sa se verifice daca un numar este par sau impar.


2. Scrieti un algoritm care sa determine cel mai mare dintre doua numere intregi citite.
3. Scrieti un algorim care sa determine cel mai mare dintre 3 numere intregi citite.
4. 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
a 2 + b 2 + c 2 . Daca x=5, sa se afiseze valoarea expresiei [ ab + * | c | ] . Altfel, se va
b
afisa ultima cifra a lui |a*b*c|.
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; // eroare: tablou neinitializat
cout<<sc1[0]; // afiseaza primul caracter din sirul sc1
cout<<sc1[2]; // afiseaza al treilea element din sirul sc1
sc1[1]=’K’; // 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
retine “mai”
cin.get(a,10); //daca se citeste sirul “maimuta, variabila a va
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
numara terminatorul de sir).
Exemplu:
char a[50]=”ora de informatica”; à strlen(a) = 18

 Functia strcpy
strcpy(sir_destinatie,sir_sursa); – copiaza sirul sir_ sursa in
sir_destinatie (se simuleaza atribuirea 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
strcat(dest,sursa); – adauga sirului dest sirul sursa. Sirul sursa ramane
nemodificat. Operatia se numeste concatenare si nu este comutativa.
Exemplu:
char *a=”vine ”,*b=”vacanta?”;
strcat(a,b); à a = ”vine vacanta?”;

 Functia strncat
strncat(dest,sursa,nr); – adauga dest primele nr caractere din sirul
sursa. Sirul sursa ramane nemodificat.
Exemplu:
char *a=”vine ”,*b=”vacanta?”;
strncat(a,b,4); à a = ”vine vaca”;

 Functia strchr
strchr(sir,c); – 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:
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 daca se
face o conversie la int a lui strchr(a,c) ;
d= strchr(a,b);
cout<<”Caracterul apare prima data la pozitia ”<<d-a;

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
strrchr(sir,c); – are acelasi rol cu strchr, cu deosebirea ca returneaza adresa
ultimei aparitii a caracterului (cautarea se face de la dreapta spre stanga; r = right)

 Functia strcmp
int strcmp(sir1,sir2); – 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

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

 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
strtok(sir1,sir2); – 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.

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); – converteste o valoare de tip long int
in sir, care este memorat in variabila sir.
 Functia ultoa cu forma generala
ultoa(unsigned long valoare,sir,int baza); – converteste o valoare de tip
unsigned long in sir, care este memorat in variabila sir.

Probleme propuse:

1. Sa se verifice daca un cuvant este palindrom.


2. Sa se transforme un sir din litere mici in litere mari.
3. Sa se transforme un sir din litere mari in litere mici.
4. Sa se determine frecventa de aparitie a unui caracter intr-un text.
5. Sa se genereze toate prefixele / sufixele unui cuvant.
6. 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).
7. 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.
8. Sa se determine de cate ori se gaseste un cuvant intr-un text.
9. Codificati un text astfel incat litera a sa devina c, b sa devina e s.a.m.d.
10. Sa se sorteze alfabetic un sir de cuvinte (eventual, fara a distinge literele mici
de cele mari).
11. Codificarea pasareasca a unui cuvant (dupa fiecare vocala, se pune litera p
urmata de acea vocala). Ex : informatica à ipinfopormapatipicapa
12. Se citesc n cuvinte. Sa se afiseseze grupurile de cuvinte care rimeaza (au
ultimele 2 caractere identice).
13. Sa se desparta un text in cuvinte si sa se afiseze cuvintele separate. Sa se
afiseze cuvantul de lungime maxima.
14. Sa se verifice daca doua cuvinte sunt sau nu anagrame.
15. Sa se numere aparitiile unui cuvant intr-un text.
16. 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
17. 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 out.txt
a23sc345ss5e 23
345
5
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 101 102 103 104 105


v[0] v[1] v[2] v[3] v[4] 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 2.3 3.4 ? ?

[0] [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. 1. Se citeste un vector cu n componente numere intregi. Sa se calculeze media


aritmetica a componentelor vectorului.
3. 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.
4. 3. Fie n numere naturale date. Sa se afiseze acelea dintre ele care sunt prime.
5. 4. Sa se afiseze si sa se numere elementele pare de pe pozitiile impare ale unui
vector.
6. 5. 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)
7. 6. Sa se ordoneze crescator / descrescator un vector.
8. 7. Determinarea maximului / minimului unui vector si afisarea pozitiilor pe care
apar.
9. 8. Sa se roteasca un vector cu o pozitie la dreapta / stanga (ultimul element
devine primul, respectiv primul element devine ultimul).
10. 9. Rotirea unui vector cu k pozitii la stanga (dreapta).
11. 10. Sa se mute la sfarsitul unui tablou toate elementele nule.
12. 11. Construiti un vector care sa contina primele n numere prime.
13. 12. Sa se puna intr-un vector toate numerele prime pana la n care, inversate, sunt
tot prime.
14. 13. Suma si produsul a doua polinoame. Valoarea unui polinom intr-un punct.
15. 14. Sa se verifice daca un vector este ordonat (crescator sau descrescator).
16. 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.
17. 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.
18. 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.
19. 18. Sa se verifice daca un vector contine elementele in ordinea pozitiv – negativ –
pozitiv – negativ etc. Se va afisa DA sau NU.
20. 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.
21. 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.
22. 21. Interclasarea a doi vectori ordonati
23. 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.
24. 23. Sa se determine media aritmetica a elementelor unui vector, in care
elementele egale se vor lua o singura data.
25. 24. Sa se verifice daca elementele unui sir pot forma o progresie aritmetica
(geometrica). Daca da, sa se afiseze ratia.
26. 25. Sa se inverseze un vector in el insusi.
27. 26.
28. 27. Sa se insereze un element intr-un vector, la pozitia k. Sa se repete operatia de
mai multe ori.
29. 28. Sa se stearga un elementul din pozitia k dintr-un vector.
30. 29. Sa se calculeze cmmdc a n numere naturale.
31. 30. Sa se afiseze cifrele distincte ale unui numar, si frecventa lor de aparitie.
32. 31. Se citeste un vector cu n componente numere intregi. Sa se construiasca
vectorul format din suma (produsul) cifrelor elementelor din primul vector.
33. 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.
34. 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).
35. 34. Sa se decida daca elementele unui vector sunt distincte.
36. 35. Sa se afiseze diferenta, intersectia, reuniunea si produsul cartezian a doua
multimi de numere reale.
37. 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.
38. 37. Sa se inmulteasca un numar foarte mare cu un numar format dintr-o singura
cifra.
39. 38. Suma a doua numere mari.
40. 39. Sa se transforme un numar din baza 10 in baza 2. Generalizare pentru baza b,
2<=b<=16.
41. 40. Sa se elimine zerourile dintr-un vector, fara a schimba ordinea elementelor
nenule.
42. 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
43. 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
44. 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
45. 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?
46. 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 ?
47. 46. Sa se determine cea mai lunga secventa de numere crescatoare consecutive
intr-un vector.
48. 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. 48. Sa se determine cea mai lunga secventa palindromica dintr-un sir. (elemente
consecutive)
50. 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. 51. Sa se genereze toate submultimile multimii {1,2,3…n}
53. 52. Sa se genereze toate submultimile multimii {a[1],a[2],a[3]…a[n]}
54. 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.
55. 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