| 
	
		|  Autor | Tema: [Source] Calculadora Calc Don 0.7  (Leído 26,258 veces) |  
	| 
			| 
					
						| Dryken 
								
								 Desconectado 
								Mensajes: 117
								
								 
								El arte de vencer se aprende en las derrotas
								
								
								
								
								
								     | 
 
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    Versión 0.2 Versión 0.3Code simplificado, suprimida la libreria iostreamMejorada la limpieza del bufferSolucionada la ausencia de un break en los case del switchEliminado el goto y sustituidoCorregidos pequeños errores
 Versión 0.4Ahora se utilizan menos variablesCodigo mas comprimido.El codigo es portable, multiplataformaAgregado nombre del programa a la consola (solo aparece en Win32)Diseñada nueva interfaz y nuevo menuCorregidas tildes en textosVarios bugs menores
 Versión 0.5Codigo mas ordenado y limpioAgregada Barra de transicion al menuAñadida la funcion Angulos de un trianguloAñadida la funcion Conversor de segundos a minutos y horasAñadida la funcion FactorialAñadida la funcion Conocer numeros primosAñadido el Teorema de PitagorasAñadida la Serie de Fibonacci
 Versión 0.6 - 8/8/12Ahora 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 menuSolucionado problema con el buffer en saltos de lineaAgregadas tildes a las palabras
 Versión 0.7 -20/10/12Corrección de tildes en archivo de texto generado Pequeña mejora en la GUIAñadida la funcion Binario a decimalAñadida la funcion Decimal a HexadecimalAñadida la funcion Hexadecimal a DecimalAñadida la funcion MCD y MCMAñadida la funcion Área de un círculoAñadida la funcion Longitud de un circulo
 Código v0.7http://pastebin.com/Bz2x1ZS3Solucionado importante bug (ingreso de caracteres en variables enteras) Arreglados bastantes bugs menoresCompatible con 64 bitsCambios en la GUIOptimizado el código de la Serie de Fibonacci y el del conversor de Decimal a BinarioAñadido conversión de Decimal a Octal y viceversa
 
 |  
						| 
								|  |  
								| « Última modificación: 20 Octubre 2012, 12:06 pm por Dryken » |  En línea | 
 
 |  |  |  | 
			| 
					
						| avesudra 
								 
								
								 Desconectado 
								Mensajes: 724
								
								 
								Intentando ser mejor cada día :)
								
								
								
								
								
								   | 
 
¡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 ponerEl 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");
 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 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!  
 
 |  
						| 
								|  |  
								| « Última modificación: 10 Julio 2012, 01:24 am por avesudra » |  En línea | 
 
 Regístrate en   |  |  |  | 
			| 
					
						| Dryken 
								
								 Desconectado 
								Mensajes: 117
								
								 
								El arte de vencer se aprende en las derrotas
								
								
								
								
								
								     | 
 
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! |  
						| 
								|  |  
								|  |  En línea | 
 
 |  |  |  | 
			| 
					
						| avesudra 
								 
								
								 Desconectado 
								Mensajes: 724
								
								 
								Intentando ser mejor cada día :)
								
								
								
								
								
								   | 
 
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);
 |  
						| 
								|  |  
								|  |  En línea | 
 
 Regístrate en   |  |  |  | 
			| 
					
						| Dryken 
								
								 Desconectado 
								Mensajes: 117
								
								 
								El arte de vencer se aprende en las derrotas
								
								
								
								
								
								     | 
 
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...    Bueno por ahora el programilla va cogiendo forma y se va estructurando mejor en gran parte por tu ayuda, gracias socio    Pd: Me voy a acostar que mañana madrugo. Saludos ^^ |  
						| 
								|  |  
								|  |  En línea | 
 
 |  |  |  | 
			| 
					
						| 0xDani 
								       
								
								 Desconectado 
								Mensajes: 1.077
								
								   | 
 
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.
 
 |  
						| 
								|  |  
								|  |  En línea | 
 
 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 
								 
								
								 Desconectado 
								Mensajes: 724
								
								 
								Intentando ser mejor cada día :)
								
								
								
								
								
								   | 
 
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    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! |  
						| 
								|  |  
								| « Última modificación: 10 Julio 2012, 14:08 pm por avesudra » |  En línea | 
 
 Regístrate en   |  |  |  | 
			| 
					
						| durasno 
								 
								
								 Desconectado 
								Mensajes: 373
								
								
								
								
								
								   | 
 
Ahora es portable, multiplataforma falso Saludos |  
						| 
								|  |  
								|  |  En línea | 
 
 Ahorrate una pregunta, lee el man |  |  |  | 
			| 
					
						| Dryken 
								
								 Desconectado 
								Mensajes: 117
								
								 
								El arte de vencer se aprende en las derrotas
								
								
								
								
								
								     | 
 
durasno error mio, habia modificado unas cosas pero no me fije en lo mas grande de todo, la lib de win    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. |  
						| 
								|  |  
								|  |  En línea | 
 
 |  |  |  | 
			| 
					
						| 0xDani 
								       
								
								 Desconectado 
								Mensajes: 1.077
								
								   | 
 
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. |  
						| 
								|  |  
								|  |  En línea | 
 
 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
 |  |  |  |  |  
 
	
 
 
				
					
						| Mensajes similares |  
						|  | Asunto | Iniciado por | Respuestas | Vistas | Último mensaje |  
						|   |   | [Source][VB] Calculadora de operaciones combinadas .NET (C#, VB.NET, ASP)
 | raul338 | 2 | 15,372 |  30 Diciembre 2009, 22:06 pm por Meta
 |  
						|   |   | Formual de Calc (OpenOffice) Programación General
 | Zeroql | 0 | 2,112 |  17 Septiembre 2012, 00:56 am por Zeroql
 |  
						|   |   | Sencilla calculadora con reproductor de musica python (Source) Scripting
 | -Mc_Raaka- | 0 | 2,461 |  5 Agosto 2013, 09:52 am por -Mc_Raaka-
 |  
						|   |   | LibreOffice Calc OOoBasic: ERROR Else sin If Scripting
 | novicio | 4 | 4,560 |  13 Mayo 2018, 22:39 pm por novicio
 |  
						|   |   | No me abre calc Bases de Datos
 | enrique4480 | 1 | 8,629 |  13 Marzo 2024, 14:07 pm por Saberuneko
 |    |