Buscar

Lista encadeada

Esta é uma pré-visualização de arquivo. Entre para ver o arquivo original

alunos.c
#include "alunos.h"
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
/* Funções referentes a lista*/
// função que inicializa a lista e atribui a capacidade
void inicializar(lista_alunos *l, int tamanho){
 l->ini = -1;
	l->fim = -1;
	l->cap = tamanho;
	l->dados = (aluno *) malloc(tamanho * sizeof(aluno));
}
// função que retorna o tamanho atual da lista ou 0 caso esteja vazia
int tamanho(lista_alunos l){
 if (l.ini == -1 || l.fim == -1) //lista vazia, tamanho 0
		return 0;
	return l.fim - l.ini + 1;
}
// função que insere na lista um elemento novo
int inserir(lista_alunos *l, aluno novo){
 if (l->cap - 1 == l->fim)
 return 0; //lista cheia
 if (l->ini == -1){ //lista previamente vazia, inicializar início e fim
 l->ini = 0;
 l->fim = 0;
 }
 else{
 l->fim++;
 }
 l->dados[l->fim] = novo;
 return 1;
}
// função que insere na lista um elemento novo em uma certa posição
int __inserir(lista_alunos *l, aluno novo, int pos){
 int i;
 if (l->cap == sizeof(*l)) return 0; //lista cheia
 if (pos > sizeof(*l) || pos < 0) return 0; //posição inválida
 if (l->ini == -1){ //lista previamente vazia, inicializar início e fim
 l->ini = 0;
 l->fim = 0;
 }
 else if (l->fim < l->cap - 1){ //tem espaço no final
 for (i = l->fim; i >= l->ini + pos; i--)
 	l->dados[i+1] = l->dados[i];
 	l->fim++;
 }
 else{ //tem espaço no começo
 for (i = l->ini; i < l->ini + pos; i++)
 l->dados[i-1] = l->dados[i];
 	l->ini--;
 }
 l->dados[l->ini + pos] = novo;
 return 1;
}
// função que verifica se existe um aluno com a matricula informada
aluno* buscar(lista_alunos l, int matricula){
 int i;
 for(i = l.ini; i <= l.fim; i++){
 if(l.dados[i].matricula == matricula)
 return &l.dados[i];
 }
	return NULL;
}
// função que destroi a lista
void destruir(lista_alunos *l){
 l->ini = -1;
	l->fim = -1;
	l->cap = 0;
	free(l->dados);
	l->dados = NULL;
}
/* Demais funções*/
// função que lê do arquivo e retorna os dados de um aluno
aluno le_dados(FILE* arq){
 aluno alunos;
 fscanf(arq, "%s", alunos.nome);
	fscanf(arq, "%d", &alunos.matricula);
	fscanf(arq, "%d", &alunos.frequencia);
	fscanf(arq, "%f", &alunos.notaP1);
	fscanf(arq, "%f", &alunos.notaP2);
	fscanf(arq, "%f", &alunos.trabalho);
	fscanf(arq, "%f", &alunos.participacao);
	return alunos;
}
// função que imprime o menu na tela
int menu(){
 int opcao;
 printf("\n\nMENU\n");
 printf("1- Exibir um estudante\n");
 printf("2- Editar frequencia ou notas de um estudante\n");
 printf("3- Gerar relatorio final\n");
 printf("0- Sair\n");
 printf("Opcao: ");
 scanf("%d", &opcao);
 return opcao;
}
// função que exibe os dados do aluno procurado
void exibe_estudante(aluno *alunos){
 printf("\nNome: %s\n", alunos->nome);
 printf("Matricula: %d\n", alunos->matricula);
 printf("Frequencia: %d\n", alunos->frequencia);
 printf("Nota P1: %.1f\n", alunos->notaP1);
 printf("Nota P2: %.1f\n", alunos->notaP2);
 printf("Nota trabalho: %.1f\n", alunos->trabalho);
 printf("Nota participacao: %.1f\n", alunos->participacao);
}
// função para editar a frequencia e as notas do aluno procurado
void edita_estudante(aluno *alunos){
 printf("\nNova frequencia: ");
 scanf("%d", &alunos->frequencia);
 printf("Nova nota P1: ");
 scanf("%f", &alunos->notaP1);
 printf("Nova nota P2: ");
 scanf("%f", &alunos->notaP2);
 printf("Nova nota trabalho: ");
 scanf("%f", &alunos->trabalho);
 printf("Nova nota participacao: ");
 scanf("%f", &alunos->participacao);
}
// função que calcula as notas finais e conceitos de cada aluno, além de ordenar os alunos pela nota final
void calcula_dados(lista_alunos *l, int aulas){
 aluno aux;
 int i, j;
	// laço para o calculo da nota final e conceito dos alunos
	for(i = l->ini; i <= l->fim; i++){
 l->dados[i].notaFinal = 0.3 * l->dados[i].notaP1 + 0.4 * l->dados[i].notaP2 + 0.2 * l->dados[i].trabalho + 0.1 * l->dados[i].participacao;
 if (l->dados[i].frequencia < aulas * 0.75)
			strcpy(l->dados[i].conceito, "FF"); /* copia e cola: strcpy(destino, origem); */
		else if(l->dados[i].notaFinal >= 9)
			strcpy(l->dados[i].conceito, "A");
		else if(l->dados[i].notaFinal >= 7.5)
			strcpy(l->dados[i].conceito, "B");
		else if(l->dados[i].notaFinal >= 6)
			strcpy(l->dados[i].conceito, "C");
		else
			strcpy(l->dados[i].conceito, "D");
 // laço para ordenar os alunos
 for(j = l->ini; j <= i; j++){
 if(l->dados[i].notaFinal > l->dados[j].notaFinal){
 aux = l->dados[i];
 l->dados[i] = l->dados[j];
 l->dados[j] = aux;
 }
 }
	}
}
// função que cria um arquivo e escreve os dados de cada aluno e as médias
void escreve_dados(lista_alunos l){
 int i;
 float media_frequencia = 0, media_notaP1 = 0, media_notaP2 = 0, media_trabalho = 0, media_participacao = 0, media_notaFinal = 0;
 FILE *saida;
 saida = fopen("resultados.txt", "w"); /* Abre arquivo para escrita. Caso não exista, ele cria um.*/
 //checa se arquivo foi criado
 if(saida == NULL){
 printf("\nErro! Arquivo não pode ser criado.");
 }
 else{
 //prepara colunas
 fprintf(saida, "Nome \tMatrícula \tFrequência \tNota P1 \tNota P2 \tTrabalho \tParticipação \tNota Final \tConceito Final\n");
 //salva dados dos alunos
 for(i = l.ini; i <= l.fim; i++) {
 fprintf(saida, "%s \t", l.dados[i].nome);
 fprintf(saida, "%d \t", l.dados[i].matricula);
 fprintf(saida, "%d \t", l.dados[i].frequencia);
 fprintf(saida, "%.1f \t", l.dados[i].notaP1);
 fprintf(saida, "%.1f \t", l.dados[i].notaP2);
 fprintf(saida, "%.1f \t", l.dados[i].trabalho);
 fprintf(saida, "%.1f \t", l.dados[i].participacao);
 fprintf(saida, "%.1f \t", l.dados[i].notaFinal);
 fprintf(saida, "%s \t", l.dados[i].conceito);
 fprintf(saida, "\n");
 }
 //laço para o calculo das médias
 for(i = l.ini; i <= l.fim; i++){
 media_frequencia += (float)l.dados[i].frequencia/l.cap;
 media_notaP1 += l.dados[i].notaP1/l.cap;
 media_notaP2 += l.dados[i].notaP2/l.cap;
 media_trabalho += l.dados[i].trabalho/l.cap;
 media_participacao += l.dados[i].participacao/l.cap;
 media_notaFinal += l.dados[i].notaFinal/l.cap;
 }
 fprintf(saida, "\nMédias:\t\t%.2f\t%.2f\t%.2f\t%.2f\t%.2f\t%.2f\n", media_frequencia, media_notaP1, media_notaP2, media_trabalho, media_participacao, media_notaFinal);
 }
	fclose(saida);
}
alunos.h
#ifndef BIB_H_
#define BIB_H_
#include <stdio.h>
// estrutura utilizada
typedef struct{
	char nome[141];
	int matricula;
	int frequencia;
	float notaP1;
	float notaP2;
	float trabalho;
	float participacao;
	float notaFinal;
	char conceito[3];
}aluno;
// estrutura da lista de alunos
typedef struct{
 int ini;
	int fim;
	int cap;
	aluno *dados;
}lista_alunos;
// protótipo das funções referentes a lista
void inicializar(lista_alunos *l, int capacidade);
int tamanho(lista_alunos l);
int inserir(lista_alunos *l, aluno novo);
int __inserir(lista_alunos *l, aluno novo, int pos);
aluno* buscar(lista_alunos l, int matricula);
void destruir(lista_alunos *l);
// protótipo das demais funções
aluno le_dados(FILE *arq);
int menu();
void exibe_estudante(aluno *alunos);
void edita_estudante(aluno *alunos);
void calcula_dados(lista_alunos *l, int aulas);
void escreve_dados(lista_alunos l);
#endif
bin/Debug/Tarefa 3.exe
estudantes_validacao.txt
50
Michael_Mccauley 645839 26 6 8 7 8
Carey_Chase 414184 23 6 2 3 4
Kathleen_Barcenas 861484 27 7 0 0 1
William_Owens 776218 18 5 0 1 6
Francisco_Western 153919 26 9 8 5 2
Laura_Megown 188762 17 5 10 3 9
Kevin_Stewart 189743 16 2 9 5 3
Verlie_Davis 258223 19 6 8 5 3
Janet_Worley 529379 25 7 3 9 6
Leo_Henderson 284597 25 0 1 10 4
Carina_Callender 955816 20 10 8 8 8
Lisa_Robeson 237218 20 6 0 10 10
Heather_Harris 467177 29 9 9 0 1
David_Childs 975876 22 7 1 10 8
Kelly_Runk 421734 23 3 8 0 5
George_Franco 136311 26 10 1 3 2
Jane_Elias 399759 19 4 6 1 9
Percy_Willy 719522 30 0 1 5 7
Grace_Schmitz 479799 18 10 1 3 2
Nancy_Martinez 345822 19 3 10 6 9
Rachelle_Shepherd 866384 25 10 6 8 4
Dorothy_Maynard 917314 24 4 6 10 3
Albert_Hausauer 423136 18 1 9 6 10
Chad_Crutcher 236756 28 10 4 6 2
Virginia_Freeman 263427 15 4 1 0 2
James_Brookshire 369728 29 1 4 8 5
Scotty_Chan 243321 27 10 7 4 7
Marion_Balistreri 746751 26 7 5 0 2
Shane_Harris 938396 23 10 1 1 3
Aaron_Howard 944254 29 6 4 10 0
Andrew_Jones 871896 18 0 7 0 6
Josephine_Baker 473848 17 10 8 10 2
Catherine_Thomas 396752 29 8 8 8 10
Michael_Brown 336548 21 5 10 9 2
Erin_Thomas 341515 16 5 3 10 1
Courtney_Wilson 383675 15 10 1 1 5
Wallace_Barber 176536 20 10 9 6 5
Clint_Mcbride 718484 19 8 0 10 10
Vernice_Smith 411568 26 4 10 2 8
Chris_Briggs 927121 16 8 3 5 5
Merna_Mcglinchey 522359 23 4 0 7 0
Florida_Davis 238497 30 3 6 8 2
Avis_Smith 279521 24 7 5 2 2
Caroline_Jiang 143824 20 4 8 7 1
John_Rybij 689514 22 8 3 3 10
Michael_Mcfee 511328 27 10 3 0 0
Elsa_Crespo 656653 18 2 0 7 8
Joseph_Comee 197895 28 5 5 7 7
Marjorie_Moya 234531 26 3 6 9 1
David_Juarez 692987 16 8 1 8 5
main.c
//Tarefa 4 (possível solução)
#include <stdio.h>
#include <stdlib.h>
#include "alunos.h"
int main(){
	aluno *alunoProcurado;
	lista_alunos lista;
	int i, tamanho, opcao, matricula, aulas;
	FILE *arq;
	arq = fopen("estudantes_validacao.txt", "r"); /* O arquivo teve que ser criado aqui, pois é preciso saber a quantidade de alunos para poder inicializar a variável alunos!!!*/
	fscanf(arq, "%d", &tamanho);
	inicializar(&lista, tamanho);
	// laço para inserir os alunos na lista
	for(i = 0; i < tamanho; i++){
 if(!inserir(&lista, le_dados(arq))){
 printf("\nLista cheia!!");
		}
	}
	fclose(arq);
	do{
 opcao = menu(); /* A função menu retorna a opção escolhida.*/
 switch(opcao){
 case 1: // caso a opção for igual a 1
 printf("\nInforme a matricula do aluno: ");
 scanf("%d", &matricula);
 alunoProcurado = buscar(lista, matricula); /* Caso encontre um aluno, a função retorna os dados do aluno.*/
 if(alunoProcurado != NULL)
 exibe_estudante(alunoProcurado);
 else
 printf("\nNao ha estudante com o numero de matricula pesquisado.\n");
 break;
 case 2: // caso a opção for igual a 2
 printf("\nInforme a matricula do aluno: ");
 scanf("%d", &matricula);
 alunoProcurado = buscar(lista, matricula); /* Caso encontre um aluno, a função retorna os dados do aluno.*/
 if(alunoProcurado != NULL){
 exibe_estudante(alunoProcurado);
 edita_estudante(alunoProcurado);
 }
 else
 printf("\nNao ha estudante com o numero de matricula pesquisado.\n");
 break;
 case 3: // caso a opção for igual a 3
 printf("\nInforme quantas aulas houve no semestre: ");
 scanf("%d", &aulas);
 calcula_dados(&lista, aulas);
 escreve_dados(lista);
 printf("\nAlunos com a maior pontuacao:");
 for(i = lista.ini; i < lista.ini + 3; i++)
 printf("\n%s: %.1f", lista.dados[i].nome, lista.dados[i].notaFinal);
 printf("\n\nAlunos com a menor pontuacao:");
 for(i = lista.fim; i > lista.fim - 3; i--)
 printf("\n%s: %.1f", lista.dados[i].nome, lista.dados[i].notaFinal);
 break;
 case 0: // caso a opção for igual a 0
 destruir(&lista);
 printf("\nTchau!");
 break;
 default: // equivalente ao else
 printf("\nOpcao invalida! Tente novamente.\n");
 }
	}while(opcao != 0);
 return 0;
}
obj/Debug/alunos.o
obj/Debug/main.o
Tarefa 4.cbp
 
	 
	 
		 
		 
		 
		 
			 
				 
				 
				 
				 
				 
					 
				
			
			 
				 
				 
				 
				 
				 
					 
				
				 
					 
				
			
		
		 
			 
		
		 
			 
		
		 
		 
			 
		
		 
			 
			 
			 
			 
		
	
Tarefa 4.depend
# depslib dependency file v1.0
1506926631 source:c:\users\maria flávia\downloads\tarefa 4\alunos.c
	"alunos.h"
	<stdio.h>
	<string.h>
	<stdlib.h>
1506925998 c:\users\maria flávia\downloads\tarefa 4\alunos.h
	<stdio.h>
1506926631 source:c:\users\maria flávia\downloads\tarefa 4\main.c
	<stdio.h>
	<stdlib.h>
	"alunos.h"
Tarefa 4.layout

Teste o Premium para desbloquear

Aproveite todos os benefícios por 3 dias sem pagar! 😉
Já tem cadastro?

Outros materiais