Skip to content

Instantly share code, notes, and snippets.

@henrycunh
Created May 21, 2018 04:10
Show Gist options
  • Save henrycunh/d9f16fb3fa40b0a0720af3905769933c to your computer and use it in GitHub Desktop.
Save henrycunh/d9f16fb3fa40b0a0720af3905769933c to your computer and use it in GitHub Desktop.
Resolução do Mockup da P3 de Cap
#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