Bueno Dryken no estaría mal , aquí te dejo tu código con algunas mejoras:
- Portabilidad de código utilizando lo que ha dicho daniyo que se me ha adelantado.
- "Limpieza de código" , estructurado en un archivo principal , uno de cabecera y otro con sus funciones.
- Añadida función para pasar de binario a decimal y viceversa(no funcionaba).
- Ahora todas las variables no se declaran todas de golpe solo cuando se necesitan.
- Alguna que otra mejora superficial en alguna parte del código.
Te dejo el código de tu estupenda calculadora:
Archivo principal main.c
#include"funciones.h"
int main()
{
int opc1;
do
{
imprime_menu();
limpiar;
switch(opc1)
{
case 1:
sumar();
break;
case 2:
restar();
break;
case 3:
multiplicacion();
break;
case 4:
division();
break;
case 5:
raiz_cuadrada();
break;
case 6:
potencia();
break;
case 7:
logaritmo();
break;
case 8:
seno();
break;
case 9:
coseno();
break;
case 10:
tangente();
break;
case 11:
cosecante();
break;
case 12:
secante();
break;
case 13:
cotangente();
break;
case 14:
conversion();
break;
case 15:
multiplos();
break;
case 16:
binomio();
break;
case 17:
descuento();
break;
case 18:
multiplicar_matriz();
break;
case 19:
area_triangulo();
break;
case 20:
break;
default :
printf("\nElije una de las opciones mostradas.\n\n"); parar;
limpiar;
}
}
while(opc1!=20);
return 0;
}
Archivo de cabecera "funciones.h"
#ifndef FUNCIONES_H_INCLUDED
#define FUNCIONES_H_INCLUDED
#ifdef __unix__ //Si esta definida la macro __unix__
#include<unistd.h> //Incluimos esta libreria para sleep y system
#elif defined _WIN32 //Si no esta definida, pero esta definida la macro _WIN32
#include<windows.h> //Incluimos esta libreria para Sleep y system
#endif //Termina el if
#ifdef __unix__
#define limpiar system("clear")
#elif defined _WIN32
#define limpiar system("cls")
#endif
#ifdef __unix__
#define parar sleep(2)
#elif defined _WIN32
#define parar Sleep(2500)
#endif
#include<math.h> //Libreria para las operaciones matematicas.
#include<stdio.h> //Libreria para la entrada/salida.
#include<stdint.h> //Libreria con todos los tipos de enteros.
#include<stdlib.h> //Libreria de proposito general aunque la usamos para gestionar la memoria dinamica.
#include<string.h> //Libreria para el manejo de cadenas.
//****************************************//
// CONTROL DEL PROGRAMA *//
//---------------------------------------*//
void imprime_menu();// *//
//****************************************//
//*************************************************//
//FUNCION PARA LLAMAR A LAS CONVERSIONES DE MONEDA*//
//------------------------------------------------*//
void conversion();// *//
//****************************************//
//* SET DE CONVERSION EURO -> MONEDA *//
//****************************************//
void euros_a_pesetas();// *//
void euros_a_yenes();// *//
void euros_a_dolares();// *//
//****************************************//
//* SET DE CONVERSION MONEDA -> EURO *//
//****************************************//
void dolares_a_euros();// *//
void yenes_a_euros();// *//
void pesetas_a_euros();// *//
//****************************************//
//****************************************//
//* SET DE CONVERSION SISTEMAS NUMERICOS *//
//****************************************//
void decimal_a_binario();// *//
void binario_a_decimal();// *//
//****************************************//
//****************************************//
// SET DE OPERACIONES ARITMETICAS *//
//---------------------------------------*//
void sumar();// *//
void restar();// *//
void multiplicacion();// *//
void division();// *//
//****************************************//
//****************************************//
// OPERACION RAIZ *//
//---------------------------------------*//
void raiz_cuadrada();// *//
//****************************************//
//**************************************************//
// OPERACION POTENCIA *//
//-------------------------------------------------*//
void potencia();// *//
uint64_t pow_uint64
(uint64_t base
, uint32_t exp);//*// //**************************************************//
//****************************************//
// OPERACION LOGARITMO *//
//---------------------------------------*//
void logaritmo();// *//
//****************************************//
//****************************************//
// SET DE OPERACIONES TRIGONOMETRICAS *//
//---------------------------------------*//
void seno(); void cosecante();// *//
void coseno(); void secante();// *//
void tangente(); void cotangente();// *//
//****************************************//
//****************************************//
// SET DE OPERACIONES CON MATRICES *//
//---------------------------------------*//
void multiplicar_matriz();// *//
//****************************************//
//****************************************//
// SET DE OPERACIONES DE AREAS *//
//---------------------------------------*//
void area_triangulo();// *//
//****************************************//
//****************************************//
// SET DE OTRAS OPERACIONES *//
//---------------------------------------*//
void multiplos();// *//
void binomio();// *//
void descuento();// *//
void invertir_cadena(char *cadena);// *//
//****************************************//
#endif // FUNCIONES_H_INCLUDED
Archivo con las definiciones de las funciones "funciones.c"
#include "funciones.h"
void imprime_menu()
{
printf("\nElije la operaci%cn a realizar: ",162); printf("\n-----------------------------"); printf("\n\n1-Suma\t\t\t8-Sen\t\t14-Conversor"); printf("\n2-Resta\t\t\t9-Cos\t\t15-Conocer m%cltiplos",163); printf("\n3-Multiplicaci%cn\t10-Tang\t\t16-Teorema Binomio",162); printf("\n4-Divisi%cn\t\t11-Cosec\t17-Calcular un descuento",162); printf("\n5-Ra%cz\t\t\t12-Sec\t\t18-Multiplicar 2 matrices",161); printf("\n6-Potencia\t\t13-Cotang\t19-Area de un triangulo"); printf("\n7-Logaritmo\t\t\t\t20-Salir\t\t\t"); }
void conversion()
{
int opc2=0;
do
{
printf("\nElije el formato:\n"); printf("-----------------\n\n"); printf("1-Euros->Pesetas\t\t2-Pesetas->Euros\n\n3-Euros->Dolares\t\t4-Dolares->Euros\n\n5-Euros->Yenes\t\t\t6-Yenes->Euros\n\n7-Decimal->Binario\t\t8-Binario->Decimal\n\n9-Volver\t"); limpiar;
switch(opc2)
{
case 1:
euros_a_pesetas();
break;
case 2:
pesetas_a_euros();
break;
case 3:
euros_a_dolares();
break;
case 4:
dolares_a_euros();
break;
case 5:
euros_a_yenes();
break;
case 6:
yenes_a_euros();
break;
case 7:
decimal_a_binario();
break;
case 8:
binario_a_decimal();
break;
case 9:
break;
default :
printf("\nElije una de las opciones mostradas.\n\n"); parar;
limpiar;
}
}
while(opc2!=9);
}
void euros_a_pesetas()
{
float num;
printf("\nIntroduce la cantidad de euros a transformar:\t"); printf("\nSon: %f Pesetas", num
*166); }
void pesetas_a_euros()
{
float num;
printf("\nIntroduce la cantidad de pesetas a transformar:\t"); printf("\nSon: %f Euros",num
/166); }
void euros_a_dolares()
{
float num;
printf("\nIntroduce la cantidad de euros a transformar:\t"); printf("\nSon: %f Dolares",num
/0.8136); }
void dolares_a_euros()
{
float num;
printf("\nIntroduce la cantidad de dolares a transformar:\t"); printf("\nSon: %f Euros",num
/1.2616); }
void euros_a_yenes()
{
float num;
printf("\nIntroduce la cantidad de euros a transformar:\t"); printf("\nSon: %f Yenes",num
*97.7538829); }
void yenes_a_euros()
{
float num;
printf("\nIntroduce la cantidad de yenes a transformar:\t"); printf("\nSon: %f Euros",num
*0.0102297727); }
void sumar()
{
double numero1, numero2;
printf("\nIntroduce el primer n%cmero a sumar:\t",163); printf("Introduce el segundo n%cmero a sumar:\t",163); printf("\nEl resultado es: %f",numero1
+numero2
); }
void restar()
{
double numero1, numero2;
printf("\nIntroduce el primer n%cmero a restar:\t",163); printf("Introduce el segundo n%cmero a restar:\t",163); printf("\nEl resultado es: %lf",numero1
-numero2
); }
void multiplicacion()
{
double numero1, numero2;
printf("\nIntroduce el primer multiplicante:\t"); printf("Introduce el segundo multiplicante :\t"); printf("\nEl resultado es: %lf",numero1
*numero2
); }
void division()
{
double numero1, numero2;
printf("\nIntroduce el dividendo:\t"); printf("Introduce el divisor:\t"); printf("\nEl cociente es: %lf\nEl resto de la division entera es: %d",numero1
/numero2
, ((int)numero1
)%(int)(numero2
));
}
void raiz_cuadrada()
{
double numero1;
printf("\nIntroduce el n%cmero del cual deseas sacar la raiz:\t",163); }
void potencia()
{
double numero1, numero2;
printf("\nIntroduce la base:\t"); printf("Introduce el exponente:\t"); printf("\nEl resultado es: %lf",pow(numero1
,numero2
)); }
void logaritmo()
{
double numero1;
printf("\nIntroduce el n%cmero (base 10 por defecto):\t",163); }
void seno()
{
double numero1;
printf("\nIntroduce el n%cmero a hallar el seno:\t",163); printf("\nEl resultado es: %f",sin(numero1
)); }
void coseno()
{
double numero1;
printf("\nIntroduce el n%cmero a hallar el coseno:\t",163); printf("\nEl resultado es: %f",cos(numero1
)); }
void tangente()
{
double numero1;
printf("\nIntroduce el n%cmero a hallar la tangente:\t",163); printf("\nEl resultado es: %lf",tan(numero1
)); }
void cosecante()
{
double numero1;
printf("\nIntroduce el n%cmero a hallar el cosecante:\t",163); }
void secante()
{
double numero1;
printf("\nIntroduce el n%cmero a hallar el secante:\t",163); }
void cotangente()
{
double numero1;
printf("\nIntroduce el n%cmero a hallar el cotangente:\t",163); }
void multiplos()
{
unsigned long int num,cifras;
printf("Introduce el numero a conocer sus m%cltiplos ---> ",163); printf("%cHasta que cifras deseas conocer los m%cltiplos del %lu ---> ",168,163,num
); for(int i=1; cifras!=0; ++i)
{
--cifras;
}
}
void binomio()
{
long n, k, nf, kf, resta, restaf, v, w;
printf( "\nIngrese n y k: " ); scanf( "%ld %ld", &n
, &k
); nf = 1;
kf = 1;
resta = n - k;
restaf = 1;
while ( n > 1 ) /* factorial de n */
{
nf *= n--;
}
while ( k > 1 ) /* factorial de k */
{
kf *= k--;
}
while ( resta > 1 ) /* factorial de (n - k) */
{
restaf *= resta--;
}
v = kf * restaf; /* k! * (n - k)! */
w = nf / v; /* n! / (k! * (n - k)!) */
/* resultados */
"k! = %ld\n"
"(n - k)! = %ld\n"
"k! * (n - k)! = %ld\n"
"n! / [k! (n - k)!] = %ld\n"
"--------------------------\n"
"Resultado final (ncr): %ld\n", nf, kf, restaf, v, w, w );
}
void descuento()
{
int opcioniva;
char producto[25];
double precio, descuento, res, preciodesc, precioiva, precioiva2;
printf("\nIntroduce el nombre del producto: "); fgets(producto
, sizeof(producto
), stdin
); producto
[strlen(producto
)-1] = '\0'; printf("\n%cDicho producto incluye IVA?:\n\n1-Si 2-No ",168); if(opcioniva==1)
{
printf("\nIntroduce el precio del producto: "); printf("Introduce su descuento en porcentaje: "); scanf("%lf", &descuento
);
preciodesc=precio*descuento/100;
res=precio-preciodesc;
printf("\nEl descuento del %s es de %lf euros", producto
, preciodesc
); printf("\n\nEl precio final del %s es de %lf euros", producto
, res
); }
else
{
printf("\nIntroduce el precio del producto: "); printf("Introduce su descuento en porcentaje: "); scanf("%lf", &descuento
); precioiva=precio*18/100;
precioiva2=precioiva+precio;
preciodesc=precioiva2*descuento/100;
res=precioiva2-preciodesc;
printf("\nEl precio del %s con iva es de %lf euros\n", producto
, precioiva2
); printf("\nEl descuento del %s es de %lf euros", producto
, preciodesc
); printf("\n\nEl precio final del %s es de %lf euros", producto
, res
); }
}
void multiplicar_matriz()
{
int n3,m3,o3,p3,i3,j3,k3,a3[10][10],b3[10][10],c3[10][10];
printf("\n\n%cCuantas filas tendra la matriz A?: ",168); printf("\n%cCuantas columnas tendra la matriz A?: ",168); printf("\n%cCuantas filas tiene la matriz B?: ",168); printf("\n%cCuantas columnas tendra la matriz B?: ",168); /*Reconoce si se puede realizar la multiplicacion*/
if(m3!=p3)
{
printf("\n\nEl n%cmero de columnas de la matriz \"A\" es diferente al n%cmero de filas \nde la matriz \"B\"",163,163); printf("\n\nEl producto matricial no es posible de realizar.\n\n"); }
else
{
for (i3=1; i3<=m3; i3++) /*Ciclo anidado que captura la matriz A*/
{
for (j3=1; j3<=n3; j3++)
{
printf("\nDame el elemento A(%i,%i)(fila/columna): ", i3
,j3
); scanf("%i", &a3
[i3
][j3
]); }
}
for (i3=1; i3<=o3; i3++) /*Ciclo anidado que captura la matriz B*/
{
for (j3=1; j3<=p3; j3++)
{
printf("\nDame el elemento B(%i,%i)(fila/columna): ", i3
,j3
); scanf("%i", &b3
[i3
][j3
]); }
}
for (i3=1; i3<=m3; i3++) /*Ciclo anidado que multiplica las 2 matrices*/
{
for (j3=1; j3<=p3; j3++)
{
c3[i3][j3]=0; /*Limpia la variable para entrar de nuevo al for*/
for (k3=1; k3<=n3; k3++);
c3[i3][j3]=(c3[i3][j3]+a3[i3][k3])*b3[k3][j3];
}
}
printf("\n\nLa matriz resultante de la multiplicacion es: \n"); /*Ciclo que imprime la matriz resultante*/
for (i3=1; i3<=m3; i3++);
{
for(j3=1; j3<=p3; j3++);
}
}
}
void area_triangulo()
{
double numero1,numero2;
printf("\nIntroduce la base:\t"); printf("Introduce la altura:\t"); printf("El %crea del triangulo es %lf",160,(numero1
*numero2
)/2); }
void decimal_a_binario()
{
uint64_t dec;
printf("Dame un numero en decimal:");
char *resultado
=calloc(64*8,sizeof(char)); char *presultado=resultado;
if(dec/2==0) {}
else
{
while(dec!=1)
{
*resultado=(dec%2)+48;
dec/=2;
++resultado;
}
*resultado=49;
invertir_cadena(presultado);
printf("Su numero en binario es %s",presultado
); }
}
void binario_a_decimal()
{
char *bin
=calloc(8,sizeof(char)); printf("Dame un numero en binario (hasta 64 bits):"); uint64_t res=0;
int i=0;
char *p_f_bin
=bin
+strlen(bin
)-1; while(p_f_bin!=bin-1)
{
if((*(p_f_bin)-48)==1)
{
res+=pow_uint64(2,i);
}
++i;
--p_f_bin;
}
printf("Su numero en decimal es: %I64u",res
); }
void invertir_cadena(char *cadena)
{
char *p_f_cadena
=cadena
+strlen(cadena
)-1; char save=0;
for(int i = 0; cadena+i<=p_f_cadena; ++i)
{
save=*(cadena+i);
*(cadena+i)=*p_f_cadena;
*p_f_cadena=save;
--p_f_cadena;
}
}
uint64_t pow_uint64
(uint64_t base
, uint32_t exp) {
uint64_t ret = 1;
for (uint32_t i
= 0; i
< exp; ++i
) ret *= base;
return ret;
}