elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Curso de javascript por TickTack


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Varias dudas C++: Volver todas las varibles a 0, alternativa a system("cls");...
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Varias dudas C++: Volver todas las varibles a 0, alternativa a system("cls");...  (Leído 5,016 veces)
Sauw

Desconectado Desconectado

Mensajes: 8


Ver Perfil
Varias dudas C++: Volver todas las varibles a 0, alternativa a system("cls");...
« en: 8 Diciembre 2010, 19:30 pm »

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:

Código:
#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
Código:
system("pause");
y lo reemplazaré por
Código:
getchar();

Pero no conozco por ahora ninguna alternativa a
Código:
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.


« Última modificación: 8 Diciembre 2010, 19:34 pm por Sauw » En línea

Beakman

Desconectado Desconectado

Mensajes: 190



Ver Perfil WWW
Re: Varias dudas C++: Volver todas las varibles a 0, alternativa a system("cls");...
« Respuesta #1 en: 8 Diciembre 2010, 20:38 pm »

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.


En línea

Sauw

Desconectado Desconectado

Mensajes: 8


Ver Perfil
Re: Varias dudas C++: Volver todas las varibles a 0, alternativa a system("cls");...
« Respuesta #2 en: 8 Diciembre 2010, 21:45 pm »

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:

Código:
Todaslasvaribles=0;
En línea

Beakman

Desconectado Desconectado

Mensajes: 190



Ver Perfil WWW
Re: Varias dudas C++: Volver todas las varibles a 0, alternativa a system("cls");...
« Respuesta #3 en: 8 Diciembre 2010, 21:56 pm »

ah oka.

Podrías ponerlas así:
Código:
operacion = opcion[ 0 ] = opcion[ 1 ] = i = resultado = menu[ 0 ] = menu[ 1 ] = 0;
Solo te ahorras lineas.
En línea

Sauw

Desconectado Desconectado

Mensajes: 8


Ver Perfil
Re: Varias dudas C++: Volver todas las varibles a 0, alternativa a system("cls");...
« Respuesta #4 en: 9 Diciembre 2010, 07:30 am »

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

« Última modificación: 15 Diciembre 2010, 07:38 am por Sauw » En línea

Littlehorse
All the world's a stage
Moderador
***
Desconectado Desconectado

Mensajes: 2.714


Nie Dam Sie


Ver Perfil WWW
Re: Varias dudas C++: Volver todas las varibles a 0, alternativa a system("cls");...
« Respuesta #5 en: 9 Diciembre 2010, 19:38 pm »

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

Código
  1. #ifdef _WIN32 //O lo que quieras utilizar
  2. #define CLEAN system("cls"); //Para Windows
  3. #else
  4. #define CLEAN system("clear"); //Para *nix
  5. #endif
  6.  

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
En línea

An expert is a man who has made all the mistakes which can be made, in a very narrow field.
Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines