Scrigroup - Documente si articole

     

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


Matrice si siruri in C

c



+ Font mai mare | - Font mai mic



Matrice si siruri

O matrice este o colectie de variabile de acelasi tip, apelate cu acelasi nume. Accesul la un anumit element al matricei se face cu ajutorul unui indice. In C toate matricile constau in locatii de memorie contigue. Cel mai mic indice corespunde primului element iar cel mai mare ultimului element. Matricele pot avea una sau mai multe dimensiuni. Ca si in alte limbaje, cea mai simpla matrice este sirul. In C sirul este o matrice de caractere terminate cu un caracter NULL. Aceasta caracteristica ofera limbajului C mai multa putere si eficienta decat poseda alte limbaje.



Semnalam, de asemenea, faptul ca in C, exista o stransa legatura intre matrice si pointeri.

1 Matrice cu o singura dimensiune

Forma generala in declararea unei matrice cu o singura dimensiune este:

<Tip> <Nume_variabila>[<Dimensiune>];

<Tip> declara tipul de baza al matricei, care este tipul fiecarui element al sau.

<Dimensiune> indica numarul maximal de elemente pe care le poate contine matricea.

A De retinut faptul ca, in C, toate matricele au ca indice pentru primul element pe 0

Cantitatea de memorie necesara pentru inregistrarea unei matrice este direct proportionala cu tipul si marimea sa. Pentru o matrice unidimensionala, marimea totala in octeti este calculata astfel:

Total_octeti = sizeof(<Tip>)*<Dimensiune>

A C nu controleaza limitele unei matrice. Puteti depasi ambele margini ale unei matrice si scrie in alte variabile sau peste codul programului. Riscurile si responsabilitatile sunt de partea programatorilor.

2 Crearea unui pointer la o matrice

Un pointer la primul element al unei matrice se creeaza simplu, specificand

numele matricei, fara nici un indice.

De exemplu, avand :

float sir[10];

putem crea un pointer la primul element al matricei astfel:

float *p;

float sir[10];

p=sir;

3 Siruri de caractere

De departe, cea mai utilizata matrice unidimensionala este sirul de caractere. Reamintim faptul ca in C un sir de caractere este definit ca o matrice de caractere care se termina cu un caracter NULL. In conventie backslash un NULL se reprezinta prin '0' si are valoarea 0. Din acest motiv, matricele de tip caracter se declara cu un caracter mai mult decat lungimea celui mai mare sir pe care il vor contine. Desi C nu are date de tip sir permite constante sir. O constanta sir este o succesiune de caractere inchise intre ghilimele. Nu este necesar sa introduceti manual caracterul NULL la sfarsitul constantelor sir, compilatorul face acest lucru automat.

C admite, totodata, o gama larga de functii de manipulare a sirurilor. Cele mai des utilizate sunt prezentate in tabelul de mai jos.

Nume functie

Utilitate

strcpy(s1,s2)

Copiaza s2 in s1

strcat(s1,s2)

Concateneaza s2 la sfarsitul s1

strlen(s1)

Returneaza lungimea lui s1

strcmp(s1,s2)

Returneaza 0 daca s1 si s2 sunt identice; un numar mai mic decat 0 daca s1<s2 in sens lexicografic; un numar mai mare decat 0 daca s1>s2 in sens lexicografic.

strchr(s1,ch)

Returneaza un pointer la prima aparitie a caracterului ch in s1.

strstr(s1,s2)

Returneaza un pointer la prima aparitie a lui s2 in s1.

Tabelul 13. Functii C pentru lucrul cu siruri de caractere pastrate in fisierul antet string.h

A Atentie! strcmp() returneaza fals daca sirurile sunt egale.

4 Matrici bi si multidimensionale

C admite matrice multidimensionale. Cea mai simpla forma de matrice multidimensionala este cea cu doua dimensiuni. De fapt, o matrice bidimensionala este o matrice de matrice unidimensionale. Pentru a declara o matrice bidimensionala utilizam sintaxa:

<Tip> <Nume_variabila>[<Dimensiune_1>][<Dimensiune_2>];

De exemplu, o matrice bidimensionala de intregi, de marime10/20 se declara astfel:

int matr[10][20];

Adresarea elementelor matricei se bazeaza pe premiza ca, dupa fiecare dimensiune, indexarea incepe de la 0. De asemenea, facem precizarea ca, atunci cand o matrice bidimensionala este utilizata ca un argument pentru o functie, se transmite doar un pointer catre primul element al matricei. Insa, parametrul care primeste o matrice bidimensionala trebuie sa defineasca cel putin numarul de coloane, necesare compilatorului pentru a indexa corect matricea. De urmarit exemplul de mai jos de cod C care permite calculul sumei elementelor strict pozitive de pe diagonala principala a unei matrice patratice .

#include<stdio.h>

#include<conio.h>

// Declarare matrice bidimensionala

int matr[10][10];

int dimm;

//Functia care primeste ca argument o matrice . Declara numarul de coloane.

void sespdp( int m[ ][10])

clrscr();

gotoxy(20,12);

cprintf('Suma elementelor strict pozitive ddp: %d',suma);

getch();

//Functia principala

void main()

//Apelare functie cu parametru matrice transmisa ca pointer static

sespdp(matr);

Evident, in cazul unei matrice multidimensionale, forma generala de declarare precum si modul de utilizare sunt deductibile din cazul bidimensional.

Sintaxa pentru declararea unei matrice multidimensionale este:

<Tip> <Nume_variabila>[<Dim_1>][<Dim_2>].[Dim_n];

In incheierea paragrafului referitor la matrice prezentam o aplicatie in care, aratam, totodata, primii pasi spre modularizarea si interfatarea unui program C.

Este vorba de un program C care cerceteaza ortogonalitatea a doi vectori reali. Se utilizeaza inca odata fisierul antet facilcrt.h

#include<stdio.h>

#include<conio.h>

#include 'facilcrt.h'

#include<stdlib.h>

//Directiva #define permite specificarea unor macrouri

#define lmaxs 100

#define optiuni '1234'

//Solutie modularizata C pentru problema determinrii

//ortogonalitatii a doi vectori reali

char prelopt();

void prelvec();

int ortogon();

float sir1[lmaxs],sir2[lmaxs];

int dims;

void main

case '2':

;

case '3': exit(0);

}

}

char prelopt()

while (strchr(optiuni,opt)==NULL);

return opt;

void prelvec()

clrscr();

gotoxy(20,9);

cprintf('Preluarea componentelor celui de-al doilea vector');

makewin2(20,9,20+strlen('Preluarea componentelor celui de-al doilea vector'),12);

for (i=0;i<dims;i++)

int ortogon()

else

Se cuvine sa mai fac o paranteza referitoare la insistenta cu care apar in programele C/C++ constructii sintactice care incep cu #, precum #include, #define. Aceste constructii fac parte din categoria instructiunilor care se adreseaza compilatorului si se mai numesc si directive pentru preprocesor. desi nu fac parte din limbajul C/C++ aceste directive largesc sfera de actiune a programelor C/C++. Am vazut deja care este utilitatea directivei preprocesor #include. Sa spunem, totodata, faptul ca, directiva pentru preprocesor #define permite definirea unor macrouri astfel:

#define <Nume_macrou> <Secventa_de_caracter>

Oriunde in program apare <Nume_macrou> compilatorul il inlocuieste cu <Secventa_de_caractere>. Adica avem la dispozitie un instrument foarte util la parametrizarea codului. Sa adaugam ca #define poate permite si definirea de functii macro, situatie in care numele macroului poate avea si argumente.

Exemplu:

#define ABS(a) (a)<0 ? -(a) : (a)

:

printf("abs de -1 si 1"%d %d,ABS(-1), ABS(1));

La compilarea acestei secvente, a care apare in definirea functiei macro va fi inlocuit cu valorile -1 si 1.

Utilizarea unei functii macro mareste viteza de executie a codului.

Merita cercetate cu atentie si trucurile care pot fi realizate cu ajutorul directivei #define. Semnalam ca, asa cum se intampla si in Pascal, in C exista o serie de directive pentru compilare conditionala a codului sursa. Din aceasta categorie fac parte #if, #endif, #else #ifdef, #ifndef, etc.



Politica de confidentialitate | Termeni si conditii de utilizare



DISTRIBUIE DOCUMENTUL

Comentarii


Vizualizari: 2637
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