123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266 | #include <iostream>#include <strings.h>#include <locale.h> //Nesta versão eu tento implementar a alocação dinâmica de memóriausing std::cout;using std::cin;using std::string; struct Taluno{ string nome; string matricula; string curso; float notas[3]; }; float calcularMedia(Taluno *a);void cadastrarAluno (Taluno *a);void imprimirAlunos (Taluno *a, int total);float calcMaiorMedia(Taluno a[], int total);void imprimirAlunosMaiorNotaProva1(Taluno a[], int total);void imprimirAlunosMaiorMedia(Taluno *a, int total, float m);void imprimirAlunosCurso(Taluno *a,int total, string c);void preencherListaCursos(Taluno *a, int totalAlunos, string *cursos, int *numCursos);void adicionarAluno(Taluno *a, int *numRegistros);void deletarAluno(Taluno *a, int *numRegistros, int numRec); int main() { setlocale(LC_ALL,""); const int maxAlunos=10; string resposta; cout <<"Você deseja ler os dados do (a)rquivo ex4.txt ou (d)igitá-los?\n"; getline(cin, resposta); if (resposta=="a") freopen("ex4.txt", "r", stdin); //o enunciado fala em *até* 10 alunos. Isso implica que o usuário pode entrar com menos. //Eu também poderia ter definido o vetor com o tamanho máximo e no laço //perguntar ao usuário se ele quer adicionar outro aluno string temp=""; cout << "Quantos alunos? "; getline(cin, temp); int numAlunos=stoi(temp); Taluno *ptrAlunos = new Taluno[numAlunos]; for (int i=0;i<numAlunos;i++){ cout <<"Dados do aluno "<< i+1 <<": \n"; cadastrarAluno(&ptrAlunos[i]); } imprimirAlunos(ptrAlunos, numAlunos); imprimirAlunosMaiorNotaProva1(ptrAlunos, numAlunos); float maiorMedia=calcMaiorMedia(ptrAlunos, numAlunos); imprimirAlunosMaiorMedia(ptrAlunos, numAlunos, maiorMedia); const int maxCursos=10; string cursos[maxCursos]; int numCursos=0; preencherListaCursos(ptrAlunos, numAlunos, cursos, &numCursos ); //imprimo os cursos criando um menu cout <<"\nNúmero de cursos: " << numCursos <<"\n\n"; cout <<"Escolha um curso para imprimir os alunos matriculados no mesmo\n"; cout <<"Digite o número correspondente seguido de [ENTER]\n\n"; for (int i=0; i<numCursos;i++){ cout << i <<" - " << cursos[i] <<'\n'; } getline(cin, resposta); string curso=cursos[stoi(resposta)]; imprimirAlunosCurso(ptrAlunos,numAlunos, curso); //adicionarAluno(ptrAlunos,&numAlunos); delete []ptrAlunos;return 0;} void cadastrarAluno (Taluno *a){ cout <<"Nome: "; getline(cin, a->nome); cout <<"Matrícula: "; getline(cin, a->matricula); cout <<"Curso: "; getline(cin, a->curso); string temp=""; for (int j=0; j<3;j++){ cout <<"Nota " << j+1 << ": "; getline(cin, temp); a->notas[j]=stof(temp); } cout <<'\n';} void imprimirAlunosCurso(Taluno *a,int total, string c){ for (int i=0;i<total;i++){ if (a[i].curso==c){ cout <<"\nNome: " << a[i].nome <<'\n'; cout <<"Matrícula: " << a[i].matricula <<'\n'; cout <<"Curso: " << a[i].curso <<'\n'; float media = calcularMedia(&a[i]); if (media>=6) cout <<"Aluno APROVADO\n"; else cout <<"Aluno REPROVADO\n"; } }} float calcularMedia(Taluno *a){ //O cálculo é feito seguindo as regras da Estácio float menorNota=0; unsigned int indiceMenorNota=0; float notas[3]; for (int j=0; j<3; j++){ if (a->notas[j]<4) notas[j]=0; else notas[j]=a->notas[j]; //se alguma nota for menor que 4 é o mesmo que ser zero if (notas[j]<menorNota) { menorNota=notas[j]; indiceMenorNota=j; } } //Ignoro o menor valor, somo os restantes e divido por dois float k=0; if (indiceMenorNota==0) {k=((notas[1]+notas[2])/2);}; if (indiceMenorNota==1) {k=((notas[0]+notas[2])/2);}; if (indiceMenorNota==2) {k=((notas[0]+notas[1])/2);}; return k;} void imprimirAlunos (Taluno *a, int total){ cout <<"Exibindo agora os dados gravados\n\n"; for (int i=0;i<total;i++){ cout <<"Aluno "<< i+1 <<'\n'; cout <<"Nome: " << a[i].nome <<'\n'; cout <<"Matrícula: " << a[i].matricula <<'\n'; cout <<"Curso: " << a[i].curso <<'\n'; for (int j=0; j<3;j++){ cout <<"Nota " << j+1 <<": " << a[i].notas[j] <<'\n'; } cout <<'\n'; } } float calcMaiorMedia(Taluno a[], int total){ float media=0; float soma=0; float maiorMedia=0; for (int i=0;i<total;i++){ float media=calcularMedia(&a[i]); if (media>maiorMedia) maiorMedia=media; soma=0; } return maiorMedia;} void imprimirAlunosMaiorNotaProva1(Taluno *a, int total){ //Determino qual a maior nota da primeira prova float nota=0; float maiorNota=0; for (int i=0;i<total;i++){ nota=a[i].notas[0]; if (nota>maiorNota) maiorNota=nota; } cout <<"\nA maior nota na primeira prova foi: " << maiorNota <<'\n'; cout <<"Alunos que alcançaram essa nota:\n\n"; //imprimo os alunos que tiraram essa nota for (int i=0;i<total;i++){ if (a[i].notas[0]==maiorNota){ cout <<"Nome: " << a[i].nome <<'\n'; cout <<"Matrícula: " << a[i].matricula <<'\n'; cout <<"Curso: " << a[i].curso <<'\n'; cout <<'\n'; } }} void imprimirAlunosMaiorMedia(Taluno *a, int total, float m){ //imprimo os alunos que tiraram a maior média cout <<"\nA maior média foi: " << m <<'\n'; cout <<"Alunos que alcançaram essa média:\n\n"; //Eu preciso calcular novamente a média de cada aluno para comparar com a maior média for (int i=0;i<total;i++){ float media=calcularMedia(&a[i]); if (media==m){ cout <<"Nome: " << a[i].nome <<'\n'; cout <<"Matrícula: " << a[i].matricula <<'\n'; cout <<"Curso: " << a[i].curso <<'\n'; cout <<'\n'; } } } void preencherListaCursos(Taluno *a, int totalAlunos, string *cursos, int *numCursos){ bool found=false; string curso=""; for (int i=0;i<totalAlunos;i++){ curso=a[i].curso; for (int j=0; j<*numCursos ;j++) { if (curso==cursos[j]) { found=true; break; } //eu preciso ignorar os cursos repetidos } if (!found) { cursos[*numCursos]=curso; *numCursos=*numCursos+1; } found=false;}} void adicionarAluno(Taluno *a, int *numRegistros){ //Aumenta o tamanho do vetor em um elemento e preenche esse elemento Taluno *temp = new Taluno[*numRegistros+1]; std::copy(a,a+*numRegistros,temp); delete a; a=temp; cadastrarAluno(&a[*numRegistros]); //Agora que o vetor tem um elemento extra, numRec aponta para ele *numRegistros=*numRegistros+1; imprimirAlunos(a, *numRegistros);} void deletarAluno(Taluno *a, int *numRegistros, int numRec){ //crio um novo vetor com um elemento a menos e copio do vetor antigo //todos os elemmentos anteriores e posteriores ao registro a ser apagado Taluno *temp = new Taluno[*numRegistros-1]; std::copy(a,a+numRec-1,temp); std::copy(a+numRec,a+*numRegistros,temp+numRec-1); delete a; a=temp; *numRegistros=*numRegistros-1; imprimirAlunos(a, *numRegistros);} |