• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

JemanPT

Calculos com C - Dúvidas

24 mensagens neste tópico

Boas,

Estou a iniciar um curso e, neste momento, estamos a dar C...

O Prof. deu-nos o seguinte exercicio para resolver no fim de semana: "Escreva o código em C que leia dois números inteiros e uma operação e escreva qual o resultado. Tenha em atenção que não é possível dividir por ZERO."

Estou a fazer em DEV C++ e não estou a conseguir... dá-me erro no else.

Para introduzir os numeros estou a usar:

  int a, b;
 scanf(“%i %i”,&a, &b);

Para os calculos:

  switch case (op) {
	case ‘+’:
		cout << a + b;
		break;

... etc

Para a condição:

 if (b=0)
printf (“Não pode dividir por %i”, b);
else
printf (“Não pode dividir por %i”, b);

Não falta alguma coisa para ele fazer, saber qual a operação?

Em anexo, segue a brrada que estou a fazer ;)

Podem-me ajudar?

Outa coisa que ainda não precebi muito foram as contas tipo: a=3, c= a++ +c; c=++a +c. Alguem sabe-me explicar esta cena como se eu tivesse 5 aninhos? ;)

Obrigado.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Atenção que o cout não é C, mas sim C++!

Depois tens ali if(b=0) quando o que pretendes deve ser if(b==0). Mas era capaz de ser boa ideia colocar aqui o código todo...

É que abrir um doc já me dá bastante de trabalho...

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Boas!

exacto cout nao é c, mas sim c++.

Se queres colocar o output no ecra tem de utilizar a funcao printf.

Vejamos:

#include<stdio.h> /biblioteca de funcoes do compilador c, tens de colocar sempre isto

main()// funcao main
{

int a, b; // declaraçao de 2 variaveis tipo inteiro

printf(" qual o numero a\n"); 
scanf("%d",&a);// como as tuas variaveis sao inteiras, para guardares os valores dentros das variaveis tens de usar o formato %d , (nao utilizes o formato % i) 
seguida de &nomedavariavel, que não é nada mais que o endereço da variavel,

printf(" o numero introduzido é %d\n",a); // vai te mostrar o valor introduzisdo no ecrã


// qd tens um if, dentro do if usa-se uma expressao relacional , para fazer comparaçoes, etc, 

if(b==0) se b for igual a zero (comparaçao), repara que ter b=0 e diferente de ter b==0

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

O código:

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[])
{
 int a, b;
 scanf("%i %i", &a, &b);
 if(b==0) {
 printf("Nao pode dividir por: %i\n",b);
}
 switch case (op) {
        case '+':
             cout << a + b;
             break;
        case '-':
             cout << a - b;
             break;
        case 'x':
             cout << a * b;
             break;
        case '/':
             cout << a / b;
             break;
             }
 system("PAUSE");	
 return 0;
}

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

É apenas switch (op), o case está a mais.

Onde é que o valor de op é definido?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Pois... também não percebo o porquê do op (é como estava no acetato do prof.). Já sã dois erros, o cout q segundo voces n é do C e o OP q n sei de onde vem.

Há aqui qualquer coisa que não bate certo... segundo o problema,, é suposto introduzir dois numeros e qual o calculo desjado, não é? Isto é complicado, mas mt aliciantee... tou a ver q vei ser + uma noite.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Se a variável op não está declarada, basta declará-la com o tipo char e ler o seu valor no scanf, juntamente com os dois números. Já agora, substitui todos os cout por printfs. Ou seja, a chamada à função printf deve ficar:

scanf("%i %i %c", &a, &b, &op);

E não te esqueças de antes disso declarar a variável op:

char op;

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

É normal não conseguir fazer isto com 6 horas de curso??? devo ser mesmo gnu ;) agora dá erro no scanf...

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[])
{
 char op;
 int a, b;
 scanf("%i %i %c", &a, %b, %op);
 if(b==0) {
 printf("Nao pode dividir por: %i\n",b);
}
 switch (op) {
        case +:
             printf(a + b);
             break;
        case -:
             printf(a - b);
             break;
        case x:
             printf(a * b);
             break;
        case /:
             printf(a / b);
             break;
             }
 system("PAUSE");	
 return 0;
}

com o printf ele não vai mostrar, por exemplo, "a + b" em vez do resultado?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

lol... trenguice :P

Agora o erro é no  case +! Dizem que sem o stdin é complicado o progama fazer a operação... comlicado é diferente de impossivel, certo? é que ainda não dei o, como chamam, fflush(stdin).

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

e mais outra trenguice... o case dava erro porque nao pus as pilhas ''

Nao da erro, ou seja... abre, ponho  o a, o b e pimba... erro de progrma.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

1 - Como estas a verificar um caracter no switch os cases tem de ser caracteres, ou seja tens de os colocar  entre " "

2 - o printf funciona como o scanf, para mostrares o conteúdo de variáveis tens de indicar o seu tipo dentro as " " com o % e colocares as variaveis, desta vez sem o & separadas por ,

3 - o flush(stdin) serve para limpar um buffer de um ficheiro (neste caso o stdin) mas não te preocupes para já com isso que no teu código ainda não é necessário, só começa a ser quando utilizares vários scanfs

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Não estou a conseguir perceber como implanto o PRINTF no SWITCH... acho que por pensar :hmm: que neste, no case, devia estar a indicação da operação (ex: case '+': e=a+b) para que o programa saiba o que/como fazer.

Não estou a conseguir, vou repousar um bocado e dps...

a última borrada :-[:

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[])
{
 int a, b, e;
 char op;
 printf("Introduza o valor de a: ");
 scanf("%d",&a);
 printf("Introduza o valor de b: ");
 scanf("%d",&b);
 printf("Indique a operacao a efectuar ( + , - , * , / ): ");
 switch (op) {
        case '+': e=a+b;
             break;
        case '-': e=a-b;
             break;
        case 'x': e=a*b;
             break;
        case '/': e=a/b;
             break;
             }
  printf("%d%c%d=%d\n",a,op,b,e);           
 system("PAUSE");	
 return 0;
}
 
0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Está quase lá falta o scanf da opção e se vais validar a multiplicação com o x o printf devia de ter u x em vez do *.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

3 - o flush(stdin) serve para limpar um buffer de um ficheiro (neste caso o stdin) mas não te preocupes para já com isso que no teu código ainda não é necessário, só começa a ser quando utilizares vários scanfs

Já aqui foi referido várias vezes que o fflush se destina apenas a streams abertas para escritas, o que não é o caso do stdin.

JemanPT, já começavas a usar o GeSHi...

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

só falta mesmo ele fazer o calculo, de resto tá tudo :thumbsup:

O código:

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[])
{
 int a, b, e;
 char op;
 printf("Introduza o valor de a: ");
 scanf("%d",&a);
 printf("Introduza o valor de b: ");
 scanf("%d",&b);
 printf("Indique a operacao a efectuar ( + , - , * , / ): ");
 scanf("%d", &op);
 switch (op) {
        case '+': e=a+b;
             break;
        case '-': e=a-b;
             break;
        case '*': e=a*b;
             break;
        case '/': e=a/b;
             break;
             }
  printf("%d%c%d=%d\n",a, op, b, e);           
 system("PAUSE");	
 return 0;
}

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

fiz a seguinte experiencia: tirei os switch case todos e pus só "e=a+b;" e ele somou, mas qd ponho o resto e como é obvio, ele deixa de fazer... faz qq coisa, mas o resultado é sp o mm (1).

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Tens scanf("%d", &op); quando devias ter scanf(" %c", &op);.

Nos scanfs és capaz de precisar de um espaço antes do '%', pelo menos neste último scanf, caso contrário em vez de ler o operador (+, -, ...) vai ler o <ENTER> que introduziste depois do último número.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Tambem achava, mas se colocar "%C" berrou... se alguem souber a lógica... :P

Quanto aos espaços, tambem cheguei lá... acho que tou a ficar um bocaditoooooooooooo mais rápido no raciocinio ehehehe.

Claro, não o suficiente para ver o porquê que o programa não faz os calculos, mas vou chegar la; acho :D

Thanks a todos que estão a ajudar a COMPREENDER "c"

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Se colocares como o Rui Carlos disse o programa funciona na perfeição.

Substitui o scanf("%d", &op); por scanf(" %c", &op);

Atenção com o espaço antes do "%c". Deve ser " %c" e não "%c".

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Ya, era o espaço. Mais um ensinamento... ATENÇÃO AOS ESPAÇOS!

Mais uma vez,

thanks

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

3 - o flush(stdin) serve para limpar um buffer de um ficheiro (neste caso o stdin) mas não te preocupes para já com isso que no teu código ainda não é necessário, só começa a ser quando utilizares vários scanfs

Já aqui foi referido várias vezes que o fflush se destina apenas a streams abertas para escritas, o que não é o caso do stdin.

JemanPT, já começavas a usar o GeSHi...

Sim eu sei, mas quer queiras quer não em algumas escolas ensinam a utilizar para limpar o stdin, e em Windows funciona. Eu simplesmente não quis complicar as coisas.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Nem é uma questão de complicação, é uma questão de fazer uma coisa que não faz sentido...

Em windows funciona mas em Linux não... Pelo menos não comigo, ou nem sempre.....

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora