04.06.2013 Views

Structura generală a unui program " C "

Structura generală a unui program " C "

Structura generală a unui program " C "

SHOW MORE
SHOW LESS

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

Curs 4 <strong>Structura</strong> <strong>unui</strong> <strong>program</strong> C; tipuri de date în C<br />

<strong>Structura</strong> <strong>generală</strong> a <strong>unui</strong> <strong>program</strong> " C "<br />

Un <strong>program</strong> C este un ansamblu de instrucţiuni incluse în una sau mai multe funcţii, care<br />

specifică operaţiile ce trebuie efectuate asupra unor date pentru a fi prelucrate în sensul dorit de<br />

către utilizator.<br />

Un <strong>program</strong> C se compune din patru părţi şi anume:<br />

1) Directive de preprocesare<br />

Prin preprocesare se înţelege prelucrarea <strong>unui</strong> fişier sursă înainte de a fi supus compilării.<br />

În urma acestei activităţi se crează un fişier temporar care conţine un cod sursă provenit în urma<br />

traducerii directivelor de preprocesare.<br />

Preprocesorul C este (în principiu) un <strong>program</strong> separat, invocat de către compilator în<br />

prima parte a procesului de compilare. Preprocesorul C manipulează directivele pentru includerea<br />

fişierelor sursă (în construcţii de forma #include), a macrodefiniţiilor (în construcţii de forma<br />

#define) şi a includerilor condiţionate (în construcţii de forma #if ).<br />

Directivele de preprocesare sunt de trei feluri: includeri de fişiere sursă, macrosubstituţii şi<br />

includeri condiţionate.<br />

a) Includeri de fişiere cu text sursă<br />

- se fac cu directiva # include printr-o construcţie de forma :<br />

sau :<br />

#include <br />

#include "nume_fisier.c"<br />

unde nume_fisier defineşte un fişier cu text sursă păstrat pe disc.<br />

În faza de preprocesare textul fişierului inclus se substituie construcţiei #include şi<br />

apoi ia parte la compilare împreună cu textul fişierului în care a fost inclus.<br />

Construcţia #include se foloseşte pentru includerea fişierelor standard<br />

care conţin prototipuri pentru funcţiile de bibliotecă (librării). Librăriile sunt coduri gata compilate<br />

care se adaugă <strong>program</strong>ului sursă C la compilarea acestuia.<br />

Parantezele unghiulare instruiesc compilatorul să caute fişierele care trebuie incluse în directorul cu<br />

fişiere antet (de exemplu, C:\BorlandC\include).<br />

Exemple:<br />

#include <br />

#include <br />

Aceste construcţii instruiesc preprocesorul să trateze fişierele header ca şi cum ar face<br />

parte din codul sursă care se compilează.<br />

Nu toate librăriile sunt incluse automat deoarece acest lucru ar conduce la coduri mari şi timp de<br />

compilare mărit, cu părţi de <strong>program</strong> inutile. Fişierele header care specifică librăriile ce se includ<br />

într-un <strong>program</strong> definesc macrouri, tipuri de date şi date externe care se folosesc împreună cu<br />

librăriile pe care le desemnează.<br />

Dacă un anumit fişier header a fost inclus atunci numele funcţiilor, macrourilor sau tipurilor de date<br />

definite în acel fişier nu pot fi redefinite în <strong>program</strong>ul sursă. Astfel, de exemplu, poate fi definită o<br />

funcţie cos(x) într-u <strong>program</strong> numai dacă în acel <strong>program</strong> nu a fost inclusă librăria math.h în care<br />

este deja definită funcţia cos.<br />

Construcţia #include "nume_fisier.c" se utilizează la includerea fişierelor nestandard<br />

care conţin prototipuri ale eventualelor funcţii definite de către utilizator.<br />

1


Curs 4 <strong>Structura</strong> <strong>unui</strong> <strong>program</strong> C; tipuri de date în C<br />

Fişierul care trebuie inclus se caută în directorul curent dacă nu este specificată nici o cale.<br />

Exemple:<br />

# include "factorial.c"<br />

# include "C:\\BORLANDC\\PERSLIB\\persmat.c"<br />

Observaţii:<br />

1) Un fişier inclus cu directiva #include poate conţine la rândul său construcţii #include<br />

pentru alte fişiere.<br />

2) Construcţiile #include se scriu de obicei la începutul fişierelor sursă pentru ca fişierele<br />

incluse să fie valabile (vizibile) în întregul fişier sursă care se compilează.<br />

Exemplu:<br />

Presupunem că în directorul curent există fişierul persmat.c în care este definită funcţia factorial şi<br />

că într-un <strong>program</strong> dorim să folosim această funcţie. Pentru aceasta va trebui să includem fişierul<br />

persmat.c în <strong>program</strong>.<br />

#include <br />

#include "persmat.c"<br />

double combinari (double V1, double V2)<br />

{<br />

return factorial(V1)/factorial(V2)/factorial(V1-V2);<br />

}<br />

void main()<br />

{<br />

double n,k,cnk;<br />

printf("\n n= "); scanf("%lf",&n);<br />

printf("\n k= "); scanf("%lf",&k);<br />

cnk = combinari(n,k);<br />

printf("\n Combinari de %lg luate cate %lg este<br />

%lg",n,k,cnk);<br />

getch();<br />

}<br />

Al doilea tip de directive de preprocesare sunt:<br />

b) Macrosubstituiri<br />

Macrosubstituirile înseamnă substituirea unor nume prin succesiuni de caractere şi se fac<br />

cu directiva #define sub forma: #define succesiune_de_caractere (vezi constante<br />

simbolice).<br />

Macroprocesorul poate efectua şi substituţii de argumente în macrodefiniţii.<br />

Exemplu:<br />

#define max(a,b) (a>b?a:b)<br />

#define min(a,b) (a


Curs 4 <strong>Structura</strong> <strong>unui</strong> <strong>program</strong> C; tipuri de date în C<br />

Program exemplu: macrodefiniţii<br />

#include <br />

#define MAX2(a,b) (a>b?a:b)<br />

#define MIN2(a,b) (ac?MAX2(a,b):c)<br />

#define schimb(a,b) {t=a;a=b;b=t;}<br />

#define moddif(a,b) ((a>b)?(a-b):(b-a))<br />

#define suma(a,b) (a+b)<br />

void main()<br />

{<br />

int a,b,t;<br />

}<br />

printf("a= ");<br />

scanf("%d",&a);<br />

printf("b= ");<br />

scanf("%d",&b);<br />

printf("\nMaximul este %d",max(a,b));<br />

printf("\nMinimul este %d",min(a,b));<br />

printf("\nModulul diferentei este %d",moddif(a,b));<br />

printf("\nSuma numerelor este %d",suma(a,b));<br />

schimb(a,b);<br />

printf("\nDupa schimbare valorile a si b sunt %d si %d",a,b);<br />

Rezultatul rulării acestui <strong>program</strong> este dat în figura următoare:<br />

c) Includeri condiţionate<br />

Aceste includeri se folosesc pentru includerea unor fişiere numai atunci când este<br />

îndeplinită o anumită condiţie.<br />

Exemplu:<br />

#if SYSTEM == MSDOS // daca sistemul de operare este MS-DOS<br />

#include // se foloseste headerul <br />

#else<br />

#include // altfel, se foloseste headerul <br />

#endif<br />

Includerile condiţionate se mai pot folosi pentru construirea grupurilor condiţionate sub forma:<br />

#ifdef MACRO<br />

text controlat<br />

#endif /* MACRO */<br />

Textul controlat va fi inclus numai dacă este definită macrocomanda MACRO şi acest text poate<br />

include directive de preprocesare.<br />

3


Curs 4 <strong>Structura</strong> <strong>unui</strong> <strong>program</strong> C; tipuri de date în C<br />

Exemplu:<br />

#ifdef TURBOC // in TurboC valorile intregi<br />

#define INT_SIZE 16 // se stocheaza pe 16 biti iar in SO Unix<br />

#else // acestea se stocheaza pe 32 biti<br />

#define INT_SIZE 32<br />

#endif<br />

După cum se observă, orice includere condiţionată se încheie cu #endif.<br />

Celelalte părţi ale <strong>unui</strong> <strong>program</strong> C sunt:<br />

2. Secţiunea de declaraţii:<br />

În această secţiune se stabilesc numele şi atributele variabilelor, a tipurilor de date<br />

utilizator sau ale funcţiilor.<br />

3. Funcţia principală<br />

4. Funcţiile utilizator<br />

În concluzie, un <strong>program</strong> C are următoarea structură:<br />

<strong>Structura</strong> <strong>unui</strong> <strong>program</strong> C<br />

4


Curs 4 <strong>Structura</strong> <strong>unui</strong> <strong>program</strong> C; tipuri de date în C<br />

Tipuri de date în C<br />

Tipurile de date descriu tipurile valorilor diverselor variabile, constante, funcţii, etc. ale <strong>unui</strong><br />

<strong>program</strong>. Fiecare variabilă folosită într-un <strong>program</strong> C trebuie să fie declarată compilatorului.<br />

Declaraţia va conţine numele variabilelor şi tipul acestora.<br />

Exemplu:<br />

...........<br />

int zi,luna,an:<br />

..........<br />

zi = 29;<br />

luna = 2; //variabilele zi, luna şi an au valori diferite dar au acelaşi tip<br />

an = 2000;<br />

float medie;<br />

..........<br />

medie = 2; //variabilele luna şi medie au aceeaşi valoare dar tipuri diferite<br />

1) Fiecarui tip de dată îi corespunde o denumire (un cuvânt cheie) care este utilizată pentru<br />

crearea în memorie a obiectelor ce vor conţine valori corespunzătoare tipului respectiv.<br />

Exemplu:<br />

float s;<br />

în memoria calculatorului se crează un spaţiu (o zonă) în care va fi depozitată<br />

valoarea variabilei s.<br />

2) Fiecărui tip de date îi corespunde o anumită mărime a zonei de memorie în care se<br />

păstrează valoarea unei date de tipul respectiv.<br />

Exemplu<br />

int n;<br />

valoarea lui n se va păstra într-o locaţie de 16 biţi (2 octeţi)<br />

float s;<br />

valoarea lui s se va păstra într-o zonă de 32 biţi (4 octeţi)<br />

3) Fiecărui tip de date îi corespunde o anumită gamă de valori, determinată de mărimea locaţiei<br />

de memorie corespunzătoare datelor de tipul respectiv.<br />

Exemplu<br />

int n;<br />

n va putea avea valori în intervalul: - 32768 < n < 32767<br />

float s;<br />

modulul lui s va putea avea valori între valoarea minimă reprezentabilă pe 4 octeţi şi<br />

valoarea maximă reprezentabilă pe 4 octeţi: 3.4 ·10 -38 < |s| < 3.4·10 38<br />

Orice limbaj de <strong>program</strong>are oferă un anumit număr de tipuri de date de bază (tipuri<br />

predefinite).<br />

Limbajul C permite definirea unor tipuri de date derivate (tipuri utilizator) care se construiesc<br />

cu ajutorul tipurilor de bază.<br />

5


Curs 4 <strong>Structura</strong> <strong>unui</strong> <strong>program</strong> C; tipuri de date în C<br />

Tipuri de date de bază<br />

Tipurile de bază sunt tipurile predefinite şi în limbajul C acestea sunt:<br />

char - tip de date ale căror valori sunt reprezentate pe un singur octet (byte)<br />

int - tip de date ale căror valori sunt reprezentate pe 2 octeţi<br />

float - tip de date reale reprezentate în virgulă mobilă, în simplă precizie<br />

double - tip de date reale reprezentate în virgulă mobilă, în dublă precizie<br />

În plus, există câţiva calificatori care pot fi aplicaţi acestor tipuri de bază:<br />

unsigned, short şi long<br />

Short şi long furnizează diferite lungimi ale locaţiilor de memorie pentru datele de tip int.<br />

Calificatorul short înseamnă de obicei întregi reprezentaţi pe 16 biţi, iar long întregi<br />

reprezentaţi pe minim 32 de biţi.<br />

Calificatorii signed sau unsigned pot fi aplicaţi tipului char sau oricărui întreg. Numerele unsigned<br />

sunt întotdeauna pozitive sau zero. Dacă datele de tip char sunt reprezentate pe 8 biţi, variabilele<br />

unsigned char vor avea valori între 0 şi 255, iar variabilele signed char între -128 şi 127.<br />

Pentru datele de tip real, long double specifică extinderea preciziei numerelor reprezentate în<br />

virgulă flotantă pe 10 octeţi (80 biţi).<br />

Fiecarui tip de date de bază îi corespunde un specificator de tip. Specificatorii de tip<br />

definesc formatele datelor care se citesc sau se scriu şi se compun din caracterul % urmat de una<br />

sau două litere ce depind de tipul datei (vezi tabelul de mai jos).<br />

Tipul Specificator de tip<br />

Lungimea<br />

biţi octeţi<br />

Intervalul de valori<br />

char %c, %d 8 1 -128 127 -2 7 2 7 -1<br />

unsigned char %c, %d 8 1 0 255 0 2 8 -1<br />

int %d 16 2 -32768 32767 -2 15 2 15 -1<br />

unsigned int %u 16 2 0 65535 0 2 16 -1<br />

long int %ld 32 4 -2147483648 2147483647 -2 31 2 31 -1<br />

unsigned long %lu 32 4 0 4294967295 0 2 32 -1<br />

float %f,%g,%e,%E 32 4 3.410 -38 3.410 38<br />

double %lf, %lg, %le, %lE 64 8 1.710 -308 1.710 308<br />

long double %Lf, %Lg, %Le,%LE 80 10 3.410 -4932 1.110 4932<br />

Deoarece aritmetica numerelor reale reprezentate în virgulă flotantă nu este atât de precisă<br />

ca şi aritmetica numerelor întregi, recomandăm evitarea comparaţiilor între numere "floating<br />

point". Astfel, un cod de forma:<br />

float v;<br />

// fă ceva cu variabila v<br />

...<br />

if(v==0.0)<br />

{<br />

// fă ceva<br />

...}<br />

6


Curs 4 <strong>Structura</strong> <strong>unui</strong> <strong>program</strong> C; tipuri de date în C<br />

este foarte posibil să nu funcţioneze din cauza erorilor de rotunjire, erori care ar putea avea ca<br />

efect un rezultat de valoare să zicem 0.0000000023 atunci când ne aşteptăm ca v să fie de fapt<br />

0.0. Pentru a evita astfel de cazuri se recomandă folosirea unei precizii impuse, sub forma:<br />

#define DELTA 0.000001<br />

...<br />

if(v0.0-DELTA)<br />

{<br />

// fă ceva<br />

...<br />

}<br />

sau folosirea preciziei calculatorului (vezi calculul numeric al derivatelor).<br />

De asemenea, se recomandă evitarea amestecării valorilor de tip signed şi respectiv<br />

unsigned în operaţii de împărţire.<br />

<strong>Structura</strong> funcţiilor<br />

O funcţie încapsulează una sau mai multe instrucţiuni, variabile şi parametri într-un pachet<br />

unificat care poate fi apelat din interiorul <strong>program</strong>ului.<br />

Cu ajutorul funcţiilor se împart sarcinile mari de calcul ale <strong>unui</strong> <strong>program</strong> în sarcini de complexitate<br />

mai mică.<br />

O funcţie se defineşte în felul următor:<br />

tip nume (listă parametri formali)<br />

{<br />

declaraţii<br />

instrucţiuni<br />

}<br />

unde tip reprezintă un tip de bază sau tipul void.<br />

O funcţie cu alt tip decât tipul void trebuie să conţină în corpul ei instrucţiunea return, urmată<br />

de o expresie sau un nume de variabilă, având tipul corespunzător tipului funcţiei sau convertibil la<br />

tipul pe care îl returnează funcţia. In caz contrar, compilatorul va semnala o eroare de forma:<br />

Function should return a value in function …<br />

Funcţiile pot returna valori având ca tip: tipuri de bază, pointeri, structuri, pointeri la structuri,<br />

pointeri la tablouri, dar nu pot returna tablouri.<br />

O funcţie poate avea unul sau mai mulţi<br />

parametri, dar poate de asemenea să nu aibă nici<br />

un parametru. Parametrii funcţiilor sunt folosiţi<br />

pentru a face transferuri de date între funcţii şi sunt<br />

de două feluri:<br />

a) parametri formali, care nu reprezintă<br />

valori concrete ci ţin doar locul unor valori<br />

pentru a se putea exprima procesul de calcul<br />

realizat de către funcţie în momentul<br />

apelului ei; aceşti parametri vor fi înlocuiţi<br />

de către cei actuali în momentul apelului<br />

funcţiei.<br />

Transmiterea parametrilor între funcţii<br />

b) parametri actuali, adică parametrii<br />

7


Curs 4 <strong>Structura</strong> <strong>unui</strong> <strong>program</strong> C; tipuri de date în C<br />

transmişi unei funcţii şi care reprezintă valori concrete cu care sunt apelate funcţiile. Aceştia pot fi<br />

constante, variabile, expresii şi nu este obligatoriu ca numele parametrilor actuali să fie identici cu<br />

cel al parametrilor formali.<br />

Exemple:<br />

int f ( ) void g ( ) char ascii (int valoare)<br />

{ { {<br />

...... ....... ..........<br />

} } }<br />

int cod (char caracter) double fact (long val)<br />

{ {<br />

......... ........<br />

} }<br />

Într-o funcţie pot exista de asemenea declaraţii ale variabilelor şi constantelor pe care le<br />

utilizează funcţia respectivă (tip+nume).<br />

Exemple:<br />

char ascii (int valoare) int cod (char c)<br />

{ {<br />

char c; int codc;<br />

c = (char)(valoare) codc = (int)(c);<br />

return c; return codc;<br />

} }<br />

Variabilele din interiorul unei funcţii se numesc variabile locale şi aparţin clasei automatic.<br />

Aceste variabile automatic sunt "vizibile" numai în corpul funcţiei în care au fost declarate şi există<br />

doar atâta timp cât funcţia în care au fost declarate se află în execuţie, iar la ieşirea din funcţie<br />

valorile lor sunt şterse din memorie (sunt volatile). Aşadar, valorile acestora nu sunt reţinute de la<br />

un apel la altul al funcţiei.<br />

Exemplu<br />

int suma (int a, int b) int suma(int a, int b)<br />

{ {<br />

int c; return a+b;<br />

c=a+b; }<br />

return c;<br />

}<br />

Variabila c este de tip automatic şi va fi alocată în memorie de fiecare dată când se execută funcţia<br />

suma. Compilatorul va crea un cod pentru alocarea dinamică a variabilei, pentru iniţializarea ei şi<br />

pentru eliminarea ei din memorie la încetarea execuţiei funcţiei suma.<br />

În cel de-al doilea exemplu, funcţia conţine doar o instrucţiune return a expresiei a+b, fără să mai<br />

fie folosită o variabilă intermediară.<br />

8


Curs 4 <strong>Structura</strong> <strong>unui</strong> <strong>program</strong> C; tipuri de date în C<br />

Un alt tip de variabile este reprezentat de către variabilele statice, care sunt variabile locale care<br />

nu se alocă pe stivă ci într-o zonă specială de memorie, rezervată acestui tip de variabile. Acestea<br />

trebuie să fie precedate la declarare de cuvântul cheie static.<br />

Declaraţia static este în principiu folosită pentru variabile, dar poate fi folosită şi pentru funcţii<br />

şi de asemenea şi pentru variabile interne. Variabilele interne de tip static sunt variabile locale<br />

ale unei anumite funcţii, dar, spre deosebire de variabilele automatic ele există tot timpul şi nu<br />

numai atunci când este executată funcţia. În consecinţă, aceste variabile nu îşi pierd valoarea între<br />

două apeluri ale funcţiei în care sunt declarate.<br />

Exemplu<br />

static int c;<br />

Variabilele globale sunt variabile declarate în afara oricărei funcţii a <strong>program</strong>ului. Acestea sunt<br />

iniţializate automat cu zero şi pot fi utilizate de către orice funcţie a <strong>program</strong>ului. Ele sunt variabile<br />

externe, adică pot fi utilizate într-o anumită funcţie a <strong>program</strong>ului chiar dacă nu au fost declarate<br />

în funcţia respectivă. Aceste variabile au tipul static automat.<br />

Este recomandabilă folosirea variabilelor locale deoarece acest lucru conduce la urmărirea mai<br />

uşoară a codului unei funcţii particulare. Totuşi, dacă folosirea variabilelor locale conduce la<br />

transmiterea multor parametri sau la reproducerea inutilă a mai multor variabile, atunci este<br />

recomandabil să fie folosite variabile globale.<br />

Exemple de variabile globale şi locale<br />

int contor; // contor este o variabilă globală, vizibilă în toate funcţiile <strong>program</strong>ului<br />

// orice funcţie definită în aval va putea face referire la variabila contor<br />

.......................<br />

void f1()<br />

{<br />

int aux=contor+1; // contor este vizibilă şi în f1 chiar dacă aici nu este definită<br />

// aux este variabilă locală pentru f1<br />

.........<br />

}<br />

void f2()<br />

{<br />

.........<br />

int k; // k - variabilă locală pentru f2<br />

........<br />

k=aux; // ?!? EROARE deoarece aux este variabilă locală pentru f1 şi deci nu este<br />

// vizibilă în f2<br />

} // Unknown symbol ‘aux’ in function f2()<br />

void f3()<br />

{<br />

.......<br />

int k; // definită şi în f2 şi în f3 dar este corect deoarece sunt variabile locale<br />

int aux; // definită şi în f1 şi în f3 dar este corect deoarece sunt variabile locale<br />

// şi au un scop limitat<br />

..........<br />

k=aux+contor; // aux este variabilă locală, iar contor este globală<br />

..........<br />

9


Curs 4 <strong>Structura</strong> <strong>unui</strong> <strong>program</strong> C; tipuri de date în C<br />

}<br />

void f4()<br />

{<br />

........<br />

int contor; // deşi este declarată şi ca variabilă globală, în funcţia f4 contor este un<br />

// obiect distinct de variabila globală contor<br />

........ // !!! A SE EVITA denumiri identice de variabilă pentru a nu se crea confuzii<br />

contor++;<br />

}<br />

while(a


Curs 4 <strong>Structura</strong> <strong>unui</strong> <strong>program</strong> C; tipuri de date în C<br />

double xo, sol;<br />

.........<br />

sol = Newton (f, xo);<br />

printf (\n Solutia ecuatiei este %15.8f,sol);<br />

........<br />

}<br />

Un tablou poate fi parametru efectiv la apelul unei funcţii. Spre deosebire de argumentele<br />

neindexate, dacă se doreşte ca un tablou se fie transmis ca argument unei funcţii, compilatorul va<br />

transmite de fapt un pointer la tabloul respectiv şi dacă funcţia modifică tabloul ea va modifica<br />

originalul acestuia.<br />

Valorile returnate de către funcţii pot fi folosite ca şi argumente ale altor funcţii fără să fie<br />

necesară asignarea acelor valori unor variabile cu apeluri de forma f1(f2(x)) (vezi exemplul de mai<br />

jos).<br />

Exemplu<br />

# include <br />

int f(int n)<br />

{<br />

return 2*n;<br />

}<br />

int g(int n)<br />

{<br />

return n*n;<br />

}<br />

void main()<br />

{<br />

}<br />

int m;<br />

printf("Introduceti o valoare intreaga: ");<br />

scanf("%d",&m);<br />

printf("f(x)=%d \t f(g(x))= %d", f(m),f(g(m)));<br />

printf("\nf(x)=%d \t g(f(x))= %d", f(m),g(f(m)));<br />

Exemplu<br />

float note [50]; //declararea <strong>unui</strong> tablou unidimensional cu 50 elemente<br />

..............<br />

double medie (float sir[50]); //prototipul unei funcţii care are ca parametru<br />

// un tablou unidimensional<br />

Dimensiunea şirului poate fi omisă în prototipul funcţiei. De asemenea, valoarea primei dimensiuni<br />

a <strong>unui</strong> tablou multidimensional este opţională deoarece compilatorul nu are nevoie de valoarea<br />

primei dimensiuni pentru a calcula adresele elementelor tabloului ci numai de dimensiunile<br />

următoare. Astfel, dacă avem declaraţia:<br />

char Mat[6][8];<br />

Adresa elementului Mat[2][3] va fi adresa lui Mat+2*8+3 deoarece Mat (numele tabloului)<br />

este un pointer având ca valoare adresa primului element al tabloului.<br />

11


Curs 4 <strong>Structura</strong> <strong>unui</strong> <strong>program</strong> C; tipuri de date în C<br />

Program exemplu: calculul mediei valorilor <strong>unui</strong> şir de elemente<br />

//exemplu functie avand ca parametru un tablou<br />

#include<br />

#include<br />

float medie (int n, float sir[])<br />

{<br />

int i;<br />

float m,s=0;<br />

for(i=0;i


Curs 4 <strong>Structura</strong> <strong>unui</strong> <strong>program</strong> C; tipuri de date în C<br />

//exemplu de funcţie factorial mai rapidă decât cele prezentate anterior<br />

double fact (long val) ← antet fact<br />

{<br />

long rez=val; ← corp fact<br />

}<br />

while(--val>1)<br />

rez*=val;<br />

return rez;<br />

13


Curs 4 <strong>Structura</strong> <strong>unui</strong> <strong>program</strong> C; tipuri de date în C<br />

Exemple de funcţii şi includeri de fişiere sursă<br />

// <strong>program</strong> sursă salvat în fişierul <strong>program</strong>1.c<br />

int zi, luna, an; // variabile globale şi pot fi folosite în toate funcţiile din <strong>program</strong>1.c care<br />

// urmează după această declaraţie<br />

.......<br />

int decidebisect(...)<br />

{<br />

int i;<br />

.....<br />

i=(an%4==0 && an%100!=0)an%400==0;<br />

//un an este bisect dacă este divizibil cu 400<br />

//sau dacă este divizibil cu 4 dar nu şi cu 100<br />

//anii de sfârşit de secol nu sunt bisecţi chiar dacă urmează la 4 ani după un an bisect,<br />

//cu excepţia celor care sunt divizibili cu 400<br />

//ani bisecţi "obişnuiţi": 1872, 1912, 1960, 1996, 2008... – anii divizibili cu 4<br />

//excepţii: 1800, 1900, 2100, 2200... – anii de sfârşit de secol divizibili cu 100<br />

//sunt totuşi ani bisecţi: 2000, 2400... – anii de sfârşit de secol divizibili cu 400<br />

.....<br />

if(luna==2)<br />

zi=28+i;<br />

....<br />

}<br />

Alternativ, pentru a decide dacă un an este bisect se poate folosi secvenţa de instrucţiuni din<br />

<strong>program</strong>ul de mai jos:<br />

int b, an;<br />

FILE *f;<br />

f=fopen("d:\\anibis.dat","w");<br />

for(an=1872;an


Curs 4 <strong>Structura</strong> <strong>unui</strong> <strong>program</strong> C; tipuri de date în C<br />

}<br />

if(zi== 31 && luna ==12)<br />

an++;<br />

....<br />

// <strong>program</strong> sursă salvat în fişierul <strong>program</strong>2.c<br />

.......<br />

void main()<br />

{<br />

extern int zi,luna,an; // variabile externe<br />

.....<br />

if(zi31)<br />

printf(“\n Ziua eronata”);<br />

else<br />

if(luna12)<br />

printf(“\n Luna eronata”);<br />

.......<br />

} // sfârşitul funcţiei main()<br />

void timp(...)<br />

{<br />

int anactual;<br />

char s[10];<br />

....<br />

if(ananactual)<br />

s=”viitor”;<br />

else s=”prezent”;<br />

}<br />

15

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!