Sunteți pe pagina 1din 7

Prelucrarea șirurilor de caractere

Clasele VII-VIII

Data: 30-10-2021

PROF. GOREA-ZAMFIR CLAUDIU-CRISTIAN PAGINA 1


Codul ASCII
ASCII este o formă de reprezentare în calculator a caracterelor folosită în toate limbajele de
programare studiate în liceu, alături eventual de alte reprezentări.
Codul ASCII standard codifică caracterele folosind 7 biți, astfel că permite codificarea
a 27=128 caractere. Nu sunt prea multe! De fapt sunt codificate numai literele din alfabetul
englez, cifrele de la 0 la 9, semnele de punctuație și operatorii, precum și alte simboluri.
Lipsesc cu desăvârșire literele specifice altor alfabete latine (așa numite litere cu diacritice,
precum ar fi ă Ă î Î â Â ș Ș ț Ț ş Ş Ţ ţ (observăm că sunt două feluri de Ș și doua
feluri de Ţ, dar despre acest fapt vom discuta în alt articol ), precum și literele din alte alfabete:
chirilic, ebraic, arab, chinez, etc. Pentru memorarea acestor litere se poate folosi
codul ASCII Extins, sau codul UNICODE.
Prin codul ASCII, fiecărui caractere reprezentat în acest cod i se asociază un număr. Aceste
numere (numite chiar coduri ASCII) se găsesc în intervalul 0 .. 127. Caracterele ASCII se
împart în două categorii:
• caractere imprimabile – cele cu codurile ASCII în intervalul 32 126, inclusiv capetele:
aici se regăsesc toate caracterele care au o reprezentare grafică bine determinată:
o literele mari: A ... Z,
o literele mici: a ... z,
o cifrele 0 .. 9,
o semnele de punctuaţie .,:;!?'"
o caractere ce reprezintă operaţii aritmetice sau de alt tip: + - / * <> = (){}[]
o alte caractere: ~`@#$%^&_\|
o caracterul spaţiu
• caracterele neimprimabile, sau de control – cu codurile 0 .. 31 și 127. Ele erau folosit
mai demult pentru a controla transmiterea datelor. Caracterele neimprimabile nu au o
reprezentare grafică bine determinată – în funcţie de sistemul operare folosit,
reprezentările grafice ale acestor caractere pot fi foarte diferite, sau chiar să lipsească
cu totul. Dintre aceste caractere amintim două, de o importanţă mai mare în limbajele
de programare studiate:
o caracterul cu codul 0, numit și caracter nul, notat în C++ cu '\0' – reprezintă
finalul unui șir de caractere în memorie
o caracterul cu codul 10, numit Line Feed, notat în C++ cu '\n' – produce
trecerea la rând nou atunci când este afișat pe ecran sau într-un fișier.

PROF. GOREA-ZAMFIR CLAUDIU-CRISTIAN PAGINA 2


• literele mari și literele mici sunt diferite – au coduri ASCII diferite
• codurile ASCII ale literelor mari (sau mici) sunt în ordine: 'A' are codul 65, 'B' are
codul 66, .. , 'Z' are codul 90. Două caractere consecutive în alfabet au
coduri ASCII consecutive! De asemenea, litera 'a' are codul 97, etc.
• codurile ASCII ale literelor mici sunt mai mari decât codurile ASCII ale literelor mari
('a' > 'Z') și diferenţă între codurile ASCII a două litere (mică – mare) este 32.
• cifrele au coduri consecutive: caracterul '0' are codul 48, caracterul '1' are
codul 49, etc. *Observăm că caracterul '0' nu are codul ASCII 0, ci 48.
• caracterul spaţiu este un caracter imprimabil. Spațiul are codul ASCII 32.

PROF. GOREA-ZAMFIR CLAUDIU-CRISTIAN PAGINA 3


Șiruri de caractere în C++
În C++ există mai multe modalități de a reprezenta șirurile de caractere. Șirurile de caractere
reprezentate ca tablouri unidimensionale cu elemente de tip char,
char s[11]; char * p , s[31] = "pbinfo";
char s[11] = "copil"; // se folosesc doar 6 caractere p = s;
char t[]="copil"; // se aloca automat 6 octeti pentru sirul t cout << p << endl; // pbinfo
cin >> s; cin.getline(s , 11); cin.get(s , 11, ’\n’); p ++;
cout<<s; cout << p << endl; // binfo

Funcții pentru caractere


header-ul cctype header-ul cstring.
• int isalnum( int ch ); strlen( const char* str );
• int isalpha( int ch ); char* strcpy( char* dest, const char* src );
• int islower( int ch ); char *strncpy( char *dest, const char *src, int count );
• int isupper( int ch ); char *strcat( char *dest, const char *src );
• int isdigit( int ch ); char *strchr( char * str, char ch );
• int tolower( int ch ); char *strstr( char * s, char * t );
• int toupper( int ch ); int strcmp( char * s, char * t );
• dacă șirul s este lexicografi mai mic decât t funcția
va returna o valoare negativă
• dacă șirul s este lexicografi mai mare decât t funcția
va returna o valoare pozitivă
• dacă cele două șiruri sunt identice funcția va returna
valoarea 0

char *strtok( char *str, const char *sep );

Eliminarea unui caracter dintr-un sir


strcpy(t , s + x + 1);
strcpy(s + x , t);
Inserarea unui caracter într-un sir
strcpy(t , s + x);
strcpy(s + x + 1 , t);
s[x] = 'A'; // echivalent, *(s+x) = 'A';

PROF. GOREA-ZAMFIR CLAUDIU-CRISTIAN PAGINA 4


Exemple:
Un şir cu maximum 255 de caractere conţine cuvinte cuvinte formate numai din litere mici
ale alfabetului englez. Fiecare cuvânt este urmat de un caracter *. Scrieţi un program
C/C++ care citeşte un astfel de şir şi afişează pe ecran şirul obţinut prin eliminarea tuturor
apariţiilor primului cuvânt, ca în exemplu.
Exemplu: pentru şirul: bine*albine*foarte*bine* se va afişa:
*albine*foarte**
#include <iostream>
#include <cstring>
using namespace std;
char temp[100],text[1000],cuv[100];
int i,lc;
int main()
{
cin>>text;
i=0;
while(text[i]!='*')
{
cuv[i]=text[i];
i++;
}
cuv[i]='\0';
lc=i;
strcpy(text,text+lc);
///delimitarea cu stelute
strcpy(temp,"*");
strcat(temp,cuv);
strcat(temp,"*");
while(strstr(text,temp)!=0)
{
cout<<"subsirul ce contine textul cautat=";
cout<<strstr(text,temp)<<endl;
strcpy(strstr(text,temp)+1,strstr(text,temp)+1+lc);
cout<<"sirul ramas="<<text;
cout<<endl<<endl;
}
cout<<text;
return 0;
}
#include <iostream>
#include <cstring>
using namespace std;
char s[260],temp[260],cuv[260];
int i,ok,j,p1,p2;
int litera(char ch)
{
return (ch>='a' and ch<='z');
}
int main()
{
cin.get(s,260,'\n');

PROF. GOREA-ZAMFIR CLAUDIU-CRISTIAN PAGINA 5


i=0;
while(s[i]!='*')
{
cuv[i]=s[i];
i++;
}
cuv[i]='\0';
i=0;
while(i<strlen(s))
{
///inceput de cuvant
if ((i==0 or s[i-1]=='*') and litera(s[i])==1) p1=i;
///sfarsit de cuvant
if ((i==strlen(s)-1 or s[i+1]=='*') and litera(s[i])==1)
{
p2=i;
///am cuvant intre indicii p1 si p2
strncpy(temp, s+p1, p2-p1+1);
temp[p2-p1+1]=0;///NULL manual

if (strcmp(cuv,temp)==0)
{
strcpy(s+p1,s+p2+1);
i=-1;
}
}
i++;
}
cout<<s;
return 0;
}

Documentație
1. https://www.pbinfo.ro/articole/12645/cpp-stl-string
2. https://www.cplusplus.com/reference/cstring/
3. https://www.cplusplus.com/reference/cctype/
4. https://www.cplusplus.com/reference/string/string/?kw=string

PROF. GOREA-ZAMFIR CLAUDIU-CRISTIAN PAGINA 6


Probleme propuse

Ușoare Medii Dificile Concursuri


https://www.pbinfo.ro/problem https://www.pbinfo.ro/problem https://www.pbinfo.ro/probleme https://www.pbinfo.ro/probleme/2
e/2582/secvelim e/2592/afissimetric /2681/inversmax 682/lungimerandmax
https://www.pbinfo.ro/problem https://www.pbinfo.ro/problem https://www.pbinfo.ro/probleme https://www.pbinfo.ro/probleme/3
e/2584/insertinvers e/2673/swapcuv /2739/sirplatou 116/cifrab
https://www.pbinfo.ro/problem https://www.pbinfo.ro/problem https://www.pbinfo.ro/probleme https://www.pbinfo.ro/probleme/1
e/2692/lungsortdesc e/2678/formnr /1459/dim-maxim-binar 562/abba
https://www.pbinfo.ro/problem https://www.pbinfo.ro/problem https://www.pbinfo.ro/probleme https://www.pbinfo.ro/probleme/9
e/2693/vocsortdesc e/2680/poezie /889/cuvintecomune 64/cod
https://www.pbinfo.ro/problem https://www.pbinfo.ro/problem https://www.pbinfo.ro/probleme https://www.pbinfo.ro/probleme/2
e/2738/distlungmax e/2686/asciicomp /853/cadouri 295/baza
https://www.pbinfo.ro/problem https://www.pbinfo.ro/problem https://www.pbinfo.ro/probleme https://www.pbinfo.ro/probleme/2
e/3140/a1z26 e/2803/elimp /858/expresie6 417/criptare1
https://www.pbinfo.ro/problem https://www.pbinfo.ro/problem https://www.pbinfo.ro/probleme https://www.pbinfo.ro/probleme/1
e/2484/key e/2804/strncat /859/rime 996/zigzag
https://www.pbinfo.ro/problem https://www.pbinfo.ro/problem https://www.pbinfo.ro/probleme https://www.pbinfo.ro/probleme/1
e/2667/ec2i e/857/multimi4 /861/dublare 536/ecuatii
https://www.pbinfo.ro/probleme/2
168/dir
https://www.pbinfo.ro/probleme/1
098/reteta
https://www.pbinfo.ro/probleme/1
079/comp
https://www.pbinfo.ro/probleme/6
26/anagrame2

PROF. GOREA-ZAMFIR CLAUDIU-CRISTIAN PAGINA 1