Preciso fazer um programa em C que faça soma/subtraçao/multiplicaçao/divisao. Ate ai beleza. Mas preciso mostrar "Comando invalido!" caso o usuario digite qualquer caractere especial que nao seja numeros de 0 a 9. Estou fazendo assim:
#include<stdio.h>
#include<stdlib.h>
#include<locale.h>
int main(){
float a,b,r;
printf("\nDigite o primeiro valor:");
scanf("%f",&a);
printf("\nDigite o segundo valor:");
scanf("%f",&b);
if ((a!=float) || (b!=float)) {
printf("\n\n Comando invalido!");
}
else{
r=a+b;
printf("\n\n %.2f + %.2f = %.2f",a,b,r);
r=a-b;
printf("\n\n %.2f - %.2f = %.2f",a,b,r);
r=a*b;
printf("\n\n %.2f * %.2f = %.2f",a,b,r);
r=a/b;
printf("\n\n %.2f / %.2f = %.2f\n\n\n",a,b,r);
}
return 0;
}
// Pode ter algum erro escondido, mas acho que esta ok
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define TRUE 1
#define FALSE 0
#define boolean int
boolean string_eh_float(char s[]){
int i, cont;
for(i = 0, cont = 0 ; i < strlen(s) ; i++) {
if(s[i]<'0' || s[i]>'9') {
if(s[i]=='.'){
cont++;
if(cont>1)
return FALSE;
}
else
return FALSE;
}
}
return TRUE;
}
boolean numero_é_valido(float n){
if(n >= 0)
if(n <= 9)
return TRUE;
return FALSE;
}
float get_num_valido(){
float num;
while(TRUE) {
char strbuffer[256];
printf("Valor: ");
scanf("%s", strbuffer);
if(!string_eh_float(strbuffer)) {
printf("Valor invalido. Deve ser um numero. Tente novamente...\n");
continue;
}
num = (float)atof(strbuffer);
if(!numero_é_valido(num)) {
printf("Numero invalido. Deve ser >= 0 e <= 9. Tente novamente...\n");
continue;
}
break;
}
return num;
}
int main(void){
float valor1, valor2, auxiliar;
valor1 = get_num_valido();
valor2 = get_num_valido();
auxiliar = valor1 + valor2;
printf("%.3f + %.3f = %.3f\n", valor1, valor2, auxiliar);
auxiliar = valor1 - valor2;
printf("%.3f - %.3f = %.3f\n", valor1, valor2, auxiliar);
auxiliar = valor1 * valor2;
printf("%.3f * %.3f = %.3f\n", valor1, valor2, auxiliar);
auxiliar = (float)valor1 / (float)valor2;
printf("%.3f / %.3f = %.3f\n", valor1, valor2, auxiliar);
}
Toda linguagem de programação possui operadores muito poderosos chamados operadores lógicos, eles avaliam se determinada condição seja verdadeira ou falsa. Em C todos os números representam a condição booleana verdadeiro exceto o zero que representa falso; alguns dos operadores podem ser vistos na tabela abaixo:
Todo o seu programa está correto, até a parte em que utiliza dentro de um condicional if, um operador lógico de maneira inapropriada.
O compilador não entende a sua intenção de comparar o tipo do valor de dentro da variável com o tipo float, mas sim que você está tentando comparar um número com uma string, que no caso é float.
Vou colocar o seu código devidamente modificado a baixo e posteriormente explicar as modificações.
#include<stdio.h>
#include<stdlib.h>
#include<locale.h>
int main(){
float a,b,r;
int i,j;
i=j=1;
printf("\nDigite o primeiro valor:");
i=scanf("%f",&a);
printf("\nDigite o segundo valor:");
j=scanf("%f",&b);
if(i==0 || j==0){
printf(“\n\nComando invalido!!!!”);
return 0;
}
else{
r=a+b;
printf("\n\n %.2f + %.2f = %.2f",a,b,r);
r=a-b;
printf("\n\n %.2f - %.2f = %.2f",a,b,r);
r=a*b;
printf("\n\n %.2f * %.2f = %.2f",a,b,r);
r=a/b;
printf("\n\n %.2f / %.2f = %.2f\n\n\n",a,b,r);
}
return 0;
}
A modificação feita no seu programa consiste neste pequeno trecho de código:
int i,j;
i=j=1;
printf("\nDigite o primeiro valor:");
i=scanf("%f",&a);
printf("\nDigite o segundo valor:");
j=scanf("%f",&b);
if(i==0 || j==0){
printf(“\n\nComando invalido!!!!”);
return 0;
}
Eu declarei duas variáveis do tipo inteiro com o intuito de “receber” da função scanf, o valor lógico verdadeiro ou falso (todos os números positivos e negativos para verdadeiro e zero para falso).
A função scanf retorna 1 se o valor lido for correspondente ao indicado no seu parâmetro e 0 se não for, mas há uma particularidade, ela retorna 1 se o parâmetro for float e for digitado um número int, mas não o inverso.
Portanto ao se digitar algum caractere não numérico, i ou j ficam com os valores 0, e o condicional if os detecta como falso imprimindo assim a mensagem de erro. Perceba que eu usei o conectivo || (ou) que retorna falso se apenas uma das duas condições forem satisfeitas, já que basta que uma variável seja uma letra para encerrar o programa, portanto se a condição do if for verdade a programa encerra, já que não se opera letras.
Portanto vimos que o problema no código apresentado acima precisou de alguns conceitos lógicos e particularidades da função scanf para ser resolvido, mas o mais importante foi entender a lógica por trás disso tudo, para poder fazer ligações entre alguns conceitos e resolver o problema.
Toda linguagem de programação possui operadores muito poderosos chamados operadores lógicos, eles avaliam se determinada condição seja verdadeira ou falsa. Em C todos os números representam a condição booleana verdadeiro exceto o zero que representa falso; alguns dos operadores podem ser vistos na tabela abaixo:
Todo o seu programa está correto, até a parte em que utiliza dentro de um condicional if, um operador lógico de maneira inapropriada.
O compilador não entende a sua intenção de comparar o tipo do valor de dentro da variável com o tipo float, mas sim que você está tentando comparar um número com uma string, que no caso é float.
Vou colocar o seu código devidamente modificado a baixo e posteriormente explicar as modificações.
#include<stdio.h>
#include<stdlib.h>
#include<locale.h>
int main(){
float a,b,r;
int i,j;
i=j=1;
printf("\nDigite o primeiro valor:");
i=scanf("%f",&a);
printf("\nDigite o segundo valor:");
j=scanf("%f",&b);
if(i==0 || j==0){
printf(“\n\nComando invalido!!!!”);
return 0;
}
else{
r=a+b;
printf("\n\n %.2f + %.2f = %.2f",a,b,r);
r=a-b;
printf("\n\n %.2f - %.2f = %.2f",a,b,r);
r=a*b;
printf("\n\n %.2f * %.2f = %.2f",a,b,r);
r=a/b;
printf("\n\n %.2f / %.2f = %.2f\n\n\n",a,b,r);
}
return 0;
}
A modificação feita no seu programa consiste neste pequeno trecho de código:
int i,j;
i=j=1;
printf("\nDigite o primeiro valor:");
i=scanf("%f",&a);
printf("\nDigite o segundo valor:");
j=scanf("%f",&b);
if(i==0 || j==0){
printf(“\n\nComando invalido!!!!”);
return 0;
}
Eu declarei duas variáveis do tipo inteiro com o intuito de “receber” da função scanf, o valor lógico verdadeiro ou falso (todos os números positivos e negativos para verdadeiro e zero para falso).
A função scanf retorna 1 se o valor lido for correspondente ao indicado no seu parâmetro e 0 se não for, mas há uma particularidade, ela retorna 1 se o parâmetro for float e for digitado um número int, mas não o inverso.
Portanto ao se digitar algum caractere não numérico, i ou j ficam com os valores 0, e o condicional if os detecta como falso imprimindo assim a mensagem de erro.
Perceba que eu usei o conectivo || (ou) que retorna falso se apenas uma das duas condições forem satisfeitas, já que basta que uma variável seja uma letra para encerrar o programa, portanto se a condição do if for verdade a programa encerra, já que não se opera letras.
Portanto vimos que o problema no código apresentado acima precisou de alguns conceitos lógicos e particularidades da função scanf para ser resolvido, mas o mais importante foi entender a lógica por trás disso tudo, para poder fazer ligações entre alguns conceitos e resolver o problema.
Para escrever sua resposta aqui, entre ou crie uma conta
Compartilhar