Bienvenidos sean a este post, hoy preparense porque venimos con un tema para largo.
Para este tema vamos a crear un proyecto nuevo y el programa nos permitira obtener el area o perimetro tanto de un circulo, cuadrado o triangulo y le permitiremos al usuario poder elegir entre ellos asi como repetir el proceso toda las veces que necesite, para ello vamos a crear primero un directorio con el nombre calcular (pueden usar otro) pero dentro debemos crear un directorio con el nombre libs porque en este guardaremos los archivos necesarios, esta debe ser la estructura de nuestros directorios:
calcular/
└── libs
Nuestro siguiente paso sera la creacion de los codigos necesarios, para ello crearemos una serie de archivos en el directorio libs, comencemos con el primero que llevara el nombre de circulo.h y le agregaremos el siguiente codigo:
libs/circulo.h
double area_circulo(int radio);
double perim_circulo(int radio);
Aqui declaramos los prototipos de las funciones que usaremos para calcular el area y perimetro del circulo, nuestro siguiente paso sera crear otro archivo en el directorio libs con el nombre de circulo.c y le agregaremos el sigueinte codigo:
libs/circulo.c
#include "circulo.h"
static int cuadrado(int valor);
const double PI = 3.14159265359;
double area_circulo(int r)
{
return (double) PI * cuadrado(r);
}
double perim_circulo(int r)
{
return (double) PI * 2 * r;
}
static int cuadrado (int v)
{
return v * v;
}
Aqui definiremos los prototipos del archivo anterior pero con un par de temas mas, lo primero que haremos sera incluir al archivo circulo.h, despues declaramos un prototipo de una funcion llamada cuadrado y esta sera de tipo static, despues definiremos una constante que representa el valor de PI la cual tambien sera static, nuestro siguiente paso sera definir la funcion para calcular el area del circulo y en ella usaremos la funcion que declaramos como prototipo anteriormente, en ella usaremos a la constante tambien, devolveremos el resultado del calculo pero con una particularidad, hacemos un «casteo» antes de enviarlo, esto significa que el valor devuelto sera de tipo double (igual que la funcion) porque recuerden que el valor ingresado es de tipo int y gracias al «casteo» hacemos una «conversion» pero de una forma muy limitada, la siguiente funcion es muy similar pero para calcular el perimetro del circulo, en este caso hacemos otro «casteo» por lo mismo que comentamos anteriormente, por ultimo definimos la funcion que declaramos al comienzo, recuerden asignarle el static y esta nos devolvera la multiplicacion entre si del valor enviado, es decir el cuadrado del valor enviado y lo usamos para calcular el area del circulo, con esto completamos los archivos necesarios para calcular el area y el perimetro del circulo, pasemos a la siguiente figura y para ello crearemos en el directorio libs un nuevo archivo con el nombre de cuadrado.h y le agregaremos el siguiente codigo:
Nota: Sobre static en una funcion hablaremos mas adelante en otro post, continuemos.
libs/cuadrado.h
int area_cuadrado(int lado);
int perim_cuadrado(int lado);
Aqui definiremos los prototipos de nuestras funciones, nuestro siguiente paso sera definirlas y para ello crearemos en libs otro archivo con el nombre de cuadrado.c y le agregaremos el siguiente codigo:
libs/cuadrado.c
#include "cuadrado.h"
int area_cuadrado(int l)
{
return l * l;
}
int perim_cuadrado(int l)
{
return 4 * l;
}
Este va a ser un poco mas simple, primero incluiremos al archivo de encabezado que creamos anteriormente, lo siguiente sera definir las dos funciones, la primera sera para calcular el area de un cuadrado y el segundo el perimetro con sus respectiva formulas y en ambos casos devolveremos los valores, simple no? pasemos al siguiente archivo y para ello nuevamente en libs haremos un nuevo archivo con el nombre de triangulo.h y le agregaremos el siguiente codigo:
libs/triangulo.h
double area_triangulo(int base, int altura);
int perim_triangulo(int lado);
Como en los casos anteriores aqui simplemente declaramos los prototipos de las funciones que usaremos, lo siguiente sera crear en libs un nuevo archivo con el nombre de triangulo.c y le agregaremos el siguiente codigo:
libs/triangulo.c
#include "triangulo.h"
double area_triangulo(int b, int a)
{
return (double)(b * a)/2;
}
int perim_triangulo(int lado)
{
return lado * 3;
}
De vuelta primero debemos incluir el archivo donde estan los prototipos, y de vuelta solo definiremos los dos prototipos, para la funcion del area volveremos a usar el casteo porque los valores ingresados son de tipo int y debemos devolver uno de tipo double, y para el calculo del perimetro solo lo haremos para triangulos equilateros, esto lo hice asi solo para facilitar el codigo, esto no quita que puedan modificarlo para el calculo de otros triangulo, como pueden ver este tambien fue un codigo simple, ahora solo nos resta ver el encargado de poder utilizar estas funciones, para ello nuevamente en libs crearemos un archivo con el nombre de libreria.h y le agregaremos el siguiente codigo:
libs/libreria.h
#include <stdio.h>
#include "circulo.h"
#include "cuadrado.h"
#include "triangulo.h"
int menu();
void calcular(int figura, int calculo);
Este sera el encargado de las funciones que interactuan con el usuario en el programa, por eso para esto incluimos no solamente a la libreria de siempre sino a los otros tres archivos de encabezado, no los de codigo sino los de encabezado, por ultimo tenemos los prototipos de nuestras funciones, con todo comentado pasemos a crear en libs otro archivo con el nombre de libreria.c y le agregaremos el siguiente codigo:
libs/libreria.c
#include "libreria.h"
int menu()
{
int figura, calculo;
printf("1)Cuadrado\n2)Triangulo\n3)Circulo\n4)Salir\n");
printf("Elige una figura: ");
scanf("%d", &figura);
switch(figura)
{
case 1:
case 2:
case 3:
printf("1)area\n2)perimetro\n");
printf("Elige el calculo: ");
scanf("%d", &calculo);
calcular(figura, calculo);
break;
case 4:
printf("Gracias por usarlo\n");
return -1;
break;
default:
printf("Debes elegir entre 1 y 4\n");
break;
}
}
void calcular(int figura, int calculo)
{
int lado, base, altura, radio;
switch(figura)
{
case 1:
printf("Ingresa un lado: ");
scanf("%d", &lado);
switch(calculo)
{
case 1:
printf("Area: %d\n",
area_cuadrado(lado));
break;
case 2:
printf("Perimetro: %d\n",
perim_cuadrado(lado));
break;
default:
printf("Debes elegir entre 1 y 2\n");
break;
}
break;
case 2:
switch(calculo)
{
case 1:
printf("Ingresa la base y la altura: ");
scanf("%d%d", &base, &altura);
printf("Area: %.3f\n",
area_triangulo(base,altura));
break;
case 2:
printf("Ingresa un lado: ");
scanf("%d", lado);
printf("Perimetro: %d\n",
perim_triangulo(lado));
break;
default:
printf("Debes elegir entre 1 y 2\n");
break;
}
break;
case 3:
printf("Ingresa el radio: ");
scanf("%d", &radio);
switch(calculo)
{
case 1:
printf("Area: %.3f\n",
area_circulo(radio));
break;
case 2:
printf("Perimetro: %.3f\n",
perim_circulo(radio));
break;
default:
printf("Debes elegir entre 1 y 2\n");
break;
}
break;
}
printf("======================\n");
}
Como siempre al comienzo incluiremos el archivo de encabezado correspondiente y luego definiremos los prototipos, analicemos la primera funcion:
int menu()
{
int figura, calculo;
printf("1)Cuadrado\n2)Triangulo\n3)Circulo\n4)Salir\n");
printf("Elige una figura: ");
scanf("%d", &figura);
switch(figura)
{
case 1:
case 2:
case 3:
printf("1)area\n2)perimetro\n");
printf("Elige el calculo: ");
scanf("%d", &calculo);
calcular(figura, calculo);
break;
case 4:
printf("Gracias por usarlo\n");
return -1;
break;
default:
printf("Debes elegir entre 1 y 4\n");
break;
}
}
Primero declaramos dos variables, las cuales las usaremos en nuestros menues, en el primer caso mostraremos una serie de opciones entre las cuales elegiremos la figura o la opcion de salir y cada una con su respectivo numero, este valor lo almacenaremos en la primer variable que es figura, despues por medio de un switch verificaremos la opcion ingresada, aqui usamos una opcion interesante, como del 1 al 3 son las figuras simplemente en el case 3 ponemos el menu para elegir el area o el perimetro, como no hay un break cuando encuentre alguna de esas opciones seguiran hasta el 3, aqui elegimos el tipo de calculo y este lo almacenamos en la otra variable llamada calculo, ya con ambos datos procedamos a llamar a la otra funcion y le pasamos ambos variables, en el case 4 mostramos un mensaje y hacemos que devuelva el valor de -1, ya veremos porque, pero con esto saldriamos del programa, por ultimo agregamos un default para notificar que debemos elegir entre 1 y 4, con todo comentado pasemos a la siguiente funcion:
void calcular(int figura, int calculo)
{
int lado, base, altura, radio;
switch(figura)
{
case 1:
printf("Ingresa un lado: ");
scanf("%d", &lado);
switch(calculo)
{
case 1:
printf("Area: %d\n",
area_cuadrado(lado));
break;
case 2:
printf("Perimetro: %d\n",
perim_cuadrado(lado));
break;
default:
printf("Debes elegir entre 1 y 2\n");
break;
}
break;
case 2:
switch(calculo)
{
case 1:
printf("Ingresa la base y la altura: ");
scanf("%d%d", &base, &altura);
printf("Area: %.3f\n",
area_triangulo(base,altura));
break;
case 2:
printf("Ingresa un lado: ");
scanf("%d", lado);
printf("Perimetro: %d\n",
perim_triangulo(lado));
break;
default:
printf("Debes elegir entre 1 y 2\n");
break;
}
break;
case 3:
printf("Ingresa el radio: ");
scanf("%d", &radio);
switch(calculo)
{
case 1:
printf("Area: %.3f\n",
area_circulo(radio));
break;
case 2:
printf("Perimetro: %.3f\n",
perim_circulo(radio));
break;
default:
printf("Debes elegir entre 1 y 2\n");
break;
}
break;
}
printf("======================\n");
}
Esta sera la encargada de efectuar los calculos, para ello tomara los dos valores como argumentos pero lo primero que haremos sera declarar cuatro variables que seran las encargadas de recibir los valores para calcular, despues tenemos un switch que evalua la figura recibida, como el case 1 es para los cuadrados le solicitaremos un lado, despues tenemos otro switch donde evaluaremos el valor del calculo y en base a ese llamaremos a una funcion u otra en cada case y mostraremos el resultado en cada uno, tambien tenemos un default para cuando un valor esta por fuera de 1 y 2, en los otros case es similar pero en el case 2 tenemos otra situacion, dado que para calcular el area necesitaremos la base y la altura de este, por lo tanto en el case 1 recien le pediremos esos datos y mostraremos el resultado de la funcion, en cambio en el case 2 le pediremos uno de los lados, recuerden que esto es para calculos de triangulo equilateros, y de vuelta tnemos un default para indicar que debe ingresar el 1 o el 2, en el case 3 volvemos a repetir la estructura del case 1 pero en lugar de pedir un lado solicitamos el radio porque ahora seran los circulos, y despues mostraremos la salida de cada funcion respectiva y el mismo default, por ultimo por fuera de todo tenemos un simple divisor entre pasadas del menu, ya lo veran cuando lo ejecutemos.
Con todo esto comentado ya tenemos nuestras «librerias» creadas pero todavia nos falta el programa, para ello en la raiz de nuestro directorio, calcular si usaron el nombre sugerido, crearemos un nuevo archivo llamado program.c y le agregaremos el siguiente codigo:
program.c
#include "libs/libreria.h"
int main()
{
for(;;)
{
int valor = menu();
if (valor == -1) break;
}
return 0;
}
En este caso solo incluimos a la libreria de las funciones, esta ya incluye a stdio.h, y nos concedera todos los accesos que necesitemos, despues en el main tendremos un bucle for «infinito» dado que no tiene forma de detenerse, dentro del bloque definiremos una variable de tipo int que contedra el valor devuelto por la funcion menu, en realidad no devuelve nada pero si lo hara cuando usemos la opcion 4, por lo tanto el siguiente condicional solo se ejecutara cuando elijamos la opcion 4 y usara un break para salir del bucle y finalizar el programa de lo contrario volvera a llamar a la funcion menu, con todo esto comentado veamos la estructura final del programa:
calcular/
├── libs
│ ├── circulo.c
│ ├── circulo.h
│ ├── cuadrado.c
│ ├── cuadrado.h
│ ├── libreria.c
│ ├── libreria.h
│ ├── triangulo.c
│ └── triangulo.h
└── program.c
Con todo esto comentado podemos pasar a compilarlo, en este caso debera ser de la siguiente forma:
$ gcc libs/*.c program.c -o program
Para que podamos tener todo nuestro codigo disponible de lo contrario devolvera un error, si se compilo perfectamente podemos pasar a probarlo y ver como trabaja mediante el siguiente video
Como pueden ver funciono perfectamente y esto seria algo mas parecido a lo que veremos en codigos mas extensos y no los simples ejemplos que pudimos ver durante este curso.
En resumen, hoy hemos visto como crear un programa con multiples archivos, como dividimos las distintas tareas en archivos, asi como creamos un archivo en el cual podemos anidar todas nuestras funciones del programa como hicimos en libreria.h, espero les haya gustado y puedes seguirme en tumblr, Twitter o Facebook para recibir una notificacion cada vez que subo un nuevo post en este blog, nos vemos en el proximo post.


Donación
Es para mantenimento del sitio, gracias!
$1.50
