Como verificar que um float não é um caracter? [Resolvido]

Iniciado por ana182, 27 de Maio de 2008, 02:01

tópico anterior - próximo tópico

ana182

Olá!
Gostava de saber como verificar se um float é mesmo um float (valor) ou se não é uma outra combinação de caracteres, quando uso a função scanf. Se a pessoa se enganar e não escrever exactamente um nº, como é que o programa reconhece o erro? Não sei como construir a rotina. Alguém pode-me ajudar? Estou a usar o gcc do ubuntu 8.04: acho que é o 4.2.3. Estou a programar em C.

Ana Luísa

IgorM0L

#1
  Para saber o se tal variavel eh uma cadeia de caracteres ou um valor, como inteiro ou ponto flutuante, basta verificar o tamanho da mesma, usando o sizeof;

  Exemplo:

#include<stdio.h>

int main(){
  char x = 'a';
  float y = 3.14;
// --------------------------
  if(sizeof(x) == sizeof(char))
puts("x é um caracter.");
else
puts("x é um valor.");
// --------------------------
  if(sizeof(y) == sizeof(char))
puts("y é um caracter.");
else
puts("y é um valor.");
};


  Acontece que a chamada scanf possui um recurso de apenas aceitar certos caracteres. No caso de numeros (0 `a 9), por exemplo, poderia usa-la assim: scanf (“%[1234567890]”, &x);
  Se quizer aceitar somente os caracteres: '+', '-', '(', ')', por exemplo, veja como poderia implementa-la: scanf (“%[+-()]”, string);

  De uma lida nisso para abrenger sua compressao sobre a funçao scanf: http://www.dee.feis.unesp.br/graduacao/disciplinas/langc/modulo_linguagemc/modulo4.htm

ana182

Olá!
Talvez não tenha sido explícita na minha dúvida, mas acabei por fazer um programinha que me resolveu o problema. O que este programa faz é avaliar se os 2 termos de uma soma são numericamente válidos ou não. Ainda avalia se o resultado faz sentido e pergunta se queremos continuar (respostas válidas; 's' || 'S' para continuar; 'n' || 'N' para sair).
Espero que isto ajude a quem precisar. Acho que dá sempre jeito ter estas rotinas à mão. A mim deu.
Fiquem bem***

Ana Luísa


/****************************************************************
*
* Objectivo: Verificar se os termos de uma soma e o resultado são valores numericamente válidos.
* Autora:  Ana Luísa Pinho
* Data:    27/05/2008
*
****************************************************************/

#include <stdio.h>                /* puts, gets, printf, scanf */
#include <stdlib.h>                /* atof */
#include <math.h>                              /* isinf, isnan */

main()
{

/*Declaração das variáveis*/
  char ch, str1[20], str2[20];     
  double result;        
  int i, j;

do
{
   fflush(stdin);  /*Limpa o teclado*/

/*1ª entrada*/
  do
   {
    puts ("Introduzir primeiro nº: ");
    scanf(" %s",&str1);
    for(i=0;str1[i]!='\0';i++)  /*Verifica se todos os caracteres são números.*/
     {
      if(isdigit(str1[i]))
continue;
      else
{
         printf("Erro! Não é um nº válido.\n");
         break;
}
     }
   }
  while(str1[i]!='\0');
   

/*2ª entrada*/
  do
   {
    puts ("Introduzir segundo nº: ");
    scanf(" %s",&str2);
    for(j=0;str2[j]!='\0';j++)  /*Verifica se todos os caracteres são números.*/
     {
      if(isdigit(str2[j]))
continue;
      else
{
         printf("Erro! Não é um nº válido.\n");
         break;
}
     }
   }
  while(str2[j]!='\0');


/*Conta*/
  result=atof(str1)+atof(str2); 

/*Verifica se o resultado é menos_infinito, mais_infinito ou NaN.*/
  if(isinf(result) || isnan(result))
    printf("Erro! O resultado não é válido.\n");
  else
    printf("Resultado: %.1lf\n", result);


/*Queremos fazer mais contas?*/
  do
   {
    printf("Continuar? ");
    scanf(" %c", &ch);
    switch(ch)
      {
       case 's':
       case 'S': break;
       case 'n':
       case 'N': break;
       default: puts("Opção Inválida!");
      }
   }
  while(ch!='s' && ch!='S' && ch!='n' && ch!='N');
}
while(ch!='n' && ch!='N');
puts("Fim do programa.\nAna Luísa Pinho, Maio/2008");
}

IgorM0L

#3
  Fiz dois programas esse fim de semana bem semelhantes ao seu.
  Acontece que eles implementam um analisador lexico e interpretador parser separadamente. Eles tambem analizam se o simbolo entrada eh valido ou nao, e se sim, transferem os simbolos organizados em um estrutura, em rules (operaçoes) e digits(numeros), para o interpretador realizar os devidos calculos,

Se voce quizer ver os mesmos. O primeiro eh o calc-bessa, que calcula expressoes como 8^5+8*9+11^3. E o function-bessa, que usa o motor do anterior para calcular, porem trata de funcoes matematicas, de qualquer grau.


  Uma dica eh tentar nao usar tanto a funcao scanf; ele permite algumas vulnerabilidades em alguns casos. Tente usar a funcao getc(stdin); ou somente getchar();.