Jump to content
Fórum Script Brasil
  • 0

Problema programa


Tayousa

Question

Não entendo porque o switch deste programa não está funcionando, quando escolho a opção entra no system ("pause");

#include <stdio.h>
#include <stdlib.h>

void menu();
void limpartela();
void sair();
void enter();
void denter();
void dentertabula();
void tabula();
void soma();
void subt();
void multi();
void divi();
char opc;


int main()
{
    menu();

    system ("pause");
    return 0;
}
void limpartela()
{
    system("cls");
}
void sair()
{
    exit(1);
}
void enter()
{
    printf("\n");
}
void denter()
{
    printf("\n\n");
}
void dentertabula()
{
    printf("\n\n\t");
}
void tabula()
{
    printf("\t");
}
void menu()
{
    limpartela();

    int esc;

    printf("Que calculo voce quer fazer?");
    dentertabula();
    printf("1 - Soma");
    enter();
    tabula();
    printf("2 - Subtracao");
    enter();
    tabula();
    printf("3 - Multiplicacao");
    enter();
    tabula();
    printf("4 - Divisao");
    enter();
    tabula();
    printf("5 - Sair");
    enter();
    printf("Opcao: ");
    scanf("%d", &esc);
    getchar();

    switch (esc)
    {
    case 1:
        void soma();
        break;
    case 2:
        void subt();
        break;
    case 3:
        void multi();
        break;
    case 4:
        void divi();
        break;
    case 5:
        void sair();
        break;
    default:
        menu();
    }

}
void soma(void)
{
    limpartela();
    int a, b, soma;
    printf("Digite os valores da soma:");
    enter();
    tabula();
    printf("valor: ");
    scanf("%d", &a);
    tabula();
    printf("+");
    tabula();
    printf("valor: ");
    scanf("%d", &b);
    soma = a + b;
    tabula();
    printf("%d + %d = %d", a, b, soma);

    printf("\n\nResultado: %d", soma);

    printf("Resultado: %d", soma);
    printf("Deseja voltar ao menu? (s/n)");
    scanf("%c", &opc);
    getchar();

    if (opc=='s')
    {
        menu();
    }else{
        denter();
        printf("Obrigado! ");
    }
}
void subt()
{
    limpartela();
    int c, d, sub;
    printf("Digite os valores da subtracao:");
    enter();
    tabula();
    printf("valor: ");
    scanf("%d", &c);
    tabula();
    printf("-");
    tabula();
    printf("valor: ");
    scanf("%d", &d);
    sub = c - d;
    tabula();
    printf("%d - %d = %d", c, d, sub);

    printf("Resultado: %d", sub);
    printf("Deseja voltar ao menu? (s/n)");
    scanf("%c", &opc);
    getchar();

    if (opc=='s')
    {
        menu();
    }else{
        denter();
        printf("Obrigado! ");
    }
}
void multi()
{
    limpartela();
    int e, f, mul;
    printf("Digite os valores da multiplicacao:");
    enter();
    tabula();
    printf("valor: ");
    scanf("%d", &e);
    tabula();
    printf("*");
    tabula();
    printf("valor: ");
    scanf("%d", &f);
    mul = e * f;
    tabula();
    printf("%d * %d = %d", e, f, mul);

    printf("Resultado: %d", mul);
    printf("Deseja voltar ao menu? (s/n)");
    scanf("%c", &opc);
    getchar();

    if (opc=='s')
    {
        menu();
    }else{
        denter();
        printf("Obrigado! ");
    }
}
void divi()
{
    limpartela();
    int g, h, div;
    printf("Digite os valores da divisao:");
    enter();
    tabula();
    printf("valor: ");
    scanf("%d", &g);
    tabula();
    printf("/");
    tabula();
    printf("valor: ");
    scanf("%d", &h);
    div = g / h;
    tabula();
    printf("%d / %d = %d", g, h, div);

    printf("Resultado: %d", div);
    printf("Deseja voltar ao menu? (s/n)");
    scanf("%c", &opc);
    getchar();

    if (opc=='s')
    {
        menu();
    }else{
        denter();
        printf("Obrigado! ");
    }
}

Edited by Tayousa
Link to comment
Share on other sites

5 answers to this question

Recommended Posts

  • 0

  1. case 1:
  2. void soma();
  3. break;
  4. case 2:
  5. void subt();
  6. break;
  7. case 3:
  8. void multi();
  9. break;
  10. case 4:
  11. void divi();
  12. break;
  13. case 5:
  14. void sair();
  15. break;

Na verdade seu programa não deveria nem ter compilado. você está utilizando a palavra reservada "void" na chamada de função dentro do switch.

Link to comment
Share on other sites

  • 0

Dá uma lida sobre o armazenamento do buffer no C e como funciona a função fflush( ).

  • printf("Deseja voltar ao menu? (s/n)");
  • scanf("%c", &opc);
  • getchar();
  • if (opc=='s')
  • {
  • menu();
  • }else{
  • denter();
  • printf("Obrigado! ");
  • }

Acontece que quando seu programa chega na leitura de opc, já existe alguma coisa no buffer. Por isso ele passa direto no scanf sem receber nenhum valor. O pior é que a função getchar() logo em seguida faz o programa esperar uma entrada criando a falsa ilusão de que você está informando o valor de opc.

Em primeiro lugar, você não precisa desse getchar( ) aí, ele tá perdido no código. E em segundo lugar, você pode limpar o buffer.

Existem duas formas de fazer isso. A Primeira:

 printf("Deseja voltar ao menu? (s/n)");
scanf(" %c", &opc);
//getchar();
 
if (opc=='s')
{
menu();
}else{
denter();
printf("Obrigado! ");
}

Seria basicamente colocar um espaço antes do argumento de scanf( ). Isso vai fazer que o programa ignore o que estiver no buffer pra então ler o valor de char.

A segunda e preferida:

 printf("Deseja voltar ao menu? (s/n)");
fflush(stdin); //Caso esteja no Windows
//__fpurge(stdin); //Caso esteja no Linux
scanf("%c", &opc);
//getchar();
 
if (opc=='s')
{
menu();
}else{
denter();
printf("Obrigado! ");
}

Seria utilizar a função fflush no windows ou __fpurge no linux pra limpar o buffer antes de utilizar o scanf.

Outra coisa. Já que você repete esse bloco aí várias vezes, seria preferível você transformar isso aí em uma função.

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Answer this question...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.



  • Forum Statistics

    • Total Topics
      152.2k
    • Total Posts
      652k
×
×
  • Create New...