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

 

 


Tema destacado: Los 10 CVE más críticos (peligrosos) de 2020


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Me tiene loco
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] 2 Ir Abajo Respuesta Imprimir
Autor Tema: Me tiene loco  (Leído 4,967 veces)
kayron8

Desconectado Desconectado

Mensajes: 28


¡Tú mismo con tu mecanismo!


Ver Perfil WWW
Me tiene loco
« en: 7 Abril 2013, 12:31 pm »

Muy buenos días a todos y a todas, por si no tuviera suficiente con las funciones, ya entramos de lleno al paso por referencia y la recursividad :(

Tengo el siguiente ejercicio que creo que lo tengo casi hecho pero de tal caos que tengo en mi mente no sé cómo continuar…

El ejercicio dice lo siguiente:
4.- Realizar un programa que pida dos números enteros por teclado y muestre por
pantalla el siguiente menú:
+ --> SUMAR      
- --> RESTAR
* --> MULTIPLICAR
/ --> DIVIDIR
^ --> POTENCIA
! --> FACTORIAL
s --> SALIR

El usuario deberá elegir introducir dos valores y a continuación elegir una opción
(pulsando el carácter correspondiente), el programa deberá mostrar el resultado por pantalla.
En este caso para calcular el resultado habrá que llamar a una función con el siguiente prototipo:
void operacion (int n1, int n2, char oper, float* resul, int *error);
siendo:
  • n1, n2: dos parámetros pasados por valor que representan los dos números sobre
los que se quiere operar.
  • oper: un parámetro pasado por valor que indica el tipo de operación que se debe
realizar sobre n1 y n2. Así si queremos realizar una suma este parámetro deberá tener el valor ‘+’, siendo para el resto de los casos: resta ‘-‘, multiplicación: ‘*’,
división ‘/’, potencia ’^’, factorial ‘!’.
  • result: es un parámetro pasado por referencia donde se almacenará el resultado
de la operación.
  • error: es un parámetro pasado por referencia donde se almacenará si la
operación se ha resuelto o no con éxito. Los posibles valores que puede tomar
son:
o -1: si ha habido problemas al realizar la operación, como por ejemplo una
división entre cero o el factorial de un número negativo.
o 1: si la operación concluyó con éxito.

El código que llevo hasta ahora, es el siguiente:
Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <math.h>
  4.  
  5. //PROTOTIPS
  6. void operacion(int n1, int n2, char oper, float *resul, int *error);
  7. float fact(float n1);
  8.  
  9. //BLOC PRINCIPAL
  10. int main(){
  11.    char opcio;
  12.    int num1=0,num2=0,error;
  13.    float result=0;
  14.  
  15.    //Demanem 2 numeros a l'usuari
  16.    printf("Introdueix el primer numero:\n");
  17.    scanf("%d",&num1);
  18.  
  19.    printf("Introdueix el segon numero:\n");
  20.    scanf("%d",&num2);
  21.  
  22.    //Mostrem el menú
  23. do{
  24.        printf("+ --> SUMAR\n");
  25.        printf("- --> RESTAR\n");
  26.        printf("* --> MULTIPLICAR\n");
  27.        printf("/ --> DIVIDIR\n");
  28.        printf("^ --> POTENCIA\n");
  29.        printf("! --> FACTORIAL\n");
  30.        printf("s --> SALIR\n");
  31.  
  32.        //Usuari tria una opció
  33. printf("Selecciona una opcio:\n");
  34.        scanf("%c",&opcio);
  35.  
  36.        //Cridem el procediment
  37.        operacion(n1, n2, oper, *resul, *error);
  38.  
  39. //Condició de sortida de while    
  40.    }while(opcio!='s');
  41.  
  42.    system("pause");
  43.    return 0;
  44. }
  45.  
  46. //PROCEDIMENT
  47. void operacion(int n1, int n2, char oper, float *resul, int *error){
  48.     *error=1;
  49.     switch(oper){
  50.              case '+':
  51.                   *resul=n1+n2;
  52.                       break;
  53.              case '-':
  54.                   *resul=n1-n2;
  55.                       break;
  56.              case '*':
  57.                   *resul=n1*n2;
  58.                       break;
  59.              case '/':
  60.                       if(n2==0)*error=-1;
  61.                       else *resul=n1/n2;
  62.                       break;
  63.              case '^':
  64.                   *resul=pow(n1,n2);
  65.                       break;
  66.              case '!':
  67.                   if(n1==0 || n2==0)*error=-1;
  68.                   else
  69.                   printf("El factorial de n1 es: %lf\n",fact(n1));
  70.                   printf("\n");
  71.                       break;
  72.              case 's':
  73.                   system("exit");
  74.                       break;
  75.              default:
  76.                       printf("No has escollit una opcio correcta\n");                  
  77.     }
  78. }
  79.  
  80. //FUNCIÓ
  81. float fact(float n1){
  82.    if(n1==0 || n1==1)
  83.       return 1;
  84.    else
  85.        return n1*factorial(n1-1);
  86. }

Espero que me puedan ayudar :D


« Última modificación: 7 Abril 2013, 12:35 pm por kayron8 » En línea

¡Salu2 a to2!
amchacon


Desconectado Desconectado

Mensajes: 1.211



Ver Perfil
Re: Me tiene loco
« Respuesta #1 en: 7 Abril 2013, 13:16 pm »

Yo lo veo entero...


En línea

Por favor, no me manden MP con dudas. Usen el foro, gracias.

¡Visita mi programa estrella!

Rar File Missing: Esteganografía en un Rar
kayron8

Desconectado Desconectado

Mensajes: 28


¡Tú mismo con tu mecanismo!


Ver Perfil WWW
Re: Me tiene loco
« Respuesta #2 en: 7 Abril 2013, 13:42 pm »

Yo lo veo entero...

Bien, una pregunta más, ¿los resultados de las operaciones, que es más correcto, mostrarlas en el switch o en el main?

¿Para mostrarlos con el printf debo poner un & delante del nombre de la variable o algo así?

Es decir, printf(“El resultado de la suma es: %f”,&resul);

¿O estoy equivocado?

Un saludo
En línea

¡Salu2 a to2!
0xDani


Desconectado Desconectado

Mensajes: 1.077



Ver Perfil
Re: Me tiene loco
« Respuesta #3 en: 7 Abril 2013, 13:54 pm »

Pues a no ser que quieras que el printf te muestre la direccion de memoria en la que esta almacenada la variable, no tienes que ponerle el ampersand (&).

Saludos.
En línea

I keep searching for something that I never seem to find, but maybe I won't, because I left it all behind!

I code for $$$
Hago trabajos en C/C++
Contactar por PM
avesudra


Desconectado Desconectado

Mensajes: 724


Intentando ser mejor cada día :)


Ver Perfil
Re: Me tiene loco
« Respuesta #4 en: 7 Abril 2013, 14:16 pm »

Cosas que comentarte:
 - Al pasarle los parámetros a la función "operación" , éstos tienen que tener el mismo nombre que el que has puesto en el prototipo dado que tu    puedes pasarle cualquier variable del mismo tipo...Me refiero a esta línea:
Código
  1. operacion(n1, n2, oper, *resul, *error);
Donde:
-No están declaradas ni n1 ni n2 ni oper. Y resul no existe, es result.
- Al pasarle a la función un parámetro por referencia le tienes que pasar la dirección de memoria de la variable, con el operador &.Me refiero a la misma línea de antes quedando:
Código
  1. operacion(num1,num2,&result,&error);
Dado que el prototipo es un puntero y le tienes que pasar una dirección de memoria,  como por ejemplo result que es donde se va a guardar el resultado.
-En la función fact, vuelves a llamar a la misma función pero esta se llama fact no factorial  ;)
Código
  1. return n1*factorial(n1-1);
El código lo he corregido así por encima:
Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <math.h>
  4.  
  5. //PROTOTIPS
  6. void operacion(int n1, int n2, char oper, float *resul, int *error);
  7. float fact(float n1);
  8.  
  9. //BLOC PRINCIPAL
  10. int main()
  11. {
  12.    char opcio;
  13.    int num1 = 0,num2 = 0,error;
  14.    float result = 0;
  15.  
  16.    //Demanem 2 numeros a l'usuari
  17.    printf("Introdueix el primer numero:\n");
  18.    scanf("%d",&num1);
  19.  
  20.    printf("Introdueix el segon numero:\n");
  21.    scanf("%d",&num2);
  22.    /*Limpio stdin (el buffer de entrada) porque a mí no me funciona...
  23.      *Las llaves son para marcar bloques,así la variable c no existirá despues de ese bloque.
  24.      */
  25.    {
  26.        char c = 5;
  27.        while( (c != EOF) && c != '\n')
  28.        {
  29.            c = getchar();
  30.        }
  31.    }
  32.    //Mostrem el menú
  33.    do
  34.    {
  35.        printf("+ --> SUMAR\n");
  36.        printf("- --> RESTAR\n");
  37.        printf("* --> MULTIPLICAR\n");
  38.        printf("/ --> DIVIDIR\n");
  39.        printf("^ --> POTENCIA\n");
  40.        printf("! --> FACTORIAL\n");
  41.        printf("s --> SALIR\n");
  42.  
  43.        //Usuari tria una opció
  44.        printf("Selecciona una opcio:\n");
  45.  
  46.        scanf("%c",&opcio);
  47.        //Cridem el procediment
  48.        operacion(num1, num2, opcio, &result, &error);
  49.        printf("%f\n",result);
  50.        /* Esto tampoco me funciona a mí y tengo que poner dos getchar o limpiar el buffer de nuevo.*/
  51.        {
  52.            char c = 5;
  53.            while( (c != EOF) && c != '\n')
  54.            {
  55.                c = getchar();
  56.            }
  57.        }
  58.        getchar();
  59.  
  60.        system("cls");// "clear" en linux...
  61.        //Condició de sortida de while
  62.    }
  63.    while(opcio!='s');
  64.  
  65.    system("pause");
  66.    return 0;
  67. }
  68.  
  69. //PROCEDIMENT
  70. void operacion(int n1, int n2, char oper, float *resul, int *error)
  71. {
  72.    *error=1;
  73.    switch(oper)
  74.    {
  75.    case '+':
  76.        *resul=n1+n2;
  77.        break;
  78.    case '-':
  79.        *resul=n1-n2;
  80.        break;
  81.    case '*':
  82.        *resul=n1*n2;
  83.        break;
  84.    case '/':
  85.        if(n2==0)*error=-1;
  86.        else *resul=n1/n2;
  87.        break;
  88.    case '^':
  89.        *resul=pow(n1,n2);
  90.        break;
  91.    case '!':
  92.        if(n1==0 || n2==0)*error=-1;
  93.        else
  94.            printf("El factorial de n1 es: %lf\n",fact(n1));
  95.        printf("\n");
  96.        break;
  97.    case 's':
  98.        system("exit");
  99.        break;
  100.    default:
  101.        printf("No has escollit una opcio correcta\n");
  102.    }
  103. }
  104.  
  105. //FUNCIÓ
  106. float fact(float n1)
  107. {
  108.    if(n1==0 || n1==1)
  109.        return 1;
  110.    else
  111.        return n1*fact(n1-1);
  112. }
  113.  
Lo de limpiar el buffer no es algo que me guste, lo veo chapucero, pero bueno...
Creo que el problema es que sigues sin tener soltura con las funciones,y entonces si ya te meten punteros... Una función la declaras:
Código
  1. int miFuncion(int miParametro1,int miParametro2);
Y después al llamarla puedes pasarle la variable que quieras siempre respetando que sea un entero! Así por ejemplo:
Código
  1. valorDeRetorno = miFuncion(1,2);
O :
Código
  1. valorDeRetorno = miFuncion(num1,num2);
En el caso del paso de parámetros por referencia, lo que se le pasa es la dirección de la variable en vez de copiar su valor, un programa de ejemplo vale más que mi palabras:
Código
  1. #include <stdio.h>
  2.  
  3. /*
  4.  * Se copian los valores en direcciones de memoria distintas.
  5.  * @param[in] miParametro1 Valor de una variable.
  6.  * @param[in] miParametro2 Valor de otra variable.
  7.  * @return    Multiplicación de miParámetro1 por miParametro2.
  8.  */
  9. int miFuncionNormal(int miParametro1,int miParametro2);
  10. /*
  11.  * Se pasan las direcciones a esos valores.
  12.  * @param[in] miParametro1 Dirección de variable.
  13.  * @param[in] miParametro2 Dirección de otra variable.
  14.  * @return    Multiplicación de miParámetro1 por miParametro2.
  15.  */
  16. int miFuncionPorReferencia (int * miParametro1,int * miParametro2);
  17. /*
  18.  * Las variables de los parámetros asumen la dirección de la variables pasadas.
  19.  * @param[in] miParametro1 Variable.
  20.  * @param[in] miParametro2 Variable.
  21.  * @return    Multiplicación de miParámetro1 por miParametro2.
  22.  */
  23. int miFuncionPorReferencia2(int &miParametro1,int &miParametro2);
  24.  
  25. int main(int argc, char *argv[])
  26. {
  27.    int miNumero1 = 1;
  28.    int miNumero2 = 2;
  29.    printf("Direccion de memoria de miNumero1: \t 0x%X \t Valor: %d\n",&miNumero1,miNumero1);
  30.    printf("Direccion de memoria de miNumero2: \t 0x%X \t Valor: %d\n",&miNumero2,miNumero2);
  31.    /*
  32.      * Pasamos los valores.
  33.      */
  34.    miFuncionNormal(miNumero1,miNumero2);
  35.    /*
  36.      * Pasamos las direcciones de memoria.
  37.      */
  38.    miFuncionPorReferencia(&miNumero1,&miNumero2);
  39.    /*
  40.      * Pasamos las direcciones de memoria y se les hace el cast.
  41.      */
  42.    miFuncionPorReferencia2(miNumero1,miNumero2);
  43.    return 0;
  44. }
  45. int miFuncionNormal(int miParametro1, int miParametro2)
  46. {
  47.    printf("\n\nDireccion de memoria de miParametro1: 0x%X \t Valor: %d\n",&miParametro1,miParametro1);
  48.    printf("Direccion de memoria de miParametro2: 0x%X \t Valor: %d\n",&miParametro2,miParametro2);
  49.    printf("Direcciones de memoria diferentes a las de miNumero, pero valores iguales.\n\n");
  50.    return miParametro1 * miParametro2;
  51. }
  52. int miFuncionPorReferencia (int * miParametro1,int * miParametro2)
  53. {
  54.    printf("Direccion de memoria de miParametro1: 0x%X \t Valor: %d\n",miParametro1,*miParametro1);
  55.    printf("Direccion de memoria de miParametro2: 0x%X \t Valor: %d\n",miParametro2,*miParametro2);
  56.    printf("Direcciones de memoria iguales a las de miNumero, accediendo a los mismos valores obviamente.\n\n");
  57.    /*
  58.      *  Accediendo a los valores de las direcciones de memoria con el operador '*'.
  59.      */
  60.    return *miParametro1 * *miParametro2;
  61. }
  62. int miFuncionPorReferencia2(int &miParametro1,int &miParametro2)
  63. {
  64.    printf("\n\nDireccion de memoria de miParametro1: 0x%X \t Valor: %d\n",&miParametro1,miParametro1);
  65.    printf("Direccion de memoria de miParametro2: 0x%X \t Valor: %d\n",&miParametro2,miParametro2);
  66.    printf("Direcciones de memoria diferentes a las de miNumero, pero valores iguales.\n\n");
  67.    return miParametro1 * miParametro2;
  68. }
La función miFuncionPorReferencia2 no la tengo muy clara,se utilizarla pero no se explicarla resulta raro pero así es, a ver si alguno de aquí te lo puede explicar mejor.Ejecuta ese programa y mira detenidamente las salidas, te dejo mi salida por si no puedes o lo que sea:
Código:
Direccion de memoria de miNumero1: 0x1A9CBD38 Valor: 1
Direccion de memoria de miNumero2: 0x1A9CBD3C Valor: 2


Direccion de memoria de miParametro1: 0x1A9CBD0C Valor: 1
Direccion de memoria de miParametro2: 0x1A9CBD08 Valor: 2
Direcciones de memoria diferentes a las de miNumero, pero valores iguales.

Direccion de memoria de miParametro1: 0x1A9CBD38 Valor: 1
Direccion de memoria de miParametro2: 0x1A9CBD3C Valor: 2
Direcciones de memoria iguales a las de miNumero, accediendo a los mismos valores obviamente.



Direccion de memoria de miParametro1: 0x1A9CBD38 Valor: 1
Direccion de memoria de miParametro2: 0x1A9CBD3C Valor: 2
Direcciones de memoria diferentes a las de miNumero, pero valores iguales.
« Última modificación: 7 Abril 2013, 14:59 pm por avesudra » En línea

Regístrate en
kayron8

Desconectado Desconectado

Mensajes: 28


¡Tú mismo con tu mecanismo!


Ver Perfil WWW
Re: Me tiene loco
« Respuesta #5 en: 7 Abril 2013, 15:02 pm »

Una cosilla, yo el EOF sí que se lo que es, lo que pasa que en clase no lo hemos hecho aún, ¿como lo puedo substituir para que me siga funcionando?

Gracias una vez más :D
« Última modificación: 7 Abril 2013, 15:40 pm por kayron8 » En línea

¡Salu2 a to2!
avesudra


Desconectado Desconectado

Mensajes: 724


Intentando ser mejor cada día :)


Ver Perfil
Re: Me tiene loco
« Respuesta #6 en: 7 Abril 2013, 15:27 pm »

Ni idea, supongo que podrás sustituirlo por su valor simbólico pero es lo mismo osea que nada. Una sugerencia, no cites cuando los comentarios son tan largos  ;)
En línea

Regístrate en
85

Desconectado Desconectado

Mensajes: 206



Ver Perfil WWW
Re: Me tiene loco
« Respuesta #7 en: 7 Abril 2013, 16:41 pm »

qué citón que se mandó XD, por cierto que idioma es ese de kayron8, parece español pero no precisamente..

Saludos
En línea

Me cerraron el Windows Live Spaces, entonces me creé un WordPress XD
http://etkboyscout.wordpress.com/
avesudra


Desconectado Desconectado

Mensajes: 724


Intentando ser mejor cada día :)


Ver Perfil
Re: Me tiene loco
« Respuesta #8 en: 7 Abril 2013, 16:49 pm »

qué citón que se mandó XD, por cierto que idioma es ese de kayron8, parece español pero no precisamente..

Saludos
Te respondo por kayron8 si no te importa.Es Catalán, se habla en Cataluña, comunidad autónoma de España y cuya capital es Barcelona.(la zona resaltada es la comunidad autónoma). Si eres Argentino o del otro lado del charco como aquí decimos, creo que es algo normal que no lo conozcas, a no ser que seas culé(aficionado al F.C Barcelona).
En línea

Regístrate en
85

Desconectado Desconectado

Mensajes: 206



Ver Perfil WWW
Re: Me tiene loco
« Respuesta #9 en: 7 Abril 2013, 16:58 pm »

Lo que conocía es que hay una región llamada Cataluña (no sabía su localización específica), se de la ciudad Barcelona y se del 'Barsa' XD, pero no sabía del idioma o dialecto de esa región.  ;-) ;-)
gracias por la información.
En línea

Me cerraron el Windows Live Spaces, entonces me creé un WordPress XD
http://etkboyscout.wordpress.com/
Páginas: [1] 2 Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
una preguntilla q me tiene loco
Juegos y Consolas
MaGö 1 1,321 Último mensaje 6 Noviembre 2006, 13:34 pm
por DJ46
nesesito ayuda desesperadamente este problema me tiene loco
Multimedia
LAmborgini 0 1,464 Último mensaje 26 Junio 2007, 16:44 pm
por LAmborgini
Una duda q me tiene loco
Programación Visual Basic
Perfect Hiden 8 2,306 Último mensaje 1 Junio 2008, 22:43 pm
por krackwar
HTTPBasicAuthHandler() me tiene loco
Scripting
ruben_linux 0 1,621 Último mensaje 3 Enero 2012, 19:42 pm
por ruben_linux
Iframe me tiene loco
Desarrollo Web
eugeniocol 3 1,725 Último mensaje 19 Marzo 2017, 21:41 pm
por eugeniocol
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines