Ir ao conteúdo

C++ Conversão de dados ( Int - - > String )


Ir à solução Resolvido por arfneto,

Posts recomendados

Postado

Boa tarde! 

 

Tentando resolver um problema em C++,  encontrei uma dificuldade em passar um inteiro lido ( valor de entrada) para uma string ( passá-lo para um vetor). Exemplificando:

 

Um inteiro k = 224 --> Transforma-lo em  vetor --> k[0] = 2    //  k[1] = 2  //  k[2] = 4.

 

Obs.: O problema pedirá n inteiros e devo apresentar a quantidade de cada algarismos nesses números,ou seja, quantas vezes apareceu 0,1,2,3, assim por diante.

 

O objetivo é contar os algarismos.Nesse exemplo,  o dois aparece duas vezes e o quatro apenas uma vez. Podem ajudar ?

 

 

Agradeço a atenção!!

 

Tentativa :

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

int main(){
   int n,a,b,c,d,e,f,g,h,i,j,k;
   string s;
   a = b = c = d = e = f = g = h = i = j = 0;
   cin >> n;
   for(int i = 0;i < n;i++){
         cin >> k;
        fmt::format_int(k).str();
        if(n[i] == 0){
            a++;
        }
        else if (n[i]== 1){
            b++;
        }
         else if (n[i]== 2){
            c++;
        }
         else if (n[i]== 3){
            d++;
        }
         else if (n[i]== 4){
            e++;
        }
         else if (n[i]== 5){
            f++;
        }
         else if (n[i]== 6){
            g++;

        }
         else if (n[i]== 7){
            h++;
        }
         else if (n[i]== 8){
            i++;
        }
         else if (n[i]== 9){
            j++;
        }

        cout << 0 "-" << a << endl;
        cout << 1 "-" << b << endl;
        cout << 2 "-" << c << endl;
        cout << 3 "-" << d << endl;
        cout << 4 "-" << e << endl;
        cout << 5 "-" << f << endl;
        cout << 6 "-" << g << endl;
        cout << 7 "-" << h << endl;
        cout << 8 "-" << i << endl;
        cout << 9 "-" << j << endl;
   }



    return 0;
  }



















 

  • Curtir 1
  • Obrigado 1
Postado
9 horas atrás, Nascimento01 disse:

Tentando resolver um problema em C++,  encontrei uma dificuldade em passar um inteiro lido ( valor de entrada) para uma string ( passá-lo para um vetor). Exemplificando:

 

Um inteiro k = 224 --> Transforma-lo em  vetor --> k[0] = 2    //  k[1] = 2  //  k[2] = 4

 

Bem, seu exemplo não tem a ver com string nem com o título do tópico. Trata-se apenas de tabelar a ocorrência dos dígitos em um vetor e mostrar, para um conjunto de N números.

 

Por outro lado você até mostrou um vetor k[] mas não usou no seu programa, declarando ao contrário 10 variáveis e deixando tudo mais difícil...

 

E leu um valor inteiro k e depois acessou n como se fosse n um vetor... Não entendi. Talvez pudesse escrever mais sobre seu código.

 

De todo modo vou te mostrar duas outras soluções para você considerar. Com essas variáveis:

	int n{};      // o total de numeros que vai ler
	long v{};     // o numero que esta testando no momento
	int k[10]{ }; // o vetor que marca os digitos

 

Duas soluções

 

Vou te mostrar duas possibilidades pra escrever isso: veja o caso do exemplo 224: 

 

Primeiro caso, para 224

 

224 = 220 + 4, e temos o primeiro dígito: 4. O operador % --- módulo --- vai te dar exatamente isso: 224 % 10 vai ser o resto da divisão de 224 por 10, 4, e você pode somar 1 em k[4] escrevendo

k[224%10] += 1;

Então resolvido o primeiro dígito. Aí  divide 224 por 10 e tem 22. 22 % 10 vale 2 então em C

k[22%10] += 1;

Resolvido mais um dígito. Então divide por 10  de novo e temos 22 / 10 = 2 e então em C

k[2%10] += 1;

Resolvido o terceiro dígito. Então divide por 10 de novo e temos 2 / 10 = 0

E terminou. Olhando o vetor temos k[4] = 1 e k[2] = 2 como esperado. 

Total de numeros para esse teste: 1

Testando para 1 valores

Entre numero 1 de 1
224
Para o valor 224: [0:0] [1:0] [2:2] [3:0] [4:1] [5:0] [6:0] [7:0] [8:0] [9:0]

Caso limite

 

Quando o número é zero tem que sair com k[0] = 1; certo? Então só pode testar depois de ter feito a conta.

Como queremos fazer o simples, um do {} while é o comando certo em C, até o valor ficar zero... Para zero:

Testando para 1 valores

Entre numero 1 de 1
0
Para o valor 0: [0:1] [1:0] [2:0] [3:0] [4:0] [5:0] [6:0] [7:0] [8:0] [9:0]

Claro que pode dividir sem usar o operador %, apenas fazendo as contas em C e o resto vai dar 4

int valor = 224;
int quociente = valor / 10;
int resto = valor - (quociente * 10);

Segundo caso, para 224

 

Para o mesmo 224, pode-se pensar que o serviço é um pouco monótono: você marca no vetor um dígito, recalcula o valor e faz exatamente a mesma coisa de novo até acabarem os dígitos... Se fosse uma função chamada conta_digito() para o mesmo valor 224:

  • marca o 4.e chama conta_digito(22)
marca o 2 e chama conta_digito(2); marca o 2 e chama conta_digito(0);

e aí acabou. 

 

Isso sugere uma função recursiva e o programa fica bem pequeno... Algo assim

int main(int argc, char** argv)
{
    int n{};
    int v{};
    int k[10]{ };

    cout << "Total de numeros para esse teste: ";
    cin >> n;
    cout << endl << "Testando para " << n << " valores\n\n";
    for (int i = 1; i <= n; i = i + 1)
    {
        cout << "Entre numero " << i << " de " << n << endl;
        cin >> v;
        conta_digito(v);
    }    // for
    return 0;
}    // main()

conta_digito() tabula um dígito e chama ela mesma com o número 10 vezes menor para ver o próximo dígito. E mostraria

Total de numeros para esse teste: 1

Testando para 1 valores

Entre numero 1 de 1
91000
Para o valor 91000: [0:3] [1:1] [2:0] [3:0] [4:0] [5:0] [6:0] [7:0] [8:0] [9:1]

E quando chega a zero ela mostra os valores do vetor.

 

Pense nisso e mostre como está indo

 

  • Curtir 2
  • Obrigado 1
Postado
11 minutos atrás, Nascimento01 disse:

Agradeço ao @arfneto  e @Mauro Britivaldo  pelas instruções. Ainda não consegui desenvolver mas vou deixar esse problema na "sacola" de dúvidas.Em breve,tento novamente. Até lá e fico grato pela atenção!! 😀

 

Entendeu o que te expliquei? Tem até uma parte do código lá. E a descrição do algoritmo.

 

Note que ler os números como string vai contra o enunciado. O objetivo do exercício é justamente testar essa habilidade no aluno, de separar os dígitos usando operações.

 

Ler como string e varrer os índices não acrescentaria nada em termos de aprendizado...

  • Curtir 1
Postado

Essa forma de pensamento foi induzida porque no curso lá diz ser " Strings ", foi sugestivo tentar assim.

 

Entendi da seguinte forma : Dado um número n, ao dividir por 10, obtemos o resto ( que é as unidades ). Passando para dezenas : ( n/10 )%10   // // //   centenas :  (n/100)%10.

 

A ideia geral eu compreendi, agora é como utilizar uma estrutura de repetição e contabilizar para os valores que coloco. Vou tentar.

Postado
Em 19/01/2020 às 14:50, Nascimento01 disse:

Obs.: O problema pedirá n inteiros e devo apresentar a quantidade de cada algarismos nesses números,ou seja, quantas vezes apareceu 0,1,2,3, assim por diante.

 

O objetivo é contar os algarismos

 

Já vi esse exercício muitas vezes em vários formatos para várias linguagens. Sempre a ideia é a mesma e é essa que descreveu: fazer as contas. Ler como string é absolutamente trivial e não ensinaria nada... bastaria ir varrendo a string e colocando no vetor.

 

4 minutos atrás, Nascimento01 disse:

Entendi da seguinte forma : Dado um número n, ao dividir por 10, obtemos o resto ( que é as unidades ). Passando para dezenas : ( n/10 )%10   // // //   centenas :  (n/100)%10.

 

ao dividir por 10 você não obtem o resto, obtem o quociente. O resto você tem usando módulo %. 

E aí você divide por 10 e faz de novo. E de novo. E de novo até ficar com zero.... Te dei um exemplo do loop em detalhes usando o 224.

 

E o código para uma função recursiva.

 

O main() que postei funciona direitinho para a função conta_digito() e dá o resultado que mostrei.

 

Um loop para a solução mais comum, não recursiva, seria algo como

	int n{};
	long v{};
	int k[10]{ };

	cout << "Total de numeros para esse teste: ";
	cin >> n;
	cout << endl << "Testando para " << n << " valores\n\n";
	for (int i = 1; i <= n; i = i + 1)
	{
		cout << "Entre numero " << i << " de " << n << endl;
		cin >> v;
		cout << "Para o valor " << v << ": ";
		do
		{
			k[v % 10] += 1; v = v / 10;
		} while (v > 0);
		for (int i = 0; i < 10; i = i + 1)
			cout << "[" << i << ":" << k[i] << "] ";
		cout << endl;
	}	// for

que também funciona

Total de numeros para esse teste: 1

Testando para 1 valores

Entre numero 1 de 1
224
Para o valor 224: [0:0] [1:0] [2:2] [3:0] [4:1] [5:0] [6:0] [7:0] [8:0] [9:0]

Qual parte está mais complicado de entender?

 

Não precisa considerar a rotina recursiva, apesar de ela fazer o programa ficar simples mas uma implementação seria

que também funciona direitinho. Tem sempre a pegadinha do zero como te expliquei...  De todo modo eis uma que funciona


void	conta_digito(long v)
{
	static int k[10]{ };
	static int primeiro = 1;
	if (primeiro == 1)
	{	
		if (v == 0) k[0] = 1; // especial: 0
		primeiro = 0;
		cout << "Para o valor " << v << ": ";
	};	// if
	if (v == 0)
	{
		for (int i = 0; i < 10; i = i + 1)
			cout << "[" << i << ":" << k[i] << "] ";
		cout << endl;
		return;
	}
	else
	{
		k[v % 10] += 1;
		conta_digito(v / 10);
	};  // if
};	// conta_digito()

 

Pergunte exatamente pelo trecho que não entendeu e tento explicar melhor

 

 

  • Curtir 1
Postado

Essa parte : k[v % 10] += 1;  Como posso ter certeza de que não ficará ' lixo ' na memória ?

 

Certa  vez ,quando fiz um código, declarei uma variável antes de um loop.Após esse loop, deveria incrementar mas permaneceu com o mesmo valor enquanto em outras vezes o valor seguiu o incremento( Imprimindo o valor na tela, retornava o incremento) , por que isso ocorre ?

 

 

Postado
12 minutos atrás, Nascimento01 disse:

Essa parte : k[v % 10] += 1;  Como posso ter certeza de que não ficará ' lixo ' na memória ?

 

Certa  vez ,quando fiz um código, declarei uma variável antes de um loop.Após esse loop, deveria incrementar mas permaneceu com o mesmo valor enquanto em outras vezes o valor seguiu o incremento( Imprimindo o valor na tela, retornava o incremento) , por que isso ocorre ?

 

 

 

Porque ficaria?

 

Eis o que você tem que conferir: o que é k?

static int k[10]{};

Então k é um array de int, 10 deles, que você vai acessar de k[0] a k[9]. E as {} indicam que foi inicialmente carregado todinho com zeros...

 

v%10 vai te dar o resto da divisão de v por 10 então é um número entre zero e nove e não tem como dar erro

 

ao somar 1 você pode ter claro overflow se ficar somando 1 até k passar de INT_MAX mas isso não é exatamente "lixo na memória" e sim uma exceção aritmética.

 

Em relação ao seu código só dá pra dizer o que houve se você postar o programa em si.

 

Mas em geral isso é devido a uma questão de escopo da variável como por exemplo quando você declara uma variável de controle dentro de um loop e tem outra igualzinha declarada fora dele... A variável "vive" dentro do par mais interno de {}

 

 

  • Curtir 1
Postado
#include <iostream>

using namespace std;
int main()
{

    int n,k[10]{},i,f;
    cin >> n;
    for(int i = 1; i <= n; i++){

      cin >> f;

      do{
        k[f%10] += 1; f = f/10;

      }while( f > 0);

    }
    for ( int i = 0; i < 10; i++){
        cout << i << " - " << k[i] << endl;
      }


    return 0;
}

Deu certo,@arfneto!  Não sabia que as chaves   indicavam um carregamento inicial com zeros, foi por conta disso que deu uns números aleatórios.

 

 

Agradeço a atenção e paciência!! Até a próxima!😀
 

  • Solução
Postado

Não, não deu certo...

 

Testou mesmo isso?

 

Precisa mostrar algo do que está fazendo ao menos para saber o que está testando... Como não está usando uma função para os testes precisa zerar os valores de k entre cada execução, já que está fazendo as contas direto em main.

E precisa mostrar o vetor antes de ir para o próximo. Do jeito que escreveu só vai mostrar depois de calcular para todos os n.

 

Entendeu a alternativa recursiva?

adicionado 10 minutos depois

Algo assim para a versão sem recursão

void teste_normal()
{
	int n{};
	long v{};
	int k[10]{ };

	cout << "Total de numeros para esse teste: ";
	cin >> n;
	cout << endl << "Testando para " << n << " valores\n\n";
	for (int i = 1; i <= n; i = i + 1)
	{
		cout << "Entre numero " << i << " de " << n << endl;
		cin >> v;
		for (int i = 0; i < 10; i = i + 1)
			k[i] = 0;
		do
		{
			k[v % 10] += 1; v = v / 10;
		} while (v > 0);
		for (int i = 0; i < 10; i = i + 1)
			cout << "[" << i << ":" << k[i] << "] ";
		cout << endl;
	}	// for
	return;
}	// teste_normal()

E assim para a versão recursiva

void teste_recursivo()
{
	int n{};
	long v{};
	cout << "Total de numeros para esse teste: ";
	cin >> n;
	cout << endl << "Testando para " << n << " valores\n\n";
	for (int i = 1; i <= n; i = i + 1)
	{
		cout << "Entre numero " << i << " de " << n << endl;
		cin >> v;
		conta_digito(v);
	}	// for
};  // teste_recursivo()

E a função em si

void	conta_digito(long v)
{
	static int k[10]{ };
	static int primeiro = 1;
	if (primeiro == 1)
	{	
		if (v == 0) k[0] = 1; // especial: 0
		primeiro = 0;
		cout << "Para o valor " << v << ": ";
	};	// if
	if (v == 0)
	{
		for (int i = 0; i < 10; i = i + 1)
			cout << "[" << i << ":" << k[i] << "] ";
		cout << endl;
		for (int i = 0; i < 10; i = i + 1) k[i] = 0;
		return;
	}
	else
	{
		k[v % 10] += 1;
		conta_digito(v / 10);
	};  // if
};	// conta_digito()

 

Atente para as diferenças

  • Curtir 1
Postado
58 minutos atrás, arfneto disse:

Precisa mostrar algo do que está fazendo ao menos para saber o que está testando... Como não está usando uma função para os testes precisa zerar os valores de k entre cada execução, já que está fazendo as contas direto em main.

E precisa mostrar o vetor antes de ir para o próximo. Do jeito que escreveu só vai mostrar depois de calcular para todos os n.

 

O problema é de um Juiz Online, ele quer que mostre  o vetor  só depois de calcular para todos os n. Diz assim

Entrada

A entrada consiste de múltiplas linhas. A primeira linha contém um inteiro N representando a quantidade de número que serão fornecidos. Então seguirão  N números inteiros.

Saída

A saída consiste de 10 linhas, cada linha contém um algarismo e o número de ocorrências desse algarismo.

 

Deu solução correta.Vou analisar as diferenças.

 

 

Postado

Tem que colocar os cout dentro do loop. Como escreveu só vai mostrar ao final mesmo que sejam 20 números

adicionado 1 minuto depois

Deu a solução correta porque testou com n=1. 

  • Curtir 1

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