Documente Academic
Documente Profesional
Documente Cultură
http://infoscience.3x.ro/c++.html
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.
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 {}.
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.
Î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ă.
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
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:
# 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"
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.
#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 ;
}
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.
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>
http://infoscience.3x.ro/c++/lectii/vocabularul%20limbajului.html
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)
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;
Probleme propuse:
Instructiunea if:
Sintaxa:
if (expresie)
instructiune1
[ else
instructiune2 ]
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.
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.
expr
esie
=exp_const =exp_const =exp_const_n- altfel
_1 _2 1
Dacă expresie=expr_const_1
instructiune1;
[iesire;]
Altfel daca expresie=expr_const_2
instructiune2;
[iesire;]
. . . . . . . .
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:
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;
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.
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);
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).
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;
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();}
Probleme propuse:
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).
TABLOURI UNIDIMENSIONALE
Exemple:
#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];
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
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};
[0] [4]
Probleme propuse:
http://infoscience.3x.ro/c++/vectori.htm