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");
}
}