Sunteți pe pagina 1din 12

Ministerul Educaiei Republicii Moldova

Universitatea Tehnica a Moldovei


Facultatea Calculatoare, Informatica si Microelectronica.

Referat
Lucrare de laborator Nr.2 la Structuri de Date i Algoritmi
Analiza eficienei prelucrrii sirurilor de caractere cu pointeri

A efectuat: st. gr. TI-103 A verificat:

Braga Teodor tefan Marin

Chisinau-2011

1.Teorie
Sirul de caractere este o succesiune de caractere cuprinsa intre doua ghilimele si poate sa contina orice caracter: litere mari si mici, caractere speciale(#,&, etc.) si delimitatori(virgula, punctul, etc). Exemplu: Borland C++, Programare, L&M. Un ir de caractere se delar astfel: Tip_de_date nume_ir[dimensiune]; Unde: -Tip_de_date: este tipul datei (obligatoriu char) ; -Nume ir: este numele pe care l dm irului ; -Dimensiune: reprezint numrul de caractere pe care l conine irul . Exemplu: Char s[10]; Limbajul C nu defineste tipul de data sir, dar exista doua posibilitati de definire a sirurilor: ca tablou de caractere;

exemple: char sir1[30]; char sir2[10]="exemplu";


ca pointer la caractere;

exemple: char *sir3; // sir3 trebuie initializat cu adresa unui sir sau a unui spatiu alocat pe heap sir3=sir1; // sir3 ia adresa unui sir static // sir3=&sir1; sir3=&sir1[0]; sunt echivalente cu instr de atribuire de mai sus sir3=(char *)malloc(100);// se aloca dinamic un spatiu pe heap char *sir4="test";// sir2 este initializat cu adresa sirului constant O constanta sir de caractere se reprezinta intre ghilimele. Ultimul caracter din sir este caracterul nul ('\0').
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).

Sarcina problemei:
Se introduce o secventa de text cu cuvinte se parate prin spatiu. Sa se determine: - Cuvintele simetrice - Cuvintele cu cel mai mare numar de repetari a primei litere - Cuvintele cu litere in ordine alfabetica - Cuvintele care alcatuiesc segmentul initial al alfabetului

Cuvintele care alcatuiesc segmentul final al alfabetului Cuvintele cu cea mai mare lungime

2. Lisingul programului
Fara pointeri:
#include<conio.h> #include<stdio.h> #include<string.h> #include<ctype.h> #include<time.h> char sir[900],cuv[30][30]; int ncuv,i,max,a[30]; clock_t start,end; int simetric(char s[]) { int l,i; l=strlen(s); for(i=0;i<l/2;i++) if(s[i]!=s[l-i-1]) return 0; return 1; } int nrRepPrimaLitera(char s[]) { int i,l,rez=0; l=strlen(s); for(i=1;i<l;i++) if(s[i]==s[0]) ++rez; return rez; } int alfabetic(char s[]) { int l,i; l=strlen(s); for(i=0;i<l-1;i++) if(s[i]>s[i+1]) return 0; return 1; } int abcd(char s[]) { int l,i; l=strlen(s); if(tolower(s[0])!='a') return 0; for(i=0;i<l-1;i++) if(tolower(s[i])!=tolower(s[i+1])-1) return 0; return 1; } int zyx(char s[]) { int l,i; l=strlen(s); if(tolower(s[0])!='z') return 0; for(i=0;i<l-1;i++) if(tolower(s[i])!=tolower(s[i+1])+1) return 0; return 1; } void citeste() { clrscr();

printf("Introduceti sirul de cuvinte delimitate prin spatiu:\n"); gets(sir); } void extrageCuvinte() { char *p; ncuv=0; p=strtok(sir," "); while(p) { strcpy(cuv[ncuv++],p); p=strtok(NULL," "); } } void main() { citeste(); start=clock(); extrageCuvinte(); printf("1) Cuvintele simetrice:\n"); for(i=0;i<ncuv;i++) if(simetric(cuv[i])) printf("%s ",cuv[i]); printf("\n\n"); printf("2) Cuvintele cu cel mai mare numar de repetari a primei litere:\n"); max=0; for(i=0;i<ncuv;i++) { a[i]=nrRepPrimaLitera(cuv[i]); if(a[i]>max) max=a[i]; } for(i=0;i<ncuv;i++) if(a[i]==max) printf("%s ",cuv[i]); printf("\n\n"); printf("3) Cuvintele cu litere in ordine alfabetica:\n"); for(i=0;i<ncuv;i++) if(alfabetic(cuv[i])) printf("%s ",cuv[i]); printf("\n\n"); printf("4) Cuvintele care alcatuiesc segmentul initial al alfabetului:\n"); for(i=0;i<ncuv;i++) if(abcd(cuv[i])) printf("%s ",cuv[i]); printf("\n\n"); printf("5) Cuvintele care alcatuiesc segmentul final al alfabetului:\n"); for(i=0;i<ncuv;i++) if(zyx(cuv[i])) printf("%s ",cuv[i]); printf("\n\n"); printf("6) Cuvintele cu cea mai mare lungime:\n"); max=0; for(i=0;i<ncuv;i++) { a[i]=strlen(cuv[i]); if(a[i]>max) max=a[i]; } for(i=0;i<ncuv;i++) if(a[i]==max) printf("%s ",cuv[i]);

end=clock(); printf("\n\nTimpul de executie: %.2f secunde",(end-start)/CLK_TCK); getch(); }

Cu pointeri:
#include<conio.h> #include<stdio.h> #include<string.h> #include<ctype.h> #include<time.h> char sir[900],cuv[30][30],(*pc)[30]; int ncuv,max,a[30],*pa; clock_t start,end; int simetric(char *s) { char *p1,*p2; p1=s; for(p2=s;*p2;p2++); --p2; while(p1<p2) if(*p1!=*p2) return 0; else ++p1,--p2; return 1; } int nrRepPrimaLitera(char *s) { int nrez=0; char *p; if(!(*s)) return 0; for(p=s+1;*p;p++) if(*p==*s) ++nrez; return nrez; } int alfabetic(char *s) { char *p; if(!(*s)) return 1; for(p=s+1;*p;p++) if(tolower(*p)<tolower(*(p-1))) return 0; return 1; } int abcd(char *s) { char *p; if(!(*s)) return 1; if(tolower(*s)!='a') return 0; for(p=s+1;*p;p++) if(tolower(*p)!=tolower(*(p-1))+1) return 0; return 1; } int zyx(char *s) { char *p; if(!(*s)) return 1; if(tolower(*s)!='z') return 0; for(p=s+1;*p;p++) if(tolower(*p)!=tolower(*(p-1))-1) return 0; return 1; } void citeste() {

clrscr(); printf("Introduceti sirul de cuvinte delimitate prin spatiu:\n"); gets(sir);} void extrageCuvinte() { char *p,(*pc)[30]; ncuv=0; pc=cuv; p=strtok(sir," "); while(p) { strcpy(*(pc++),p); p=strtok(NULL," "); } ncuv=pc-cuv; } void main() { citeste(); start=clock(); extrageCuvinte(); printf("1) Cuvintele simetrice:\n"); for(pc=cuv;pc<cuv+ncuv;pc++) if(simetric(*pc)) printf("%s ",*pc); printf("\n\n"); printf("2) Cuvintele cu cel mai mare numar de repetari a primei litere:\n"); max=0; for(pc=cuv,pa=a;pc<cuv+ncuv;pc++,pa++) { *pa=nrRepPrimaLitera(*pc); if(*pa>max) max=*pa; } for(pc=cuv,pa=a;pc<cuv+ncuv;pc++,pa++) if(*pa==max) printf("%s ",*pc); printf("\n\n"); printf("3) Cuvintele cu litere in ordine alfabetica:\n"); for(pc=cuv;pc<cuv+ncuv;pc++) if(alfabetic(*pc)) printf("%s ",*pc); printf("\n\n"); printf("4) Cuvintele care alcatuiesc segmentul initial al alfabetului:\n"); for(pc=cuv;pc<cuv+ncuv;pc++) if(abcd(*pc)) printf("%s ",*pc); printf("\n\n"); printf("5) Cuvintele care alcatuiesc segmentul final al alfabetului:\n"); for(pc=cuv;pc<cuv+ncuv;pc++) if(zyx(*pc)) printf("%s ",*pc); printf("\n\n"); printf("6) Cuvintele cu cea mai mare lungime:\n"); max=0; for(pc=cuv,pa=a;pc<cuv+ncuv;pc++,pa++) { *pa=strlen(*pc); if(*pa>max) max=*pa; } for(pc=cuv,pa=a;pc<cuv+ncuv;pc++,pa++) if(*pa==max) printf("%s ",*pc);

end=clock(); printf("\n\nTimpul de executie: %.2f secunde",(end-start)/CLK_TCK); getch(); }

3.Schema bloc

Simetric l,i

Alfabetic
l,i

i=0

i=0;

i<l/2

i<l-1

s[i]! =s[l-i1] return 0; i++;

s[i]>s[i+ 1]

return 0; i++;

return 1;

return 1;

Sfarsit
nrRepPrimaLitera

Sfarsit abc l.i

i,l,rez=0

i<l

tolower(s[0])! ='a' return 0;

(s[i]==s[0] )

i=0; i<l-1

++rez;

i++;
tolower(s[i])! =tolower(s[i+1])-1

return rez;

return 0;

Sfarsit Sfarsit

i++; return 1;

x,y,z l.i

Inceput ncuv,I,max,a[30] citeste();

tolower(s[0])! ='z' return 0; i=0; i<l-1

extrageCuvinte(); i=0; i<ncuv;

simetric(cuv[i] )

tolower(s[i])!=tolower(s[i+1]) +1

cuv[i] i++;

return 0; i++; return 1;

\n\n
i=0

Sfarsit

i<ncuv;

extrageCuvinte *p;
p=strtok(sir," ");

a[i]=nrRepPrimaLitera(cuv[i])

a[i]>max max=a[i];

p
strcpy(cuv[ncuv++],p);

i++; i=0; i<ncuv;

Sfarsit

a[i]==ma x
cuv[i]

i++;

\n\n

\n\n
i=0; i<ncuv
a[i]=strlen(cuv[i])

i=0
i<ncuv

alfabetic(cuv[ i])

a[i]>max
cuv[i]

max=a[i]; i++; i++; i=0 i<ncuv

\n\n
i=0;

i<ncuv

a[i]==max
xyz(cuv[i])

cuv[i] cuv[i]; i++; i++; end=clock(); Sfarsit

\n\n i=0;

i<ncuv

xyz(cuv[i ])

cuv[i]

i++; B

4.Rezultatul programului
Fara pointeri:

Cu pointeri:

5.Concluzii:
Efectuind lucrarea de laborator nr.2 am analizat eficiena prelucrrii sirurilor de caractere cu pointeri, am studiat notiunea de pointer si functiile de prelucrare a sirurilor de caractere. Am realizat un program care permite analizarea unui fragment de text introdus de la tastatura, depisteaza cuvintele palindromuri, cuvintele cu litere in ordine alfabetica, cuvintele formate din litere in ordine alfabetica (segmentul initial al alfabetului si cel final). Realizand acelasi program prin utilizarea pointerilor am observat ca executarea este mult mai rapida. Utilizarea pointerilor permite reducerea timpului de asteptare a rezultatului executiei si difera considerabil in cazul softurilor complicate.