Graduação em TI (ADS/SI/CS) > Estrutura de Dados

Aula 3 - Exercícios

(1/2) > >>

Jefferson:
Exercício 1


--- Citar ---Faça um programa para gerar automaticamente numeros entre 0 e 99 de uma
cartela de bingo. Sabendo que cada cartela deverá conter 5 linhas de 5 números,
gere estes dados de modo a não ter números repetidos dentro das cartelas. O
programa deve exibir na tela a cartela gerada. (Usar Matriz)
--- Fim de citação ---


O programa abaixo ainda precisa de alterações. Ele não usa o que a cadeira chama de "matriz"


--- Código: C++ ---1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162#include <iostream>using std::cout;using std::cin; #include <iomanip> //time#include <algorithm> //sort //no dev c++ para isso ser aceito é preciso ir em Tools -> Compiler Options e acrescentar -std=c++11 "when calling the compiler"#include <random> #include <locale.h> //necessário para usar setlocale  int main(){     int a[24];    int novoValor;     setlocale(LC_ALL,"");  //me permite usar acentuação        // Preparo o gerador de número randômicos para me fornecer números na faixa de -10 a 10    std::mt19937 eng(time(NULL)); // Alimento o gerador com a hora atual para me certificar que cada execução seja diferente    std::uniform_int_distribution<> distr(0, 99); // defino faixa    bool found=false;    for (int i=0; i<25;i++){        novoValor=distr(eng);         found=false;         //me certifico de não armazenar um número que já exista (os 25 números da cartela são aleatórios e DIFERENTES)        for (int j=0; j<i; j++){            if (a[j]==novoValor) found=true;//ToDO: fazer sair do laço        }        if (!found) {            a[i]=novoValor;        }else        i--; //repito esta rodada     }        //É uma cartela de bingo. Seus clientes vão xingar você se os números não estiverem em ordem crescente    std::sort(std::begin(a), std::end(a));        cout << '\n';    cout << "Sua Cartela:\n";    cout << '\n';     int i=0;    for (int linha=1; linha<6; linha++){                for (int coluna=1; coluna<6; coluna++){            //cout <<" " <<a[i];            printf(" %02d", a[i]); //me certifico de que "3" seja exibido como "03" para não bagunçar a formatação            i++;        }         cout  << '\n';    }  return 0;} 

Jefferson:
Exercício 2


--- Citar ---Implemente um programa que leia o nome, idade e endereço de uma pessoa
armazenndo os dados em uma estrutura, onde endereço também é uma estrutura.
--- Fim de citação ---

A partir deste exercício eu passei a usar getline() porque eu não sei como fazer o cin ler toda a linha digitada pelo usuário. Normalmente ao encontrar o primeiro espaço cin já retorna. O motivo de eu usar getline() mesmo onde não é necessário é que o primeiro getline() após um cin recebe um ENTER automaticamente e você não consegue responder.  O motivo é que cin "consome" a string digitada mas deixa o ENTER no buffer. Se o próximo comando for um cin esse ENTER no início da string é ignorado, mas getline() não faz isso.

Muito depois eu descobri que você poderia usar cin.ignore() (não testado) após o cin e antes de getline() para apagar esse ENTER antes dele chegar a getline(). Mas preferi deixar o código como está.

Outro comando que serve para esse propósito é fflush(stdin) (não testado)


--- Código: C++ ---12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182#include <iostream>#include <string.h>#include <locale.h> //necessário para usar setlocale using namespace std; //Este programa não faz nenhuma validação dos dados struct Endereco{  string logradouro;  unsigned int numero;  string complemento;  string cep;  string bairro;  string cidade;  string uf;}; struct Pessoa {    string nome;    unsigned int idade;    Endereco endereco;    };  int main(){        setlocale(LC_ALL,"");  //me permite usar acentuação     /*    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);    if (resposta=="a")  freopen("ex2.txt", "r", stdin);     Pessoa pessoa;        string temp;        cout <<"Nome: "<<'\n';    getline(cin, pessoa.nome);    cout <<"Idade: "<<'\n';    getline(cin,temp);    pessoa.idade=stoi(temp);    cout <<"Logradouro: "<<'\n';    getline(cin, pessoa.endereco.logradouro);    cout <<"Numero: "<<'\n';    getline(cin, temp);    pessoa.endereco.numero= stoi(temp);    cout <<"Complemento: "<<'\n';    getline(cin, pessoa.endereco.complemento);    cout <<"Bairro: "<<'\n';    getline(cin, pessoa.endereco.bairro);    cout <<"Cidade: "<<'\n';    getline(cin, pessoa.endereco.cidade);    cout <<"UF: "<< '\n';    getline(cin, pessoa.endereco.uf);    cout <<"CEP: "<< '\n';    getline(cin, pessoa.endereco.cep);    //O enunciado do exercício não pede que os dados sejam exibidos mas vou exibir assim mesmo     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';     return 0;} 
O arquivo ex2.txt ao qual o programa se refere:


--- Código: ---Lucas Streban
27
Avenida Recife
344
Apto B
Areias
Recife
PE
50210 060

--- Fim de código ---

Nova versão, com alguns aperfeiçoamentos:


--- Código: C++ ---12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697#include <iostream>#include <string.h>#include <locale.h> //necessário para usar setlocale#include <sstream> //usado para validar números using namespace std; //Este programa não faz nenhuma validação dos dados struct Endereco{  string logradouro;  unsigned int numero;  string complemento;  string cep;  string bairro;  string cidade;  string uf;}; struct Pessoa {    string nome;    unsigned int idade;    Endereco endereco;    };  int main(){     setlocale(LC_ALL,"");  //me permite usar acentuação        /*    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 ex3.txt ou (d)igitá-los? "<<'\n';    getline(cin,resposta); //usar cin aqui faz saltar a entrada de NOME adiante    if (resposta=="a")  freopen("ex3.txt", "r", stdin); //não me importa nenhuma outra resposta     Pessoa pessoa;        string temp="";    //Esta versão evita exibir os prompts para os dados se estes estiverem sendo fornecidos por arquivo    if (resposta!="a") cout <<"Nome: ";    getline(cin, pessoa.nome);     //Me certifico de que o próximo valor fornecido seja mesmo um número    while (true) {        if (resposta!="a") cout <<"Idade: ";        getline(cin,temp);        stringstream myStream(temp);        if (myStream >>pessoa.idade) break; //sucesso na conversão        cout << "Número inválido. Tente de novo." << '\n';    }     if (resposta!="a") cout <<"Logradouro: ";    getline(cin, pessoa.endereco.logradouro);     //Me certifico de que o próximo valor fornecido seja mesmo um número    while (true) {       if (resposta!="a") cout <<"Número: ";        getline(cin,temp);        stringstream myStream(temp);        if (myStream >>pessoa.endereco.numero) break; //sucesso na conversão        cout << "Número inválido. Tente de novo." << '\n';    }        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);            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';     return 0;} 

Jefferson:
Exercício 3


--- Código: C++ ---123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051#include <iostream>#include <strings.h>#include <locale.h> using namespace std; struct Aluno{  string nome;  string matricula;  string curso; }; 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);        Aluno aluno[5];        /*Eu poderia incluir condicionais para remover a exibição dos textos aqui      quando os dados forem obtidos de um arquivo, assim como no exercício anterior      mas isso atrapalha a clareza e distancia ainda mais do objetivo da questão    */    for (int i=0;i<5;i++){        cout <<"Dados do aluno "<< i+1 <<": \n";        cout <<"Nome: ";        getline(cin, aluno[i].nome);        cout <<"Matrícula: ";        getline(cin, aluno[i].matricula);        cout <<"Curso: ";        getline(cin, aluno[i].curso);        cout <<'\n';    };    cout <<"Exibindo agora os dados gravados\n\n";    for (int i=0;i<5;i++){        cout <<"Aluno "<< i+1 <<'\n';        cout <<"Nome: " << aluno[i].nome <<'\n';        cout <<"Matrícula: " << aluno[i].matricula <<'\n';        cout <<"Curso: " << aluno[i].curso <<'\n';        cout <<'\n';    };      return 0;} 
O arquivo ex3.txt:


--- Código: ---Jefferson Ryan
201809010001
Análise e Desenvolvimento de Sistemas
Korynader Lutz
201808038627
Sistemas de Informação
Fulano Sicrano
201708032409
Ciência da Computação
Roberto Freitas
201708012345
Psicologia
Célia Borges
20170803421
Fisioterapia

--- Fim de código ---

Jefferson:
Exercício 4

--- Citar ---Crie uma estrutura representando os alunos de um determinado curso. A estrutura
deve conter a matrícula do aluno, nome, curso, nota da primeira prova, nota da
segunda prova e nota da terceira prova.
a) Permita ao usuário entrar com os dados de até 10 alunos.
b) Encontre o aluno com maior nota da primeira prova.
c) Encontre o aluno com maior média geral.
d) Imprima todos os alunos de um curso que o usuário solicitar. Mostre ao
usuário os cursos existentes para que ele possa escolher um deles.
e) Para cada aluno diga se ele foi aprovado ou reprovado, considerando as
regras da Estácio para a aprovação.

--- Fim de citação ---


--- Código: C++ ---123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192#include <iostream>#include <strings.h>#include <locale.h> using namespace std;   struct Alunos{    string nome;    string matricula;    string curso;    float nota[3];    }; int main() {      setlocale(LC_ALL,"");  const int maxAlunos=10;  const int maxCursos=10;    Alunos aluno[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);    string temp="";    cout <<"Quantos alunos? "; //o enunciado fala em *até* 10 alunos. Isso implica que o usuário pode entrar com menos.    getline(cin, temp);    unsigned int numAlunos=stoi(temp);        for (int i=0;i<numAlunos;i++){        cout <<"Dados do aluno "<< i+1 <<": \n";        cout <<"Nome: ";        getline(cin, aluno[i].nome);        cout <<"Matrícula: ";        getline(cin, aluno[i].matricula);        cout <<"Curso: ";        getline(cin, aluno[i].curso);                for (int j=0; j<3;j++){            cout <<"Nota " << j+1 << ": ";            getline(cin, temp);            aluno[i].nota[j]=stof(temp);                    };                cout <<'\n';    };        cout <<"Exibindo agora os dados gravados\n\n";    for (int i=0;i<numAlunos;i++){        cout <<"Aluno "<< i+1 <<'\n';        cout <<"Nome: " << aluno[i].nome <<'\n';        cout <<"Matrícula: " << aluno[i].matricula <<'\n';        cout <<"Curso: " << aluno[i].curso <<'\n';        for (int j=0; j<3;j++){            cout <<"Nota " << j+1 <<": " << aluno[i].nota[j] <<'\n';    };                cout <<'\n';    };      //Determino qual a maior nota da primeira prova  float nota=0;  float maiorNota=0;     for (int i=0;i<numAlunos;i++){        nota=aluno[i].nota[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<numAlunos;i++){        if (aluno[i].nota[0]==maiorNota){            cout <<"Nome: " << aluno[i].nome <<'\n';            cout <<"Matrícula: " << aluno[i].matricula <<'\n';            cout <<"Curso: " << aluno[i].curso <<'\n';            cout <<'\n';        };    };          //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<numAlunos;i++){        for (int j=0; j<3;j++){        soma=soma+aluno[i].nota[j];        };        media=soma/3;        if (media>maiorMedia) maiorMedia=media;        soma=0;    };        //imprimo os alunos que tiraram a maior média       cout <<"\nA maior média foi: " << maiorMedia <<'\n';     cout <<"Alunos que alcançaram essa média:\n\n";      for (int i=0;i<numAlunos;i++){        soma=0;        for (int j=0; j<3;j++){            soma=soma+aluno[i].nota[j];        };        media=soma/3;         if (media==maiorMedia){            cout <<"Nome: " << aluno[i].nome <<'\n';            cout <<"Matrícula: " << aluno[i].matricula <<'\n';            cout <<"Curso: " << aluno[i].curso <<'\n';            cout <<'\n';        };     };        string cursos[maxCursos];    unsigned int numCursos=0;    bool found=false;    string curso="";        //Faço uma lista dos cursos existentes      for (int i=0;i<numAlunos;i++){      curso=aluno[i].curso;       for (int j=0; j<numCursos ;j++) {           if (curso==cursos[j]) found=true; //eu preciso ignorar os cursos repetidos                  };       if (!found) {           cursos[numCursos]=curso;           numCursos++;        };        found=false;    };      //imprimo os cursos       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);    curso=cursos[stoi(resposta)];  float menorNota=0;  unsigned int indiceMenorNota=0;  float notas[3];     for (int i=0;i<numAlunos;i++){        if (aluno[i].curso==curso){            cout <<"\nNome: " << aluno[i].nome <<'\n';            cout <<"Matrícula: " << aluno[i].matricula <<'\n';            cout <<"Curso: " << aluno[i].curso <<'\n';                                   for (int j=0; j<3; j++){              if (aluno[i].nota[j]<4) notas[j]=0; else notas[j]=aluno[i].nota[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);};            if (k>=6) cout <<"Aluno APROVADO\n"; else cout <<"Aluno REPROVADO\n";                   };    };       return 0;}; 
Arquivo ex4.txt:


--- Código: ---10
Jefferson Ryan
201809038642
Análise e Desenvolvimento de Sistemas
10
9,5
4
Korynader Lutz
201808038627
Sistemas de Informação
8
7,5
7
Fulano Sicrano
201708032409
Ciência da Computação
9
6
5
Roberto Freitas
201708012345
Psicologia
3
10
0
Célia Borges
20170803421
Fisioterapia
3
5,4
6
Bjarne Stroustrup
20100212345
Análise e Desenvolvimento de Sistemas
10
9,8
10
Sanjay Madhav
20000334567
Sistemas de Informação
9
5
7,1
Clark Kent
19990445678
Astrofísica
10
8,2
7
Lex Luthor
20050978901
Economia
10
4
6
Lois Lane
20061301234
Jornalismo
8
4,5
4
3

--- Fim de código ---

Jefferson:
Exerc´ício 5


--- Citar ---Crie um programa que permita armazenar o nome, a altura e da data de nascimento
de até 15 pessoas.
Cada pessoa deve ser representada por uma struct dentro de um vetor.
A data de nascimento também deve ser uma struct.
O nome, a altura e a data de nascimento de cada pessoa devem ser informados
pelo teclado.
O programa deve, na tela de abertura, apresentar opções para:
a) inserir uma pessoa;
b) listar todos os nomes e respectivas alturas;
c) listar os nomes das pessoas que nasceram antes de uma certa data
fornecida.
--- Fim de citação ---


--- Código: C++ ---123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113#include <iostream>#include <strings.h>#include <locale.h>#include <stdlib.h> using namespace std; struct Data {    unsigned int dia;    unsigned int mes;    unsigned int ano;}; struct Pessoas{  string nome;  unsigned int altura; // em centímetros  Data dataNasc;    };  int main() {        const unsigned int maxPessoas=15;   setlocale(LC_ALL,"");   Pessoas pessoa[maxPessoas]; int numPessoas=0; string opcao=""; string resposta=""; while (true){     cout <<"Número de pessoas cadastradas: " << numPessoas<<'\n';    cout <<"Escolha uma opção e em seguida tecle [ENTER]:\n\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"){        cout <<"\nNome: ";        getline (cin, pessoa[numPessoas].nome);        cout <<"Altura: ";        getline (cin, resposta);        pessoa[numPessoas].altura=stoi(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);        pessoa[numPessoas].dataNasc.ano=stoi(resposta);        cout <<"Mês: ";        getline (cin, resposta);        pessoa[numPessoas].dataNasc.mes=stoi(resposta);        cout <<"Dia: ";        getline (cin, resposta);        pessoa[numPessoas].dataNasc.dia=stoi(resposta);        numPessoas++;    };        if (opcao=="2"){        for (int i=0; i<numPessoas;i++){            cout <<"Nome: "<< pessoa[i].nome <<'\n';            cout <<"Altura: "<<  pessoa[i].altura <<"cm\n";            cout <<'\n';            cout <<"Tecle ENTER para voltar ao menu.";            getline (cin, resposta);         };    };        if (opcao=="3"){        unsigned int dia=0;        unsigned int mes=0;        unsigned int ano=0;        unsigned int dataBase=0;        unsigned int dataPessoa=0;        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: ";        getline (cin, resposta);        ano=stoi(resposta);        cout <<"Mês: ";        getline (cin, resposta);        mes=stoi(resposta);        cout <<"Dia: ";        getline (cin, resposta);        dia=stoi(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        dataBase=(ano*365)+(mes*30)+dia;                 for (int i=0; i<numPessoas;i++){           dataPessoa=(pessoa[i].dataNasc.ano*365)+(pessoa[i].dataNasc.mes*30)+pessoa[i].dataNasc.dia;           if (dataPessoa<dataBase){            cout <<"\nNome: "<< pessoa[i].nome <<'\n';            cout <<"Altura: "<<  pessoa[i].altura <<"cm\n";            cout <<'\n';            } else            cout <<"Nenhuma pessoa atende a esse critério.\n";            cout <<"Tecle ENTER para voltar ao menu.";            getline (cin, resposta);         };            };  if (system("CLS")) system("clear"); //apago a tela. Este método é simples mas tem problemas de segurança};  return 0;};

Navegação

[0] Índice de mensagens

[#] Página seguinte

Responder

Ir para versão completa