Ir para conteúdo
Fórum Script Brasil
  • 0

Problema programa


Tayousa

Pergunta

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! ");
    }
}

Editado por Tayousa
Link para o comentário
Compartilhar em outros sites

5 respostass a esta questão

Posts Recomendados

  • 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 para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152k
    • Posts
      651,8k
×
×
  • Criar Novo...