Baixe o app para aproveitar ainda mais
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
Compartilhar