CATEGORII DOCUMENTE |
Reprezentarea structurilor de prelucrare in C/C++
Limbajul C nu propune o revolutie de fond in ceea ce priveste problema reprezentarii structurilor de prelucrare. Vine, insa, cu o serie de inovatii interesante, in ceea ce priveste flexibilitatea si varietatea propunerilor de reprezentare. Nu spunem nici o noutate amintind ca reprezentarea structurilor de prelucrare se bazeaza pe combinarea, daca se poate, profesionala, a instructiunilor executabile ale limbajului. Potrivit standardelor ANSI C si ANSI C++ instructiunile sunt impartite in urmatoarele grupe:
Instructiuni de selectie
Instructiuni iterative
Instructiuni de salt
Instructiuni de etichetare
Instructiuni bloc
Instructiunile de selectie cuprind enunturile if si switch.
In categoria instructiunilor iterative intra enunturile while, for si do-while.
Instructiunile de salt desemneaza in C instructiunile break, continue, goto si return.
Instructiunile de etichetare includ enunturile case si default (implicate, esential, in sintaxa si semantica instructiunii switch si etichetele (discutate relativ la instructiunea goto. Problematica instructiunilor expresie am discutat-o, pe larg, in sectiunea precedenta. De asemenea, blocul de cod este, deja, o notiune cu care ne-am familiarizat. De altfel, asa cum in Pascal, secventa de cod cuprinsa intre begin si end era numita si instructiune compusa, standardul ANSI C++ propune, aceeasi denumire, ca denumire alternativa pentru blocul de cod.
ASa atragem atentia asupra faptului ca C++ adauga elemente sintactice specifice pentru tratarea exceptiilor de catre programator. Nu toate compilatoarele implementeaza, insa, acest suport important pentru a realiza aplicatii robuste si fiabile in C++.
1 Ce se intelege prin adevarat si fals in C
Mai multe instructiuni din C se bazeaza pe expresii conditionale pentru a reprezenta un anumit tip de prelucrare. La fel ca in Pascal, sintaxa acestor instructiuni C face supozitia ca alegerea unei traiectorii de prelucrare depinde de rezultatul evaluarii acestor expresii conditionale. Teoretic, valorile admisibile pentru o expresie conditionala sunt adevarat si fals. Punctul de vedere al limbajului C cu privire la adevar si fals este urmatorul:
Un rezultat al evaluarii egal cu zero este interpretat ca fals.
Un rezultat nenul al evaluarii este interpretat ca adevarat.
Aceasta schimbare de optica in ceea ce priveste adevarul si falsul este de bun augur pentru scrierea de cod flexibil si eficient.
A Propunerea de standard ANSI C++ defineste un tip de data boolean numit bool (care poate sa aiba doar valorile adevarat si fals. Ceea ce nu inseamna, insa, ca nu se pastreaza punctul de vedere al limbajui C relativ la adevar si fals.
Instructiuni de selectie in C
C admite doua tipuri de instructiuni de selectie: if si switch.
if
Sintaxa generala a instructiunii if este urmatoarea:
if (<Expresie>) <Instructiune 1>;
else <Instructiune 2>;
<Instructiune 1> si <Instructiune 2> desemneaza o singura instructiune, un bloc de instructiuni sau nici o instructiune. Clauza else este optionala.
Daca <Expresie> este evaluata ca adevarat (adica rezultatul evaluarii este orice valoare diferita de zero), atunci este executata <Instructiune 1>; altfel, se executa <Instructiune 2>. Evident, nu este obligatoriu sa fie prezenta clauza else.
<Expresie> trebuie sa returneze o valoare scalara (un intreg, un caracter, un pointer sau un numar real in virgula mobila). Un numar real in virgula mobila se utilizeaza "cu retinere" pentru a controla o instructiune de selectie deoarece incetineste semnificativ executia programului. Aceasta deoarece sunt necesare mai multe instructiuni pentru a efectua o operatie in virgula mobila decat pentru a executa operatii la nivel de caracter sau cu intregi.
De semnalat faptul ca, in situatia in care una din instructiunile asociate conditiilor true sau false ale unui if este bloc de instructiuni atunci sintaxa corecta este:
if (<Expresie>)
else
Modul de utilizare a instructiunii if poate fi urmarit si in exemplul de mai jos.
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
void main()
Instructiunea if poate fi imbricata. In caz de imbricare, clauza else se refera intotdeauna la cea mai apropiata instructiune if situata in amonte, in acelasi bloc cu else si neasociat inca cu un else, ca in exemplul:
#include <stdio.h>
#include <conio.h>
#include <string.h>;
void main()
else
else
Destul de frecvent instructiunea if este utilizata si in constructia numita "scara if-else-if" avand sintaxa generala:
if (<Expresie_1>)
<Instructiune_1>;
else if (<Expresie_2>)
<Instructiune_2>;
else if (<Expresie_3>)
<Instructiune_3>;
else if (<Expresie_k>)
<Instructiune_k>;
Reamintim ca, in anumite situatii, putem utiliza operatorul ? pentru a inlocui instructiunea if-else de forma:
if (<Expresie>)
<Expresie_1>;
else
<Expresie_2>;
cu o constructie de forma:
<Expresie>?<Expresi_1>:<Expresie_2>;
switch
C permite reprezentarea structurilor alternative cu mai multe ramuri utilizand in acest scop instructiune switch avand sintaxa:
switch (<Expresie>)
Semantica instructiunii este urmatoarea: se compara valoarea expresiei <Expresie> cu valorile constantelor specificate in instructiunile case. Cand se intalneste o coincidenta, se executa secventa de instructiuni asociata acelui case pana la instructiunea break sau pana cand se ajunge la finalul instructiunii switch. Instructiunea default se executa daca nu este intalnita nici o coincidenta. Clauza default este optionala si daca nu este prezenta, atunci cand nu avem nici o coincidenta nu se executa nici o actiune.
Standardul ANSI C stipuleaza ca switch poate sa aiba cel mult 257 de clauze case. Standardul propus de ANSI C++ recomanda sa se poata introduce cel mult 16.384 clauze case. In practica, din motive de eficienta, se urmareste limitarea numarului de clauze case intr-o instructiune switch.
Instructiunea case nu poate fi utilizata decat in contextul instructiunii switch.
Instructiunea break este o instructiune de salt in C, fiind utilizata pentru a determina iesirea fortata din anumite tipuri de structuri (switch, for, do-while).
Ilustram modul de utilizare a instructiunii switch prin exemplul de mai jos.
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
void main
default:
Ras=getch();
Evident si instructiunea switch poate fi imbricata.
De asemenea, facem urmatoarele precizari relativ la instructiunea switch:
-In acelasi switch nu pot exista doua constante case cu valori identice. Doua instructiuni switch, imbricate, pot sa aiba aceeasi constanta case.
-Daca in instructiunea switch sunt utilizate constante de tip caracter, ele sunt automat convertite in intregi.
3 Instructiuni iterative
In C, ca si in alte limbaje de programare evoluate, exista enunturi de limbaj pentru a reprezenta:
structuri repetitive cu numar cunoscut de pasi (for);
structuri repetitive cu numar necunoscut de pasi, anterior conditionate (while);
structuri repetitive cu numar necunoscut de pasi, posterior conditionate (do-while);
Structurile repetitive se mai numesc si bucle.
Bucla for (pentru structuri repetitive cu numar cunoscut de pasi.)
Conceptul general de <bucla for> se reflecta intr-o forma sau alta in orice limbaj de programare de nivel inalt. In C, acest concept are o implementare de o flexibilitate si o putere neasteptate. Sintaxa generala a instructiunii for este:
for (<Initializare>;<Conditie>;<Increment>) <Instructiune>;
O astfel de sintaxa permite multe variante constructive ale buclei for. In general vorbind, insa:
-<Initializare> este o instructiune de atribuire utilizata pentru a initializa variabila de control a buclei;
-<Conditie> este o expresie relationala care determina conditia de iesire din bucla;
-<Increment> defineste modul in care se modifica variabila de control a buclei de fiecare data cand aceasta se repeta.
De remarcat faptul ca cele trei sectiuni trebuie separate prin punct si virgula. Asadar, bucla for se executa cat timp <Conditie> este adevarata. Daca <Conditie> devine falsa, atunci executia programului continua cu instructiunea care urmeaza constructiei for, daca aceasta exista.
Maniera clasica de utilizare a buclei for in C, o prezentam in exemplul de mai jos.
#include <stdio.h>
#include <iostream.h>
#include <conio.h>
long int fact( int n);
void main
long int fact(int n)
Exemplul de cod C prezentat mai sus permite calculul factorialului pentru un numar natural dat. Exemplul arata, anticipand, modul de utilizare a conceptului de functie in C++.
Cateva variatiuni pe tema buclei for.
Sintaxa C permite variante dintre cele mai neastepate de definire a unor bucle for. Rigiditatea buclei for din Pascal este inlocuita in C cu o sintaxa care emana mai multa putere, flexibilitate si aplicabilitate in situatii specifice de programare.
Una dintre cele mai folosite variatiuni foloseste operatorul virgula, pentru a permite ca bucla sa fie controlata de doua sau mai multe variabile. De exemplu, variabilele x si y controleaza urmatoarea bucla si amandoua sunt initializate in interiorul instructiunii for.
:
for (x=0,y=0;x+y<10;++x
:
Prezentam, mai jos, un exemplu practic de utilizare a unei bucle for controlata de doua variabile: afisarea unui sir de caractere incepand de la ambele capete, mergand catre mijlocul sirului. Se observa prezenta fisierului header <dos.h> in care se afla prototipul functiei delay().
#include <conio.h>
#include <stdio.h>
#include <string.h>
#include <dos.h>;
//Semnatura functie converg
void converg(int linie, char *mesaj);
//Functia principala
void main()
//Implementare functie converg
void converg(int linie, char *mesaj)
getch();
Ca un caz particular prezentam si sintaxa pentru o bucla infinita cu for.
for
Bucla while (pentru structuri repetitive cu numar necunoscut de pasi conditionate anterior.)
A doua bucla disponibila in C este bucla while. Forma sa generala este:
while (<Conditie>) <Instructiune>;
unde <Instructiune> este o instructiune vida, o instructiune sau un bloc de instructiuni.. Conditia poate sa fie orice expresie, fiind adevarata pentru orice valoare nenula. Bucla se reia cat timp conditia este adevarata. Cand conditia devine falsa, controlul programului trece la linia de cod urmatoare buclei, daca aceasta exista.
Prezentam un exemplu de cod in care bucla while este utilizata pentru a simula, eventual, executia unei secvente de instructiuni pana cand doreste liberul arbitru al utilizatorului programului.
#include <stdio.h>
#include <conio.h>
#include <ctype.h> //Contine prototipul functiei toupper
void main
Bucla do-while (repetitive cu numar necunoscut de pasi. conditionate posterior.)
Spre deosebire de buclele for si while, care testeaza conditia din bucla la inceputul executiei lor, bucla do-while o verifica la sfarsit. Aceasta inseamna ca bucla do-while se executa cel putin odata. Forma sa generala este:
do while <Conditie>;
Bucla do-while se repeta pana cand <Conditie> devine falsa. Dam, mai jos, un exemplu practic de utilizare a buclei do-while (afisarea/ selectarea optiunilor unui program C).
char prelopt()
:
Alte instructiuni C.
Asa cum rezulta si din exemplele prezentate, in C mai sunt intens folosite urmatoarele instructiuni: return, exit, break , continue si goto.
Instructiunea return este utilizata pentru intoarcerea dintr-o functie. Este considerata ca instructiune de salt deoarece determina executia programului sa revina la prima instructiune dupa functia apelata in care apare return. Forma generala a instructiunii return este:
return [<Expresie>]
Aceasta sintaxa arata ca daca <Expresie> este prezenta atunci rezultatul evaluarii expresiei este valoarea returnata de functie. O functie void nu trebuie sa returneze nimic, deci return poate sa apara fara <Expresie>. Intr-o functie return poate sa apara de cate ori este necesar. In C++ o functie care nu este void trebuie sa returneze o valoare.
Functia exit()
Este utilizata pentru iesirea imediata dintr-un program, returnand, eventual un cod de retur. Sintaxa de apel este:
exit (<Cod_de_retur>);
<Cod de retur> poate fi interpretat de procesul care a apelat programul, de regula, sistemul de operare. Exit actioneaza ca un break generalizat.
Instructiunea break
Are doua utilizari. Poate fi folosita, dupa cum am vazut deja pentru a incheia un case dintr-o instructiune switch, sau pentru a determina incheierea imediata a unei bucle.
Instructiunea continue
Forteaza trecerea la urmatoarea iteratie a unei bucle, determinand ignorarea restului codului iteratiei in care se afla.
Nu facem mentiuni speciale referitor la instructiunea goto.
Politica de confidentialitate | Termeni si conditii de utilizare |
Vizualizari: 1000
Importanta:
Termeni si conditii de utilizare | Contact
© SCRIGROUP 2024 . All rights reserved