Exercícios Práticos de Programação em C com Estruturas e Funções

Exercício 4: Classificação de Livros por Volume de Vendas

O código a seguir define uma estrutura para livros, ordena-os por quantidade vendida usando bubble sort, e calcula o valor total das vendas.


#include <stdio.h>
#define TAMANHO 10

typedef struct {
    char isbn[20];
    char titulo[80];
    char autor[80];
    double preco;
    int vendas;
} Livro;

void mostrarLivros(Livro livros[], int qtd);
void ordenarPorVendas(Livro livros[], int qtd);
double somarValorTotal(Livro livros[], int qtd);

int main() {
    Livro catalogo[TAMANHO] = {
        {"978-7-5327-6082-4", "Morte do Goleiro", "Ronald Ren", 42, 51},
        {"978-7-308-17047-5", "Terra de Liberdade e Amor", "Yun Yetui", 49, 30},
        {"978-7-5404-9344-8", "Londrinos", "Craig Taylor", 68, 27},
        {"978-7-5447-5246-6", "Ciclo de Vida de Corpos de Software", "Ted Chiang", 35, 90},
        {"978-7-5722-5475-8", "Breve História dos Chips", "Wang Bo", 74.9, 49},
        {"978-7-5133-5750-0", "Guerra dos Mainframes", "Blake J. Harris", 128, 42},
        {"978-7-2011-4617-1", "Café no Fim do Mundo", "John Strelecky", 22.5, 44},
        {"978-7-5133-5109-6", "Olá, Alienígenas", "Futuro Publishing UK", 118, 42},
        {"978-7-1155-0509-5", "O Início Infinito", "David Deutsch", 37.5, 55},
        {"978-7-229-14156-1", "A Fonte", "Ayn Rand", 84, 59}
    };

    printf("Ranking de livros por vendas:\n");
    ordenarPorVendas(catalogo, TAMANHO);
    mostrarLivros(catalogo, TAMANHO);
    printf("\nValor total das vendas: %.2f\n", somarValorTotal(catalogo, TAMANHO));

    return 0;
}

void mostrarLivros(Livro livros[], int qtd) {
    printf("%-20s %-30s %-20s %-10s %s\n", "ISBN", "Título", "Autor", "Preço", "Vendas");
    for (int idx = 0; idx < qtd; idx++) {
        printf("%-20s %-30s %-20s %-10g %d\n", livros[idx].isbn, livros[idx].titulo, livros[idx].autor, livros[idx].preco, livros[idx].vendas);
    }
}

void ordenarPorVendas(Livro livros[], int qtd) {
    for (int i = 0; i < qtd - 1; i++) {
        for (int j = 0; j < qtd - i - 1; j++) {
            if (livros[j].vendas < livros[j + 1].vendas) {
                Livro temporario = livros[j];
                livros[j] = livros[j + 1];
                livros[j + 1] = temporario;
            }
        }
    }
}

double somarValorTotal(Livro livros[], int qtd) {
    double total = 0.0;
    for (int k = 0; k < qtd; k++) {
        total += livros[k].vendas * livros[k].preco;
    }
    return total;
}

Exercício 5: Manipulação de Datas

Este exercício lida com estruturas de data, permitindo entrada de dados, cálculo do dia do ano e comparação de datas.


#include <stdio.h>

typedef struct {
    int ano;
    int mes;
    int dia;
} Data;

void lerData(Data *pdata);
int diaDoAno(Data d);
int compararDatas(Data d1, Data d2);

void teste1() {
    Data d;
    printf("Insira a data (formato AAAA-MM-DD):\n");
    for (int i = 0; i < 3; i++) {
        lerData(&d);
        printf("%d-%02d-%02d é o %dº dia do ano\n\n", d.ano, d.mes, d.dia, diaDoAno(d));
    }
}

void teste2() {
    Data nascimentoAlice, nascimentoBob;
    printf("Insira as datas de nascimento de Alice e Bob (formato AAAA-MM-DD):\n");
    for (int i = 0; i < 3; i++) {
        lerData(&nascimentoAlice);
        lerData(&nascimentoBob);
        int resultado = compararDatas(nascimentoAlice, nascimentoBob);
        if (resultado == 0) {
            printf("Alice e Bob têm a mesma idade\n\n");
        } else if (resultado == -1) {
            printf("Alice é mais velha que Bob\n\n");
        } else {
            printf("Alice é mais nova que Bob\n\n");
        }
    }
}

int main() {
    printf("Teste 1: Entrada de data e cálculo do dia do ano\n");
    teste1();
    printf("\nTeste 2: Comparação de idades\n");
    teste2();
    return 0;
}

void lerData(Data *pdata) {
    scanf("%d-%02d-%02d", &pdata->ano, &pdata->mes, &pdata->dia);
}

int diaDoAno(Data d) {
    int diasPorMes[] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
    if ((d.ano % 4 == 0 && d.ano % 100 != 0) || (d.ano % 400 == 0)) {
        diasPorMes[1] = 29;
    }
    int totalDias = 0;
    for (int i = 0; i < d.mes - 1; i++) {
        totalDias += diasPorMes[i];
    }
    totalDias += d.dia;
    return totalDias;
}

int compararDatas(Data d1, Data d2) {
    if (d1.ano < d2.ano) {
        return -1;
    } else if (d1.ano > d2.ano) {
        return 1;
    } else {
        if (d1.mes < d2.mes) {
            return -1;
        } else if (d1.mes > d2.mes) {
            return 1;
        } else {
            if (d1.dia < d2.dia) {
                return -1;
            } else if (d1.dia > d2.dia) {
                return 1;
            } else {
                return 0;
            }
        }
    }
}

Exercício 6: Exibição de Contas com Senha Mascada

O código gerencia contas de usuário, exibindo informações com senhas substituídas por asteriscos.


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

enum Papel { administrador, aluno, professor };

typedef struct {
    char usuario[20];
    char senha[20];
    enum Papel tipo;
} Conta;

void exibirContas(Conta contas[], int total);

int main() {
    Conta lista[] = {
        {"A1001", "123456", aluno},
        {"A1002", "12abcdef", aluno},
        {"A1009", "xyz12121", aluno},
        {"X1009", "9213071x", administrador},
        {"C11553", "129dfg32k", professor},
        {"X3005", "921kfmg917", aluno}
    };
    int n = sizeof(lista) / sizeof(Conta);
    exibirContas(lista, n);
    return 0;
}

void exibirContas(Conta contas[], int total) {
    for (int i = 0; i < total; i++) {
        printf("%-15s", contas[i].usuario);
        int tamanhoSenha = strlen(contas[i].senha);
        for (int j = 0; j < tamanhoSenha; j++) {
            printf("*");
        }
        printf("\t");
        if (contas[i].tipo == administrador) {
            printf(" administrador\n");
        } else if (contas[i].tipo == aluno) {
            printf(" aluno\n");
        } else {
            printf(" professor\n");
        }
    }
}

Exercício 7: Gerenciamento de Contatos com Contatos VIP

Este exercício implementa uma lista de contatso, permitindo definir contatos VIP e exibi-los em ordem alfabética com VIPs primeiro.


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

typedef struct {
    char nome[20];
    char telefone[12];
    int ehVip;
} Contato;

void definirVip(Contato contatos[], int qtd, char nome[]);
void listarContatos(Contato contatos[], int qtd);
void exibirOrdenado(Contato contatos[], int qtd);

#define MAXIMO 10

int main() {
    Contato agenda[MAXIMO] = {
        {"Liu Yi", "15510846604", 0},
        {"Chen Er", "18038747351", 0},
        {"Zhang San", "18853253914", 0},
        {"Li Si", "13230584477", 0},
        {"Wang Wu", "15547571923", 0},
        {"Zhao Liu", "18856659351", 0},
        {"Zhou Qi", "17705843215", 0},
        {"Sun Ba", "15552933732", 0},
        {"Wu Jiu", "18077702405", 0},
        {"Zheng Shi", "18820725036", 0}
    };
    int numVip;
    char nomeVip[20];

    printf("Agenda original:\n");
    listarContatos(agenda, MAXIMO);

    printf("\nQuantos contatos VIP? ");
    scanf("%d", &numVip);
    printf("Insira os nomes dos contatos VIP:\n");
    for (int i = 0; i < numVip; i++) {
        scanf("%s", nomeVip);
        definirVip(agenda, MAXIMO, nomeVip);
    }

    printf("\nAgenda ordenada (VIPs primeiro, por ordem alfabética):\n");
    exibirOrdenado(agenda, MAXIMO);

    return 0;
}

void definirVip(Contato contatos[], int qtd, char nome[]) {
    for (int i = 0; i < qtd; i++) {
        if (strcmp(contatos[i].nome, nome) == 0) {
            contatos[i].ehVip = 1;
        }
    }
}

void exibirOrdenado(Contato contatos[], int qtd) {
    // Bubble sort para ordenar por nome
    for (int i = 0; i < qtd - 1; i++) {
        for (int j = 0; j < qtd - i - 1; j++) {
            if (strcmp(contatos[j].nome, contatos[j + 1].nome) > 0) {
                Contato temp = contatos[j];
                contatos[j] = contatos[j + 1];
                contatos[j + 1] = temp;
            }
        }
    }
    // Exibir VIPs primeiro
    for (int i = 0; i < qtd; i++) {
        if (contatos[i].ehVip == 1) {
            printf("%-4s %-20s *\n", contatos[i].nome, contatos[i].telefone);
        }
    }
    for (int i = 0; i < qtd; i++) {
        if (contatos[i].ehVip == 0) {
            printf("%-4s %-20s\n", contatos[i].nome, contatos[i].telefone);
        }
    }
}

void listarContatos(Contato contatos[], int qtd) {
    for (int i = 0; i < qtd; i++) {
        printf("%-10s%-15s", contatos[i].nome, contatos[i].telefone);
        if (contatos[i].ehVip) {
            printf("%5s", "*");
        }
        printf("\n");
    }
}

Tags: C Language structs bubble sort date handling enum types

Publicado em 6-26 00:30