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 ) 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 . 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. |