Escrever e mostrar 2 ints em C++ - C/C#/C++ - Clube do Hardware
Escrever e mostrar 2 ints em C++
Por MUrisCuri,
17 de abril em C/C#/C++
MUrisCuri 5
Tento implementar um exercício muito simples do livro Princípios e Práticas de Programação com C++, o enunciado é o seguinte:
1. Escreva um programa que consista em um laço while que leia (a cada iteração do laço) dois ints e depois os imprima. Termine o programa
quando for lido um '|'.
Meu programa abaixo não faz o que diz no enunciado.
vector<int>num;
while ( temp!=124 )
cout << "Digite abaixo 2 numeros inteiros: \n";
cout << "Numero da posicao " << ind << ": ";
num.push_back(temp);
cout << "teste - numero = " << num[ind] << endl;
if ( ind>=1 )
cout << "Os numeros sao: " << num[ind] << " e " << num[ind+1];
num[ind]=0;
num[ind+1]=0;
No capítulo I do livro foi abordado vector, e usei método push_back() porque o autor abordou o seu uso e gostaria de seguir a ordem do conteúdo abordado no livro. Não consegui fazer a consistencia para interromper o loop (digitar "|" para sair do laço e terminar o programa). Outro problema é que o segundo int mostrado é negativo.
@MUrisCuri Preste atenção na minha captura de tela.
Quando a variável ind chega no if ela vale 1, é isso não faz sentido nessa linha.
6 horas atrás, MUrisCuri disse:
enquanto num[ind] vale 8 (referente a minha captura de tela) e num[ind+1] vale ??? (basicamente qualquer coisa que estiver na memoria sendo referenciada nesse momento, está apontando para um lugar inexistente) então você vai receber aquele numero negativo ou basicamente qualquer coisa que esteja na memoria.
outro problema e quando você zera a variável num nesse trecho
num[ind]=0; num[ind+1]=0;
Eu não sei C++, mas você não deveria usar algo como erase ou delete?
por que ao meu ver os "espaços" reservados para esses números ainda vão continuar ali.
Se eu fosse resolver isso em C eu usaria uma string para pegar os números, depois checaria se não há um caractere "|" na string para só então converter o numero com a função atoi() e colocar no vetor.
Kgin, o código ficou assim:
cout << "Write 2 numbers: \n";
while ( cin >> temp )
cout << "First number = " << temp << "\n Write the second: ";
cout << "\n The numbers: " << num[i-1] << " and " << num[i];
Mas, o programa encerra quando a entrada é qualquer coisa diferente de numero. Ja tentei trabalhar com string. O problema é que ha outras propostas nos demais exercicios de alteração deste programa como fazer operações matemáticas, e foge a proposta do autor. Então, há alguma forma de fazer que o programa encerre somente se digitar "|" ? Obrigado
Você pode ler cada número como uma string e depois de verificar se é ou não um "I" (Pipe), converter para inteiro usando a função stoi.
string temp2 = "n";
while (temp2 != "|") {
cout << "First number = ";
if (temp1 == "|")
cout <<  "\Write the second: ";
if (temp2 != "|") {
num.push_back(stoi(temp1));
num.push_back(stoi(temp2));
cout << "The numbers: " << num[ind - 1] << " and " << num[ind] << "\n" << endl;
O livro que você está usando não parece ser muito adequado pra você.
C++ How to Program, Early Objects Version, Global Edition, 10th Ed
Midori 876
Para terminar o programa você pode testar cin.fail() após a entrada do valor inteiro. Assim pode interromper o loop com qualquer caractere,
arfneto 2.431
2.431 100
Nesse caso vetor<> nada tem a ver com a questão, nem capturar os valores. Apenas imprimir os pares de int dentro do while e terminar ao ler um "|". Mas está assim em outros exemplos então acho que você deixou assim parecido.
19 horas atrás, MUrisCuri disse:
Mas, o programa encerra quando a entrada é qualquer coisa diferente de numero. Ja tentei trabalhar com string. O problema é que ha outras propostas nos demais exercicios de alteração deste programa como fazer operações matemáticas, e foge a proposta do autor. Então, há alguma forma de fazer que o programa encerre somente se digitar "|" ?
Sim, há claro outras formas de tratar a entrada, e o próprio autor diz nesse tópico que isso vai ser visto no capítulo 10. Esse exercício está no capítulo 4. Apenas siga o ritmo.
E tem que ler no contexto do seu livro afinal. O autor tem um plano. É claro que você pode ler a linha toda e ir acumulando os int aos pares, e só encerrar quando ler exatamente um pipe. Mas não é o objetivo. Veja o exemplo logo atrás no seu texto onde o autor usa esse loop:
for( double temp; cin>>temp;  ) temps.push_back(temp);
E o prof. Stroustrup acrescenta: "por exemplo se você usar"
"para esse programa temps vai ter 5 elementos" e tal. E o autor acrescenta ainda "usamos o caracter '|"para terminar a entrada --- qualquer coisa que não seja um double pode usada" e cita o capítulo --- distante --- em que será discutido como terminar a entrada e como tratar erros.
O autor sempre tem um plano. E nesse caso o autor é conhecido por ter planos de longo prazo. Trata-se do criador da linguagem e muito ativo até hoje em seu desenvolvimento. E um dos 2 editores do CGC, talvez o guia de boas práticas mais importante para essa linguagem por ser ativamente mantido por pessoas do porte desse autor e de Herb Sutter, o outro autor do CGC
Apenas faça como nos exemplos anteriores. Algo assim é o esperado:
Ao encontrar um pipe encerra
Ao ler um par mostra
Usa um while
Se você quer salvar em um vetor e mostrar depois os pares pode usar:
8 9 10 11 -12 -13
Lidos 8 pares:
Pode usar esse exemplo
// ARFNeto para o Clube do Hardware 210419
vector< pair<int,int> > par_de_int;
auto fase = 1; // 1/2 lendo os int
auto um_valor = 0;
if (fase == 1)
{   um_valor = temp;
cout << um_valor << " " << temp << "\n";
par_de_int.push_back({ um_valor,temp });
cout << "\nLidos " << par_de_int.size() << " pares:\n";
for (auto p : par_de_int) cout << p.first << " " << p.second << "\n";
// fim de main.cpp
18 horas atrás, JorgeGus disse:
Obrigado pela indicação. No entanto havia iniciado a lei Deitel, mas não me adaptei com a forma de apresentação do conteúdo do livro. Comparei os dois: Como Programar em C++ de Deitel e Princípios e Praticas em C++ de Straustup. Achei a didática e a apresentação de conteúdo deste mais compreensível. O autor enfatiza que o trabalho de programador deve sempre ser realizado com troca de conhecimento. Isso foi definitivo para minha escolha. Refiro-me a soma de aprendizagem através do conteúdo e exercícios do livro com a troca de informações aqui do fórum do Clube do Hardware, o que me tem proporcionado muito conhecimento. Infelizmente não há como absorver tudo, mas acho que estou conseguindo filtrar o essencial. Parti do zero em C++, e agora sei 0,5. Obrigado pela dica.