Varias dudas C++: Volver todas las varibles a 0, alternativa a system("cls");...

Iniciado por Sauw, 8 Diciembre 2010, 19:30 PM

0 Miembros y 1 Visitante están viendo este tema.

Sauw

Quizás os acordaréis de mi de otro tema... bueno pues como tengo nuevas dudas y he cambiado por completo el sistema de mi calculadora (ahora será versión 2.0)  he decidido crear un nuevo tema.

Sí, estoy trabajando en una calculadora, a ver que os parece:


#include <stdlib.h>
#include <math.h>
#include <iostream>
using namespace std;

int operacion, opcion[2], i;
float resultado, operando[20];
char operador[20];

int main()
{ // Inicio
int menu[1];
menu[0]=0, menu[1]=1;
while (!menu[0])
     { // while menú principal
     system("cls");
     cout << " \n\bÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ CALCULADORA EUCLIDES ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ\n_______________________________[Version 2.0]____________________________________\n\n elige una opcion:\n\n  0: Operaciones basicas \n\n  1: Potencias y raices \n\n  2: Geometria \n\n  3: Ecuaciones\n\n  4: Salir \n\n ";
     cin>>opcion[0];
     switch(opcion[0])
          { // Switch menú
          case 0:
                i=1;    
                     while (menu[1]==1)
                     { // while operaciones basicas, para poder repetir con el valor obtenido
                     system("cls");
                     cout<<" \n Elija quantos numeros quiere operar\n\n   ";
                     cin >> opcion[1];
                     system("cls");
                     cout << "\n";       // Ésto es simplemente para la estética  
                     if(i==2) // para que si eliges continuar operando sobre el resultado te lo escriba directamente como operador "1"
                         {
                         cout << " " << resultado << "\n ";
                         cin >> operador[1];    
                         }    
                     for(i; i<=opcion[1]; i++)
                         {    
                         cout << " "; // Estética, un espacio
                         cin >> operando[i];  // Le das el primer número que quieres operar
                         if(i!=opcion[1]) // cuando i sea = a opcion no hará falta pedir signo
                              {                
                              cout << " ";       // estética                  
                              cin >> operador[i];        // pide signo i deberías escribir +,-,* o /
                              }                                                    
                         }
                     if(resultado==0)
                               { // ésto es para que solo se haga la primera vez que operas, si más tarde eliges la opcion "continuar operando sobre el resultado" éste se mantendrá
                               resultado=operando[1];  
                               }                      
                     for(i=1; i<=opcion[1]; i++)
                        { // hace los cálculos
                        switch (operador[i])  
                               {  // switch signo                    
                               case '+':
                               resultado+=operando[i+1];  
                               break;  
                               case '-':
                               resultado-=operando[i+1];
                               break;
                               case '*':
                               resultado*=operando[i+1];
                               break;
                               case '/':
                               resultado/=operando[i+1];
                               break;
                               }  // switch signo                            
                        }  // for calcular
                     system("cls");
                     cout <<"\n";  // estética otra vez
                     for(i=1; i<=opcion[1]; i++)
                        {
                        cout << "  " << operando[i]; // escribe las operaciones que ha hecho
                        if (i!=opcion[1]) // para que la última vez no escriba ningún sigo
                             {
                             cout << "  "<< operador[i];  
                             }
                        }
                     cout << "  =  " << resultado << "\n\n 0: Volver\n 1: Continuar calculando sobre este resultado\n\n  ";
                     cin >> opcion[1];
                     if(!opcion[1]) // vuelve al menú principal
                        {
                        menu[1]=2;
                        }  
                     else
                        {
                        i=2; // así cuando se haga el primer for no te pedirá el operador "1", pues será el resultado que has obtenido antes
                        }
                     } // while operaciones basicas
          break; // case 0, operaciones basicas                                        
          } // Switch menú
     } // while menú principal
} // inicio


Al menu principal no le hagais caso, solo funciona de momento las "operaciones básicas" (aunque todo lo demás lo hice en la versión anterior de la calculadora, solo que ahora estoy cambiando muchísimas cosas, ahora uso cout y cin en vez de printf i scanf etc. así que decidí reescribirlo)

Funciona así:

Te pide cuantos números quieres operar  y entonces escribes, por ejemplo si elegiste 3:

105 - 15 / 2 i así te funcionaría, aunque tienes que apretar intro cada vez que escribes algo obviamente (sino no tengo ni idea de como hacerlo, pero supongo que será dificilísimo para mi nivel jajajaja)

Pero si calculas varias veces sin cerrar la calculadora una vez vuelves a calcular hay errores y empiezan a salir cosas raras, no sé muy bien porque pero se sulocionaría seguramente si supiera como igualar todas las variables a 0 a ver, podría hacerlo una por una pero me parece que tiene que haber alguna forma más rápida de "resetearlas" todas y esa es mi primera y más importante pregunta.

También he decidido dejar de usar system("pause"); y lo reemplazaré por
getchar();

Pero no conozco por ahora ninguna alternativa a system("cls");
Existe alguna? Puedo seguir usándolo y no me causará problemas?

Y bueno aparte de eso echadle un vistazo a ver que tendría que cambiar o que no os convence...

Pero lo que más me interesa saber es lo de devolver a las variables el valor "0" sin hacerlo manualmente

De antemano, gracias.

Beakman

Tu programa solo me funciono una vez, puedo hacer una cuenta y después no me deja hacer mas nada, a si que no se de que variables hablas cuando decís "poner todo a 0".

Faltaba la opción salir.
Lo de system( "cls" ); podes reemplazarlo por varios saltos de linea ( tampoco muchos! ), para mi queda mejor asi, sin limpiar la pantalla. Porque "cls" es para windows no mas.

Y después tendrías que usar mas funciones, dividir mas el código para que sea mas facil arreglarlo ( funcion resta, funcion suma, etc ).

Y me parece que en vez de que el usuario ingrese " 5+5 " que se le pregunte en un menú que cuenta quiere hacer.
Porque si se ingresa " 5 + 6 * 2 " por ejemplo, el programa lo resuelve de izquierda a derecha, cuando tendría que resolver la multiplicación primero, haciendo el menú te ahorras tener que dividir la cuenta.

Sauw

Eso lo hice precisamente por que mis amigos querían que se pudiera de golpe hacer sumas, restas, multiplicaciones y divisiones y que fuera simplemente escribiendo el signo...

Mi versión anterior era con funciones específicas  pero claro solo podías hacer un tipo de operación cada vez, si querías sumar solo podías sumar no podías mezclar operaciones diferentes.

Pero bueno, sí... yo quiero darles a todas las variables el valor de 0 cada vez que se inicia el menú

Quiero algo así como:


Todaslasvaribles=0;

Beakman

ah oka.

Podrías ponerlas así:
operacion = opcion[ 0 ] = opcion[ 1 ] = i = resultado = menu[ 0 ] = menu[ 1 ] = 0;
Solo te ahorras lineas.

Sauw

Ok gracias haré una función para ello 8D


Littlehorse

Puedes utilizar compilación condicional en caso que quieras que limpiar la consola tanto en *nix como en Windows utilizando system:

Código (cpp) [Seleccionar]
#ifdef _WIN32 //O lo que quieras utilizar
#define CLEAN system("cls"); //Para Windows
#else
#define CLEAN system("clear"); //Para *nix
#endif


Igualmente utilizar system no es lo mas adecuado. Indefectiblemente algún día te tendrás que quitar el vicio, pero lamentablemente no hay alternativa estándar para limpiar la pantalla dado que dichas tareas solo se pueden realizar con funciones especificas de cada sistema. Es decir, tendrías que tirar de las APIs de cada sistema para hacer las funciones correspondientes y luego llamarlas dependiendo cual sea el sistema operativo respectivo.

Saludos
An expert is a man who has made all the mistakes which can be made, in a very narrow field.