Forum Pplware
Programa em C - Versão de Impressão

+- Forum Pplware (http://forum.pplware.com)
+-- Fórum: Mais Tech (/forumdisplay.php?fid=11)
+--- Fórum: Programação e Web (/forumdisplay.php?fid=16)
+--- Tópico: Programa em C (/showthread.php?tid=20265)



Programa em C - Marco75 - 25-11-2014 17:42

Boas,

Estou a começar a desenvolver umas pequenas coisas em C e estou a tentar fazer um pequenino programa que: 1º-pede dois números ao utilizador; 2º-pergunta ao utilizador que operação quer efectuar; 3º-após a escolha da opção deverá mostrar o resultado, de acordo com a opção.

No entanto, só estou a conseguir que seja verificado o primeiro IF, ou seja, se for digitada a letra 'a' ele mostra o resultado da soma; se for digitada uma letra diferente de 'a', mesmo que seja 'b', 'c' ou 'd', não avança mais nada. 

Alguém pode ajudar? Obrigado. 

o código é o seguinte:

#include <stdio.h>

int main() {
    int n1, n2;
    char operacao;

    printf("Digite o 1º número: ");
    scanf("%d", &n1);

    printf("Digite o 2º número: ");
    scanf("%d", &n2);
    printf("Escolheu os números %d e %d.\n", n1, n2);
    printf("Que operação deseja efectuar?\n");
    printf("a - Soma;\n");
    printf("b - Subtração;\n");
    printf("c - Divisão;\n");
    printf("d - Multiplicação;\n");
    printf("Digite a opção: ");
    operacao = getchar();

    if (operacao = getchar() == 'a') {
        printf("O resultado da soma é %d.", n1 + n2);
    } else if (operacao = getchar() == 'b') {
        printf("O resultado da subtração é %d.", n1 - n2);
    } else if (operacao = getchar() == 'c') {
        printf("O resultado da divisão é %d.", n1 / n2);
    } else if (operacao = getchar() == 'd') {
        printf("O resultado da multiplicação é %d.", n1 * n2);
    }
    else {
        printf("Tem de escolher a, b, c ou d");
    }

    return 0;
}


RE: Programa em C - Corvus - 25-11-2014 18:18

Um aparte: usa as tags de code para meter codigo, fica mais legivel.

O teu problema é que em cada if estás a ler de novo o teclado. Antes do 1º if já apanhaste a opção do utilizador ( operacao = getchar(); ) , por isso nos if's só tens de comparar a variavel com a letra correspondente (ou seja, retira = getchar() de dentro de cada if e fica só com if (operacao == 'a') etc.).


RE: Programa em C - Marco75 - 25-11-2014 18:36

Corvus,

Obrigado pela dica das tags.

Já tinha feito dessa forma que sugeres, só que nesse caso assim que insiro o 2º número o código é executado, apresenta o texto "digite a opção" mas não me deixa escrever a opção e executa logo o último ELSE "Tem de escolher a, b, c ou d".


RE: Programa em C - Corvus - 25-11-2014 20:20

Pois, esse é o problema do scanf (e uma das razoes que não deve ser usado) (e também o problema de ler as questões de relance e esquecer pormenores ao responder Tongue )

O scanf deixa-te o enter q deste no buffer de entrada. Tens de limpar o buffer antes de pedires a tecla, ou então usa o codigo abaixo em vez do operacao = getchar() :

Código:
while ((operacao = getchar()) != EOF && operacao != '\n');

Basicamente, é um loop vazio que fica a ler o teclado até ler algo diferente de new line (que é, não por acaso, o caracter que é deixado pelo scanf e que estava a fazer o getchar() seguir logo) ou até detectar o fim de ficheiro (que pode ser provocado pelo teclado com um ctrl-z em windows ou ctrl-d em linux). Assim que carregues numa outra tecla qualquer, o loop termina e tens a tecla na var operação


RE: Programa em C - zee - 25-11-2014 20:22

Mais um aparte. Comparação de strings deve ser sempre feita com recurso às funções strcmp e stricmp (sendo esta última case sensitive). E antes da digitacao da letra, deves ter "fflush(stdin)" para limpar o buffer do teclado. Surgem diversas vezes problemas relacionados com isso


RE: Programa em C - Corvus - 26-11-2014 10:29

Ele está a comparar caracteres e não strings. Se estivesse a comparar strings com ==, apenas estaria a comparar os endereços delas e não os valores Wink . Por outro lado, embora não seja realmente má ideia fazer o fflush do stdin, é conveniente usar na mesma o loop. Já apanhei sistemas (raros, sem dúvida) em que o fflush não limpou o buffer de entrada.


RE: Programa em C - Marco75 - 26-11-2014 10:59

Corvus, o código que sugeriste funcionou impecável. Obrigado.

Zee, obrigado também pelas dicas.

Assim é muito mais fácil começar a apanhar o jeito da programação.