Sunteți pe pagina 1din 67

Structura programelor n limbajul C.

Tipuri de date, operatori i expresii

Unitatea de nvare Nr. 3


STRUCTURA PROGRAMELOR N LIMBAJUL C. TIPURI DE DATE, OPERATORI I EXPRESII Cuprins Pagina

Obiectivele Unitii de nvare 3 ....................................................................................44 3.1 Privire de ansamblu asupra limbajului C .................................................................44 3.2 Structura programelor n limbajul C.........................................................................46 3.3 Variabile, tipuri de variabile i declarare..................................................................51 3.4 Constante ...................................................................................................................54 3.5 Funcii aritmetice care opereaz cu valori de tip real i ntreg ..............................57 3.6 Operatori n C .............................................................................................................60 3.6.1 Operatorul de atribuire..................................................................................60 3.6.2 Operatori aritmetici .......................................................................................61 3.6.3 Operatori relaionali i logici .........................................................................65 3.6.4 Operatori de atribuire compus ....................................................................67 3.6.5 Operatorul de conversie explicit (cast) .......................................................68 3.6.6 Operatorul sizeof ..........................................................................................68 3.6.7 Operatorul virgul (,) ...................................................................................69 3.6.8 Operatorul condiional (?) .............................................................................69 Rspunsuri corecte la testele de autoevaluare, sarcinile de lucru i exerciii ...........72 Bibliografie .......................................................................................................................72 Lucrarea de verificare Nr. 3, notat de tutore................................................................73

Obiectivele Unitii de nvare 3


Dup parcurgerea acestei uniti de nvare vei fi capabili s: Identificai diferitele tipuri de variabile Declarai tipuri simple de variabile i constante Reprezentai diverse espresii folosind operatorii aritmetici, logici i relaionali Exemplificai folosirea operatorilor pentru diverse tipuri de variabile

3.1

Privire de ansamblu asupra limbajului C


nceputurile limbajului de programare C

Etapa iniiala de dezvoltare a limbajului de programare C a avut loc n cadrul laboratoarelor AT&T Bell ntre anii 1969 i 1973. Dup spusele lui Dennis Ritchie, cea mai creativ perioad a avut loc n 1972. A fost denumit C deoarece multe din caracteristicile sale au fost derivate din limbajul de programare B.

44

Proiectul pentru nvmntul Rural

Structura programelor n limbajul C. Tipuri de date, operatori i expresii

Sunt multe legende despre originea limbajului C i legtura sa cu sistemul de operare Unix, cum ar fi: Dezvoltarea limbajului C a fost rezultatul dorinei programatorilor de a juca un joc de tipul Asteroids. Acetia l jucau pe calculatorul principal al companiei, dar din lipsa de resurse i datorit faptului c acesta trebuia s suporte mai mult de 100 de utilizatori, Thompson i Ritchie, nemulumii de controlul pe care l aveau asupra navei n ncercarea de a evita asteroizii, au decis s porteze jocul pe un PDP-7, nefolosit, din birou. Dar aceast main nu avea un sistem de operare, aa c au hotrt s scrie unul. Au decis ca eventual s porteze acest sistem de operare pe mainile PDP-11 pe care acetia le foloseau n birou, dar era o munc destul de dificil avnd n vedere c totul era scris n limbaj de asamblare. Aa c au decis s foloseasc un limbaj portabil de nivel nalt astfel nct sistemul de operare s poat fi portat cu uurin de pe un computer pe altul. Au ncercat folosind limbajul de programare B, dar i lipseau unele din funcionalitile care ar fi fcut facil folosirea unor caracteristici avansate a mainii PDP-11. Astfel, a aprut un nou limbaj de programare, numit C. Justificarea pentru obinerea primului computer care a fost utilizat pentru dezvoltarea sistemului de operare Unix a fost acela de a crea un sistem pentru a automatiza completarea autorizaiilor. Prima versiune a sistemului de operare Unix a fost scris n limbaj de asamblare. Mai trziu, limbajul de programare C a fost folosit pentru a rescrie sitemul de operare.

ncepnd cu anul 1973, limbajul de programare C a devenit destul de robust, astfel nct mare parte a kernelului Unix, scris iniial n limbaj de asamblare pentru PDP 11/20, a fost rescris n C. Acesta a fost unul din primele kernele ale unui sistem de operare scris ntr-un limbaj de programare, altul dect limbajul de asamblare. ncercri anterioare au fost pentru scrierea sistemului Multics (scris n PL/I) i TRIPOS (scris n BCPL). K&R C n 1978, Dennis Rithie i Brian Kernighan au publicat prima ediie a crii Limbajul de programare C (eng. The C Programming Language). Aceast carte, cunoscut n cercul programatorilor sub numele K&R, a servit pentru muli ani ca un mijloc de informare asupra specificaiilor limbajului C. Versiunea limbajului C descris este cunoscut sub numele K&R C. K&R C este adesea considerat limbajul de baz pe care orice compilator C trebuie s-l suporte. Pentru muli ani, chiar i dup introducerea standardului ANSI C, a fost considerat ca fiind cel mai mic numitor comun pe care programatorii n C trebuie s-l respecte atunci cnd se vorbete de portabiliitate maxim, deoarece nu toate compilatoarele sunt scrise nc s suporte standardul ANSI C, iar o secven de cod scris n K&R C respect i ANSI C. ANSI C i ISO C La sfritul anilor 1970, C a nceput s nlocuiasc limbajul BASIC devenind cel mai utilizat limbaj de programare. n anii 1980 a fost adptat si de calculatoarele IBM PC, popularitatea acestuia ncepnd s creasc semnificativ. n acest timp, Bjarne Stroustrup mpreun cu ali colegi de la Bell Labs au nceput s adauge limbajului C caracteristici ale programrii orientate pe obiecte. Limbajul rezultat a fost denumit C++ i este cel mai popular limbaj de programare pe sistemele de operare Microsoft Windows; totui C-ul rmne cel mai popular limbaj de programare n Unix. Alt limbaj de programare dezvoltat n acea vreme se numete Objective-C care adaug de asemenea C-ului caracteristici ale programrii orientate pe obiecte. Dei nu la fel de popular ca C++, Obejective-C este folosit pentru dezvoltarea aplicaiilor pe ce folosesc interfaa Cocoa a sistemului de operare Mac OS X.

Proiectul pentru nvmntul Rural

45

Structura programelor n limbajul C. Tipuri de date, operatori i expresii

n 1983, American National Standards Institute (ANSI) a format un comitet, X3J11, pentru a stabili specificaiile unui limbaj C standard. Dup un proces ndelungat, standardul a fost terminat n 1989 i ratificat ca ANSI X3.159-1989 "Programming Language C". Aceast versiune a limbajului ne este cunoscut sub numele ANSI C. n 1990, standardul ANSI C (cu mici modificri) a fost adoptat de International Organization for Standardization (ISO) ca ISO/IEC 9899:1990. Una din intele procesului de standardizare ANSI C a fost acela de a produce un superset al K&R C, ncorpornd multe dintre caracteristicile neoficiale introduse secvenial. Totui, comitetul pentru standardizare a introdus cteva caracteristici noi, cum ar fi prototipul funciilor (mprumutat din C++) i un preprocesor mult mai capabil. ANSI C este suportat de marea majoritate a compilatoarelor folosite astzi. Mare parte din codul C scris acum este bazat pe ANSI C. Orice program scris exclusiv n standardul C este garantat s funcioneze corect pe orice platform cu o implementare C conform. Totui, multe programe sunt scrise astfel nct aceste vor putea fi compilate numai pe anumite platforme, sau folosind un anumit compilator, deoarece (i) se folosesc biblioteci non-standard, de exemplu pentru interfaa grafic, (ii) unele compilatoare ce nu respect standardul ANSI C, deci i urmaii lor n mod implicit sau (iii) bazarea pe dimensiunea unui anumit tip de date pe anumite platforme. Limbajul C est singurul limbaj de programare structurat care permite un control rigurosal hardwareuluii al perifericelor (facilitate oferit de limbajele de asamblare). Limbajul C a fost folosit iniial pentru scrierea programelor de sistem (sisteme de operare, editare, compilatoare, etc), dar o dat cu creterea popularitii lui, programatorii au nceput s-l foloseasc i la scrierea programelor de aplicaii datorit n special eficienei i portabilitii crescute a unor astfel de programe. Datorit calitilor sale incontestabile, limbajul C a devenit limbajul de baz i pentru programarea aplicaiilor de tip real.

3.2 Structura programelor n limbajul C


n orice activitate de programare, prima aciune ntreprins de programator este scrierea programului cu ajutorul unui editor, n conformitate cu regulile sintactice i semantice corespunztoare limbajului ales. Se elaboreaz astfel aa-numitul program surs, care trebuie s parcurg o serie de etape pentru a fi executat: etapa de compilare, care are la rndul ei dou componente: rezolvarea directivelor ctre preprocesor prin expandarea n codul surs a unor forme reduse determinate de aceste directive (dac exist); transpunerea programului surs n program obiect, apt de a fi executat de main; etapa de link-editare, care presupune legarea programului obiect obinut mai sus cu bibliotecile de sistem i transformarea lui ntr-un program executabil; etapa de lansare n execuie. Modul n care se execut aceste aciuni este specific tipului de calculator i de sistem de operare care conine limbajul de programare. n cele ce urmeaz vor fi prezentate problemele generale de programare pentru elaborarea programului surs, probleme valabile indiferent de maina pe care se lucreaz.

46

Proiectul pentru nvmntul Rural

Structura programelor n limbajul C. Tipuri de date, operatori i expresii

O prim observaie important pe care trebuie s o facem este aceea c orice programn C este compus dintr-o serie de entiti numite funcii. O funcie, pentru a o deosebi de un cuvnt cheie oarecareal limbajului, se noteaz cu numele funciei, urmat de o pereche de paranteze rotunde: nume_funcie(); Funciile pot fi apelate att n cadrul expresiilor, ct i independent. Funcia main() este aceea ctre care sistemul de operare transfer controlul atunci cnd se lanseaz n execuie programul; fiecare program conine cel puin o funcie, i anume funcia main. Cel mai simplu program n C este urmtorul: Exemplul 3.1 main() { } Acest program nu realizeaz nimic. Se remarc funcia main, urmat de o pereche de paranteze rotunde, ce indic c aceasta este o funcie; ntre cele dou paranteze pot fi parametri formali, atunci cnd e nevoie. Se mai observ existena unei perechi de acolade ce ncadreaz corpul funciei, care n aceast situaie este instruciunea vid. Aceste paranteze se utilizeaz i pentru delimitarea altor blocuri ntlnite de exemplu n structurile iterative sau deczionale. Un program foarte simplu, care are ca rezultat afiarea textului Invatam limbajul C, este urmtorul: Exemplul 3.2 #include <stdio.h> main() { printf(Invatam limbajul C); } Pentru a realiza operaii de citire/scriere, limbajul C este nzestrat cu funcii specifice, n acest caz fiind folosit funcia printf, ce are un singur parametru, i anume textul ce va fi tiprit, cuprins ntre ghililmele. Se observ c acest program ncepe cu o prim linie de program, #include <stdio.h>, a crei semnificaie este urmtoarea: pentru ca o funcie s fie apelat (printf()), compilatorul trebuie s gseasc anumite informaii despre ea (prototipul su, care va fi explicat ulterior). Aceste informaii se gsesc ntr-un fiier, n acest caz numele lui este stdio.h. Extensia (h) este dat de faptul c un astfel de fiier este considerat de tip header (antet). Prototipurile funciilor care pot fi apelate n cadrul limbajului se gsesc grupate n fiiere de tip header; mai multe funcii nrudite au prototipurile grupate ntr-un astfel de fiier (de exemplu, cele de citire/scriere).

Proiectul pentru nvmntul Rural

47

Structura programelor n limbajul C. Tipuri de date, operatori i expresii

n procesul de transformare a textului surs n program executabil exist o etap care se execut naintea compilrii, i anume preprocesarea. n aceast etap fiierul header este inclus n textul surs. Linia de program: printf(Invatam limbajul C); formeaz o instruciune i ea este obligatoriu terminat cu semnul ;. Trebuie fcut observaia c spaiil albe (blank, tab, newline) sunt invizibile pentru compilator. Astfel, programul mai putea fi scris i aa: main(){printf(Invatam limbajul C);} Modul de scriere a programului folosit n exemplul anterior face ca acesta s devin mai uor de citit i de interpretat. n figura 3.1 este prezentat o sintez a celor prezentate pn acum. numele funciei parantezele pot include semn de terminare a unei instruciuni main() { printf(Invatam limbajul C); } instruciune

paranteze pentru delimitarea corpului

program constituit din funcia numit main() Figura 3.1

Programul poate conine comentarii, care pot fi plasate oriunde n text. Exist dou moduri de introducere a comentariilor: ntre perechile de caractere /* i */. Un astfel de comentariu poate ocupa mai multe linii ale programului surs. Exemplu: /*acesta este un comentariu.*/ n cazul n care dorim s scriem un comentariu pe o singur linie surs, tastm dou caractere /. De exemplu, o linie poate conine: printf(un text); //acesta este un comentariu. Comentariul ncepe dup cele dou caractere// i se termin o dat cu sfritul de linie.

48

Proiectul pentru nvmntul Rural

Structura programelor n limbajul C. Tipuri de date, operatori i expresii

Funcia printf() din acest exemplu este o funcie sistem, adic nu este creat de programator, care permite afiarea la consol (display) a constantelor, variabilelor i caracterelor. S observm modul de folosire al acestei funcii i n alte exemple. Considerm urmtorul program: Exemplul 3.3 main() { printf(Acesta este numarul sapte: %d,7); } n urma lansrii n execuie a programului, la consol va aprea: Acesta este numarul sapte: 7 n acest caz funcia printf() are dou argumente separate prin virgul, i anume un ir de caractere ncadrat ntre ghilimele i valoarea ntreag 7. Simbolul %d permite transferarea parametrului din dreapta virgulei valoarea 7 n stnga virgulei, alturi de irul de caractere. Acesta reprezint unul din formatele specifice utilizate de funcia printf(), i anume acela pentru scrierea numerelor ntregi. Pentru a nelege i mai bine modul de lucru al funciei printf(), s mai considerm un exemplu: Exemplul 3.4 main() { printf(%s este student in anul %d \n la facultatea ta., Mihai, 3); } n urma execuiei programului, se va afia: Mihai este student in anul 3 la facultatea ta. Aceasta nseamn c funcia printf() a nlocuit simbolul %s cu irul de caractere Mihai i simbolul %d cu numrul ntreg 3. Simbolul \n reprezint caracterul newline i are efect de carriage return and linefeed rnd nou i de la capt. Acesta este motivul c textul a fost afiat pe dou rnduri, dei el a fost scris n program ntr-un singur rnd. El formeaz o aa-numit secven escape. S considerm nc un exemplu de program:

Proiectul pentru nvmntul Rural

49

Structura programelor n limbajul C. Tipuri de date, operatori i expresii

Exemplul 3.5 main() { printf(Litera %c se gseste in cuvantul %s,h, Mihai); printf(pe pozitia %d.,3); } Dup executarea programului, se va afia: Litera h se gseste in cuvantul Mihai pe pozitia 3. Se observ c scrierea textului se face pe un singur rnd, cu toate c n program sunt dou linii de instruciuni. Aici heste caracter i se scrie cu formatul %c. Caracterele se delimiteaz de simbolul apostrof, iar irurile de caractere de ctre ghilimele. Din punct de vedere sintactic, un program scris n limbajul C este o secven de caractere ASCII. Este alctuit din elemente lexicale separate prin spaii: cuvinte cheie cu rol bine determinat n cadrul limbajului i care nu pot fi folosite n alt context. Exemplu for pentru instruciunea repetitiv cu contor; identificatori se folosesc pentru a denumi variabilele, funciile, etc. Se formeaz cu ajutorul literelor mari i mici, caracterul _ i cifrele de la 0 la 9. Un identificator trebuie s nceap cu o liter. Limbajul C face diferenierea dintre caracterele mari i mici. De exemplu, putem avea dou variabile cu numele Suma, respectiv suma; constante; operatori.

50

Proiectul pentru nvmntul Rural

Structura programelor n limbajul C. Tipuri de date, operatori i expresii

Test de autoevaluare 3.1


Alegei varianta corect pentru urmtoarele ntrebri. Fiecare ntrebare valoreaz 20 de puncte. Punctaj minim: 80 Adevrat / Fals 1. Urmtoarea linie de program realizeaz tiprirea mesajului amplasat ntre ghilimele: //printf(Acesta este un text\n); 2. Prototipurile funciilor care pot fi apelate n cadrul limbajului se gsesc grupate n fiiere de tip header 3. Pentru fiecare din urmtorii identificatori indicai dac definirea lor este corect (A) sau nu (F): 1) a&b 5) Aa 2) ab_x 6) Barbu 3) 2c3d 7) f1() 4) patru 8) xn 4. Urmtorii identificatori fac referire la aceeai variabi: Ab ab 5. Orice program scris n limbajul C este compus dintr-o serie de entiti numite funcii. Variantele corecte de rspuns se afl la pag. 72.

Proiectul pentru nvmntul Rural

51

Structura programelor n limbajul C. Tipuri de date, operatori i expresii

3. 3 Variabile, tipuri de variabile i declarare


Variabilele reprezint spaii n memoria calculatorului avnd acelai rol n timp, dar care pot conine vaori diferite la momente diferite de timp. n legtur cu ele se ridic urmtoarele ntrebri: ce fel de variabile recunoate programul? cum sunt memorate aceste date n calculator? S revenim la exemplul 3.3. Cifra 7, preluat i afiat de funcia printf(), este o valoare ntreag constant. S rescriem acest program utiliznd o variabil n locul acestei constante Exemplul 3.6 main() { int num; num=7; printf(Acesta este numarul sapte: %d,num); } n urma execuiei programului, la consol va apreaacelai mesaj: Acesta este numarul sapte: 7 dar programul conine cteva elemente noi, i anume: instruciunea int num; prin care este declaratdrept ntreg variabila num; deci num este numele variabilei, iar int este tipul ei (ntreg); instruciunea num=7; are ca rezultat atribuirea valorii 7 variabilei num. Astfel operatorul = este operatorul de atribuire. n aceast situaie, modul de lucru al instruciunii printf() din instruciunea urmtoare este clar: va afia valoarea variabilei num, care este 7. Aciunea de declarare a variabilelor este obligatorie n limbajul C. Declararea const n precizarea tipului variabilei int i a numelui su num. Mai multe variabile de acelai tip pot fi declarate n aceeai linie de program, de exemplu: int num1, num2, num3; Numele unei variabile poate fi format dintr-unul sau mai multe caractere alfanumerice mpreun cu caracterul _, ncepnd cu o liter i avnd cel mult 31 de caractere. Exemple Corect num1 suma_n a1b2 Incorect 1num suma n a#2

Declaraia variabilelor determin compilatorul s le aloce un spaiu corespunztor de memorare. 52

Proiectul pentru nvmntul Rural

Structura programelor n limbajul C. Tipuri de date, operatori i expresii

Limbajul C are cinci tipuri de date fundamentale, i anume: caracter: char ntreg: int real n virgul mobil, simpl precizie: float real n virgul mobil, dubl precizie: double tip de variabil neprecizat sau inexistent: void Modul de memorare a acestor tipuri de date depinde de tipul calculatorului i de varianta de implementare a limbajului C. Modul de implementare al lor poate fi modificat prin utilizarea unor declaraii suplimentare, cum ar fi: signed cu semn unsigned fr semn long lung short scurt Apelnd la o reprezentare uzual a limbajului C pe echipamentele PC, compatibile IBM sub sistemul de operare MS-DOS, tipurile de date definite de standardul ANSI i recunoscute de limbaj au reprezentarea dat n urmtorul tabel: Reprezentare Rang n bii char 8 -128 127 unsigned char 8 0 255 signed char 8 -128 127 int 16 -32768 32767 unsigned int 16 0 65535 signed int 16 -32768 32767 short int 16 -32768 32767 unsigned short int 16 0 65535 signed short int 16 -32768 - 32767 long int 32 -2 147 483 648 2 147 483 647 unsigned long int 32 0 4 294 967 295 signed long int 32 -2 147 483 648 2 147 483 647 float 32 10-17 - 1017 (6 digii precizie) double 64 10-308 - 10308 (10 digii precizie) long double 80 15 digii precizie Tabelul 3.1 Exemple de declaraii de variabile: int i, j, n; short int si; unsigned int ui; double balanta, profit; float time; S considerm un exemplu de program ce utilizeaz mai multe tipuri de variabile. Tip

Proiectul pentru nvmntul Rural

53

Structura programelor n limbajul C. Tipuri de date, operatori i expresii

Exemplul 3.7 main() { int n; float v; char ch; v=2.53; n=65; ch=A; printf(Caracterul %c are codul ASCII %d,ch, n); printf( si o frecventa de aparitie de %f %.,v); } n urma execuiei acestui program se va afia: Caracterul A are codul ASCII 65 si o frecventa de aparitie de 2.530000 %.

Test de autoevaluare 3.2


Rspundei la urmtoarele ntrebri. Fiecare rspuns valoreaz 20 de puncte. Punctaj minim: 80 1. Care din aceste instruciuni scrise n limbajul C sunt corecte? a) int n; c) double float d; b) char c1; d) unsigned char lit; 2. Adevrat sau fals: dou variabile pot fi declarate n aceeai instruciune. 3. Tipul de date float ocup de ........ ori mai mult memorie dect tipul de date char. 4. Tipul de date int poate lua valori de la ................ la.................. 5. Adevrat sau fals: tipul de date long poate lucra cu numere doar de dou ori mai mari dect tipul de date int. Variantele corecte de rspuns se afl la pag. 72.

54

Proiectul pentru nvmntul Rural

Structura programelor n limbajul C. Tipuri de date, operatori i expresii

3.4 Constante
Exist mai multe tipuri de constante, dintre care acum se vor prezenta numai cele corespunztoare tipurilor predefinite. Constante ntregi Aceste constante se clasific astfel: zecimale n baza 10. Exemple: 23, 2314, 759. octale n baza 8. O constant n baza 8 se declar precedat de un 0 nesemnificativ. Exemplu:0523 se reine numrul ntreg 523(8). hexazecimale n baza 16. Acestea sunt precedate de 0X sau 0x. Exemplu: pentru 0X1A2 se memoreaz 1A2(16), iar pentru 0x1a2 se va memora 1a2(16). O constant ntreag poate lua valori ntre 0 i 4 294 967 295. Atenie! O constant ntreag este ntotdeauna pozitiv! n cazul n care se folosete semnul - (de exemplu -321) se consider c aceasta este o expresie constant, -fiind un operator unar Memorarea constantelor ntregi se face dup un mecanism implicit, adic fr intervenia programatorului, sau unul explicit. Mecanismul implicit const n alegerea tipului ntreg n funcie de valoare. Astfel, pentru constante ntregi zecimale: pentru valori ntre 0 i 32767 tipul int; pentru valori ntre 32768 i 2 147 483 647 tipul long int; pentru valori ntre 2 147 483 648 i 4 294 967 295 tipul unsigned long int; pentru valori peste 4 294 967 296 se reine o valoare trunchiat. Mecanismul explicit const n a fora ca o anumit constant s fie memorat aa cum o dorim prin adugarea unui sufix. Dac dorim ca o constant s fie memorat n tipul long, ea trebuie urmat de l sau L. De asemenea, dac dorim ca ea s fie de tip unsigned, aceasta trebuie s fie urmat de u sau U. Se pot folosi simultan l i u sau literele mari corespunztoare, indiferent ordinea. De exemplu, 123LU este o constant ce va fi memorat n tipul unsigned long, altfel ea ar fi fost memorat n tipul int. Constante caracter Acestea se reprezint ntre dou caractere apostrof (). Exemple: A, 1, a. Pentru memorarea lor se ytiliyeay[ tipul char, memorndu-sede fapt codul ASCII al caracterului respectiv. De exemplu, pentru 1 se memoreaz valoarea 49, iar pentru A, valoarea 65. Constantele caracter se mai pot declara i sub forma secvenelor escape. O astfel de secven ncepe prin caracterul \ (backslash). De exemplu, caracterul a are codul ASCII 97 10=141 8=61 16. Printr-o secven escape, constanta se introduce prin codul su ntr-una din
Proiectul pentru nvmntul Rural

55

Structura programelor n limbajul C. Tipuri de date, operatori i expresii

bazele 8 sau 16: \141 sau \x61. Se observ c, atunci cnd este folosit baza 16, codul este precedat de caracterul x. Secvenele escape sunt utile pentru definirea caracterelor negrafice, cum ar fi caracterul newline, care are codul ASCII 1010 i care poate fi declarat sub forma \12 sau \xa. Pentru anumite caractere, exist notaii speciale sub form de secven escape. caracterul newline, amintit mai devreme, se poate scrie i \n. Alte exemple utilizate pentru secvenele escape: backslash: \\, \134, \x5c; apostrof: \, \47, \x27; bel: \a, \7, \x7; cr: \r, \15, \xd. Se admit i constante cu dou caractere, ca de exemplu AB. O astfel de constant este memorat utiliznd tipul int, cu observaia c primul caracter este memorat n al doilea octet, iar al doilea caracter n primul octet.. Constante reale Exemple de constante reale: -33.25, 2., 0.3, sau -3.75E-11(=-3.75*10-11). Constantele reale sunt memorate implicit utiliznd tipul double. i n acest caz se poate fora memorarea lor sub tipul float, dac se adaug sufixul f sau F, sau sub tipul long double, dac se adaug sufixul l sau L. 187.5 se memoreaz sub forma double; 187.5f se memoreaz sub forma float; 187.5L se memoreaz sub forma long double. Declararea constantelor Forma general a declarrii unei constante este alctuit din cuvntul const, urmat de tipul constantei (opional) tip, numele dat constantei nume i valoarea atribuit acesteia: const [tip] nume = valoare; Dac tipul constantei tip lipsete, atunci aceasta este implicit de tip int. Iat cteva exemple de declarare a constantelor: const int numar=15; constant ntreag denumit numar cu valoarea 15 const numar=15; la fel ca mai sus const float pi=3.14; constant de tip float, denumit pi i cu valoarea 3.14 Dac, de exemplu, n ultimul exemplu ar lipsi cuvntul const, asta ar nsemna c este o declarare de variabil de tip float, iniializat cu valoarea 3.14. Prezena modificatorului const determin protecia la modificare a variabilei pi. Cu alte cuvinte, pi este o variabil, are spaiu rezervat de memorie, dar reine o valoare ce nu poate fi modificat. Cuvntul cheie const este denumit modificator, pentru c are rolul de a modifica un enun, care iniial avea alt sens. 56
Proiectul pentru nvmntul Rural

Structura programelor n limbajul C. Tipuri de date, operatori i expresii

Atenie! Limbajul C conine o serie de constante predefinite, foarte des utilizate n practic. Ele se gsesc m biblioteca math.h. Printre cele mai importante constante, se gsesc: numrul pi M_PI i derivate ale acestuia: M_PI_2, M_PI_4, M_1_PI, M_2_PI, M_1_SQRTPI, M_2_SQRTPI; numrul lui Euler, notat matematic cu simbolul e M_E; radical de ordinul doi din 2 M_SQRT2. Alte valori constante predefinite se gsesc n biblioteca limits.h, i anume cele care definesc limitele superioare i inferioare pe care le pot lua tipurile de date folosite n C. Iat cteva exemple: INT_MAX, INT_MIN, LONG_MAX, LONG_MIN, SGRT_MAX, SHRT_MIN, UINT_MAX, ULONG_MAX. Constantele iruri de caractere Aceste constante se scriu ntre ghilimele, iar la sfritul irului compilatorul adaug automat terminatorul de ir \0; aadar pentru memorarea unui ir se aloc un spaiu mai mare cu un octet dect lungimea irului. Un exemplu de ir constant: Exemplu de sir. n cadrul acestora se pot folosi secvee escape, precum: Mesaj sonor \a urmat de \n trecerea la o linie noua. Afiarea acestui text ntr-o instruciune de tiprire va avea ca efect producerea unui mic sunet (BELL) corespunztor secvenei escape \a i scrierea textului pe dou rnduri, datorit secvenei escape \n. Tipul enumerare Se folosete pentru a realiza o utilizare comod i sugestiv a valorilor folosite. El declar constante simbolice crora li se asociaz valori numerice ntregi. Declararea unui tip enumerare are sintaxa: enum nume_tip (lista_constante_simbolice); Compilatorul asociaz valoarea implicit zero pentru prima valoare enumerat, n cazul n care nu este specificat o anumit valoare. Pentru urmtoarele elemente din lista constantelor, valoarea lor va fi mrit cu o unitate fa de valoarea din poziia anterioar, dac nu este specificat o alt valoare. Exemplul 3.8 Se va exemplifica folosirea acestui tip enumerare prin mai multe declaraii echivalente: enum culori (rosu, galben, verde); enum culori (rosu, galben=1, verde); enum culori (rosu=0, galben, verde=2); alt valoare.
Proiectul pentru nvmntul Rural

57

Structura programelor n limbajul C. Tipuri de date, operatori i expresii

Exemplul 3.9 Este definit tipul logic ca tip enumerare (Limbajul C nu are implementat acest tip de variabile, spre deosebire de alte limbaje de programare, ca de exemplu limbajul Pascal). enum boolean (false, true); Pentru false se d valoarea zero, iar pentru true se d valoarea unu. Exemplul 3.10 Un alt exemplu de definire a unei enumerri: enum timp (ieri, azi=3, maine=5); n acest caz ieri este iniializat cu valoarea zero, azi cu valoarea 3, iar maine cu valoarea 5. enum timp (ieri, azi=3, maine=azi); Este posibil ca dou constante s fie iniializate cu aceeai valoare (3 n acest caz).

3.5 Funcii aritmetice care opereaz cu valori de tip real i ntreg


Nu exist funcii matematice implicite (n compilatorul C), ci acestea sunt descrise in biblioteci. De exemplu, funciile sqrt() pow() exp() log() log10() sin() cos() calculeaz rdcina ptrat a unui numr i are sintaxa: double sqrt(double x); funcia putere xy (calculeaz x la puterea y) cu sintaxa: double pow(double x, double y); funcia ex cu sintaxa: double exp(double x); funcia logaritm natural ln(x), avnd sintaxa: double log(double x); funcia logaritm n baza 10 lg(x), avnd sintaxa: double log10(double x); funcia trigonometric sinus, cu sintaxa: double sin(double x); funcia trigonometric cosinus, cu sintaxa: double cos(double x);

58

Proiectul pentru nvmntul Rural

Structura programelor n limbajul C. Tipuri de date, operatori i expresii

tan()

funcia trigonometric sinus, cu sintaxa: double tan(double x);

sunt definite in biblioteca <math.h>. Toate aceste funcii, cu excepia lui "pow()" au un argument de tip "double" i returneaz o valoare de tip "double". Functia "pow()" are dou argumente de tip "double" i returneaza o valoare de tip "double".

Exemplul 3.11 S se evalueze, pentru x=3, valoarea funciei:

f ( x ) = x 5 + ln (x )
Pentru rezolvarea acestui exerciiu se vor folosi dou variabile reale x i f; se vor folosi de asemenea dou funcii din cadrul bibliotecii matematice math.h. n figura 3.2 este artat programul scris n mediul BORLANDC FOR WINDOWS, mpreun cu rezultatul afiat.

Figura 3.2

Proiectul pentru nvmntul Rural

59

Structura programelor n limbajul C. Tipuri de date, operatori i expresii

Test de autoevaluare 3.3


Dai rspunsul corect la urmtoarele ntrebri. Fiecare ntrebare valoreaz 20 de puncte. Punctaj minim: 80 1. Care din declaraiile urmtoare sunt corecte? a) const int a=5; d) const float a=d; b) const a=6; e) const int a=1.5; c) const int a; f) const char c=1; 2. Principalele constante matematice predefinite, cum este de exemplu numrul pi, se gsesc n biblioteca de funcii ................... 3. S se reprezinte matematic expresiile scrise n C: a) pow(x,4); c) sin (a+b); b) log10(x); d) sqrt (2*x) + exp(x); 4. S se reprezinte cu ajutorul funciilor matematice definite n C expresiile: sin(5 x 2 ) 3 x2
a2 + b2 + c2

R 2 h
3

5. Adevrat / Fals: pentru variabilele de tip logic, ce pot lua valorile true sau false, limbajul C are definit tipul de variabile boolean.

Variantele corecte de rspuns se afl la pag. 72.

Sarcina de lucru 3.1


Prezint n maxim 500 de cuvinte un eseu despre modul n care presupunei c se vor putea folosi diversele tipuri de variabile i de constante n rezolvarea problemelor de programare. Acest eseu va fi notat cu maxim 20 de puncte. 5 puncte vor fi acordate pentru corectitudinea exprimrii, 10 puncte pentru argumentare i 5 puncte pentru inventivitate.

60

Proiectul pentru nvmntul Rural

Structura programelor n limbajul C. Tipuri de date, operatori i expresii

3.6 Operatori n C
Limbajul C este foarte dotat n materie de operatori, acordnd operatorilor mai mult importan dect majoritatea limbajelor de programare. C definete patruclase de operatori: aritmetici, relaionali, logici i pe bii. n plus, C mai dispune de anumii operatori speciali pentru anumite operaii.

3.6.1 Operatorul de atribuire


n C, operatorul de atribuire poate fi folosit n interiorul oricrei expresii valide n C, ceea ce nu este valabil n majoritatea limbajelor de programare(de exemplu Pascal, BASIC, Fortran). Forma general a unui operator de atribuire este: nume_variabila=expresie unde expresie poate fi ceva la fel de simplu ca o constant sau complicat, conform cerinelor de programare. Destinaia, sau membrul stng al atribuirii trebuie s fie o variabil sau un pointer, nu funcie sau constant. Acesta mai este ntlnit i sub denumirea de lvalue orice obiect care poate fi inserat n partea stng a unei declaraii de atribuire. Din considerente practice, lvalue este asimilat cu variabil. Expresia din partea dreapt a unei atribuiri poart denumirea de rvalue, referindu-se pur i simplu la valoarea unei expresii. Principiul de execuie este urmtorul: se evalueaz expresia; variabilei nume_variabila i se atribuie valoarea obinut, fcnduse conversia necesar, dac este cazul. Atribuirea multipl C permite atribuirea aceleiai valori mai multor variabile, folosind mai multe atribuiri n cadrul aceleiai declaraii. De exemplu, urmtorul fragment de program atribuie lui a, b i c valoarea zero: a=b=c=0; Forma general a unei atribuiri multiple este: v1=v2= . =vn=expresie; unde v1, v2, .,vn sunt variabile (lvalue) care se pot modifica. Exemplul 3.12 S examinm cteva exemple de declaraii i atribuiri simple: char c; int n,k;
Proiectul pentru nvmntul Rural

61

Structura programelor n limbajul C. Tipuri de date, operatori i expresii

float x; c=a; n=3; k=d; x=c+n; Dup prima atribuire caracterul c devine egal cu a. n urma celei de-a doua atribuiri n devine egal cu 3. La a treia atribuire k devine egal cu 100, deoarece expresia din membrul drept d, de tip caracter este convertit la un tip ntreg, avnd valoarea codului ASCII al caracterului respectiv. Dup ultima atribuire x devine egal tot cu 100, deoarece rezultatul adunrii dintre un operand de tip ntreg i unul de tip caracter se convertete n ntreg. Variabila c, iniial egal cu a, convertit n ntreg devine egal cu codul su ASCII, adic 97, care se adun cu 3, valoarea variabilei n. Rezultatul este deci 100. Din acest exemplu se poate observa c limbajul C permite operaii ntre operanzi de tipuri diferite, fcnd conversia tipului mai mic ca dimensiune n tipul corespunztor celeilalte variabile. Exemplul 3.13 Un exemplu de atribuire multipl: int x, y; float z; z=x=y=3; Dup evaluare, y reine valoarea 3, x devine egal cu y, adic tot 3, iar z reine valoarea 3.0, fcndu-se i conversia de la tipul ntreg la cel real.

3.6.2 Operatori aritmetici


Limbajul C dispune de operatorii pentru cele patru operaii aritmetice de baz, operatorul modulo, precum i de operatorii de incrementare i decrementare. Operatorii pot folosi att numere ntregi, ct i numere reale, cu excepia operatorului modulo, care poate lucra numai cu numere ntregi. Se folosesc urmtoarele simboluri: o pentru operatori binari: + adunare - scdere * nmulire / mprire % operaia modulo restul mpririi a 2 numere ntregi. o pentru operatori unari: + plus unar (pstrarea semnului) - unar ++ incrementare -- decrementare. 62
Proiectul pentru nvmntul Rural

Structura programelor n limbajul C. Tipuri de date, operatori i expresii

Exemplul 3.14 Folosirea operatorilor aritmetici: int i, j, n; float x; // n=10*4-7; i=9/2; j=n%i; x=n; x=x%i; n urma primei atribuiri, n devine egal cu 33. La a doua atribuire, i va fi egal cu ctul mpririi ntregi a lui 9 la 2, adic 4. La a treia operaie, j devine egal cu restul mpririi ntregi a lui n la i,adic 1. La ultima operaie de atribuire se obine eroare, deoarece operatorul % este definit doar pentru numere ntregi. Exemplul 3.15 Un exemplu care arat obinerea unor rezultate diferite pentru aceleai calcule, datorit tipului diferit de variabile crora li se atribuie expresia respectiv: int i; float x; i=9./2; x=9./2; Valoarea expresiei din dreapta este n ambele cazuri egal cu 4.5. n cazul primei atribuiri ea este convertit la tipul ntreg, corespunztor variabilei i. Prin urmare, i devine egal cu 4, prin trunchiere. La cea de-a doua atribuire, x primete valoarea 4.5. n concluzie, rezultatul este convertit la tipul variabilei din membrul stng al atribuirii. Exemplul 3.16 n operaiile cu constante conteaz dac ele sunt de tip ntreg sau real: int i; i=3/2+9/2; i=3./2+9./2; Dup prima atribuire, i devine egal cu 5 (3/2=1, 9/2=4, 1+4=5), iar dup cea de+a doua atribuire i devine egal cu 6 (3./2=1.5, 9/2=4.5, 1.5+4.5=6).

Proiectul pentru nvmntul Rural

63

Structura programelor n limbajul C. Tipuri de date, operatori i expresii

n cazul n care o expresie aritmetic are operanzi de mai multe tipuri, regula general este: se convertete unul din operanzi ctre tipul celuilalt, care poate reine rezultatul. Iat paii efectuai n ordine de ctre calculator: I. 1. Orice operand de tip char este convertit ctre tipul int; 2. Orice operand de tip unsigned char este convertit ctre tipul int; 3. Orice operand de tip short este convertit ctre tipul int; II. Dac un operand este de tipul long double, atunci i cellalt operand se convertete ctre acest tip; III. Dac un operand este de tipul double, atunci i cellalt operand se convertete ctre acest tip; IV. Dac un operand este de tipul float, atunci i cellalt operand se convertete ctre acest tip; V. Dac un operand este de tipul unsigned long, atunci i cellalt operand se convertete ctre acest tip; VI. Dac un operand este de tipul long, atunci i cellalt operand se convertete ctre acest tip. Dup execuia acestor pai, cei doi operanzi sunt de acelai tip, iar rezultatul va fi de tipul comun lor. Exemplul 3.17 Fie declaraia: int a=10; Atunci expresia 4*a/3 este de tip int i la evaluare se obine 13 (4*10=40, 40/3=13 mprire ntreag). n aceleai condiii, expresia 4*(a/3) are ca rezultat valoarea 12. Mai nti se calculeaz a/3 , rezultnd valoarea 3; apoi se efectueaz 4*3=12. Acesta este un exemplu din care se poate observa c o expresie n C nu este acelai lucru cu o expresie matematic. Fie declaraia: float a=10; Atunci expresia 4*a/3 este de tip float i la evaluare se obine 13.3333 (4*10=40, numr real 40/3=13.3333 mprire real). Operatori de incrementare i decrementare Limbajul C include doi operatori utili, care n general nu apar n alte limbaje de programare, i anume operatorii de incrementare i de decrementare, ++, respectiv --. Operatorul ++ adaug o unitate la operand, iar scade o unitate din operand. Cu alte cuvinte x=x+1; este echivalent cu iar x=x-1; este echivalent cu x--; Att operatorul de incrementare, ct i cel de decrementare pot precede prefixa sau urma postfixa operandul. De exemplu, x=x+1; poate fi scris ca x++; sau ++x; x++;

64

Proiectul pentru nvmntul Rural

Structura programelor n limbajul C. Tipuri de date, operatori i expresii

Exist totui diferene ntre formele de prefix sau postfix la utilizarea acestor operatori ntr-o expresie. Cnd operatorul de incrementare sau de decrementare i precede operandul, C execut opearia de incrementare sau de decrementare nainte de a folosi operandul respectiv n expresie. Dac operatorul succede operandului, C calculeaz valoarea operandului nainte de a o incrementa sau decrementa. De exemplu, x=10; y=++x; stabilete valoarea lui y la 11. Dac ns codul se scrie astfel: x=10; y=x++; atunci valoarea lui y va fi egal cu 10. Indiferent de procedeu, x va fi egal cu 11; diferena const n modul n care se ajunge la aceast valoare. Majoritatea compilatoarelor de C genereaz coduri obiect foarte rapide i eficiente pentru operaiile de incrementare sau decrementare, coduri mai performante dect cele folosite de o instruciune obinuit de atribuire. Din acest motiv este bine s folosii aceti operatori ori de cte ori avei posibilitatea. Precedena sau ordinea prioritii operatorilor aritmetici este: cel mai prioritar cel mai puin prioritar ++ -- (minus unar) */% +-

Operatorii cu aceeai proritate sunt evaluai de ctre compilator de la stnga la dreapta. Se pot folosi paranteze rotunde pentru a modifica ordinea evalurii. Exemplul 3.18 main() { int n=0; printf(Numar=%d\n, n); printf(Numar=%d\n, n++); printf(Numar=%d\n, n); } n urma executrii acestui program se va afia: Numar=0 Numar=0 Numar=1 aceasta deoarece la prima afiare variabila n are valoarea zero, la a doua afiare n are la nceput aceeai valoare, zero, dup care se face
Proiectul pentru nvmntul Rural

65

Structura programelor n limbajul C. Tipuri de date, operatori i expresii

incrementarea acesteia, n devenind egal cu 1; la ultima afiare va fi tiprit noua valoare a lui n, adic 1. Dac vom scrie acelai program dup cum urmeaz, execuia va fi diferit: main() { int n=0; printf(Numar=%d\n, n); printf(Numar=%d\n, ++n); printf(Numar=%d\n, n); } La executarea acestui program se va afia: Numar=0 Numar=1 Numar=1 Diferena apare la cea de-a doua afiare, cnd se face mai nti incrementarea variabilei n preincrementare urmat de afiarea ei. Operatorul de decrementare (--) lucreaz n mod similar.

3.6.3 Operatori relaionali i logici


n denumirea de operator relaional, cuvntul relaional se refer la relaiile care se pot stabili ntre diverse valori. n denumirea de operator logic, termenul logic se refer la modurile n care se pot lega aceste relaii existente. Deoarece operatorii relaionali i logici sunt adesea folosii mpreun, astfel vor fi prezentai n continuare. Noiunile logice de adevrat sau fals stau la baza conceptelor de operatori relaionalii logici. n C, orice valoare diferit de zero poate fi adevrat. Fals este sinonim cu zero. Expresiile care folosesc operatori relaionali i logici returneaz valoarea zero pentru fals i 1 pentru adevrat. n tabelul 3.2 sunt prezentai operatorii logici, folosindu-se valorile 1 i 0 pentru valorile de adevr ale operatorilor logici. p 0 0 1 1 q 0 1 0 1 p&&q 0 0 0 1 Tabelul 3.2 p||q 0 1 1 1 !p 1 1 0 0

Tabelul 3.3 conine operatorii relaionali i logici, mpreun cu semnificaia lor. 66


Proiectul pentru nvmntul Rural

Structura programelor n limbajul C. Tipuri de date, operatori i expresii

Operatori relaionali Operator > >= < <= == != Aciune Mai mare dect Mai mare sau egal Mai mic Mai mic sau egal Egal Diferit Operatori logici Operator && || ! Aciune I AND SAU OR negare NOT Tabelul 3.3 Att operatorii relaionali, ct i cei logici au o prioritate mai redus dect operatorii aritmetici. O expresie de forma 7>3+5 este evaluat ca i cum ar fi fost scris 7>(3+5); reultatul este Fals, adic zero. ntr-o expresie se pot combina mai multe operaii, ca n exemplul urmtor: 10>5 && !(9<5) || 3<=5 Rezultatul acestei expresii este Adevrat (mai nti se evalueaz paranteza 9<5 fals - , apoi aceasta este negat, rezultnd adevrat; din 5&&1 rezultnd de asemenea 1, adic Adevrat; 3<=5 este tot Adevrat, 1||1este Adevrat; ultima evaluare este 10>1, deci Adevrat). Precedena relativ a operatorilor relaionali i logici este: cel mai prioritar ! > >= < <= == != && ||

cel mai puin prioritar Exemplul 3.19

Toate expresiile relaionale i logice dau un rezultat egal fie cu zero, fie cu 1 (fals sau adevrat). main() { int n; n=100;
Proiectul pentru nvmntul Rural

67

Structura programelor n limbajul C. Tipuri de date, operatori i expresii

printf(%d>10 da rezultatul %d\n, n, n>10); printf(%d==100 da rezultatul %d\n, n, n==100); printf(%d<=10 da rezultatul %d\n, n, n<=10); printf(%d>10 || %d<50 da rezultatul %d\n, n, n>10 || n<50); } n urma executrii acestui program se va afia: 100>10 da rezultatul 1 100==100 da rezultatul 1 100<=10 da rezultatul 0 100>10 || 100<50 da rezultatul 1

3.6.4 Operatori de atribuire compus


Exist o form alternativ a declaraiei de atribuire, cunoscut i sub numele de scurttura C C shorthand, care simplific codificarea unei anumite operaiuni de atribuire, i anume o expresie de forma: var = var operator expresie; poate fi scris astfel: var operator = expresie; De exemplu, x=x+10; x=x-102; poate fi scris poate fi scris x + = 10; x - = 102;

Exist 10 combinaii posibile permise operatorilor de atribuire compus, i anume 5 combinaii cu operatori aritmetici: += -= *= /= %= i 5 combinaii cu operatori pe bii: |= &= ^= <<= >>= Folosirea operatorului de atribuire compus determin o execuie a instruciunii mult mai rapid, deoarece procesorul, cunoscnd c primul operand i rezultatul au aceeai locaie de memorie, folosete un numr mai mic de operaii, avnd nevoie de un timp de execuie mai mic dect atribuirea n cazul general. Exemplul 3.25 a) Folosirea operatorului de aflare a restului mpririi: int i=16, j=5; i%=j; Valoarea variabilei i devine 1. b) Folosirea operatorului de deplasare pe bii: int i=3, j=4; 68
Proiectul pentru nvmntul Rural

Structura programelor n limbajul C. Tipuri de date, operatori i expresii

i<<=j; Valoarea variabilei i devine 48. c) Folosirea operatorului de deplasare la dreapta pe bii i apoi a operatorului aritmetic de adunare: int a=3, b=5,c; a += b >>= c = 2; Valoarea variabilei a se determin astfel: mai nti lui c i se atribuie valoarea 2, dup care b devine 1 (5/2/2); a va primi n final valoarea 4 (3+1).

3.6.5 Operatorul de conversie explicit (cast)


Anumite expresii pot fi forate s fie de un anumit tip, folosind operatorul cast, ce are forma: (tip) expresie unde tip este un tip valid de date recunoscut de C. Este necesar folosirea cast-ului atunci cnd se dorete folosirea unui alt tip de date dect cel implicit. Exemplul 3.26 a) Expresia : float a,n; ...................... a=(int) sqrt(n); determin partea ntreag a lui radical din n. b) dac a,b sunt dou numere ntregi i se dorete obinerea rezultatului netrunchiat al mpririi lor, se poate folosi expresia: (double) a/b;

3.6.7 Operatorul sizeof


Acesta este un operator unar activ la compilare, care calculeaz lungimea n octei a variabilei sau a specificatorului de tip, ncadrat ntre paranteze, pe care l precede. Sintaxa este: sizeof (expresie) Exemplul 3.27 Presupunnd c ntregii au 2 octei i variabilele n virgul mobil au 8
Proiectul pentru nvmntul Rural

69

Structura programelor n limbajul C. Tipuri de date, operatori i expresii

octei, urmtorul program: float f; printf(%d ,sizeof (f)); printf(%d ,sizeof (int)); va afia numerele 8 i 2.

3.6.7 Operatorul virgul (,)


Opreratorul virgul este folosit pentru evaluarea succesiv a mai multor expresii. Partea stng a operatorului virgul este considerat ntotdeauna de tip void, aceasta determinnd ca expresia din partea dreapt s determine valoarea total a ntregii expresii separate prin virgul. De exemplu, x = (y=3, y+1); mai nti atribuie lui y valaorea 3 i apoi lui x valoarea 4. n linii mari, virgula determin o secven de operaii. Cnd este folosit n membrul drept al unei atribuiri, valoarea atribuit reprezint valoarea ultimei expresii a listei separate prin virgul. Exemplul 3.28 Fie declaraiile: int a = 1, b = 5; float c; Expresia: c = a = b+1, a = c+2, b = b+1; se evalueaz astfel: se evalueaz atribuirea multipl, rezultnd pentru a valoarea 6, apoi c devine tot 6 (b+1); a devine 8 (c+2); b primete valoarea 6. Expresia (n ansamblul ei) este de tip int i produce valoarea 6, corespunztoare ultimei atribuiri efectuate.

3.6.8 Operatorul condiional (?)


Limbajul C conine un operator foarte puternic i comod de folosit, care nlocuiete instruciunea corespunztoare structurii alternative if. Operatorul ternar ? are forma general: Exp1 ? Exp2: Exp3; unde Exp1, Exp2 i Exp3 sunt expresii. Principiul de execuie este urmtorul: se evalueaz Exp1; dac rezultatul acestei evaluri este diferit de zero, se evalueaz Exp2, iar Exp3 este ignorat; 70
Proiectul pentru nvmntul Rural

Structura programelor n limbajul C. Tipuri de date, operatori i expresii

altfel se evalueaz Exp3, iar Exp2 este ignorat.

n ansamblu, expresia este de tipul lui Exp2 sau al lui Exp3, n funcie de cea care se evalueaz i produce valoarea corespunztoare expresiei evaluate. Exemplul 3.29 Pentru un numr real x, citit de la tastatur, s se afieze valoarea absolut a acestuia (modulul). #include <stdio.h> void main() { float x; printf(x=); scanf(%f,&x); printf(%f, x>=0? x: -x); } ntreaga expresie condiional a fost scris ca un parametru pentru printf(). Se testeaz dac x este mai mare sau egal cu zero i n cazul n care condiia este ndeplinit, se evalueaz x, a doua expresie; n cazul n care x este negativ, se evalueaz x, a treia expresie; se va tipri valoarea expresiei evaluate. Exemplul 3.30 Fie declaraiile: double x, y, aux; Expresia: x > y ? (aux=x: x=y, y=aux) : y; are ca efect ordonarea variabilelor x i y n ordine cresctoare. Ca rezultat se obine cea mai mare valoare dintre cele dou variabile.

Test de autoevaluare 3.4


Dai rspunsul corect la urmtoarele ntrebri. Fiecare ntrebare valoreaz 20 de puncte. Punctaj minim: 80 1. Care din urmtorii sunt operatori aritmetici? a) + b) & c) % d) < a,c 71

Proiectul pentru nvmntul Rural

Structura programelor n limbajul C. Tipuri de date, operatori i expresii

2. Rescriei instruciunile urmtoare folosind operatorul postdecrementare sau operatorul de atribuire compus: numar=numar+1; poz=poz-1; pas=pas*3; 3. Expresiile urmtoare sunt adevrate sau false? a) 1>2; c) 1= =2; b) a<b; d) 3= =3; 4. Este corect fcut comentariul urmtor? /*Acesta este /*un comentariu care ocup /*mai multe rnduri */ 5. Scopul operatorului condiional este: a) alege dintre dou valori pe cea mai mare; b) decide dac dou valori sunt egale: c) alege alternativ una din dou valori; d) alege una din dou valori n funcie de o condiie

de

preincrementare,

Variantele corecte de rspuns se afl la pag. 72

72

Proiectul pentru nvmntul Rural

Structura programelor n limbajul C. Tipuri de date, operatori i expresii

Rspunsuri corecte la testele de autoevaluare


Testul de autoevaluare 3.1 Rspunsuri corecte: 1F 2A 3 1)F 2) A 3) F 4F 5A Vezi U3.2 Structura programelor n limbajul C pag. 46 Vezi U3.2 Structura programelor n limbajul C pag. 46 5) A 6) A 7) F 8) A Vezi U3.2 Structura programelor n limbajul C pag. 46 Vezi U3.2 Structura programelor n limbajul C pag. 46 Vezi U3.2 Structura programelor n limbajul C pag. 46

4) A

Testul de autoevaluare 3.2 : Rspunsuri corecte: 1 a, b, d Vezi U3.3 Variabile, tipuri de variabile i declarare 2A Vezi U3.3 Variabile, tipuri de variabile i declarare 34 Vezi U3.3 Variabile, tipuri de variabile i declarare 4 -32768, 32767 Vezi U3.3 Variabile, tipuri de variabile i declarare 5F Vezi U3.3 Variabile, tipuri de variabile i declarare Testul de autoevaluare 3.3

pag. 51 pag. 51 pag. 51 pag. 51 pag. 51

1 a, b, d, e; Vezi U3. 4 Constante pag 54 2 math.h Vezi U3. 4 Constante pag 54 x 4 3 x , lg x, sin(a+b), 2 x + e Vezi U 3.5 Funcii aritmetice care opereaz cu valori de tip real i ntreg pag 57 4 sin(5*x*x) , sqrt(a*a+b*b+c*c), pow(3, x-2), M_PI*R*R*h/3 Vezi U 3.5 Funcii aritmetice care opereaz cu valori de tip real i ntreg pag 57 5F Vezi U3. 4 Constante pag 54 Testul de autoevaluare 3.4 1 a, c 2 ++numar; poz--; pas*=3; 3 F, A, F, F 4 Nu 5d Vezi U3.6 Operatori n C pag. 60 Vezi U3.6 Operatori n C pag. 60 Vezi U3.6 Operatori n C pag. 60 Vezi U3.6 Operatori n C pag. 60 Vezi U3.6 Operatori n C pag. 60

BIBLIOGRAFIE
1. Dorin Stoilescu, Manual de C/C++ - Cap.1 Introducere, Cap.2 Tipuri de date, Editura Radial, Galati, 1998. 2. Florin. Munteanu, Traian C. Ionescu, Daniela Saru, Gheorghe Musca, Sergiu Mihai Dascalu, Programarea calculatoarelor - manual pentru liceele de informatic Cap.17 Structura programelor n limbajul C. Tipuri de date, operatori i expresii, Editura Didactic i Pedagogic, Bucureti, 1995.

Proiectul pentru nvmntul Rural

73

Structura programelor n limbajul C. Tipuri de date, operatori i expresii

3. Valeriu Iorga si colectiv, Programare in C/C++. Culegere de probleme, Editura Niculescu, Bucureti, 2003. 4. Programe de specialitate elaborate de ctre Ministerul Educaiei i Cercetrii pentru nvmntul preuniversitar 5. Herbert Schildt, C manual complet Cap1 C, vedere de ansamblu, Cap2 Expresii C, Editura Teora, 2000 6. http://www. cs.umd.edu/users/cml/style/ - ghid privind stilul de programare in limbajele C si C++. 7. http://www.programmingtutorials.com tutoriale de programare pentru C, C++ precum si pentru alte limbaje. 8. http://www.snippets.org exemple de programe scrise in limbajul C.

Lucrarea de verificare Nr. 3, notat de tutore


Rspundei la urmtoarele ntrebri. Acestea trebuie s fie scurte(2, 3 rnduri)i clare. Fiecare ntrebare valoreaz 10 puncte. Primii 10 puncte din oficiu. Punctajul maxim al testului este de 100 puncte. 1. Care din urmtoarele declaraii sunt corecte? a) int ab=25; b) int a+b; c) float s1; d) char 1ab; e) int d.p; 2. Care din urmtoarele expresii logice au valoarea 1? a=5; b=3; c=1; d=3; a) (a<b)||c b) ((b==d)&&c) || (a>=b) c) c && (d>b) d) (a>b) || !(d<a) e) (a==b) && c 3. Fie atribuirile, unde x i y sunt variabile reale x=3; y=2; x=x*y+x+y; y=x*x-21; x=sqrt(y); y=y/10; 4. Fie atribuirile, unde x i y sunt variabile reale: x=4; y=5; x+=y; y=sqrt(x); 74 n final, x i y vor avea valorile: a) x=11; y=100; b) x=10; y=10; c) x=10; y=11; d) x=100; y=11; e) x=11; y=10;

x+=y; y=y*2+8; x=y/2; n final, x i y vor avea valorile:


Proiectul pentru nvmntul Rural

Structura programelor n limbajul C. Tipuri de date, operatori i expresii

a) x=12; y=14; b) x=9; y=7; c) x=7; y=14; 5. Care dintre urmtoarele atribuiri sunt corecte? int a, b; float d; char c; a) c=5; b) d=a%b; c) a=d/3; d) a=(d<c); e) d=sqrt(a+b);

d) e)

x=30; y=60; x=14; y=28;

6. Care dintre expresiile urmtoare sunt incorecte, tiind c operanzii care intervin sunt de tip ntreg? a) (a!=b) && (c<b) b) a+-3+b c) a-a/b (a-3) d) ! (a<b) e) b+%a 7. Care din urmtoarele afirmaii sunt adevrate? a) Un algoritm se execut de un numr finit de ori pentru orice set de date de intrare. b) Un algoritm prelucreaz numai datele de intrare, fr obinerea unor date intermediare. c) La analiza enunului unei probleme sunt identificate datele de intrare i cele de ieire. 8. tiind c x este o variabil folosit pentru citirea mai multor numere ntregi, cum va fi declarat aceasta? a) integer x; b) x=int; c) int x; d) char x; 9. tiind c variabila n va fi utilizat ntr-un program pentru a reine un numr ntreg cu maxim 10 cifre, care va fi varianta corect pentru declararea sa? a) int n; b) unsigned long n; c) unsigned n; d) long n;

Proiectul pentru nvmntul Rural

75

Citirea i scrierea datelor

Unitatea de nvare Nr. 4 CITIREA I SCRIEREA DATELOR


Cuprins Pagina

Obiectivele Unitii de nvare 4 ....................................................................................76 4.1 Noiuni introductive ...................................................................................................76 4.2 Funcia de scriere cu format .....................................................................................77 4.3 Funcia de citire cu format ........................................................................................81 Rspunsuri corecte la testele de autoevaluare, sarcinile de lucru i exerciii ..........86 Bibliografie .......................................................................................................................87 Lucrarea de verificare Nr. 4, notat de tutore............................................................... 87

Obiectivele Unitii de nvare 4


Dup parcurgerea acestei uniti de nvare vei fi capabili s:

Identificai diferitele tipuri de formate ale variabilelor n operaiile de citire/scriere Comparai diversele metode de citire/scriere Efectuai operaii de citire/scriere pentru diverse tipuri de variabile

4.1

Noiuni introductive
S definim, mai nti, o noiune foarte des ntlnit n limbajul C, i anume cea de stream. Stream-ul reprezint un concept abstract ce definete orice flux de date de la o surs la o destinaie. Atunci cnd sursa este memoria intern, iar destinaia este un fiier oarecare, se spune c este un stream de ieire (pe scurt, ieire sau scriere). Atunci cnd sursa este un fiier oarecare, iar destinaia este memoria intern, se spune c este un stream de intrare (pe scurt, intrare sau citire). Un caz aparte de ieire este acela n care datele sunt scrise pe monitor, situaie n care fiierul poart o denumire standard: stdout, dup cum un caz aparte de intrare este acela n care datele se preiau de la tastatur fiier standard numit stdin. Cele dou fiiere (stdout i stdin) sunt atribuite automat oricrui program scris n C. De asemenea, ele sunt deschise automat la lansarea n execuie a programului i nchise atunci cnd execuia se termin. Din acest motiv, operaiile de intrare/ieire efectuate cu ajutorul lor poart denumirea de intrri/ieiri standard.

76

Proiectul pentru nvmntul Rural

Citirea i scrierea datelor

Aceste fiiere sunt privite ca fiiere de caractere (fiiere text), de aceea sunt necesare anumite conversii. n memoria intern, datele au o anumit reprezentare (float, int). Pentru a putea fi vizualizate (scrise pe monitor) este necesar conversia lor n iruri de caractere. Invers, la citire se introduc iruri de caractere, iar acestea trebuie convertite ctre tipul sub care se memoreaz. Conversiile se efectueaz sub controlul unor formate specifice. Prototipurile funciilor de citire/scriere standard se gsesc n biblioteca stdio.h (standard input/output).

4.2

Funcia de scriere cu format


Pentru a scrie pe monitor stdout se utilizeaz funcia printf(), care a mai fost utilizat n cteva exemple din capitolul anterior. Forma general a acestei funcii este: int printf (const char *format[, expresie1, expresie2, ]); irul indicat de ctre format conine dou categorii de articole. Prima include caractere care urmeaz a fi afiate pe ecran. Cea de-a doua include comenzi de formatare care definesc modul de afiare a argumentelor. O comand de formatare este alctuit dintr-un simbol procent %, urmat de codul formatului. Comenzile de formatare sunt prezentate n tabelul 4.1. Numrul de comenzi de format trebuie s coincid cu acela al argumentelor, iar comenzile i argumentele se succed n ordine. De exemplu, urmtorul apel al funciei printf(): printf(Azi este %d %s, %d., 5, ianuarie, 2007); afieaz pe ecran Azi este 5 ianuarie, 2007. Cod %c %d %i %e %E %f %g %G %o %s %u %x %X %p %% Format caracter ntreg zecimal cu semn ntreg zecimal cu semn numr real, notaie tiinific (e mic) numr real, notaie tiinific (E mare) numr real, notaie zecimal numr real, cea mai scurt reprezentare dintre %f i %e numr real, cea mai scurt reprezentare dintre %f i %E numr octal, ntreg, fr semn ir de caractere ntreg zecimal fr semn numr hexazecimal, ntreg, fr semn, litere mici numr hexazecimal, ntreg, fr semn, litere mari afieaz un pointer (adres) afieaz simbolul % Tabelul 4.1

n plus se pot folosi urmtoarele prefixe: l cu d, i, u, o, x, X urmeaz s afieze o dat de tip long; cu f, e, E, g urmeaz s afieze o dat de tip double;
Proiectul pentru nvmntul Rural

77

Citirea i scrierea datelor

h cu d, i, u, o, x, X urmeaz s afieze o dat de tip short; L cu f, e, E, g urmeaz s afieze o dat de tip long double; De exemplu, %ld va afia o dat de tip long int, iar %hu va afia o dat de tip short unsignet int. Comenzile de format pot avea modificatori care specific dimensiunea cmpului, precizia, precum i un flag (indicator) pentru alinierea la stnga. Un ntreg plasat ntre simbolul procentului i comanda de format se comport ca un specificator al dimensiunii minime de cmp, care adaug datelor de ieire un numr de cmpuri libere sau zerouri, pentru a asigura lungimea minim. Dac irul sau numrul afiat este mai mare dect lungimea minim, atunci va fi afiat integral. Bordarea prestabilit se execut cu spaii. Pentru valori numerice, dac se dorete bordarea cu zerouri, se insereaz un zero naintea specificatorului dimensiunii de cmp. De exemplu, cmanda %05d nseamn zerouri naintea unui numr cu mai puin de cinci cifre. Exemplul 4.1 n urma executrii urmtorului program: main() { int num; num=12345; printf(%d\n, num); printf(%3d\n, num); printf(%10d\n, num); printf(%03d\n, num); printf(%010d\n, num); } vor rezulta urmtoarele modaliti de scriere a valorii numerelor: 1 2 3 4 5 1 2 3 4 5 1 2 3 4 5 1 2 3 4 5 0 0 0 0 0 1 2 3 4 5 Efectul modificatorului de precizie depinde de tipul comenzii de format pe care o determin. Pentru a insera un modificator de precizie se adaug un punct zecimal, urmat de precizia dorit, dup specificatorul dimensiunii de cmp. Pentru formatele e, E i f modificatorul de precizie determin numrul de cifre dup virgul. De exemplu, comanda %10.4f afieaz un numr de cel mult 10 cifre, cu 4 cifre dup virgul. Cnd este folosit specificatorul g sau G, precizia determin numrul maxim de cifre semnificative afiate. 78

Proiectul pentru nvmntul Rural

Citirea i scrierea datelor

Cnd modificatorul de precizie se aplic numerelor ntregi, acesta indic numrul minim de cifre ce vor fi afiate. Cnd modificatorul de precizie se aplic irurilor de caractere, numrul care urmeaz dup punct indic lungimea maxim a cmpului. De exemplu, comanda %5.7s afieaz un ir care are minimum cinci caractere lungime, dar nu mai mult de apte. Dac irul este mai lung dect lungimea maxim, caracterele din final sunt omise. Exemplul 4.2 main() { printf(%.4f\n,12.1234567); printf(%3.8d\n, 1000); printf(%10.8d\n,1000); printf(%10.15s\n, Acesta este un text); printf(%10.15s\n, PROGRAM); printf(%3.1d\n,1000); } n urma execuiei acestui program, se va afia: 1 2 3 . 1 2 3 5 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 A c e s t a e s t e u n P R O G R A M 1 0 0 0 Toate datele de ieire, n mod implicit, sunt aliniate la dreapta, adic, dac limea cmpului este mai mare dect datele afiate, datele se plaseaz lng marginea din dreapta a cmpului. Se poate fora alinierea la stnga a informaiei prin plasarea unui semn - imediat dup simbolul procentului. De exemplu, comanda %-10.2f aliniaz la stnga, ntr-un cmp de 10 caractere, un numr n virgul mobil cu dou cifre dup virgul. Exemplul 4.3 Acest exemplu scoate n eviden diversele faciliti oferite de funcia printf() referitoare la diversele formate ale afirii. main() { float val; val=10.12304; printf(%8.1f%8.1f\n, 12.3,525.7); printf(%-8.1f%-8.1f\n, 12.3,525.7); printf(%f\n, val); printf(%5.2f\n, val);
Proiectul pentru nvmntul Rural

79

Citirea i scrierea datelor

printf(%10f\n, val); printf(%012f\n, val); printf(%-10f\n, val); printf(%-012f\n, val); } n urma executrii acestui program, rezultatele vor fi afiate astfel: 1 2 1 2 . 5 1 0 . 1 2 3 1 0 . 1 2 1 0 . 1 2 0 0 0 1 0 . 1 0 . 1 2 3 1 0 . 1 2 3 . 5 5 2 5 0 4 0 3 1 0 0 0 2 4 4 5 2 5 . 7 . 7

4 0 3 0 4 0 0 0 0 0 0

Testul de autoevaluare 4.1


Alegei varianta corect pentru urmtoarele ntrebri. Fiecare ntrebare valoreaz 20 de puncte. Punctaj minim: 80 Adevrat / Fals Fie declaraia i iniializarea: int a; a=-12; 1. Instruciunea printf(a=%10.7d\n,a); tiprete a=bb-0000012 (prin b am notat spaiul). 2. Instruciunea printf(a=%10.7i\n,a); nu are acelai efect cu instruciunea de la ntrebarea 1. 3. Instruciunea printf(a=%x\n,a); tiprete valoarea lui a reprezentat n baza opt. 4. Instruciunea printf(a=%3.7i\n,a); tiprete a=-0000012 5. Instruciunea printf(a=%o\n,a); tiprete a=fff4

Variantele corecte de rspuns se afl la pag. 85.

80

Proiectul pentru nvmntul Rural

Citirea i scrierea datelor

4.3

Funcia de citire cu format


Funcia de citire cu format este funcia scanf(). Ea are sintaxa: int scanf (const char *format [, adresa_var1,adresa_var2,]); i realizeaz urmtoarele: citete o secven de cmpuri de intrare, caracter cu caracter, pn la terminarea introducerii cmpurilor i apsarea tastei Enter; formateaz fiecare cmp conform formatului specificat de argumentul char *format , iar din caracterele citite se calculeaz valori numerice sau literale, conform tipului fiecrei variabile; valorile astfel construite sunt stocate la adresele variabilelor specificate ca argumente. Ordinea formatelor variabilelor trebuie s fie aceeai cu cea din lista adreselor variabilelor n care se face citirea. Argumentele folosite sunt: format constant de tip ir de caractere specificnd formatul n care vor fi citite caracterele de la intrare; lista adreselor variabilelor este format din adresele variabilelor, separate prin spaii. Fiecare variabil trebuie corelat cu un format specific. Indiferent de formatul folosit, la ntlnirea unui spaiu n introducerea datelor este terminat citirea variabilei. Atenie! Citirea, cu ajutorul funciei scanf(), a irurilor de caractere care conin spaii este imposibil. Atenie! n cazul n care formatul specificat este necorespunztor, rezultatul obinut este neprevzut; nu este semnalat nici un fel de eroare n acest caz. Exemplul 4.4 main() { float ani, zile; printf(Scrieti varsta in ani: ); scanf(%f,&ani); zile=ani*365; printf(Aveti varste de %.1f zile.,zile); } n urma interaciunii programului cu operatorul, la consol ar putea aprea urmtoarele: Scrieti varsta inani: 42.5 Aveti varste de 15512.5 zile. Numrul 42.5 este introdus de ctre operator de la tastatur dup apariia la consol a mesajului Scrieti varsta inani: 81

Proiectul pentru nvmntul Rural

Citirea i scrierea datelor

n acest program, pe lng funcia scanf(), mai apar dou alte elemente noi: - operatorul de multiplicare (*) - operatorul adres (&). Pentru moment trebuie reinut faptul foarte important c funcia scanf() cere utilizarea simbolului adres - & - naintea numelui fiecrei variabile. Specificare formatelor pentru funcia scanf() este similar, cu mici excepii, cu cea pentru funcia printf(); de exemplu, nu sunt acceptate formatele %i i %g. Funcia scanf() poate accepta, n acelai timp, mai multe intrri de date de tipuri diferite. Exemplul 4.5 main() { int ev; float timp; char poz; printf(Introduceti poz, ev,timp: ) scanf(%c %d %f, &poz, &ev, &timp); printf(Evenimentul %c are numarul %d,poz,ev); printf( si a avut loc la %f timp.,timp); } Valori i spaii introduse de utilizator

12.30

scanf(%c %d %f,&poz, &ev, &timp);

poz ev

timp

12.30

Figura 4.1

82

Proiectul pentru nvmntul Rural

Citirea i scrierea datelor

n urma execuiei acestui program se va putea afia, n funcie de valorile introduse: Introduceti poz, ev,timp: M 5 12.30 Evenimentul M are numarul 5 si a avut loc la 12.30. Variabilele poz, ev, timp au fost introduse de la consol. Separarea lor corect la introducere se poate face numai prin spaiu (blank), return sau tab, orice alt separator (linie, virgul) nerealiznd aceast separare. Se pot introduce datele i separate prin (;) dac n funcia scanf() se specific aceasta n mod expres (ntre simbolurile de formate se va pune (;)). n figura 4.1 se explic cum lucreaz funcia scanf(). Specificatorul de format precizeaz modul n care se interpreteaz datele de intrare i are forma general: %[*] [latime] [h | l | L] tip_conversie Caracterul % marcheaz nceputul unui specificator de format; Caracterul * are rolul de a determina citirea cmpului de intrare cu specificatorul de format din care face parte, fr ca aceast valoare s fie memorat; cmpul citit astfel nu este numratn cadrul valorii ntoarse de funcia scanf() latime precizeaz numrul maxim de octei din cmpul de intrare care vor fi citii; tip_conversie indic natura conversiei. Principiul de execuie a funciei scanf() Se analizeaz cele dou iruri de caractere, i anume irul transmis ca parametru funciei i irul de caractere pe care l tastm. Pentru fiecare din ele ne imaginm o sgeat (pointer) care indic unul din caracterele irului. Iniial, pentru fiecare din iruri, sgeata indicprimul caracter. n cadrul irului parametru, un caracter poate fi: I. un caracter oarecare, care nu este alb i nu este %; II. caracterul este alb; III. caracterul este %. I Se testeaz existena n irul de intrare a caracterului respectiv (de exemplu, dac caracterul este 3, se testeaz existena n irul de intrare a acestui caracter -3-). Exist dou posibiliti: n irul de intrare este gsit acest caracter, caz n care pointerul sgeata avanseaz n ambele iruri cu cte un caracter; nu este gsit acest caracter n irul de intrare, caz n care citirea este ntrerupt, iar funcia returneaz numrul de cmpuri citite i convertite pn n acel moment. II Pointerul indic n irul parametru un caracter alb. Se analizeaz caracterul indicat n irul de intrare, existnd de asemenea dou posibiliti:

Proiectul pentru nvmntul Rural

83

Citirea i scrierea datelor

este caracter alb; atunci se sare peste acesta i peste eventualele caractere albe care urmeaz; n irul parametru pointerul va indica primul caracter care nu este alb, iar n cel de intrare la fel; caracterul indicat de pointer n irul de intrare nu este alb; pointerul din irul de intrare rmne nemodificat, iar cel din irul parametru va avansa pn la primul caracter care nu este alb. III Pointerul indic caracterul %; n acest caz se testeaz dac secvena urmtoare ndeplinete condiiile de sintax ale unui specificator de format, iar n caz c acestea nu sunt ndeplinite, caracterul % este tratat ca unul oarecare. Altfel, se procedeaz n mod diferit n funcie de ce avem de citit: avem de citit un caracter c ; se citete caracterul respectiv i se memoreaz codul su, indiferent dac este alb sau nu. n irul parametru pointerul va indica primul caracter care nu corespunde specificatorului de format, iar n cel de intrare, caracterul urmtor; avem de citit o valoare numeric (ntreag sau real). Dac pointerul indic n irul de intrare un caracter alb, acesta este srit, ca i urmtoarele caractere albe, pn cnd este ntlnit un caracter diferit de caracterul alb. Se citete din irul de intrare, caracter cu caracter, pn cnd este ndeplinit una din condiiile: o se ntlnete un caracter care nu poate fi convertit ctre tipul respectiv (alb, o liter, etc.); o au fost citite un numr de caractere egal cu cel precizat de lime. n continuare se convertete irul citit ctre o variabil a crei adres a fost indicat. Dup citire, n irul parametru, pointerul va idica primul caracter care urmeaz specificatorului de format, iar n cel de intrare primul caracter nu a fost convertit. Punctul care indic prezena zecimalelor este un caracter care se numr. Citirea se ntrerupe dac nu a fost citit i convertit nici un caracter. Exemplul 4.6 Fie declaraiile : int a,b; Atunci: scanf(%d, &a); citete variabila a; scanf(%1d, &a); citete prima cifr a numrului tastat; variabila a va reine valoarea 3 dac a fost tastat 357; scanf(%1d %*1d %1d, &a, &b); citete prima i a treia cifr a numrului tastat; variabila a va reine valoarea 3, iar b valoarea 7 dac a fost tastat 357, cifra 5 este citit, dar nu este memorat; Exemplul 4.7 Fie declaraiile : char a,b; scanf(%c, &a); 84 Atunci: citete variabila a;
Proiectul pentru nvmntul Rural

Citirea i scrierea datelor

scanf (%c %c,&a, &b); dac s-a tastat ebbbt unde b reprezint un blank atunci a va reine caracterul e, iar b caracterul t, deoarece cele dou formate de citire au fost separate prin spaiu; scanf (%c%c,&a, &b); dac s-a tastat ebbbt unde b reprezint un blank atunci a va reine caracterul e, iar b caracterul b, blank, deoarece cele dou formate de citire nu au fost separate prin spaiu; scanf (2%c,&a); dac s-a tastat 23, atunci a va reine caracterul 3, deoarece 2 este caracterul ateptat; dac s-a tastat 32, atunci a nu se citete, deoarece 2 este caracterul ateptat, nu 3.

Testul de autoevaluare 4.2


Dai rspunsul corect la urmtoarele ntrebri. Fiecare ntrebare valoreaz 20 de puncte. Punctaj minim: 80 1. Fie declaraia: int n; long double x; char s[100]; Care din secvenele urmtoare sunt corecte pentru citirea variabilelor? a) scanf(%i %s %lg, &n, &s, &x); b) scanf(%d %s %Lg, &n, &s, &x); c) scanf(%d %s %Lg, &n, s, &x); d) scanf(%d %c %lf, &n, &s, &x); e) scanf(%d % , &n, &s, &x); 2. S se citeasc i tipreasc cte o variabil din fiecare tip cunoscut..

3. Fie declaraiile: char a,b; int c; float d; Se consider instruciunea: scanf( %c%3d%c 12 %f, &a, &c, &b, &d); Ce valori vor reine variabilele a, b, c, d dac se citete: bbabb123412-41.7 a123b412-41.7

4. Fie declaraia caractere? a. b. c. d. e. f.

char s[20]; Care din declaraiile urmtoare citesc corect un ir de scanf(%c,s); scanf(%c,&s); scanf(%s,s); scanf(%s,&s); scanf(%,s); scanf(,s); 85

Proiectul pentru nvmntul Rural

Citirea i scrierea datelor

5. Fie declaraia: int a, b, c; Ce se ntmpl dac folosind pentru citire apelul: scanf(%2d%3d%4d, &a, &b, &c); se va introduce secvena de intrare 123456? Care va fi valoarea variabilelor dup aceast introducere?

Variantele corecte de rspuns se afl la pag. 85. n Laboratorul 3 din Anexe vei descoperi i alte modaliti de citire a datelor, specifice anumitor tipuri de variabile sau mediului de programare C++.

Rspunsuri corecte la testele de autoevaluare


Testul de autoevaluare 4.1 Rspunsuri corecte: 1A Vezi U4.2 Funcia de scriere cu format pag. 77 2F Vezi U4.2 Funcia de scriere cu format pag. 77 3F Vezi U4.2 Funcia de scriere cu format pag. 77 4A Vezi U4.2 Funcia de scriere cu format pag. 77 5F Vezi U4.2 Funcia de scriere cu format pag. 77 Testul de autoevaluare 4.2 : Rspunsuri corecte: 1 b i c Vezi U4. 3 Funcia de citire cu format pag. 81 2 Vezi U4. 3 Funcia de scriere cu format pag. 81 3. Fie declaraiile: char a,b; int c; float d; Se consider instruciunea: scanf( %c%3d%c 12 %f, &a, &c, &b, &d); Ce valori vor reine variabilele a, b, c, d dac se citete: bbabb123412-41.7 a123b412-41.7 Primul caracter din irul parametru este blank, deci alb. n irul de intrare pointerul marcheaz un un blank, deci, n irul parametru pointerul va marca caracterul %, iar n cel de intrare caracterul a. Dup caracterul % urmeaz caracterul c, deci va fi citit un caracter, i anume a, ce va fi atribuit variabilei cu acelai nume. n irul parametru, pointerul marcheaz caracterul % , iar n cel de intrare pointerul marcheaz b blank. Se analizeaz dac exist un specificator de format, condiie ndeplinit - %3d condiie care solicit citirea unui ntreg de maxim 3 cifre. n irul de intrare se trece peste caracterele albe, pointerul marcnd caracterul 1. Se citeasc i urmtoarele 2 caractere: 2 i 3, deci variabilei c i se va atribui valoarea 123. n irul parametru, pointerul indic caracterul %, iar n cel de intrare, caracterul 4.. Dup % urmeaz un specificator de format - %c deci variabila b va reine codul caracterului 4. n irul parametru, pointerul trece peste caracterul alb, ajungnd la caracterele 1, apoi 2. Se compar aceste caractere cu cele din irul de intrare, care sunt de asemenea 1 i apoi 2. Citirea continu; n irul parametru se trece peste blank i se ajunge la un nou specificator de format - %f iar n irul de intrare se gsesc caracterele 4 1 . i 7, deci rezultatul va fi convertit ctre numrul real -41.7, ce va fi reinut de variabila d. Citirea se ncheie, fiind citite corect 4 valori

86

Proiectul pentru nvmntul Rural

Citirea i scrierea datelor

n cel de-al doilea caz vor rezulta valorile: a=a c=123 b= (blank) d nu mai este citit de ce? 4. c i d Vezi U4. 3 Funcia de scriere cu format pag. 39 5. scanf(%2d%3d%4d, &a, &b, &c); a=12 b=345 c=6 Testul de autoevaluare 4.3 1. 2. 3. 4. 5. F b d iostream.h 9, respectiv 5 Vezi Laboratorul 3 Vezi Laboratorul 3 Vezi Laboratorul 3 Vezi Laboratorul 3 Programul determin valoarea maxim dintre cele trei numere citite.

BIBLIOGRAFIE
1. Dorin Stoilescu, Manual de C/C++ - Cap.3 Intrri/Ieiri standard, Editura Radial, Galati, 1998. 2. Florin. Munteanu, Traian C. Ionescu, Daniela Saru, Gheorghe Musca, Sergiu Mihai Dascalu, Programarea calculatoarelor - manual pentru liceele de informatic Cap.17 Structura programelor n limbajul C. Tipuri de date, operatori i expresii, Editura Didactic i Pedagogic, Bucureti, 1995. 3. Valeriu Iorga si colectiv, Programare in C/C++. Culegere de probleme, Editura Niculescu, Bucureti, 2003. 4. Programe de specialitate elaborate de ctre Ministerul Educaiei i Cercetrii pentru nvmntul preuniversitar 5. Herbert Schildt, C manual complet Cap.8 Operaii de intrare/ieire pentru consol, Editura Teora, 2000 6. http://www. cs.umd.edu/users/cml/style/ - ghid privind stilul de programare in limbajele C si C++. 7. http://www.programmingtutorials.com tutoriale de programare pentru C, C++ precum si pentru alte limbaje. 8. http://www.snippets.org exemple de programe scrise in limbajul C.

Lucrarea de verificare Nr. 4, notat de tutore


Rspundei la urmtoarele ntrebri. Acestea trebuie s fie scurte i clare. Fiecare ntrebare valoreaz 10 puncte. Primii 20 puncte din oficiu. Punctajul maxim al testului este de 100 puncte. 1. Care este singura funcie care trebuie s fie coninut de toate programele scrise n C/C++?
Proiectul pentru nvmntul Rural

87

Citirea i scrierea datelor

a. start() b. system() c. main() d. program() 2. Ce semn de punctuaie este folosit pentru a semnaliza nceputul i sfritul unei secvene de program? a. { } b. -> and <c. BEGIN and END d. ( and ) 3. Care este semnul de punctuaie cu care se termin cele mai multe linii de program C/C++? a. . b. ; c. : d. ' 4. Care din urmtoarele rnduri reprezint un comentariu corect? a. */ Comentariu */ b. ** Comentariu ** c. /* Comentariu */ d. { Comentariu } 5. Care cuvnt din urmtoarele nu reprezint un tip corect de variabile? a. float b. real c. int d. double 6. Care din urmtoarele reprezint varianta corect a operatorului de comparare a egalitii a dou variabile? a. := b. = c. equal d. == 7. Scriei un program care s citeasc de la tastatur valoarea temperaturii de afar (un numr ntreg) i s afieze mesajul Este frig! dac este o temperatur negativ, Este placut azi afar dac temperatura este mai mic dect 20o C, respectiv Este o zi torida! dac temperatura depete ultima valoare. Se va folosi operatorul condiional. 8. Scriei un program care calculeaz i afieaz retribuia unui salariat n funcie de grupa de vechime n care se afl. Exist 3 grupe de vechime (1, 2, i 3). Retribuia se calculeaz cu relaia: retribuie=salariu +spor Sporul depinde de grupa de vechime i este egal respectiv cu 150, 250, 350. Grupa de vechime i salariul se introduc de la tastatur. Programul va folosi operatorul condiional.

88

Proiectul pentru nvmntul Rural

Instruciunile Limbajului C / C++

Unitatea de nvare nr. 5


INSTRUCIUNILE LIMBAJULUI C / C++

Cuprins

Pagina

Obiectivele Unitii de nvare 5 .................................................................................. 89 5.1 Instruciunea expresie............................................................................................... 89 5.2 Instruciunea compus ............................................................................................. 90 5.3 Instruciunea if.......................................................................................................... 90 5.4 Instruciunea switch .................................................................................................. 93 5.5 Instruciunea break.................................................................................................... 94 5.6 Instruciunea while .................................................................................................... 94 5.7 Instruciunea do-while............................................................................................... 95 5.8 Instruciunea for ........................................................................................................ 97 Rspunsuri corecte la testele de autoevaluare, sarcinile de lucru ........................... 100 Bibliografie..................................................................................................................... 100 Lucrarea de verificare nr.5, notat de tutore............................................................... 101

Obiectivele Unitii de nvare 5


Dup studiul acestei uniti de nvare, vei reui Identificarea formelor generale ale instruciunilor limbajului C / C ++ Cunoaterea efectului instruciunilor limbajului Utilizarea adecvat n aplicaii a instruciunilor limbajului Implementarea algoritmilor n mediul de programare C/C++, cu ajutorul instruciunilor limbajului

5.1

Instruciunea expresie
Forma general: expresie; Efect: Se evalueaz expresia. Exemplul 5.1 i++; // se incrementeaz postfixat valoarea variabilei i a*=10; // se multiplic cu 10 valoarea variabilei a getchar(); // se citete un caracter

Proiectul pentru nvmntul Rural

89

Instruciunile Limbajului C / C++

Observaii: expresie poate fi vid. Instruciunea devine instruciunea vid ; orice instruciune n C / C++ se termin cu ; este permis folosirea oricrei expresii sintactic corecte, chiar i atunci cnd instruciunea nu genereaz nici un efect. Exemplul 5.2 3*( 7-4);

5.2

Instruciunea compus
Forma general: { declaraii instruciune1; instruciune2; ... instruciune n; } Efect: Se execut n ordine instruciunile specificate. Observaii: Utilizarea instruciunilor compuse este necesar atunci cnd sintaxa permite executara unei instruciuni ( if, for, do-while, while) care efectueaz mai multe operaii. Declaraiile care apar ntr-o instruciune compus sunt locale instruciunii. Mai exact, ele sunt valabile numai n corpul instruciunii compuse, din momentul declarrii lor pn la sfritul instruciunii.

5.3

Instruciunea if
Forma general: if ( expresie) instruciune1 else instruciune2 Efect: Se evalueaz expresia Dac valoarea expresiei este diferit de 0, se execut instruciune1, altfel se execut instruciune2.

90

Proiectul pentru nvmntul Rural

Instruciunile Limbajului C / C++

Exemplul 5.3 if (x) cout<<x<< nu este zero ; else cout<<x<<este zero; Observaii: expresie se ncadreaz ntre paranteze rotunde; ramura else poate s lipseasc dac instruciune2 este vid. Exemplul 5.4 S se calculeze maximul dintre a i b, unde a i b sunt dou variabile ntregi. # include <iostream.h> void main() { int a,b, max; cout<< a= cin>>a; cout<< b= cin>>b; max=a; if (max<b) max=b; cout<< maximul este<<max; } Exemplul 5.5 Se citesc a,b,c coeficienii reali ai ecuaiei de gradul II ax2+ bx+c=0. Se cere s se scrie un program care s rezolve ecuaia. Varianta 1: # include <iostream.h> # include <math.h> # include <conio.h> main() { flota a,b,c,d; cout<<a=; cin>>a; cout<<b=; cin>>b; cout<<c=; cin>>c; if (a) { d=b*b-4*a*c; if (d>=0) { cout<<x1=<<(-b+sqrt(d))/(2*a)); cout<<x2=<<(-b-sqrt(d))/(2*a));} else cout <<x1 si x2 nu sunt reale; } else if (b) cout<<x=<<(-c/b); else if(c==0) cout<<infinitate de soluii; else cout<< ecuaia nu are soluii; }
Proiectul pentru nvmntul Rural

91

Instruciunile Limbajului C / C++

Observaii: 1. funcia rdacin ptrat sqrt() are prototipul n math.h; 2. clrscr() are prototipul n conio.h i are funcia de tergere 3. varianta 2 a programului folosete operatorii condiionali ? : O alt variant de rezolvare a acestei probleme este prezentat n laboratorul corespunztor acestui capitol. Test de autoevaluare 5.1

Alege, prin ncercuire, varianta corect de rspuns pentru urmtoarele teste. Rspunsul pentru fiecare cerin valoreaz 25 de puncte. Punctaj minim: 75. 1. Care din urmtoarele secvene de instruciuni atribuie variabilei reale k cea mai mare dintre valorile variabilelor a i b sau valoarea lor comun, dac acestea sunt egale: a) if (a<=b) k=a; else k=b; b) if (a<=b) k=b; else k=a; c) if ( a==b) k=a; else if (b>a) k=b; d) k=a; if (k<b) k=b; 2. Se consider secvena de program: x=1; if ( ! (a<b) || !(a<=c) if (b>=c) cout <<(-x); else if (b<c) cout<<x; Pentru care dintre tripletele de valori ale variabilelor a,b,c se va afia valoarea 1? a) b) c) d) a=3, b=2, c=4 a=2, b=3, c=4 a=4, c=3, c=2 a=2, b=4, c=3

3. Dac a i b sunt variabile de tip int, iar x i z sunt variabile de tip float, stabilii care dintre secvenele de instruciuni sunt corecte: a) b=0; if (a>b) b=a/2; b) a=8; b=10; c) a:=5; b:=5; if (a==b) x=y; 4. Care dintre instruciunile urmtoare sunt incorecte sintactic, tiind c operanzii care intervin sunt de tip ntreg? a) if ( abs(3==3) cout<< ok; b) if ( a%3=b) cout<< zz; c) if ( (b+a)/2) cout<< yy; d) if (!1) cout<<hm; Variantele corecte de rspuns se afl la pag. 99.

92

Proiectul pentru nvmntul Rural

Instruciunile Limbajului C / C++

5.4

Instruciunea switch
Forma general: switch (expresie) { case constanta1: secvena instruciuni1 case constanta2: secvena instruciuni2 ... case constantan: secvena instruciunin default: secvena instruciunin+1 } Efect: Se evalueaz expresie; Se compar succesiv valoarea ei cu valorile expresiilor constante care eticheteaz alternativele case. Dac se ntlnete o alternativ case etichetat cu valoarea expresiei, atunci se execut secvena de instruciuni corespunztoare i toate secvenele de dup aceasta, pn la ntlnirea instruciunii break sau pn la sfritul instruciunii switch. Dac nici una dintre valorile etichetelor alternative case nu coincide cu valoarea expresiei, atunci se execut secvena de instruciuni de pe ramura default. Exemplul 5.6 switch (x) { case *: a*=b; break; case /: a/=b; break; case +: a+=b; break; case -: a-=b; break; default: cout << eroare!; } n funcie de valoarea variabilei char c (*, /, +, -) vom efectua operaia corespunztoare ntre variabilele a i b. Dac variabila c are orice alt valoare, vom da mesajul eroare! Observaii: Expresia se ncadreaz obligatoriu ntre paranteze rotunde. Dac secvena de instruciunin+1 este vid, ramura default poate lipsi. Instruciunea switch este o generalizare a lui if. Spre deosebire de instruciunea if, care permite selectarea unei alternative din maxim dou posibile, switch permite selectarea unei alternative din maximum n+1 posibile.

Proiectul pentru nvmntul Rural

93

Instruciunile Limbajului C / C++

5.5

Instruciunea break
Forma general: break; Efect: Determin ieirea necondiionat din instruciunea switch, while, for sau do-while n care apare.

5.6

Instruciunea while
Forma general: while (expresie) instruciune Efect: 1. se evalueaz expresie; 2. dac valoarea expresiei este 0, se iese din instruciunea while, altfel, dac valoarea este diferit de 0, se execut instruciune i apoi se revine la pasul 1. Exemplul 5.7 S calculm rsturnatul numrului natural n. Ex: rsturnatul lui 821 este 128. 1 2 3 4 Linia 1 2 3 4 2 3 4 2 3 4 2 x=0; // n x obin rsturnatul lui n while (n) { x=x*10+n%10; // adaug ultima cifr din n la x n/=10; // elimin ultima cifr din n } Efect Se iniializeaz x cu 0 Se testeaz dac n este diferit de 0 Se adaug la x ultima cifr a lui n Se elimin ultima cifr din n Se testeaz dac n este diferit de 0 Se adaug la x ultima cifr a lui n Se elimin ultima cifr din n Se testeaz dac n este diferit de 0 Se adaug la x ultima cifr a lui n Se elimin ultima cifr din n Se testeaz dac n este diferit de 0; se iese din while n 821 821 821 82 82 82 8 8 8 0 0 x 0 0 1 1 1 12 12 12 128 128 128

94

Proiectul pentru nvmntul Rural

Instruciunile Limbajului C / C++

Observaii: instruciunea se execut repetat ct timp valoarea expresiei este nenul. Dac expresia are de la nceput valoarea 0, instruciune nu se execut nici macar o dat. Sintaxa permite executarea n while a unei singure instruciuni, prin urmare, atunci cnd este necesar efectuarea mai multor operaii, acestea se grupeaz ntr-o instruciune compus.

Sarcin de lucru 5.1 Scrie un program C/C++ care s calculeze xn, unde n este un numr natural i x un numr real. Barem: declaraii corecte 10 puncte citirea corect a valorilor variabilelor calculul corect al puterii utilizarea corect a instruciunii while afiarea corect a rezultatului din oficiu total Indicaie: x0=1 xn= x * x ** x=x*(x * x ** x) de n ori de n-1 ori 10 puncte 50 puncte 10 puncte 10 puncte 10 puncte 100 puncte

Varianta corect de rspuns se afl la pag. 99.

5.7

Instruciunea do- while


Forma general: do instruciune while (expresie) Efect: 1. se execut instruciune; 2. se evalueaz expresie; 3. dac valoarea expresiei este 0, se iese din instruciunea repetitiv; dac valoarea expresiei este diferit de 0, atunci se revine la pasul 1.

Proiectul pentru nvmntul Rural

95

Instruciunile Limbajului C / C++

Exemplul 5.8 S numrm cifrele numrului natural memorat n variabila n. Ex: n=1663 are k=4 cifre. k=0; // n k obin numrul de cifre do { n/=10; // elimin ultima cifr a lui n k++; // numr cifra } while (n); // repet algoritmul ct timp n are cifre Observaii: instruciunea do-while execut instruciunea specificat cel puin o dat, chiar dac de la nceput valoarea expresiei este 0, deoarece evaluarea expresiei se face dup executarea instruciunii. Sarcina de lucru 5.2 Se consider urmtorul program: #include< iostream.h> void main() { int a,b, nr=0, i; cout<< a=;cin>>a; cout<< b=;cin>>b; i=a; while (i<=b) { if (i%2==0) nr++; i++; cout<<nr=<<nr;} a) Ce va afia pe ecran pentru a=5 i b=8? b) Scrie un program echivalent, care s utilizeze instruciunea do-while. c) Care este efectul acestui program? Barem: a) b) c) total 10 puncte 30 puncte 10 puncte 50 puncte

Variantele corecte de rspuns se afl la pag. 99.

5.8

Instruciunea for
Forma general: for ( expresie iniializare; expresie continuare; expresie reiniializare) instruciune

96

Proiectul pentru nvmntul Rural

Instruciunile Limbajului C / C++

Efect: 1. se evalueaz expresia de iniializare; 2. se evalueaz expresia de continuare; 3. daca valoarea expresiei de continuare este 0, se iese din instruciunea repetitiv for; dac valoarea expresiei de continuare este diferit de 0, atunci se execut instruciune, se evalueaz expresia de reiniializare i se revine la pasul 2. Observaii: instruciunea for este o instruciune repetitiv, ca i while i dowhile; ea poate fi simulat cu ajutorul instruciunii while astfel: expr1; while (expr2) { instruc iune; expr3; }

for( expr1; expr2;expr3) instruc iune

while ( expresie) instruc iune

for ( ; expresie ; ) instruc iune

While (1) instruc iune

for ( ; ; ) instruc iune

Exemplul 5.9 S se calculeze factorialul numrului natural n. n!= 1 2 3 n fact=1; for(i=1;i<=n;i++) fact*=i; pentru n=4 i 1 2 3 4
Proiectul pentru nvmntul Rural

// n fact voi obine produsul

fact 1*1=1 1*2=2 2*3=6 4*6=24 97

Instruciunile Limbajului C / C++

Test de autoevaluare 5.2 Alege, prin ncercuire, varianta corect de rspuns pentru urmtoarele teste. Rspunsul pentru fiecare cerin valoreaz 25 de puncte. Punctaj minim: 75. 1.Ce valoare va avea variabila x dup executarea instruciunilor urmtoare? x=4; while(x<7) x+=2; for(i=1;i<=x;i++) x+=1; a) 4 for. b) 16 c) 10 d) 8 e)9 f) x are o valoare necontrolat datorit instruciunii

2.Ce se obine n urma rulrii secvenei urmtoare: cin>>n; cif=2; for(int i=3;i<=n;i++) // I declarat local in instructiunea for { cif*=i; while(cif%10==0) cif/=10; cif%=10; } cout<<cif; a) calculeaz ultima cifr a lui n! b) calculeaz ultima cifr nenul a lui n! c) Calculeaz n! d) Determin numrul de cifre a lui n! 3.Care va fi valoarea variabilei p dup execuia secvenei: p=1; for(i=1;i<=n;i++) { s=0; for(j=1;j<=i; j++) s+=j; p*=s; } a) 180 b) 18 c) 9

d) 216

e)1

4.Pentru afiarea numerelor naturale 1,2,n , unde n este dat, propun urmtoarele secvene de program: a) for(i=1;i<=n;i++); cout<<i; b) for(i=1;i<=n;i++) cout<<i; Care din afirmaiile de mai jos este adevrat? i) nici una din secvene nu ndeplinete cerina problemei. ii) Ambele secvene ndeplinesc cerina problemei iii) Secvena a) conine erori de sintax 98
Proiectul pentru nvmntul Rural

Instruciunile Limbajului C / C++

iv) v)

Secvena b) ndeplinete cerina problemei Numai secvena a) ndeplinete cerina problemei

Variantele corecte de rspuns se afl la pag. 99.

Exemplul 5.11 irul Fibonacci Fie irul 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, ... . Fie n un numr natural citit de la tastatur. S se scrie un program care afieaz cel de-al n-lea termen din irul lui Fibonacci. Observ c pentru a calcula un termen Fibonacci am nevoie de doi termeni precedeni. Voi folosi variabilele f0, f1, f2; n f0 i f1 voi reine doi termeni consecutivi din ir i n f2 voi calcula termenul urmtor f2=f1+f0. La iteraia i a ciclului for voi calcula al i-lea termen Fibonacci. #include<iostream.h> void main() { int i, n, f0, f1, f2; cin>>n; f0=1; f1=1; //iniializarea primilor doi termeni for ( i=2;i<=n;i++) { f2=f1+f0; // calculez termenul curent f0=f1; /* reiniializez variabilele care definesc doi termeni f1=f2; consecutivi n ir */ } cout<< cel de-al<<n<< termen Fibonacci este<< f2; }

Proiectul pentru nvmntul Rural

99

Instruciunile Limbajului C / C++

Rspunsuri corecte la testele de autoevaluare, sarcinile de lucru


Test de autoevaluare 5.1 Rspunsuri corecte: 1. b), d) 2. b) 3. a), b) 4. b), d) Test de autoevaluare 5.2 1. f) 2. b) 3. b) 4. iii), iv) Vezi U5.3 Instruciunea if

Vezi U5.8 Instruciunea for

Soluiile sarcinilor de lucru 5.1 i 5.2, ca i a problemelor propuse pentru laboratorul corespunztor se gsesc n cadrul laboratorului 4.

Bibliografie
1. Cerchez, Emanuela, Informatic. Culegere de probleme pentru liceu, Editura Polirom, Iai, 2002. 2. Cerchez, Emanuela, erban, Marinel, Programarea n limbajul C-C++ pentru liceu, Cap 2 Instruciunile limbajului C / C++, Editura Polirom, Iai, 2005 3. Cormen, Thomas, Introduction in Algorithms, Cap 1 Fundamente Matematice, The Massachussets Institute of Technology, 1990.

100

Proiectul pentru nvmntul Rural

Instruciunile Limbajului C / C++

Lucrarea de verificare Nr. 5, notat de tutore

Rezolv aplicaiile de mai jos. Barem de notare:

Aplicaia 1 Aplicaia 2 Aplicaia 3 Aplicaia 4 Aplicaia 5

10 puncte 15puncte 15 puncte 15 puncte 5 puncte declaraii corecte 15 puncte 5 puncte cutarea secvenei 13 n numr 5 puncte afiarea rezultatului 5 puncte declaraii corecte 5 puncte verificarea respectrii regulilor de 15 puncte construire a sirului 5 puncte afiarea rezultatului 5 puncte declaraii corecte 15 puncte 5 puncte determinarea divizorilor care sunt primi 5 puncte afiarea rezultatului 100 puncte

Aplicaia 6

Aplicaia 7 Total

Punctaj minim: 70 puncte. 1. Se consider urmtorul algoritm: k=1; while(n<=1000) { n*=2; k++; } cout<<k; Care este cea mai mare valoare posibil pentru variabila n astfel nct algoritmul s afieze valoarea 5? a) 10 b)3 c)6 d)7 e)1 f)12

2. Dac a i b sunt variabile de tip int, stabilete care din urmtoarele structuri repetitive sunt ciclri infinite: c) a=0; b==10; a) a=10; b=0; while((a<=10)&&(b>=0)) do{ { b++;a++;} a--;b++; }while (a!=b); b) a=1; b=5; d) a=0; b=10; while ((a<=10)||(b>=0) while(a+b<=10) {b++;a++;} { a=a+2; b=b-2;}

Proiectul pentru nvmntul Rural

101

Instruciunile Limbajului C / C++

3. Fie programul: #include<iostream.h> void main() { int a,b,u,aux; cin>>a>>b; if(a<b) {aux=a;a=b;b=aux;} u=0; while(a>=b) {u++;a-=b;} cout <<u; } Pentru a=2572 i b=13 programul va afia: a) 11 b)91 c)197 d)13 e)199 4. Alegei varianta corect dac n (natural) este par: unsigned int n; a) if(n>0) if(n%2) cout<<n par; b) if(n>0) if(n/2==0) cout<<n par; c) if(n>0) if(n/2) cout<<n par; d) if(n>0) if(!(n%2)) cout<<n par; 5. Se d un numr natural n. S se scrie un program C/ C++ care s determine dac numrul conine n scrierea lui secvena 13. Ex: numrul 171310 conine secvena 13, iar numrul 171032 nu conine secvena 13.

6. Se citesc de la tastatur numere ntregi pn la introducerea numrului 0. S se verifice printr-un program dac numerele introduse se succed nti cresctor i apoi descresctor ( ) sau nti descresctor i apoi cresctor ( ). Proprietatea trebuie s fie ndeplinit pe ntreaga niruire de numere. Ex: pentru sirul 1, 5, 8, 9,11,21, 15, 13, 10,3, 0 proprietatea este ndeplinit. Nu i pentru irul 3, 5, 6, 11, 10, 8, 13, 15, 0.

7. S se scrie un program care citete de la tastatur un numr natural n i tiprete toi divizorii lui care sunt numere prime. Ex: pentru n=70, se vor tipri 1, 2, 5 i 7.

102

Proiectul pentru nvmntul Rural

Tablouri

Unitatea de nvare Nr. 6


TABLOURI

Cuprins

Pagina

Obiectivele Unitii de nvare 6 ................................................................................ 103 6.1 Tablouri unidimensionale ....................................................................................... 104 6.2 Pointeri ..................................................................................................................... 111 6.3 iruri de caractere .................................................................................................. 115 Rspunsuri corecte la testele de autoevaluare, sarcinile de lucru i exerciii ........ 121 Bibliografie..................................................................................................................... 121 Lucrarea de verificare Nr. 6, notat de tutore ............................................................. 122

Obiectivele Unitii de nvare 6


Dup parcurgerea acestei uniti de nvare vei fi capabili s:

Identificai diferitele tipuri de variabile structurate Comparai operaiile cu pointeri cu celelalte tipuri de operaii Efectuai diverse operaii cu variabile de tip tablou Efectuai diverse operaii cu variabile de tip ir de caractere Alegei tipul de variabil potrivit rezolvrii unei probleme

Tipurile de date descrise anterior sunt tipuri simple. Pe baza acestora se pot construi tipuri derivate: tablouri, structuri i fiiere Un tablou (array) este un ansamblu de variabile de acelai tip la care se face referire folosindu-se un acelai nume. Un anume elemant dintr-un tablou este indicat prin intermediul unui indice (index). n C, toate tablourile sunt alctuite din locaii de memorie nvecinate. Adresa de memorie cea mai mic corespunde primului element, iar adresa cea mai mare corespunde ultimului element. Tablourile pot avea de la una la mai multe dimensiuni. Tabloul cel mai des folosit n C este irul string, care este un tablou de caractere care se ncheie cu un zero. Acest mod de a privi irurile confer limbajului C mai mult putere i eficien fa de alte limbaje. n cadrul limbajului C, tablourile i pointerii sunt legai printr-o relaie strns, abordarea tablourilor necesitnd elemente de adresare, deci referire la pointeri.

Proiectul pentru nvmntul Rural

103

Tablouri

6.1 Tablouri unidimensionale


n C, tablourile unidimensionale sunt alctuite dintr-un grup de elemente de acelai tip (numit tip de baz) i referite printr-un nume comun. Variabilele de tip tablou se definesc astfel:
tip_de_baza nume_var[dimensiune];

unde tip_de_baza reprezint tipul tabloului, adic al fiecrui element inclus n tablou, iar dimensiune definete numrul de elemente coninute n tablou. Un element al tabloului este accesat folosind ca index poziia elementului, astfel tabloul_meu[6] va referi al aptelea element al tabloului tabloul_meu. Atenie! n C, "numerotarea" elementelor tablourilor ncepe cu poziia 0, astfel, dac avem definiia:
int tabloul_meu[100];

primul element al tabloul_meu[99].

tabloului

va

fi

tabloul_meu[0],

iar

ultimul

Tablourile sunt stocate n memorie la locaii consecutive, un tablou ocupnd o zon contigu de memorie, cu primul element al tabloului aflat la adresa mai mica. Atentie! O problem legat de tablouri este c n C nu se face nici o verificare legat de "marginile" tabloului, astfel c se pot accesa greit elemente din afara tabloului. De exemplu, pentru definia:
int tabloul_meu[100];

dac accesm tabloul_meu[105] nu se va semnala nici o eroare, returnndu-se valoarea de la o locaie de memorie aflat la o distan de 5 locaii fa de sfritul tabloului, fapt ce va duce la comportri "bizare" ale programului. Aceeai situae, dar fa de nceputul tabloului, se ntmpl la accesarea tabloul_meu[-5]. Prelucrrile de tablouri se implementeaz de obicei prin structuri repetitive for, deoarece se cunoate aprioric numrul de iteraii. Exemplul 6.1 n urma executrii urmtorului program: main() {int a[20], n, i, min, max; printf(Introduceti dimensiunea tabloului:); 104
Proiectul pentru nvmntul Rural

Tablouri

scanf(%d, &n); for (i=0; i<n; i++) {printf(a[%d]=, i); scanf(%d, &a[i]); } min=max=a[0]; for (i=1; i<n; i++) if (a[i]>max) max=a[i]; else if (a[i]<min) min=a[i]; printf(minim=%d\tmaxim=%d\n, min,max);} se vor determina valorile minime i maxime dintr-un vector (tablou unidimensional) cu n componente. Mai nti este citit valoarea lui n i apoi sunt citite componentele vectorului cu ajutorul unei instruciuni for. Se iniializeaz cele dou variabile min i max, corespunztoare celor dou valori cerute, cu primul element al vectorului, a[0]. n continuare, fiecare element al vectorului a[i] este comparat mai nti cu valoarea maxim curent; dac este mai mare dect aceasta, variabila max i schimb valoarea max=a[i]; - , n caz contrar acesta este comparat cu valoarea minim curent; dac este mai mic dect aceasta, variabila min i schimb valoarea min=a[i]; Exemplul 6.2 Se citete un ir de n numere naturale de la tastatur i un alt numr natural x. Se afl acest numr printre componentele vectorului? n caz afirmativ, de cte ori a fost gsit? S se afieze un mesaj corespunztor fiecrei situaii. main() {unsigned int a[20], n, i, f, x; printf(Introduceti dimensiunea tabloului:); scanf(%ud, &n); for (i=0; i<n; i++) {printf(a[%ud]=, i); scanf(%ud, &a[i]); } printf(x=); scanf(%ud, &x); f=0; for (i=0; i<n; i++) if (a[i]==x) f++; if (f==0) printf(numarul %ud nu se afla in vector\n, x); else printf(numarul %ud se afla in vector, aparand de %ud ori\n, x,f);}
Proiectul pentru nvmntul Rural

105

Tablouri

Iniializarea tablourilor se face prin semnul = dup declaraia tabloului, urmat de o list de valori iniiale, separate prin virgule, care se include ntre acolade. De exemplu: int a[4]={1,2,3,4}; char s[5]={a, b, c, d, \0}; Dac lista de valori iniiale cuprinde mai puine date dect dimensiunea declarat a tabloului, celelalte valori se iniializeaz cu zero. De exemplu, n urma declaraiei: int a[20]={1,-2,3,-4,5}; elementele a[4], a[5], ,a[19], vor conine valoarea zero. n cazul unui tablou iniializat, se poate omite dimensiunea, caz n care ea este calculat implicit de ctre compilator, dup numrul de elemente din lista de iniializare. De exemplu, declaraia: float z[]={1.0, 2.7, -3.3, 4.0, -5.5}; indic faptul c z este un tablou de numere reale, cu 5 elemente, iniializate cu elementele din list. Exemplul 6.3 Un exemplu de aplicaie foarte des ntlnit este urmtoarea: s se ordoneze componentele vectorului n ordine cresctoare. Exist mai muli algoritmi de sortare, dintre care se pot aminti: sortarea prin interschimbare, sortarea prin selecia valorii minime sau maxime, sortarea prin numrare, sortarea prin inserie sau bubble sort. Algoritmul de sortare prin interschimbare este unul din cei mai simpli algoritmi de sortare, dar nu i cel mai eficient. Acesta are la baz urmtoarea metod de sortare: fiecare element din vector a[i], 0<=i<n-1, este comparat cu toate elementele situate n vector dup el, a[j], i<j<n;n cazul n care cele dou elemente nu sunt n ordinea dorit, acestea se vor interschimba. main() {int a[20], n, i, j, aux; .................................... for (i=0; i<n-1; i++) for (j=i+1, j<n; j++) if (a[i]>a[j]) {aux=a[i]; a[i]=a[j]; a[j]=aux; } . } 106
Proiectul pentru nvmntul Rural

Tablouri

Dac vectorul a coninea la nceput elementele: 7, 2, 9, 1, 3, iat civa pai din execuia algoritmului: i=0, j=1 este a[0]>a[1]? da, deci se vor interschimba primele 2 elemente: a devine: 2, 7, 9, 1, 3 i=0, j=2 este a[0]>a[2]? nu, deci nu se ntmpl nimic; i=0, j=3 este a[0]>a[3]? da, deci se vor interschimba elementele a[0] i a[3]: a devine: 1, 7, 9, 2, 3 i=0, j=4 este a[0]>a[4]? nu, deci nu se ntmpl nimic; Se trece la urmtoarea valoare pentru i, deoarece for-ul pentru j s-a terminat: i=1, j=2 este a[1]>a[2]? nu, deci nu se ntmpl nimic; i=1, j=3 este a[1]>a[3]? da, deci se vor interschimba elementele a[1] i a[3]: a devine: 1, 2, 9, 7, 3 .. n final, componentele vectorului vor fi: 1, 2, 3, 7, 9 O metod de sortare mai eficient i foarte des folosit este bubble sort, sau sortarea prin metoda bulelor. Aceast metod presupune parcurgerea vectorului i compararea elementelor alturate (a[i] i a[i+1]); dac ele nu respect ordinea dorit, i vor interschimba valorile. Vectorul va fi parcurs de attea ori, pn cnd va fi sortat, adic nu se va mai efectua nici o interschimbare de valori. n acest scop va fi folosit o variabil de tip ntreg, care s in minte dac s-au mai efectuat interschimbri. Secvena de algoritm corespunztoare este: main() {int a[20], n, i, aux, gata=0; .................................... while (!gata) { gata=1; for (i=0; i<n-1; i++) if (a[i]>a[i+1]) {aux=a[i]; a[i]=a[i+1]; a[i+1]=aux; gata=0; } } . } Dac vectorul a coninea la nceput aceleai elemente: 7, 2, 9, 1, 3, iat civa pai din execuia algoritmului: gata=0, atta timp ct gata este zero:
Proiectul pentru nvmntul Rural

107

Tablouri

gata =1 i=0 este a[0]>a[1]? da, deci se interschimb cele dou valori i gata devine zero; a devine: 2, 7, 9, 1, 3 i=1 este a[1]>a[2]? nu, deci nu se ntmpl nimic; i=2 este a[2]>a[3]? da, deci se interschimb cele dou valori i gata rmne zero; a devine: 2, 7, 1, 9, 3 i=3 este a[3]>a[4]? da, deci se interschimb cele dou valori i gata rmne zero; a devine: 2, 7, 1, 3, 9 Se reia structura while, deoarece gata este zero: gata =1 i=0 este a[0]>a[1]? nu, deci nu se ntmpl nimic; i=1 este a[1]>a[2]? da, deci se interschimb cele dou valori i gata devine zero; a devine: 2, 1, 7, 3, 9 i=2 este a[2]>a[3]? da, deci se interschimb cele dou valori i gata rmne zero; a devine: 2, 1, 3, 7, 9, i=3 este a[3]>a[4]? nu, deci nu se ntmpl nimic; Se reia structura while, deoarece gata este zero: gata =1 i=0 este a[0]>a[1]? da, deci se interschimb cele dou valori i gata devine zero; a devine: 1, 2, 3, 7, 9 i=1 este a[1]>a[2]? nu, deci nu se ntmpl nimic; i=2 este a[2]>a[3]? nu, deci nu se ntmpl nimic; i=3 este a[3]>a[4]? nu, deci nu se ntmpl nimic; Se reia structura while, deoarece gata este zero: gata =1 Se mai parcurge o dat vectorul, dar nu se mai efectueaz nici o intershimbare, cci acesta este ordonat cresctor. Condiia de meninere n structura repetitiv nu mai este ndeplinit i algoritmul se ncheie. Exemplul 6.4 Se consider un vector cu n componente numere ntregi, ordonate cresctor i un numr ntreg x. S se determine dac acest numr se afl printre componentele vectorului, iar n caz afirmativ, poziia sa n vector. Pentru acest exemplu s-ar putea folosi ca metod de rezolvare algoritmul prezentat n cazul exemplului 6.2, dar nu ar fi o metod eficient, deoarece nu se ine cont de faptul c vectorul este deja ordonat cresctor; prin urmare, cnd numrul x este comparat cu un element din vector a[i], se pot lua mai multe decizii; dac numrul x este egal cu a[i], atunci se poate spune c numrul se afl n vector pe poziia i; dac x este mai mic dect a[i], se poate deduce c acesta se poate afla pe poziiile mai mici dect i, respectiv pe poziiile mai mari dect i, n caz contrar. n Laboratorul 5 este prezentat algoritmul cutrii binare, care rspunde cerinelor acestei probleme.

108

Proiectul pentru nvmntul Rural

Tablouri

Testul de autoevaluare 6.1


Scriei algoritmul de rezolvare a urmtoarelor probleme; putei folosi reprezentarea algoritmilor prin scheme logice sau pseudocod. Apoi implementai algoritmul n limbajC/C++ Rezolvarea fiecrei probleme valoreaz 20 de puncte. Punctaj minim: 80 1. Se consider n numere ntregi reinute ntr-un vector v. (1<n<=50). S se determine cel mai mic numr pozitiv din vector i cel mai mare numr negativ coninut de vector. n cazul n care una din valori nu poate fi determinat, s se dea un mesaj corespunztor. Exemplu: n=8; v={4, -7, 9, 8, -3, 2, 10, -5}, atunci min_poz=2, max_neg=-3

2. Se citete un ir de numere ntregi pn la introducerea valorii zero. S se formeze doi vectori: unul cu numerele pare introduse, iar cellalt cu cele impare. S se afieze coninuturile celor doi vectori. Exemplu: numerele introduse sunt: 7, -5, 8, 1, 2, -6, 3, 0 cei doi vectori vor fi: a[0]=8, a[1]=2, a[2]=-6 b[0]=7, b[1]=-5], b[2]=1, b[3]=3

3. Se citete un numr natural de maxim 10 cifre. S se introduc cifrele numrului ntr-un vector. Exemplu: dac n= 725943 atunci v[0]=3, v[1]=4, v[2]=9, v[3]=5, v[4]=5, v[5]=2 i v[6]=7.

4. Pentru vectorul obinut la problema anterioar, s se permute circular la dreapta cu o poziie componentele vectorului, pn cnd acesta revine la forma iniial. Exemplu: v={3, 4, 9, 5, 2, 7} vor rezulta pe rnd: v={7, 3, 4, 9, 5, 2} v={2, 7, 3, 4, 9, 5} v={3, 4, 9, 5, 2, 7}

Proiectul pentru nvmntul Rural

109

Tablouri

5. Se dau n (1<n<=100) numere naturale reinute ntr-un vector. S se ordoneze cresctor componentele pare ale vectorului, cele impare rmnnd pe locul lor. Exemplu: n=8; v={4, 7, 14, 8, 3, 2, 10, 5} dup prelucrare, va deveni: v={2, 7, 4, 8, 3, 10, 14, 5}

Indicaii i rspunsuri la pag. 120

110

Proiectul pentru nvmntul Rural

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