Limbajul c si C++ abc-doar



Yüklə 4,6 Mb.
səhifə5/55
tarix07.05.2018
ölçüsü4,6 Mb.
#50260
1   2   3   4   5   6   7   8   9   ...   55

4 -este un pointer spre

5 -o arie formata din zece elemente

6 -care sunt pointeri spre

7 -valori de tip caracter
Pentru a va face munca mai usoara,atunci cand formulati sau cand interpre-

tati declaratii complexe,cu multi specificatori si modificatori,puteti sa

scrieti definitia pe hartie cu patratele,sa colorati diferit fiecare spe-

cificator si apoi sa cititi interpretarea.La prima vedere,pare dificil,dar

cu putin exercitiu,muzica numerelor va fi mai usoara decat cea a notelor

muzicale(interpretarea seamana cu cea a unei partituri muzicale).

Dupa declararea unei variabile,i se pot atribui valori.Procesul se

numeste initializare.

EXEMPLE: int x=10

registru int *pt=0 // scalare

const int c=(3*1024)

int P[4][3]=

{

{ 1, 1, 1 },

{ 5, 3, 7 }, // agregate de tip arie

{ 0, 1, 0 },

{ 4, 0, 4 },

};
char cod[ ]="abc"

char s[ ]= {'a','b','c','x 10%'}; //sir de caractere

Pentru utilizarea in continuare a variabilelor declarate,programul va

aloca intre 1 si 8 bytes(8-80 biti) pentru fiecare dintre ele,astfel:

1 byte(char,unsigned char,signed char) 2 bytes(short,unsigned short),

4 bytes(int,unsigned int,long,unsigned long,float) si 8 bytes(double si

long double).

Eventual,atunci cand declarati o structura complexa,puteti desena pe o

hartie cu patratele aspectul final al hartii de memorie alocata (cate un

patratel pentru fiecare byte),pentru a calcula compatibilitatea cu tipul

de procesor utilizat pentru procesarea informatiei.


-30-

Exemplu:-presupunand ca doriti sa dirijati o serie de calcule spre memoria

SIMM(secundara),pentru a utiliza procesorul principal pentru alte operatii

simultane.Daca memoria d-voastra SIMM este formata din procesoare " de 4

biti"(adica procesoare care pot rula simultan cate 4 bytes),atunci nu

ve-ti putea utiliza variabile declarate ca double sau long,deoarece nu

puteti procesa cate 8 bytes simultan.Acelasi calcul,trebuie facut si

pentru procesorul principal,in caz ca doriti sa efectuati in paralele mai

multe calcule simultane.

Din acest motiv,in etapele initiale ale dezvoltarii limbajului C,apli-

catiile se scriau dedicate unui anumit tip de procesor,sau unei anumite

configuratii de hardware a calculatorului.In etapa actuala,toate calcu-

latoarele de birou comerciale,pot executa operatii complexe ce depasesc

de obicei posibilitatile de conceptie ale programatorului,iar acest gen

de restrictii nu se mai aplica.

Declaratiile pot fi incomplete.Aceasta situatie apare atunci cand o

structura sau o uniune a fost declarata fara membri,sau o arie a fost

declarata fara dimensiune.

EXEMPLE: struct student *ps

char a[ ]

Declaratiile pot fi completate ulterior utilizand acelasi identificator:

struct student

{

int num;

}

sau respectiv:

char a[20];

Pentru a declara tipuri noi de date,sau pentru a utiliza un nume mai

scurt pentru tipurile predefinite,se pot utiliza declaratiile typedef.

In acest caz,declaratorul devine untip nou de date.

EXEMPLU: typedef long double NUMERE[10];

in continuare se vor putea utiliza constructii de genul : const NUMERE

sau volatile NUMERE etc.
INSTRUCTIUNI
In limbajul C,instructiunile determina modul de executie a programului

(cursivitatea).Ca si in alte limbaje,instructiunile permit formarea de

bucle de repetitie(cicli) sau transferul spre alte instructiuni de exe-

cutie.Principalele instructiuni sunt: break,compuse,continue,do-while,

expression,for,goto,if,null,return,switch,try-except,try-finally si while.
Instructiunea break:-termina executia pentru bucla do,for,switch sau

while in care este inclusa si trece controlul la linia urmatoare de cod.

(vezi cuvantul cheie)

Instructiunile compuse:-denumite si blocuri de instructiuni,apar de obicei

incluse intr-o alta instructiune(de exemplu in IF) si executa un sir de

instructiuni succesive(declansate de o anumita conditie).

Daca nu se specifica explicit altfel,atunci toate instructiunile dintr-o

instructiune compusa vor fi considerate de tip auto.Daca o functie este

declarata "extern",nu va putea fi initializata cu valori.Cele de tip

static vor mentine aceeasi valoare la fiecare executie a instructiunii.


-31-

EXEMPLU: if ( i>0 )

{

line[i]=x;

x++;

i--;

}

Instructiunea continue:-transfera controlul la urmatorul pas al unei bucle

de repetitie ingorand comenzile ce urmeaza dupa continue.Cea mai frecventa

utilizare este in cadrul buclelor do,for si while.pentru a determina

continuarea buclei de repetitie fara a mai evalua expresiile ce urmeaza

dupa continue.

EXEMPLU: while ( i-->0 )

{

x= f(i);

if (x==1)

continue;

y+=x*x;

}
Instructiunea do-while:-permite repetarea unei comenzi sau a unui grup de

comenzi si instructiuni,pana cand evaluarea expresiei din conditie va

returna valoarea "false".

EXEMPLU: do

{

y=f(x);

x--;

} while (x>0);

in exemplu,y va lua valoarea functiei f(x) iar x va fi decrementat cu

cate o unitate,la fiecare ciclu,atat timp cat x este mai mare decat zero.
Instructiunea de tip expresie:-declara o anumita expresie sau operatie.
Expresia va fi evaluate si executata in ordinea precedentei operatorilor.

Declaratia care nu contine nici o expresie,poarta numele de declaratie

nula.Fiecare expresie va fi evaluata exhaustiv,inainte de a trece la

expresia urmatoare.

EXEMPLE: x=(y+3) sau x++; sau proc( arg1,arg2);
Instructiunea for:-permite repetarea unui ciclu de comenzi,operatii sau

instructiuni,de un anumit numar de ori.Instructiunea for poate fi intre-

rupta prin break,goto sau return.

Sintaxa generala a instructiunii for este:

for( expresia de initializare;expresia conditionala;expresia de bucla)

Executia se va face dupa cum urmeaza:

-se evalueaza expresia de initializare,apoi cea conditionala rezultand

trei variante:1.conditia este adevarata(true) caz in care se evalueaza

expresia de bucla si apoi se executa bucla de comenzi

2.expresia conditionala este omisa,caz in care se considera

implicit ca este adevarata si se trateaza ca si mai sus

3.conditia este evaluata a fi neadevarata(false),caz in

care se intrerupe bucla si controlul trece la urmatoarea linie din program


-32-

EXEMPLU: for( i=space=tab=0; i

{

if (line[i]==' ')

space++;

if (line[i]=='\t')

{

tab++ ;

line[i]=' ';

}

}

instructiunea din exemplu inlocuieste spatiile TAB cu spatii goale,

(comprima spatiile goale) atat timp cat i este mai mic decat MAX.

Dupa fiecare executie,i este incrementat cu o unitate pana cand

ajunge la valoarea maxima(MAX).

Fata de instructiunea FOR din alte limbaje de programare,se observa

faptul ca limbajul C permite si introducerea unei conditii de

executie a ciclului de instructiuni(flexibilitate mult mai mare).
Instructiunea goto:-transfera controlul la un identificator care trebuie

sa fie inclus in aceeasi functie si are nume unic in cadrul functiei.

Se utilizeaza mai ales pentru a determina iesirea dintr-o bucla intricata,

deoarece break nu executa decat un singur salt.In celelalte situatii,se

va prefera break,deoarece este mai usor de executat.

EXEMPLU: void main()

{

int i,j;

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

{

for (j=0;j<3;j++)

{

if (i==5)

goto stop;

}

}

stop:printf("iesire din bucla: ",i);

}

in exemplu,goto determina iesirea din primele doua bucle,in momentul

in care i ajunge la valoarea 5 si afisarea mesajului.
Instructiunea if:-permite introducerea unui set de conditii.Se pot utiliza

izolat sau in blocuri conditionale care formeaza adevarate filtre pentru

datele de acelasi tip sau de tip diferit.Instructiunile se vor executa

atat timp cat evaluarea conditiei returneaza o valoare diferita de zero.

Sintaxa permite doua formulari:

if (expresia conditionala) instructiunea

if (expresia conditionala) instructiunea else instructiunea

In cea de a doua varianta,else introduce modul de continuare a programului

in cazul in care conditia este evaluata a fi false(este zero).

Executia instructiunii poate fi intrerupta prin break,continue sau goto.

EXEMPLU: if (i>0)

y=x/i


-33-

Instructiunea nula(null):-se utilizeaza atunci cand doriti sa rezervati

un loc in program,pentru o instructiune ce va fi editata ulterior(pentru

moment este inoperanta).In acest scop se utilizeaza un punct-virgula (;).

Se poate utiliza si pentru a pastra locuri libere intr-un filtru de

instructiuni conditionale,pentru situatii viitoare ce vor necesita o

instructiune separata de ordonare a datelor.

EXEMPLU: if x<0;

x++;

if x<20;

x=x+7;

;

;

instructiunile nule rezerva cate o linie de program
Instructiunea return:- determina terminarea executiei unei functii si

trece controlul la functia apelanta,la punctul ce urmeaza celui din care

s-a initiat apelarea functiei(determina continuarea programului).

Eventual,return poate returna o valoare functiei apelante.

EXEMPLU: int numar()

{

y=sq( x);

if y<3;

return("y este mai mic decat trei")

}
Instructiunea switch:-impreuna cu case se utilizeaza pentru a organiza un

grup de instructiuni conditionale prin care controlul va fi transferat

uneia dintre ramificatiile instructiunii in functie de rezultatul evalu0

arii expresiilor conditionale.Este o instructiune conditionala,complexa

cu variante multiple.

Sintaxa generala este: switch (expresion) instructiune

case expresie constanta: instructiune

...-''- -''- -''- ...

...

default: instructiune

Controlul va fi la instructiunea case pentru care expresia constanta este

identica cu cea din "expresion" din instructiunea switch.

Dupa cum este si numele,este un fel de instructiune comutator.

EXEMPLU: switch( i )

{

case -1;

x++;

case 0;

y++;

case 1;

z++;

}

in functie de valoarea lui i,incrementeaza una dintre variabilele x,y,z

Pentru compilatoarele ANSI C,numarul maxim de situatii implementate prin

case,intr-o singura functie este de 257.Pentru compilatorul Microsoft C,

numarul lor este nelimitat(limitat doar de spatiul de memorie).

-34-

Instructiunea try-except:-este o extensie a limbajului C(in versiunea

Microsoft) ce permite aplicatiilor sa recastige controlul executiei si

atunci cand intervin evenimente care in mod normal ar intrerupe executia

programului.Acest gen de evenimente se numesc exceptii,iar modul de so-

lutionare a lor se numeste "mod de tratare a erorilor(exceptiilor)".

Exceptiile pot fi determinate fie de hardware,fie de software.Chiar daca

aplicatia nu poate continua dupa o astfel de exceptie,cel putin se va

afisa un mesaj care va permite identificarea cauzei care a intrerupt

executia programului.

Sintaxa este:

__try compound-instructiunea (datele protejate)

__except (expresia)compound-instructiunea (exceptia)

Instructiunea va contine un set de actiuni ce trebuiesc efectuate in

cazul in care intervine una dintre exceptiile specificate.

Executia sa va desfasura astfel:

1.se executa datele protejate

2.daca nu intervine nici o exceptie se paraseste instructiunea

3.daca intervine o exceptie,se evalueaza expresia din __except si in

functie de rezultatul evaluarii exista trei variante:

EXCEPTION_CONTINUE_SEARCH -exceptia nu este recunoscuta dar se

continua cautarea pana la capatul stivei

EXCEPTION_CONTINUE_EXECUTION- exceptia este recunoscuta dar este

ignorata si executia continua de la punctul intreruperii(nu nece-

sita operatii speciale de tratare a erorii)

EXCEPTION_EXECUTE_HANDLER-exceptia este recunoscuta iar controlul

este trecut la subrutina de tratare a erorilor(prin intermediul

instructiunii __except),dupa care se continua executia aplicatiei

Pentru iesirea din rutina de tratare a erorilor(exceptiilor) se poate

utiliza cuvantul cheie __leave sau goto.

EXEMPLU: puts("hello");

__try{

puts("in try");

}

__except(puts("in filter"),EXCEPTION_EXECUTE_HANDLER){

puts("in except");

}

puts("world");

executarea instructiunii va determina:

hello hello

in try sau: in try

world in filter //daca intervine exceptia

in except

world
Instructiunea try-finally:-este asemanatoare cu try-except cu diferenta ca

in cazul interventiei unei erori,tratarea erorii se face prin stergerea

memoriei de operare,urmata de executia codurilor dupa dealocarea memoriei,

inchiderea filelor si eliberarea variabilelor care controleaza manevrarea

filelor.Practic,executia continua fara variabilele din memoria de operare.

Sintaxa si modul de executie a instructiunii este identic cu cel de la

instructiunea try-except.Se utilizeaza pentru erorile memoriei de operare.


-35-

Instructiunea while:-permite repetarea unei instructiuni pana cand eva-

luarea expresiei conditionale returneaza valoarea "false".

Sintaxa este: while (expresia conditionala) instructiunea

Expresia conditionala trebuie sa fie aritmetica sau de tip pointer.

Daca evaluarea expresiei este diferita de zero,se executa instructiunea

si se reia reevaluarea expresiei,pana cand returneaza zero.

Bucla de repetitie poate fi intrerupta prin break,goto sau return.

EXEMPLU: while (x<27)

{

y=y+x

x++;

}
FUNCTII
Functiile reprezinta modulul fundamental al limbajului C.O functie

este de obicei conceputa pentru a executa o sarcina si numele sau reflecta

de obicei sarcina executata(pentru simplificarea depanarii).O functie

contine declaratii si instructiuni.Pentru definirea,declararea si apelarea

lor,se aplica urmatoarele reguli.

Orice functie trebuie sa fie declarata inainte sa fie apelata.Apelarea

unei functii,determina trecerea controlului de la functia apelanta la fun-

ctia apelata.Argumentele functiei vor fi transferate functiei apelate.La

aparitia cunvantului cheie "return",controlul va fi returnat inapoi fun-

ctiei apelante,eventual impreuna cu argumentele rezultate prin evaluarea

functiei apelate.

Modul de apelare al unei functii ca si ordinea interna de traswnsfer

a parametrilor sai este reglementata prin o serie de conventii ce vor fi

explicitate in extenso la descrierea fiecarei functii.

Modificatorii dllimport si dllexport sunt extensii ale limbajului C

introduse de catre compilatorul Microsoft pentru a facilita utilizatorului

accesul la filele DLL(dynamic link library).Filele DLL sunt file auxiliare

care partajeaza datele si permit utilizarea in comun de unitati hardware,

sau de componente software(inclusiv functiile si definitiile lor).

Argumentele functiei se introduc sub forma de lista.In cazul in care

functia se introduce fara argumente se va utiliza cuvantul cheie "void".

Parametrii functiei sunt valorile pe care se preconizeaza ca functia

le va lua in diverse circumstante,se introduc in paranteza sub forma de

lista si specifica tipul datelor,dimensiunea si identificatorii.

EXEMPLU: void functie1( double x,double y,double z)

Fata de limbajul C,C++ adauga si modificatorii __cdecl,__fastcall,

__stdcall,__syscall,__oldcall,__unaligned si __based.

In rest,declararea functiilor in limbajul C si C++ se face dupa

aceleasi regului ca si in oricare alt libaj de programare.Pentru simpli-

ficarea formularilor,se pot face eventual scheme pe hartie cu patratele,

sau se pot decupa dreptunghiuri de hartie pe care se trec specificatorii

si modificatorii utilizati si apoi se aranjeaza,ca un joc de puzzle,pana

cand respecta sintaxa si formularea corecta.Nu uitati ca acelasi "joc de

puzzle" trebuie sa il rezolve si procesorul,atunci cand aloca memoria

necesara pentru executia functiilor.Daca nu intelegeti acest joc,editarea

si/sau citirea programelor in limbaj C va fi destul de anevoioasa.


-36-

Recapituland sumar notiunile de pana acum:-un program in limbaj C este

format din un sir de expresii ce respecta o anumita sintaxa.Forma generala

a unei expresii este de genul:

____________ _____________ _________ _____________ ________

|SPECIFICATOR| |MODIFICATOR| |TIP DATE | |IDENTIFICATOR| |OPERATOR| ...

exemple exemple exemple exemple exemple
extern signed char nume variabila () [] + -

static unsigned int nume constanta * % < >

register long float nume arie = <= >=

auto short double nume pointer & ^ | ||

const void enum ?: :: /

volatile struct etc.

union

class
Limbajul C++ mai adauga un set de specificatori (cei de clasa) si de

modificatori,dar formula generala a unei expresii este de acelasi tip.

Programele scrise in limbaj C,opereaza atat cu date unare(ASCII) cat si

cu date binare(0 si 1).Nu exista deosebiri majore in formularea expresii-

lor,dar operatorii pentru datele binare sunt mai redusi si contin cate

doua definitii de operare(o definite actioneaza asupra valorilor 1 iar

cea de a doua actioneaza asupra valorilor 0).Fiecare grup binar de cate

opt caractere,formeaza un byte(octet) si are corespondent un caracter

ASCII(din cele 256).Dupa redactarea unui program,compilatorul realizeaza

transcriere acestuia,adica inlocuirea fiecarui cuvant printr-un grup de

caractere ASCII,denumit limbaj masina(la unele tipuri de procesor este

necesar ca transcrierea sa se faca si din ASCII in binar).Apoi procesorul

efectueaza operatiile solicitate,dupa care datele sunt transcrise din

nou sub forma de limbaj structurat si afisate pe ecran.Memoria de lucru,

este structurata(formatata) de catre un alt program derivat tot din cel

binar si structurat pe 8,16 sau 32 de biti.Si pentru operatiile cu adrese

de memorie,este necesar ca expresiile sa fie transcrise in limbaj binar.

Expresiile care se refera la adrese de memorie,se numesc cu valoare-l,

sau valori de stanga,deoarece in ecuatii apar la stanga semnului egal.

Identificatorii care se refera la adrese de memorie pot fi pointeri,struc-

turi sau uniuni sau variabile de tip aritmetic.
OPERATORI
Limbajul C permite un numar mai mare de operatori decat alte limbaje de

programare.Cea mai simpla clasificare este cea care se refera la tipul

de date asupra carora actioneaza.Operatorii care actioneaza doar asupra

Yüklə 4,6 Mb.

Dostları ilə paylaş:
1   2   3   4   5   6   7   8   9   ...   55




Verilənlər bazası müəlliflik hüququ ilə müdafiə olunur ©muhaz.org 2024
rəhbərliyinə müraciət

gir | qeydiyyatdan keç
    Ana səhifə


yükləyin