Autor Tópico: Aula 6 - Alocação dinâmica de memória  (Lida 684 vezes)

0 Membros e 1 Visitante estão vendo este tópico.

Offline Jefferson

  • Zelador
  • Hero Member
  • *****
  • Mensagens: 1854
  • Aprovação: +0/-0
    • Ver Perfil
    • http://ryan.com.br
Aula 6 - Alocação dinâmica de memória
« Online: Abril 04, 2019, 05:46:14 pm »
Citar
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.

Os exercícios da lista aos quais o professor se refere são estes. Consulte-os se você se deparar com algo faltando aqui (os arquivos de digitação automática, por exemplo).

Em todos os exercícios eu fiz a transição para modularização, ponteiros e alocação dinâmica em etapas para facilitar o debug e a compreensão do que foi feito, por isso cada exercício exibe três ou quatro versões do código, identificadas com um comentário.

É altamente recomendado que você faça o mesmo no seu código. Divida o problema em partes menores. Teste após terminar cada parte e só comece a  resolver a parte seguinte do problema após a parte anterior rodar sem erros. E quando eu digo "rodar sem erros" não quero dizer "compilar sem erros". 

É perfeitamente possível, partindo do exercício base, implementar tudo de uma vez só e sem erros, mas só deve tentar isso quem até agora estava achando os exercícios "um passeio". Qualquer um que chegou até aqui "aos trancos e barrancos" precisa aprender a dividir o problema em partes ou não vai conseguir avançar nessa disciplina.

Nota: todos os exercícios abaixo ainda tem problemas na versão com alocação dinâmica. Geralmente o problema só se manifesta na hora de adicionar o segundo elemento por meio de cópia do array. Se o array for criado dinamicamente com X posições essas X posições podem ser manipuladas (adicionar e deletar) por meio de ponteiros sem problemas. Mas na hora de fazer o vetor crescer para acomodar mais um item o problema aparece na segunda inserção. Por isso as versões com alocação ainda tem código de debug e/ou não tem toda a funcionalidade implementada
« Última modificação: Abril 06, 2019, 02:13:13 am por Jefferson »
http://jefferson-ryan.blogspot.com
http://ryan.com.br

Se o que você escreve não merece sua atenção, vai merecer a atenção de quem?!

Offline Jefferson

  • Zelador
  • Hero Member
  • *****
  • Mensagens: 1854
  • Aprovação: +0/-0
    • Ver Perfil
    • http://ryan.com.br
Re:Aula 6 - Alocação dinâmica de memória
« Responder #1 Online: Abril 04, 2019, 05:49:00 pm »
Exercício 1

Código: C++
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;}

Código: C++
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);    }

Código: C++
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);}
http://jefferson-ryan.blogspot.com
http://ryan.com.br

Se o que você escreve não merece sua atenção, vai merecer a atenção de quem?!

FORUM.RYAN.COM.BR

Re:Aula 6 - Alocação dinâmica de memória
« Responder #1 Online: Abril 04, 2019, 05:49:00 pm »

Offline Jefferson

  • Zelador
  • Hero Member
  • *****
  • Mensagens: 1854
  • Aprovação: +0/-0
    • Ver Perfil
    • http://ryan.com.br
Re:Aula 6 - Alocação dinâmica de memória
« Responder #2 Online: Abril 04, 2019, 05:54:34 pm »
Exercício 2

Código: C++
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;}

Código: C++
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'; }

Código: C++
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);}
http://jefferson-ryan.blogspot.com
http://ryan.com.br

Se o que você escreve não merece sua atenção, vai merecer a atenção de quem?!

Offline Jefferson

  • Zelador
  • Hero Member
  • *****
  • Mensagens: 1854
  • Aprovação: +0/-0
    • Ver Perfil
    • http://ryan.com.br
Re:Aula 6 - Alocação dinâmica de memória
« Responder #3 Online: Abril 04, 2019, 05:58:33 pm »
Exercício 3

Código: C++
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;}}

Código: C++
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;}}

Código: C++
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;}}

Código: C++
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107