SoloCodigo

Programación General => C/C++ => Mensaje iniciado por: LenguajeC en Lunes 10 de Mayo de 2010, 00:43

Título: No logro regresar el resultado en llamado a función
Publicado por: LenguajeC en Lunes 10 de Mayo de 2010, 00:43
Hola a todos.-
Como este es mi primer post voy a presentarme porque mi situación es un tanto particular.-
Tengo 58 años y por mi trabajo y por distar 90 km. de la universidad mas cercana no tengo otra manera que leer,leer y consultar en los foros.-
Bueno, a continuación les dejo mi primer problema para ver si me dan una mano con la solución y me dicen en que debo mejorar el programa.-

Código: C
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <windows.h>
  4. #include <conio.h>
  5.  
  6. HANDLE consola;
  7. COORD posicion;
  8.  
  9. void dlq(int hor, int ver);
  10. void ejemplos();
  11. double separa(char ingreso[], double *resultado);
  12. double *opciones(double memoria, double resultado);
  13.  
  14. int main(int argc, char *argv[])
  15. {
  16.    consola = GetStdHandle(STD_OUTPUT_HANDLE);
  17.    system("color 9E");
  18.    ejemplos();
  19.    double resultado,memoria=0;
  20.    char ingreso[50];
  21.    while (ingreso[0] != 's')
  22.    {
  23.       system("cls");
  24.       ejemplos();
  25.       dlq(20,4);printf(" Ingreso....:                      s - para finalizar");
  26.       dlq(18,51);printf("%5.3f",memoria);
  27.       dlq(20,18);
  28.       gets(ingreso);
  29.       if(ingreso[0] !='0')
  30.       {
  31.          separa(ingreso,&resultado);
  32.          if(resultado !=0)
  33.          {
  34.             dlq(18,17);
  35.             printf("%5.3f",resultado);
  36.             opciones(memoria,resultado);
  37.             ingreso[0]='';
  38.          }
  39.       }
  40.       else
  41.       {
  42.          system("color C1");
  43.          dlq(24,5);
  44.          printf("Ingreso incorrecto - por favor revise los ejemplos");
  45.          dlq(26,5);
  46.          system("pause");
  47.          system("color 9E");
  48.          dlq(26,5);
  49.       }
  50.    }  
  51.    return 0;
  52. }
  53.  
  54. void dlq(int hor, int ver)
  55. {
  56.    posicion.X = ver;posicion.Y = hor;SetConsoleCursorPosition(consola, posicion);
  57. }
  58.  
  59. double separa(char ingreso[], double *resultado)
  60. {
  61.    char opUno[50], oper[50], opDos[50], priseg=65;
  62.    int i=0, poper=0, pseg=0;
  63.    for(i = 0; i < strlen(ingreso); i++)
  64.    {
  65.       if((ingreso[i] == 42 || ingreso[i] == 43 || ingreso[i] == 45 || ingreso[i] == 47))
  66.       {
  67.          oper[poper]=ingreso[i];
  68.          oper[poper+1]= '';
  69.          poper++;
  70.          priseg=priseg+1;
  71.       }
  72.       else  
  73.       {  
  74.          if(priseg == 65)
  75.          {
  76.             opUno[i] = ingreso[i];
  77.             opUno[i+1] = '';
  78.          }
  79.          else
  80.          {
  81.             opDos[pseg] = ingreso[i];
  82.             opDos[pseg+1] = '';
  83.             pseg++;
  84.          }
  85.       }
  86.    }
  87.    char op_1[50], op_2[50];
  88.    int lugar = 0;
  89.    for(i=0;opUno[i]!='';i++)  
  90.    {
  91.       if((opUno[i] > 47 && opUno[i] < 58) || (opUno[i] == 46))      
  92.       {
  93.          op_1[lugar] = opUno[i];          
  94.          lugar++;
  95.          op_1[lugar] = '';
  96.       }
  97.    }
  98.    lugar = 0;
  99.    for(i=0;opDos[i]!='';i++)  
  100.    {
  101.       if((opDos[i] > 47 && opDos[i] < 58) || (opDos[i] == 46))      
  102.       {
  103.          op_2[lugar] = opDos[i];
  104.          lugar++;
  105.          op_2[lugar] = '';
  106.       }
  107.    }
  108.    if(strlen(opUno) ==  strlen(op_1) && strlen(opDos) ==  strlen(op_2) && strlen(oper) == 1)
  109.    {
  110.        double op_uno=0,op_dos=0;
  111.        op_uno=atof(op_1);op_dos=atof(op_2);  
  112.        if(oper[0] == '+')
  113.           *resultado = op_uno + op_dos;
  114.        if(oper[0] == '-')
  115.           *resultado = op_uno - op_dos;
  116.        if(oper[0] == '*')
  117.           *resultado = op_uno * op_dos;
  118.        if(oper[0] == '/')
  119.           *resultado = op_uno / op_dos;
  120.    }
  121.    else
  122.    {
  123.       *resultado = 0;
  124.    }
  125.    
  126.    return (*resultado);
  127. }
  128.  
  129. void ejemplos()
  130. {
  131.    dlq(2,4);
  132.    printf(" ---------------------- Calculadora lineal ----------------------");
  133.    dlq(4,4);printf(" Ejemplos:");
  134.    dlq(6,13);printf(" Suma...........: 125.4+18");
  135.    dlq(8,13);printf(" Resta..........: 125-10.54");
  136.    dlq(10,13);printf(" MultiplicacixA2n.: 125.48*10.50");
  137.    dlq(12,13);printf(" DivicixA2n.......: 678.48/5.99");
  138.    dlq(14,13);printf(" No dejar espacios - x3C Enter x3E confirma");
  139.    dlq(16,4);
  140.    printf(" ----------------------------------------------------------------");
  141.    dlq(18,4);printf(" Resultado..:                      Memoria....:");
  142. }
  143.  
  144.  
  145. double *opciones(double memoria,double resultado)
  146. {
  147.    dlq(22,5);
  148.    printf("----------------------------------------------------------------");
  149.    dlq(24,5);
  150.    printf("Opciones de memoria");
  151.    dlq(26,5);
  152.    printf("1 - Menoria +");
  153.    dlq(28,5);    
  154.    printf("2 - Menoria -");
  155.    dlq(30,5);
  156.    printf("3 - Borra memoria y memoria +");
  157.    dlq(32,5);
  158.    printf("4 - Borra memoria y memoria -");
  159.    dlq(34,5);
  160.    printf("5 - Sin ingerencia en memoria");
  161.    int opc=0;
  162.    while (opc <1 || opc > 5)
  163.    {
  164.       dlq(36,5);
  165.       printf("Ingreso...:");
  166.       scanf("%d",&opc);  
  167.       dlq(38,5);
  168.       switch(opc)
  169.       {
  170.          case 1:memoria = memoria + resultado;break;
  171.          case 2:memoria = memoria - resultado;break;
  172.          case 3:memoria = resultado;break;
  173.          case 4:memoria = - resultado;break;
  174.          case 5:break;
  175.          default:printf("Solo numeros del 1 al 5, apriete una tecla para continuar...");getch();
  176.       }
  177.    }
  178.    return &memoria;
  179. }
  180.  

Un gran saludo.-
Daniel
Nota:Lenguaje C - Windows XP - DEV-C++.-
Título: Re: No logro regresar el resultado en llamado a función
Publicado por: vite666 en Lunes 10 de Mayo de 2010, 03:53
y cual es su problema?
Título: Re: No logro regresar el resultado en llamado a función
Publicado por: LenguajeC en Lunes 10 de Mayo de 2010, 18:15
Hola vite666
Perdón que torpe, mil disculpas.-
El problema es que no logro regresar la variable "memoria" a la función main con el contenido que obtengo de la llamada "opciones(memoria,resultado);".-

Espero que ahora se entienda.-

Saludos.
Daniel
Título: Re: No logro regresar el resultado en llamado a función
Publicado por: Epa en Lunes 10 de Mayo de 2010, 20:30
Buenas.

Por un lado, en el llamado a funcion no estas asignando el valor de retorno a ninguna variable..

Por otro lado, la funcion devuelve un puntero a double, y estas devolviendo un putero a "memoria", lo que es una variable local a la funcion y cuando se sale de esta, esa memoria deja de estar reservada. El compilador deberia tirarte un warning en la linea del return.

Si la idea es registrar los cambios en la variable, podes hacer las siguientes modificaciones:

definir la funcion:
double opciones(double memoria,double resultado);
y hacer al llamado:
mamoria = opciones(memoria, resultado);

o
definir la funcion:
void opciones(double *memoria,double resultado);
y hacer el llamado a funcion:
opciones(&memoria, resultado);

para esta ultima hace falta cambiar el cuerpo de la funcion para que memoria sea tratada como un puntero.

Espero que sirva.
Saludos
Título: Re: No logro regresar el resultado en llamado a función
Publicado por: LenguajeC en Martes 11 de Mayo de 2010, 02:51
Hola Epa
Gracias por tu respuesta, voy a poner en práctica lo que me dices, solo que lo voy a hacer sin puntero porque estoy muy al principio y quiero ir despacio.-

Saludos.
Daniel