-
-
Save henrycunh/d9f16fb3fa40b0a0720af3905769933c to your computer and use it in GitHub Desktop.
Resolução do Mockup da P3 de Cap
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#include <stdio.h> | |
#include <string.h> | |
// Constantes pré-compiladas | |
#define NOME_MAX 60 | |
#define NOTAS_MAX 5 | |
#define AMIGOS_MAX 15 | |
// Definindo a estrutura de Aluno | |
typedef struct aluno_dados { | |
// String | |
char nome[NOME_MAX]; | |
// Inteiros | |
int idade, | |
notas[NOTAS_MAX], | |
status, | |
qtd_amigos; | |
// Vetor de ponteiros | |
struct aluno_dados *amigos[AMIGOS_MAX]; | |
} Aluno; | |
// Definindo inicializador de Aluno | |
#define NOVO_ALUNO { .idade = 0, .status = 0, .qtd_amigos = 0 } | |
// Cabeçalhos das funções | |
void alterar_nome(Aluno*, char*); | |
void alterar_idade(Aluno*, int); | |
void alterar_notas(Aluno*, int[NOTAS_MAX]); | |
void atualizar_status(Aluno*); | |
void vincular_amigo(Aluno*, Aluno*); | |
double media_amigos(Aluno*); | |
void imprimir_aluno(Aluno*); | |
// Execução Principal | |
int main() { | |
Aluno joao = NOVO_ALUNO; | |
Aluno pedro = NOVO_ALUNO; | |
alterar_nome(&joao, "Joao"); | |
alterar_nome(&pedro, "Pedro"); | |
alterar_idade(&joao, 18); | |
alterar_idade(&pedro, 20); | |
int notas_joao[] = {6, 8, 9, 5, 4}; | |
int notas_pedro[] = {9, 9, 9, 2, 3}; | |
alterar_notas(&joao, notas_joao); | |
alterar_notas(&pedro, notas_pedro); | |
atualizar_status(&joao); | |
atualizar_status(&pedro); | |
vincular_amigo(&joao, &pedro); | |
// Note que daqui para baixo, as funções não precisariam | |
// ser de referência, mas estamos o fazendo por questões | |
// de prática | |
printf("Media dos amigos de Joao: %.2lf\n", media_amigos(&joao)); | |
imprimir_aluno(&joao); | |
imprimir_aluno(&pedro); | |
return 0; | |
} | |
// Altera o nome do aluno | |
void alterar_nome(Aluno* aluno, char * nome){ | |
// O operador -> é usado para referênciar diretamente | |
// a váriavel contida no espaço de memória, no exemplo abaixo | |
// temos que ' aluno->nome ' é equivalente a ' (*aluno).nome ' | |
strcpy( aluno->nome, nome ); | |
} | |
// Altera a idade do aluno | |
void alterar_idade(Aluno* aluno, int idade){ | |
aluno->idade = idade; | |
} | |
// Altera as notas do aluno | |
void alterar_notas(Aluno* aluno, int notas[NOTAS_MAX]){ | |
int i; | |
for(i = 0; i < NOTAS_MAX; i++) | |
aluno->notas[i] = notas[i]; | |
} | |
// Atualiza o status do aluno | |
void atualizar_status(Aluno* aluno){ | |
int i; | |
double media = 0; | |
for(i = 0; i < NOTAS_MAX; i++) | |
media += aluno->notas[i]; | |
media /= NOTAS_MAX; | |
aluno->status = media >= 6; | |
} | |
// Vincula um amigo ao outro | |
void vincular_amigo(Aluno* aluno, Aluno* amigo){ | |
// Nesse exemplo, estarei vinculando um ao outro | |
// mas poderia ser unidirecional também | |
aluno->amigos[ aluno->qtd_amigos++ ] = amigo; | |
amigo->amigos[ amigo->qtd_amigos++ ] = aluno; | |
} | |
// Retorna média dos amigos | |
double media_amigos(Aluno* aluno){ | |
int i, j; | |
double media; | |
for(i = 0; i < aluno->qtd_amigos; i++) | |
for(j = 0; j < NOTAS_MAX; j++) | |
media += aluno->amigos[i]->notas[j]; | |
media /= NOTAS_MAX; | |
media /= aluno->qtd_amigos; | |
return media; | |
} | |
// Imprime dados dos alunos | |
void imprimir_aluno(Aluno* aluno){ | |
int i; | |
printf("Dados do Aluno\n"); | |
printf("\tNome: %s\n", aluno->nome); | |
printf("\tIdade: %d\n", aluno->idade); | |
printf("\tNotas:\n"); | |
for(i = 0; i < NOTAS_MAX; i++) | |
printf("\t\t#%d: %d\n", i + 1, aluno->notas[i] ); | |
printf("\tStatus: %s\n", aluno->status ? "Aprovado" : "Reprovado"); | |
printf("\tAmigos (%d):\n", aluno->qtd_amigos); | |
for(i = 0; i < aluno->qtd_amigos; i++) | |
printf("\t\tAmigo #%d: %s\n", i + 1, aluno->amigos[i]->nome); | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment