[Source] Calculadora Calc Don 0.7

Iniciado por Dryken, 9 Julio 2012, 23:11 PM

0 Miembros y 6 Visitantes están viendo este tema.

Dryken

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.7
http://pastebin.com/Bz2x1ZS3
Lo intentas y fracasas, lo intentas y fracasas pero fracasas realmente cuando dejas de intentarlo.

Calc Don v0.7 - C
http://foro.elhacker.net/programacion_cc/source_calculadora_calc_don_10-t366489.0.html

Hundir la flota v0.3 - C#
http://foro.elhacker.net/net/source_c_juego_hundir_la_flota_v01-t377794.0.html

avesudra

#1
¡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! ;-)
Regístrate en

Dryken

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!
Lo intentas y fracasas, lo intentas y fracasas pero fracasas realmente cuando dejas de intentarlo.

Calc Don v0.7 - C
http://foro.elhacker.net/programacion_cc/source_calculadora_calc_don_10-t366489.0.html

Hundir la flota v0.3 - C#
http://foro.elhacker.net/net/source_c_juego_hundir_la_flota_v01-t377794.0.html

avesudra

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.
Código (cpp) [Seleccionar]
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",&dividendo);
            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",&yen);
                    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);
Regístrate en

Dryken

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:

Código (cpp) [Seleccionar]
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 ^^
Lo intentas y fracasas, lo intentas y fracasas pero fracasas realmente cuando dejas de intentarlo.

Calc Don v0.7 - C
http://foro.elhacker.net/programacion_cc/source_calculadora_calc_don_10-t366489.0.html

Hundir la flota v0.3 - C#
http://foro.elhacker.net/net/source_c_juego_hundir_la_flota_v01-t377794.0.html

0xDani

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.
I keep searching for something that I never seem to find, but maybe I won't, because I left it all behind!

I code for $$$
Hago trabajos en C/C++
Contactar por PM

avesudra

#6
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!
Regístrate en

durasno

CitarAhora es portable, multiplataforma
falso


Saludos
Ahorrate una pregunta, lee el man

Dryken

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.

Código (cpp) [Seleccionar]
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.
Lo intentas y fracasas, lo intentas y fracasas pero fracasas realmente cuando dejas de intentarlo.

Calc Don v0.7 - C
http://foro.elhacker.net/programacion_cc/source_calculadora_calc_don_10-t366489.0.html

Hundir la flota v0.3 - C#
http://foro.elhacker.net/net/source_c_juego_hundir_la_flota_v01-t377794.0.html

0xDani

Para system("cls"), en los compiladores hay unas macros que te indican enque sistema se esta compilando, y quedaria una cosa asi:

Código (cpp) [Seleccionar]

#ifdef UNIX(o LINUX, o algo asi)
#define limpiar system("clear")
#endif
#ifdef WINDOWS
#define limpiar system("cls")
#endif


Saludos.
I keep searching for something that I never seem to find, but maybe I won't, because I left it all behind!

I code for $$$
Hago trabajos en C/C++
Contactar por PM