2) Se da o fraza (mai multe propozitii separate de .,!,?). Sa se afle cate propozitii sunt in fraza. 3) Sa se incerce functiile predefinite. 4) Se citeste un text. Sa se scrie o functie (in program) care sa elimine spatiile. Se citeste un text. Sa se rearanjeze literele in ordine alfabetica, pastrand locul cuvintelor. Numai literele sunt afectate, celelalte caractere raman neschimbate. 5) Se citeste un text. Sa se rearanjeze literele in ordine alfabetica, pastrand locul cuvintelor. Numai literele sunt afectate, celelalte caractere raman neschimbate.
Ex: Ana_are_3_ani.
Aaa_aei_3_nnr.
6) 7) 8) 9)
Se citeste un text. Sa se afiseze toate cuvintele din text formate din k caractere. Se citeste un text. Sa se afiseze toate cuvintele de lungime maxima. Se dau doua numere sun forma de siruri de caractere. Sa se afle suma si diferenta. Sa se verifice daca doua cuvinte se pot obtine unul din celalalt prin permutarea
literelor circular la stanga. 10) Se da un sir de caractere care contine cuvinte separate de spatiu. Sa se afiseze
1 cuvant de lungime 2 13 34
11)
Ex: animal
12) 13)
Se citesc de la tastatura n linii de text. Sa se afiseze linia de text cea mai lunga. Se da un fisier input.txt care contine o fraza. Sa se elimine din fraza vocalele si sa
14)
apar in sir cu 12%. Afisarea se face in alt fisier. 15) In fisierul p.in se afla un text. Sa se afiseze cuvintele din text care incep si se Se citeste un text de la tastaura. Inlocuiti in text fiecare vocala cu p. Se da o matrice patrata cu n linii si n coloane. Scrieti o functie (in program) care
calculeaza de cate ori apare o valoare data x, deasupra diagonalei principale. 18) : !, ?, ;, . Sa se afle: a. b. cate propozitii sunt in text in fiecare propozitie cate cuvinte sunt 19)Se da o matrice patratica nxn. Sa se scrie o functie care sa calculeze cate numere prime sunt sub diagonala principala. Se citeste un sir de caractere dintr-un fisier care contine cuvinte separate de spatiile
Siruri de caractere
1) tablou unidimensional cu elemente de tip character : char nume [dimensiune]. Obs: - caracterele se numeroteaza incepand cu pozitia 0 pana la dimensiune -1. - orice sir de caractere se termina cu un marcator de sfarsit \0 (numit si caracterul nul) : AA
A\0
Ex :
i 0
a 1
r 2
n 3
a 4
\0 5
char * p; p = vara;
Citirea
a) cin>>nume; Ex: char a[20]; cin>> a; b) char a[20]; int n; cin>>n; for (i=0;i<n;i++) cin>>a[i]; c) gets (nume) Ex: gets(a) Citirea cu gets : se pot citi siruri care sa contina spatii, citirea facandu-se pana la apasarea tastei enter. Citirea cu cin a unui sir de caractere se opreste la intalnirea unui spatiu.
Scrierea a) cout<<nume; Ex: char a[10]; a=set; cout<<a; b) puts (nume); Ex: char a[10]; a=set; puts(a); Ex: #include<iostream.h> #include<string.h> main() { char a[]=exemplu,*p; //vector de caractere si pointer catre tipul char p=a; cout<<p<<endl; //va afisa exemplu p++; cout<<p<<endl; //va afisa xemplu p++; cout<<p<<endl; //va afisa emplu cout<<p[1]<<endl; // va afisa m cout<<p-a; // va afisa 2
Obs : prin p-a se obtine indicele in vectorul a al primului octet al vectorului retinut de p.
Functii predefinite
1) Lungimea sirului de caractere : strlen(s) Ex: #include<iostream.h> #include<conio.h> #include<stdio.h> #include<string.h> char s[30]; unsigned L; main() {
2) Copierea: strycpy(s1,s2) Ex: s1 =ABC s2 =abcd; strcpy(s1,s2); s1 =abcd copiaza sirul s2 in s1 si returneaza sirul s1 modificat
3) Concatenarea (alipirea a doua siruri de caractere) strcat(s1,s2) Ex: s1=Ana; s2=Maria; strcat(s1,s2); s1=AnaMaria concateneaza s1 si s2 formand un sir de caractere ce se va pastra in s1
s1=Haina_Alba
4) Compararea strcmp(s1, s2) 1, daca s1> s2; 0, daca s1= s2; -1, daca s1< s2. compara sirul s1 cu s2 s returneaza:
Obs: comparatia se face caracter cu caracter din cele doua siruri. Rezultatul e dat de prima discrepanta pe care o gaseste si depinde de pozitia caracterelor in setul ASCII precum si de lungimea sirilor de caractere.
cout<<stricmp(s1,s2);
-1
cout<<strncmp(s1,s2,2);
strnicmp(s1,s2,n)
5) Cautarea strchr(s,c) Ex: strchr(A,TATA); cauta caracterul c in sirul s incepand cu prima pozitie
Obs: rezultatul este subsirul care incepe cu prima aparitie a caracterului citit Ex: #include<iostream.h> #include<string.h> void main() { char a[20]=aceasta este; cout<<strrchr(a,t); cout<<strrchr(a,t)-a; } va tipari : te va tipari : 10 cout<<strchr(a,t); cout<<strchr(a,t)-a; va tipari : ta este va tipari : 5 (indicele primei aparitii a lui t in a)
6) Transformari (conversii) strlwr(s) strupr(s) transforma literele mari din sirul s in litere mici transforma literele mici din sirul s in litere mari
Ex: char*s=aBcd; strupr(s); cout<<s; afiseaza ABCD char*s=AbCD; strlwr(s); cout<<s; afiseaza abcd
atoi(s)
Ex: int n1,n2,n3,n4,n5,n6; n1=atoi(123); n2=atoi( 123); n3=atoi(123a34); n4=atoi(123.45); n5=atoi(123.3422); n6=atoi(anc123); n1=123 n2=123 n3=123 n4=123 n5=123 n6=0
atol(s) Ex:
long n=atoll(1234567)
n=1234567
atof(s) Ex:
double n1,n2,n3,n4,n5; n1=atof(123); n2=atof(123a34); n3=atof(123.45); n4=atof(123.34e2); n5=atof(anc123); n1=123 n2=123 n3=123.45 n4=12334 n5=0
itoa(n,sir,baza)
Ex: char s[20]; itoa(234,s,10); cout<<s; va afisa 234 char*s; itoa(10,s,2); cout<<s; va afisa 1010 (scrierea lui 10 in baza 2)
ltoa (n,sir,baza)
baza indica baza de numeratie catre care se face conversia. Ex: char s[20]; ltoa(123456,s,10); cout<<s; va afisa 123456
7) Aflare subsiruri strtok(s1,s2) scoate din s1 un subsir pornind de la inceput si oprindu-se la primul separator
Obs: - rezultatul returnat de functie se pastreaza intr-un sir de caractere declarat ca pointer. - se considera ca sirul s1 e alcatuit din mai multe entitati separate prin caractere cu rol de separator.
Functia strtok are urmatorul principiu de executie : - la prima apelare functia are forma strtok(s1,s2) si intoarce prima entitate - urmatoarele apeluri ale functiei au forma strtok (NULL,s2) si intorc de fiecare data prima entitate ramasa.
Ex: Sa se afle toate cuvintele dintr-o fraza in care cuvintele sunt separate prin _.
#include <iostream.h> #include <conio.h> #include <stdio.h> char s[20],*p; void main() { cout<<dati sirul; gets(s); p=strtok(s,_); cout<<p; while(p) { p=strtok(NULL,_); cout<<p; } }
Probleme
1) Se da un sir de caractere. Sa se scrie o functie (in program) care sa numere de cate ori apare caracterul A intr-un sir.
#include<iostream.h> #include<stdio.h> #include<string.h> char s[30]; int numar() { int i,k=0; for (i=0;i<strlen(s);i++) if (s[i]= =A)k++; return k; }
2) Se da o fraza (mai multe propozitii separate de .,!,?). Sa se afle cate propozitii sunt in fraza. #include<iostream.h> #include<stdio.h> #include<string.h> char s[30]; int k; void main() { gets(s); k=0; for (i=0; i<strlen(s); i++) if ((s[i]= =.)||(s[i]= = !)||(s[i]= =?))k++; cout<<k; }
#include<iostream.h> #include<string.h> #include<stdio.h> #include<conio.h> char s1[30],s2[30]; int n; char c; void main() { gets(s1); gets(s2); cin>>n; cin>>c; cout<<strlen(s)=<<strlen(s)<<endl; cout<<strcpy(s1,s2)=<<strcpy(s1,s2)<<endl; cout<<strcat(s1,s2)=<<strcat(s1,s2)<<endl; cout<<strncat(s1,s2,n)=<<strncat(s1,s2,n)<<endl; cout<<strcmp(s1,s2)=<<stricmp(s1,s2)<<endl; cout<<strncmp(s1,s2,n)=<<strcnmp(s1,s2,n)<<endl; cout<<strchr(s1,c)=<<strchr(s1,c)<<endl . } pt getche()
10
char s1[100], s2[100]; void elimin() { char * p; p=strtok(s1,_); strcpy(s2,p); while(p) { p=strtok(NULL,_); // de cate ori gasesc cate o entitate, o alipesc la s2 strcat(s2,p); } } void main() { gets(s1); elimin(); puts(s2); } //copiez in s2 prima entitate gasita in sirul s1
5) Se citeste un text. Sa se rearanjeze literele in ordine alfabetica, pastrand locul cuvintelor. Numai literele sunt afectate, celelalte caractere raman neschimbate.
Ex: Ana_are_3_ani.
Aaa_aei_3_nnr.
char s1[100], s2[100] void ordonez() { int i,j; for (i=0; i<=strlen(s1)-2;i++) for (j=i+1; j<=strlen(s1)-1;j++) ..
11
6)Se citeste un text. Sa se afiseze toate cuvintele din text formate din k caractere.
char s[100], *p; int k; void main() {gets(s); cin>>k; p=strtok(s,_); if (strlen(p)= =k) cout<<p; while (p) {p=strtok(NULL,_); if(strlen(p)= =k)cout<<p; } }
7) Se citeste un text. Sa se afiseze toate cuvintele de lungime maxima. char s[100], a[100][100], *p; // vector de cuvinte ( matrice : a[k] cuvant de tipul char[100] ) //Se pot scrie mai multe siruri de cuvinte daca declaram o matrice de tip char int max; void main() { gets(s); int k=0; p=strtok(s,_); k++; strcpy(a[k],p); //in a[k] se introduc pe rand secventele (cuvintele din text) while(p){p=strtok(NULL,_) k++; strcpy(a[k],p); } max=0; int i; for (i=1,i<=k;i++) if (max<strlen(a[i])) max=strlen(a[i]); for (i=1; i<=k;i++) if (strlen (a[i])= =max) cout<<a[i]<<endl; }
12
8) Se dau doua numere sub forma de siruri de caractere. Sa se afle suma si diferenta.
#include<iostream.h> #include<string.h> #include<stdio.h> #include<conio.h> char s1[20],s2[20]; int n1,n2; void main() { gets(s1);gets(s2); n1=atoi(s1); n2=atoi(s2); cout<<suma=<<n1+n2; cout<<diferenta=<<n1-n2; }
9) Sa se verifice daca doua cuvinte se pot obtine unul din celalalt prin permutarea literelor circular la stanga. Ex: s1 = arc Obs: nr de permutari=nr de litere din s1 la fiecare permutare se obtine un cuvant pe care-l comparam cu s2 s2 = car
char s1[100], s2[100], aux; void main() { gets(s1); gets(s2); int i,j,b=0; for (i=1;i<=strlen(s1);i++) {aux=s1[0]; for (j=1; j<=strlen(s1)-1,j++) s1[j-1]=s1[j]; s1[strlen(s1)-1]=aux; if (strcmp(s1,s2)= =0) b=1; } if (b= =1) cout<<da; else cout<<nu;} ................................. s1[n-2] s1[n-1] s1[n-1] aux daca strlen(s1) = n, avem: aux s1[0] s1[0] s1[1]
13
10. Se da un sir de caractere care contine cuvinte separate de spatiu. Sa se afiseze distributia lungimii cuvintelor din sir. Ex.: s= Toamna _acesta_ploua_foarte_tare_desi_nu_prea_imi_place_acest_lucru
1 cuvant de lungime 2 1 cuvant de lungime 3 3 cuvant de lungime 4 4 cuvant de lungime 5 2 cuvant de lungime 6 1 cuvant de lungime 7
- Se citeste sirul. - Se scot cuvintele si se posteaza intr-un vector a - In vectorul v se posteaza lungimea fiecarui cuvant - Se ordoneaza vectorul crescator si se numara cate cuvinte din din vectorul a au lungimea v[i]
Char s1[100], a[100][100] , *p; int v[100] ; void main ( ) { gets (s1) ; int k=0 , i , j , aux ; p=strtok(s, _) ; k++ strcpy (a[k], p); v[k]=strlen(p);
- Se genereaza vectorii a si v
while (p) { p=strtok(null , _); k++; strcpy(a[k],p); v[k]=strlen(p); } for (i=1 ; i<=k-1 ; i++) for (j=i+1 ; j<=k ; j++) if (v[i]>v[j]) { aux=v[i]; v[i]=v[j]; v[j]=aux; }; for (i=1 ; i<=k ; i++) { int nr=0; for (j=1 ; j<=k; j++) if (strlen(a[j]==v[i]) nr++; coutt<<nr<<cuvinte de lungime <<v[i]<<endl;}} - Numaram cate cuvinte din vect. a sunt egale cu v[i] , i=1,k - Se ordoneaza vectorul v
14
11. Se citeste un cuvant . Sa se afiseze toate prefixele cuvantului . Ex.: animal a , an , ani , anim , anima , animal
char s[20]; int i,j void main ( ) { gets(s); for ( i=0 ; i<=strlen(s)-1 ; i++) { for (j=0 ; j<=i ; j++) cont <<s[j]<< _; cout <<endl : } }
12. Se citesc de la tastatura n linii de text. Sa se afiseze linia de text cea mai lunga .
char s[100] , ss[100]; int n , max , i ; void main ( ) { cin>>n ; max=0 ; For (i=1 ; i<=n ; i++) { gets(s); if (strlen(s)>max){max=strlen(s); strcpy(ss,s); } } cout<<ss<<endl; }
13. Se da un fisier input.txt care contine o fraza. Sa se elimine din fraza vocalele si sa se afiseze ce a ramas in output.txt .
char s[100];
15
int i,n; void main( ) { ifstream f(input.txt); ofstream g(output.txt); f.getline(s,100); for (i=0 ; i<=strlen(s)-1; i++) if (strchr(BC____Zbc__z,s[i] )) g<<s[i]; f.close( ) ; g.close( ) ; } scriere in fisier : f<<sir; citire din fisier: f>>sir sau f.getline(s,nr)
14. Se da un fisier care contine un sir de caractere . Sa se mareasca toate numerele care apar in sir cu 12%. Afisarea se va face in alt fisier .
char s[100] , *p ; Void main( ) { ifstream f(sir.txt); ofstream g(sirnr.txt); f.getline(s,100); p=strtok(s,_); if (atoi(p)) g<<112/100*atoi(p)<<_ ; while (p) { p=strtok(NULL, _); if (atoi(p)) g<<112/100*atoi(p)<<_ ; } f.close( ); g.close( ) ; }
15. Sa se afiseze cuvintele din textul s care incep si se termina cu aceeasi litera .
16
void cuvinte( ) { p=strtok(s,_) ; if (p[o]==p[strlen(p)-1]) cout <<p<<_ ; while (p) { p=strtok (NULL,_) ; if(p[o]= =p[strlen(p)-1]) cout<<p<<_ ; } void main( ) {; cuvinte( ) ; } 16. Se citeste un text de la tastatura . Inlocuiti in text fiecare vocala cu p .
void (main) { char s[100], b[100] , voc[10]=AEIOUaeiou; int i;gets(s) ; for (i=o; i<=strlen(s)-1; i++) if (strchr(voc, s[i])) { strcat (b , a[i]) ; strcat (b , p) ; strcat (b , a[i]) ; } else strcat(b,a[i]) cout << b;} 17. Se da o matrice patrata cu n linii si n coloane . Scrieti o functie (intr-un program) care calculeaza de cate ori apare o valoare data x , deasupra diagonalei principale.
#include < iostream.h > Int n , a[100][100], x ; void citire ( ) { int i, j ; for (i=1; i<=n ; i++) for (j=1; j<=n ; j++)
17
cin >>a[i][j] ; } int cautare ( ) { Int i ,j , k=0 ; for (i=1 ; j<=n-1 ; i++) for (j=i+1 ; j<=n ; j++) if ( a[i][j]= = x) k++ ; return k; } void main ( ) { cin>>n>>x ; citire; cout<<cautare( ); }
18