Algoritmi legati de lucrul cu siruri de caractere

 

A. TIPUL DE DATE caracter (char)

 

Este cel mai mic întreg: ocupă 8 biţi, (un octet).

Intervalul de numere care se pot reprezenta pe 8 cifre binare este de la 0 la 28-1, adică 0..255, cu totul 256 de valori; deoarece avem şi numere negative, intervalul se translatează cu 128, ceea ce înseamnă că un char este un număr întreg din intervalul -128..127.

În acelaşi timp, ştim că el este un tip dual: poate fi văzut atît ca întreg pe 8 biţi cît şi ca un caracter. Dacă vrem să îl tipărim, putem folosi în C formatul %d (dacă vrem să afişăm valoarea lui întreagă), respectiv formatul %c (pentru a-l afişa ca un caracter).

În C++ putem folosi cout<<.

 

Up Home Structura Site Algoritmi elementari

 

A1. Constantele caracter

sunt incadrate intre apostrofuri.

Exemple: 'a' 'B’ ‘5’ ‘?’ ‘+’ şi orice găsim în sectorul principal al tastaturii

O constantă caracter are ca valoare codul ASCII al caracterului pe care il reprezintă.

http://www.asciitable.com/

Acest set de caractere are următoarele proprietăţi:

 

Up Home Structura Site Algoritmi elementari

 

 

A1.1 Constante caracter corespunzătoare caracterelor imprimabile

O constantă caracter corespunzătoare unui caracter imprimabil se reprezintă prin caracterul respectiv, inclus între apostrofuri.

Exemple:


  ‘A’   are valoarea 65
  ‘a’   are valoarea 97
  ‘0’   are valoarea 48
  ‘*’   are valoarea 42

Excepţii de la regula de mai sus le constituie caracterele imprimabile apostrof (') si backslash (\).


Caracterul backslash se reprezintă: '\\'.

Caracterul apostrof se reprezintă: '\''.

 

Up Home Structura Site Algoritmi elementari

 

 

A1.2 Constante caracter corespunzătoare caracterelor NEimprimabile

 

Pentru caracterele neimprimabile, se folosesc secvenţe escape.
O secvenţă escape furnizează un mecanism general şi extensibil pentru  reprezentarea caracterelor invizibile sau greu de obţinut.

În continuare, sunt prezentate câteva caractere escape utilizate frecvent:

‘\n’ 10 LF rand nou (Line Feed)
‘\t’ 9 HT tabulator orizontal
‘\r’ 13 CR pozitioneaza cursorul in coloana 1 din randul curent
‘\f’ 12 FF salt de pagina la imprimanta (Form Feed)
‘\a’ 7 BEL activare sunet

O constantă caracter pentru o secvenţă escape poate apare însă şi sub o formă în care se trece  codul ASCII, în octal, al caracterului dorit:

  ’\ddd’  - unde d este o cifră octală

Exemple:

 ’\11’ (pentru ’\t’) - reprezintă constanta caracter backspace, cu codul 9 în baza 10, deci codul 11 în baza 8.
 
 ’\15’ (pentru
’\r’) - reprezintă constanta caracter CR, cu codul 13 în baza 10, deci codul 15 în baza 8.

În fişierul <ctype.h>  există o serie de funcţii (codificate ca macroinstrucţiuni) care primesc un parametru întreg (ce se converteşte în unsigned char), şi întorc rezultatul diferit de 0 sau egal cu 0, după cum caracterul argument satisface sau nu condiţia specificată:

 

siruriFunctiiCaractere

 

Up Home Structura Site Algoritmi elementari

 

 

B. ŞIRURI DE CARACTERE

 

În limbajul C/C++, şirurile de caractere sunt vectori având tipul de bază char.
Un şir de caractere se termină prin marcatorul \0, (caracterul nul.)
De exemplu, şirul "x2A" este memorat pe 4 caractere, ultimul fiind \0,  numărul de elemente al şirului fiind, deci, 3, iar dimensiunea şirului 4.

Un caracter dintr-un şir (vector) de caractere "a" poate fi accesat folosind indexul şirului (a[i], de exemplu).

 

Up Home Structura Site Algoritmi elementari

 

 

B1. Iniţializarea şi citirea

unui şir de caractere se pot face în mai multe moduri:

 

B1.1. Iniţializarea fiecărui element cu câte un character (ca la orice vector):

 

a[0] = 'A';
a[1] = 'n';
a[2] = 'a';
a[3] = '\0';

  are ca efect că şirul a (adică vectorul a[ ]) ţine valoarea "Ana".

 

Up Home Structura Site Algoritmi elementari

 

 

B1.2. Citirea folosind funcţia "scanf( )" (în limbajul C):

scanf("%s", a);

Formatul "%s" este folosit pentru citirea unui sir de caractere. Se efectuează trei paşi:
- poziţionarea pe primul caracter al şirului;
- citirea tuturor caracterelor diferite de <Enter> şi introducerea lor în vectorul "a";
- citirea se face până la întâlnirea EOF (End Of File), după care se plasează '\0' la sfârşitul şirului.

Deoarece numele unui şir (ca la orice vector) este un pointer la adresa de bază a şirului, expresia "a" este echivalentă cu "&a[0]".

Dacă şirul citit are mai multe caractere decat cele rezervate, se va obţine o eroare.

 

Up Home Structura Site Algoritmi elementari

 

 

B1.3. Citirea şirului folosind cin>> , în limbajul C++

(dar citirea se opreşte la primul caracter blank, ignorând restul)

 

Up Home Structura Site Algoritmi elementari

 

 

B1.4. Folosind macroul gets( ) – care se găseşte în headerul stdio.h

 

Este important de reţinut că  'b' şi "b" sunt două lucruri diferite, prima fiind o constantă caracter, în timp ce a doua este o constantă şir de caractere, care conţine pe prima poziţie constanta caracter  'b' şi pe a doua poziţie caracterul '\0'

 

Up Home Structura Site Algoritmi elementari

 

 

B1.5. Prin iniţializare la declaraţie

 

char a[] = "x2A";

sau, echivalent, :

char a[] = {'x', '2', 'c', '\0'};

 

Up Home Structura Site Algoritmi elementari

 

 

B1.6. Prin utilizarea unui pointer către un şir constant

(dar interpretarea este diferită):

 

Numele unui şir (ca la orice vector) poate fi tratat ca un pointer către adresa de bază a şirului din memorie.

          

O constantă - de exemplu, "x2A" - este memorată de către compilator. În acelaşi timp, aceasta este "un nume de şir". Diferenţa dintre un şir iniţializat cu o constantă şir şi un pointer iniţializat tot cu o constantă şir este că şirul conţine caractere individuale urmate de caracterul "\0", în timp ce pointerul este asignat cu adresa şirului constant din memorie.

 

Up Home Structura Site Algoritmi elementari

 

 

B2. Constante de tip şir de caractere

 

Constanta şir de caractere este o succesiune de zero sau mai multe caractere, încadrate de ghilimele.
În componenţa unui şir de caractere poate intra orice caracter, deci şi caracterele escape.
Lungimea unui şir este practic nelimitată.
Daca se doreşte continuarea unui şir pe randul următor, se foloseşte caracterul backslash.
Caracterele componente ale unui şir sunt memorate într-o zonă continuă de memorie (la adrese succesive).
Pentru fiecare caracter se memorează codul ASCII al acestuia.

După ultimul caracter al şirului, compilatorul plasează automat caracterul NULL (\0), caracter care reprezintă marcatorul sfârşitului de şir. Numărul de octeţi pe care este memorat un şir va fi, deci, mai mare cu 1 decât numărul de caractere din şir.

Exemple:
 
”Acesta este un sir de caractere” //constanta sir memorata pe 32 octeti
”Sir de caractere continuat\”pe randul urmator!”   //constantă şir memorată pe 45 octeţi
 ”Sir \t cu secvente escape\n”  //constantă şir memorată pe 26 octeţi
 ’\n’      //constantă caracter memorată pe un octet
 ”\n” //constantă şir memorată pe 2 octeţi (codul caracterului escape şi terminatorul de şir)

 ”a\a4”  /*Sir memorat pe 4 octeti:

Pe  primul  octet: codul  ASCII al  caracterului a
Pe  al doilea  octet: codul  ASCII al  caracterului escape \a
Pe al treilea octet: codul ASCII al caracterului 4
Pe al  patrulea octet:  terminatorul de sir NULL, cod ASCII 0 */

 


 ”\\ASCII\\”  /*Sir memorat pe 8 octeti:

Pe primul octet: codul  ASCII al  caracterului backslah
Pe  al doilea   octet:  codul   ASCII   al   caracterului A
Pe  al  treilea  octet:  codul  ASCII    al   caracterului S
Pe al   patrulea octet: codul ASCII al caracterului S
Pe al  6-lea  octet:  codul  ASCII  al  caracterului  I
Pe al  7-lea  octet:  codul  ASCII  al  caracterului  I
Pe  al  8-lea  octet:  codul   ASCII   al  caracterului backslah
Pe al 9-ea octet: terminatorul de sir NULL, de cod ASCII 0 */

 ”1\175a”  /*Sir memorat pe 4 octeti:

Primul octet: Codul ASCII al caracterul 1
Al 2-lea  octet:  codul  ASCII 125 (175 in octal) al caracterului }
Al  3-lea  octet:  codul  ASCII  al caracterului a
Al 4-lea  octet: codul ASCII 0 pentru terminatorul sirului */

 

Up Home Structura Site Algoritmi elementari

 

 

B3. Funcţii pentru operaţii cu şirurile de caractere

 

Pentru a avea acces la  aceste funcţii, trebuie inclusă biblioteca string.h

#include <string.h>

 

B3.1. strlen( )

Calculează lungimea unui şir

Definiţia:

size_t strlen(const char *s);

Returnează numărul de caractere din s, fără caracterul null.

 

siruriStrlen

rezSiruriStrlen

O variantă online poate fi experimentată la siruriStrlen sau la siruriStrlen

 

Up Home Structura Site Algoritmi elementari

 

 

B3.2. strcpy( )

 

Copiază şirul src (sursa) în dest (destinaţie)

Definiţia:

char *strcpy(char *dest, const char *src);

Returnează dest (destinaţie).

 

siruriStrcpy

rezSiruriStrcpy

O variantă online poate fi experimentata la siruriStrcpy sau la siruriStrcpy

 

siruriStrcpy1

rezSiruriStrcpy1

O variantă online poate fi experimentata la siruriStrcpy1 sau la siruriStrcpy1

 

siruriStrcpy2

rezSiruriStrcpy2

O variantă online poate fi experimentata la siruriStrcpy2 sau la siruriStrcpy2

 

Up Home Structura Site Algoritmi elementari

 

B3.3. strncpy( )

 

Acţionează asemănător cu funcţia strcpy( )

Copiază cel mult maxlen caractere din şirul src (sursa) în dest (destinaţie)

Definiţia:

char *strncpy(char *dest, const char *src, size_t maxlen);

Returnează dest (destinaţie).

 

Up Home Structura Site Algoritmi elementari

 

 

B3.4. strcat( )

 

Adaugǎ şirul src (sursa) la sfârşitul şirului dest (destinaţie)

Definiţia:

char *strcat(char *dest, const char *src);

Returnează dest (destinaţie).

 

siruriStrcat.png

rezSiruriStrcat

O variantă online poate fi experimentata la siruriStrcat sau la siruriStrcat

 

Up Home Structura Site Algoritmi elementari

 

B3.5. strncat( )

 

Acţionează asemănător cu funcţia strcat( )

Adaugă cel mult maxlen caractere din şirul src (sursă) la şirul dest (destinaţie)

Definiţie:

char *strncat(char *dest, const char *src, size_t maxlen);

Returnează dest (destinaţie).

 

Up Home Structura Site Algoritmi elementari

 

 

B3.6. strcmp( )

 

Comparǎ un şir cu altul

Definiţia:

int strcmp(const char *s1, const char *s2);

Returnează o valoare care este:

< 0 dacă s1 este mai mic decât s2

= 0 dacă s1 este acelaşi cu s2

> 0 dacă s1 este mai mare decât s2

 

siruriStrcmp

rezSiruriStrcmp

O variantă online poate fi experimentata la siruriStrcmp sau la siruriStrcmp

 

Up Home Structura Site Algoritmi elementari

 

B3.7. strncmp( )

 

Acţionează asemănător cu funcţia strcmp( )

Compară cel mult maxlen caractere dintr-un şir s1 cu cele din alt şir s2

Definiţie:

int strncmp(const char *s1, const char *s2, size_t maxlen);

 

 

B3.8. stricmp( )

 

Acţionează asemănător cu funcţia strcmp( )

Compară un şir s1 cu alt şir s2, considerând egale literele mari cu cele mici (case insensitive)

Definiţie :

int stricmp(const char *s1, const char *s2);

 

 

B3.9 strncmpi( )

 

Acţionează asemănător cu funcţia strcmp( )

Compară cel mult maxlen caractere dintr-un şir s1 cu cele din alt şir s2

şi considerând egale literele mari cu cele mici (case insensitive)

Definiţie:

int strncmpi(const char *s1,  const char *s2, size_tn);

 

 

B3.10. strchr( )

Caută prima apariţie a caracterului c în şirul s

Definiţia:

char *strchr(const char *s, int c);

Returnează  un pointer la  prima apariţie a caracterului c în şirul s; dacă nu apare în şirul s, funcţia strchr returnează NULL.

 

siruriStrchr

rezSiruriStrchr1

rezSiruriStrchr2

O variantă online poate fi experimentata la siruriStrchr sau la siruriStrchr

 

Up Home Structura Site Algoritmi elementari

 

 

B3.11 strrchr( )

 

Caută ultima apariţie a caracterului c în şirul s

Definiţia:

char *strrchr(const char *s, int c);

Returnează  un pointer la  ultima apariţie a caracterului c în şirul s; dacă nu apare în şirul s, funcţia strchr returnează NULL.

 

 

B3.12. strstr( )

Găseşte prima apariţie a unui subşir s1 în alt şir s2

Definiţia:

  char *strstr(const char *s1, const char *s2);

Returnează un pointer la elemental din şirul s1 care conţine pe s2 (pointează către s2 în s1), sau NULL dacă s2 nu apare în s1.

 

siruriStrstr

rezSiruriStrstr1

rezSiruriStrstr2

O variantă online poate fi experimentata la siruriStrstr sau la siruriStrstr

 

Up Home Structura Site Algoritmi elementari

 

 

B3.13. strrev( )

 

Inverseazǎ ordinea tuturor caracterelor din şirul s

Definiţie:

char *strrev(char *s);

Returnează un pointer la şirul inversat.

 

siruriStrrev

rezSiruriStrrev

Fără rezolvare online

 

Up Home Structura Site Algoritmi elementari

 

 

B3.14. strupr( )

 

Converteşte toate literele din şirul s la uppercase (litera mare corespunzătoare)

Definiţia:

char *strupr(char *s);

Returnează un pointer la şirul s.

 

siruriStrupr

rezSiruriStrupr

Fără rezolvare online

 

Up Home Structura Site Algoritmi elementari

 

 

B3.15. strlwr( )

 

Converteşte toate literele din şirul s la lowercase (litera mică corespunzătoare)

Definiţia:

char *strlwr(char *s);

Returnează un pointer la şirul s.

 

siruriStrlwr

rezSiruriStrlwr

Fără rezolvare online

 

Up Home Structura Site Algoritmi elementari

 

 

B3.16. strtok( )

 

Scanează şirul s1 pentru a găsi prima apariţie a unui caracter  din şirul s2

Definiţie:

char *strtok(char *s1, const char *s2);

Şirul s2 defineşte, de obicei, caractere separatoare.

Funcţia strtok interpretează şirul s1 ca o serie de cuvinte separate de caracterele separatoare din şirul s2.

Dacă în şirul s1 nu este găsit nici un caracter din şirul s2, funcţia returnează  NULL.

Dacă este găsit un caracter, pe poziţia următoare din s1este pus un character NULL şi funcţia returnează un pointer.

Următoarele chemări ale funcţiei strtok  se vor efectua cu valoarea NULL ca prim parametru al funcţiei strtok.

 

siruriStrtok1

rezSiruriStrtok1

 

 

siruriStrtok2

rezSiruriStrtok2

O variantă online poate fi experimentata la siruriStrtok sau la siruriStrtok

 

Up Home Structura Site Algoritmi elementari

 

B4. Funcţii de conversie

 

B4.1. Funcţia atof( )

double atof(sir);

converteşte un şir către tipul double. Dacă această conversie eşuează (se întâlneşte un caracter nenumeric), valoarea întoarsă este 0. Această funcţie (ca şi cele similare) necesită includerea bibliotecii stdlib.h.

 

B4.2. Funcţia _atold( )

long double _atold(sir);

converteşte un şir către tipul long double. Dacă această conversie eşuează, valoarea întoarsă este 0.

 

B4.3. Funcţia atoi( )

int atoi(sir);

converteşte un şir către tipul int. Dacă această conversie eşuează (se întâlneşte un caracter nenumeric), valoarea întoarsă este 0.

 

B4.4. Funcţia atol( )

long atol(sir);

converteşte un şir către tipul long. Dacă această conversie eşuează, valoarea întoarsa este 0.

 

B4.5. Funcţia itoa( )

itoa(int valoare,sir,int baza);

converteşte o valoare de tip int în şir, care este memorat în variabila sir. Baza reţine baza de numeraţie către care să se facă conversia. În cazul bazei 10, şirul reţine şi eventualul semn -.

 

B4.6. Funcţia ltoa( )

ltoa(long valoare,sir,int baza);

converteşte o valoare de tip long int în şir, care este memorat în variabila sir.

 

B4.7. Funcţia ultoa( )

ultoa(unsigned long valoare,sir,int baza);

converteşte o valoare de tip unsigned long în şir, care este memorat în variabila sir.

 

 

 

 

 

 

 

 

EXEMPLE DE ALGORITMI

 

A. A

 

Text

 

Up Home Structura Site

 

B. B

 

Text

 

Up Home Structura Site

C. C

 

Text

 

Up Home Structura Site

 

D. D

 

Text

 

Up Home Structura Site

E. E

 

Text

 

Up Home Structura Site

 

F. F

 

Text

 

Up Home Structura Site

G. G

 

Text

 

Up Home Structura Site

H. H

 

Text

 

Up Home Structura Site

 

I. I

 

Text

 

Up Home Structura Site