• Sábado 4 de Mayo de 2024, 08:26

Autor Tema:  No logro regresar el resultado en llamado a función  (Leído 1512 veces)

LenguajeC

  • Miembro activo
  • **
  • Mensajes: 28
  • Nacionalidad: ar
    • Ver Perfil
No logro regresar el resultado en llamado a función
« en: Lunes 10 de Mayo de 2010, 00:43 »
0
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++.-
abraza las cosas y personas malas como si fueran tu mas preciada joya,
Son tus mas grandes maestros de paciencia sabiduría y amor
y cuando lo abrazas dejan de causar dolor.-

vite666

  • Nuevo Miembro
  • *
  • Mensajes: 13
    • Ver Perfil
Re: No logro regresar el resultado en llamado a función
« Respuesta #1 en: Lunes 10 de Mayo de 2010, 03:53 »
0
y cual es su problema?

LenguajeC

  • Miembro activo
  • **
  • Mensajes: 28
  • Nacionalidad: ar
    • Ver Perfil
Re: No logro regresar el resultado en llamado a función
« Respuesta #2 en: Lunes 10 de Mayo de 2010, 18:15 »
0
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
abraza las cosas y personas malas como si fueran tu mas preciada joya,
Son tus mas grandes maestros de paciencia sabiduría y amor
y cuando lo abrazas dejan de causar dolor.-

Epa

  • Miembro MUY activo
  • ***
  • Mensajes: 242
  • Nacionalidad: ar
    • Ver Perfil
Re: No logro regresar el resultado en llamado a función
« Respuesta #3 en: Lunes 10 de Mayo de 2010, 20:30 »
0
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
The sweet smell of a great sorrow lies over the land.


LenguajeC

  • Miembro activo
  • **
  • Mensajes: 28
  • Nacionalidad: ar
    • Ver Perfil
Re: No logro regresar el resultado en llamado a función
« Respuesta #4 en: Martes 11 de Mayo de 2010, 02:51 »
0
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
abraza las cosas y personas malas como si fueran tu mas preciada joya,
Son tus mas grandes maestros de paciencia sabiduría y amor
y cuando lo abrazas dejan de causar dolor.-