Jump to content
Fórum Script Brasil
  • 0

verificar se é numero ou não


tahinf

Question

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 to comment
Share on other sites

3 answers to this question

Recommended Posts

  • 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 to comment
Share on other 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 to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Answer this question...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.



  • Forum Statistics

    • Total Topics
      152.2k
    • Total Posts
      652k
×
×
  • Create New...