Created
February 12, 2011 19:58
-
-
Save andersonfraga/824063 to your computer and use it in GitHub Desktop.
Trabalho de Algoritmos na Faculdade, remotos 2008... :s
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
/*! | |
* 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