Determinar Inteiro ou Float em C

CBeginner
Pratique Agora

Introdução

Neste laboratório, vamos escrever um programa em C que identifica se um número inserido pelo usuário é um inteiro ou um ponto flutuante (float). Este é um conceito fundamental em programação, onde diferentes tipos de dados têm diferentes requisitos de memória e comportamentos.

Vamos focar na detecção da presença de um ponto decimal na entrada para determinar se o número é um valor de ponto flutuante. Este laboratório apresenta a você o tratamento básico de strings em C, o processamento de entrada do usuário e a lógica condicional.

Ao final deste laboratório, você entenderá como:

  • Ler a entrada do usuário como uma string em C
  • Verificar a presença de caracteres específicos dentro de uma string
  • Usar lógica condicional para tomar decisões com base na entrada

Criar e Abrir o Arquivo do Programa C

Vamos começar criando um novo arquivo C para o nosso programa. Vamos chamá-lo de main.c e colocá-lo no diretório do projeto.

  1. Primeiro, certifique-se de estar no diretório do projeto:
cd ~/project
  1. Agora, no WebIDE, clique no menu "File" (Arquivo), selecione "New File" (Novo Arquivo) e nomeie-o como main.c. Alternativamente, você pode usar o ícone "New File" (Novo Arquivo) na barra lateral do explorador de arquivos.

  2. O editor de arquivos abrirá automaticamente. Vamos adicionar os arquivos de cabeçalho (header files) necessários ao nosso programa:

#include <stdio.h>
#include <string.h>

Esses arquivos de cabeçalho são essenciais para o nosso programa:

  • stdio.h fornece funções para operações padrão de entrada e saída, como printf() e scanf().
  • string.h fornece funções para manipulação de strings, embora neste programa simples, vamos usá-lo principalmente para o cálculo do comprimento da string.

Observe que não incluímos conio.h como mencionado no modelo original. Isso ocorre porque conio.h não é uma biblioteca C padrão e não está disponível em muitos sistemas, incluindo nosso ambiente Ubuntu.

Adicionando a Função Principal e Declarando Variáveis

Agora que temos nossos arquivos de cabeçalho, vamos adicionar a função main() e declarar as variáveis que precisaremos para o nosso programa.

Adicione o seguinte código ao seu arquivo main.c:

int main() {
    char number[20];  // Array para armazenar o número de entrada como uma string
    int flag = 0;     // Flag para rastrear se um ponto decimal foi encontrado (0 = não encontrado, 1 = encontrado)
    int i;            // Variável de contador de loop

    // O programa continuará aqui...

    return 0;
}

Vamos entender essas variáveis:

  • number[20]: Este é um array de caracteres (string) que armazenará a entrada do usuário. Aumentamos o tamanho para 20 caracteres para acomodar números maiores.
  • flag: Esta variável inteira atuará como uma flag booleana. Se encontrarmos um ponto decimal na entrada, definiremos isso como 1.
  • i: Uma variável de contador simples para nosso loop.

A função main() é o ponto de entrada do nosso programa C. Todo o código que escreveremos estará dentro desta função. A instrução return 0 no final indica que o programa foi executado com sucesso.

Seu arquivo agora deve ter a seguinte aparência:

#include <stdio.h>
#include <string.h>

int main() {
    char number[20];  // Array para armazenar o número de entrada como uma string
    int flag = 0;     // Flag para rastrear se um ponto decimal foi encontrado (0 = não encontrado, 1 = encontrado)
    int i;            // Variável de contador de loop

    // O programa continuará aqui...

    return 0;
}

Implementando a Lógica do Programa

Agora, vamos adicionar o código restante para ler a entrada do usuário e determinar se o número é um inteiro ou um float.

Substitua o comentário "O programa continuará aqui..." pelo seguinte código:

    // Solicita ao usuário que insira um número
    printf("Digite um número: ");
    scanf("%s", number);

    // Verifica cada caractere na string do número em busca de um ponto decimal
    for(i = 0; number[i] != '\0'; i++) {
        if(number[i] == '.') {
            flag = 1;  // Define a flag como 1 se o ponto decimal for encontrado
            break;
        }
    }

    // Exibe o resultado com base no valor da flag
    if(flag) {
        printf("O número inserido é um número de ponto flutuante.\n");
    } else {
        printf("O número inserido é um número inteiro.\n");
    }

Vamos examinar o que este código faz:

  1. A instrução printf() exibe um prompt pedindo ao usuário para inserir um número.
  2. A função scanf() lê a entrada do usuário como uma string e a armazena no array number.
  3. Usamos um loop for para iterar por cada caractere da string até atingirmos o terminador nulo ('\0').
  4. Dentro do loop, verificamos se cada caractere é um ponto decimal ('.'). Se encontrado, definimos a flag como 1 e saímos do loop.
  5. Finalmente, usamos uma instrução if para verificar se a flag está definida. Se estiver, informamos ao usuário que o número é um ponto flutuante; caso contrário, é um inteiro.

Seu programa completo agora deve ter a seguinte aparência:

#include <stdio.h>
#include <string.h>

int main() {
    char number[20];  // Array para armazenar o número de entrada como uma string
    int flag = 0;     // Flag para rastrear se um ponto decimal foi encontrado (0 = não encontrado, 1 = encontrado)
    int i;            // Variável de contador de loop

    // Solicita ao usuário que insira um número
    printf("Digite um número: ");
    scanf("%s", number);

    // Verifica cada caractere na string do número em busca de um ponto decimal
    for(i = 0; number[i] != '\0'; i++) {
        if(number[i] == '.') {
            flag = 1;  // Define a flag como 1 se o ponto decimal for encontrado
            break;
        }
    }

    // Exibe o resultado com base no valor da flag
    if(flag) {
        printf("O número inserido é um número de ponto flutuante.\n");
    } else {
        printf("O número inserido é um número inteiro.\n");
    }

    return 0;
}

Compilando e Executando o Programa

Agora que escrevemos nosso programa, vamos compilá-lo e executá-lo para vê-lo em ação.

  1. Primeiro, salve o arquivo se ainda não o fez (Ctrl+S ou Arquivo > Salvar).

  2. Abra um terminal no WebIDE (se ele ainda não estiver aberto).

  3. Navegue até o diretório do projeto e compile o programa usando o compilador GCC:

cd ~/project
gcc main.c -o main

O comando gcc compila nosso arquivo fonte C, e a opção -o main especifica que o executável de saída deve ser chamado main.

  1. Agora execute o programa compilado:
./main
  1. Quando solicitado, insira um número. Tente um inteiro primeiro, como 42:
Digite um número: 42

Você deve ver a saída:

O número inserido é um número inteiro.
  1. Execute o programa novamente e tente um número de ponto flutuante como 3.14:
./main
Digite um número: 3.14

Você deve ver a saída:

O número inserido é um número de ponto flutuante.

O programa identifica corretamente inteiros e números de ponto flutuante com base na presença de um ponto decimal na entrada.

Aprimorando o Programa

Vamos aprimorar nosso programa para torná-lo mais amigável e robusto. Adicionaremos um loop para que o usuário possa verificar vários números sem reiniciar o programa, e também adicionaremos validação de entrada.

Atualize seu arquivo main.c com o seguinte código:

#include <stdio.h>
#include <string.h>
#include <ctype.h>  // Para a função isdigit

int main() {
    char number[20];
    int flag, i;
    char choice;

    do {
        flag = 0;  // Reinicia a flag para cada iteração

        // Solicita ao usuário que insira um número
        printf("\nDigite um número: ");
        scanf("%s", number);

        // Validação da entrada - verifica se a entrada contém apenas dígitos e no máximo um ponto decimal
        int valid = 1;
        int decimal_count = 0;

        for(i = 0; number[i] != '\0'; i++) {
            if(number[i] == '.') {
                decimal_count++;
                if(decimal_count > 1) {
                    valid = 0;
                    break;
                }
            } else if(!isdigit(number[i])) {
                valid = 0;
                break;
            }
        }

        if(!valid) {
            printf("Entrada inválida! Por favor, insira um número válido.\n");
            continue;
        }

        // Verifica se o número é inteiro ou float
        for(i = 0; number[i] != '\0'; i++) {
            if(number[i] == '.') {
                flag = 1;
                break;
            }
        }

        // Exibe o resultado
        if(flag) {
            printf("O número inserido é um número de ponto flutuante.\n");
        } else {
            printf("O número inserido é um número inteiro.\n");
        }

        // Pergunta se o usuário deseja continuar
        printf("\nDeseja verificar outro número? (s/n): ");
        scanf(" %c", &choice);

    } while(choice == 'y' || choice == 'Y');

    printf("\nObrigado por usar o programa!\n");
    return 0;
}

Esta versão aprimorada inclui:

  1. Um loop do-while que permite ao usuário verificar vários números.
  2. Validação de entrada para garantir que a entrada contenha apenas dígitos e no máximo um ponto decimal.
  3. Uma interface mais amigável com prompts e feedback mais claros.

Compile e execute esta versão aprimorada:

cd ~/project
gcc main.c -o main
./main

Teste-o com várias entradas, incluindo:

  • Números inteiros como 42
  • Números de ponto flutuante como 3.14
  • Entradas inválidas como abc ou 1.2.3

O programa deve lidar adequadamente com todos esses casos e permitir que você continue verificando números até que você escolha sair.

Resumo

Neste laboratório, você criou com sucesso um programa em C que determina se um número inserido pelo usuário é um inteiro ou um número de ponto flutuante. Aqui estão os principais conceitos que você aprendeu:

  1. Manipulação de Strings em C (String Handling in C): Você usou arrays de caracteres para armazenar e processar dados de string, iterando por cada caractere para verificar suas propriedades.

  2. Processamento de Entrada do Usuário (User Input Processing): Você aprendeu a solicitar e ler a entrada do usuário usando a função scanf().

  3. Estruturas de Controle (Control Structures): Você implementou instruções condicionais (if-else) e loops (for, do-while) para controlar o fluxo do seu programa.

  4. Validação de Entrada (Input Validation): Na versão aprimorada, você adicionou verificações para garantir que a entrada do usuário seja um número válido.

  5. Aprimoramento do Programa (Program Enhancement): Você aprimorou o programa básico adicionando recursos como um loop do usuário e validação de entrada, tornando-o mais robusto e amigável.

Esses conceitos são fundamentais para muitas tarefas de programação e servirão como uma base sólida à medida que você continua aprendendo a programar em C. A capacidade de distinguir entre diferentes tipos de dados é particularmente importante em linguagens fortemente tipadas como C, onde diferentes tipos de dados têm diferentes alocações de memória e comportamentos.