Calculadora simples em C

WindWalker

Power Member
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 :)
 
Última edição:
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...
 
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.
 
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 */
}
 
Está melhor

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.

Código:
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...
 
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.
 
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:

Código:
(blablabla)
case '*':
          resultado=a*b;
          break;
case '+':
          resultado=a+b;
          break;
(blablabla)

abraços, HecKel
 
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!
 
Back
Topo