Exercício 2Implemente 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.
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)
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:
Lucas Streban
27
Avenida Recife
344
Apto B
Areias
Recife
PE
50210 060
Nova versão, com alguns aperfeiçoamentos:
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;} |