Ir ao conteúdo

Posts recomendados

Postado

Olá pessoal, criei uma conta no clube só para tirar essa dúvida, e muitas outras que surgirem. Pois muito bem, estava tentando um exercício da lista sobre vetores passada por minha professora. Eis o enunciado da mesma:

Escreva um programa que leia um conjunto de no máximo 20 números inteiros (número negativo para encerrar) e imprima quais são os números repetidos e quantas vezes eles estão repetidos, se houver. Os elementos podem aparecer repetidos na saída. Exemplo:

Digite o vetor (no máximo 20 elementos ou número negativo para encerrar):

0 1 2 3 4 5 1 2 1 -1

Resultado:

o numero 1 aparece 3 vezes;

o numero 2 aparece 2 vezes;

Minha abordagem do problema: A medida que as entradas são armazenadas num vetor, chamado "Lidos", o algoritmo verifica se o mesmo valor informado pelo usuário é igual aos valores de um segundo vetor, chamado "Repetidos", se for igual: um terceiro vetor, chamado "Repeticoes", na posição do mesmo valor de entrada recebe +1 e encerra o laço. E se o valor de Repetidos for igual a -2 (todos os valores do vetor são definidos como -2) essa posição passa a valer o valor digitado pelo usuário. Em seguida, se próxima entrada do usuário for negativa ou a variável de percurso do laço de leitura for maior ou igual a 19 ele verificará se os valores de "Repeticoes" é diferente de 1 (todos foram definidos para 1) e se "Repetidos" são diferentes de -2. E por fim, imprime os números repetidos e suas repetições. Aqui esta o código:


#include <stdio.h>
main () {
int i, j, k, Lidos[20];
int Repetidos[20] {-2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2};
int Repeticoes[20] {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1};
for (i = 0; i < 20; i++) {
printf("Digite o a[%d] = ", i);
scanf("%d", &Lidos[i]);
for (j = 0; j <= i; j++) {
if (Lidos[i] == Repetidos[j]) {
Repeticoes[j]++;
break;
} else if (Repetidos[j] == -2) {
Repetidos[i] = Lidos[i];
}
}
if ( Lidos[i] < 0 || i >= 19) {
for (k = 0; k < i; k++) {
if (Repeticoes[k] != 1 && Repetidos[k] != -2) {
printf("O numero %d apareceu %d vezes.\n", Repetidos[k], Repeticoes[k]);
}
}
break;
}
}
return 0;
}

O algoritmo apresenta um erro, como mostrado na imagem a seguir:

2isfdi1.jpg

O numero de repetições do segundo numero, sempre é somado +1. Quando o usuário digita a segunda sequencia de números repetidos o vetor de repetições já recebe +1, antes mesmo, do segundo 2 ser informado, assim sempre estando 1 a mais para as próximas sequências...

Não consigo entender o porque disso acontecer, se vocês puderem me explicar o que realmente acontece, e me ajudar a consertar esse erro, eu agradeço. Obrigado!

Postado

Para simplificar o programa, dá para usar uma matriz

O ideal é ir registrando o valor na primeira coluna e o número de repetições na segunda.

Nesse código o zero não é considerado.

Talvez te ajude, ou quem tiver uma dúvida semelhante.


#include<stdio.h>

int main(void){
int matriz[20][2] = {{0},{0}}, numero;
int i, n, elemento = 0, novo;

for(i = 0; i < 20; i++){
printf("Elemento %d = ", i + 1);
scanf("%d", &numero);

if(numero < 0){
break;
}

for(n = 0, novo = 1; n <= i; n++){
if(matriz[n][0] == numero){
matriz[n][1]++;
novo = 0;
break;
}
}

if(novo){
matriz[elemento][0] = numero;
matriz[elemento][1]++;
elemento++;
}
}

for(i = 0; i < elemento; i++){
if(matriz[i][1] > 1){
printf(" O numero %d aparece %d vezes\n", matriz[i][0], matriz[i][1]);
}
}

return 0;
}

  • Curtir 1
Postado

Eu não conhecia esses laços for com mais de uma variável, no caso você usou "novo". Mas enfim, consegui corrigir meu algoritmo. Eis o código:

#include <stdio.h>
main () {
int i, j, k, Lidos[20];
int Repetidos[20] {-2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2};
int Repeticoes[20] {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1};
for (i = 0; i < 20; i++) {
printf("Digite o a[%d] = ", i);
scanf("%d", &Lidos[i]);
for (j = 0; j <= i; j++) {
if (Lidos[i] == Repetidos[j]) {
Repeticoes[j]++;
break;
} else if (Repetidos[j] == -2) {
Repetidos[[COLOR="red"]j[/COLOR]] = Lidos[i];
[COLOR="Red"]break;[/COLOR]
}
}
if ( Lidos[i] < 0 || i >= 19) {
for (k = 0; k < i; k++) {
if (Repeticoes[k] != 1 && Repetidos[k] != -2) {
printf("O numero %d apareceu %d vezes.\n", Repetidos[k], Repeticoes[k]);
}
}
break;
}
}
return 0;
}

A modificações estão em vermelho. Obrigado, dúvida solucionada.

  • 3 anos depois...
Postado

boa noite, como fazer no caso do codigo acima para mostrar tambem os que não se repetem:

Exemplo:

 

Digite o vetor (no máximo 20 elementos ou número negativo para encerrar):

0 1 2 3 4 5 1 2 1 -1

Resultado:

o numero 0 aparece 1 vez(es);

o numero 3 aparece 1 vez(es);

o numero 4 aparece 1 vez(es);

o numero 5 aparece 1 vez(es);

o numero 1 aparece 3 vez(es);

o numero 2 aparece 2 vez(es);

.

.

.

 

Grato.

 

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

GRÁTIS: ebook Redes Wi-Fi – 2ª Edição

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!