Índex

apendixA.doc subru.cpp subru.h subru.doc
Apèndix A

Els mòduls de programació. Els projectes amb Borland C++

  1. Els projectes en programació
  2. El primer porojecte de C amb la versió 3.1 de Borland.
  3. Els arxius de capçalera i els projectes.
  4. Àmbit i existència de les variables dins els mòduls d'un projecte.

 

1. Els projectes en programació

Bé, fins ara hem treballat creant funcions de propòsit general que escrivim en mateix mòdul de programació. Això fa que aquest text que conté les funcions es faci cada cop més llarg i més difícil de treballar, arribant el cas que ens perdem.

Es a dir, que quan fem un programa, hem de plantejar-nos la divisió en mòduls que han de contenir un cert tipus de funcions, per tal de treballar-los per separat i de manera independent.

Exemple: Ens plantegem fer un programa d'introducció de dades i llistats per portar la matrícula dels alumnes del centre.
Les tasques principals que ha de realitzar aquest programa són les següents:

a) Afegir alumne
b) Editar alumne
c) Esborrar alumne
d) Llistats per nom
e) Llistats per curs
f) Llistats per grup
g) Creació de fitxers
h) Obertura de fitxers
i) Sortir del programa
Podem agrupar aquestes tasques en tres mòduls diferents:
 
Mòdul de fitxers Mòdul d'edició de dades Mòdul de llistats
Creació de fitxers
Obertura de fitxers
Sortir del programa
Afegir alumne
Editar alumne
Esborrar alumne 
Llistats per nom
Llistats per curs
Llistats per grup

Normalment necessitarem també funcions que haurem de fer ús des de tots els mòduls. Aquestes funcions a la seva vegada formaran mòduls. Un exemple pot ser el conjunt d'instruccions que permeten posar dades en pantalla. Aquest serà un nou mòdul.

També és convenient pensar que el programa ha de tenir només un punt d'entrada, que en C és la funció main. Podem pensar en un mòdul especial que s'encarregui de presentar els menús en pantalla i faci la distribució de les crides a les funcions a mesura que l'usuari faci demandes.

Així el nostre programa tindrà, en aquest cas, cinc mòduls molt bé diferenciats:
 

Mòduls per al nostre programa
1. Mòdul de fitxers
2. Mòdul d'edició de dades
3. Mòdul de llistats
4. Mòdul de la funció principal
5. Mòdul de funcions de presentació i presa de dades en pantalla

Nota: En el nostre exemple hem fet un estudi de modularització atenent al criteri de tipus de grans tasques que han de realitzar aquest mòduls. Els criteris de modularització poden ser molt diferents segons l'equip de treball que realitzi el treball de programació. Un cas extrem és el de fer un mòdul per a cada funció que tindrà el programa.

2. El primer porojecte de C amb la versió 3.1 de Borland.

Un projecte de Borland C 3.1 es composa de molts fitxers. El fitxer on es guarden les dades corresponents a un projecte té l'extensió .PRJ.

Dins d'un projecte es poden incloure fitxers amb extensió .cpp o fitxers amb extensió .obj.

Com que disposem d'un fitxer de biblioteca que es diu subru.cpp que té un arxiu de capçalera que es diu subru.h podem crear un primer projecte de la forma següent:

  1. Prepara un subdirectori que es digui PROVA i fes copia dels fitxers subru.h i subru.cpp
  2. Amb el menú Project fes un nou projecte que es digui PRSUBRU.
  3. Amb l'opció Add item del mateix menú inclou al projecte el fitxer subru.cpp.
  4. Fes un fitxer nou amb l'opció New del menú File. Guarda aquest fitxer amb el nom de principa.cpp dins del subdirectori PROVA.
  5. Amb l'opció Add item menú File inclou al projecte el fitxer principa.cpp.
  6. Escriu al document principa.cpp el programa que veus a la figura següent.
  7. Al menú Opcions opció Directoris fes que el directori de sortida sigui el directori PROVA.
  8. Fes Run del programa.
Bé, ara disposem al subdirectori PROVA dels següents fitxers:
 
 
PRSUBRU.PRJ
SUBRU.CPP
SUBRU.H
PRINCIPA.CPP
 PRSUBRU.EXE PRINCIPA.OBJ
SUBRU.OBJ

Observa que el programa executable té el nom del projecte.

Nota: Per a fer ús del mòdul de programació subru.cpp has de canviar tres paràmetres a l'entorn del desenvolupament del Borland C++:

3.- Els arxius de capçalera i els projectes.

Per a poder fer ús d'una funció que està definida en un mòdul A des de un altre mòdul B hem de declarar aquesta funció també en el mòdul B. Una manera d'estalviar-nos d'escriure aquestes declaracions en tots els mòduls és crear un arxiu de capçalera que contingui aquestes declaracions.

Si ens fixem en el quadre adjunt veurem que el fitxer de capçalera subru.h conté les declaracions de les funcions del mòdul subru.cpp. Així en el mòdul prova.cpp hem fet un #include <subru.h> que permet compilar sense errors aquest mòdul:
 
subru.h prova.cpp
#include <stdio.h>
#include <conio.h>
#include <ctype.h>
#include <stdlib.h>
#include <string.h>
#include <bios.h>
#include <dos.h>
#include <alloc.h>

#if !defined(_SUBRU_H)
#define _SUBRU_H
#define FALSO 0
#define CIERTO 1
#endiftypedef 

int Boolean;

struct Menu 

    char Opcion[11][40]; 
    int Resaltado[11], Color1; 
    char Titulo[40]; 
    int Posx, Posy, NumOpciones, Color, Fondo; 
    char Salida[3];
};

struct PullDown 

    char Titulo[11][20]; 
    int Resaltado[11]; 
    int PosX[11]; 
    int NumOpciones; 
    struct Menu OppMenu[11]; 
    int Color,Fondo,Color1; 
    char Salida[3];
};

struct CadenaPantalla 

    char Cadena[256],Delimitador; 
    int Posx,Posy,Longitud,Color,Fondo; 
    char Etiqueta[80]; 
    int Posx1,Posy1,Color1,Fondo1;
};

void EsperaTecla(int mensaje);
void RectanguloTexto(int x1,int y1,int x2,int y2,int color,int fondo,int tipo);
void BorraFondo(int x1,int y1,int x2,int y2,int Color,int fondo, char ch);
void BorraPantalla (char Caracter, char PrimerPlano, char Fondo, char Parpadeante);
char LeeCadena(struct CadenaPantalla *);
int PideOpcion(struct Menu *);
int PideBarraMenus(struct PullDown *Barra,int QueMenu);
char PideRegistro(struct CadenaPantalla *Dat,short int NumDatos);
int Persiana(char *Puntero,int Elementos,int Desplazamiento);
char Imprime(char *Tira);
void QuitaEspacios(char *);

#include "subru.h"

int main(void)

    struct CadenaPantalla Prueba = 
    { 
        "",':',22,14,20,
        GREEN,BLACK, 
        "Nombre",14,14,
        BLACK,WHITE 
    }; 

    BorraPantalla('²',GREEN,RED,0); 
    RectanguloTexto(10,6,70,20,WHITE,BLACK,0); 
    BorraFondo(11,7,69,19,BLACK,BLACK,' '); 
    LeeCadena(&Prueba); gotoxy(14,16); 
    cprintf("Prueba.Cadena: %s",Prueba.Cadena); 
    EsperaTecla(1); 

    return 0;
}

Segons veiem en el fitxer prova.cpp hem posat #include <subru.h> que ens permet fer ús de totes les funcions declarades en aquest fitxer de capçalera.
També podem fer ús de les estructures declarades, les constants  CIERTO i FALSO, i també hem de pensar que l'include del fitxer prova.cpp fa innecessari que escriguem tots els includes del fitxer subru.h i podem fer també ús de totes les funcions dels arxius de capçalera escrits.
 

4. Àmbit i existència de les variables dins els mòduls d'un projecte

Els modificadors extern i static.
  1. extern: aplicat a una variable fa que la declaració i valor inicial d’una variable està en algun lloc diferent del programa, normalment en un mòdul (fitxer) del programa com a variable global d’aquest altre mòdul.
  2. static: aquest és un modificador que podem posar a qualsevol declaració de variable. Afecta a l’existència de la varible. Si una variable està declarada en un bloc de programa aquesta variable deixa d’existir a la memòria quan el flux del programa surt d’aquest bloque. El modificador static aplicat a una variable fa que aquesta variable no deixi d’existir quan acaba d’executar-se el bloc al que pertany. No nomes no deixa d’existir si no que quan el flux del programa torna al seu bloc aquesta variable manté les dades originals del moment anterior.