Bienvenido(a), Visitante. Favor de ingresar o registrarse.

Ingresar con nombre de usuario, contraseña y duración de la sesión

Foros del Club

Páginas: [1]   Ir Abajo
  Enviar tema  |  Imprimir  
Autor Tema: Proble con calculadora en GCC  (Leído 1603 veces)
0 Usuarios y 1 Visitante están viendo este tema.
JoRgE-1987
Programador
Legend
**********

Prestigio: 7
Desconectado Desconectado

Sexo: Masculino
Título universitario: No.
Profesión: Programador
Mensajes: 633

Geek


WWW
Lenguajes:
Object Pascal
Pascal
HTML
Aprendiendo C++
« en: 29/09/2006, 05:05:33 »

Código
#include <stdio.h>
float a,b,c;
int i;
 
int ingre(float n1, float n2)
{
 printf("%s\n","Ingrese el primer Numero:");
 scanf("%f",&n1);
 printf("%s\n","Ingrese el segundo Numero:");
 scanf("%f",&n2);
 printf("%s\n","Ingreso finalizado");
 return 0;
}
 
int suma(float n1, float n2)
{
 return (n1 + n2);
}
 
int resta(float n1, float n2)
{
 return (n1 - n2);
}
 
int mult(float n1, float n2)
{
 return (n1 * n2);
}
 
int division(float n1, float n2)
{
 return (n1 / n2);
}
 
int main()
{
 a = 1;
 b = 1;
 do
 {
   system("clear");
   printf("%s\n","Ingrese 1 para ingresar los valores");
   printf("%s\n","Ingrese 2 para sumar");
   printf("%s\n","Ingrese 3 para restar");
   printf("%s\n","Ingrese 4 para multiplicar");
   printf("%s\n","Ingrese 5 para dividir");
   printf("%s\n","Ingrese cualquier otro valor para salir");
   printf("%s\n","---------------------------------------");
   printf("%s\n","Ingrese el valor deseado:");
   scanf("%i",&i);
   switch(i)
   {
     case 1: ingre(a,b); break;
     case 2: c = suma(a,b); break;
     case 3: c = resta(a,b); break;
     case 4: c = mult(a,b); break;
     case 5: c = division(a,b); break;
     default: i = 0; break;
   }
   printf("%s\n","Resultado:");
   printf("%f\n",c);
   printf("Presione enter para continuar:\n");
   getchar();
 //  system("clear");
 }
 while (i != 0);
 return 0;
}

Hace cualquier cosa, no se corta en el getchar, no suma, no resta, no nada. :S:S:S:S::S

Que pasa???

Saludos Cheesy:D
En línea


Tavo
Technocrat
*********

Prestigio: 0
Desconectado Desconectado

Sexo: Masculino
Título universitario: Ninguno
Profesión: GameDeveloper(GD) y Desarrollador
Mensajes: 144




Lenguajes:
Visual Basic
Real Basic
Python
C/C++
Java
SQL
Bases de datos:
SQLite
MySQL
« Respuesta #1 en: 29/09/2006, 23:04:55 »

Realmente no tenes idea de programacion estructurada. Una variable global esta re-colgada ya que no sirve, por otra parte, es raro, ya que el planteo a simple vista esta bien...
(Prova utilizando double en vez de flout)
En línea

CID
Administrador
Legend
*****

Prestigio: 22
Desconectado Desconectado

Sexo: Masculino
Estudiante de: Arte de la informática
Título universitario: Programador
Profesión: Desarrollador
Mensajes: 1136



WWW
Lenguajes:
Varios
Bases de datos:
Varios
« Respuesta #2 en: 30/09/2006, 00:40:34 »

Bueno Jorge, aca va la solución.

Lo primero que encuentro es un error aqui:

Código
int ingre(float n1, float n2)
{
 printf("%s\n","Ingrese el primer Numero:");
 scanf("%f",&n1);
 printf("%s\n","Ingrese el segundo Numero:");
 scanf("%f",&n2);
 printf("%s\n","Ingreso finalizado");
 return 0;
}

Las variables n1 y n2 son variables locales de la función, fuera de ella no existen. Ese código solicita dos float y los guarda respectivamente en n1 y n2, pero al finalizar la ejecución de la función, éstos datos se pierden porque la pila interna de tu programa elimina las variables locales de dicha funcion al finalizar.
Resumiendo: lo que lees se pierde.
Asi que modificandolo por el siguiente código todo deberia andar bien:

Código
int ingre(float n1, float n2)
{
 printf("%s\n","Ingrese el primer Numero:");
 scanf("%f",&a);
 printf("%s\n","Ingrese el segundo Numero:");
 scanf("%f",&b);
 printf("%s\n","Ingreso finalizado");
 return 0;
}

Fijate que tenes variables inutiles ahi, te dejo a vos limpiar el código.

Otro de los problemas que se presentan al compilar bajo gcc en linux es que system("pause") no funciona, getchar() no funciona como esperamos aunque limpiemos el buffer de salida.
La solución es utilizar otra función que a fines practicos sirve (modificar la última parte por esto):

Código
    printf("%s\n","Resultado:");
   printf("%f\n",c);
printf("Presione enter para continuar:\n");
__fpurge(stdin); //linux
//fflush(stdin); //windows
getchar();
 }
 while (i != 0);
 return 0;
}

Y por ultimo, un consejo ya que se que recien comenzas. Trata de modularizar sin utilizar variables globales, suelen prestarse para errores si no se controlan bien.
Cualquier cosa preguntas.

Saludos.
En línea

JoRgE-1987
Programador
Legend
**********

Prestigio: 7
Desconectado Desconectado

Sexo: Masculino
Título universitario: No.
Profesión: Programador
Mensajes: 633

Geek


WWW
Lenguajes:
Object Pascal
Pascal
HTML
Aprendiendo C++
« Respuesta #3 en: 30/09/2006, 10:06:49 »

Realmente no tenes idea de programacion estructurada. Una variable global esta re-colgada ya que no sirve, por otra parte, es raro, ya que el planteo a simple vista esta bien...
(Prova utilizando double en vez de flout)

Bueno, querido compañero de foro Tavo, realmente no voy a responder como lo hiciste vos, asi que ni te voy a faltar el resperto ni nada, pero como una simple cuestion que me gustaria que tengas en cuenta, es que si ves que una persona, no sabe algo, y que si lo pregunta en un foro, es porque obviamente no lo sabe resolver, diciendome textualmente:
Realmente no tenes idea de programacion estructurada.
La verdad es que no me estas ayudando mucho con el caso, aparte, como veras, si se programacion estucturada, nada mas que en otro lenguaje, y ahora estoy viendo aprender C, lamentablemente, no soy lo suficientemente inteligente, como para sin tener de donde leer, haberme dado cuenta del error. Me hubiera gustado, si es que en realidad tenias ganas de responder, hubieras dedicado unos 2 minutos mas leyendo, y me hubieras podido dar una respuesta mas util, pero de todas maneras, gracias por leer.


Muchas gracias CID, ahora estoy organizando los cambios, y bueno, todos los dias se aprende algo nuevo no?

Saludos Cheesy:D
« Última modificación: 01/09/2008, 11:38:32 por JoRgE-1987 » En línea


Tavo
Technocrat
*********

Prestigio: 0
Desconectado Desconectado

Sexo: Masculino
Título universitario: Ninguno
Profesión: GameDeveloper(GD) y Desarrollador
Mensajes: 144




Lenguajes:
Visual Basic
Real Basic
Python
C/C++
Java
SQL
Bases de datos:
SQLite
MySQL
« Respuesta #4 en: 30/09/2006, 13:27:41 »

Yo no lo hice con mala intencion. Si sabes PE la aplicas en todos los lenguajes, no tienen nada que ver.
Por otra parte, yo que vos aprenderia C++ antes que C, ya que C te permite hacer cualquier cosa (Si, si, cosas realmente muy feas que otros lenguajes no te lo permiten).
Igual, si vos venis de Delphy yo me tiraria al C#, pero bueno.

Sobre la calculadora, no seria mas facil hacer una funcion que analice si multiplica, suma, resta y divide, y que ingre la llame?, igual, eso esta bien para el principio, pero igual, no es recomendable hacer funciones de una sentencia si van a ser llamadas pocas veces.

(Te muestro una calculadora simple en C++):
Código
#include <iostream>
using namespace std;
 
int do_calc(int num1, int num2, int calcu){
  switch(calcu){
       case 1: return num1+num2;
       case 2: return num1-num2;
       case 3: return num1*num2;
       case 4: return num1/num2;
  }
  return 0;
}
 
int main(){
  int num1, num2, calcu;
 // num1 y num2 son los numeros, mientras calcu la operacion a realizar
 
 cout << "Ingrese un numero " << endl;
 cin >> num1;
 cin.get();
 
 cout << "Ingrese otro numero " << endl;
 cin >> num2;
 cin.get();
 
 cout << "Ingrese la operacion que desea realizar" << endl << "1: Sumar" << endl;
 cout << "2: Restar" << endl << "3: Multiplicar" << endl << "4: Dividir" << endl;
 cin >> calcu;
 cin.get();
 
 cout << "Resultado: "  << do_calc(num1, num2, calcu) << endl;
 cin.get();
 return 0;
}
 
En línea

JoRgE-1987
Programador
Legend
**********

Prestigio: 7
Desconectado Desconectado

Sexo: Masculino
Título universitario: No.
Profesión: Programador
Mensajes: 633

Geek


WWW
Lenguajes:
Object Pascal
Pascal
HTML
Aprendiendo C++
« Respuesta #5 en: 30/09/2006, 13:54:38 »

Epa epa, vamos de a poco dijo el señor Jack, espera a que me funcione la calculadora simple que estoy haciendo, y me pongo a jugar con el codigo que pusiste vos.

Son muchas cosas para un solo dia, XD.

Saludos Cheesy:D
En línea


JoRgE-1987
Programador
Legend
**********

Prestigio: 7
Desconectado Desconectado

Sexo: Masculino
Título universitario: No.
Profesión: Programador
Mensajes: 633

Geek


WWW
Lenguajes:
Object Pascal
Pascal
HTML
Aprendiendo C++
« Respuesta #6 en: 30/09/2006, 14:15:15 »

Aca esta la version final, que funciona perfectamente (creo).

Una vez que ya la tenga mas clara, paso a mostrales, o a preguntarles nuevas cosas.

Quizas esto le sirva a alguien que quiere comenzar.

Código
//Calculadora en C
//Compilada en GCC sobre Ubuntu 6.06 LTS
//gcc -o calculadora.ejecutable calculadora.c
//Programada por: Jorge Abreu
//Colaboraciones: CID
 
#include <stdio.h>
float a,b,c;
int i;
 
int ingre()
{
 printf("%s\n","Ingrese el primer Numero:");
 scanf("%f",&a);
 printf("%s\n","Ingrese el segundo Numero:");
 scanf("%f",&b);
 printf("%s\n","Ingreso finalizado");
 return 0;
}
 
int suma(float n1, float n2)
{
 return (n1 + n2);
}
 
int resta(float n1, float n2)
{
 return (n1 - n2);
}
 
int mult(float n1, float n2)
{
 return (n1 * n2);
}
 
int division(float n1, float n2)
{
 return (n1 / n2);
}
 
int resultado(float n1)
{
 printf("%s\n","Resultado:");
 printf("%f\n",n1);
 printf("Presione enter para continuar:\n");
 __fpurge(stdin); //linux
 //fflush(stdin); //windows
 getchar();  
 return (0);
}
 
int main()
{
 a = 1;
 b = 1;
 do
 {
   system("clear");
   printf("%s\n","Ingrese 1 para ingresar los valores");
   printf("%s\n","Ingrese 2 para sumar");
   printf("%s\n","Ingrese 3 para restar");
   printf("%s\n","Ingrese 4 para multiplicar");
   printf("%s\n","Ingrese 5 para dividir");
   printf("%s\n","Ingrese cualquier otro valor para salir");
   printf("%s\n","---------------------------------------");
   printf("%s\n","Ingrese el valor deseado:");
   scanf("%i",&i);
   switch(i)
   {
     case 1: ingre(); break;
     case 2: {c = suma(a,b);resultado(c); break;}
     case 3: {c = resta(a,b);resultado(c); break;}
     case 4: {c = mult(a,b);resultado(c); break;}
     case 5: {c = division(a,b);resultado(c); break;}
     default: i = 0; break;
   }
 
 
 //  system("clear");
 }
 while (i != 0);
 return 0;
}
 
 

Saludos Cheesy:D
En línea


xlarsx
Guru
***

Prestigio: 0
Desconectado Desconectado

Título universitario: Mecatrónica
Profesión: Programador
Mensajes: 3



Lenguajes:
C, C++, J2SE, JSP
Bases de datos:
MS SQL Server
« Respuesta #7 en: 20/05/2008, 23:09:06 »

Eso es seguro, cualquier cosa puede ser hecha con ANSI C , aquí otra versión de la misma calculadora básica:

Código:
#include <stdio.h>

int main()
{
  int num1, num2;
  char operador;
  float resultado;
  printf("Ingrese operacion\n");
  scanf("%i %c %i", &num1, &operador, &num2);
  switch(operador)
    {
    case '+':
      resultado = num1 + num2;
      break;
    case '-':
      resultado = num1 - num2;
      break;
    case '*':
      resultado = num1 * num2;
      break;
    case '/':
      resultado = num1 / num2;
      break;
    default:
      printf("Operador incorrecto");
      return 0;
      break;
    }

  printf("%i %c %i = %.2f", num1, operador, num2, resultado);

  return 0;

}

Esperando sea de utilidad, Saludos
En línea
Foros del Club
   

 En línea
Páginas: [1]   Ir Arriba
  Enviar tema  |  Imprimir  
 
Ir a: