View Full Version : Calculadora simples em C
WindWalker 19-10-2006, 20:27 Olá!
Estou agora a iniciar-me em C (por causa do curso superior) e pediram-nos para fazer um programa que recebesse um input do teclado do tipo '5*6' e que fizesse a conta.
Até agora tenho isto:
#include <stdio.h> /* Utilizacao das funcoes printf() e scanf() */
#include <math.h> /* potencia de - pow( ) */
int main(void)
{
int scan_res; /* resultado da funcao scanf */
float a; /* primeiro numero */
float b; /* segundo numero */
char c;
float x;
printf("Calculadora simples\n");
printf("Introduza:\n"); /* input do tipo '%f %operador %f' */
scan_res = scanf("%f %c %f",&a, &c, &b);
while (scan_res != 3 ) {
while (getchar() != '\n');
printf("Introduza de novo:\n");
scan_res = scanf("%f %c %f",&a, &c, &b);
}
if (c != * ) {
if (c != / ) {
if (c != + ) {
if (c != - ) {
printf("Erro na introducao do simbolo da operacao!\n");
while (getchar() != '\n');
printf("Introduza de novo:\n");
scan_res = scanf("%f %c %f",&a, &c, &b);
}}}}
else {
x = a %c b, c
}
printf("x=%f \n", x);
return 0;
}
Sugestões e correcções agradecem-se :)
O código está sintaticamente errado...
if (%c != * ) {
if (%c != / ) {
if (%c != + ) {
if (%c != - ) {
Aqui parece ser o mais estranho de tudo primeiro usas o % e depois comparas directamente com o operador...
WindWalker 19-10-2006, 20:57 Por acaso esses % já tirei (no ficheiro) :x
De qualquer forma, post anterior editado. Espero mais sugestões. Obrigado.
WindWalker 19-10-2006, 21:00 Em if (%c != * ) não será necessário tirar o % e por o asterisco entre plicas?
if (c != '*')?
if (c != * ) {
if (c != / ) {
if (c != + ) {
if (c != - ) {
Primeiro deves de usar '/' ou '+',etc
Segundo em vez de usares ifs encadeados usa a disjunção de condições
if (c != '/' || c != '+' || c!= '-')
MaxDamage 19-10-2006, 21:04 Em if (%c != * ) não será necessário tirar o % e por o asterisco entre plicas?
if (c != '*')?
Correcto :)
Btw, não faria mais sentido ter:
if (c == '*')
{
/* instruções */
}
(...)
WindWalker 19-10-2006, 21:07 Penso que dá das duas maneiras.
Verificar se os operadores são os pretendidos (MaxDamage) e efectuar as contas; pôr no else para repetir o "input".
Ou então por no else fazer a conta (que não estou a conseguir!!) e o que fazer em caso de erro de operador no if (parece mais complicada esta via que estou a usar :x)
jaac vou tentar isso e depois digo algo.
Hipnoted 19-10-2006, 21:08 Mas para quê tantos if´s?
Não seria melhor pôr:
if((c != `*´)||(c != ´/´)||.........
A maneira mais elegante seria:
char operador = qq
switch(operador) {
case '*':
/* qq coisa */
break;
case '/':
/* qq coisa */
break;
case '+':
/* qq coisa */
break;
case '-':
/* qq coisa */
break;
default:
/* operador desconhecido */
}
WindWalker 19-10-2006, 22:57 Obrigado por todas as sugestões.
@jaac não vou escrever dessa maneira, porque nem conheço a função(?) switch.
O código é agora:
#include <stdio.h> /* funcoes printf() e scanf() */
#include <math.h> /* potencia de - pow( ) */
int main(void)
{
int scan_res; /* resultado da funcao scanf */
float a; /* primeiro numero */
float b; /* segundo numero */
char d;
float e;
printf("Calculadora simples\n");
printf("Introduza:\n");
scan_res = scanf("%f %c %f", &a, &d, &b);
while (scan_res != 3 ) {
while (getchar() != '\n');
printf("Introduza de novo:\n");
scan_res = scanf("%f %c %f", &a, &d, &b);
}
if ( (d == '*' ) || (d == '/' ) || (d == '+' ) || (d == '-' ) ) {
e = a d b;
}
else {
printf("Erro na introducao do simbolo da operacao!\n");
while (getchar() != '\n');
printf("Introduza de novo:\n");
scan_res = scanf("%f %c %f",&a, &d, &b);
}
printf("Resultado = %f \n", e);
return 0;
}
Ele está a dar erro na linha 'e = a d b;', pelo que penso que não substitui d pelo caracter armazenado (o operador, * / - +).
O C não te permite fazer isso que pretendes. Se não queres usar o switch-case tens que ter um if onde possas identificar a operação pretendida.
if ( (d == '*' ) || (d == '/' ) || (d == '+' ) || (d == '-' ) ) {
e = a d b;
}
else {
printf("Erro na introducao do simbolo da operacao!\n");
while (getchar() != '\n');
printf("Introduza de novo:\n");
scan_res = scanf("%f %c %f",&a, &d, &b);
}
O else vai pedir um valor, mas não vai fazer nada...
WindWalker 19-10-2006, 23:41 Mas então este if não devia conter o código a executar caso os operadores encontrados em d fossem permitidos?
Não percebo...Devia modificar o conteúdo ( {...} ) do if que tenho?
O que vai estar em d? um char.
Qual o resultado de teres um inteiro seguido de um char com outro inteiro a seguir? nenhum porque é uma expressão sintaticamente errada.
Imagina a frase: O joão foi para casa, é uma frase que sintaticamente está correcta. Não te interessa se ele foi para a casa dele ou se assaltou a do vizinho. O compilador é mais ou menos assim.
Agora outra frase: O joão caderno para casa, se leres a frase não faz sentido. Era suposto teres um verbo, mas tens um subjectivo.
Agora pelo compilador: int char int, um inteiro tudo bem, a seguir lês um char. Para o compilador a tua "frase" não faz sentido, pois ele estava a espera de um operador.
WindWalker 20-10-2006, 00:31 OK. Obrigado por todas as respostas.
Vou estudar melhor isto e trabalhar o ficheiro no fim de semana. Depois digo se consegui :P
Segue a sugestão que já te deram do case. É a mais adequada, a de melhor extensibilidade e a mais limpa.
Dentro de cada caso fazes as contas, pois não vais conseguir passar o caracter que representa o operador para um operador sintáctico da linguagem C.
Agora menos confuso:
(blablabla)
case '*':
resultado=a*b;
break;
case '+':
resultado=a+b;
break;
(blablabla)
abraços, HecKel
FELiYCORA 29-10-2006, 22:45 ya é assim mesmo, mas se não queres usar o switch, tens k fazer tipo:
if (d == '*')
e = a*b;
if (d == '+')
e = a+b;
...
etc
eu tive k fazer uma mas as multiplicações e divisões tinham que ser feitas através de somas e subtracções... ah pois!
|
|