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

jaac
19-10-2006, 20:54
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 != '*')?

jaac
19-10-2006, 21:02
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 != ´/´)||.........

jaac
19-10-2006, 21:11
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, * / - +).

jaac
19-10-2006, 23:15
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?

jaac
19-10-2006, 23:56
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

HecKel
20-10-2006, 03:34
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!