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