Documente Academic
Documente Profesional
Documente Cultură
Laborator 2
Laborator 2
Referat
Lucrare de laborator Nr.2 la Structuri de Date i Algoritmi
Analiza eficienei prelucrrii sirurilor de caractere cu pointeri
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 *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]);
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);
3.Schema bloc
Simetric l,i
Alfabetic
l,i
i=0
i=0;
i<l/2
i<l-1
s[i]>s[i+ 1]
return 0; i++;
return 1;
return 1;
Sfarsit
nrRepPrimaLitera
i,l,rez=0
i<l
(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
simetric(cuv[i] )
tolower(s[i])!=tolower(s[i+1]) +1
cuv[i] i++;
\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);
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]
\n\n
i=0;
i<ncuv
a[i]==max
xyz(cuv[i])
\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.