Scrigroup - Documente si articole

     

HomeDocumenteUploadResurseAlte limbi doc
AccessAdobe photoshopAlgoritmiAutocadBaze de dateCC sharp
CalculatoareCorel drawDot netExcelFox proFrontpageHardware
HtmlInternetJavaLinuxMatlabMs dosPascal
PhpPower pointRetele calculatoareSqlTutorialsWebdesignWindows
WordXml


Fisa de lucru - SIRURI DE CARACTERE

c



+ Font mai mare | - Font mai mic



Fisa de lucru - clasa a X-a E

SIRURI DE CARACTERE



O constanta de tip sir de caractere se declara intre 2 caractere " ". In memoria interna acesta este retinuta sub forma unui vector de caractere.

Exemplu:"calculator"

Vectorii de caractere pot fi initializati la declarare, caracterul nul fiind memorat automat.

Exemple

char vect[11]="calculator"

char vect[ ]="calculator" - in acest caz compilatorul face calculul numarului de octeti necesari

char vect[100]="calculator" -am rezervat mai multi octeti decat este necesar

Citirea/ scrierea sirurilor de caractere

a) Se citeste cuvantul caracter cu caracter si apoi se afiseaza

# include <iostream.h>

main

dar este o modalitate de lucru greoaie.

S-ar putea scrie o secventa care sa citeasca cuvantul pana la intalnirea caracterului ENTER, insa si aceasta modalitate este greoaie..

b) Limbajul C++ permite ca lucrul cu siruri de caractere sa fie cu mult mai simplu:

#include <iostream.h>

main

caracterul nul este adaugat automat

prin acest procedeu putem citi orice cuvant cu un numar de pana 19 caractere - excluzand caracterul nul

putem sa rezervam in limita memoriei pe care o avem la dispozitie programul un numar mai mare de octeti.

Dar, prin aceasta metoda nu poate fi citit un sir care contine mai multe cuvinte separate prin spatii. Spre exemplu, daca la rularea programului anterior tastam sirul "Un om" programul va afisa "Un" . Aceasta inseamna ca citirea se face astfel:

se sar caracterele albe (in exemplul nostru blank-ul)

se citeste sirul care incepe cu primul caracter care nu este alb si se sfarseste la intalnirea primului caracter alb (in exemplu blank-ul)

Din acest motiv, pentru citirea sirurilor de caractere vom utiliza o functie de un tip special:

cin.get(vector de caractere, int nr, char ' n')

care citeste un sir de caractere pana cand este indeplinita una dintre conditiile de mai jos:

au fost citite nr-1 caractere

a fost intalnit caracterul transmis ca ultim parametru (implicit ' n' )

Observatii:

a)    sunt citite si caracterele albe;

b) este inserat caracterul nul;

c) caracterul transmis ca ultim parametru nu este inserat in sir ultimul parametru este trecut in mod facultativ, daca nu este trecut se presupune ca este 'n')

Exemple:

se citeste un sir de maxim 2 caractere

char a[10];

cin.get(a,3);

cout<<a;

Daca tastam mama ENTER se citeste sirul ma care va fi afisat.

citirea se opreste la intalnirea caracterului g sau cand au fost citite 9 caractere ale sirului

char a[10];

cin.get(a,10, 'g' );

cout<<a;

In C++ pot exista mai multe functii cu acelasi nume, dar care difera prin parametrii primiti. Astfel exista si functia cin.get ( ) fara parametrii. Ea are rolul de a citi un caracter fie ca este alb sau nu.

Observatii:

in cazul utilizarii repetate a functiei cin.get( )= cu 3 parametri apare o problema

# include <iostream.h>

# include <string.h>

main

daca nu am fi folosit functia cin.get() fara parametrii a doua citire nu ar fi fost efectuata deoarece sfarsitul primului sir introdus a fost marcat prin tastarea ENTER si aceasta a facut ca in memorie sa fie pastrat caracterul 'n' . A doua citire va incepe cu acest caracter. Prin logica functiei cu 3 parametrii citirea se face pana la intalnirea lui, in concluzie se citeste sirul vid si utilizatorul nu mai apuca sa isi tasteze textul. Prin utilizarea functiei fara parametrii acel caracter se citeste si noua citire se poate efectua fara probleme.

Tipul char*

Vectorii de caractere au o proprietate deosebita.

# include <iostream.h>

# include <string.h>

main

Programul va tipari: asa sa a

cand scriem a adresam vectorul incepand cu primul octet care retine primul caracter al sirului de caractere.

cand scriem a+1 adresam vectorul incepand cu al doilea octet

cand scriem a+2 adresam vectorul incepand cu al doilea octet

Dupa cum se observa a+1, a+2 sunt expresii iar tipul lor este char*.

Observatii:

Numarul de ordine al unui octet in memoria interna se numeste adresa octetului respectiv.

Prin definitie, adresa unui vector de caractere este adresa primului sau octet.

O variabila de tipul char* poate retine adresa unui vector de caractere.

In C++ numele unui vector de caractere este o adresa constanta de vector si poate fi atribuit unei variabile de tip char*

Exemplu:

# include <iostream.h>

# include <string.h>

main

- am declarat un vector de caractere a pe care l-am initializat cu un sir si o variabila p de tip char*

p=a - variabila p retine adresa vectorului de caractere a, adica adresa primului sau octet. Atribuirea a=p nu este corecta deoarece a este o constanta ce reprezinta o adresa.

dupa atribuire putem utiliza variabila p in aceleasi conditii ca variabila a (de exemplu,

pentru a afisa sirul retinut prin cout <<p<<endl)

daca la continutul variabilei p se adauga 1 aceasta va retine adresa vectorului al carui

prim octet coincide cu al doilea octet al vectorului a (de exemplu, daca tipares vectorul se va afisa "xemplu"). Noul vector se poate adresa si pe octeti p[1])

se pot face si scaderi intre adrese si in acest caz rezultatul este intreg. Prin p - a se

obtine indicele in a al primului octet al vectorului retinut de p.

Functii care lucreaza cu siruri de caractere

Atribuirile de genul a=b, unde a si b sunt vectori de caractere nu sunt permise si nici

atribuirile de genul a="sir" nu sunt permise. Astfel de operatii se fac cu anumite functii puse la dispozitie de limbaj si pentru ca acestea sa poata fi folosite trebuie sa fie introdus fisierul antet string.h.

Functia strlen- returneaza lungimea unui sir ( in calculul lungimii nu intra

caracrerul nul)

#include <iostream.h>

#include<string.h>

void main

Functia strcpy - are rolul de a copia sirul de adresa sursa la adresa destinatie.

Copierea se termina dupa ce a fost copuiat caracterul nul. Se returneaza adresa destinatie.

# include<iostream.h>

#include <string.h>

main()

Programul va afisa "alt sir"

Functia strcat - are rolul de a adauga sirului de adresa destinatie, sirul de adresa

sursa. Sirul de adresa sursa ramane nemodificat. Aceasta operatie se numeste concatenare. Rezultatul este adresa sirului sursa, iar sirul va avea lungimea egala cu suma lungimilor celor 2 siruri care au fost concatenate.

# include<iostream.h>

#include <string.h>

main()

Programul va afisa "mama merge".

Functia strncat -are acelasi rol ca si functia strcat cu deosebirea ca adauga sirului

destinatie primii nr octeti. Adaugarea caracterelor se face inaintea caracterului nul. Functia returneaza adresa de inceput a sirului destinatie.

Sintaxa: strcncat (destinatie, sursa, nr)

Functia strchr - are rolul de a cauta un caracter intr-un sir. Cautarea se face de la

stanga la dreapta. In cazul in care caracterul este gasit functia returneaza adresa subsirului care incepe cu prima aparitie a caracterului citit si se termina cu caracterul nul al sirului in care se face cautarea. Altfel intoarce valoarea 0.

Exemplul 1:

# include<iostream.h>

#include <string.h>

main()

programul tipareste indicele primei aparitii a caracterului 't' in sirul a

Exemplul 2:

# include<iostream.h>

#include <string.h>

main()

Functia strrchr - are acelasi rol ca si functia strchr cu deosebirea ca returneaza adresa ultimei aparitii a caracterului (cautarea se face de la dreapta la stanga)

Functia strcmp - are rolul de a compara doua siruri de caractere iar valoarea returnata este:

<0 daca s1<s2

=0 daca s1=s2

>0 daca s1>s2

Cele doua siruri de caractere se compara caracter cu caracter.

In cazul in care primele x caractere coincid iar codul caracterului x+1 din sirul s1

este mai mare decat codul caracterului de pe pozitia x+1 din sirul s2 atunci s1>s2. s1>s2 si daca lungimea lui s1>lungimea lui s2.

In cazul in care primele x caractere coincid iar codul caracterului x+1 din sirul s1 este mai mic decat codul caracterului de pe pozitia x+1 din sirul s2 atunci s1<s2. s1<s2 si daca lungimea lui s2<lungimea lui s2.

In cazul in care toate codurile caracterelor care formeaza sirul s1 coincid cu toate codurile caracterelor care formeaza s2 atunci s1=s2.

! Functia nu face diferenta intre litere mari si mici.

Functia strstr - are rolul de a identifica daca sirul s2 este subsir al sirului s1. Daca

acesta este identificata atunci functia returneaza adresa de inceput in cadrul sirului s1, altfel returneaza 0. In cazul in care subsirul apare de mai multe ori in cadrul sirului se returneaza adresa de inceput a primei aparitii.

Sintaxa : strstr(s1,s2)

Functia stricmp - are acelasi rol ca si functia strcmp cu diferenta ca nu face

distinctie intre litere mari si mici.

Functia strtok - are sintaxa char* strtok (char *s1, const char *s2) si are urmatorul principiu de executie:

sirul s1 se considera alcatuit din n entitati separate prin unul sau mai multe

caractere cu rol de separator, iar sirul s2 ca fiind alcatuit din unul sau mai multe caractere cu rol de separator.

la prima apelare functia are forma strtok (s1,s2) si intoarce adresa primului

caracter al primei entitati; iar dupa prima entitate separatorul este inlocuit automat prin caracterul nul care are codul 0.

urmatoarele apeluri ale functiei sunt de forma strtok(NULL,s2) iar functia

intoarce de fiecare data adresa primului caracter al urmatoarei entitati si dupa ea este adaugat caracterul nul. Acest lucru permite ca entitatile sa poata fi extrase cu usurinta.

in momentul in care sirul ramas nu mai contine entitati functia intoarce adresa nula.

Exemplu:

#include <iostream.h>

# include<string.h>

main()

}- variabila p retine adresa de inceput a entitatii, deci daca entitatea este gasita p va retine o valoare diferita de 0, caz in care entitatea este afisata si se va cauta urmatoarea entitate.

Functia strcspn - are rolul de a returna numarul de caractere ale sirului s1,

caractere consecutive care incep obligatoriu cu primul caracter, care nu se gasesc in sirul s2

Sintaxa: strcspn(const char *s1, const char *s2)

Functia strspn - are rolul de a returna numarul de caractere ale sirului s1,

caractere consecutive care incep obligatoriu cu primul caracter, care se gasesc in sirul s2

Sintaxa: strspn(const char *s1, const char *s2)

Exemplu:

s1="AB2def", s2="123"

strcspn(s1,s2) returneaza 2 pentru ca primele 2 caractere A,B din s1 nu se gasesc in s2

strspn(s1,s2) - returneaza 0 pentru ca primul caracter din s1, A, nu se gaseste in s2

Functia strlwr - are sintaxa strlwr(char *s1) si convertesete toate literele mari in

litere mici, restul caracterelor raman neschimbate si intoarce adresa s.

Functia strupr - are sintaxa strupr(char *s1) si convertesete toate literele mici in

litere mari, restul caracterelor raman neschimbate si intoarce adresa s.

Functia strpbrk - are forma generala strpbrk(char *s1, char *s2) si actioneaza astfel:

cauta primul caracter al sirului s1 in s2. Daca este gasit returneaza adresa sa

din cadrul sirului s1 si executia se incheie, altfel cauta al doilea caracter al sirului s1 in s2 si daca este gasit returneaza adresa sa din cadrul lui s1 si executia se termina altfel se continua tot asa pana la ultimul caracter al lui s1.

daca nici un caracter al lui s1 nu apartine lui s2, functia returneaza adresa nula.

#include <iostream.h>

#include<string.h>

main()

caracterele primului sir incepand de la primul sunt cautate in al doilea si orice

caracter gasit se tipareste si toate acestea se fac pornind de la adresa sirului returnata de atrbkr. Apoi, variabila care contine aceasta adresa se incrementeaza pentru ca la urmatoarea cautare sa nu fie returnata aceeasi adresa de sir.

Functii care au prototipul in stdlib.h

Aceste functii se folosesc pentru conversia valorilor numerice in sir si invers.

Functia atof - converteste un sir catre tipul double. Daca se intalneste un caracter

nenumeric valoarea intoarsa de functie este 0, iar daca primele caractere ale sirului sunt albe acestea sunt ignorate.

Functia _atold - converteste un sir catre tipul long double. Daca se intalneste un

caracter nenumeric valoarea intoarsa de functie este 0, iar daca primele caractere ale sirului sunt albe acestea sunt ignorate.

Functia _atoi - converteste un sir catre tipul int. Daca se intalneste un caracter

nenumeric valoarea intoarsa de functie este 0, iar daca primele caractere ale sirului sunt albe acestea sunt ignorate.

Functia _atol - converteste un sir catre tipul long int. Daca se intalneste un

caracter nenumeric valoarea intoarsa de functie este 0, iar daca primele caractere ale sirului sunt albe acestea sunt ignorate.

Functia ecvt - are rolul de a converti o valoare double catre un sir. Caracterul nul este adaugat automat sirului obtinut.

Forma generala: char *ecvt(double valoare, int *poz, int *zec, int *semn)

valoare - valoarea de convertit

poz - numarul de pozitii ocupate de sir

zec - adresa unei variabile de tip int care retine numarul zecimalelor pe

care le are numarul (retine numarul intregilor)

semn - adresa unei variabile de tip int care are rolul de a memora dupa

apel -1 daca numarul este negativ sau 0 in caz contrar (retine semnul rezultatului)

Exemplu:

ecvt(val,3,&zec,&semn)

daca val=1234 atunci functia returneaza sirul "123", zec retine 4 si semn retine 0

daca val=1 atunci functia returneaza sirul "100" zec retine 1 si semn retine 0

daca val=-0.001 atunci functia returneaza sirul "100" zec retine -3 si semn retine -1

Functia itoa - converteste o valoare de tip int in sir. Are sintaxa :

char *itoa( int valoare, char *sir, int baza) unde baza retine baza de numeratie catre care sa se faca converia( de obicei baza este 10). In cazul bazei 10, sirul obtinut retine si eventualul semn iar functia intoarce adresa sirului obtinut.

Functia ltoa - converteste o valoare de tip long int in sir

Functia ultoa - converteste o valoare de tip unsigned long in sir

Functia strtol - are rolul de a converti un sir catre long si are urmatoarea forma:

long strtol(const char *s, char **endptr, int radix)

Functia primeste ca parametru de intrare adresa unei variabile de tip char* iar dupa apel aceasta variabila va retine pozitia primului caracter din sir care nu paote fi convertit.

Aceste observatii sunt valabile si pentru urmatoarele 3 functii:

Functia strtod - are rolul de a converti un sir catre double si are urmatoarea forma:

double strtod(const char *s, char **endptr, int radix)

Functia _strtod - are rolul de a converti un sir catre long double si are urmatoarea forma:

long double _strtod(const char *s, char **endptr, int radix)

Functia strtoul - are rolul de a converti un sir catre unsigned long si are urmatoarea forma:

unsigned long strtoul(const char *s, char **endptr, int radix)

Tipul inregistrare

Apar uneori situatii in care tipurile de date invatate pana acum nu ne sunt de folos.

Exemplu: Pentru fiecare elev cunoastem:

nume - char[20]

prenume - char[20]

nota mate - float

nota info - float

varsta - int

Pentru a rezolva o problema ar fi necesari 5 vectori, adica cate unul pentru fiecare

informatie si fiecarui elev i sa ii corespunda componentele i ale fiecarui vector.

In C++ exista un tip de date numit struct care permite acest lucru si care are forma generala:

struct <nume structura>

lista variabile;

Exemplu:

struct elev

;

Exista 2 modalitati de declarare a variabilelor care alcatuiesc structura:

1. Dupa forma generala se scrie la sfarsit numele variabilelor.

struct elev

;v1,v2;

2. Clasic

elev v1,v2;

O structura poate fi definita in interiorul functiei main ( ) dar si in afara dupa includerile de fisiere antet.

Pentru a ne referi la campurile unei variabila de tip structura se foloseste operatorul de selectie notat cu '.'

v1.nume - reprezinta sirul nume al variabilei v1

v1.nota_mate - reprezinta campul nota_mate al variabilei v1

v1.prenume[0] - reprezinta primul caracter al sirului prenume al variabilei v1

Intre 2 variabile de acelasi tip struct se poate folosi atribuirea v1=v2, aceasta atribuire se numeste copiere bit cu bit.

Probleme propuse

Sa se verifice daca un cuvant este palindrom (Testati efectul functiei strrev, pe care o gasiti in Help).

Sa se transforme un sir din litere mici in litere mari.

Sa se transforme un sir din litere mari in litere mici.

Sa se determine frecventa de aparitie a unui caracter intr-un text.

Sa se genereze toate prefixele / sufixele unui cuvant.

Se citeste un text dintr-un fisier si un caracter c. Sa se determine de cate ori se gaseste caracterul in text (nu se face distinctie intre literele mari si literele mici).

Se citeste un text de la tastatura astfel incat cuvintele sa fie separate printr-un singur spatiu si imediat dupa ultimul cuvant se scrie punct. Textul va fi scris pe un singur rand.

a)       a) Sa se determine cate cuvinte contine textul. De ex : 'Ana are mere.' Contine 3 cuvinte.

b)       b) Sa se determine daca textul are cuvinte distincte (se ignora diferenta de cheie).

c)       c) Sa se determine daca textul contine cifre.

Sa se determine de cate ori se gaseste un cuvant intr-un text.

Codificati un text astfel incat litera a sa devina c, b sa devina e s.a.m.d.



Politica de confidentialitate | Termeni si conditii de utilizare



DISTRIBUIE DOCUMENTUL

Comentarii


Vizualizari: 1643
Importanta: rank

Comenteaza documentul:

Te rugam sa te autentifici sau sa iti faci cont pentru a putea comenta

Creaza cont nou

Termeni si conditii de utilizare | Contact
© SCRIGROUP 2024 . All rights reserved