En este apéndice se incluyen algunos programas de ejemplo escritos en lenguaje
C. Los programas han sido realizados de forma que puedan ser compilados en la
mayoría de compiladores existentes para los sistemas operativos MS-DOS y UNIX sin
que exista la necesidad de realizar ningún tipo de cambio en los mismos.
B.1 - palindro.c.
/* Programa que calcula si una palabra es palindroma, esto es, se lee
igual de derecha a izquierda que de izquierda a derecha. */
#include <stdio.h>
#include <string.h>
#define TAM 100
/* Rutina que calcula si una palabra es palindroma.
Parametros: char *cadena Puntero al string con la palabra.
Return: int 0 no palindroma, <>0 palindroma. */
int Palindroma(char *cadena)
{
register int i,j;
i=0;
j=strlen(cadena)-1;
while (i<j && cadena[i]==cadena[j])
{
i++;
j--;
}
return (i>=j);
}
int main(void)
{
char cadena[TAM];
printf("\nIntroduce la palabra\n");
gets(cadena);
printf("La palabra: %s %s palindroma.\n",cadena,
(Palindroma(cadena)) ? "es" : "no es");
return 0;
}
B.2 - matriz.c.
/* Programa que calcula el producto de dos matrices. */
#include <stdio.h>
75El lenguaje de programación C
/* Definicion del tamaño maximo */
#define TAM 10
/* Definicion de los codigos de error */
#define OK 0
#define ERROR 1
/* Definicion de la estructura de datos */
struct MATRIZ
{
unsigned fila,columna;
float matriz[TAM][TAM];
};
/* Rutina que muestra un menu y pide una opcion del menu.
Parametros: Ninguno.
Return: char Opcion del menu elegida. */
char Menu(void)
{
register char d;
printf("\nElige la opcion deseada:\n");
printf("\t0 -- Salir del programa.\n");
printf("\t1 -- Cambiar la matriz A.\n");
printf("\t2 -- Cambiar la matriz B.\n");
printf("\t3 -- Calcular A*B\n");
printf("\t4 -- Calcular B*A\n");
while ((d=getchar())<'0' || d>'4');
return d;
}
/* Rutina que pide el numero de filas o de columnas de una matriz.
Parametros: char *cadena Puntero al string a mostrar.
Return: unsigned Numero de filas o de columnas. */
unsigned PedirTamano(const char *cadena)
{
unsigned valor;
do
{
printf("%s",cadena);
scanf("%u",&valor);
}
while (valor==0 || valor>TAM);
return valor;
}
/* Rutina que cambia una matriz.
Parametros: struct MATRIZ *a Puntero a la matriz que vamos a cambiar.
Return: Ninguno. */
void PedirMatriz(struct MATRIZ *a)
{
register unsigned i,j;
float valor;
76El lenguaje de programación C
a->fila=PedirTamano("\nNumero de filas de la matriz: ");
a->columna=PedirTamano("\nNumero de columnas de la matriz: \n");
for(i=0;i<a->fila;i++)
for(j=0;j<a->columna;j++)
{
printf("M[%u][%u]: ",i,j);
scanf("%f",&valor);
a->matriz[i][j]=valor;
}
}
/* Rutina que multiplica dos matrices. Las matrices se pasan por
puntero pues ello es mas rapido, aunque no se modifican en toda la
funcion.
Parametros: struct MATRIZ *a Puntero a la estructura con la primera
matriz a multiplicar.
struct MATRIZ *b Puntero a la estructura con la segunda
matriz a multiplicar.
struct MATRIZ *res Puntero a la estructura que contendra
el resultado.
Return: int Codigo de error. */
int Multiplicar(const struct MATRIZ *a,const struct MATRIZ *b,struct
MATRIZ *res)
{
register unsigned i,j,k;
if (a->columna!=b->fila)
return ERROR;
res->fila=a->fila;
res->columna=b->columna;
for(i=0;i<a->fila;i++)
for(j=0;j<b->columna;j++)
{
res->matriz[i][j]=0;
for(k=0;k<a->fila;k++)
res->matriz[i][j]+=a->matriz[i][k]*b->matriz[k][j];
}
return OK;
}
/* Rutina que muestra en pantalla el resultado de la operacion.
Parametros: struct MATRIZ *res Puntero a la estructura con el
resultado.
Return: Ninguno. */
void Mostrar(const struct MATRIZ *res)
{
register unsigned i,j;
for(i=0;i<res->fila;i++)
{
for(j=0;j<res->columna;j++)
printf("Res[%u][%u]= %f\n",i,j,res->matriz[i][j]);
printf("\nPulsa Enter para continuar.\n");
getchar();
}
}
77El lenguaje de programación C
int main(void)
{
struct MATRIZ a,b,res;
char d;
a.fila=a.columna=b.fila=b.columna=1;
a.matriz[0][0]=b.matriz[0][0]=1.0;
do
switch(d=Menu())
{
case '0':break;
case '1':PedirMatriz(&a);
break;
case '2':PedirMatriz(&b);
break;
case '3':
if (Multiplicar(&a,&b,&res)==ERROR)
printf("\nNo es posible multiplicar A*B\n");
else
Mostrar(&res);
break;
case '4':
if (Multiplicar(&b,&a,&res)==ERROR)
printf("\nNo es posible multiplicar B*A\n");
else
Mostrar(&res);
break;
}
while (d!='0');
return 0;
}
B.3 - ordenar.c.
/* Programa que ordena un fichero de cualquier tamaño mediante el
algoritmo QuickSort. El fichero contiene como primer elemento un
unsigned con el numero de elementos del fichero, y a continuacion
figuran todos los elementos a ordenar */
#include <stdio.h>
#include <stdlib.h>
/* Rutina que lee el fichero de datos y devuelve un puntero al array
de la memoria reservada.
Parametros: char *nombre Nombre del fichero a leer.
unsigned *num Puntero al unsigned que contendra el numero
de elementos del array.
Return: float * Puntero al array de float, NULL si sucede un error. */
float *LeerFichero(const char *nombre, unsigned *num)
{
FILE *fp;
float *p;
register unsigned i;
78El lenguaje de programación C
if ((fp=fopen(nombre,"rt"))==NULL)
{
printf("\nError, no puedo abrir el fichero: %s\n",nombre);
return NULL;
}
fscanf(fp,"%u\n",num);
if ((p=(float *)calloc(*num,sizeof(float)))==NULL)
{
printf("\nError, memoria insuficiente.\n");
fclose(fp);
return NULL;
}
for(i=0;i<*num;i++)
fscanf(fp,"%f\n",&p[i]);
fclose(fp);
return p;
}
/* Rutina que escribe el fichero de datos ordenado.
Parametros: char *nombre Nombre del fichero donde guardar los datos.
unsigned num Numero de elementos del array.
float *p Puntero al array ordenado.
Return: Ninguno. */
void GuardarFichero(const char *nombre,const unsigned num,const float
*p)
{
FILE *fp;
register unsigned i;
if ((fp=fopen(nombre,"wt"))==NULL)
{
printf("\nError, no puedo crear el fichero: %s\n",nombre);
return;
}
fprintf(fp,"%u\n",num);
for(i=0;i<num;i++)
fprintf(fp,"%f\n",p[i]);
fclose(fp);
}
/* Rutina que ordena un array segun el algoritmo Quick-Sort.
Parametros: float *p Puntero al array a ordenar.
unsigned izq Elemento de la izquierda a ordenar.
unsigned der Elemento de la derecha a ordenar.
Return: Ninguno. */
void QuickSort(float *p,unsigned izq,unsigned der)
{
register unsigned i=izq,j=der;
float val,inter;
val=p[(i+j)/2];
do
{
while (p[i]<val) i++;
while (p[j]>val) j--;
if (i<=j)
79El lenguaje de programación C
{
inter=p[i];
p[i]=p[j];
p[j]=inter;
i++;
j--;
}
}
while (i<=j);
if (izq<j) QuickSort(p,izq,j);
if (i<der) QuickSort(p,i,der);
return;
}
int main(int argc,char *argv[])
{
float *p;
unsigned num;
if (argc!=3)
{
printf("\nModo de uso: %s <fichero1> <fichero2>\n",argv[0]);
return(1);
}
if ((p=LeerFichero(argv[1],&num))==NULL)
return 1;
QuickSort(p,0,num-1);
GuardarFichero(argv[2],num,p);
free(p);
return 0;
}
B.4 - fichero.c.
/* Programa que maneja una pequeña base de datos directamente sobre el
fichero */
#include <stdio.h>
#include <string.h>
/* Definicion de las constantes del programa */
#define TAM 30
#define TAM_BUFFER 10
/* Definicion de los codigos de error */
#define OK 0
#define ERROR 1
/* Definicion de las estructuras de datos del programa */
struct FICHA
{
unsigned long dni;
char nombre[TAM];
char apellido[2][TAM];
};
80El lenguaje de programación C
/* Rutina que muestra un menu en pantalla.
Parametros: Ninguno.
Return: char Opcion elegida. */
char Menu(void)
{
register char d;
printf("\nElige una opcion:\n");
printf("\t0 -- Salir del programa.\n");
printf("\t1 -- Insertar un nuevo elemento.\n");
printf("\t2 -- Buscar un elemento por su dni.\n");
printf("\t3 -- Buscar un elemento por su apellido.\n");
while ((d=getchar())<'0' || d>'3');
return d;
}
/* Rutina que muestra un elemento en pantalla.
Parametros: struct FICHA *ficha Puntero a la estructura con los datos
a mostrar.
Return: Ninguno. */
void Mostrar(const struct FICHA *ficha)
{
printf("\n\nDNI: %lu\n",ficha->dni);
printf("NOMBRE: %s\n",ficha->nombre);
printf("PRIMER APELLIDO: %s\n",ficha->apellido[0]);
printf("SEGUNDO APELLIDO: %s\n",ficha->apellido[1]);
printf("\nPulsa Enter para continuar\n");
getchar();
}
/* Rutina que busca un elemento dado su dni.
Parametros: FILE *fichero Puntero al fichero de trabajo.
unsigned long dni Numero de dni a buscar.
char opcion Opcion de ejecucion, 1 mostrar, 0 no mostrar.
Return: int Codigo de error. */
int BuscarDni(FILE *fichero,const unsigned long dni,const char opcion)
{
struct FICHA ficha;
fseek(fichero,0L,SEEK_SET);
while (fread(&ficha,sizeof(struct FICHA),1,fichero)==1)
if (dni==ficha.dni)
{
if (opcion)
Mostrar(&ficha);
Return OK;
}
return ERROR;
}
/* Rutina que busca por apellidos.
Parametros: FILE *fichero Puntero al fichero de trabajo.
char *apellido Apellido a buscar.
Return: int Codigo de error.*/
81El lenguaje de programación C
int BuscarApellido(FILE *fichero,char *apellido)
{
struct FICHA ficha;
char encontrado=0;
fseek(fichero,0L,SEEK_SET);
while (fread(&ficha,sizeof(struct FICHA),1,fichero)==1)
if (!strcmp(apellido,ficha.apellido[0]) ||
!strcmp(apellido,ficha.apellido[1]))
{
Mostrar(&ficha);
encontrado=1;
}
return (encontrado) ? OK : ERROR;
}
/* Rutina que inserta un nuevo elemento en el fichero.
Parametros: FILE *fichero Puntero al fichero de trabajo.
struct FICHA *ficha Puntero a la ficha a insertar.
Return: int Codigo de error. */
int Insertar(FILE *fichero,const struct FICHA *ficha)
{
if (BuscarDni(fichero,ficha->dni,0)!=ERROR)
return ERROR;
fseek(fichero,0L,SEEK_END);
fwrite(ficha,sizeof(struct FICHA),1,fichero);
return OK;
}
/* Rutina que pide los datos de una ficha.
Parametros: struct FICHA *ficha Puntero a la ficha que contendra los
datos.
char opcion Opcion de ejecucion (0..2).
Return: struct FICHA * Puntero a la ficha que contiene los datos. */
struct FICHA *PedirDatos(struct FICHA *ficha,
const char opcion)
{
switch(opcion)
{
case 0: printf("\nDNI: ");
scanf("%lu",&ficha->dni);
fflush(stdin);
break;
case 1: fflush(stdin);
printf("APELLIDO: ");
strupr(gets(ficha->apellido[1]));
break;
case 2: printf("\nDNI: ");
scanf("%lu",&ficha->dni);
fflush(stdin);
printf("NOMBRE: ");
strupr(gets(ficha->nombre));
printf("PRIMER APELLIDO: ");
strupr(gets(ficha->apellido[0]));
printf("SEGUNDO APELLIDO: ");
strupr(gets(ficha->apellido[1]));
82El lenguaje de programación C
break;
}
return ficha;
}
int main(int argc,char *argv[])
{
FILE *fichero;
struct FICHA ficha;
register char d;
if (argc!=2)
{
printf("\nModo de uso: %s <fichero>\n",argv[0]);
return 1;
}
if ((fichero=fopen(argv[1],"a+b"))==NULL)
{
printf("\nError creando el fichero: %s\n",argv[1]);
return 1;
}
if (setvbuf(fichero,NULL,_IOFBF,
TAM_BUFFER*sizeof(struct FICHA))!=0)
{
printf("\nError creando el buffer para %d elementos.\n",
TAM_BUFFER);
fclose(fichero);
return 1;
}
do
switch(d=Menu())
{
case '0':break;
case '1':if (Insertar(fichero,PedirDatos(&ficha,2))==ERROR)
printf("\nNumero de dni duplicado.\n");
break;
case '2':PedirDatos(&ficha,0);
if (BuscarDni(fichero,ficha.dni,1)==ERROR)
printf("\nDni no existente.\n");
break;
case '3':PedirDatos(&ficha,1);
if (BuscarApellido(fichero,ficha.apellido[1])==ERROR)
printf("\nApellido inexistente.\n");
break;
}
while (d!='0');
fclose(fichero);
return 0;
}
B.5 - arbol.c.
/* Programa que lee las palabras de un fichero y las almacena en un
arbol binario */
#include <stdio.h>
El lenguaje de programación C
#include <ctype.h>
#include <string.h>
#include <stdlib.h>
/* Definicion de la longitud maxima de una palabra */
#define TAM 30
/* Definicion de las estructuras de datos del programa */
struct ARBOL
{
char pal[TAM+1];
struct ARBOL *izq,*der;
};
/* Rutina que lee una palabra del fichero.
Parametros: FILE *fichero Puntero al fichero de donde se leen las
palabras.
char *cadena Array de caracteres donde almacenar las
palabras.
Return: char * Puntero a la cadena con la palabra leida, NULL si
error. */
char *LeerPalabra(FILE *fichero,char *cadena)
{
register char d,i=0;
while ((d=fgetc(fichero))!=EOF && !isalpha(d));
if (d==EOF)
return NULL;
do
cadena[i++]=d;
while (i<TAM && (isalpha(d=fgetc(fichero)) || isdigit(d) ||
d=='_'));
cadena[i]='\0';
return cadena;
}
/* Rutina que crea el arbol binario, leyendo para ello el fichero.
Parametros: char *nombre Nombre del fichero a leer.
Return: struct ARBOL * Puntero a la raiz del arbol creado, NULL si
error. */
struct ARBOL *LeerFichero(char *nombre)
{
FILE *fichero;
char cadena[TAM+1],insertado;
int val;
struct ARBOL *cab=NULL,*p,*q;
if ((fichero=fopen(nombre,"rt"))==NULL)
{
printf("\nError, no puedo leer el fichero: %s\n",nombre);
return(NULL);
}
while (LeerPalabra(fichero,cadena)!=NULL)
{
if ((q=(struct ARBOL *)malloc(sizeof(struct ARBOL)))==NULL)
{
84El lenguaje de programación C
printf("\nError reservando memoria.\n");
fclose(fichero);
return NULL;
}
strcpy(q->pal,cadena);
q->izq=q->der=NULL;
if (cab==NULL)
cab=q;
else
{
p=cab;
insertado=0;
while (!insertado)
if ((val=strcmp(cadena,p->pal))<0)
if (p->izq==NULL)
{
p->izq=p;
insertado=1;
}
else
p=p->izq;
else
if (val>0)
if (p->der==NULL)
{
p->der=q;
insertado=1;
}
else
p=p->der;
else
insertado=1;
}
}
fclose(fichero);
return cab;
}
/* Rutina que muestra por pantalla el arbol ordenado a la vez que
libera la memoria.
Parametros: struct ARBOL *p Puntero al nodo a mostrar.
unsigned *cont Puntero al contador de elementos para
permitir parar la visualizacion.
Return: Ninguno.
*/
void Mostrar(struct ARBOL *p,unsigned *cont)
{
if (p->izq!=NULL)
Mostrar(p->izq,cont);
puts(p->pal);
if (++*cont>21)
{
*cont=1;
printf("\nPulsa Enter para continuar.\n");
getchar();
}
if (p->der!=NULL)
85El lenguaje de programación C
Mostrar(p->der,cont);
free(p);
}
int main(int argc,char *argv[])
{
struct ARBOL *p;
unsigned cont=1;
if (argc!=2)
{
printf("\nModo de uso: %s <fichero>\n",argv[0]);
return 1;
}
if ((p=LeerFichero(argv[1]))==NULL)
return 1;
printf("\n\n\n\n\n\n");
Mostrar(p,&cont);
return 0;
}
No hay comentarios.:
Publicar un comentario