Test Foro de elhacker.net SMF 2.1

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.

(10)-(9)*(18)/(9)+(10)+(11) y así...

Tengo el siguiente código:
Código (cpp) [Seleccionar]

#include <stdio.h>

int main()
{
    int N1[50], d2=0, d=1, i=0, d3=0; char S1[50];
    for (int i3=0; i3<50; i3++)
    {
        N1[i3]=0;
        S1[i3]=' ';
    }
    printf("Inserta un numero entero: ");
    scanf("%d", &N1[0]);

    while (S1[d2] = '0')
    {
        printf("Inserta el simbolo + para que aumente su valor en 1.\n");
        printf("Inserta el simbolo - para que reduzca su valor en 1. \n");
        printf("Inserta el simbolo * para que multiplique su valor por 2.\n");
        printf("Inserta el simbolo / para que divida su valor en 2.\n");
        printf("Inserta la opcion (simbolo) deseada (0 para terminar): ");
        scanf("%c", &S1[d2]);
        if (S1[d2]=='0')
            break;
        switch (S1[d2])
        {
            case '+' : N1[d]=N1[i]+1; /*CH[d2]='+'*/; break;
            case '-' : N1[d]=N1[i]-1; /*CH[d2]='-'*/; break;
            case '*' : N1[d]=N1[i]*2; /*CH[d2]='*'*/; break;
            case '/' : N1[d]=N1[i]/2; /*CH[d2]='/'*/; break;
            default : break;
        }
        d++; i++; d2++;
    }
    for (int i2=0; i2<d2; i2++)
    {
        if (N1[i2]==0)
            break;
        else
            printf("(%d)%c\n", N1[i2], S1[i2]);
    }
}


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.

#include <stdio.h>
int main()
{
   int numa=0,opt=0,i=0;
   char simba,charop[50][50];
   printf("Inserta un numero entero: ");
   scanf("%d", &numa);
   while(i<3) { //El bucle se repetirá 3 veces
       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");
       printf("Inserta el simbolo / para que divida su valor en 2.\nInserta la opcion (simbolo) deseada (0 para terminar): ");
       getchar(); //Recojemos
       scanf("%c", &simba); //Se guarda el operados en simba, en el ejemplo solo vale +
       switch(simba) {
           case '+' :
               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
               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
               numa++; //Se supone que si el usuario introduce + quiere que el numero original se vea aumentado en 1
               i++; //subimos el valor de i para indicar que NO será la "cabeza" xD
               break;
       }
   }
   for(i=0;i<3;i++) printf("%s", charop[i]);
   printf("\n");
}


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:
for(i=0;i<3;i++) printf("%s", charop[i]);
   printf("\n");


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:
printf("Inserta el simbolo / para que divida su valor en 2.\nInserta la opcion (simbolo) deseada (0 para terminar): ");
getchar();
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:
printf("Inserta el simbolo / para que divida su valor en 2.\nInserta la opcion (simbolo) deseada (0 para terminar): ");
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