Refazer os exercícios 2, 3, 4 e 5 da lista utilizando funções (onde for necessário) e alocando todos os vetores e structs de forma
dinâmica permitindo ao usuário escolher quantos dados ele gostaria inserir. OBS: Crie funções para adicionar e remover um dado.
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106 | #include <iostream>#include <string.h>#include <locale.h> //necessário para usar setlocale#include <sstream> //usado para validar números //Nesta primeira versão eu apenas encapsulo o código em funções, sem usar ponteiros ainda using namespace std; struct Tendereco{ string logradouro; unsigned int numero; string complemento; string cep; string bairro; string cidade; string uf;}; struct Tpessoa { string nome; unsigned int idade; Tendereco endereco; }; Tpessoa cadastrarPessoa(Tpessoa pessoa);void imprimirPessoa (Tpessoa pessoa);int receberValor(string texto); int main(){ setlocale(LC_ALL,""); //me permite usar acentuação Tpessoa pessoa; pessoa=cadastrarPessoa(pessoa); imprimirPessoa(pessoa); return 0;} int receberValor(string texto){ string temp=""; int num=0; while (true){ cout << texto; getline(cin, temp); stringstream myStream(temp); if (myStream >>num) break; //sucesso na conversão else cout << "\nNúmero inválido. Tente de novo." << '\n'; }; return num;} void imprimirPessoa (Tpessoa pessoa){ cout <<"\nMostrando os dados gravados: \n\n"; cout <<"Nome: " << pessoa.nome << '\n'; cout <<"Idade: " << pessoa.idade << '\n'; cout <<"Logradouro: " << pessoa.endereco.logradouro << '\n'; cout <<"Numero: " << pessoa.endereco.numero << '\n'; cout <<"Complemento: " << pessoa.endereco.complemento << '\n'; cout <<"Bairro: " << pessoa.endereco.bairro << '\n'; cout <<"Cidade: " << pessoa.endereco.cidade << '\n'; cout <<"UF: " << pessoa.endereco.uf << '\n'; cout <<"CEP: " << pessoa.endereco.cep << '\n';} Tpessoa cadastrarPessoa(Tpessoa pessoa){ /* Como eu sou "dedógrafo" e a partir deste exercício o volume de dados de entrada vai crescendo eu achei melhor automatizar o processo para não me frustrar tendo que digitar os mesmos dados voláteis de novo, de novo e de novo... */ string resposta=""; cout <<"Você deseja ler os dados do (a)rquivo ex2.txt ou (d)igitá-los?\n"; getline(cin,resposta); //usar cin aqui faz saltar a entrada de NOME adiante if (resposta=="a") freopen("ex2.txt", "r", stdin); //não me importa nenhuma outra resposta string temp=""; if (resposta!="a") cout <<"Nome: "; getline(cin, pessoa.nome); pessoa.idade=receberValor("Idade: "); if (resposta!="a") cout <<"Logradouro: "; getline(cin, pessoa.endereco.logradouro); pessoa.endereco.numero=receberValor("Número: "); if (resposta!="a") cout <<"Complemento: "; getline(cin, pessoa.endereco.complemento); if (resposta!="a") cout <<"Bairro: "; getline(cin, pessoa.endereco.bairro); if (resposta!="a") cout <<"Cidade: "; getline(cin, pessoa.endereco.cidade); if (resposta!="a") cout <<"UF: "; getline(cin, pessoa.endereco.uf); if (resposta!="a") cout <<"CEP: "; getline(cin, pessoa.endereco.cep); return pessoa;} |
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105 | #include <iostream>#include <string.h>#include <locale.h> //necessário para usar setlocale#include <sstream> //usado para validar números //Nesta versão eu uso ponteiros, mas ainda não faço alocação dinâmica de memória using namespace std; struct Tendereco{ string logradouro; unsigned int numero; string complemento; string cep; string bairro; string cidade; string uf;}; struct Tpessoa { string nome; unsigned int idade; Tendereco endereco; }; void cadastrarPessoa(Tpessoa *pessoa);void imprimirPessoa (Tpessoa *pessoa);int receberValor(string texto); int main(){ setlocale(LC_ALL,""); //me permite usar acentuação Tpessoa pessoa; cadastrarPessoa(&pessoa); imprimirPessoa(&pessoa); return 0;} int receberValor(string texto){ string temp=""; int num=0; while (true){ cout << texto; getline(cin, temp); stringstream myStream(temp); if (myStream >>num) break; //sucesso na conversão else cout << "\nNúmero inválido. Tente de novo." << '\n'; }; return num;} void imprimirPessoa (Tpessoa *pessoa){ cout <<"\nMostrando os dados gravados: \n\n"; cout <<"Nome: " << pessoa->nome << '\n'; cout <<"Idade: " << pessoa->idade << '\n'; cout <<"Logradouro: " << pessoa->endereco.logradouro << '\n'; cout <<"Numero: " << pessoa->endereco.numero << '\n'; cout <<"Complemento: " << pessoa->endereco.complemento << '\n'; cout <<"Bairro: " << pessoa->endereco.bairro << '\n'; cout <<"Cidade: " << pessoa->endereco.cidade << '\n'; cout <<"UF: " << pessoa->endereco.uf << '\n'; cout <<"CEP: " << pessoa->endereco.cep << '\n';} void cadastrarPessoa(Tpessoa *pessoa){ /* Como eu sou "dedógrafo" e a partir deste exercício o volume de dados de entrada vai crescendo eu achei melhor automatizar o processo para não me frustrar tendo que digitar os mesmos dados voláteis de novo, de novo e de novo... */ string resposta=""; cout <<"Você deseja ler os dados do (a)rquivo ex2.txt ou (d)igitá-los?\n"; getline(cin,resposta); //usar cin aqui faz saltar a entrada de NOME adiante if (resposta=="a") freopen("ex2.txt", "r", stdin); //não me importa nenhuma outra resposta string temp=""; if (resposta!="a") cout <<"Nome: "; getline(cin, pessoa->nome); pessoa->idade=receberValor("Idade: "); if (resposta!="a") cout <<"Logradouro: "; getline(cin, pessoa->endereco.logradouro); pessoa->endereco.numero=receberValor("Número: "); if (resposta!="a") cout <<"Complemento: "; getline(cin, pessoa->endereco.complemento); if (resposta!="a") cout <<"Bairro: "; getline(cin, pessoa->endereco.bairro); if (resposta!="a") cout <<"Cidade: "; getline(cin, pessoa->endereco.cidade); if (resposta!="a") cout <<"UF: "; getline(cin, pessoa->endereco.uf); if (resposta!="a") cout <<"CEP: "; getline(cin, pessoa->endereco.cep); } |
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137 | #include <iostream>#include <string.h>#include <locale.h> //necessário para usar setlocale#include <sstream> //usado para validar números //Nesta versão eu uso ponteiros com alocação dinâmica de memória using namespace std; struct Tendereco{ string logradouro; unsigned int numero; string complemento; string cep; string bairro; string cidade; string uf;}; struct Tpessoa { string nome; unsigned int idade; Tendereco endereco; }; void adicionarPessoa(Tpessoa *p, int *numRegistros);void deletarPessoa(Tpessoa *p, int *numRegistros, int numRec);void cadastrarPessoa(Tpessoa *pessoa);void imprimirPessoas (Tpessoa *pessoa, int total);int receberValor(string texto); int main(){ setlocale(LC_ALL,""); //me permite usar acentuação Tpessoa *ptrPessoas=new Tpessoa[1]; cadastrarPessoa(ptrPessoas); int numPessoas=1; imprimirPessoas(ptrPessoas, numPessoas); adicionarPessoa (ptrPessoas, &numPessoas); //imprimirPessoas(ptrPessoas, numPessoas); adicionarPessoa (ptrPessoas, &numPessoas); //imprimirPessoas(ptrPessoas, numPessoas); cout << "\nDeletando o segundo registro: " << '\n'; deletarPessoa (ptrPessoas, &numPessoas, 1); return 0;} int receberValor(string texto){ string temp=""; int num=0; while (true){ cout << texto; getline(cin, temp); stringstream myStream(temp); if (myStream >>num) break; //sucesso na conversão else cout << "\nNúmero inválido. Tente de novo." << '\n'; }; return num;} void imprimirPessoas (Tpessoa *pessoa, int total){ cout <<"\nMostrando os dados gravados: \n\n"; for (int i=0; i<total; i++){ cout <<"Nome: " << pessoa[i].nome << '\n'; cout <<"Idade: " << pessoa[i].idade << '\n'; cout <<"Logradouro: " << pessoa[i].endereco.logradouro << '\n'; cout <<"Numero: " << pessoa[i].endereco.numero << '\n'; cout <<"Complemento: " << pessoa[i].endereco.complemento << '\n'; cout <<"Bairro: " << pessoa[i].endereco.bairro << '\n'; cout <<"Cidade: " << pessoa[i].endereco.cidade << '\n'; cout <<"UF: " << pessoa[i].endereco.uf << '\n'; cout <<"CEP: " << pessoa[i].endereco.cep << '\n'; }} void cadastrarPessoa(Tpessoa *pessoa){ cout <<"\nNome: "; getline(cin, pessoa->nome); pessoa->idade=receberValor("Idade: "); cout <<"Logradouro: "; getline(cin, pessoa->endereco.logradouro); pessoa->endereco.numero=receberValor("Número: "); cout <<"Complemento: "; getline(cin, pessoa->endereco.complemento); cout <<"Bairro: "; getline(cin, pessoa->endereco.bairro); cout <<"Cidade: "; getline(cin, pessoa->endereco.cidade); cout <<"UF: "; getline(cin, pessoa->endereco.uf); cout <<"CEP: "; getline(cin, pessoa->endereco.cep); } void adicionarPessoa(Tpessoa *p, int *numRegistros){ //Aumenta o tamanho do vetor em um elemento e preenche esse elemento Tpessoa *temp = new Tpessoa[*numRegistros+1]; std::copy(p,p+*numRegistros,temp); delete p; p=temp; cadastrarPessoa(&p[*numRegistros]); //Agora que o vetor tem um elemento extra, numRec aponta para ele *numRegistros=*numRegistros+1; imprimirPessoas(p, *numRegistros);} void deletarPessoa(Tpessoa *p, 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 Tpessoa *temp = new Tpessoa[*numRegistros-1]; std::copy(p,p+numRec-1,temp); std::copy(p+numRec,p+*numRegistros,temp+numRec-1); delete p; p=temp; *numRegistros=*numRegistros-1; imprimirPessoas(p, *numRegistros);} |
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768 | #include <iostream>#include <strings.h>#include <locale.h> //Nesta versão eu aapenas faço a modularização using namespace std; struct Taluno{ string nome; string matricula; string curso; }; void imprimirAlunos (Taluno a[],int numRec);Taluno cadastrarAluno (); int main (){ setlocale(LC_ALL,""); string resposta; cout <<"Você deseja ler os dados do (a)rquivo ex3.txt ou (d)igitá-los? "<<'\n'; getline(cin, resposta); if (resposta=="a") freopen("ex3.txt", "r", stdin); Taluno alunos[5]; for (int i=0;i<5;i++){ cout <<"Dados do aluno "<< i+1 <<": \n"; alunos[i]=cadastrarAluno(); }; imprimirAlunos(alunos, 5); return 0; } void imprimirAlunos (Taluno a[],int numRec){ cout <<"Exibindo agora os dados gravados\n\n"; for (int i=0;i<numRec;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'; cout <<'\n'; }; } Taluno cadastrarAluno (){ Taluno a; cout <<"Nome: "; getline(cin, a.nome); cout <<"Matrícula: "; getline(cin, a.matricula); cout <<"Curso: "; getline(cin, a.curso); cout <<'\n'; return a;} |
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465 | #include <iostream>#include <strings.h>#include <locale.h> //Nesta versão eu começo a implementar os ponteiros, mas sem alocação dinâmica using namespace std; struct Taluno{ string nome; string matricula; string curso; }; void imprimirAlunos (Taluno *a,int numRec);void cadastrarAluno (Taluno *a); int main (){ setlocale(LC_ALL,""); string resposta; cout <<"Você deseja ler os dados do (a)rquivo ex3.txt ou (d)igitá-los? "<<'\n'; getline(cin, resposta); if (resposta=="a") freopen("ex3.txt", "r", stdin); Taluno alunos[5]; for (int i=0;i<5;i++){ cout <<"Dados do aluno "<< i+1 <<": \n"; cadastrarAluno(&alunos[i]); }; imprimirAlunos(alunos, 5); return 0; } void imprimirAlunos (Taluno *a,int numRec){ cout <<"Exibindo agora os dados gravados\n\n"; for (int i=0;i<numRec;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'; cout <<'\n'; }; } void cadastrarAluno (Taluno *a){ cout <<"Nome: "; getline(cin, a->nome); cout <<"Matrícula: "; getline(cin, a->matricula); cout <<"Curso: "; getline(cin, a->curso); cout <<'\n'; } |
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102 | #include <iostream>#include <strings.h>#include <locale.h>#include <algorithm> //Nesta versão implementei funções para inserir e remover dados usando alocação dinâmica using std::cout;using std::cin;using std::string; struct Taluno{ string nome; string matricula; string curso; }; void imprimirAlunos (Taluno *a,int numRec);void cadastrarAluno (Taluno *a);void adicionarAluno(Taluno *a, int *numRec);void deletarAluno(Taluno *a, int *numRegistros, int numRec); int main (){ setlocale(LC_ALL,""); const int qtdeInicial=4; string resposta; cout <<"Você deseja ler os dados do (a)rquivo ex3.txt ou (d)igitá-los? "<<'\n'; getline(cin, resposta); if (resposta=="a") freopen("ex3.txt", "r", stdin); Taluno *ptrAlunos = new Taluno[qtdeInicial]; for (int i=0;i<qtdeInicial;i++){ cout <<"Dados do aluno "<< i+1 <<": \n"; cadastrarAluno(&ptrAlunos[i]); }; int numRegistros=qtdeInicial; imprimirAlunos(ptrAlunos, numRegistros); adicionarAluno(ptrAlunos,&numRegistros); //deletarAluno(ptr,&numRegistros, 3); delete []ptrAlunos; return 0; } void imprimirAlunos (Taluno *a,int numRec){ cout <<"Exibindo agora os dados gravados\n\n"; for (int i=0;i<numRec;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'; cout <<'\n'; }; } void cadastrarAluno (Taluno *a){ cout <<"Nome: "; getline(cin, a->nome); cout <<"Matrícula: "; getline(cin, a->matricula); cout <<"Curso: "; getline(cin, a->curso); cout <<'\n'; } 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);} |
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245 | #include <iostream>#include <strings.h>#include <locale.h> //Nesta versão eu apenas faço a modularização do código, sem usar ponteiros using std::cout;using std::cin;using std::string; struct Taluno{ string nome; string matricula; string curso; float notas[3]; }; //Para criar a função que lista os cursos sem usr ponteiros a//única saída que encontrei foi usar alguns identificadores globaisconst int maxCursos=10;string cursos[maxCursos];unsigned int numCursos=0; //não precisava ser global float calcularMedia(Taluno a);Taluno cadastrarAluno();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 total); int main() { setlocale(LC_ALL,""); const int maxAlunos=10; Taluno alunos[maxAlunos]; 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); unsigned int numAlunos=stoi(temp); for (int i=0;i<numAlunos;i++){ cout <<"Dados do aluno "<< i+1 <<": \n"; alunos[i]=cadastrarAluno(); } imprimirAlunos(alunos, numAlunos); imprimirAlunosMaiorNotaProva1(alunos, numAlunos); float maiorMedia=calcMaiorMedia(alunos, numAlunos); imprimirAlunosMaiorMedia(alunos, numAlunos, maiorMedia); preencherListaCursos(alunos, numAlunos); //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(alunos,numAlunos, curso); return 0;} Taluno 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'; return a; } 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){ 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){ //Determino a maior média //neste ponto não estou usando as regras da Estácio, porque não foi pedido no enunciado float media=0; float soma=0; float maiorMedia=0; for (int i=0;i<total;i++){ for (int j=0; j<3;j++){ soma=soma+a[i].notas[j]; } media=soma/3; 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 a maior nota na primeira prova 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 soma=0; for (int j=0; j<3;j++){ soma=soma+a[i].notas[j]; } float media=soma/3; 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 total){ bool found=false; string curso=""; for (int i=0;i<total;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++; } found=false;}} |
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240 | #include <iostream>#include <strings.h>#include <locale.h> //Nesta versão eu apenas faço a modularização do código, sem usar ponteiros//E agrupo os cálculos de média, que na versão anterior eram feitos em três pontos do código e em dois deles sem usar as regras da Estácio using std::cout;using std::cin;using std::string; struct Taluno{ string nome; string matricula; string curso; float notas[3]; }; //Para criar a função que lista os cursos sem usr ponteiros a//única saída que encontrei foi usar alguns identificadores globaisconst int maxCursos=10;string cursos[maxCursos];unsigned int numCursos=0; //não precisava ser global float calcularMedia(Taluno a);Taluno cadastrarAluno();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 total); int main() { setlocale(LC_ALL,""); const int maxAlunos=10; Taluno alunos[maxAlunos]; 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); unsigned int numAlunos=stoi(temp); for (int i=0;i<numAlunos;i++){ cout <<"Dados do aluno "<< i+1 <<": \n"; alunos[i]=cadastrarAluno(); } imprimirAlunos(alunos, numAlunos); imprimirAlunosMaiorNotaProva1(alunos, numAlunos); float maiorMedia=calcMaiorMedia(alunos, numAlunos); imprimirAlunosMaiorMedia(alunos, numAlunos, maiorMedia); preencherListaCursos(alunos, numAlunos); //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(alunos,numAlunos, curso); return 0;} Taluno 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'; return a; } 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 total){ bool found=false; string curso=""; for (int i=0;i<total;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++; } found=false;}} |
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235 | #include <iostream>#include <strings.h>#include <locale.h> //Esta é a primeira versão com ponteiros. Nesta eu ainda não faço alocação dinâmica (new e delete). using 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); int main() { setlocale(LC_ALL,""); const int maxAlunos=10; Taluno alunos[maxAlunos]; 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); unsigned int numAlunos=stoi(temp); for (int i=0;i<numAlunos;i++){ cout <<"Dados do aluno "<< i+1 <<": \n"; cadastrarAluno(&alunos[i]); } imprimirAlunos(alunos, numAlunos); imprimirAlunosMaiorNotaProva1(alunos, numAlunos); float maiorMedia=calcMaiorMedia(alunos, numAlunos); imprimirAlunosMaiorMedia(alunos, numAlunos, maiorMedia); const int maxCursos=10; string cursos[maxCursos]; int numCursos=0; preencherListaCursos(alunos, 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(alunos,numAlunos, curso); 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;}} |
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);} |
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131 | #include <iostream>#include <strings.h>#include <locale.h>#include <stdlib.h> using namespace std; //Nesta versão eu apenas modularizei o código. Não uso ponteiros ainda. struct Tdata { unsigned int dia; unsigned int mes; unsigned int ano;}; struct Tpessoa{ string nome; unsigned int altura; // em centímetros Tdata dataNasc; }; int numPessoas=0; Tpessoa cadastrarPessoa();void listarNomesAlturas(Tpessoa p[], int total);Tdata lerData();void listarPessoasData (Tpessoa p[], int total); int main() { const unsigned int maxPessoas=15; Tpessoa pessoas[maxPessoas]; setlocale(LC_ALL,""); //me permite usar acentuação string opcao=""; string resposta=""; while (opcao!="0"){ cout <<"Número de pessoas cadastradas: " << numPessoas<<'\n'; cout <<"Escolha uma opção e em seguida tecle [ENTER]:\n\n"; cout <<"0 - Sair do programa.\n"; if (numPessoas<15) cout <<"1 - Inserir uma pessoa.\n"; if (numPessoas>0) cout <<"2 - Listar todos os nomes e respectivas alturas.\n"; if (numPessoas>0) cout <<"3 - Listar todas as pessoas nascidas antes de uma data fornecida.\n"; getline(cin, opcao); if (opcao=="1"){ pessoas[numPessoas]=cadastrarPessoa(); numPessoas++; }; if (opcao=="2"){ listarNomesAlturas(pessoas, numPessoas); }; if (opcao=="3"){ listarPessoasData(pessoas, numPessoas); }; //if (system("CLS")) system("clear"); //apago a tela. Este método é simples mas tem problemas de segurança}; return 0;} Tpessoa cadastrarPessoa(){ Tpessoa pessoa; string resposta=""; cout <<"\nNome: "; getline (cin, pessoa.nome); cout <<"Altura (em centímetro): "; getline (cin, resposta); pessoa.altura=stoi(resposta); pessoa.dataNasc=lerData(); return pessoa;} void listarNomesAlturas(Tpessoa p[], int total){ string resposta=""; for (int i=0; i<total;i++){ cout <<"Nome: "<< p[i].nome <<'\n'; cout <<"Altura: "<< p[i].altura <<"cm\n"; cout <<'\n'; cout <<"Tecle ENTER para voltar ao menu."; getline (cin, resposta); };} Tdata lerData(){ Tdata dataNasc; string resposta=""; cout <<"Agora você vai fornecer a data de nascimento\n "; cout <<"com dia, mês e ano separados (apenas números):\n\n"; cout <<"Ano (4 dígitos): "; getline (cin, resposta); dataNasc.ano=stoi(resposta); cout <<"Mês: "; getline (cin, resposta); dataNasc.mes=stoi(resposta); cout <<"Dia: "; getline (cin, resposta); dataNasc.dia=stoi(resposta);} void listarPessoasData (Tpessoa p[], int total){ Tdata dataBase=lerData(); string resposta; //Esse método para determinar se uma data ocorre antes da outra é uma gambiarra //Mas não consegui pensar em algo mais elegante e legível int dataBaseDias=(dataBase.ano*365)+(dataBase.mes*30)+dataBase.dia; bool found=false; for (int i=0; i<total;i++){ int dataPessoa=(p[i].dataNasc.ano*365)+(p[i].dataNasc.mes*30)+p[i].dataNasc.dia; if (dataPessoa<dataBaseDias){ cout <<"\nNome: "<< p[i].nome <<'\n'; cout <<"Altura: "<< p[i].altura <<"cm\n"; cout <<'\n'; found=true; }; }; if (!found){ cout <<"Nenhuma pessoa atende a esse critério.\n"; cout <<"Tecle ENTER para voltar ao menu."; getline (cin, resposta); };} |
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131 | #include <iostream>#include <strings.h>#include <locale.h>#include <stdlib.h> using namespace std; //Nesta versão eu uso ponteiros, mas ainda não uso alocação dinâmica struct Tdata { unsigned int dia; unsigned int mes; unsigned int ano;}; struct Tpessoa{ string nome; unsigned int altura; // em centímetros Tdata dataNasc; }; int numPessoas=0; void cadastrarPessoa(Tpessoa *p);void listarNomesAlturas(Tpessoa *p, int total);Tdata lerData();void listarPessoasData (Tpessoa *p, int total); int main() { const unsigned int maxPessoas=15; Tpessoa pessoas[maxPessoas]; setlocale(LC_ALL,""); //me permite usar acentuação string opcao=""; string resposta=""; while (opcao!="0"){ cout <<"Número de pessoas cadastradas: " << numPessoas<<'\n'; cout <<"Escolha uma opção e em seguida tecle [ENTER]:\n\n"; cout <<"0 - Sair do programa.\n"; if (numPessoas<15) cout <<"1 - Inserir uma pessoa.\n"; if (numPessoas>0) cout <<"2 - Listar todos os nomes e respectivas alturas.\n"; if (numPessoas>0) cout <<"3 - Listar todas as pessoas nascidas antes de uma data fornecida.\n"; getline(cin, opcao); if (opcao=="1"){ cadastrarPessoa(&pessoas[numPessoas]); numPessoas++; }; if (opcao=="2"){ listarNomesAlturas(pessoas, numPessoas); }; if (opcao=="3"){ listarPessoasData(pessoas, numPessoas); }; if (system("CLS")) system("clear"); //apago a tela. Este método é simples mas tem problemas de segurança}; return 0;} void cadastrarPessoa(Tpessoa *p){ Tpessoa pessoa; string resposta=""; cout <<"\nNome: "; getline (cin, p->nome); cout <<"Altura (em centímetro): "; getline (cin, resposta); p->altura=stoi(resposta); p->dataNasc=lerData(); } void listarNomesAlturas(Tpessoa *p, int total){ string resposta=""; for (int i=0; i<total;i++){ cout <<"Nome: "<< p[i].nome <<'\n'; cout <<"Altura: "<< p[i].altura <<"cm\n"; cout <<'\n'; cout <<"Tecle ENTER para voltar ao menu."; getline (cin, resposta); };} Tdata lerData(){ Tdata dataNasc; string resposta=""; cout <<"Agora você vai fornecer a data de nascimento\n "; cout <<"com dia, mês e ano separados (apenas números):\n\n"; cout <<"Ano (4 dígitos): "; getline (cin, resposta); dataNasc.ano=stoi(resposta); cout <<"Mês: "; getline (cin, resposta); dataNasc.mes=stoi(resposta); cout <<"Dia: "; getline (cin, resposta); dataNasc.dia=stoi(resposta);} void listarPessoasData (Tpessoa *p, int total){ Tdata dataBase=lerData(); string resposta; //Esse método para determinar se uma data ocorre antes da outra é uma gambiarra //Mas não consegui pensar em algo mais elegante e legível int dataBaseDias=(dataBase.ano*365)+(dataBase.mes*30)+dataBase.dia; bool found=false; for (int i=0; i<total;i++){ int dataPessoa=(p[i].dataNasc.ano*365)+(p[i].dataNasc.mes*30)+p[i].dataNasc.dia; if (dataPessoa<dataBaseDias){ cout <<"\nNome: "<< p[i].nome <<'\n'; cout <<"Altura: "<< p[i].altura <<"cm\n"; cout <<'\n'; found=true; }; }; if (!found){ cout <<"Nenhuma pessoa atende a esse critério.\n"; cout <<"Tecle ENTER para voltar ao menu."; getline (cin, resposta); };} |
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160 | #include <iostream>#include <strings.h>#include <locale.h>#include <stdlib.h> using namespace std; //Nesta versão eu uso ponteiros, mas inda não uso alocação dinâmica struct Tdata { unsigned int dia; unsigned int mes; unsigned int ano;}; struct Tpessoa{ string nome; unsigned int altura; // em centímetros Tdata dataNasc; }; int numPessoas=0;void adicionarPessoa(Tpessoa *p, int *numRegistros);void deletarPessoa(Tpessoa *p, int *numRegistros, int numRec);void cadastrarPessoa(Tpessoa *p);void listarNomesAlturas(Tpessoa *p, int total);Tdata lerData();void listarPessoasData (Tpessoa *p, int total); int main() { Tpessoa *ptrPessoas = new Tpessoa[1]; setlocale(LC_ALL,""); //me permite usar acentuação string opcao=""; string resposta=""; while (opcao!="0"){ cout <<"Número de pessoas cadastradas: " << numPessoas<<'\n'; cout <<"Escolha uma opção e em seguida tecle [ENTER]:\n\n"; cout <<"0 - Sair do programa.\n"; if (numPessoas<15) cout <<"1 - Inserir uma pessoa.\n"; if (numPessoas>0) cout <<"2 - Listar todos os nomes e respectivas alturas.\n"; if (numPessoas>0) cout <<"3 - Listar todas as pessoas nascidas antes de uma data fornecida.\n"; getline(cin, opcao); if (opcao=="1"){ //cadastrarPessoa(&ptrPessoas[numPessoas]); adicionarPessoa(ptrPessoas, &numPessoas); }; if (opcao=="2"){ listarNomesAlturas(ptrPessoas, numPessoas); }; if (opcao=="3"){ listarPessoasData(ptrPessoas, numPessoas); }; if (system("CLS")) system("clear"); //apago a tela. Este método é simples mas tem problemas de segurança}; delete []ptrPessoas;return 0;} void cadastrarPessoa(Tpessoa *p){ Tpessoa pessoa; string resposta=""; cout <<"\nNome: "; getline (cin, p->nome); cout <<"Altura (em centímetros): "; getline (cin, resposta); p->altura=stoi(resposta); p->dataNasc=lerData(); } void listarNomesAlturas(Tpessoa *p, int total){ string resposta=""; // cout <<"Total: "<< total <<"\n\n"; // getline (cin, resposta); for (int i=0; i<total;i++){ cout <<"Nome: "<< p[i].nome <<'\n'; cout <<"Altura: "<< p[i].altura <<"cm\n"; cout <<'\n'; cout <<"Tecle ENTER para voltar ao menu."; getline (cin, resposta); };} Tdata lerData(){ Tdata dataNasc; string resposta=""; cout <<"Agora você vai fornecer a data de nascimento\n "; cout <<"com dia, mês e ano separados (apenas números):\n\n"; cout <<"Ano (4 dígitos): "; getline (cin, resposta); dataNasc.ano=stoi(resposta); cout <<"Mês: "; getline (cin, resposta); dataNasc.mes=stoi(resposta); cout <<"Dia: "; getline (cin, resposta); dataNasc.dia=stoi(resposta);} void listarPessoasData (Tpessoa *p, int total){ Tdata dataBase=lerData(); string resposta; //Esse método para determinar se uma data ocorre antes da outra é uma gambiarra //Mas não consegui pensar em algo mais elegante e legível int dataBaseDias=(dataBase.ano*365)+(dataBase.mes*30)+dataBase.dia; bool found=false; for (int i=0; i<total;i++){ int dataPessoa=(p[i].dataNasc.ano*365)+(p[i].dataNasc.mes*30)+p[i].dataNasc.dia; if (dataPessoa<dataBaseDias){ cout <<"\nNome: "<< p[i].nome <<'\n'; cout <<"Altura: "<< p[i].altura <<"cm\n"; cout <<'\n'; found=true; }; }; if (!found){ cout <<"Nenhuma pessoa atende a esse critério.\n"; cout <<"Tecle ENTER para voltar ao menu."; getline (cin, resposta); };} void adicionarPessoa(Tpessoa *p, int *numRegistros){ //Aumenta o tamanho do vetor em um elemento e preenche esse elemento cadastrarPessoa(&p[*numRegistros]); *numRegistros=*numRegistros+1; Tpessoa *temp = new Tpessoa[*numRegistros+1]; std::copy(p,p+*numRegistros,temp); delete p; p=temp; } void deletarPessoa(Tpessoa *p, 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 Tpessoa *temp = new Tpessoa[*numRegistros-1]; std::copy(p,p+numRec-1,temp); std::copy(p+numRec,p+*numRegistros,temp+numRec-1); delete p; p=temp; *numRegistros=*numRegistros-1;} |