Logo Hardware.com.br
João Gabriel Sampaio
João Gabriel... Novo Membro Registrado
27 Mensagens 0 Curtidas

Calculadora em C++ dando erro.

#1 Por João Gabriel... 19/10/2014 - 23:44
Boa noite/ bom dia/ boa tarde!
No seguinte código:

[HASHTAG]#include[/HASHTAG]
[HASHTAG]#include[/HASHTAG]
[HASHTAG]#include[/HASHTAG]
[HASHTAG]#include[/HASHTAG]

char oper;
int soma[3];
int a[3];

int main(){
do{
printf("Calculadora");
printf("\n\n\nSelecione a operacao a seguir ( a partir do caracteres: *; /; -; + ou 5\nrespectivamente):");
printf("\n\n1. Multiplicacao");
printf("\n2. Divisao");
printf("\n3. Subtracao");
printf("\n4. Soma");
printf("\n5. Sair");
printf("\n\nVoce pode fazer 4 operacoes. Depois disso, a calculadora sera encerrada e voce\ntera que reiniciar. Determine a operacao:");
gets(&oper);

switch(oper){
case '*':
system("cls");
printf("Voce selecionou multiplicacao!");
printf("\n\nDetermine o primeiro numero da multiplicacao:");
scanf("%d", &soma[1]);
printf("\nDetermine o segundo numero da multiplicacao:");
scanf("%d", &soma[2]);
soma[3]= soma[1]*soma[2];
printf("O resultado da multiplicacao e %d", soma[3]);
break;

case '/':
system("cls");
printf("Voce selecionou divisao!");
printf("\n\nDetermine o primeiro numero da divisao:");
scanf("%d", &a[1]);
printf("\nDetermine o segundo numero da divisao:");
scanf("%d", &a[2]);
a[3]=a[1]/a[2];
printf("O resultado da divisao e: %d", a[3]);
break;

}
if(oper==5){
printf("Encerrando...");
system("pause");
}
}while(oper!='5');
}


O programa possui um menu, onde se:
- Digitar + e enter, o programa executa uma soma;
- Digitar / e enter, o programa executa uma divisão;
- Digitar * e enter, o programa executa uma multiplicação;
- Digitar - e enter, o programa executa uma subtração.

OBS: A subtração e soma não foram programados ainda.

Então tudo executa como planejado. A pessoa digita / ou * e ele executa as operações correspondentes. Mas o problema é: quando vai repetir o menu, ele se repete duas vezes, eu não sei porque. Sei que não é grande coisa, mas é que eu quero ver oque errei, para corrigir, e não errar na próxima aplicação.
Se não tiverem entendido, rodem o programa no seu computador se possível.
Obrigado a quem respondeu a pergunta!
tpcvasco
tpcvasco General de Pijama Registrado
2.9K Mensagens 330 Curtidas
#2 Por tpcvasco
20/10/2014 - 12:25
O seu problema é o gets(). Pra começar, gets() é para strings, e não caracter simples. Segundo, ele não é nem um pouco confiável, compilando no linux com gcc aparece até o aviso
"warning: the `gets' function is dangerous and should not be used."

Se quiser uma opinião contundente:
http://www.gidnetwork.com/b-56.html
"You should never use gets(). Never. Never. Never. I hope I am being clear. NEVER!!"
João Gabriel Sampaio
João Gabriel... Novo Membro Registrado
27 Mensagens 0 Curtidas
#3 Por João Gabriel...
20/10/2014 - 13:43
tpcvasco disse:
O seu problema é o gets(). Pra começar, gets() é para strings, e não caracter simples. Segundo, ele não é nem um pouco confiável, compilando no linux com gcc aparece até o aviso
"warning: the `gets' function is dangerous and should not be used."

Se quiser uma opinião contundente:
http://www.gidnetwork.com/b-56.html
"You should never use gets(). Never. Never. Never. I hope I am being clear. NEVER!!"

Eu usei o scanf("%c", &oper); e deu a mesma coisa.
tpcvasco
tpcvasco General de Pijama Registrado
2.9K Mensagens 330 Curtidas
#6 Por tpcvasco
21/10/2014 - 11:56
João Gabriel Sampaio disse:
Poderia me explicar o porque do "%*c"? Não sei oque significa.


Pra entender, dá uma olhada nesse tópico
https://www.hardware.com.br/comunidade/programa-ca/873308/

João Gabriel Sampaio disse:
Usei o scanf("%c%*c", &oper); e eu o mesmo erro.


Vc tem certeza? Aqui pareceu ter funcionado OK. Qual entrada vc está dando para o programa? Detalhe melhor o seu erro.

Tb reparei outros erros q vc está comentendo no código:
-Em C/C++, qdo se declara um vetor de X posições, ele vai do índice 0 ao X-1, ou seja, um vetor[3] vai de 0 a 2. Vc está acessando além do q o índice permite.
-Vc tem um if(oper==5), acontece q oper é um char. Tenha em mente q '5' é diferente de 5.
-Aliás, pq esse teste não está como um case dentro do switch?
-Outra coisa desnecessária é ter 2 vetores, se vc não precisa gravar os dados do seu cálculo anterior, um único vetor basta.
João Gabriel Sampaio
João Gabriel... Novo Membro Registrado
27 Mensagens 0 Curtidas
#7 Por João Gabriel...
21/10/2014 - 18:14
tpcvasco disse:
Pra entender, dá uma olhada nesse tópico
https://www.hardware.com.br/comunidade/programa-ca/873308/



Vc tem certeza? Aqui pareceu ter funcionado OK. Qual entrada vc está dando para o programa? Detalhe melhor o seu erro.

Tb reparei outros erros q vc está comentendo no código:
-Em C/C++, qdo se declara um vetor de X posições, ele vai do índice 0 ao X-1, ou seja, um vetor[3] vai de 0 a 2. Vc está acessando além do q o índice permite.
-Vc tem um if(oper==5), acontece q oper é um char. Tenha em mente q '5' é diferente de 5.
-Aliás, pq esse teste não está como um case dentro do switch?
-Outra coisa desnecessária é ter 2 vetores, se vc não precisa gravar os dados do seu cálculo anterior, um único vetor basta.

Obriga cara! Não tinha percebido isso, e sobre o oper==5, acho que me confundi na hora de programar.

tpcvasco disse:
Pra entender, dá uma olhada nesse tópico
https://www.hardware.com.br/comunidade/programa-ca/873308/



Vc tem certeza? Aqui pareceu ter funcionado OK. Qual entrada vc está dando para o programa? Detalhe melhor o seu erro.

Tb reparei outros erros q vc está comentendo no código:
-Em C/C++, qdo se declara um vetor de X posições, ele vai do índice 0 ao X-1, ou seja, um vetor[3] vai de 0 a 2. Vc está acessando além do q o índice permite.
-Vc tem um if(oper==5), acontece q oper é um char. Tenha em mente q '5' é diferente de 5.
-Aliás, pq esse teste não está como um case dentro do switch?
-Outra coisa desnecessária é ter 2 vetores, se vc não precisa gravar os dados do seu cálculo anterior, um único vetor basta.

Sobre o %*c, li o outro tópico. Já sabia disso, mas eu uso o comando setbuf(stdin, NULL);
© 1999-2024 Hardware.com.br. Todos os direitos reservados.
Imagem do Modal