QReferate - referate pentru educatia ta.
Referatele noastre - sursa ta de inspiratie! Referate oferite gratuit, lucrari si proiecte cu imagini si grafice. Fiecare referat, proiect sau comentariu il poti downloada rapid si il poti folosi pentru temele tale de acasa.



AdministratieAlimentatieArta culturaAsistenta socialaAstronomie
BiologieChimieComunicareConstructiiCosmetica
DesenDiverseDreptEconomieEngleza
FilozofieFizicaFrancezaGeografieGermana
InformaticaIstorieLatinaManagementMarketing
MatematicaMecanicaMedicinaPedagogiePsihologie
RomanaStiinte politiceTransporturiTurism
Esti aici: Qreferat » Referate informatica

Compilare independenta



Compilare independenta

Avantajele structurarii programelor C pe mai multe fisiere


* In cazul programelor mari, daca tot programul ar fi scris intr-un singur fisier, programul ar fi foarte greu de urmarit si timpul de compilare ar fi foarte mare, nefiind folosita facilitatea de compilare independenta. Acest aspect este foarte util in faza de corectare a erorilor sintactice si semantice, cand doar fisierul eronat trebuie recompilat, pentru restul fisierelor trebuind doar linkeditate fisierele obiect. Daca intregul program este plasat intr-un singur fisier atunci orice modificare sau corectie impune recompilarea intregului program.




* Structurarea programelor pe mai multe fisiere permite simularea mecanismului de incapsulare a datelor. Variabilele si functiile avand clasa de memorare static pot fi accesate doar in cadrul fisierului in care ele au fost definite. Variabilele si functiile declarate cu clasa de memorare extern sunt definite intr-un alt fisier decat cel curent, dar ele pot fi accesate in fisierul curent. Astfel fisierele apar in C ca un mecanism de control al vizibilitatii obiectelor.


Recomandari de structurare pe mai multe fisiere


In general, se alege un fisier care va fi fisierul principal, in acest fisier fiind implementata functia main(); in celelalte fisiere nu va mai fi implementata aceasta functie. In fisierul antet se vor trece definitia tipurilor de date folosite si declaratiile (prototipurile) functiilor. Nu se vor trece in fisierul antet declaratii de variabile si implementari de functii (este perfect 'legal' sa apara declaratii de variabile si implementari de functii, fisierul antet fiind tratat ca orice fisier C, dar aceasta maniera de programare distruge conceptul de modularizare a programelor si de incapsulare a datelor). In fisierul auxiliar antetului (cu acelasi nume si extensia .c) se va trece implementarea functiilor definite in fisierul antet. In acest fisier nu se va implementa functia main(). Atat fisierul principal cat si cel auxiliar vor include fisirul antet. Astfel se realizeaza incapsularea tipurilor de date si a functiilor in fisiere separate.


Aceasta maniera de structurare a programelor este folosita in scrierea unor biblioteci de functii. Programatorul care doreste sa furnizeze o biblioteca de functii va scrie fisierul antet si fisierul auxiliar antetului, care va include fisierul antet. In fisierul antet vor fi trecute functiile si tipurile de date oferite de biblioteca, iar in fisierul auxiliar vor fi implementate aceste functii. Aceste fisiere se compileaza impreuna, rezultand un fisier obiect (nu executabil), iar biblioteca va oferi acces la aceste functii prin includerea in orice program a fisierului antet si prin linkeditarea cu fisierul obiect. Programatorul acestei biblioteci nu va oferi spre utilizare decat fisierul antet si fisierul obiect, astfel maniera de implementare a functiilor oferite de biblioteca ramane invizibila pentru utilizatorul bibliotecii.


Pentru a exemplifica aceste reguli, consideram un program pentru calculul sumei a doua numere complexe. Pentru aceasta, se va defini o functie suma. De asemenea, vor fi definite si doua functii pentru citirea, respectiv afisarea numerelor complexe.


Programul va fi structurat pe trei fisiere: calcul.c - care contine functia main, operatii.h - fisierul antet unde sunt declarate principalele tipuri de date si functii si operatii.c - implementarea functiilor.


//== calcul.c ==


#include <stdio.h>

#include 'operatii.h'


void main(void)



//== operatii.h ==


/* definire tip de date complex */

typedef struct nr_complex

complex;


/* prototipuri functii exportate */

complex citire(void);

void afisare(complex);

complex suma(complex,complex);


//== operatii.c ==


#include <stdio.h>

#include 'operatii.h'


/* implementare functii exportate */

complex citire(void)


void afisare(complex nr)



complex suma(complex nr1, complex nr2)



Compilare independenta in mediul Borland C


Pentru a compila fisierele si a le 'linkedita' impreuna folosim modul project. In mediul Borland C acest lucru presupune urmatorii pasi:


* Selectam optiunea Project si apoi Open project.

* Fixam numele fisierului project (care are extensia .prj).

* Cu ajutorul butonul Ins precizam fisierele care trebuie compilate si apoi linkeditate impreuna. Fisierele antet nu se includ in project. Cu butonul Del fisierul selectat este eliminat din grupul celor care sunt compilate si linkeditate impreuna.

* Selectam optiunea pentru construirea programului executabil (din meniul Compile, optiunea Build all. Mediul Borland C compileaza automat toate fisierele enumerate si le linkediteaza impreuna.

* Prin selectarea optiunii Project si apoi a celei Close project, se incheie lucrul in modul Project.


Tipul de date abstracte stiva


Stiva este un tip special de lista in care toate insertiile si suprimarile de noduri au loc la un singur capat. Acest capat se numeste varful stivei.


Tipul abstract stiva pe care il definim contine urmatorii operatori:


1. Initializarea stivei.

2. Verificarea faptului ca stiva e plina.

3. Verificarea faptului ca stiva e goala.

4. Introducerea unui element in varful stivei.

5. Eliminarea elementului din varful stivei.

6. Furnizarea elementului din varful stivei fara a-l elimina.


Implementarea stivei folosind un tablou


static double stiva[MAX];  /* stiva */

static int ind_top;  /* varful stivei */


// initializarea stivei:


void init(void)



// verificarea faptului ca stiva este plina:


int plin(void)



/* Stiva este plina atunci cand varful stivei indica spre ultimul element din stiva (cel de indice MAX-1). */




// verificarea faptului ca stiva este goala:


int gol(void)



/* Functia gol verifica daca stiva este goala. Cand indicele stivei este egal cu -1, stiva nu contine nici o valoare si gol returneaza 1. Daca ind_top$>$-1 atunci stiva contine cel putin o valoare, astfel ca gol returneaza 0. */


// introducerea unui element in varful stivei:


void push(double nr)



stiva[++ind_top] = nr; /* noul element este

introdus in varful stivei */



/* Rutina push introduce in varful stivei numarul transmis prin parametrul double nr. Daca stiva este plina atunci se afiseaza un mesaj de eroare si executia programului este terminata. In caz contrar, se incrementeaza varful stivei ind_top, dupa care noul element este memorat in varful stivei.


// eliminarea elementului din varful stivei:


void pop(void)


ind_top--; /* decrementeaza varful stivei */



/*Rutina pop extrage elementul din varful stivei fara a-l returna. Daca stiva este goala atunci pop afiseaza un mesaj de eroare si executia programului este incheiata. In caz contrar, varful stivei este decrementat.



// furnizarea elementului din varful stivei (fara a-l elimina):


double top(void)


return stiva[ind_top]; /* returneaza elementul din varful stivei */



Implementarea stivei folosind liste simplu inlantuite


Definim tipul de date abstract stiva utilizand o lista simplu inlantuita. urm indica proximul element aflat sub cel current, iar informatia utila fiind un numar real.


typedef struct elementStiva stiva;


Operatiile sunt definite in fisierul 'stiva.h' dupa cum urmeaza


void init(void); // initializeaza varful stivei


void push(double d) // adauga un element in stiva, modificand si varful curent


void pop(void); // extrage un element din stiva, eliberand memoria ocupata


double top(void); // returneaza informatia utila a elementului din varf


int gol(void); // verifica existenta a cel putin unui element in stiva


int plin(void); /* verifica daca exista suficienta memorie libera pentru adaugarea unui element */


void goleste(void); // sterge toate elementele din stiva


In fisierul antet stiva.h este declarat si pointerul spre varful stivei.


Functiile sunt implementate in fisierul stiva.c


Fisierul care foloseste aceste functii se numeste teststiv.c :


#include <stdio.h>

#include 'stiva.h'


main( )


goleste();

return 0;



Teme


Tema 1

Implementati functiile descrise in fisierul antet stiva.h in fisierul stiva.c, compilati si testati folosind fisierul teststiv.c de mai sus.


Tema 2

Evaluarea unei expresii in notatie poloneza

Notatia poloneza (sau postfix) este un mod de scriere a expresiilor, in care ordinea operatorilor si a operanzilor este schimbata fata de cea dintr-o expresie uzuala.

In notatia uzuala (numita si infix) o expresie are forma:

operand operator operand

In notatia postfix (poloneza) expresia este scrisa sub forma:

operand operand operator


De exemplu:


a + b devine in notatie poloneza a b +

(a - b) * c devine a b - c *

a - b * (c + d) devine a b c d + * -


Scrieti un program care evalueaza expresii postfix cu operanzi numere reale, expresii citite dintr-un fisier de intrare, cate una pe fiecare rand.

Nu se poate descarca referatul
Acest referat nu se poate descarca

E posibil sa te intereseze alte referate despre:


Copyright © 2024 - Toate drepturile rezervate QReferat.com Folositi referatele, proiectele sau lucrarile afisate ca sursa de inspiratie. Va recomandam sa nu copiati textul, ci sa compuneti propriul referat pe baza referatelor de pe site.
{ Home } { Contact } { Termeni si conditii }