Explorando Conceitos de Programação em C Através de Exemplos Práticos

Exercício 1: Geração Aleatória de Identificadores

Este programa demonstra a geração de números pseudoaleatórios em C para criar identificadores sequenciais, como números de matrícula. Ele inicializa o gerador de números aleatórios com base no tempo atual para garantir diferentes sequências a cada execução.

#include <stdio.h>
#include <stdlib.h> // Para srand, rand
#include <time.h>   // Para time

#define TOTAL_IDS 5     // Número de identificadores a serem gerados
#define MAX_SUFIXO_A 80 // Limite superior para o sufixo do Grupo A
#define MAX_SUFIXO_B 35 // Limite superior para o sufixo do Grupo B

int main() {
    int contador_ids;
    int escolha_prefixo; // 0 para Grupo B, 1 para Grupo A
    int numero_sequencial;

    // Inicializa o gerador de números aleatórios com o tempo atual
    srand(time(NULL));

    printf("Gerando %d identificadores aleatórios:\n", TOTAL_IDS);

    for (contador_ids = 0; contador_ids < TOTAL_IDS; contador_ids++) {
        // Escolhe aleatoriamente entre dois prefixos (0 ou 1)
        escolha_prefixo = rand() % 2;

        if (escolha_prefixo == 1) { // Prefixo para o Grupo A
            // Gera um número entre 1 e MAX_SUFIXO_A
            numero_sequencial = rand() % MAX_SUFIXO_A + 1;
            printf("20256343%04d\n", numero_sequencial);
        } else { // Prefixo para o Grupo B
            // Gera um número entre 1 e MAX_SUFIXO_B
            numero_sequencial = rand() % MAX_SUFIXO_B + 1;
            printf("20256136%04d\n", numero_sequencial);
        }
    }

    return 0;
}

Exercício 2: Simulação de Máquina de Vendas

Este programa simula um processo de compra em uma máquina de vendas de bebidas. Ele apresenta um menu, aceita a escolha do usuário e a quantidade, calcula o preço total e o troco. A variável custo_total é redefiinda para zero após cada transação, garantindo que as compras sejam calculadas individualmente.

#include <stdio.h>

// Definindo os preços das bebidas
#define PRECO_REFRIGERANTE 3.0f
#define PRECO_SUCO_LARANJA 5.0f
#define PRECO_AGUA           2.0f

int main() {
    int opcao_bebida, quantidade_item;
    float custo_total_transacao;
    float valor_pago_cliente, troco_final;

    while (1) {
        custo_total_transacao = 0.0f; // Importante: resetar o custo total para cada nova transação

        printf("\n--- Menu da Máquina de Vendas ---\n");
        printf("1. Refrigerante - R$ %.2f\n", PRECO_REFRIGERANTE);
        printf("2. Suco de Laranja - R$ %.2f\n", PRECO_SUCO_LARANJA);
        printf("3. Água Mineral - R$ %.2f\n", PRECO_AGUA);
        printf("0. Sair do processo de compra\n");
        printf("Por favor, digite o número da bebida: ");
        scanf("%d", &opcao_bebida);

        if (opcao_bebida == 0) {
            break; // Sai do loop se a opção for 0
        }

        if (opcao_bebida < 1 || opcao_bebida > 3) { // Ajustado para 3 opções
            printf("Opção de bebida inválida. Por favor, digite novamente.\n");
            continue; // Volta ao início do loop
        }

        printf("Por favor, digite a quantidade desejada: ");
        scanf("%d", &quantidade_item);

        if (quantidade_item <= 0) {
            printf("A quantidade deve ser um número positivo. Por favor, digite novamente.\n");
            continue; // Volta ao início do loop
        }

        // Calcula o custo total com base na opção e quantidade
        switch (opcao_bebida) {
            case 1: // Refrigerante
                custo_total_transacao += PRECO_REFRIGERANTE * quantidade_item;
                break;
            case 2: // Suco de Laranja
                custo_total_transacao += PRECO_SUCO_LARANJA * quantidade_item;
                break;
            case 3: // Água Mineral
                custo_total_transacao += PRECO_AGUA * quantidade_item;
                break;
            default:
                // Este caso não deve ser alcançado devido à validação anterior
                break;
        }

        printf("Total a pagar: R$ %.2f\n", custo_total_transacao);
        printf("Por favor, insira o valor pago: ");
        scanf("%f", &valor_pago_cliente);

        if (valor_pago_cliente < custo_total_transacao) {
            printf("Valor insuficiente. Por favor, insira o valor correto.\n");
            continue; // Permite ao cliente tentar pagar novamente
        }

        troco_final = valor_pago_cliente - custo_total_transacao;
        printf("Troco: R$ %.2f\n", troco_final);
    }

    printf("Obrigado pela sua compra, volte sempre!\n");
    return 0;
}

Exercício 3: Semáforo Simples com Entrada de Caracteres

Este programa simula um sistema de semáforo que responde a caracteres específicos. Ele lê continuamente um caractere da entrada padrão e imprime uma mensagem correspondente, como 'go go go' para 'g'. O programa termina ao receber o caractere de fim de arquivo (EOF).

#include <stdio.h> // Para getchar, printf, EOF
#include <stdlib.h> // Geralmente incluído, mas não estritamente necessário aqui

int main() {
    char caractere_luz;

    printf("Simulador de Semáforo. Digite 'y' (amarelo), 'g' (verde), 'r' (vermelho).\n");
    printf("Pressione Ctrl+D (Unix/Linux) ou Ctrl+Z e Enter (Windows) para sair.\n");

    while (1) {
        printf("\nEntrada: ");
        caractere_luz = getchar(); // Lê um único caractere

        if (caractere_luz == EOF) {
            break; // Sai do loop se EOF for detectado
        }

        // Ignora caracteres de nova linha para não processá-los como comandos
        if (caractere_luz == '\n') {
            continue;
        }

        // Usa switch-case para clareza na verificação de múltiplos casos
        switch (caractere_luz) {
            case 'y':
                printf("Atenção, espere um minuto!\n");
                break;
            case 'g':
                printf("Prossiga, vá em frente!\n");
                break;
            case 'r':
                printf("Pare!\n");
                break;
            default:
                printf("Comando inválido. Algo está errado...\n");
                break;
        }
    }

    printf("Simulador encerrado.\n");
    return 0;
}

Exercício 4: Rastreador de Despesas Diárias

Este programa permite ao usuário inserir despesas diárias e calcula o total acumulado, a despesa máxima e a despesa mínima. A entrada de -1 serve como condição de parada para encerrar o registro das despesas.

#include <stdio.h> // Para printf, scanf
#include <float.h> // Para DBL_MAX, DBL_MIN se necessário, mas não utilizado diretamente aqui

int main() {
    double despesa_atual;
    double maior_despesa = -1.0; // Inicializar com um valor que será facilmente superado
    double menor_despesa = -1.0; // Inicializar com um valor que será facilmente superado
    double total_acumulado = 0.0;
    int primeira_despesa = 1; // Flag para a primeira entrada

    printf("Digite suas despesas diárias (digite -1 para finalizar):\n");

    while (scanf("%lf", &despesa_atual) == 1 && despesa_atual != -1) {
        if (primeira_despesa) {
            maior_despesa = despesa_atual;
            menor_despesa = despesa_atual;
            primeira_despesa = 0; // Desativa a flag após a primeira entrada
        } else {
            if (despesa_atual > maior_despesa) {
                maior_despesa = despesa_atual;
            }
            if (despesa_atual < menor_despesa) {
                menor_despesa = despesa_atual;
            }
        }
        total_acumulado += despesa_atual;
    }

    if (primeira_despesa) { // Se nenhuma despesa válida foi inserida
        printf("Nenhuma despesa foi registrada hoje.\n");
    } else {
        printf("\n--- Resumo das Despesas ---\n");
        printf("Total acumulado: R$ %.2lf\n", total_acumulado);
        printf("Maior despesa: R$ %.2lf\n", maior_despesa);
        printf("Menor despesa: R$ %.2lf\n", menor_despesa);
    }

    return 0;
}

Exercício 5: Classificador de Tipos de Triângulos

Este programa lê três números inteiros que representam os lados de um triângulo e os classifica em Equilátero, Isósceles, Retângulo ou Comum, ou indica se eles não podem formar um triângulo. O programa processa enrtadas continuamente até que um erro de leitura ou EOF seja encontrado.

#include <stdio.h> // Para printf, scanf
#include <stdlib.h> // Para abs, embora não usado no exemplo original, útil para triângulos

int main() {
    int lado_a, lado_b, lado_c;
    int resultado_leitura;

    printf("Digite três números inteiros para os lados do triângulo (separados por espaço).\n");
    printf("Pressione Ctrl+D (Unix/Linux) ou Ctrl+Z e Enter (Windows) para sair.\n");

    while (1) {
        printf("\nEntrada (a b c): ");
        resultado_leitura = scanf("%d %d %d", &lado_a, &lado_b, &lado_c);

        if (resultado_leitura == EOF) {
            break; // Sai do loop se EOF for detectado
        }

        if (resultado_leitura != 3) {
            printf("Entrada inválida. Por favor, digite três números.\n");
            // Limpa o buffer de entrada para evitar loop infinito em caso de entrada não numérica
            while (getchar() != '\n');
            continue;
        }

        // Verifica a condição de existência do triângulo
        if (lado_a <= 0 || lado_b <= 0 || lado_c <= 0 ||
            !(lado_a + lado_b > lado_c &&
              lado_a + lado_c > lado_b &&
              lado_b + lado_c > lado_a)) {
            printf("Não pode formar um triângulo com esses lados (lados devem ser positivos e satisfazer a desigualdade triangular).\n");
        } else if (lado_a == lado_b && lado_b == lado_c) {
            printf("Triângulo Equilátero\n");
        } else if (lado_a == lado_b || lado_b == lado_c || lado_a == lado_c) {
            printf("Triângulo Isósceles\n");
        } else if (lado_a * lado_a + lado_b * lado_b == lado_c * lado_c ||
                   lado_a * lado_a + lado_c * lado_c == lado_b * lado_b ||
                   lado_b * lado_b + lado_c * lado_c == lado_a * lado_a) {
            printf("Triângulo Retângulo\n");
        } else {
            printf("Triângulo Comum (Escaleno)\n");
        }
    }

    printf("Programa de classificação de triângulos encerrado.\n");
    return 0;
}

Exercício 6: Jogo de Adivinhe o Dia da Sorte

Este é um jogo simples onde o jogador tem três tentativas para adivinhar um "dia da sorte" aleatório entre 1 e 30. O programa fornece dicas (maior ou menor) após cada palpite incorreto e revela o dia correto se o jogador ficar sem tentativas.

#include <stdio.h>  // Para printf, scanf
#include <stdlib.h> // Para srand, rand
#include <time.h>   // Para time

int main() {
    int dia_sorteio;
    int palpite_usuario;
    int tentativas_restantes = 3;

    // Inicializa o gerador de números aleatórios
    srand(time(NULL));

    // Gera um dia aleatório entre 1 e 30
    dia_sorteio = rand() % 30 + 1;

    printf("Adivinhe qual dia de novembro de 2025 é o seu dia de sorte!\n");
    printf("Você tem 3 tentativas. O dia está entre 1 e 30.\n");

    while (tentativas_restantes > 0) {
        printf("Tentativas restantes: %d\n", tentativas_restantes);
        printf("Seu palpite (1-30): ");
        scanf("%d", &palpite_usuario);

        if (palpite_usuario < 1 || palpite_usuario > 30) {
            printf("Palpite inválido. Por favor, digite um número entre 1 e 30.\n");
            continue; // Não consome uma tentativa para palpites inválidos
        }

        if (palpite_usuario == dia_sorteio) {
            printf("Parabéns! Você adivinhou o dia de sorte corretamente: %d :)\n", dia_sorteio);
            break; // Sai do loop se o palpite estiver correto
        } else if (palpite_usuario < dia_sorteio) {
            printf("Seu palpite foi muito baixo. O dia da sorte é posterior a %d.\n", palpite_usuario);
        } else { // palpite_usuario > dia_sorteio
            printf("Seu palpite foi muito alto. O dia da sorte é anterior a %d.\n", palpite_usuario);
        }

        tentativas_restantes--; // Decrementa uma tentativa
    }

    if (tentativas_restantes == 0) {
        printf("\nSuas tentativas acabaram.\n");
        printf("Não se preocupe, o dia da sorte de novembro era: %d.\n", dia_sorteio);
    }

    printf("Obrigado por jogar!\n");
    return 0;
}

Tags: C programming random number generation vending machine Input/Output control flow

Publicado em 7-17 07:51