Skip to content

Instantly share code, notes, and snippets.

@andersonfraga
Created February 12, 2011 19:58
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save andersonfraga/824063 to your computer and use it in GitHub Desktop.
Save andersonfraga/824063 to your computer and use it in GitHub Desktop.
Trabalho de Algoritmos na Faculdade, remotos 2008... :s
/*!
* Integrantes:
* - Anderson Fraga
* - Teu Solano
* - Thiago Garcia
*
* Data: 30/05/2008 - Professora B. Lux
*/
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <windows.h>
#define MAX 35 //Define qual é o número máximo de alunos
// Definição da estrutura que receberá os dados dos alunos
struct alunos {
int matricula;
char datanasc[10];
float altura;
char nome[50];
};
// Definição das funções e seus argumentos
void listagem_alunos(struct alunos turma[MAX], int qtd);
float media_idades(struct alunos turma[MAX], int qtd, char data_atual[]);
float media_alturas(struct alunos turma[MAX], int qtd);
void lista_shell(struct alunos _turma[MAX], int qtd);
int pesquisa_matricula(int busca, struct alunos turma[MAX]);
main() {
int busca, op = 9, qtd = 0, m = 1, res = 0;
char data_atual[10];
// Define a variável que receberá a estrutura de alunos
struct alunos turma[MAX];
system("color 17");
// Menu base
puts("Trabalho 1 de Programacao Estruturada");
puts("Integrantes:");
puts("- Anderson Fraga");
puts("- Teu Solano");
puts("- Thiago Garcia");
printf("\n\n");
// Para calcular a idade média dos alunos, precisamos saber qual é a data atual
// Tentamos implementar as funções da biblioteca time.h, mas não obtivemos sucesso :'(
puts("Por favor, insira a data atual (dd/mm/aaaa):");
scanf(" %s", &data_atual);
// Enquanto o valor do menu for diferente de zero, gera o menu
while( op != 0 ) {
puts("Escolha alguma opcao a seguir:");
puts("1 - Inserir dados da turma de alunos");
puts("2 - Mostrar informacoes dos alunos da turma");
puts("3 - Media de altura dos alunos");
puts("4 - Media de idade da turma");
puts("5 - Listar alunos em ordem decrescente da altura");
puts("6 - Buscar aluno por matricula");
puts("0 - Sair");
scanf(" %d", &op);
// Escolhe a opção do menu conforme solicitado pelo usuário
switch(op) {
case 1:
while(m != 0) {
for(int x = qtd; x < MAX && m != 0; x++) {
puts("Para finalizar a insercao de dados, digite 0 para a matricula");
puts("Informe a matricula:");
scanf(" %i", &m);
if(m != 0) {
turma[x].matricula = m;
puts("Informe o nome:");
scanf(" %s", &turma[x].nome);
puts("Informe a altura (x.xx):");
scanf(" %f", &turma[x].altura);
puts("Informe a data de nascimento (dd/mm/aaaa):");
scanf(" %s", &turma[x].datanasc);
qtd = x+1;
}
}
}
m = 1;
break;
case 2:
if( qtd == 0 )
puts("Nao ha dados para calculo");
else
listagem_alunos(turma, qtd);
break;
case 3:
if( qtd == 0 )
puts("Nao ha dados para calculo");
else
printf("A altura media dos alunos da turma e' de %3.2f m \n\n", media_alturas(turma, qtd));
break;
case 4:
if( qtd == 0 )
puts("Nao ha dados para calculo");
else
printf("A media de idade da turma e' de %4.2f anos\n", media_idades(turma, qtd, data_atual));
break;
case 5:
lista_shell(turma, qtd);
break;
case 6:
if( qtd == 0 )
puts("Nao ha dados para calculo");
else {
puts("Digite a matricula que deseja localizar");
scanf(" %i", &busca);
res = pesquisa_matricula(busca, turma);
if( res > 0 ) {
printf("A matricula %i se encontra na posicao %i do vetor\n", busca, res);
}
else {
puts("A matricula solicitada nao esta cadastrada\n");
}
}
break;
}
}
getch();
}
// Faz a listagem dos alunos, mostrando os seus dados
void listagem_alunos(struct alunos turma[MAX], int qtd) {
printf("Atualmente ha %i alunos cadastrados:\n", qtd);
for(int x = 0; x < qtd && x < MAX; x++) {
printf("Aluno %i: \n - Matricula: %i \n - Nome: %s \n - Altura: %3.2f \n - Data de Nascimento: %s \n\n", x+1, turma[x].matricula, turma[x].nome, turma[x].altura, turma[x].datanasc);
}
}
// Calcula a média das alturas dos alunos, o retorno é de um dado float
float media_alturas(struct alunos turma[MAX], int qtd) {
float media = 0;
for(int x = 0; x < qtd; x++) {
media += turma[x].altura;
}
return media/qtd;
}
// Calcula a idade média dos alunos da turma, retorna float.
// Como falado anteriormente, tentamos diversas vezes implementar as funções da LIB time.h, como time, ctime, mktime, asctime dentre outras, infelizmente sem sucesso
float media_idades(struct alunos turma[MAX], int qtd, char data[]) {
char ano[4], _data[4];
int _ano, soma = 0, res;
for(int x = 0; x < qtd && x < MAX; x++) {
sprintf(ano, "%c%c%c%c", turma[x].datanasc[6], turma[x].datanasc[7], turma[x].datanasc[8], turma[x].datanasc[9]);
_ano = atoi(ano); // atoi transforma uma string em um valor inteiro. Biblioteca stdio
soma += _ano;
}
res = soma/qtd;
sprintf(_data, "%c%c%c%c", data[6], data[7], data[8], data[9]);
return atoi(_data) - res;
}
// Faz a ordenação dos dados através do método Shell
void lista_shell(struct alunos _turma[MAX], int qtd) {
int i, j, gap, k, a[5];
alunos x;
a[0]=9; a[1]=5; a[2]=3; a[3]=2; a[4]=1;
for(k = 0; k < 5; k++) {
gap = a[k];
for(i = gap; i < qtd; ++i) {
x = _turma[i];
for(j = i-gap; x.altura < _turma[j].altura && j >= 0; j = j-gap)
_turma[j+gap] = _turma[j];
_turma[j+gap] = x;
}
}
// Imprime estrutura ordenada
for(int x = 0; x < qtd; x++) {
printf("Aluno %i - %3.2f \n", _turma[x].matricula, _turma[x].altura);
}
}
// Faz a pesquisa da matrícula pelo método de pesquisa binária
int pesquisa_matricula(int busca, struct alunos _turma[MAX]) {
int comeco = 0, meio, fim;
fim = MAX - 1;
int x,y;
alunos aux;
// Para correta busca, é necessário a estrutura estar ordenada.
// Abaixo, método bolha foi utilizado
for(int x = 0; x < MAX-1; x++) {
for(int y = x+1; y < MAX; y++) {
if(_turma[x].matricula > _turma[y].matricula) {
aux = _turma[x];
_turma[x] = _turma[y];
_turma[y] = aux;
}
}
}
// Inicio do processo de busca do valor
while (comeco <= fim) {
meio = (comeco + fim)/2;
if(busca == _turma[meio].matricula) {
return(meio); // Valor encontrado
}
else {
if(busca < _turma[meio].matricula) {
fim = meio-1;
}
else {
comeco = meio + 1;
}
}
}
return(-1); // Caso não foi encontrado a matricula na estrutura, retorna -1
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment