Sunteți pe pagina 1din 8

Lucrare de laborator N5

Tema: Prelucrarea irurilor de caractere. Scopul lucrrii: Utilizarea funciilor standarte de prelucrare a irurilor de caractere i operaiile cu iruri. Suport teoretic: Cele mai des ntlnite utilizri ale tablourilor unidimensionale n limbajul C sunt irurile de caractere, din cauza c n C nu exist prevzut tipul de date ir de caractere. Pentru memorarea irurilor se utilizeaz tablouri cu tipul de baz char, care au pe ultima poziie caracterul \0. Pe lng necesitatea de a defini un ir de caractere ca i tablou de caractere, n prelucrarea irurilor se utilizeaz deseori tipul pointer la caracter. De exemplu: char sir[20]; // tablou de 20 de caractere char *psir; // pointer la caractere. Astfel, sir este o variabila de tipul tablou de caractere pentru care se rezerv un spaiu de memorie de 20 de octei, n timp ce psir este un pointer la caracter care poate primi ca valoare adresa unui caracter (n particular, adresa primului element dintr-un ir de caractere). Trebuie reinut c ori de cte ori se lucreaz cu variabile iruri de caractere ntr-un program, trebuie s existe fie o definiie de forma celei prezentate pentru variabila sir, prin care se rezerv static (n timpul compilrii), spaiul de memorie necesar variabilei, fie s se aloce dinamic memoria necesar. Funciile pentru prelucrarea irurilor sunt declarate n fiierul string.h. Ele primesc adresele irurilor prelucrate, prin intermediul parametrilor de tipul pointer la caracter. Denumirea funciilor de prelucrare a irurilor declarate n fiierul stdio.h char * gets(char* s) int puts(char* s) int strcmp(char* s1, char* s2) printf("%s",s1) explicaie Citete caracterele din intrare pn la ntlnirea caracterului Enter, care nu se adaug la irul s; plaseaz '\0' la sfritul lui s; returneaz adresa primului caracter din ir. Tiprete irul s, trece apoi la rnd nou. Compar irurile s1 i s2 spre care pointeaz pointerii s1, s2. Funcia returneaz 1 dac s1>s2, valoarea -1 dac s1<s2, i valoarea 0 dac s1=s2. Tiprete irul s1.

Denumirea funciilor de prelucrare a irurilor declarate n fiierul string.h int strncmp(char* s1, char* s2, int n) char *strcpy(char* s1, char* s2) char* strcat(char* s1, char* s2) char* strchr(char s, char c) strcspn(char* s1, char* s2) char *strncpy(char* s1, char* s2, int n) char *strtok(char *s1, const char *s2); int strlen(char* s1) strlwr(char* s1) strset(char* s1, char* s2) strrev(char* s) strrchr(char* s, int c) explicaie Compar irurile s1 i s2 spre care pointeaz pointerii s1, s2. Funcia returneaz 1 dac s1>s2, valoarea -1 dac s1<s2, i valoarea 0 dac s1=s2. Dar se compar irurile pentru cel mult n caractere. Copie irul surs s2 n irul destinaie s1 i returneaz adresa irului destinaie. Concatenarea irurilor i afiarea irului rezultat. Poziia primei apariii a caracterului c n irul s, respectiv NULL dac c nu este n s. Afieaz prima apariie a caracterului care coincide n ambele iruri. Copie maxim n caractere de la irul surs s2 n irul destinaie s1 i returneaz adresa irului destinaie. Desparte irul s1 de irul s2. Returneaz lungimea irului fr a numra caracterul de sfrit \0. Convertete irul din litere mari (A la Z) n litere mici (a la z). Caut prima intrare a irului s2 n irul s1. Inverseaz irul. Verific ultima intrare a simbolului c n irul s. Returneaz pointerul spre ultimul simbol ce coincide cu c a irului s. Dac nu-l gsete returneaz NULL.

char*strpbrk(const char*s, const char*s1) strrupr(s) isalpha(s) isdigit(c) islower(s) isspace(c) int atoi(const char* s) int atoi(const char* s) itoa(int n, char* s, int ) double atof(char* s) char*gcvt(double v,int n, char*buf)

Cut n irul s orice simbol din irul s1 i afieaz pe acel care mai naite se ntlnete n irul s. Convertete irul din litere mici (a la z) n litere mari (A la Z). Verific dac s este liter. Dac c cifr. Dac este liter de la a la z. Dac c este spaiu.z Convertete irul s ntr-o valoare ntreag. Convertete irul s ntr-o valoare ntreag lung. Convertete un ntreg n char. Convertete sirul s ntr-o valoare real Convertete datele de tip double ntr-un ir de simboluri, inclusiv simbol cu virgul mobil. Mai des se folosete la convertirea numerelor introduse ca ir de simboluri, i efectuarea anumitor operaii asupra lor.

Exemple de programe: Exemplul 4.1. Este dat irul s. S se tipreasc cte litere de a se ntlnesc in ultimul cuvnt di ir(de ex. Ana frate ada; rezulat: 2). #include<stdio.h> #include<conio.h> #include<string.h> void main() { char s[256]; int i,j=0; clrscr(); gets(s); for(i=strlen(s)-1; s[i]!=' '; i--) //parcurgem irul de la sfrit if(s[i]=='a') j++; //dac gsim litera a, contorul j va crete printf(" Litere de a n ultimul cuvnt sunt: %d",j); getch(); } Exemplul 5.2. Fiecare caracter se nlocuiete cu urmtorul caracter(de ex. abc se tiprete bcd) pn la apsarea tastei cifrei 9. #include<stdio.h> #include<conio.h> #include<string.h> void main() { char g,c; int i,j,x,k; g=0; clrscr(); while(!g) { c=getchar(); // att timp ct g=0, citete cu ecou caractere, pn c!=9 if ( c == '9' ) { g = 1; continue; } // dac c=9, atunci g=1 i continu la urmtorul pas putchar (c+1); } // preia urmtorul caracter, adic tiprete urmtorul caracter getch(); } Exemplul 5.3. Este dat irul d. S se concatineze irurile i copierea unui ir n alt ir. #include <string.h> #include <stdio.h> #include <conio.h> void main(void)

{ char d[25]; char *blank = " ", *c = "C++", *t = "Turbo"; clrscr(); gets(d); strcat(d, blank); // se concatineaz, la concatinare se pstreaz textul din ambele iruri strcpy(d, t); // irul t se copie n d, i textul din irul d se terge strcat(d, c); //se concatineaz printf("%s\n", d); // TurboC++ getch(); } Exemplul 5.4. Este dat irul s. S se numere cte cuvinte are irul. #include<stdio.h> #include<conio.h> #include<string.h> void main() { char s[20]; int i,k; k=1; clrscr(); printf("sir\n"); gets(s); for(i=1;i<strlen(s);i++) //parcurgem irul de la poziia 1 pn la lungimea irului { if((s[i-1]==' ')&&s[i]!=' ') //verificm dac este cuvnt, dintre spiu k++; //contor ce numr cuvintele } printf(" %d",k); getch(); } Exemplul 5.5. Este dat irul s. De desprit fiecare propoziie din rnd nou. Propoziia se termin cu punct. #include<stdio.h> #include<conio.h> #include<string.h> void main() { char s[256],*t; clrscr(); printf("sir\n"); gets(s); t=strtok(s,"."); // atribuim lui t irul s pn la punct while(t!=NULL) //att timp ct nt t sunt propoziii { printf("%s\n",t); //tiprim din rand nou t=strtok(NULL,"."); // } getch(); } Exemplul 5.6. Este dat un cuvnt s de maxim 20 caractere. S se verifice dac cuvntul introdus este polidrom (de exemplu cojoc, adic se citete de la stnga i de la dreapta). #include<stdio.h> #include<conio.h> #include<string.h> #include<stdlib.h> void main() { char s[20]; int i,k,l,h=1; clrscr(); printf("sir\n"); gets(s); k=strlen(s);

l=k/2; for(i=0;i<l;i++) { if(h) if(s[i]==s[k-i-1]) h=1; else { printf("nu\n"); getch(); exit(0); } } printf("polidrom=%s",s); getch(); } Exemplul 5.7. Este dat irul s. S se tipreasc cuvintele ce au lungimea mai mare dect 6 caractere. #include<stdio.h> #include<conio.h> #include<string.h> void main() { char s[256]; int i,j,x; j=0;x=0; clrscr(); printf("sir\n"); gets(s); for(i=0;i<strlen(s);i++) { j++; if(s[i]==' ') { if(j>6) for(k=x;k<i;k++) s[k]=' '; j=0;x=1; } } printf("=%s",s); getch(); } Exemplul 5.8. Este dat irul s. De tiprit irul astfel nct, unde sunt mai mult de un spaiu de considerat numai unul(De exemplu: azi plou, rezultat: azi plou). #include<stdio.h> #include<conio.h> #include<string.h> void main() { char s[256]; int i,j; clrscr(); printf("sir\n"); gets(s); for(i=0,j=0;i<strlen(s);i++) // se verific dac, s[i] nu este spaiu sau s[i] este spaiu i urmtoare(s[i+1]) poziie nu este spaiu if((s[i]!=' ')||(s[i]==' ')&&(s[i+1]!=' ')) s[j++]=s[i]; // n irul s[j], unde j crete la fiecare cuvnt, se nscrie irul s[i] s[j]='\0'; //ultimul caracter zero puts(s); //tiprim irul getch(); } Exemplul 5.9. S se tipreasc poziia caracterului ce se afl n ambele iruri.

#include<conio.h> #include<stdio.h> #include<string.h> void main() { char s[256]; int i,l; clrscr(); printf(dm irul); // de exemplu: abcdmh gets(s); for(l=0;l<strlen(s);l++) i=strcspn(s,"nmn"); // atribuie poziia primului caracter din irul s printf("%d\t",i);//i=4 deoarece m se afl pe poziia 4 getch(); } Exemplul 5.10. Este dat irul s i subirul cutat. S se caute un subir n irul s. #include<conio.h> #include<stdio.h> #include<string.h> void main() { char s[256],s1[256],*p; int i; clrscr(); printf("dati irul s:"); //de exemplu: ada ion mihai gets(s); printf("dati subirul cutat:"); //ion gets(s1); for(int l=0; l<strlen(s); l++) p=strstr(s,s1); printf("Subirul cutat: %s\t",p); //ion getch(); } Exemplul 5.11. Este dat irul s. S se tipreasc la ecran: irul pn la dou puncte; irul dup dou puncte. #include<conio.h> #include<stdio.h> #include<stdlib.h> #include<string.h> void main() { char s[256],*p; int i,j; i=j=0; clrscr(); printf("dati irul:"); gets(s); //asfsd:fdfh:hjkl; p=s; printf("\nirul pna la dou puncte:"); while(p[i]!=':'){ putchar(p[i]); i++; // afiarea irului (asfsd) } i++; j++; printf("\nsirul dupa doua puncte:\n"); for(i; i<=strlen(p); i++) putchar(p[i]); // fdfh:hjkl; getch(); } Exemplul 5.12. Este dat irul s. S se gseasc cuvintele ce conin litera s. #include <string.h> #include <stdio.h> #include <conio.h> void main(void)

{ char s[256]; char *ptr, c='s'; clrscr(); printf("dai irul:\n"); gets(s); ptr = strchr(s,c); if (ptr) printf("caracterul %c se afl pe poziia: %s\n", c, ptr); else printf("nu este aa caracter\n"); getch(); } Exemplul 5.13. Este dat irul s. S se afieze lungimea celui mai scurt cuvnt i numrul de cuvinte. #include<stdio.h> #include<string.h> #include<conio.h> void main() { char s[256],*t,*p; int k,min; k=0; clrscr(); printf("dati sirul:"); gets(s); t=s; t=strtok(s," "); //atribuim lui t cuvintele desprite prin spaiu min=strlen(t); //notm prin min lungimea irului t while(t!=NULL) //verificm att timp ct avem cuvinte { printf("%s\n",t); //tiprim fiecare cuvnt din rand nou if(min>strlen(t)) //dac se gsete un cuvnt cu lungimea mai mic ca min iniial min=strlen(t); //atunci min primete lungimea acelui cuvnt t=strtok(NULL," "); k++; //numr cuvintele } printf("\nnr de cuvinte:%d\nlungimea celui mai scurt cuvant:%d",k,min); getch(); } Exemplul 5.13. Folosind funcia gcvt(). S se efectueze unele operaii pentru convertirea irului. #include<stdio.h> #include<string.h> #include<conio.h> #include<stdlib.h> void main() { char s[256]; double n; int k=4; n=2.897; gcvt(n, k. s); printf(%s ,s); // 2.897 // numr negativ n=-982.897; gcvt(n, k. s); printf(%s ,s); // -982.8 // exponenial n=0.897e3; gcvt(n, k. s); printf(%s ,s); // 8970 } Probleme propuse spre rezolvare:

1. 2. 3. 4. 5. 6. 7. 8. 9.

10. 11. 12. 13. 14. 15. 16. 17. 18. 19.

Se citete un ir. S se numere cuvintele care ncep cu litera b. S se afieze toate poziiile unui caracter intr-un ir dat. Caracterul se introduce de la tastatur(de exemplu: adelina; a are poziia 0 i 6). Se citete un ir de caractere care nu conine caractere albe. S se decid dac irul este alctuit exclusiv din caractere numerice. S se determine numrul de litere mari i mici dintr-un text dat. Se citete un ir ce conine i dou puncte. S se afieze ntre dou puncte(Ex: ada:hjk:vbnv, irul rezultat; hjk). Se citete un ir. S se tipreasc la ecran cuvntul cu lungimea mai mic. Se citete un ir. S se tipreasc la ecran caracterul de cod maxim i simbolurile cu codurile cuprinse ntre [100, 235]. Se citete un ir. S se tipreasc la ecran irul dintre paranteze (Ex: asdf (ghdfhg ) fdhj,6g - ghdfhg). Se d o list de cuvinte separate prin spaiu, lista care se ncheie prin dou rnduri goale succesive (dou enter-uri). S se tipreasc n ordine alfabetic toate polindroamele care apar n list. Un polindrom este un cuvnt care este identic citit de la nceput spre sfrit cat i de la sfrit spre nceput (Ex: cazac, elevele, cojoc). Se citete un text. Textul conine cuvinte separate printr-un spaiu. Dac textul conine *, atunci fiecare simbol / ce precede * s fie nlocuit cu ,. Se citete un text. Textul conine cuvinte separate printr-un spaiu. S se scrie, pe linii separate, fiecare cuvnt care apare n text urmat de un numr care va reprezenta de cte ori apare cuvntul n text. S se determine cuvntul care apare de cele mai multe ori. Se citete un text. Textul conine cuvinte separate printr-un spaiu. Se va genera un nou text care va conine cuvintele ordonate alfabetic. Se citete un text. Textul conine cuvinte separate printr-un spaiu. S se determine numrul de apariii al fiecrui caracter. Informaia referitoare la un caracter se va afia o singur dat. Se citete un text. Textul conine cuvinte separate printr-un spaiu. Se va genera un nou text care va conine cuvintele n ordine invers(asdf - fdsa). S se sorteze alfabetic un ir de cuvinte (eventual, s se disting literele mici de cele mari). Se d un text de maxim 30 de caractere. S se listeze toate cuvintele de dou caractere din acest text. Se dau dou texte. S se stabileasc o vocal comun celor dou texte, care apare de cele mai puine ori. Fie un ir de forma: cifr-liter, cifr liter etc.(Ex : 2a4b5c). S se genereze un astfel de ir: aabbbbccccc. Se citete un ir de caractere alfanumerice. Considerm c literele sunt separatorii numerelor. Afiai datele de tip numeric preluate n ordine din irul citit. Numerele vor fi scrise cte unul pe o linie.

Ex. in.txt a23sc345ss5e

out.txt 23 345 5 20. Se citete un text de la tastatur astfel nct cuvintele s fie separate printr-un singur spaiu i imediat dup ultimul cuvnt se scrie punct. Textul va fi scris pe un singur rnd: a. S se determine dac textul are cuvinte distincte (se ignora diferena de cheie). b. S se tipreasc cuvintele cu lungimea mai mare ca 6. c. S se determine dac textul conine cifre. 21. Este dat un ir de caractere (lungimea irului este <=100). De codificat acest ir n urmtorul mod: caracterele se plaseaz ntr-un ptrat de dimensiune minim pe spiral, ncepnd cu colul de dreapta jos n direcia acelor de ceasornic. Spaiul se codific prin *. Intrare: de la tastatur se va introduce irul de caractere. Ieire: se va afia la ecran dimensiunea aleas a ptratului i textului codificat. Exemplu: Bun dimineaa, Chiinu! Ieire: 5 ineatminaai!u,dihC**anuB i n e a t m i n a a i ! u , d i h C * * a n u B 22. Se consider dou iruri: a=a 1an i b=b1bm formate din n i respectiv m litere. Asupra irului a se pot face urtoarele operaii. tergere: S(i) terge litera de pe poziia i. Inserare: I(j,c) insereaz litera c pe poziia j. Modificare:M(i,c) nlocuiete litera de pe poziia i cu c. S se transforme irul a n irul b cu numr minim

de astfel de operaii. Exemplu: a= DANIELA, b=IOANA. Numrul minim de operaii este 5 i anume: M(1,1); I(2,O); S(5); S(6); S(5). Intrare: a i b se citesc de la tastatur. Restricii: m>0, n<80. ntrebri de control: 1. 2. Ce returneaz funciile: strlen(ASEM), strlen(asem0), strlen(ASEM\N), strlen (0), strlen()? Care va fi rezultatul returnat de funciile: strcat(Limbajul C, ++), strncat(Cibernetica, ,Informatica Aplicat, Management, Matematica, 21)? 3. Ce afieaz puts(strstr(Informatica Aplicat,scop));? Explicai. 4. Ce returneaz funciile: strcmp(asem,ASEM), stricmp(ASEM, asem), strncmp(Limbajul C, Limbajul C++, 10), strnicmp(INFORMATICA, informatica,1)? 5. Fie char *s=Costel, Vicu i Andrei merg la teatru , *q=Vicu; puts(strstr(s,q)) ; Cine merge la teatru? Explicai. 6. #define L 15 char sir[L]; strcpy(sir,"123\0456"); printf("irul copiat este:/%s/ i are lungimea:%d\n",sir, strlen(sir)); Ce se tiprete pe ecran?. 7. char s[]=70000; int i=atoi(s); long l=ato1(s); printf(%d\t%ld,i,l); Explicai. Ce se tiprete la ecran?. 8. char s[]=asdfghjert; int i; i=strcspn(s,fnm); Explicai. Ce se tiprete la ecran, ce valoare primete variabila i?. 9. char s1[]=asdfghjert; char s2[]=esa; char *p; p=strpbrk(s1,s2); printf((%s, p); Explicai. Ce se tiprete la ecran?. 10. char s1[]=asdfghjert; char *p; p=strrchr(s1,j); printf((%s, p); Explicai. Ce se tiprete la ecran?.