Ir para conteúdo
Fórum Script Brasil
  • 0

verificar se é numero ou não


tahinf

Pergunta

olá pessoal!

tenho q fazer um prog q tm q pegar o numero do arquivo, ver se é numero ou não, verificar se é um negócio (esqueci o nome) e gera outro arquivo. O problema tá na parte de verificar se é num ou não, se colocor por exemplo a72 ele dá a msg de erro, porém se coloco 72a ou 72a num aparece a msg

uma coisa estranha também q nos printf q coloquei p ver o valor de i aparece um numero muito grande tp 402024 sendo q o arquivo só tm 3 linhas, 10 caracteres nele no máximo

#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
  int equadri();
  int verifica();
  int naoequadri();
  FILE *p; FILE *pb;


    int n, m, p1=0,p2=0,p3=0,p4=0,n1,n2,n3,n4,k=1, boolean =0,i=0;
 char carac[100];
 char c;

int main()
{    if (!(p = fopen("entrada.dat","r")))  {
          printf("Erro! Impossivel abrir o arquivo!\n");
          system("PAUSE");
          }
        if (!(pb = fopen("saida.dat","w"))){
          printf("Erro! Impossivel criar o arquivo!\n");
          system("PAUSE");
          }


          while (!feof(p))
          {
          fscanf(p,"%s",carac);
          
          // printf("i antes do if %d", &i);
          if(!isdigit(carac[i]))
           {
                                printf("i dentro do if%d", &i);
             fprintf(pb,"\n ERRO!!! \n Caracter diferente de numero foi encontrado",n);
           }
        else
          { printf("i%d", &i);
           n = atoi(carac);
           boolean = 0;
           verifica();
             k=1;
          }
               i++;
          }//fim do while



      system("PAUSE");

    fclose(pb);
    fclose(p);
    return(0);


}


   int equadri()
     {
       fprintf(pb,"\n O numero %d e  quadri e o operador  e: %d \n",n,k);
     }
    int naoequadri()
    {

        fprintf(pb,"\n O numero %d não e  quadri \n",n);
    }

 int verifica(){
         do
        {
           // faz a conta



            }

            k++;

        }while(k<=n);
        if (boolean ==0){
                    naoequadri();
        }

}

Link para o comentário
Compartilhar em outros sites

3 respostass a esta questão

Posts Recomendados

  • 0

Leitura de arquivos existem2 condições.

Ou o arquivo é binário ou é texto.

Acredito que tu esteja usando arquivo texto e fazer a leitura dele pode ser feito caracter por caracter ou lendo uma string inteira. A questão é que por ser um arquivo texto tudo é string, não existe número.

Uma string é um vetor de caracteres. Pode ter o tamanho que quiser e couber na tua memória.

Um caracter é um número porque tudo que fica na memória do computador é número. Então uma string pode ser um vetor de números de 8 bits (vão de 0 á 256). Em outras palavras um caracter do tipo char é um byte.

O fscanf lê até encontrar um espaço. Tem como pedir para ele ler até encontrar um '\n' (enter) ou '' fim de string mas eu não lembro como.

Quando tu lê a string a72 o primeiro caracter é um número da tabela ASCII (procura no google por tabela ASCII), o segundo também e assim por diante.

Não se esqueça quem em a72 nós podemos encontrar 4 caracteres.

[0]=='a';

[1]=='a';

[2]=='a';

[3]==''; ou [3]==0u;

Portanto tu pode vasculhar a string inteira testando se o caracter é uma letra ou um número. Se entre os caracteres ele encontrar pelo menos uma letra. Ele não é um número.

Aqui está um exemplo:

char* numero = NULL;
fscanf(arq,"%s",numero);
//testa se retornou alguma string
if(numero){
    //variavel para avisar se é número ou não
    bool isNumber=true;
    unsigned int i=0u;
    //enquanto o caracter for diferente de 0u ou '' ele vai testando
    while(numero[i]!=''){
        //
        if(numero[i]<'0' || numero[i]>'9'){
            //Se o caracter é menor que 0 (código 48) e maior que 9 (código 57) então ele não é um número. É um outro caracter
            //não é número
            isNumber=false;
            //vai fora do while
            break;
        }
        //senao continual testanto incrementando o i
        i++
    }
    //no final do while. A variavel isNumber sera true ou false. se true ele é número e se false ele não é número
    if(isNumber){
        //é um número
        printf("\né um número");
    }
    else{
        //
        printf("\nNão é um número");
    }
}
Assim tu descobre se os caracteres são números ou letras. No caso de número com virgula. Tu só muda a condição adicionando o caracter da virgula.
//Se o caracter for menor que 0 ou maior que 9 e diferente de ponto. Então é um caracter inválido.
        if((numero[i]<'0' || numero[i]>'9')&&numero[i]!='.'){
É claro que essa condição não testa multiplos pontos. Pra isso tu precisa criar uma variavel que avisa se já ocorreu um ponto ou não. Se já ocorreu então o segundo ponto é dado como erro: Exemplo.
char* numero = NULL;
fscanf(arq,"%s",numero);
//testa se retornou alguma string
if(numero){
    //variavel para avisar se é número ou não
    bool isNumber=true;
    //variavel para avisar se o numero possui virgula (ponto) ou não
    bool point=false;
    unsigned int i=0u;
    //enquanto o caracter for diferente de 0u ou '' ele vai testando
    while(numero[i]!=''){
        //
        if(numero[i]<'0' || numero[i]>'9'){
            //Se o caracter é menor que 0 (código 48) e maior que 9 (código 57) então ele não é um número. É um outro caracter
            //testa se é um ponto
            if(numero[i]=='.'){
                //testa se já ocorreu outro ponto antes
                if(point){
                    //se sim então ele não é um número
                    //não é número
                    isNumber=false;
                    //vai fora do while
                    break;
                }
                else{
                    //senão ele é um número com virgula e ele continua testando
                    point=true;
                }
            }
        }
        //senao continual testanto incrementando o i
        i++
    }
    //no final do while. A variavel isNumber sera true ou false. se true ele é número e se false ele não é número
    if(isNumber){
        //é um número
        printf("\né um número");
    }
    else{
        //
        printf("\nNão é um número");
    }
}

Um abraço.

Link para o comentário
Compartilhar em outros sites

  • 0

é texto.. no arquivo entrada.dat terá por exemplo:

10

20

28

não consegui colocar o numero como ponteiro, ele dá um erro..

tentei fazer o seguinte

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

  int equadri();
  int verifica();
  int naoequadri();
  FILE *p; FILE *pb;
 char numero[100];

    unsigned int i=0u;

    int n, m, p1,p2,p3,p4,n1,n2,n3,n4,k=1, boolean =0,isNumber=1;
 char carac[50];
 char c;

int main()
{    if (!(p = fopen("entrada.dat","r")))  {
          printf("Erro! Impossivel abrir o arquivo!\n");
          system("PAUSE");
          }
        if (!(pb = fopen("saida.dat","w"))){
          printf("Erro! Impossivel criar o arquivo!\n");
          system("PAUSE");
          }


          while (!feof(p))
          {
            fscanf(p,"%s",numero);
            while(numero[i]!='/n'){
          if(numero[i]<='0' || numero[i]>='9')
           { isNumber=0;
           printf("errooooo");
             fprintf(pb,"\n ERRO!!! \n Caracter diferente de numero foi encontrado",n);
             break;
           }}

       if (isNumber==1)
          {
           n = atoi(numero);
           boolean = 0;
           verifica();
          }
            i++;  isNumber=1;
          }//fim do while



      system("PAUSE");

    fclose(pb);
    fclose(p);
    return(0);


}


   int equadri()
     {
       fprintf(pb,"\n O numero %d e  quadri e: %d \n",n,k);
     }
    int naoequadri()
    {

        fprintf(pb,"\n O numero %d não e  quadr \n",n);
    }

 int verifica(){
            do
        {
           //conta
            }

            k++;

        }while(k<=n);

        if (boolean ==0){
                    naoequadri();
        }

}

só q desse jeito não aparece nd na tela.. e o borland fala esses erros

+ Warning] Unit1.c(17): W8060 Possibly incorrect assignment

[C++ Warning] Unit1.c(21): W8060 Possibly incorrect assignment

[C++ Warning] Unit1.c(30): W8098 Multi-character character constant

[C++ Warning] Unit1.c(30): W8068 Constant out of range in comparison

[C++ Warning] Unit1.c(30): W8012 Comparing signed and unsigned values

[C++ Warning] Unit1.c(42): W8065 Call to function 'verifica' with no prototype

[C++ Warning] Unit1.c(62): W8070 Function should return a value

[C++ Warning] Unit1.c(67): W8070 Function should return a value

[C++ Warning] Unit1.c(88): W8065 Call to function 'equadri' with no prototype

[C++ Warning] Unit1.c(100): W8065 Call to function 'naoequadri' with no prototype

[C++ Warning] Unit1.c(103): W8070 Function should return a value

Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152k
    • Posts
      651,8k
×
×
  • Criar Novo...