Sunteți pe pagina 1din 9

Algoritmic && programare. Limbajul C.

Instruciuni C\C++ (partea I)


Descrierea aciunilor de prelucrare a datelor care se e ecut !n corpul unei "uncii se reali#ea# cu ajutorul instuciunilor$ care "ormea# fluxul de control al e ecuiei. Instruciunile sunt e ecutate !n mod secvenial at%t timp c%t "lu ul de e ecuie nu este rami"icat de ctre o selecie$ de o ciclare sau de un salt. & instruciune este "ormat din cuvinte cheie$ expresii 'i e(entual alte instruciuni. & instruciune component unei alte instruciuni "ormea# corpul acelei instruciuni. De obicei corpul unei instruciuni este "ormat de ctre o instruciune compus. & instruciune compus !ncepe cu simbolul acolad deschis )*+ urmat de un bloc de instruciuni (posibil (id) 'i se termin cu simbolul acolad inchisa ),+. Cele dou acolade sunt pri componente ale instruciunii. &rice alt instruciune !ncepe cu un cu(%nt c-eie sau cu o e presie 'i se termin sau cu simbolul punct i virgul sau cu o instruciune component "ormat dintr.o instruciune compus. In ca#ul !n care apare$ simbolul punct 'i (irgul constitue terminatorul instruciunii 'i este parte componen a respecti(ei instruciuni. /ingura e cepie de la aceast regul o constitue instruciunea nul$ "ormat numai din terminatorul punct 'i (irgul. In (ederea reali#rii unui salt la o anumit instruciune$ acea instruciune trebuie pre"i at cu una sau mai multe etichete. & etic-et const dintr.un identi"icator urmat de simbolul dou puncte )0+$ etic-etele au propriul spaiu de nume (acela'i identi"icator poate "i "olosit pentru o etic-et 'i pentru o (ariabil "r s inter"ere#e)$ au ca domeniu de (i#ibilitate !ntregul corp al "unciei !n care apar 'i sunt recunoscute numai de instruciunea de salt goto.

I. Instruciuni sec(entiale
1. Instruciunea declaraie
/inta a0 declaraie; In limbajul C declaraiile nu au statut de instruciune0 au sinta a proprie 'i$ mai ales$ sunt constr%nse sa apar numai la !nceputul blocului din care "ac parte. In C++ aceast restricie a "ost ridicat prin introducerea instruciunii declaraie$ care nu este altce(a decat o declaraie !n stilul C dar care acum are dreptul s apar oriunde poate apare orice alta instruciune (cu cate(a restricii). 2ai mult$ prelu%nd situatia declaraiilor din C$ instruciunea declaraie este singura instruciune care poate apare !n e teriorul "unciilor.

3 emplu0
double f(int i){ int j,k=i+1; j=k++; if (k==0) return 0.0; double x=(double)j/k; return x+1; } // instructiune declaratie // instructiune declaratie

Declaraiile au reguli de scriere speci"ice "iecrui tip de dat 'i din acest moti( ele sunt preci#ate odat cu introducerea "iecrui nou tip. Declaraiile pot "i simple (declar numai tipul datelor) sau cu iniiali#are. Ca regul general$ simbolul )4+ care apare !n decla. raiile cu iniiali#are nu trebuie con"undat cu operatorul de atribuire ((e#i sinta a iniia. li#rii tablourilor).

5. Instruciunea e presie
/inta a0 expresie; & instruciune e presie pro(oac e(aluarea e presiei componente$ "r s produc rami"icaii !n "lu ul de e ecuie al programului (e(entualele apeluri de "uncii din cadrul e presiei introduc o rami"icare temporar$ ele returnea# controlul e ecuiei !n punctul !n care s.a !ntrerupt e(aluarea e presiei). Dac e presia component nu are e"ecte secundare$ instruciunea e presie respecti( este acceptat de compilator dar nu este tradus !n cod obiect (nu este nimic de e ecutat)$ alt"el se e(aluea# e presia 'i sunt completate (e ecutate) toate e"ectele secundare !nainte de preluarea controlului de ctre urmatoarea instruciune din te tul surs. Cele mai des utili#ate instruciuni e presie sunt instruciunile de atribuire 'i instruciunile de apel de "uncie. 3 emple0
int main( oid){ int i=1; int j,k; k=!; i#k $ j=0%j=1; i+j; j++; cout##j##endl; return 0; }

//instr. //instr. //instr. //instr. //instr.

ex"resie ex"resie ex"resie ex"resie ex"resie

(atribuire) (f&r& efecte secundare) (incrementare) (a"el de func'ie)

/ remarcm 'i urmtorul a(ertisment corespun#tor instruciunii 6i+j;7 'i anume0


(arnin) *+,,-% .+. % o"erator /as no effect; ex"ected o"erator (it/ side0effect

Instruciunea nul este o instruciune e presie "r e presia component (sic8)$ ea se reduce la terminatorul punct 'i (irgul$ 'i este util$ de e emplu$ !n situatia !n care

corpul unei instruciuni de ciclare nu trebuie s e ecute nimic. Ast"el$ urmatorul program a"isea#a numrul de caractere al stringului text0
int main ( oid){ c/ar text1-,23=4un text oarecare4; int i=0; (/ile (text1i++35=.60.) ; //instruc'iunea nula cout##4nr. de caractere=4##00i##endl; return 0; }

9. Instruciunea compus
/inta a0 { instruciune instruciune ::::.. instruciune } & instruciune compus const din #ero$ una sau mai multe instruciuni cuprinse !n interiorul unei perec-i de acolade. Acoladele sunt pari componente ale instruciunii 'i nu trebuie urmate de simbolul punct 'i (irgul (care ar introduce o instruciune nul inutil). Instruciunea compus "ormea# un bloc$ 'i !n consecin e(entualele instruciuni declaraie pre#ente !n corpul instruciunii compuse introduc !n mod implicit variabile locale blocului respecti(. 3 emplu0 urmtoarea "uncie determin (aloarea ma im a celor doua argumente 'i tipare'te un numar de caractere$ .7.sau .8.$ egal cu (aloarea returnat.
int max(int i,int j) { if (i#j) { for( ;j90;j00){ cout##.7.; } cout##endl; return j; } else { for( ;i90;i00) cout##.8.; cout##endl; return i; } }

In e emplul de mai sus$ ramurile instruciunii if ; else sunt instruciuni compuse. A(em 'i un e emplu de instruciune compus "ormat dintr.o singur instruciune component (corpul primului for)$ care este util pentru un stil unitar de scriere.

II. Instruciuni de selecie


<. Instruciunea i"
/inta a0 if (expresie-conditional) instruciune-corp Instruciunea if inserea# !n "lu ul sec(enial de e ecuie al programului instruciunea-corp$ !n ca#ul !n care expresia-conditional este ade(arat (adic are o (aloare nenul). 3 ecuia instruciunii if are loc !n urmatoarele etape0 se e(aluea# e presia conditional$ care trebuie s "ie de tip scalar (aritmetic sau pointer)$ 'i se completea# toate e"ectele sale secundare$ dac re#ultatul obinut este egal cu #ero ((aloarea logic fals) controlul este preluat de instruciunea imediat urmatoare din te tul surs al programului$ alt"el controlul este dat instruciunei corp. In acest ca#$ dupa e ecutarea instruciunii corp$ dac aceasta nu conine nici o instruciune de salt$ controlul este preluat de urmatoarea instruciune din program. 3 emplul "uncia urmtoare returnea# modulul di"erenei argumentelor0
int dist(int a,int b) { int c=a0b; if ( a # b ) c=b0a; return c;

=. Instruciunea i" ; else


/inta a0 if (expresie-conditionala) instruciune-corp-DA else instruciune-corp-NU Instruciunea if ; else inserea# !n "lu ul de e ecuie al programului una 'i numai una dintre cele dou instruciuni corp componente$ 'i anume0 dac e presia conditional este ade(arat controlul este preluat de instruciunea-corp-DA$ alt"el controlul este preluat de de instruciunea-corp-NU. Analog instruciunii if$ e ecuia !ncepe cu e(aluarea e presiei condiionale 'i completarea e"ectelor sale secundare$ iar la terminarea e ecuiei controlul este preluat de instruciunea imediat urmatoare !n te tul surs$ dac nu a aparut nici o instruciune de salt (break$ continue$ return sau goto).

3 emplul precedent rescris cu if ; else0


int dist(int a,int b){ int c; if ( a # b )c=b0a; else c=a0b; return c; }

De remarcat pre#ena terminatorului punct 'i (irgul !n ca#ul instruciunii corp DA din e emplul de mai sus0 simbolul +; "ace parte din instruciunea e presie 'i trebuie s "ie pre#ent$ el !nc-eie numai instruciunea component$ nu 'i instruciunea if else. Ca o obser(aie$ e emplul de mai sus are numai scopul de a e empli"ica instruc iunea if - else$ "uncia dist se implementea# mult mai concis cu ajutorul operatorului i" aritmetic (care nu trebuie con"undat cu i"-ul logic)0
int dist(int a,int b) { return a#b $ b0a %a0b; }

/inta a instruciunilor if 'i if else nu pre(ede utili#area unui terminator de instruciune$ 'i acest "apt poate crea ambiguiti de interpretare !n ca#ul unei sec(ente de instruciuni if 'i if else imbricate. >entru ie'irea din ambiguitate limbajul pre(ede urmtoarea regul de asociere0 c%nd !nt%lne'te un cu(ant c-eie else, compilatorul !l asocia# cu primul if a"lat !naintea sa !n "lu ul de e ecuie 'i care nu este deja asociat cu un else. Dac rm%ne un else pentru care nu e ist nici un if cu care s "orme#e o perec-e if else, apare o eroare de compilare. 3ste recomandat utili#area acoladelor !n ca#ul instruciunilor if 'i if - else imbricate0 mre'te li#ibilitatea programelor 'i e(it interpretarile eronate. ?rmatoarele doua sec(ene de cod sunt ec-i(alente0

int {

ax(int a,int b) int c=0; if (a # 0) if (b # 0) if (a # b) c=1; else if (a # 01) c=-; else c=a0b; return c;

int {

ax(int a,int b) int c=0; if (a # 0){ if (b # 0) { if (a # b) c=1; else { if (a # 01) c=-; else c=a0b; } } } return c;

& te-nic des utili#at pentru alegerea unei singure altenati(e din mai multe posibile este @else.i" !n cascad7$ sc-em ilustrat de e emplul urmator0
oid de:nde;ate<antul(unsi)ned directie) { unsi)ned dir= directie = >20; cout##4<?@A:B ;?AC DC B? 4; if (dir==0) cout##4CEA.4; else if (0#dir FF dir#G0) cout##4@HID0CEA4; else if (dir==G0) cout##4@HID.4; else if (G0#dir FF dir#1J0) cout##4@HID0<CEA4; else if (dir==1J0) cout##4<CEA.4; else if (1J0#dir FF dir#-!0) cout##4E:D0<CEA.4; else if (dir == -!0) cout##4E:D.4; else if (-!0#dir FF dir#>20) cout##4E:D0CEA.4; else cout##4@?K;?54; cout##endl; return;

Aariabila directie trebuie s "ie po#iti( 'i desemnea# (aloarea !n grade se a#ecimale a ung-iului director msurat !n sens trigonometric de la direcia est. De e emplu$ apelul de:nde;ate<antul(20) are re#ultatul0 <?@A:B ;?AC DC B? @HID0CEA.

B. Instruciunea sCitc/inta a0 switch (expresie-selector) instruciune-corp Instruciunea de comutare switch introduce di(erse alternati(e !n "lu ul de e ecuie$ !n "uncie de (aloarea expresiei selector. >entru aceasta$ corpul instruciunii switch trebuie sa "ie un bloc de instruciuni dintre care unele s "ie etic-etate cu etichete case sau default (alt"el controlul sare peste switch). Dorma e"ecti( a instruciunii este urmatoarea0 switch (expresie-selector){ case expresie-constanta: instruciune ::::.. instruciune case expresie-constanta: instruciune ::::.. instruciune :::::::::::.. case expresie-constanta: instruciune ::::: instruciune default: instruciune ::::.. instruciune } Diecare e presie a"lat !ntre case 'i simbolul 6 : corespun#tor trebuie s "ie o e presie constant (a carei (aloare este determinat la compilare). Aceste e presii au rolul de etic-ete pentru instruciunile care le urmea# 'i !n consecin (alorile lor trebuie s "ie distincte. & instruciune este etic-etat numai dac urmea# imediat dup simbolul dou puncte. At%t pre#ena c%t 'i ordinea etic-etelor case 'i default este opional$ este permis cel mult o singur etic-eta default. & instruciune poate a(ea mai multe etic-ete. 3 ecuia instruciunii switch !ncepe cu e(aluarea expresiei-selector$ care trebuie sa "ie de tip !ntreg 'i care de obicei este "ormat doar din numele unei variabile selector. In "uncie de (aloarea gasit se e ecut un salt la una dintre instruciunile etic-etate din interiorul blocului component$ sau se !nc-eie e ecuia instruciunii de comutare. Eegulile sunt urmatoarele0 dac (aloarea selectorului este e act c%t (aloarea unei etic-ete case$ se sare la respecti(a etic-et$ !n ca# contrar se sare la etic-eta default dac aceasta este pre#enta$ dac nu$ e ecuia instruciunii de comutare se !nc-eie 'i controlul este preluat de instruciunea care urmea#a !n te tul surs al programului. In ca#ul !n care a a(ut loc un salt la una dintre instruciunile blocului switch$ e ecuia acestora continu !n modul u#ual

(implicit sec(enial$ 6!n cascad7)$ "r ca pre#ena etic-etelor case 'i default s mai in"luene#e ordinea lor de e ecuie. In corpul unui switch pot s apar urmatoarele instruciuni de salt0 break$ return 'i goto. Dintre acestea$ break are o utili#are speci"ic0 !nc-eie e ecuia blocului switch !n care apare 'i$ !n consecin$ este utili#at !ndeosebi pentru selectarea unei singure alternati(e din mai multe posibile. In e emplul urmator0
{ oid selectie(int i,int j) s(itc/ (i+j){ cout##.0.; case 1% cout##.1.; break; case -% cout##.-.; return; case >% case +% cout##.7.; default% cout##.D.; break; case -8>% cout##.2.; } cout##.L.; return;

apelul selectie(0,1)a"i'ea# sec(ena de caractere 1F$ apelul selectie(1,1)a"i'ea# numai ci"ra 5$ selectie(1,-)si selectie(-,-)imprima "iecare sec(enta de caractere GDF$ selectie(>,>)a"isea#a BF iar selectie(0,1!)a"isea#a DF. Instruciunea cout##.0.; $ a"lat !naintea oricarei etic-ete case sau default$ este aceptat de compilator dar nu poate "i atins de "lu ul de e ecuie al programului. Instruciunea sCitc- este deosebit de util !n situaia !n care trebuie selectat o anumita aciune pe ba#a unei codi"icari numerice stabilite de la bun !nceput. >unctul slab !l constituie "aptul c selecia se e"ecuea# numai dup un singur criteriu0 (aloarea numeric a e presiei selector. 2ai mult$ ca#urile etic-etate cu case sunt de tip discret$ (aloarea selectorului trebuie s "ie e act c%t (aloarea unei etic-ete$ numai ca#ul default permit%nd o singur alegere pentru toate (alorile selectorului a"late !ntr.un anumit domeniu. Hotu'i$ orice selecie multi.criterial$ c-iar 'i cu ca#uri de tip 6domeniu de (alori7$ poate "i trans"ormat !ntr.o selecie de tip switch$ utili#and te-nica ilustrat de urmatoarea (ersiune a "unciei de:nde;ate<antul din seciunea precedent0
oid de:nde;ate<antul(unsi)ned directie) { int nord, est,sud,est; unsi)ned dir= directie = >20; nord =(0#dir FF dir#1J0); est =(G0#dir FF dir#-!0);

sud =(1J0#dir FF dir#>20); est =(-!0#dir FF dir#=>20)MM(0#=dir FF dir#G0); cout##4<?@A:B ;?AC DC B? 4; s(itc/ (10008nord+1008 est+108sud+est){ case 1000% cout##4@HID.4; break; case 10% cout##4E:D.4; break; case 1001% cout##4@HID04; case 1% cout##4CEA.4; break; case 11% cout##4E:D0CEA.4; break; case 1100% cout##4@HID04; case 100% cout##4<CEA.4; break; case 110% cout##4E:D0<CEA.4; break; default% cout##4@?K;?54; } cout##endl; }

3 presia.selector pre#entata mai sus "olose'te scrierea po#iional a numerelor$ ba#a #ece "iind "olosit aici numai din moti(e de comoditate. In mod u#ual sunt "olosite coduri binare 'i operaii pe biti$ re#ult%nd ast"el selecii cu switch "oarte e"iciente. 3 erciiu0 implementai "uncia de mai sus cu urmtoarea e presie selector0
s(itc/ (nord##> M est##- M sud##1 Mest){ case 0xJ% cout##4@HID.4; break; ... ,

S-ar putea să vă placă și