Ir ao conteúdo

Posts recomendados

Postado

Olá pessoas, gostaria de adquirir algumas dicas do que posso estar fazendo para contar quantas vezes um numero se repete ao digitalo para o compilador por exemplo. Eu digito, (8,4,8,10,5,6,8,4,10). E quero printar que 8 repetir 3 vezes, 4 repetiu 2 vezes, e assim sucessivamente alguem pode me ajudar? Eu pensei em utilizar vetores mas nao consigo apontar para uma posicao do vetor e ir acompanhando cada valor no vetor.

Postado
16 minutos atrás, Pedro Henrique Faria Teixe disse:

Olá pessoas, gostaria de adquirir algumas dicas do que posso estar fazendo para contar quantas vezes um numero se repete ao digitalo para o compilador por exemplo. Eu digito, (8,4,8,10,5,6,8,4,10). E quero printar que 8 repetir 3 vezes, 4 repetiu 2 vezes, e assim sucessivamente alguem pode me ajudar? Eu pensei em utilizar vetores mas nao consigo apontar para uma posicao do vetor e ir acompanhando cada valor no vetor.


Em vez de printar, tenta usar um FOR.

Poste o resultado aqui.
Valeu !

  • Curtir 1
Postado
#include <iostream>
#include <string>
#include <iomanip>
#include <vector>
#include <algorithm>
#include <stdlib.h>


using namespace std;

int main()
{
int v[100] = {},a,n,cont=0,b,j=0,v1[100] = {};
                cin >> n;

                for(int i=0;i<n;i++){
                            cin>>v[i];


                }
            for(int x=0;x<n;x++){
                for(int y = x+1;y<n;y++){
                    if(v[x] != v[y])
                        v1[x] = v[x];
                }
            }
            cout << endl;

            for(int k=0;k<n;k++){
                cout << v1[k] << endl;
            }

}

 

adicionado 0 minutos depois

@atoMzera No segundo for estou separando os que são diferentes.

adicionado 1 minuto depois

@atoMzera No segundo for estou separando os que são diferentes. Use como ex: 

7
8
10
8
260
4
10
10

Postado

Uma maneira de fazer isso seria ordenar os números no vetor conforme eles vão sendo digitados.

 

Por exemplo o usuário digita:

(8, 4, 8, 10, 5, 6, 8, 4, 10)

E no vetor fica:

(4, 4, 5, 6, 8, 8, 8, 10, 10)

 

Aí no final basta percorrer o vetor verificando cada vez que o número muda, e contando quantas vezes repete até o número mudar.

  • Curtir 2
Postado

@Pedro Henrique Faria Teixe  minha solução foi essa

#include <iostream>
#include <vector>
#include <ctime> // time()

using namespace std;

int main(int argc, char** argv) 
{
	vector<int> num;

	srand((unsigned)time(NULL));

	// preenche o vetor com valores aleatórios 0-10;
	for (int i = 0; i < 20; i++)
	{
		int r = rand() % 10;
		num.push_back(r);
		cout << ": " << r << endl;
	}

	// essa lista de verificados serve pra não ter que percorrer o vetor de novo para um mesmo número;
	vector<int> verificados;

	for (unsigned j = 0; j < num.size(); j++)
	{
		int qtd = 0;
		// verifica quantas vezes um número repete no vetor
		for (unsigned i = 0; i < num.size(); i++)
		{
			bool t = false;

			for (unsigned k = 0; k < verificados.size(); k++)
			{
				if (num[j] == num[k])
				{
					t = true; // caso o número esteja no vetor de verificados seta t como true;
					break; // termina o laço;
				}
			}

			// caso t seja true, termina o laço;
			if (t)
				break;

			// senao, verifica o número na posicao j do vetor;
			else if (num[j] == num[i])
				qtd++; // incrementa pra saber a quantidade de vezes o número repete no vetor;
		}

		// adiciona o numero na lista de verificados;
		verificados.push_back(num[j]);

		if (qtd)
			cout << "O numero " << num[j] << " repete " << qtd << " vezes\n";
	}

	return 0;
}

mas dessa forma, se for verificar um vetor muito grande tipo 100.000, vai fritar o pc rsrs

 

da forma como o @isrnick sugeriu é a melhor pois só correrá o vetor 1 vez.

  • Curtir 1
Postado

@Gustavo AndrettoFicou show parça

adicionado 31 minutos depois

@Gustavo Andretto

#include <iostream>
#include <string>
#include <iomanip>
#include <vector>
#include <algorithm>
#include <stdlib.h>

using namespace std;

int main()
{
 int num,n;


                    cin >> num;

                    vector<int>numeros;

                    for(int i=0;i<num;i++){
                        cin >> n;
                        numeros.push_back(n);
                    }

                    sort(numeros.begin(),numeros.begin()+num);

                    for(int j=0;j<numeros.size();j++){
                        int cont = 0;
                        for(int k=0;k<numeros.size();k++){
                            if(numeros[j] ==  numeros[k])
                                cont++;

                        }
                        cout << numeros[j] << " aparece " << cont << endl;
                    }
return 0;
}

Usando vector cheguei a essa conclusao, porém nao retirei os valores reptidos. Alguma ideia?

adicionado 58 minutos depois

@isrnickManim fiz do jeito que voce falou, mas tipo não consigo printar o numero ser repetir.

Postado
#include <iostream>
#include <string>
#include <iomanip>
#include <vector>
#include <algorithm>
#include <stdlib.h>

using namespace std;

int main()
{
    int num,n;

    cin >> num;

    vector<int>numeros;

    for(int i=0;i<num;i++){
        cin >> n;
        numeros.push_back(n);
    }

    sort(numeros.begin(),numeros.begin()+num);

    num = numeros[0];
    int cont = 1;
    for(int j=1;j<numeros.size();j++){
        if(numeros[j] ==  numeros[j-1]){
            cont++;
        }
        else {
            cout << num << " aparece " << cont << endl;
            num = numeros[j];
            cont = 1;
        }
    }
    cout << num << " aparece " << cont << endl;
    return 0;
}

Fiz isso mas estou ocupado no momento então não posso testar agora, testa e veja se da certo.

  • Curtir 1
Postado

@isrnickDeu certim, e também cheguei a essa conclusão

#include <iostream>
#include <string>
#include <iomanip>
#include <vector>
#include <algorithm>
#include <stdlib.h>
#define Max 2001
using namespace std;

int main()
{
    int num,n,v[Max] = {};

    cin >> num;



    for(int i=0;i<num;i++){
        cin >> n;
        v[n]++;
    }
    for(int i=0;i<Max;i++){
        for(int j=0;j<v[i];j++){
            cout << i << " aparece " << v[i] << " vez(es)" << endl;
            break;
        }
    }

    return 0;
}

 

  • Curtir 1
Postado

Agora eu testei meu código e funcionou corretamente.

Só tinha ficado faltando abrir uma chave { na linha do if, corrigi isso e deu certo, eu editei o post e corrigi o código.

adicionado 12 minutos depois

O método que você usou nesse último código é o que eu teria sugerido se fosse estabelecido um intervalo de números que o usuário pode digitar, como de 0 a 2000 que você usou no código.

 

Talvez usando MAP para mapear int com int daria pra fazer isso sem limitar os números a um intervalo...

  • Curtir 1
Postado

A solução usando map:

#include <iostream>
#include <map>

using namespace std;

int main()
{
    int num,n;
    map<int, int> v = {};

    cin >> num;

    for(int i=0;i<num;i++){
        cin >> n;
        v[n]++;
    }
    
    map<int, int>::iterator it = v.begin();
    while(it != v.end()){
        cout << it->first << " aparece " << it->second << " vez(es)" << endl;
        it++;
    }

    return 0;
}

 

  • Curtir 1
Postado

Um mapa (ou dicionário ou vetor associativo) é parecido com um vetor/array comum.

 

O vetor tem um número de itens ordenados sequencialmente, e você pode obter o item do vetor referenciando seu o índice ou posição nessa sequência. Ou seja, vetor[3] está acessando o item do vetor na posição 3 da sequência começando em 0 e indo até o tamanho do vetor -1.

 

A diferença do dicionário/mapa é que você pode usar qualquer tipo de dado como uma 'chave' para referenciar um valor armazenado nele, por exemplo podemos criar um mapa D que usa strings como referências e armazena valores inteiros, e então fazer D["banana"] = 5, então 5 será armazenado na 'posição' "banana" do mapa D, e toda vez que acessar usando essa chave será retornado o número 5.

 

Nesse caso a vantagem de usar isso para mapear int com int no programa foi que tendo um mapa vazio e fazer mapa[100] = 1, um item foi adicionado ao mapa, com valor 1, e pode ser referenciado pelo valor 100, mas o mapa não tem um tamanho fixo, e você pode adicionar outros valores usando outras referências, ou obter e alterar esses valores usando as mesmas referências. O que nesse caso significa que você pode usar qualquer valor inteiro como referência não ficando limitado a um intervalo de números, e não tem várias posições do vetor desnecessárias que não serão usadas apenas ocupando memória.

 

Mas note que as chaves dos mapas não necessariamente são sequenciais, você não tem como somar +1 a "pera" para obter "banana" e usar como referência, o que significa que você teria que saber quais as chaves usadas no mapa previamente para conseguir acessar os valores guardados nele. Mas para isso o map do C++ tem um tipo membro especial, um iterador (iterator), o qual, como o nome sugere, pode ser iterado para percorrer o mapa e obter tanto as chaves (first) quanto os valores (second) deste mapa (como eu fiz no programa), sendo que os itens do mapa são ordenados de modo que suas chaves fiquem em ordem crescente, a menos que seja especificado outro tipo de comparação para determinar ordem.

  • Curtir 1
Visitante
Este tópico está impedido de receber novas respostas.

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

LANÇAMENTO!

eletronica2025-popup.jpg


CLIQUE AQUI E BAIXE AGORA MESMO!