Sunteți pe pagina 1din 16

Ministeriul Educaiei al Republicii Moldova

Universitatea Tehnic a Moldovei

Raport
la lucrarea de laborator nr.7-8
la Programarea Calculatoarelor
Tema: Prelucrarea caracterelor i irurilor caracteriale n C
Varianta nr.23

Elaborat: Mazurchevici Ion


Grupa: TI -162
Verificat : Foca Petru

Chiinu 2016
Obiectivele temei:
1. Aprofundarea cunotinelor n limbajul i mediul TurboC i perfecionarea tehnicii de programare n
prelucrarea tipul caracter i irurilor de caractere n C.
2. nsuirea procedeelor referitoare la irurile caracteriale.
3. Analiza specificului de algoritmizare i programare a fragmentelor de texte prin comparaia soluiilor
stereotipe i celor eficiente de introducere, afiare i diverse manipulri asupra textelor: parcurgeri,
cutri, schimbri i rearanjri etc.
Subiectele temei i ordinea executrii:
Studierea principiilor prelucrrii (descrierii, declarrii, formrii, etc.) tipului caracter i irurilor
caracteriale n C.
Studierea metodelor i tehnicilor de baz de prelucrare a textelor ca iruri caracteriale, analiznd
exemplele din indicaii i de reflectat n raport cu comentariile de rigoare.
Elaborarea algoritmului i programului de soluionare a variantei respective (Anexa).
Depanarea programului i verificarea corectitudinii cu ajutorul testelor elaborate.

Note teoretice:
O variabil de tip caracter se declar prin specificatorul de tip char. Zona
alocat undei variabile de tip char este de un octet, putnd avea 256 de valori
distincte. Ea este sufucient de mare pentru a putea memora orice caracter al setului
de caractere implementate pe calculator.
Ordinul de mrime al variabilelor caracter este ntre -128 i 127. Caracterele
setului ASCII sunt toate pozitive, dar o constant caracter specificat printr-o
secven de evitare poate fi i negativ, de exemplu ,\377 are valoarea -1.
Constantele de tip caracter pot fi scrise n mai multe moduri:
1. Un caracter imprimabil ntre apostrofuri: *,3,a;
2. Un numr de la 0 la 255 precedat de caracterul #: #27 (codul
caracterului ESC), #65 (codul caracterului A); etc.
Un ir de caractere este o succesiune de zero sau mai multe caractere ale
setului de
caractere ASCII extins, scrise pe o singur linie n program i ncadrate ntre
apostrofuri, irul fr nici un caracter ntre apostrofuri se numete ir nul vid.
O constant caracter const dintr-un singur caracter scris ntre apostrofuri,
de exemplu ,x. Valoarea unei constant character este valoarea numeric a
caracterului, n setul de caractere al calculatorului. O constant simbolic este un
identificator cu valoare de constant. Valoarea constantei poate fi orice ir de
caractere introdus prin construcia #define nume_constant constanta_caracter. De
exemplu #define MAX 1000.

Funcii predefinite de prelucrare a tipului caracter i irurilor:


char* gets(char *s) citete caracterele din intrare pn la ntlnirea
caracterului ENTER care nu se adaug la irul s; plaseaz s la sfritul lui
s; returneaz adresa primului caracter din ir; dac se tasteaz CTRL+Z
returneaz NULL; codul lui ENTER e scos din buffer-ul de intrare.
int puts(char *s) tiprete irul s, trece apoi la rnd nou.
scanf(%s,s) citete caracterele din intrare pn la ntnirea primului
blanc sau ENTER, care nu se adaug la irul s.
getch() citete de la tastatur codul ASCII al caracterului tastat.
getche() citete de la tastatur codul caracterului ASCII i n afieaz pe
ecran.
getchar() citete codul ASCII al caracterului introdus de la tastatur.
putchar(expresie) afieaz un caracter corespunztor codului ASCII
transmis.
gets() citirea cu ecou a unui ir de caractere.
puts() afieaz un ir a crui adres de nceput este specificat ca
parametru.

Specificatori de format ai funciei printf():


Cod Semnificaie
%c Caracter
%d Intreg cu semn
%i Intreg cu semn
%e Afisare numere reale in format cu exponent (e)
%E Afisare numere reale in format cu exponent (E)
%f Afisare numere reale simpla precizie cu virgula
%g Foloseste cel mai scurt format dintre %e si %f
%G Foloseste cel mai scurt format dintre %E si %f
%o Afisarea unui numar in octal
%s Afisarea unui sir de caractere
%u Un intreg fara semn
%x Hexazecimal fara semn (folosind litere mici)
%X Hexazecimal fara semn (folosind litere mari)
%p Afisarea unui pointer
%n Pointer intreg spre numarul de caractere afisate
anterior
%% Afisarea semnului %
Tabelul 1. Specificatori de format ai funciei printf();

S.N. Funcia & descrierea


1 strcpy(s1, s2);
Copie s2 n s1.
2 strcat(s1, s2);
Concateneaz s2 la sfritul s1
3 strlen(s1);
Returneaz lungimea s1.
4 strcmp(s1, s2);
Returneaz 0 dac s1 i s2 sunt asemenea; mai puin dect 0
dac s1<s2; mai mult ca 0 dac s1>s2.
5 strchr(s1, ch);
Returneaz poiunterul ch n string s1.
6 strstr(s1, s2);
Returneaz pointeruul string s2 n string s1.
Tabelul 2. Funcii care pot fi aplicate asupra irurilor de caractere.

Urmtoarea declaraie creaz i iniializeaz un sir ce conine cuvntul


Hello. Pentru declarare folosim urmtoarea secven de cod:

1. char greeting[6] = {'H', 'e', 'l', 'l', 'o', '\0'};

sau

1. char greeting[] = "Hello";


n urma executrii uneia din secveele de cod prezentate mai sus n memoria
calculatorului se va crea urmtoarea imagine:

ntrebri de autocontrol:
1. Un ir de caractere este o succesiune de zero sau mai multe caractere ale
setului de caractere ASCII extins, scrise pe o singur linie n program i
ncadrate ntre apostrofuri. irul fr nici un caracter ntre apostrofuri se
numete ir nul sau vid.

2. char* gets(char *s) citete caracterele din intrare pn la ntlnirea


caracterului ENTER care nu se adaug la irul s; plaseaz s la sfritul lui
s; returneaz adresa primului caracter din ir; dac se tasteaz CTRL+Z
returneaz NULL; codul lui ENTER e scos din buffer-ul de intrare.
int puts(char *s) tiprete irul s, trece apoi la rnd nou.
scanf(%s,s) citete caracterele din intrare pn la ntnirea primului
blanc sau ENTER, care nu se adaug la irul s.
getch() citete de la tastatur codul ASCII al caracterului tastat.
getche() citete de la tastatur codul caracterului ASCII i n afieaz pe
ecran.
getchar() citete codul ASCII al caracterului introdus de la tastatur.
putchar(expresie) afieaz un caracter corespunztor codului ASCII
transmis.
gets() citirea cu ecou a unui ir de caractere.
puts() afieaz un ir a crui adres de nceput este specificat ca
parametru.

3. Funciile predefinite pentru prelucrarea irurilor de caractere.


S.N. Funcia & descrierea
1 strcpy(s1, s2);
Copie s2 n s1.
2 strcat(s1, s2);
Concateneaz s2 la sfritul s1
3 strlen(s1);
Returneaz lungimea s1.
4 strcmp(s1, s2);
Returneaz 0 dac s1 i s2 sunt asemenea; mai puin dect 0
dac s1<s2; mai mult ca 0 dac s1>s2.
5 strchr(s1, ch);
Returneaz poiunterul ch n string s1.
6 strstr(s1, s2);
Returneaz pointeruul string s2 n string s1.
4.
#include<conio.h>
#include<stdio.h>
#include<string.h>
#define NMAX 500

char s[NMAX],cv[NMAX],cuv[NMAX][25],*p,c;
int ncuv=0,l,i,j;

void generare2(int i){


strcpy(cv,cuv[i]);
l=strlen(cv);
if(l%2){
for(j=l/2;j<l-1;j++) cv[j]=cv[j+1];
cv[l-1]='\0';
}
printf("%s ",cv);
if (i<ncuv){
i++;
generare2(i);
}
}

void generare1(int i){


strcpy(cv,cuv[i]);
l=strlen(cv);
if(l>1) {
cv[l-2]=cv[l-1];
cv[l-1]='\0';
}
printf("%s ",cv);

if (i<ncuv{
i++;
generare1(i);
}
}
void generare(int i){
strcpy(cv,cuv[i]);
l=strlen(cv);
c=cv[0];
for(j=0;j<l-1;j++)
cv[j]=cv[j+1];
cv[l-1]=c;
printf("%s ",cv);
if (i<ncuv){
i++;
generare(i);
}
}
void main() {
printf("Introduceti irul de caractere:\n");
gets(s);

// Extragerea cuvintelor din ir


p=strtok(s," ");
while(p){
strcpy(cuv[ncuv++],p);
p=strtok(NULL," ");
}

// Stergerea punctului din ultimul cuvant


l=strlen(cuv[ncuv-1]);
if(cuv[ncuv-1][l-1]=='.') cuv[ncuv-1][l-1]='\0';

// a)
printf("\n a) Deplasarea primei litere la sfarsitul cuvintelor:\n");
generare(0);
printf("\b.\n\n");

// b)
printf("b) Inlaturarea penultimei litere a cuvintelor:\n");
generare1(0);
printf("\b.\n\n");

// c)
printf("c) Inlaturarea literei din mijloc a cuvintelor de lungime impara:\n");
generare2(0);
printf("\b.\n\n");

getch();
}
5. Unde este eroarea?
char s[14];
strcpy(s, "Ce mai faci ?\n");
Greeala const n faptul c nu poate fi accesat new line ntr-un ir de
caractere.

char s[14];
scanf("%s", &s);

n ceast secven nu exist careva greeli sau restricii.


6. Apreciai ce face urmtoarea secven de cod.
#include<conio.h>
#include<stdio.h>
#include<string.h>
#define NMAX 500

int firstword(char *S, char *buf)


{ int i=0;
while(S[i]!=0 && i<strlen(S))
{ if(S[i]==' ' && i<strlen(S)) i++;
if(S[i]!=' '&& i<strlen(S))
{ int j=0;
while(S[i]!=' ' && i<strlen(S))
{ buf[j]=S[i];
j++; i++;
}
buf[j]=0;
return 0;
}
}
return 0;
}

void main() {
char ch[100]={"Cel mai bun prieten"};
char sda[100];
firstword(ch, sda);
puts(sda);
}

Aceast secven de cod introduce n sda cuvntul Cel.


7. Analizai corectitudinea i explicai descrierile, scopul i rezultatele ce se
vor obine.
int f(){const char *pc=abc; pc[1]=x; pc=123; return;}
int g(){char*const cp=abc;cp[1]=x; cp=123; return cp;}
int h(){const char*const cpc=abc;cpc[1]=x; cpc=123; return cpc;}
int{*arr[3] ) ()={f,g,h};
main(){int i;for(i=0;i<3;i++)printf (%d\n,(*arr[i])(i+7));}

n secvena dat de cod const din diferena de declarare a variabilelor ceea ce


face posibilitatea de apariie a numitei greeli n program:
- const char* const const dintr-o constant pointer ntr-un char constat
care nu poate fi modificat.
- -const char* vs char const* sunt echivalente.

8. Editai, compilai i rulai urmtorul program C, care citete niialele


numelui vostru i afieaz un salut.
#include <stdio.h>
#include <conio.h>
void main(void){
char c1,c2;
clrscr();
puts("*** Buna! ***");
printf("Initialele numelui tau:");
c1=getche();c2=getche();
printf("\nImi pare bine, %c.%c.!\n",c1,c2);
puts("*** Succes! ***");
getche();
}

Rezultatul execuiei:

9. Corectai, completai i rulai urmtoarele dou secvene, observnd


conversiile implicite i explicite:
char c='a',cc;
int i=4;
float f=5.95;
printf("%d %f\n",i,f); i=f;
printf("%d %f\n",i,f); f=i+100000;
printf("%d %f\n",i,f); i=-99.001;
f='a';
c=0x3239; cc=-i; // preluarea ultimului octet
printf("%d %f %c %c\n",i,f,c,cc);
float r1=5/2,
r2=(float)5/2,
r3=(float)(5/2),
r4=5/(float)2,
r5=(float)5/(float)2;
printf("%f %f %f %f %f\n",r1,r2,r3,r4,r5);

Rezultatul execuiei:

10. Analizai construcia i rulai programul pentru determinarea rezultatelor.

#include <stdio.h>
#include <string.h>
#include <conio.h>
#include <ctype.h>
#define LUNG 80
. #define NR 15
char tab_cuv[NR][LUNG];
int nr_cuv=0; /* numarul cuvintelor introduse */
void citire_cuv(void){
printf("*** Se introduc max %d cuvinte, term. cu CTRL/Z:\n",NR);
while(nr_cuv<NR && gets(tab_cuv[nr_cuv]))nr_cuv++;
/* la CTRL/Z gets returneaza NULL (= 0) */
/* citirea se poate face si cu scanf:
while(nr_cuv<NR && scanf("%s",tab_cuv[nr_cuv])!=EOF)nr_cuv++; */
/* daca terminarea se face cu un cuvant vid:
while(nr_cuv<NR && strcmp("",gets(tab_cuv[nr_cuv])))nr_cuv++; */
}
void constr_cuv(void){
char c,cuv[NR+1]; /* lungimea maxima este egala cu numarul maxim de cuvinte + 1
pentru terminator */
int i,j; /* i parcurge cuvintele din tab_cuv, j pozitiile din cuv */
for(i=j=0;i<nr_cuv;i++)
if(isalpha(c=tolower(tab_cuv[i][strlen(tab_cuv[i])-1])))
cuv[j++]=c;
cuv[j]='\0';
printf("*** Cuvantul construit:|%s|\n",cuv);
}
void cuv_max(void){
int i,lung_crt,lung_max=0;
char * p_max; /* pointerul spre cuvantul maxim */
/* se poate memora indicele cuvantului maxim: int i_max;
sau memora cuvantul maxim intr-un sir: char c_max[LUNG]; */
for(i=0;i<nr_cuv;i++)
if((lung_crt=strlen(tab_cuv[i]))>lung_max){
p_max=tab_cuv[i];
lung_max=lung_crt;
}
printf("*** Cuv de lungime maxima %d este:|%s|\n",lung_max,p_max);
}
void cuv_vocale(void){
int i;
puts("*** Cuvintele ce incep cu vocale:");
for(i=0;i<nr_cuv;i++)
switch(toupper(tab_cuv[i][0])){
case 'A': case'E': case 'I': case 'O': case 'U':puts(tab_cuv[i]);
} /* in loc de switch se putea folosi
char c; if(c=toupper(tab_cuv[i][0]),c=='A' ||
c=='E' || ...)puts(tab_cuv[i]); */
}
void main(void){
citire_cuv();
cuv_max();
constr_cuv();
cuv_vocale();
getch();
}

Rezultatul execuiei:

Sarcina propus spre rezolvare:


Pornind de la un sir citit de la tastatura, sa se construiasca si sa se tipareasca :
sirul care contine cifrele din cel initial ;
sirul care contine minusculele vocalelor din cel initial ;
sirul invers celui initial; sa se verifice daca sirul initial este palindrom ;
Algoritmul programului:

Start

int i,k,j,q,n,h

"introdu un sir \n"

gets(s)

k=0
j=0
h=0

i=0; i<strlen(s);i++

Da
s[i]>='0' && s[i]<='9'

Nu
s1[k++]=s[i]
s1[k]='\0'

s[i]=='a' || s[i]=='u' || Da
s[i]=='e' || s[i]=='i' || s[i]
=='o'

Nu

s2[j++]=s[i]
s2[j]='\0'

Da
s[i]>='A' && s[i]<='Z'

Nu
s4[h++]=s[i]
s4[h]='\0'

A
A

strcpy(s3,s)

strrev(s3)

q=strcmp(s,s3)

"cifre: "

puts(s1)

"vocale: "

puts(s2)

Nu Da
q==0

"sirul nu este palindrom\n" "sirul este palindrom\n"

"litere majuscule: "

puts(s4)

Sfirsit

Elaborarea programului propriuzis:


#include<stdio.h>
#include<conio.h>
#include<string.h>
void main()
{
char s[50],s1[50]={0},s2[50]={0},s3[50],s4[50]={0},s5[50];
int i,k,j,q,n,h;
printf("introdu un sir \n");
gets(s);
k=0;j=0; h=0;
for (i=0; i<strlen(s);i++){
if (s[i]>='0' && s[i]<='9'){
s1[k++]=s[i];
s1[k]='\0';
}
if (s[i]=='a' || s[i]=='u' || s[i]=='e' || s[i]=='i' || s[i] =='o' ){
s2[j++]=s[i];
s2[j]='\0' ;
}
if (s[i]>='A' && s[i]<='Z'){
s4[h++]=s[i];
s4[h]='\0';
}
}
strcpy(s3,s);
strrev(s3);
q=strcmp(s,s3);
printf("cifre: "); puts(s1);
printf("vocale: "); puts(s2);
if (q==0) {
printf("sirul este palindrom\n");
}
else {printf("sirul nu este palindrom\n");
}
printf("litere majuscule: "); puts(s4);
}

Rezultatul execuiei:
Concluzie:

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