Ir para conteúdo
Fórum Script Brasil
  • 0

(Resolvido) exercicio em C++


Zackk

Pergunta

Faça um algoritmo que carregue um vetor de 20 posições com numeros inteiros e que mostre os numeros que aparecem mais de uma vez e quantas vezes cada numero se repete, mostrando um relatório da seguinte forma:

O numero 5 aparece duas vezes no vetor, nas posições 0,12

O numero 4 aparece duas vezes no vetor, nas posições 1,16

O numero 3 aparece três vezes no vetor, nas posições 2,7,15

O numero 18 aparece duas vezes no vetor, nas posições 3,18

Por favor me ajudem, eu consegui fazer, mais ele mostra o numero repetido mais de uma vez, por exemplo : O numero 5 a mensagem aparecia quando o vetor estivesse na posição 0 e mostraria aquela mensagem e de novo quando o vetor estiver na posição 12, então está repetindo sem necessidade, e eu não sei como arrumar isso.

Aqui está o algoritmo em C++ com este defeito, por favor me ajudem.

Eu preciso fazer isso até quarta-feira que é a minha prova, e esse é o unico que eu não consigo terminar.

#include<stdio.h>
#include<stdlib.h>

int main(int argc, char** argv){
    int i = 0, vet[20], cont = 1, j,h = 0,l;
    for(i = 0; i < 20; i++){
        printf("\n\nDigite o numero para a posicao %d : ",i);
        scanf("%d",&vet[i]);
    }
    for(i = 0; i < 20; i++){
        for(j = 0; j <= 1; j++){
            for(h = 0; h < 20; h++){
                if(i != h){
                    if(vet[i] == vet[h]){
                        if(j == 0){
                            cont++;
                        }else{
                            printf(",%d",h);
                        }
                    }
                }
            }
            if(j == 0){
                if(cont > 2){
                    printf("\n\nO numero [%d] aparece %d vezes no vetor, nas posicoes : %d",vet[i],cont,i);
                }
            }else{
                cont = 1;
            }
        }
    }
    system("pause");
    return 0;
}

Desde já obrigado.

Link para o comentário
Compartilhar em outros sites

3 respostass a esta questão

Posts Recomendados

  • 0

Para evitar essa repetição você pode seguir essa lógica:

  • Pedir os números ao usuário;
  • Percorrer todos os itens desse vetor (usando o iterador i).
    • Para cada item, percorrer novamente o vetor (usando o iterador j)
    • Se, na primeira repetição encontrada, o valor de j for menor que i, significa que, no loop principal, já processamos a ocorrência. Nesse caso, pare de procurar repetições (para sair do loop, use a instrução break)
    • Do contrário (j>i), apenas incrementamos o contador.
    • Depois basta verificar se cont>1; se for, mostra a mensagem e percorre o vetor novamente para mostrar as posições.
No seu código, algumas variáveis estavam sendo declaradas logo no início da função. Isso não é errado, mas deixa o código um pouco desorganizado. Como está utilizando C++, não é necessário fazer dessa forma (em C é obrigatóio). Adaptei a função para ajudar na organização.

Segue o código:

#include <stdlib.h>
#include<stdio.h>

int main(int argc, char** argv){
    //Quantidade de números
    const int tamanho=20;
    //Vetor com os números
    int vet[tamanho];
    //Obtém a lista
    for(int i = 0; i < tamanho; i++){
        printf("\n\nDigite o numero para a posicao %d: ",i);
        scanf("%d",&vet[i]);
    }
    //Percorre os números e armazena os repetidos
    printf("\n");
    for(int i = 0; i < tamanho; i++){
        int cont=0;
        for(int j = 0; j < tamanho; j++){
            if(vet[j]==vet[i]){
                if(j<i){
                    //essa verificação já foi feita antes, portanto o valor já foi escrito na tela
                    break;
                }
                cont++;
            }
        }
        if(cont>1){
            printf("O numero %d se repete %d vezes, nas posicoes: ",vet[i],cont);
            bool virgula=false; //variável que apenas indica se devemos colocar a vírgula antes do número
            for(int j=0; j < tamanho; j++){
                if(vet[j]==vet[i]){
                    if(virgula){
                        printf(", "); //escreve a vírgula
                    }
                    printf("%d",j);
                    virgula=true; //como já escrevemos ao menos uma vez, precisaremos de vírgula
                }
            }
            printf("\n");
        }
    }
    system("pause");
    return 0;
}

Nota: em C++ o modificador const indica que uma variável não pode ter seu valor modificado.

Se desejar, pode adaptar o código para percorrer os documentos do vetor para ficar em uma função. Você tentou fazer algo parecido com o loop intermediário (de índice j no seu código).

Esse código que postei ainda não é a melhor forma de fazer (isto é, poderia ser otimizado), mas é suficiente para fins didáticos.

Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,3k
    • Posts
      652,4k
×
×
  • Criar Novo...