Buscar

Programa em C que calcule, mostre resultado, senao envia mensagem de erro

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;
}

💡 3 Respostas

User badge image

Luis Paulo Mattos

// 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);
}

0
Dislike0
User badge image

Andre Smaira

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.

0
Dislike0
User badge image

RD Resoluções

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.

0
Dislike0

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

✏️ Responder

SetasNegritoItálicoSublinhadoTachadoCitaçãoCódigoLista numeradaLista com marcadoresSubscritoSobrescritoDiminuir recuoAumentar recuoCor da fonteCor de fundoAlinhamentoLimparInserir linkImagemFórmula

Para escrever sua resposta aqui, entre ou crie uma conta

User badge image

Outros materiais