Colocar Resposta 
 
Avaliação do Tópico:
  • 0 votos - 0 Média
  • 1
  • 2
  • 3
  • 4
  • 5
Programa em C
25-11-2014, 17:42
Mensagem: #1
Programa em C
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;
}
Procurar todas as mensagens deste utilizador
Citar esta mensagem numa resposta
25-11-2014, 18:18
Mensagem: #2
RE: Programa em C
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.).

Pedidos de ajuda via PM serão ignorados
Acordo ortográfico? Desconheço, obrigado Wink
Agradeço ao Chrome o facto de os meus posts nao terem acentos Evil
Procurar todas as mensagens deste utilizador
Citar esta mensagem numa resposta
25-11-2014, 18:36
Mensagem: #3
RE: Programa em C
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".
Procurar todas as mensagens deste utilizador
Citar esta mensagem numa resposta
25-11-2014, 20:20
Mensagem: #4
RE: Programa em C
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

Pedidos de ajuda via PM serão ignorados
Acordo ortográfico? Desconheço, obrigado Wink
Agradeço ao Chrome o facto de os meus posts nao terem acentos Evil
Procurar todas as mensagens deste utilizador
Citar esta mensagem numa resposta
25-11-2014, 20:22
Mensagem: #5
RE: Programa em C
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
Procurar todas as mensagens deste utilizador
Citar esta mensagem numa resposta
26-11-2014, 10:29 (Esta mensagem foi modificada pela última vez a: 26-11-2014 10:30 por Corvus.)
Mensagem: #6
RE: Programa em C
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.

Pedidos de ajuda via PM serão ignorados
Acordo ortográfico? Desconheço, obrigado Wink
Agradeço ao Chrome o facto de os meus posts nao terem acentos Evil
Procurar todas as mensagens deste utilizador
Citar esta mensagem numa resposta
26-11-2014, 10:59
Mensagem: #7
RE: Programa em C
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.
Procurar todas as mensagens deste utilizador
Citar esta mensagem numa resposta
Colocar Resposta 


Saltar Fórum:


Utilizadores a ver este tópico: 3 Visitante(s)