Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: Manimecker en 21 Octubre 2011, 14:58 pm



Título: Problema con este programa básico
Publicado por: Manimecker en 21 Octubre 2011, 14:58 pm
Tengo el siguiente problema. Necesito crear un programa que reciba un número del usuario, y que después pida diferentes signos para ir cambiando eventualmente el primer número. Y que al final se muestre de la siguiente manera:
Si el símbolo es -, al valor se le resta 1.
Si el símbolo es +, al valor se le agrega 1.
Si el símbolo es /, al valor se divide entre 2.
Si el símbolo es *, al valor se multiplica por 2.

Código:
(10)-(9)*(18)/(9)+(10)+(11) y así...

Tengo el siguiente código:
Código
  1. #include <stdio.h>
  2.  
  3. int main()
  4. {
  5.    int N1[50], d2=0, d=1, i=0, d3=0; char S1[50];
  6.    for (int i3=0; i3<50; i3++)
  7.    {
  8.        N1[i3]=0;
  9.        S1[i3]=' ';
  10.    }
  11.    printf("Inserta un numero entero: ");
  12.    scanf("%d", &N1[0]);
  13.  
  14.    while (S1[d2] = '0')
  15.    {
  16.        printf("Inserta el simbolo + para que aumente su valor en 1.\n");
  17.        printf("Inserta el simbolo - para que reduzca su valor en 1. \n");
  18.        printf("Inserta el simbolo * para que multiplique su valor por 2.\n");
  19.        printf("Inserta el simbolo / para que divida su valor en 2.\n");
  20.        printf("Inserta la opcion (simbolo) deseada (0 para terminar): ");
  21.        scanf("%c", &S1[d2]);
  22.        if (S1[d2]=='0')
  23.            break;
  24.        switch (S1[d2])
  25.        {
  26.            case '+' : N1[d]=N1[i]+1; /*CH[d2]='+'*/; break;
  27.            case '-' : N1[d]=N1[i]-1; /*CH[d2]='-'*/; break;
  28.            case '*' : N1[d]=N1[i]*2; /*CH[d2]='*'*/; break;
  29.            case '/' : N1[d]=N1[i]/2; /*CH[d2]='/'*/; break;
  30.            default : break;
  31.        }
  32.        d++; i++; d2++;
  33.    }
  34.    for (int i2=0; i2<d2; i2++)
  35.    {
  36.        if (N1[i2]==0)
  37.            break;
  38.        else
  39.            printf("(%d)%c\n", N1[i2], S1[i2]);
  40.    }
  41. }
  42.  

Sin embargo, no logro descubir el error, además de que el primer bucle while se repite antes de que me deje escribir algo.

Muchas gracias de antemano.


Título: Re: Problema con este programa básico
Publicado por: Slava_TZD en 21 Octubre 2011, 16:11 pm
Citar
(10)-(9)*(18)/(9)+(10)+(11) y así...

No me he detenido mucho al leer tu código, hay cosas que no entiendo o que las veo "complicadas" (que se pueden hacer las sencillo). Mira este ejemplo que he hecho a partir de tu código.

Código
  1. #include <stdio.h>
  2. int main()
  3. {
  4.    int numa=0,opt=0,i=0;
  5.    char simba,charop[50][50];
  6.    printf("Inserta un numero entero: ");
  7.    scanf("%d", &numa);
  8.    while(i<3) { //El bucle se repetirá 3 veces
  9.        printf("Inserta el simbolo + para que aumente su valor en 1.\nInserta el simbolo - para que reduzca su valor en 1.\nInserta el simbolo * para que multiplique su valor por 2.\n");
  10.        printf("Inserta el simbolo / para que divida su valor en 2.\nInserta la opcion (simbolo) deseada (0 para terminar): ");
  11.        getchar(); //Recojemos
  12.        scanf("%c", &simba); //Se guarda el operados en simba, en el ejemplo solo vale +
  13.        switch(simba) {
  14.            case '+' :
  15.                if(i==0) sprintf(charop[0], "(%d)+(%d)", numa, numa+1); //Si es la "cabeza" del string se debe mostrar el primer numero y el resultado de sumarle 1
  16.                else sprintf(charop[i], "+(%d)", numa+1); //Por el contrario si no es la cabeza, empezamos con + y luego el resultado de sumarle 1 al último numero
  17.                numa++; //Se supone que si el usuario introduce + quiere que el numero original se vea aumentado en 1
  18.                i++; //subimos el valor de i para indicar que NO será la "cabeza" xD
  19.                break;
  20.        }
  21.    }
  22.    for(i=0;i<3;i++) printf("%s", charop[i]);
  23.    printf("\n");
  24. }
  25.  

Ya se que no es lo que pedías, es un ejemplo funcional de algo parecido. Luego simplemente tendrías que imprimir el array recursivamente así por ejemplo:
Código
  1. for(i=0;i<3;i++) printf("%s", charop[i]);
  2.    printf("\n");

Código:
Inserta un numero entero: 1
Inserta el simbolo + para que aumente su valor en 1.
Inserta el simbolo - para que reduzca su valor en 1.
Inserta el simbolo * para que multiplique su valor por 2.
Inserta el simbolo / para que divida su valor en 2.
Inserta la opcion (simbolo) deseada (0 para terminar): +
Inserta el simbolo + para que aumente su valor en 1.
Inserta el simbolo - para que reduzca su valor en 1.
Inserta el simbolo * para que multiplique su valor por 2.
Inserta el simbolo / para que divida su valor en 2.
Inserta la opcion (simbolo) deseada (0 para terminar): +
Inserta el simbolo + para que aumente su valor en 1.
Inserta el simbolo - para que reduzca su valor en 1.
Inserta el simbolo * para que multiplique su valor por 2.
Inserta el simbolo / para que divida su valor en 2.
Inserta la opcion (simbolo) deseada (0 para terminar): +
(1)+(2)+(3)+(4)

Saludos, suerte y buen finde.

PD: Trata de comentar el código, para que quien lo lea no tenga que pensar xq rayos sumas esto a aquello o se lo quitas a lo otro...etc xD


Título: Re: Problema con este programa básico
Publicado por: Manimecker en 21 Octubre 2011, 20:39 pm
Muchísimas gracias por tus comentarios, me haz solucionado el problemón que tenía con mi programa.

El problema es que yo tiendo a crear los códigos de una manera complicada, y nunca pienso que puede ser muy simple. Debo seguir practicando y pensar lógicamente en el problema y en su solución.

Muchísimas gracias, además de que no conocía el sprintf, y parece ser una buena solución.


Título: Re: Problema con este programa básico
Publicado por: rir3760 en 22 Octubre 2011, 01:41 am
Un detalle:
Código
  1. printf("Inserta el simbolo / para que divida su valor en 2.\nInserta la opcion (simbolo) deseada (0 para terminar): ");
  2. scanf("%c", &simba);
Cuando se utiliza el especificador "%c" este no descarta el espacio blanco previo (de ahi la llamada a getchar).

Para eliminar el espacio blanco y leer un unico caracter se puede utilizar:
Código
  1. printf("Inserta el simbolo / para que divida su valor en 2.\nInserta la opcion (simbolo) deseada (0 para terminar): ");
  2. scanf(" %c", &simba);
El espacio en " %c" es critico (con el se elimina primero el espacio blanco y solo entonces se lee el caracter).

Un saludo