Ir ao conteúdo
  • Cadastre-se

C++ Escrever e mostrar 2 ints em C++


MUrisCuri

Posts recomendados

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.

 

#include <iostream>
#include <vector>
using namespace std;

int main()
{
	vector<int>num;
	int temp=0;
	int ind=0;
	
	while ( temp!=124 )
	{
		cout << "Digite abaixo 2 numeros inteiros: \n";
		cout << "Numero da posicao " << ind << ": "; 
		cin >> temp;
		num.push_back(temp);
		cout << "teste - numero = " << num[ind] << endl;
		if ( ind>=1 )
		{
			cout << endl;
			cout << "Os numeros sao: " << num[ind] << " e " << num[ind+1];
			cout << endl;
			num[ind]=0;
			num[ind+1]=0;
			ind=0;
		}
		else
		{
		++ind;	
		}
	}
}

Isso faz o seguinte:

 

image.thumb.png.cff9ec5d2e123c1d56d6322e5b874a8b.png

 

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. 

Link para o comentário
Compartilhar em outros sites

@MUrisCuri Preste atenção na minha captura de tela.captura_erro.thumb.png.5e35cc2aae9f808dc24ae7a4e0e6d821.png

Quando a variável ind chega no if ela vale 1, é isso não faz sentido nessa linha.

6 horas atrás, MUrisCuri disse:

cout << "Os numeros sao: " << num[ind] << " e " << num[ind+1];

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

6 horas atrás, MUrisCuri disse:

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.

Link para o comentário
Compartilhar em outros sites

Kgin, o código ficou assim:

 

#include <iostream>
#include <vector>
using namespace std;
int main()
{
	vector<int>num;
	int temp;
	int i=0;
	cout << "Write 2 numbers: \n";
	while ( cin >> temp )
	{
		
		cout << "First number = " << temp << "\n Write the second: "; 
		num.push_back(temp);
		++i;
		cin >> temp;
		num.push_back(temp);
		cout << "\n The numbers: " << num[i-1] << " and " << num[i];
		cout << endl;
		++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

Link para o comentário
Compartilhar em outros sites

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.

#include <iostream>
#include <vector>
using namespace std;

int main() {
	vector<int> num;
	string temp1;
	string temp2 = "n";
	int ind = 1;
	while (temp2 != "|") {
		cout << "Write 2 numbers: \n";
		cout << "First number = ";
		cin >> temp1;
		if (temp1 == "|")
			break;
		cout <<  "\Write the second: ";
		cin >> temp2;
		if (temp2 != "|") {
			num.push_back(stoi(temp1));
			num.push_back(stoi(temp2));
			cout << "The numbers: " << num[ind - 1] << " and " << num[ind] << "\n" << endl;
			ind += 2;
		}
	}
	return 0;
}

O livro que você está usando não parece ser muito adequado pra você.

 

Eu recomendaria:

 

C++ How to Program, Early Objects Version, Global Edition, 10th Ed
Paul Deitel, Harvey Deitel

Link para o comentário
Compartilhar em outros sites

Olá.

 

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.  

 

image.png.2ebf5d4de73692105433d95b1046d604.png

 

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:

 


    vector<double> temps;
    for( double temp; cin>>temp;  ) temps.push_back(temp);
      

 

E o prof. Stroustrup acrescenta: "por exemplo se você usar"
 

1.2 3.4 5.6 7.8 9.0 | 

 

"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. 


image.png.94ae294107bfb4d4510abd7e54c947ef.pngO 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:
 

 

1 2 3 4
1 2
3 4
-5 -6 -7 -8
-5 -6
-7 -8
9 10 11 |
9 10

 

  • 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:
 

1 2 3 4 5 6 7
1 2
3 4
5 6
8 9 10 11 -12 -13
7 8
9 10
11 -12
1 2 3 |
-13 1
2 3

Lidos 8 pares:
1 2
3 4
5 6
7 8
9 10
11 -12
-13 1
2 3

 

Pode usar esse exemplo

 

// ARFNeto para o Clube do Hardware 210419
#include <iostream>
#include <vector>
using namespace std;

int main(void)
{
	vector< pair<int,int> > par_de_int;
	auto temp = 0;
	auto fase = 1; // 1/2 lendo os int
	auto um_valor = 0;
	while (cin >> temp)
	{
            if (fase == 1)
            {   um_valor = temp;
                fase = 2;
                continue;
            }
            cout << um_valor << " " << temp << "\n";
            fase = 1;
            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";
	return 0;
}
// fim de main.cpp

 

Link para o comentário
Compartilhar em outros sites

18 horas atrás, JorgeGus disse:

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.


#include <iostream>
#include <vector>
using namespace std;

int main() {
	vector<int> num;
	string temp1;
	string temp2 = "n";
	int ind = 1;
	while (temp2 != "|") {
		cout << "Write 2 numbers: \n";
		cout << "First number = ";
		cin >> temp1;
		if (temp1 == "|")
			break;
		cout <<  "\Write the second: ";
		cin >> temp2;
		if (temp2 != "|") {
			num.push_back(stoi(temp1));
			num.push_back(stoi(temp2));
			cout << "The numbers: " << num[ind - 1] << " and " << num[ind] << "\n" << endl;
			ind += 2;
		}
	}
	return 0;
}

O livro que você está usando não parece ser muito adequado pra você.

 

Eu recomendaria:

 

C++ How to Program, Early Objects Version, Global Edition, 10th Ed
Paul Deitel, Harvey Deitel

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.    

Link para o comentário
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...