Problema con este programa básico

Iniciado por Manimecker, 21 Octubre 2011, 14:58 PM

0 Miembros y 1 Visitante están viendo este tema.

Manimecker

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.

Slava_TZD

#1
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


The fact is, even if you were to stop bombing us, imprisoning us, torturing us, vilifying us, and usurping our lands, we would continue to hate you because our primary reason for hating you will not cease to exist until you embrace Islam.

Manimecker

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.

rir3760

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
C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language