1. Este site usa cookies. Ao continuar a usar este site está a concordar com o nosso uso de cookies. Saber Mais.

noob de C... números inteiros e decimais

Discussão em 'Programação' iniciada por Quazecotl, 17 de Novembro de 2007. (Respostas: 11; Visualizações: 2040)

  1. Estou agora na universidade e comecei a dar c.

    Tenho o primeiro trabalho que já encontrei várias formas diferentes de abordar, mas aquela que seria a mais perfeita é a que não consigo por em prática.

    Basicamente, precisava de encontrar uma forma de ao introduzir um número, o programa ser capaz de distinguir se é um número decimal ou inteiro. (que depois iría comportar-se de diferentes maneiras consoante o resultado)

    Fui ás aulas todas e não falamos em nada disto... mas com este professor acho que vamos ter mesmo de ser autodidatas.
    Existem outras formas para fazer o trabalho mas isto era o melhor...

    obrigado
    cumps

    edit: btw, first post :D
    já cá tive uma conta mas não me lembro dos dados....
     
  2. Sharkarp

    Sharkarp Power Member

    Assim à primeira não me lembro de nenhuma função que faça esse teste, podes fazer uma coisa por exemplo:

    Código:
    double temp;
    double numero;
    
    /* Les o numero para a variável numero*/
    temp = numero;
    while (numero > 0) {
    temp--;
    }
    if (numero == 0) { printf("é inteiro"); }
    else { printf("é decimal"); }
    
    Não sei se funciona, mas acho que sim ^^
    É uma maneira um bocado fraquinha, mas pronto dá para o gasto :)
     
  3. Baderous

    Baderous Banido

    Para verificares se um nº é decimal podes fazer o seguinte:

    - Recebes o tal nº como parâmetro da função
    - Fazes o cast desse número para int e de seguida subtrais o nº inicial ao nº obtido com o cast
    - Se o resultado dessa operação for positivo, então o nº é decimal, caso contrário não é

    Isto é uma das formas, penso que também dá para fazer usando o quociente/resto da divisão por 10, vou ver se consigo fazer...
     
  4. obrigado pelas respostas

    @Sharkarp
    acho que tens aí uns erros mas percebi a ideia e adptei

    Código:
    float temp;
    float numero;
    
    scanf("%f", &numero);
    
      
    while (numero > 0) {
    numero--;
    }
    temp=numero;
    if (temp == 0) { printf("é inteiro"); }
    else { printf("é decimal"); }
    
    substituí o "temp" por "numero" no loop porque se não ficava infinito, e substitui os doubles por floats porque (não sei bem porquê...) estava a fazer o loop até ao -1 e depois saltava sempre para o else, e agora já está a funcionar direitinho.
    Um problema que pode nascer daqui é que só dá para aplicar aos números positivos, mas fazendo outro loop com "while (numero<0){numero++;}" já deve ficar resolvido.

    @Baderous

    já tinha pensado numa coisa desse género mas não sei fazer "cast" (nem exactamente o que é, ainda estou no inicio...), nem sabia que dava para fazer... já arranjei solução para o problema, mas se puderes dizer como faço isso agradecia, mais fico a aprender :)

    mais uma vez, obrigado
     
  5. Baderous

    Baderous Banido

    Aqui fica:

    Código:
    void dec(float x) {
        int z; float res;
        z = (int)x;
        res=x-z;
        if (res>0)
           printf("Decimal\n");
        else printf("Inteiro\n");
    }
    A operação de casting encontra-se em: z = (int)x.
    O que isto faz é promover temporariamente a variável float x a int. Ou seja se tiveres x=2.6, fazendo o casting (int) x, vais obter x=2 (não há arredondamentos por defeito nem excesso).
    Portanto o que o código acima faz é:
    - Recebe uma variável do tipo float
    - Faz o cast para int para obter apenas a parte inteira desse número
    - Subtrai o nº original à sua parte inteira
    - Se o resultado for positivo, isto é, por exemplo: 2.6 - 2 = 0.6 > 0, então o nº é decimal, caso contrário não é.
     
  6. Baderous

    Baderous Banido

    Afinal o que escrevi estava errado, pois o % não funciona para floats...my bad (sorry double post).
     
    Última edição: 17 de Novembro de 2007
  7. obrigado pela ajuda outra vez ;)
     
  8. OubeLa

    OubeLa Power Member

    Podes sempre fazer isto:

    - lês o input para uma variavel string.
    - procuras na string o caracter "." (separador decimal)
    - se esse caracter existir, fazes uma substring do que está à direita do "." e verificas se é igual ou diferente de zero
    - Se for igual a zero, ou se não existir "." é inteiro. Caso tenha o "." e a parte decimal for diferente de zero é decimal.
     
  9. Para quê tanta confusão?
    Já deram aqui a solução.
    Vou só por isto em termos práticos...

    Código:
    #include <stdio.h>
    
    int main()
    {
        int i;
        float num;
        
        printf("Número: ");
        scanf("%f", &num);
        
        if(num == (int)num)
            printf("INT\n");
        else
            printf("NOT INT\n");
        
        return 0;
    }
    
    EDIT: Agora já funciona.
     
    Última edição: 18 de Novembro de 2007
  10. OubeLa

    OubeLa Power Member

    Apenas disse mais uma maneira de fazer, que até nem é nada confusa. É um bom exercicio para treinar a manipulação de strings ;)
     
  11. Consu

    Consu Power Member

    Convém só considerar se , por exemplo, 2.0 é inteiro ou decimal.
    Código:
    if( (int) 2.0 == 2.0 ) // Verdadeiro
    
    Pelo menos para a linguagem C escrever 2 é bem diferente de escrever 2.0, no primeiro caso é reconhecido como um int, no segundo como um float.
    Se assim for é necessário fazer o parsing da string, caso contrário o método sugerido funciona. ;)
     
  12. Baderous

    Baderous Banido

    Até digo mais, optimizando isto ao máximo obtínhamos:

    Código:
    int isInt(float x) {
         return (x==(int)x);
         }
    Agora não sei se isto funciona para o caso x=2.0, mas logo vejo isso.
     
    Última edição: 19 de Novembro de 2007

Partilhar esta Página