En mis ratos libres me he puesto a hacer una calculadora algo simple. Tiene las siguientes funciones:
-Suma -Seno -Conocer multiplos
-Resta -Coseno -Teorema Binomio
-Multiplicacion -Tangente -Calcular un descuento
-Division -Cosecante -Multiplicar 2 matrices
-Raiz -Secante -Area de un triangulo
-Potencia -Cotangente
-Logaritmo -Conversor
Por ejemplo, el conversor nos permite transformar el valor de distintos tipos de monedas. Tambien permite pasar de decimal a binario.
Espero que con el tiempo esta calculadora mejore y tengas mas funciones y sea mas compleja.
PD: Hay algunas cosas como el teorema del binomio y el conversor de decimal a binario que no es mio, lo he incrustado en el code para abarcar mas.
PD2: Lo siento pero el goto no hay manera de reemplazarlo por otra funcion :huh:
Versión 0.2
- Code simplificado, suprimida la libreria iostream
- Mejorada la limpieza del buffer
- Solucionada la ausencia de un break en los case del switch
- Eliminado el goto y sustituido
- Corregidos pequeños errores
Versión 0.3
- Ahora se utilizan menos variables
- Codigo mas comprimido.
- El codigo es portable, multiplataforma
- Agregado nombre del programa a la consola (solo aparece en Win32)
- Diseñada nueva interfaz y nuevo menu
- Corregidas tildes en textos
- Varios bugs menores
Versión 0.4
- Codigo mas ordenado y limpio
- Agregada Barra de transicion al menu
- Añadida la funcion Angulos de un triangulo
- Añadida la funcion Conversor de segundos a minutos y horas
- Añadida la funcion Factorial
- Añadida la funcion Conocer numeros primos
- Añadido el Teorema de Pitagoras
- Añadida la Serie de Fibonacci
Versión 0.5
- Ahora se almacenan los resultados de las operaciones automaticamente en un archivo de texto (localizado en la misma raiz que la calc)
- Pequeño bug al volver al menu
- Solucionado problema con el buffer en saltos de linea
- Agregadas tildes a las palabras
Versión 0.6 - 8/8/12
- Corrección de tildes en archivo de texto generado
- Pequeña mejora en la GUI
- Añadida la funcion Binario a decimal
- Añadida la funcion Decimal a Hexadecimal
- Añadida la funcion Hexadecimal a Decimal
- Añadida la funcion MCD y MCM
- Añadida la funcion Área de un círculo
- Añadida la funcion Longitud de un circulo
Versión 0.7 -20/10/12
- Solucionado importante bug (ingreso de caracteres en variables enteras)
- Arreglados bastantes bugs menores
- Compatible con 64 bits
- Cambios en la GUI
- Optimizado el código de la Serie de Fibonacci y el del conversor de Decimal a Binario
- Añadido conversión de Decimal a Octal y viceversa
Código v0.7http://pastebin.com/Bz2x1ZS3
¡Tremendo aporte! Felicidades por el trabajo , bien si no te importa te hago unas cuantas críticas constructivas:
- Primero de todo si puedes postear el código con las etiquetas GeSHi mejor¿cómo? seleccionas el código en C++ y donde pone GeSHi despliegas y pon C++.
- En el primer scanf que haces pones el especificador de formato para enteros como %i , pero es %d el que debes de poner
- El primer goto lo puedes reemplazar por un:
do
{
/*aqui el codigo*/
}while(op1!=20)
- Deberias tener varias funciones para cada cosa , no todo en el main , te quedaría un código mucho mas limpio y lo mas importante creo que podrias quitarte el goto del final.
- La función para limpiar el buffer no está definida en el estandar de C , esta funcion se utiliza solo con el estandar de salida 'stdout'.Para solucionar los saltos de los scanf etc.. lee las chinchetas del subforo o utiliza esta función(mejor lee las chinchetas):
char ch;
while( (ch = fgetc(stdin)) != EOF && ch != '\n' ){}
- No es necesario llamar al sistema para hacer una pausa en vez de system("pause"); utiliza mejor printf combinado getchar():
printf("Presione una tecla para continuar . . .\n");
getchar();
- Hay un error en la línea 21 , no puedes asignar a x un número , se lo tienes que asignar a x[cifras]
- El conversor de decimal a binario no me funciona y el que lo ha hecho tiene poca idea :xD
- No me parece bueno que solo por poner el título de la ventana el código no sea portable.
- Si vas a utilizar C++ utilizalo para todo ¿no? o sea, tienes cin , pero utilizas scanf y tienes cout pero utilizas printf.
- Añadido:Tienes que poner los break; al final de cada case en los switch.
De momento esto , a ver si te encuentro más cosillas.
¡Un saludo! ;-)
avesudra me alegra muchisimo que te guste, y lo de las criticas me encanta, siempre es bueno saber como mejorar.
-Lo de las etiquetas Geshi no lo sabia, ok, colocado.
-cambiado %i por %d (me extraña que no hubiera error).
Por cierto, el sustituto al goto no se muy bien como funciona...
do
{
/*aqui el codigo*/
}while(op1!=20)
¿Donde pone el codigo que se supone que debo de poner?, tendria que retroceder para volver al menu, pero no creo que haya que colocar el menu entero de nuevo ahi dentro...seria una locura.
Otra cosilla, el error de la linea 21 en principio deberia ser tal como dices pero es que si no agrego un entero no se obtiene el resultado el binario...investigare mas sobre el tema. ademas no se porque no te ira el conversor a Binario...probado por mi en dev-c++ en otro tendria que probarlo.
Gracias compañero por todas las criticas, a medida que vaya mejorando el code lo ire actualizando, ya lo ire avisando. Saludos!
Te aconsejo que no uses dev-cpp... errores de ese tipo hay muchos(con respecto a la funcion) aunque a mi tampoco me ha dado fallos... Lo del %d o el %i no sabía que diese igual así que por eso sin problema. Con respecto a do{}while(opc1!=20); la opción 20 de tu menú es salir , esto en pseudo código es hacer mientras la opción que metamos no sea igual que 20 , si es 20 se sale.Aquí te dejo el código que he metido dentro de ese do while aunque todavia tiene problemas.Mira el post de arriba que voy a seguir añadiendo cosas.
do
{
printf("\nElije la operaci%cn a realizar: ",162);
printf("\n-----------------------------");
printf("\n\n1-Suma\t\t\t8-Sen\t\t14-Conversor",163);
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",161);
printf("\n7-Logaritmo\t\t\t\t20-Salir\t\t\t",161);
scanf("%d", &opc1);
system("cls");
switch(opc1)
{
case 1:
printf("\nIntroduce el primer n%cmero a sumar:\t",163);
scanf("%f",&numero1);
printf("Introduce el segundo n%cmero a sumar:\t",163);
scanf("%f",&numero2);
printf("\nEl resultado es: %f",numero1+numero2);
break;
case 2:
printf("\nIntroduce el primer n%cmero a restar:\t",163);
scanf("%f",&numero1);
printf("Introduce el segundo n%cmero a restar:\t",163);
scanf("%f",&numero2);
printf("\nEl resultado es: %f",numero1-numero2);
break;
case 3:
printf("\nIntroduce el primer multiplicante:\t");
scanf("%f",&numero1);
printf("Introduce el segundo multiplicante :\t");
scanf("%f",&numero2);
printf("\nEl resultado es: %f",numero1*numero2);
break;
case 4:
printf("\nIntroduce el dividendo:\t");
scanf("%i",÷ndo);
printf("Introduce el divisor:\t");
scanf("%i",&divisor);
cociente=dividendo/divisor;
resto=dividendo-(cociente*divisor);
printf("\nEl cociente es: %i\nEl resto es: %i",cociente, resto);
break;
case 5:
printf("\nIntroduce el n%cmero del cual deseas sacar la raiz:\t",163);
scanf("%f",&numero1);
res=sqrt(numero1);
printf("\nEl resultado es: %f", res);
break;
case 6:
printf("\nIntroduce la base:\t");
scanf("%f",&numero1);
printf("Introduce el exponente:\t");
scanf("%f",&numero2);
res=pow(numero1,numero2);
printf("\nEl resultado es: %f",res);
break;
case 7:
printf("\nIntroduce el n%cmero (base 10 por defecto):\t",163);
scanf("%f",&numero1);
res = log10(numero1);
printf("\nEl resultado es: %f",res);
break;
case 8:
printf("\nIntroduce el n%cmero a hallar el seno:\t",163);
scanf("%f",&numero1);
res=sin(numero1);
printf("\nEl resultado es: %f",res);
break;
case 9:
printf("\nIntroduce el n%cmero a hallar el coseno:\t",163);
scanf("%f",&numero1);
res=cos(numero1);
printf("\nEl resultado es: %f",res);
break;
case 10:
printf("\nIntroduce el n%cmero a hallar la tangente:\t",163);
scanf("%f",&numero1);
res=tan(numero1);
printf("\nEl resultado es: %f",res);
break;
case 11:
printf("\nIntroduce el n%cmero a hallar el cosecante:\t",163);
scanf("%f",&numero1);
res=asin(numero1);
printf("\nEl resultado es: %f",res);
break;
case 12:
printf("\nIntroduce el n%cmero a hallar el secante:\t",163);
scanf("%f",&numero1);
res=acos(numero1);
printf("\nEl resultado es: %f",res);
break;
case 13:
printf("\nIntroduce el n%cmero a hallar el cotangente:\t",163);
scanf("%f",&numero1);
res=atan(numero1);
printf("\nEl resultado es: %f",res);
break;
case 14:
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\t6-Yenes\\Euros\n\n7-Decimal\\Binario\t8-Volver\t");
scanf("%d",&opc2);
system("cls");
switch(opc2)
{
case 1:
printf("\nIntroduce la cantidad de euros a transformar:\t");
scanf("%f", &euro);
peseta=euro*166;
printf("\nSon: %f Pesetas", peseta);
break;
case 2:
printf("\nIntroduce la cantidad de pesetas a transformar:\t");
scanf("%f",&peseta);
euro=peseta/166;
printf("\nSon: %f Euros",euro);
break;
case 3:
printf("\nIntroduce la cantidad de euros a transformar:\t");
scanf("%f",&euro);
dolar=euro/0.8136;
printf("\nSon: %f Dolares",dolar);
break;
case 4:
printf("\nIntroduce la cantidad de dolares a transformar:\t");
scanf("%f",&dolar);
euro=dolar/1.2616;
printf("\nSon: %f Euros",euro);
break;
case 5:
printf("\nIntroduce la cantidad de euros a transformar:\t");
scanf("%f",&euro);
yen=euro*97.7538829 ;
printf("\nSon: %f Yenes",yen);
break;
case 6:
printf("\nIntroduce la cantidad de yenes a transformar:\t");
scanf("%f",¥);
euro=yen*0.0102297727;
printf("\nSon: %f Euros",euro);
break;
case 7:
printf("\nIntroduce el n%cmero a convertir:\t",163);
scanf("%d",&m);
while( (ch = fgetc(stdin)) != EOF && ch != '\n' ) {}
b(m,num_cifras(m));
getchar();
system("cls");
break;
case 8:
break;
default :
printf("\nElije una de las opciones mostradas.\n\n");
Sleep(2500);
system("cls");
}
}
while(opc2!=8);
break;
case 15:
printf("Introduce el numero a conocer sus m%cltiplos ---> ",163);
scanf("%d",&num);
printf("%cHasta que cifras deseas conocer los m%cltiplos del %d ---> ",168,163,num);
scanf("%d",&cifras);
for(mp=num; mp<=cifras; mp=mp+num)
{
printf("%d ",mp);
}
break;
case 16:
printf( "\nIngrese n y k: " );
fflush( stdout);
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 */
printf( "\nn! = %ld\n"
"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 );
break;
case 17:
printf("\nIntroduce el nombre del producto: ");
fflush(stdin);
fgets(producto, sizeof(producto), stdin);
producto[strlen(producto)-1] = '\0';
printf("\n%cDicho producto incluye IVA?:\n\n1-Si 2-No ",168);
scanf("%i", &opcioniva);
if(opcioniva==1)
{
printf("\nIntroduce el precio del producto: ");
scanf("%f", &precio);
printf("Introduce su descuento en porcentaje: ");
scanf("%f", &descuento);
preciodesc=precio*descuento/100;
res=precio-preciodesc;
printf("\nEl descuento del %s es de %f euros", producto, preciodesc);
printf("\n\nEl precio final del %s es de %f euros", producto, res);
}
else
{
printf("\nIntroduce el precio del producto: ");
scanf("%f", &precio);
printf("Introduce su descuento en porcentaje: ");
scanf("%f", &descuento);
precioiva=precio*18/100;
precioiva2=precioiva+precio;
preciodesc=precioiva2*descuento/100;
res=precioiva2-preciodesc;
printf("\nEl precio del %s con iva es de %f euros\n", producto, precioiva2);
printf("\nEl descuento del %s es de %f euros", producto, preciodesc);
printf("\n\nEl precio final del %s es de %f euros", producto, res);
}
break;
case 18:
printf("\n\n%cCuantas filas tendra la matriz A?: ",168);
scanf("%d", &m3);
printf("\n%cCuantas columnas tendra la matriz A?: ",168);
scanf("%d", &n3);
printf("\n%cCuantas filas tiene la matriz B?: ",168);
scanf("%d", &o3);
printf("\n%cCuantas columnas tendra la matriz B?: ",168);
scanf("%d", &p3);
/*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");
break;
/*fflush(stdin);
getchar();
system("cls");
goto patras;*/
}
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++);
{
printf("\n");
for(j3=1; j3<=p3; j3++);
printf(" %i ",c3[i3][j3]);
}
break;
case 19:
printf("\nIntroduce la base:\t");
scanf("%f",&numero1);
printf("Introduce la altura:\t");
scanf("%f",&numero2);
res=numero1*numero2/2;
printf("El %crea del triangulo es %f",160,res);
break;
default :
printf("\nElije una de las opciones mostradas.\n\n");
system("cls");
}
}
while(opc1!=20);
Oye avesudra esta estupendo el ejemplo que has dejado en el code, se ve estupendo el uso del do-while para sustituir al goto, jamas lo hubiera sacado por mi mismo.
He actualizado el code, he dejado las mejoras y el propio code actualizado en la primera entrada.
Por cierto, tu forma de limpiar el buffer funciona estupendamente pero he econtrado otra forma que segun algunos dicen que es igual de buena y ademas es mas corta. se trata de esta:
while(getchar() !='\n');
Aun tengo que resolver un pequeño conflicto a la hora de acceder a la opcion conversor (numero 14) que consiste en cuando tengo que volver al menu principal...funcionar funciona pero salta el primer mensaje de elegir la opcion correcta y luego hay que pulsar 2 veces intro...a ver si consigo como solucionarlo... :huh:
Bueno por ahora el programilla va cogiendo forma y se va estructurando mejor en gran parte por tu ayuda, gracias socio ;D
Pd: Me voy a acostar que mañana madrugo. Saludos ^^
Un detallito: le podrias quitar windows.h, que seguro que esta engordando un monton tu ejecutable y ademas hace que no se pueda compilar en otros sistemas.
Saludos.
PD: Te esta quedando bien la calculette.
Ahora queda corregir lo de pasar decimal a binario y estructurar el código en diferentes archivos y funciones. ¡Animo!
Y otra cosa date cuenta que declaras tropescientasmil variables y éstas no se destruyen hasta el final del programa, estás reservando espacio en memoria que quizás no sea utilizado.
PD: Con tanto ayudarte me he puesto a hacerlo yo :xD ahora suma , resta ,divide y multiplica numeros de punto flotante.
PD2: ¡Muy buena esa función! Lo de la opción 14 , a mi no me pide dos veces enter, simplemente pulso 8.
¡Un saludo!
CitarAhora es portable, multiplataforma
falso
Saludos
durasno error mio, habia modificado unas cosas pero no me fije en lo mas grande de todo, la lib de win :xD
avesudra aun estoy corrigiendo lo de emplear menos variables, se que tengo muchiiiiisimas pero a ver si consigo simplificarlas en menos, luego me pongo un rato a mejorar el code...me falta tioempo libre :-(
Por cierto, por lo que parece el error de pulsar 2 veces intro me pasa solo a mi...fijo que es cosa del Dev-C++, tengo que pensarme seriamente en dejarlo. Otra cosa, a ver si consigues hacer en tu propio code de tu calculadora algo bueno y unimos las 2 en algo grande ;-)
daniyo llevo tiempo quitarla para hacer el programa totalmente portable lo que ocurre es que no se que funcion utilizar para reemplazar el de limpiar la pantalla.
system("cls");
Bueno, ahora me pondre a solucionar todos los pequeños errores que hay aun en el code. Si consiguiese solucionarlos todos me pondre a la interfaz grafica, añadir mas funciones a la Calc, etc.
Para system("cls"), en los compiladores hay unas macros que te indican enque sistema se esta compilando, y quedaria una cosa asi:
#ifdef UNIX(o LINUX, o algo asi)
#define limpiar system("clear")
#endif
#ifdef WINDOWS
#define limpiar system("cls")
#endif
Saludos.
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();
scanf("%d", &opc1);
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");
scanf("%d",&opc2);
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");
scanf("%f", &num);
printf("\nSon: %f Pesetas", num*166);
}
void pesetas_a_euros()
{
float num;
printf("\nIntroduce la cantidad de pesetas a transformar:\t");
scanf("%f",&num);
printf("\nSon: %f Euros",num/166);
}
void euros_a_dolares()
{
float num;
printf("\nIntroduce la cantidad de euros a transformar:\t");
scanf("%f",&num);
printf("\nSon: %f Dolares",num/0.8136);
}
void dolares_a_euros()
{
float num;
printf("\nIntroduce la cantidad de dolares a transformar:\t");
scanf("%f",&num);
printf("\nSon: %f Euros",num/1.2616);
}
void euros_a_yenes()
{
float num;
printf("\nIntroduce la cantidad de euros a transformar:\t");
scanf("%f",&num);
printf("\nSon: %f Yenes",num*97.7538829);
}
void yenes_a_euros()
{
float num;
printf("\nIntroduce la cantidad de yenes a transformar:\t");
scanf("%f",&num);
printf("\nSon: %f Euros",num*0.0102297727);
}
void sumar()
{
double numero1, numero2;
printf("\nIntroduce el primer n%cmero a sumar:\t",163);
scanf("%lf",&numero1);
printf("Introduce el segundo n%cmero a sumar:\t",163);
scanf("%lf",&numero2);
printf("\nEl resultado es: %f",numero1+numero2);
}
void restar()
{
double numero1, numero2;
printf("\nIntroduce el primer n%cmero a restar:\t",163);
scanf("%lf",&numero1);
printf("Introduce el segundo n%cmero a restar:\t",163);
scanf("%lf",&numero2);
printf("\nEl resultado es: %lf",numero1-numero2);
}
void multiplicacion()
{
double numero1, numero2;
printf("\nIntroduce el primer multiplicante:\t");
scanf("%lf",&numero1);
printf("Introduce el segundo multiplicante :\t");
scanf("%lf",&numero2);
printf("\nEl resultado es: %lf",numero1*numero2);
}
void division()
{
double numero1, numero2;
printf("\nIntroduce el dividendo:\t");
scanf("%lf",&numero1);
printf("Introduce el divisor:\t");
scanf("%lf",&numero2);
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);
scanf("%lf",&numero1);
printf("\nEl resultado es: %lf", sqrt(numero1));
}
void potencia()
{
double numero1, numero2;
printf("\nIntroduce la base:\t");
scanf("%lf",&numero1);
printf("Introduce el exponente:\t");
scanf("%lf",&numero2);
printf("\nEl resultado es: %lf",pow(numero1,numero2));
}
void logaritmo()
{
double numero1;
printf("\nIntroduce el n%cmero (base 10 por defecto):\t",163);
scanf("%lf",&numero1);
printf("\nEl resultado es: %lf",log10(numero1));
}
void seno()
{
double numero1;
printf("\nIntroduce el n%cmero a hallar el seno:\t",163);
scanf("%lf",&numero1);
printf("\nEl resultado es: %f",sin(numero1));
}
void coseno()
{
double numero1;
printf("\nIntroduce el n%cmero a hallar el coseno:\t",163);
scanf("%lf",&numero1);
printf("\nEl resultado es: %f",cos(numero1));
}
void tangente()
{
double numero1;
printf("\nIntroduce el n%cmero a hallar la tangente:\t",163);
scanf("%lf",&numero1);
printf("\nEl resultado es: %lf",tan(numero1));
}
void cosecante()
{
double numero1;
printf("\nIntroduce el n%cmero a hallar el cosecante:\t",163);
scanf("%lf",&numero1);
printf("\nEl resultado es: %lf",asin(numero1));
}
void secante()
{
double numero1;
printf("\nIntroduce el n%cmero a hallar el secante:\t",163);
scanf("%lf",&numero1);
printf("\nEl resultado es: %lf",acos(numero1));
}
void cotangente()
{
double numero1;
printf("\nIntroduce el n%cmero a hallar el cotangente:\t",163);
scanf("%lf",&numero1);
printf("\nEl resultado es: %lf",atan(numero1));
}
void multiplos()
{
unsigned long int num,cifras;
printf("Introduce el numero a conocer sus m%cltiplos ---> ",163);
scanf("%lu",&num);
printf("%cHasta que cifras deseas conocer los m%cltiplos del %lu ---> ",168,163,num);
scanf("%lu",&cifras);
for(int i=1; cifras!=0; ++i)
{
printf("%lu ",num*i);
--cifras;
}
}
void binomio()
{
long n, k, nf, kf, resta, restaf, v, w;
printf( "\nIngrese n y k: " );
fflush( stdout);
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 */
printf( "\nn! = %ld\n"
"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: ");
while(getchar()!='\n'){}
fgets(producto, sizeof(producto), stdin);
producto[strlen(producto)-1] = '\0';
printf("\n%cDicho producto incluye IVA?:\n\n1-Si 2-No ",168);
scanf("%d", &opcioniva);
if(opcioniva==1)
{
printf("\nIntroduce el precio del producto: ");
scanf("%lf", &precio);
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: ");
scanf("%lf", &precio);
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);
scanf("%d", &m3);
printf("\n%cCuantas columnas tendra la matriz A?: ",168);
scanf("%d", &n3);
printf("\n%cCuantas filas tiene la matriz B?: ",168);
scanf("%d", &o3);
printf("\n%cCuantas columnas tendra la matriz B?: ",168);
scanf("%d", &p3);
/*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++);
{
printf("\n");
for(j3=1; j3<=p3; j3++);
printf(" %i ",c3[i3][j3]);
}
}
}
void area_triangulo()
{
double numero1,numero2;
printf("\nIntroduce la base:\t");
scanf("%lf",&numero1);
printf("Introduce la altura:\t");
scanf("%lf",&numero2);
printf("El %crea del triangulo es %lf",160,(numero1*numero2)/2);
}
void decimal_a_binario()
{
uint64_t dec;
printf("Dame un numero en decimal:");
scanf("%I64u",&dec);
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):");
scanf("%s",bin);
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;
}
#ifdef __unix__
sleep(2500);
hola! me parece que en sistemas *nix la unidad de sleep esta dado en segundos. Si queremos hacer una pausa de 5seg, seria
sleep(5);
Saludos
Gracias por el detalle Durasno ahora lo cambio que tengo que quitar también un fflush(stdin) que he visto por ahí.
¡Un saludo!
Creo que en vez de utilizar las macros constantemente, simplemente se puede hacer:
#ifdef __unix__
#define limpiar system("clear")
#elif defined _WIN32
#define limpiar system("cls")
#endif
Y en el codigo simplemente pones limpiar cada vez.
Saludos.
Cita de: daniyo en 11 Julio 2012, 14:07 PM
Creo que en vez de utilizar las macros constantemente, simplemente se puede hacer:
#ifdef __unix__
#define limpiar system("clear")
#elif defined _WIN32
#define limpiar system("cls")
#endif
Y en el codigo simplemente pones limpiar cada vez.
Saludos.
Tienes razón daniyo , el preprocesador tiene que realizar más condiciones , así se "optimiza" o así lo creo el trabajo de éste.
avesudra me has dejado sorprendido al ver tooodo lo que has mejorado el codigo. Ahora me pondre a verlo mas tranquilamente pero a primera vista se ve que has echo muchos cambios, me encanta socio esta genial, enhorabuena ;-) ;-) ;-) ;-) ;-) ;-)
Yo tambien tengo echo por mi cuenta algunos cambios y una pequeña interfaz grafica, vamos, mejorarle un poco el diseño. En cuanto tenga mas cosas podemos unir ambos codigos en uno solo que fijo quedara todo mejor.
En principio destripo un poco tus cambios en el code y aviso para alguna novedad :)
Edito
Ahora viendo tu codigo y probando he aprendido del todo lo de la portabilidad de la cabecera. Si creo que lo he entendido bien, de este modo tambien valdria...para mi ahorra mas espacio :xD
#ifdef __unix__ //Si se esta compilando en SO Unix hace lo siguiente
#include<unistd.h>
#define limpiar system("clear")
#define parar sleep(2)
#elif defined _WIN32 //Si se esta compilando en SO Windows hace lo siguiente
#include<windows.h>
#define limpiar system("cls")
#define parar Sleep(2500)
#endif
Bueno, otra cosa que aprendo...a ver si sigue asi la cosa que aprender es muy bueno.
Una pregunta: ¿como has hecho la interfaz grafica?
Si te refieres a esta interfaz...
printf("\n elige la operaci%cn a realizar: ",162);
printf("\n -----------------------------");
printf("\n\n 1-Suma\t\t\t8-Sen\t\t14-Conversor",163);
printf("\n 2-Resta\t\t9-Cos\t\t15-Conocer m%cltiplos",163);
printf("\n 3-Multiplicaci%cn\t10-Tang\t\t16-Teorema Binomio",162);
printf("\n 4-Divisi%cn\t\t11-Cosec\t17-Calcular un descuento",162);
printf("\n 5-Ra%cz\t\t\t12-Sec\t\t18-Multiplicar 2 matrices",161);
printf("\n 6-Potencia\t\t13-Cotang\t19-Area de un triangulo",161);
printf("\n 7-Logaritmo\t\t\t\t20-Salir\t\t\t",161);
Bueno aunque todavia no se le puede considerar mucho interfaz, de interfaz tiene poco, portada por llamarlo de algun modo :xD
Para la proxima update de la calc estara mejor que ahora, estoy haciendo un diseño algo mejor, aunque sigue siendo basico. lo suyo seria colocarle algo de la lib de ncurses...ya vere que hacer.
Bueno pues como puedes ver en el code es como esta estructurada, simplemente he colocado por columnas las operaciones de 1,2,3...etc
Joder otra vez , si dryken así está mejor el preprocesador realiza menos condiciones y hace lo mismo , hoy no estoy muy agil mentalmente que digamos :xD , daniyo se refiere a la interfaz por consola , en vez de eso dryken , se puede hacer con GTK+ o Qt que son portables.
CitarYo tambien tengo echo por mi cuenta algunos cambios y una pequeña interfaz grafica
Lei eso y pregunte.
daniyo ya he colocado en la primera entrada de este post la segunda update del codigo con algunas mejoras y la interfaz por la que preguntas, no es nada del otro mundo pero al menos como que da alegria para los ojos :xD
avesudra ni yo tambpoco estoy hoy bien del coco, un dia raro lo tenemos todos ;D
Por cierto voy incluyendo a medida que avance algunos cambios de la mejora que hiciste del codigo, por ejemplo, a ver si pillo tu conversor de binario a decimal y vivecersa...la cosa es que el jodido dev-c++ no me lo compila :-\
A ver si tambien me da por cuando este mas completo meterlo por capas como tu las hecho, se veia mas ordenado y organizado. Aun quiere hacerle muchos mas cambios al programa, a ver si encuentro mas tiempo libre :silbar:
Dryken deberías bajarte codeblocks no por nada pero es que dev-cpp es un proyecto casi abandonado hace poco salió una versión de alguien pero ya está un poco viejo, además de todo codeblocks se puede instalar en linux y windows.En cuanto al código mejorado lo único que he hecho es meter las variables y lo que se hace dentro de una función no es tan complicado y te queda todo mucho más limpio.Y lo del conversor de binario a decimal en pseudocódigo es:
Reservamos 64 espacios de memoria para una cadena (bin)la cual contendra el numero en binario.
Pedimos que el usuario introduzca un número en binario y lo guardamos en la cadena(bin).
Declaramos una variable de 64 bits que contendrá el resultado(res);
Declaramos una variable contador(i)
Declaramos un puntero al final de la cadena(bin) que introdujo el usuario(p_f_bin)
Mientras el puntero (p_f_bin)no sea igual que la cadena(bin)-1(Hablamos de direcciones de memoria)Haz esto:
{
Si el contenido del puntero al final de la cadena -48(para pasarlo
a decimal)es igual que 1 haz esto:
{
Suma y asigna a la variable resultado (res)la potencia de dos elevada a
la variable contador(i)
}
Aumenta variable contador (i)
Disminuye variable puntero a final de la cadena(p_f_bin)
}
Veo que le has puesto el titulo de la ventana, que solo funciona en windows, podrias poner eso asi:
#ifdef _WIN32
HWND ocultar;
//El resto del codigo para ponerle titulo.
#endif
Saludos.
avesudra lo del proyecto abandonado me lo comentaron hace bastante tiempo aunque es verdad lo del nuevo, tiene buena pinta, lo llevo usando unas cuantas semanas, el programa mejora pero los bugs lo siguen sin corregir.
http://orwelldevcpp.blogspot.com.es/
Por cierto, gracias por explicar como se forma el code el conversor, estaba con tu codigo casi conseguido del conversor pero al final por una cosa que no iba y por el cansancio decidi dejarlo, aun asi al final consegui sacar otro code algo mas simplificado del mismo conversor decimal-binario. Lo publicare dentro de poco con la proxima update.
daniyo probe a colocarlo como dices pero no entiendo porque no deja, probare con el code blocks...bueno, en principio por el tema de portabilidad no debe de dar problemas ya que la libreria de windows solo se "activa" cuando el compilador detecte el SO, en caso contario no ocurre nada de problem con Unix...o eso imagino que sucede.
Edito
Ha sido actualizada la calculadora con nuevas funciones
Cita de: Dryken en 12 Julio 2012, 04:02 AM
Edito
Ha sido actualizada la calculadora con nuevas funciones
Es mejor como consejo que te esfuerzes en poner el código como el mío o otra forma de estructuración , es más fácil trabajar con las cosas bien ordenadas. ;-)
PD: El código de tu conversor no está mal , pero solo acepta hasta 16 bits o 2^16 lo que es en numero entero 65536 , a partir de ahí se traba, en ese caso también la hubiese hecho yo más eficiente >:D
¡Un saludo Crack!
.
Te dejo mi calculadora que hice en la Univ. para mi profesor de Métodos Numéricos, resuelve expresiones complejas como:
+-+-4(5h^sqr(e(ln(4(5/10)))^sqr(2*2)))(cos(h)^2+sin(h)^2)
* Identifica automáticamente las variables.
* Maneja Variables (lo deje para usa sola variable)... en si se pueden usar N Variables y resolver sus valores.
Arrojando el resultado correcto.
SourceCode. (http://infrangelux.sytes.net/FileX/index.php?dir=/BlackZeroX/Programacion/cpp&file=Series.rar) ( Deje el ejecutable Funcional dentro de la carpeta Bin/Release ).
int main() {
equation oEquation;
//equation oGrado; Clase por si el grado es de alguna manera no procesable como cos(x) o cos(x)^2+sin(x)^2
string str;
int iOption = 0, iDivs = 0, iFlags, iOrden = 0;
int iPresicion = 5;
bool bNewEquation = false;
long double ldH = 0.0f, ldArea = 0.0, ldRange[2] = {};
do {
system("cls");
cout << endl << "Programa Creado por: Ortega Avila Miguel Angel 4B (Vespertino)." << endl << endl;
cout << "Sintaxis------" << endl;
cout << "Multiplicacion Divicion suma y resta" << endl << "\ta*b, a/b, a+b, a-b, -a, +b";
cout << "Trigonometricas:" << endl << "\tcos(x), sin(x), tan(x), csc(x), cot(x), sec(x)" << endl;
cout << "Valor absoluto:" << endl << "\tabs(x)" << endl;
cout << "Exponencial logaritmo natural:" << endl << "\te(x), ln(x)" << endl;
cout << "Potencias y raiz cuadrada:" << endl << "\tx^y, sqr(x)" << endl;
cout << "--------------" << endl;
cout << "Nota: Se permite el uso de cuarquier variable (el programa la identifica automaticamente)." << endl;
cout << "Ejemplo: 4(5h^sqr(e(ln(4(5/10)))^sqr(2*2)))(cos(h)^2+sin(h)^2)" << endl << endl << endl;
cout.precision(2);
cout.setf(ios::fixed, ios::floatfield);
while (1) {
if (tolower(str[0]) != 'r') {
cout << "Ingrese una ecuacion: ";
getline(cin, str);
//str = "4(5h^sqr(e(ln(4(5/10)))^sqr(2*2)))(cos(h)^2+sin(h)^2)";
oEquation.Equation(str);
if ((oEquation.GetFlags() & FLAG_SINTAX)) {
cout << "\tError: Sintaxis de la ecuacion errorea No se permiten dos operados contiguos (inclusive signos)." << endl << endl;
} else if ((oEquation.GetFlags() & FLAG_INVALIDTYPE)) {
cout << "\tError: Caracteres no procesables." << endl << endl;
} else if (oEquation.Variables.size() > 1) { // Hay mas de una variable?.
cout << "Error: Ingresa una ecuacion con una sola variable." << endl << endl;
} else {
break; // while(1)
}
} else {
cout << "Ecuacion: " << oEquation.Equation() << endl << endl;
break;
}
}
system("cls");
bNewEquation = false;
while(!bNewEquation) {
cout << "Programa Creado por: Ortega Avila Miguel Angel 4B (Vespertino)." << endl << endl;
cout << "Leyenda (Posibles resultados):" << endl;
cout << "nan. = Imposible de calcular (Resulta por ejemplo de raices imaginarias)." << endl;
cout << "inf. = Numero Infinito (por ejemplo: Una divicion entre 0)." << endl << endl;
cout << "Ecuacion: " << oEquation.Equation() << endl << endl;
cout << "[0] Resolver Operacion."<< endl;
cout << "[1] Calcular derivada."<< endl;
cout << "[2] Calcular area bajo la curva (Integracion por trapecios)."<< endl;
cout << "[3] Ingresar otra ecuacion."<< endl;
cout << "[4] Definir la presicion (cantidad de dcimales a mostrar)." << endl;
cout << "[5] Terminar aplicacion." << endl << endl;
cout << "Opcion: ";
if (!getInt(&iOption, true)) {
cout << "Error: Solo Numeros Decimales." << endl << endl;
} else {
cout << endl;
switch (iOption) {
...
...
Es un código un tanto largo...
...
Dulces Lunas!¡.
avesudra si te digo la verdad me gusta tu forma que colocaste el codigo, me gustaria dejarlo asi cuando la calculadora estuviese acabada...pero para trabajar me gusta tener todo el codigo en una sola pagina para no tener que liarme yendo de un lado para otro...no se yo, sera mania mia :xD
Por cierto, si te digo la verdad no sabia que solo funcionase con 16 bits, lo he probado y es verdad, cuando coloco cifras grandes me muestra los resultado de manera negativa, vamos...con un negativo delante. ¿Como podria aumentarle los bits con los que trabajar?
BlackZeroX tu calculadora es estupenda, tiene de todo, a ver si luego tengo un ratillo libre y me pongo mas tranquilamente a destriparla.
Nueva Update
Pequeña update de la Calc, la funcion principal que trae es que siempre que hagas una operacion de la calculadora se obtendra un resultado el cual se almacenara en un archivo de texto para mayor comodidad.
Bueno ya cada uno tiene sus gustos Dryken :) pues mira te explico , tu utilizas el tipo de dato int , pero claro este tipo de dato sirve para negativos y positivos entonces digamos que se divide el tipo de 32 bits , en 16 bits para negativo y 16 bits para positivo , la manera de arreglarlo usando tipos de datos más grandes como los que vienen en la librería <stdint.h> o con una librería externa , gmp por ejemplo. En el código que yo te dí usaba el tipo uint64_t o sea entero sin signo de largo 64 bits , cómo este solo es positivo pues no se divide y permite 64 bits de capacidad , para más bits ya necesitas ayudarte de librerías externas.
BlackZeroX , cada vez que entro en un tema en el que hayas comentado salta el antivirus, y con el enlace que me has dejado igual , ¿te sucede a menudo?
Cita de: avesudra en 15 Julio 2012, 04:06 AM
BlackZeroX , cada vez que entro en un tema en el que hayas comentado salta el antivirus, y con el enlace que me has dejado igual , ¿te sucede a menudo?
Relajate, eso sucede con mis DNS ya reporte eso a las compañias responsables de NOD32 y BITDEFENDER, lo que pasa es que son DNS gratuitas No-IP...
*En el tema de los bits ten en cuenta que el numero maximo para almacenar es 2^Bits es decir si es de:
16 bits (short int) seria 2^16 = 65536 <--- short int o int (en algunos casos)
32 bits (int, word) seria 2^32 = 4294967296 <--- int (en algunos casos)
32 bits (int, word) seria 2^32 = 4294967296 <--- long (en algunos casos)
64 bits (int, word) seria 2^64 = 18446744073709551616 <--- long int o en algunas ocasiones long long int
para corroborar esto:
/*
Si sale:
1 es de 8 bits
2 es de 16 bits
4 es de 32 bits
8 es de 64 bits
12 es de 96 bits
*/
cout << sizeof(char) << endl;
cout << sizeof(short int) << endl;// cout << sizeof(short) << endl;
cout << sizeof(int) << endl;
cout << sizeof(long int) << endl;// cout << sizeof(long) << endl;
cout << sizeof(long long int) << endl;// cout << sizeof(long long) << endl;
cout << sizeof(double) << endl;
cout << sizeof(long double) << endl;
* Aun asi te recomiendo que mejor uses el tipo
long Double ya que es mejor para este tipo de cálculos donde se encuentran cálculos con números Reales.
Dulces Lunas!¡.
Gracias a ambos por explicarlo, ya estoy mas enterado en el tema de los bits y visto lo visto empleare el long double que me recomiendas BlackZeroX, porque vaya que si permite ingentes cantidades de numeros con tantos bits.
He visto que como dice avesudra necesitas una libreria como por ejemplo la <stdint.h> o el tipo uint64_t para conseguir hasta 64 bits pero, el long double abarca hasta los 64 bits o son mas?? Porque en tal caso seria necesaria una libreria distinta para poder cargarla, a ver si consigo averiguar si con esa los carga o sino tendre que emplear otra.
Por cierto, esto de lo que estamos hablando es para numeros enteros, pero para numeros deciamles con float podria funcionar o no?
Revisa cada tipo en la plataforma en la que estas... por ejemplo: un int difiere segun la arquitectura x86 (32) y una x64 (64)...
Dulces Lunas!¡.
Como dice BlackZeroX cada tipo difiere , pero si quieres usar tipos más grandes que long double que creo que es el mayor , necesitas tirar de librerías externas , gmp por ejemplo.
Buenas, acabo de subir la calculadora con algunos cambios, no son muchos pero algo es algo, he tardado bastante por las vacaciones, no todo es trabajo.
Pd: Aún tengo que solucionar el tema de que sólo vaya con 16 bits y reordenar el código en distintas páginas. No me peguéis, estamos en verano :xD
Uo, me ha gustado...
¡Gran trabajo!
Buenas compañeros, he estado ocupado todo este tiempo por otros mundillos aprendiendo malware, ing inversa y seg informat. sé que he estado un tiempo sin actualizar la calculadora, 2 mese nada menos :xD pero más vale tarde que nunca
Versión 0.7 de Calc Don
Os la traigo con algunos cambios importantes. Dicha lista de cambios se encuentra en la 1ª pag de este post.
Lo principal ha sido cambiar a 64 bits, me he decantado por long long int en vez de uint_64 ya que este sólo admite enteros positivos y el otro tanto positivos como negativos...la cosa es que cambiar muuuchas variables entre 1000 y pico lineas tiene huevos la cosa :P
Otra cosa era lo de que al aparecer el menú si metías una letra se quedaba trancado en un bucle y no iba. Un colega mio era un cabrón y siempre me buscaba los fallos al programa, que mamonazo era pero de los errores se aprende.
Tenía pensado hacer lo de ordenar el código como dijo Avesudra por distintas páginas pero sigo sin acomodarme a trabajar así, por lo que si me da la pica un día de estos quizás lo haga pero en principio no tengo pensamiento.
Bueno, espero que que os guste. Saludos gente!