Sunteți pe pagina 1din 31

MINISTERUL EDUCAȚIEI NAȚIONALE COLEGIUL NAȚIONAL "

ALEXANDRU IOAN CUZA " GALAȚI

LUCRARE PENTRU ATESTAREA COMPETENȚELOR


PROFESIONALE IN SPECIALITATEA MATEMATICĂ -
INFORMATICĂ

PROFESOR COORDONATOR: ELEV :


Joc Genia Ifrim Denis Andrei

An școlar
2022-2023

1
TEMA PROIECTULUI :

Siruri de caractere

2
Cuprins

1. Notiuni teoretice…………………………….4
2. Aplicatii rezolvate…………………………..14
3. Manual de utilizare………………………….30
4.Bibliografie/Webografie…………………………31

3
1 Notiuni teoretice

Declararea unui șir de caractere


Un șir de caractere se declară în C++ astfel:

1. char s[11];

S-a declarat un șir care poate memora maxim 11 caractere, cu indici 0 1..................10. Șirul s
poate memora cel mult 10 caractere utile, după ultimul caracter util fiind memorat caracterul '\0'.
De asemenea, la declararea unui șir acesta poate fi inițializat. Următoarele exemple declară șiruri de
caractere și le inițializează cu șirul "album":

1. char s[11] = "album"; // se folosesc doar 6 caractere


2. char t[]="album"; // se aloca automat 6 octeti pentru sirul t
3. char x[6]={'c','o','p','i','l','\0'}; // initializarea este similara cu
cea a unui tablou oarecare
4. char z[]={'a','l','b','u','m','\0'}; // se aloca automat 6 octeti pentru sir

Afișarea și citirea unui șir de caractere


Afișarea unui șir de caractere
Se poate face cu operatorul << de inserție în stream:

1. cout << s << endl;

Citirea unui șir de caractere


Se poate folosi operatorul >> de extracție din stream:

1. cin >> s;

Din cauza operatorului “>>” nu se pot citi șiruri care conțin spații – se vor citi caracterele până la primul
spațiu, fără acesta.
Pentru a citi șiruri care conțin spații, putem folosi metoda getline :

1. cin.getline(s , 11);

4
Referirea unui caracter din șir. Parcurgerea unui șir de caractere
Deoarece șirurile de caractere sunt de fapt tablouri, pentru referirea unui caracter din șir se folosește
operatorul [], ca în exemplul următor:

1. char s[]="lege"; // sirul consta din 5 caractere: cele 4 litere si


caracterul nul '\0'
2. cout << s[3]; // e
3. s[0] = 'r';
4. cout << s; // rege
5. cout << s[10]; // ?? nu exista in sir caracter cu indice 10

În numeroase situații este necesară analizarea fiecărui caracter din șir. Pentru aceasta este necesară o
parcurgere a șirului; aceasta se face similar cu parcurgerea unui tablou oarecare. Diferența constă în
faptul că, pentru șirul de caractere nu se cunoaște explicit lungimea. Ea poate fi determinată cu funcția
strlen, dar putem controla parcurgerea șirului știind că după ultimul caracter valid din șir apare
caracterul nul '\0'.
Următorul exemplu parcurge un șir de caractere și afișează caracterele separate prin spații:

1. char s[11];
2. cin >> s; // se citeste un cuvant , fara spatii
3. for(int i = 0 ; s[i] ; i +
+) 4. cout << s[i] << " ";

Tipul char *. Legătura dintre pointer-i și tablouri


1. char * p , s[31] = "pbinfo";

“p” este un pointer la char, adică o variabilă a cărei valoare este adresa unei date de tip char.
Deoarece variabila “p” nu a fost inițializată, valoarea ei este o adresă aleatorie.
“s” este un șir de caractere, dar practic s este tot un pointer. Valoarea sa este adresa primului
element din șir, adică adresa lui s[0]. Observăm că de fapt, variabilele p și s sunt de același tip, pointer la
char. Diferența dintre cele două variabile este că “s” memorează o adresa de memorie unde începe un șir de
caractere în timp ce “p” memorează o adresă aleatorie.
Cu ce putem inițializa pointer-ul “p”? Cu adresa unei date de tip char. O asemenea dată este orice
element al unui șir de caractere, de exemplu orice element din “s”. Dacă “p” reprezinta adresa unui
caracter dintr-un șir, atunci cu “p” se pot face toate operațiile care se pot face cu acel șir.

5
1. #include <iostream>
2.
3. using namespace std; 4.
5. int main(){

char * p , s[]="pbinfo";
cout << s << endl; // pbinfo
p = s;
cout << p << endl; // pbinfo 10.p ++;
cout << p << endl; // binfo
return 0; 13.

Funcții pentru caractere


Următoarele funcții au ca parametri valori numerice, reprezentând codul ASCII al unor caractere.
Prototipul lor se află în header-ul cctype.

isalnum

1. int isalnum( int ch );

Verifică dacă un caracter este alfanumeric (cifră, literă mare, literă mică). Returnează o valoare diferită de
zero dacă parametrul este alfanumeric, 0 în caz contrar.

isalpha

1. int isalpha( int ch );

Verifică dacă un caracter este alfabetic (literă mare, literă mică). Returnează o valoare diferită de zero
dacă parametrul este alfabetic, 0 în caz contrar.

islower

1. int islower( int ch );

Verifică dacă un caracter este literă mică. Returnează o valoare diferită de zero dacă parametrul este literă
mică, 0 în caz contrar.

isupper

1. int isupper( int ch );

Verifică dacă un caracter este literă mare. Returnează o valoare diferită de zero dacă parametrul este
literă mare, 0 în caz contrar.

6
isdigit

1. int isdigit( int ch );

Verifică dacă un caracter este cifră. Returnează o valoare diferită de zero dacă parametrul este cifră, 0
în caz contrar.

tolower

1. int tolower( int ch );

Convertește parametrul la literă mică. Dacă parametrul este literă mare, returnează valoarea convertită, în
caz contrar returnează valoarea inițială a parametrului.

toupper

1. int toupper( int ch );

Convertește parametrul la literă mare. Dacă parametrul este literă mică, returnează valoarea convertită, în
caz contrar returnează valoarea inițială a parametrului.

Funcții pentru șiruri de caractere


Următoarele funcții prelucrează șiruri de caractere. Dacă nu se precizează altfel, prototipul lor se află
în header-ul cstring.

strlen

1. std::size_t strlen( const char* str );

Returnează lungimea șirului str, adică numărul de caractere din șirul al cărui prim caracter se află la
adresa memorată în str. Caracterul nul nu se numără.
Exemplu:

1. cout << strlen("pbinfo"); // 6

strcpy

1. char* strcpy( char* dest, const char* src );

Copiază caracterele din șirul aflat la adresa src, inclusiv caracterul nul, în șirul al cărui prim element se află
la adresa din dest

7
Exemple:

1. char s[21], t[21] = "copil";


2. strcpy(s , "pbinfo");
3. cout << s; // pbinfo
4. strcpy(s , t);
5. cout << s; // copil
6. strcpy(s , t + 2);
7. cout << s; // pil
8. strcpy(s + 2 , t);
9. cout << s; // picopil

strncpy

1. char *strncpy( char *dest, const char *src, n);

Copiază cel mult n caractere din șirul aflat la adresa src, în șirul al cărui prim element se află la adresa din
dest.
În șirul dest nu se va plasa caracterul nul după cele n caractere copiate. Funcția
returnează adresa dest.
Exemple:

1. char s[100]="abecedar";
2. strncpy(s, "poveste", 3);
3. cout << s; // povcedar

strcat

1. char *strcat( char *dest, const char *src );

Adaugă (concatenează) caracterele din șirul aflat la adresa src, inclusiv caracterul nul, la șirul al cărui prim
element se află la adresa din dest.
Funcția returnează adresa dest.
Exemple:

1. char s[21]="Buna", t[21] = "Ziua";


2. strcat(s , t);
3. cout << s; // BunaZiua
4. strcat(s , t + 2);
5. cout << s; // BunaZiuaua

8
strchr

1. char *strchr( char * str, char ch );

Caută caracterul ch în șirul al cărui prim caracter se află în memorie la adresa din str.
Funcția returnează adresa NULL, dacă caracterul ch nu apare în șirul str, respectiva adresa primei apariții
al lui ch în str, dacă ch apare în str.
Exemplu:

1. char s[21]="pbinfo";
2. char * p = strchr(s , 'i');
3. cout << p; // info

strstr

1. char *strstr( char * s, char * t );

Caută șirul t în șirul al cărui prim caracter se află în memorie la adresa din s.
Funcția returnează adresa NULL, dacă șirul t nu apare în șirul s, respectiva adresa primei apariții al lui t în
s, dacă t apare în s.
Exemplu:

1. char s[21]="pbinfo";
2. char * p = strstr(s , "inf");
3. cout << p; // info

strcmp

1. int strcmp( char * s, char * t );

Compară lexicografic cele două șiruri de caractere:


- dacă șirul s este lexicografi mai mic decât t funcția va returna o valoare negative
- dacă șirul s este lexicografi mai mare decât t funcția va returna o valoare pozitivă
- dacă cele două șiruri sunt identice funcția va returna valoarea 0 Exemplu:

1. char s[21]="abur", t[21]="abecedar";


2. if(strcmp(s , t) < 0)
3. cout << "Da"
4. else
5. cout << "Nu";
6. // se va afisa Nu; cuvantul "abur" este lexicografic dupa "abecedar"

9
strtok

1. char *strtok( char *str, const char *sep );

Funcția strtok extrage dintr-un sir de caractere câte un subșir (cuvânt) delimitat de caractere din șirul
sep. Funcția se apelează în două moduri:
- primul apel are ca parametri șirul din care se face extragerea și șirul separatorilor
- la următoarele apeluri primul parametru este NULL.
Rezultatul funcției strtok este adresa de început a subșirului curent extras, sau NULL dacă nu
se mai poate extrage niciun subșir din șirul dat.
Exemplu:
Secvența de mai jos extrage dintr-un șir s cuvintele (separate prin caractere din mulțimea {' ', ',', '.'})
și le afișează pe linii diferite. Șirul s se presupune declarat și citit.

1. char sep[]=" .,";


2. char * p = strtok(s , sep);
3. while(p !=
NULL) 4. {
5. cout << p << endl;
6. p = strtok(NULL ,
sep); 7. }

Eliminarea și inserarea unui caracter într-un șir


Acestea sunt operații frecvente și pot fi realizate cu ajutorul funcției strcpy. Deoarece comportamentul
funcției strcpy este impredictibil dacă parametri se suprapun, este necesară utilizarea unui șir suplimentar.

Eliminarea unui caracter dintr-un sir


Următoarea secvență elimină din șirul s (presupus citit) caracterul de poziția x.

1. char s[256], t[256];


2. int x;
3. //eliminarea
4. strcpy(t , s + x + 1);
5. strcpy(s + x , t);

10
Inserarea unui caracter într-un sir
Următoarea secvență inserează în șirul s (presupus citit) de poziția x caracterul 'A'.

1. char s[256], t[256];


2. int
x; 3. //
...
4. //inserarea
5. strcpy(t , s + x);
6. strcpy(s + x + 1 , t);
7. s[x] = 'A'; // echivalent, *(s+x) = 'A';

CODUL ASCII
În orice sistem de calcul, datele – de orice tip – se memorează sub formă de numere. Mai mult,
acestea se reprezintă în baza 2. Pentru a memora în calculator caractere este necesară utilizarea unei
reprezentări a caracterelor prin numere. O astfel de reprezentare este Codul ASCII.
ASCII este o formă de reprezentare în calculator a caracterelor folosită în toate limbajele de
programare.
Codul ASCII standard codifică caracterele folosind 7 biți, astfel că permite codificarea a 27=128
caractere. De fapt sunt codificate numai literele din alfabetul englez, cifrele de
la 0 la 9, semnele de punctuație și operatorii, precum și alte simboluri. Lipsesc cu desăvârșire literele specifice
altor alfabete latine (așa numite litere cu diacritice, precum ar fi ă Ă î Î â Â ș Ș ț Ț ş Ş Ţ ţ (observăm că sunt
două feluri de Ș și doua feluri de Ţ, dar despre acest fapt vom discuta în alt articol ), precum și literele din
alte alfabete: chirilic, ebraic, arab, chinez, etc.
Pentru memorarea acestor litere se poate folosi codul ASCII Extins, sau codul UNICODE.
Prin codul ASCII, fiecărui caractere reprezentat în acest cod i se asociază un număr.
Aceste numere se găsesc în intervalul 0 .. 127. Caracterele ASCII se împart în două categorii:
 caractere imprimabile – cele cu codurile ASCII în intervalul 32 - 126, inclusiv capetele: aici se
regăsesc toate caracterele care au o reprezentare grafică bine determinată:
o literele mari: A ... Z,
o literele mici: a ... z,
o cifrele 0 .. 9,
o semnele de punctuaţie .,:;!?'"
o caractere ce reprezintă operaţii aritmetice sau de alt tip: + - / * <> = (){}[]

11
o alte caractere: ~`@#$%^&_\|
o caracterul spaţiu
 caracterele neimprimabile, sau de control – cu codurile 0 .. 31 și 127. Caracterele
neimprimabile nu au o reprezentare grafică bine determinată – în funcţie de sistemul operare
folosit, reprezentările grafice ale acestor caractere pot fi foarte diferite, sau chiar să lipsească cu
totul. Dintre aceste caractere amintim două, de o importanţă mai mare în limbajele de
programare studiate:
o caracterul cu codul 0, numit și caracter nul, notat în C++ cu '\0' – reprezintă
finalul unui șir de caractere în memorie
o caracterul cu codul 10, numit Line Feed, notat în C++ cu '\n' – produce trecerea la
rând nou atunci când este afișat pe ecran sau într-un fișier.

Observaţii utile
- literele mari și literele mici sunt diferite – au coduri ASCII diferite
- codurile ASCII ale literelor mari (sau mici) sunt în ordine: 'A' are codul 65, 'B' are codul 66, .. ,
'Z' are codul 90. Două caractere consecutive în alfabet au coduri ASCII consecutive . De
asemenea, litera 'a' are codul 97, etc.
- codurile ASCII ale literelor mici sunt mai mari decât codurile ASCII ale literelor mari ('a'
> 'Z') și diferenţă între codurile ASCII a două litere (mică – mare) este 32.
- cifrele au coduri consecutive: caracterul '0' are codul 48, caracterul '1' are codul 49, etc.
- caracterul spaţiu este un caracter imprimabil. Spațiul are codul ASCII 32.

12
13
APLICATII REZOLVATE :
PROBLEMA 1

1. #include <iostream>
2. #include <cstring>
3. using namespace std;
4. /*Se citeste un cuvant format din litere mici. Sa se afiseze cuvintele care
5. se obtin prin eliminarea succesiva a primei si ultimei litere din cuvantul citit.
6. Ex: Daca de citeste cuvantul alina se vor afisa:
7. alina
8. lin
9. i*/
10. int main()
11. {
12. char s[21];
13. cin.getline(s,21);
14. while (strlen(s)>0)
15. {
16. strcpy(s,s+1);
17. strcpy(s+strlen(s)-1,s+strlen(s));
18. cout<<s<<endl;
19. }
20. return 0;
21. }

PROBLEMA 2

1. #include <iostream>
2. #include <cstring>
3. using namespace std;
4. /*Se citeste un cuvant format doar din litere mici. Sa se permute circular
5. spre stanga literele din el si sa se afiseze cuvantul astfel obtinut.
6. Ex. Alina => linaA*/
7. int main()
8. {
9. char s[100],aux;
10. cin.getline(s,100);
11. aux=s[0];
12. for(int i=0; i<strlen(s); i++)
13. {
14. s[i]=s[i+1];
15. }
16. s[strlen(s)-1]=aux;
14
17. cout<<s;
18. return 0;
19. }

PROBLEMA 3

1. #include <iostream>
2. #include <cstring>
3. using namespace std;
4. /*Se citeste un cuvant format din litere mici. Sa se afiseze cuvintele care
5. se obtin prin eliminarea succesiva a literei sau a celor 2 litere din mijlocul
cuvantului citit.
6. Ex: Daca de citeste cuvantul cosmina se vor afisa:
7. cosina
8. cona
9. ca*/
10. int main()
11. {
12. char s[31]; int i=0;
13. cin.getline(s,31);
14. if(strlen(s)%2==1)
15. { strcpy(s+strlen(s)/2, s+strlen(s)/2+1);
16. cout<<s<<endl;
17. }
18. while(strlen(s)!=0)
19. { strcpy(s+strlen(s)/2-1, s+strlen(s)/2+1);
20. cout<<s<<endl;
21. }
22. return 0;
23. }

PROBLEMA 4

1. #include <iostream>
2. #include <cstring>
3. using namespace std;
4. /*Se citeste un cuvant format din numar par de litere. Sa se interschimbe litera
5. de pe prima pozitie cu cea de pe a doua, a treia cu a patra, etc.
6. Ex. cosmin => ocmsni*/
7. int main()
8. {
9. char s[30],aux;
10. int i;
15
11. cin.getline(s,30);
12. for(i=0;i<strlen(s)-1;i=i+2)
13. { aux=s[i];
14. s[i]=s[i+1];
15. s[i+1]=aux;
16. }
17. cout<<s;
18. return 0;
19. }

PROBLEMA 5

1. #include <iostream>
2. #include <cstring>
3. using namespace std;
4. /*Se citeste un cuvant s. Sa se afiseze toate sufixele lui s in ordinea crescatoare a
lungimii.
5. Ex: s=alina , se vor afisa:
6. a
7. na
8. ina
9. lina
10. alina*/
11. int main()
12. {
13. char s[51];
14. int i;
15. cin.getline(s,51);
16. for(i=strlen(s)-1;i>=0;i--)
17. cout<<s+i<<endl;
18. return 0;
19. }

PROBLEMA 6

1. #include <iostream>
2. #include <cstring>
3. using namespace std;
4. /*Sa se scrie un program C/C++ care citeste de la tastatura un cuvant format din
5. cel mult 20 de caractere, doar litere mici ale alfabetului englez. Programul determina
6. transformarea cuvantului citit prin Inlocuirea fiecarei vocale a cuvantului, cu un sir
7. format din doua caractere si anume vocala respectiva urmata de litera mare
corespunzatoare,
16
8. restul literelor nemodificandu-se, ca in exemplu. Programul afiseaza pe ecran cuvantul
obtinut,
9. pe o singura linie. Se considera vocale literele din multimea {a,e,i,o,u}.
10. Exemplu: pentru cuvantul bacalaureat se va afisa pe ecran: baAcaAlaAuUreEaAt*/
11. int main()
12. {
13.  
14. char s[41];
15. cin.getline(s,41);
16. char v[]="aeiou";
17. for(int i=0;i<strlen(s);i++)
18. if(strchr(v,s[i])!=0) //e vocala mica
19. { char *aux;
20. strcpy(aux,s+i);
21. strcpy(s+i+1,aux); //dubleaza vocala mica
22. s[i+1]=s[i+1]-32; //transforma dublura in mare
23. }
24. cout<<s;
25. return 0;
26. }

PROBLEMA 7

1. #include <iostream>
2. #include <cstring>
3. using namespace std;
4. /*Se citeste un numar natural n si apoi n cuvinte formate din cel mult 20 de litere
fiecare.
5. Sa se afiseze cel mai lung cuvant care se poate forma cu doua cuvinte dintre cele
citite.
6. Exemplu:
7. 6
8. arici
9. iepure
10. cal
11. hipopotam
12. oaie
13. pastrav
14. Cel mai lung cuvant poate fi hipopotampastrav sau pastravhipopotam*/
15. int main()
16. {
17. int n;
18. char s[21],m1[21]="",m2[21]="";

17
19. cin>>n;
20. for(int i=1; i<=n; i++)
21. {
22. cin>>s;
23. if(strlen(s)>strlen(m1))
24. {
25. strcpy(m2,m1);
26. strcpy(m1,s);
27. }
28. else if(strlen(s)>strlen(m2))
29. strcpy(m2,s);
30. }
31. cout<<m1<<m2;
32. return 0;
33. }

PROBLEMA 8

1. #include <iostream>
2. #include <cstring>
3. using namespace std;
4. /*Se citeste un numar natural n si apoi n cuvinte formate din cel mult 20 de litere
fiecare.
5. Calculati si afisati cate dintre cele n-1 cuvinte citite incepand cu cel de al doilea
6. au proprietatea ca primul cuvant citit le este sufix.
7. Exemplu: daca n=6, iar cuvintele citite sunt ion, revelion, ionel, bulion, milion,
pionul => 3
8. (3 cuvinte din ultimele 5 se termina cu sufixul ion).*/
9. int main()
10. {
11. char a[21], b[21];
12. int n,k=0;
13. cin>>n;
14. cin>>a;
15. for(int i=1;i<n;i++)
16. {
17. cin>>b;
18. if(strlen(b)>=strlen(a))
19. if(strcmp(a,b+strlen(b)-strlen(a))==0)
20. k++;
21. }
22. cout<<k;
23. return 0;}

18
PROBLEMA 9

1. #include <iostream>
2. #include <cstring>
3. using namespace std;
4. /*Se dă un șir de caractere ce conține doar litere mici ale alfabetului englez.
5. Să se afișez cel mai lung subșir care apare de cel puțin două în șirul dat.
6. Intrare
7. cbddccdaaddccaaddbccbbdbddd
8. Ieșire
9. aadd
10. */
11. char s[256], c[130], r[129];
12. int n, nrap;
13. int main()
14. {
15. cin.getline(s, 256);
16. n = strlen(s)/2;
17. for(int i = 2; i <= n; i++)
18. {
19. for(int j = 0; s[j] != '\0'; j++)
20. {
21. strcpy(c,"");
22. strncpy(c, s+j, i);
23. c[i] = '\0';
24. nrap = 0;
25. char* p = strstr(s+j, c);
26. while(p && nrap < 2)
27. {
28. nrap++;
29. if(nrap > 1)
30. {
31. if(strlen(c)>strlen(r))strncpy(r, c, i);
32. else if(strlen(c) == strlen(r) && strcmp(r, c)>0)strncpy(r, c,
i);
33. }
34. p=strstr(p+i, c);
35. }
36. }
37. }
38. cout << r;
39. return 0;
40. }

19
PROBLEMA 10

1. #include <iostream>
2. #include <cstring>
3. using namespace std;
4. /*Se dă un șir de caractere reprezentând o propoziție formată din litere mici ale
alfabetului englez și spații.
5. Intrare
6. aceasta familie are doua case
7. Ieșire
8. 4
9. */
10. int main()
11. {
12. char ch[257];
13. cin.getline(ch , 256);
14. int i = 0;
15. int cnt=0;
16. while(ch[i]!='\0')
17. {
18. if((ch[i]=='a' || ch[i]=='e' || ch[i]=='i' || ch[i]=='o' || ch[i]=='u') &&
(ch[i+1]=='a' || ch[i+1]=='e' || ch[i+1]=='i' || ch[i+1]=='o' || ch[i+1]=='u'))
19. cnt++;
20. i++;
21. }
22. cout << cnt;
23. return 0;
24. }

PROBLEMA 11

1. #include <iostream>
2. #include <cstring>
3. using namespace std;
4. /*Se dau două cuvinte a şi b şi o propoziţie s formată numai din litere mici ale
alfabetului englez şi spaţii.
5. Intrare
6. dar insa
7. dar nu trebuie dar e mai bine astfel
8. Iesire
9. insa nu trebuie insa e mai bine astfel
10. */
11. int main()
20
12. {
13. char a[100] , b[100];
14. cin >> a >> b;
15. char ch[100];
16. while(cin >> ch)
17. {
18. int i = 0;
19. bool ok=true;
20. while(ch[i]!='\0')
21. {
22. if(ch[i]!=a[i])
23. ok=false;
24. i++;
25. }
26. if(ok)
27. cout << b << ' ';
28. else
29. cout << ch << ' ';
30. }
31. return 0;
32. }

PROBLEMA 12

1. #include <iostream>
2. #include <cstring>
3. using namespace std;
4. /*Se dau n șiruri de caractere care conțin cuvinte formate doar din litere mici și
mari ale alfabetului englez,
5. separate prin câte un singur spațiu.
6. Să se afișeze un nou șir format din primul cuvânt al fiecărui șir în ordinea citirii,
7. al doilea cuvânt al fiecărui șir în ordinea citirii, etc. Dacă șirurile nu au același
număr de cuvinte,
8. se continuă acest proces, până când fiecare șir ajunge la final, tot în ordinea
citirii.
9.  
10. Intrare
11. 3
12. ana are mere
13. el are
14. ea are pere prune

21
15. Ieșire
16. ana el ea are are are mere pere prune
17. */
18. char m[11][1001];
19. int v[11];
20. int main()
21. {
22. int n , cnt=0;
23. cin >> n;
24. cin.getline(m[0] , 1001);
25. for(int i = 1 ; i <= n ; ++i)
26. cin.getline(m[i] , 1001);
27. for(int i = 1 ; i <= n ; ++i)
28. {
29. int j = 0;
30. while(m[i][j]!='\0')
31. {
32. if(m[i][j]==' ' && m[i][j+1]!=' ')
33. cnt++;
34. j++;
35. }
36. cnt++;
37. }
38. while(cnt)
39. for(int i = 1 ; i <= n; ++i)
40. {
41. bool ok=false;
42. while(m[i][v[i]]!=' ' && m[i][v[i]]!='\0')
43. cout << m[i][v[i]], v[i]++ , ok=true;
44. if(ok)
45. cout << ' ' , cnt--;
46. v[i]++;
47. }
48. return 0;
49. }

PROBLEMA 13

1. #include <iostream>
2. #include <cstring>
3. using namespace std;
4. /*Se dă un şir de caractere ce conţine cuvinte formate din litere mici
5. ale alfabetului englez, separate prin unul sau mai multe spații.

22
6. Intrare
7. in vacanta plec la mare
8. Ieşire
9. in vacanta plec la mare
10. */
11. int main()
12. {
13. char ch[300];
14. cin.getline(ch , 300);
15. int i = 0;
16. while(ch[i]!='\0')
17. {
18. if((i==0 || ch[i-1]==' ') && ch[i]==' ')
19. {}
20. else
21. cout << ch[i];
22. i++;
23. }
24. return 0;
25. }

PROBLEMA 14

1. #include <fstream>
2. #include <cstring>
3. using namespace std;
4. ifstream fin("poezie.in");
5. ofstream fout("poezie.out");
6. /*In fisierul poezie.in se gaseste un text pe mai multe linii reprezentand o poezie.
7. Textul contine litere mari si mici ale alfabetului englez, spatii, newline si semne
de punctuatie . , ! ?
8. In fisierul poezie.out se va afisa textul initial, din care vor fi eliminate toate
semnele de punctuatie,
9. mai putin cele aflate la capat de linie.
10. Numarul total de caractere din fisier este cel mult 5000.
11. Exemplu:
12. poezie.in
13. A fost!... odata!,
14. Ca, nicioada,,
15. O fata? frumoasa... de imparat!
16. poezie.out
17. A fost odata,
18. Ca nicioada,

23
19. O fata frumoasa de imparat!
20. */
21. int main()
22. {
23. char s[5001],sep[]=".,!?";
24. int lmax=0;
25. fin.get(s,5001,EOF);
26. for(int i=0;s[i];i++)
27. if(strchr(sep,s[i]) && s[i+1]!='\n')
28. {
29. char aux[5001];
30. strcpy(aux,s+i+1);
31. strcpy(s+i,aux);
32. i--;
33. }
34. fout<<s;
35. return 0;
36. }

PROBLEMA 15

1. #include <fstream>
2. #include <cstring>
3. using namespace std;
4. ifstream fin("text.in");
5. ofstream fout("text.out");
6. /*Din fisierul text.in se citeste un text aflat pe mai multe linii si care este format
din
7. litere ale alfabetului englez, caractere spatiu si NewLine.
8. In fisierul text.out se va afisa textul initial in care toate cuvintele de lungime
maxima vor
9. fi inlocuite cu inversul (oglinditul) lor. Restul cuvintelor si arangarea lor pe
linii vor ramane neschimbate.
10. Numarul total de caractere din fisier este cel mult 5000.
11. Exemplu:
12. text.in
13. Eu am gandit la fel ca tine
14. Dar am gresit codul
15. text.out
16. Eu am tidnag la fel ca tine
17. Dar am tiserg codul
18. */
19. int main()

24
20. {
21. char s[5001];
22. int lmax=0;
23. fin.get(s,5001,EOF); //citesc tot fisierul
24. //calculez lungimea maxima a unui cuvant
25. for(int i=0;s[i];i++)
26. if(s[i]!=' ' && s[i]!='\n')
27. {
28. int j=i;
29. while(s[j] && s[j]!=' ' && s[j]!='\n')
30. j++;
31. if(j-i>lmax) lmax=j-i;
32. }
33. //oglindesc cuvintele de lungime maxima
34. for(int i=0;s[i];i++)
35. if(s[i]!=' ' && s[i]!='\n')
36. {
37. int j=i;
38. while(s[j] && s[j]!=' ' && s[j]!='\n')
39. j++;
40. if(j-i==lmax)
41. {
42. for(int x=i,y=j-1;x<y;x++,y--)
43. swap(s[x],s[y]);
44. }
45. }
46. fout<<s;
47. return 0;
48. }

PROBLEMA 16

1. #include <fstream>
2. #include <cstring>
3. using namespace std;
4. ifstream fin("concatenari.in");
5. ofstream fout("concatenari.out");
6. /*Din fisierul concatenari.in se citeste un cuvant s avand maxim 10 litere. Apoi se
citeste un numar natural
7. nenul n cu cel mult o cifra si apoi se citesc n cifre. Modificati sirul s in functiile
de numerele citite dupa n, astfel:
8. - daca numarul x citit este par, atunci la s se vor adauga primele x litere in ordinea
din sir

25
9. - daca numarul x citit este impar, atunci la s se vor adauga primele x litere in
ordinea inversa din sir.
10. Afisati in fisierul concatenari.out sirul obtinut din s la finalul modificarilor.
11. Restrictie: Numere citire nu depasesc lungimea cuvantului s.
12. Exemplu:
13. concatenari.in
14. alina
15. 3
16. 4 3 2
17. concatenari.out
18. alinaalinilaal
19. Explicatie:
20. Se fac 3 concatenari. Prima data se adauga "alin", apoi "ila" si apoi "al";
21. */
22. int main()
23. {
24. char s[101];
25. int n,x;
26. fin>>s;
27. fin>>n;
28. for(int i=1;i<=n;i++)
29. {
30. fin>>x;
31. if(x%2==0) strncat(s,s,x);
32. else
33. for(int j=x-1;j>=0;j--)
34. strncat(s,s+j,1);
35. }
36. fout<<s;
37. return 0;
38. }
39.  

PROBLEMA 17

1. #include <iostream>
2. #include <cstring>
3. using namespace std;
4. /*Se citeste un cuvant s format din cel mult 100 de litere mici. Se citeste un numar
natural p (p<=100).
5. Afisati cuvintele obtinute prin eliminarea unei secvente de p litere din s.
6. Exemplu: s="adina", si p=3, rezulta cuvintele:
7. na aa ad

26
8. */
9. int main()
10. {
11. char s[101];
12. int p;
13. cin>>s>>p;
14. for(int i=0;i<=strlen(s)-p;i++)
15. {
16. char t[101], aux[101];
17. strcpy(t,s);
18. strcpy(aux,s+i+p);
19. strcpy(t+i,aux);
20. cout<<t<<" ";
21. }
22. return 0;
23. }

PROBLEMA 18

1. #include <fstream>
2. #include <cstring>
3. using namespace std;
4. ifstream fin("date.in");
5. ofstream fout("date.out");
6. /*Din fisierul text date.in se citeste un text format din cuvinte separate prin spatii
sau caractere de forma .,;:-?!.
7. Lungimea unei linii din fisier nu depaseste 255 caractere. Sa se scrie in fisierul
text date.out, pe linii diferite,
8. cuvintele distincte din text care contin subsirul "ate", fara a face distinctie intre
litere mari si mici.
9. Exemplu:
10. date.in
11. Daca satelitii nu sunt activi, GPS-ul nu functioneaza...
12. - Ai vazut cate cuvinte marcate sunt?? Poate esti si tu atent! Cate sunt?
13. date.out
14. satelitii
15. cate
16. marcate
17. Poate
18. atent
19. */
20. int gasit(int n, char s[100][256], char c[256])
21. {

27
22. for(int i=1;i<=n;i++)
23. if(strcmpi(s[i],c)==0) return 1;
24. return 0;
25. }
26.  
27. int litera(char c)
28. {
29. return c>='a' && c<='z' || c>='A' && c<='Z';
30. }
31.  
32. int main()
33. {
34. char s[100][256];//memoreaza cuvintele distincte
35. char a[266];//citeste o linie din fisier
36. int n=0;//nr de cuvinte distincte
37. while(fin.getline(a,256))//cat timp pot citi un rand
38. {
39. char *p;
40. while(p=strstr(a,"ate"))//p indica unde il gaseste pe ate
41. {
42. int j=p-a;//pozitia unde e ate
43. while(j>0 && litera(a[j-1])) j--;//merg spre stanga in cuvant
44. int k=p-a; //pozitia unde e ate
45. while(k<strlen(a) && litera(a[k+1])) k++;//merg spre dreapta in cuvant
46. char cuv[256]="";
47. strncat(cuv,a+j,k-j+1);//copiez cuvantul in cuv
48. if(!gasit(n,s,cuv))//daca nu exista in cuvintele memorate in s
49. strcpy(s[++n],cuv);//il daug
50. strcpy(a+j,a+k+1);//il sterg din linia citita
51. }
52. }
53. for(int i=1;i<=n;i++)
54. fout<<s[i]<<endl;
55. fin.close();
56. fout.close();
57. return 0;
58. }

PROBLEMA 19

1. #include <iostream>
2. #include <cstring>
3. using namespace std;

28
4. /*Se citesc doua cuvinte a si b formate din cel mult 20 de litere fiecare. Afisati
toate sufixele cuvantului
5. a care au proprietatea ca sunt prefixe ale cuvantului b. Daca nu exista astfel de
sufixe afisati mesajul "nu exista".
6. Exemplu: pentru cuvintele a="rebele" si b="elegant" sufixele cerute sunt "ele" si "e"
(nu neaparat in aceasta ordine).
7. */
8. int main()
9. {
10. char a[21], b[21];
11. int gasit=0;
12. cin>>a>>b;
13. for(int i=0;i<strlen(a);i++)
14. if(strstr(b,a+i)==b)
15. {
16. cout<<a+i<<" ";
17. gasit=1;
18. }
19. if(!gasit) cout<<"nu exista";
20. return 0;
21. }
22.  

PROBLEMA 20

1. #include <iostream>
2. #include <cstring>
3. using namespace std;
4. /*Se citesc 3 cuvinte s, a si b, s avand cel mult 50 de litere, iar a si b avand
acelasi cel mult
5. 10 litere fiecare. Inlocuiti in cuvantul s toate aparitiile lui a cu b.
6. Exemplu:
7. s="abracadabra"
8. a="bra"
9. b="12345"
10. va rezulta s="a12345cada12345"
11. */
12. int main()
13. {
14. char s[101],a[11],b[11],*p,aux[101];
15. cin>>s>>a>>b;
16. while(p=strstr(s,a))
17. {

29
18. strcpy(aux,b);
19. strcat(aux,p+strlen(a));
20. strcpy(p,aux);
21. }
22. cout<<s;
23. return 0;
24. }

MANUAL DE UTILIZARE

30
Bibliografie

31

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