C - contador de frequência

redbird88

Power Member
Verifique a distribuição de frequência de 5 valores inseridos pelo utilizador.
Sei que é com um contador, mas sinceramente já não me recordo como se faz.
Alguém me pode dar uma ajuda?
Cumps
 
Última edição:
O que é que já fizeste em C? É que sendo um nº fixo de números ( neste caso 5 ), não custa nada. Há múltiplas abordagens, mas começa por tentar resolver o problema não em C mas com algoritmia.
 
#include <iostream.h>

main(){
int v[5];
int y,x,i,cont;
for (i=0;i<5;i++){
printf ("Digite o %d numero: ",i+1);
scanf ("%d",&v);
}
for (x=0; x < 5; x++) {


cont = 0;


for (y=0; y < 5; y++) {
if (v[x] == v[y]) cont++;

}
if(cont==1){
printf("");}
else{


printf ("O numero %d repete %d vezes\n", v[x], cont-1);
}


}


system ("pause");
}




já tenho isto feito. o problema é que quando o programa diz que determinado numero repete, na linha seguinte diz novamente que esse numero repete
 
no meu curso damos C++ invez de C, contudo, se for pela logica de C++ tens o programa mal... nao sei se o C funciona da mesma maneira que o C++ mas nao devo estar errado... se for pela logica do C++ (e este foi o meu primeiro ano de C++) , nao deves abrir um ciclo FOR e depois declarares o contador a 0 e depois abrires outro..., para isso, das duas uma, ou declaras no sitio da declaracao das variaveis, ou dentro do teu 3º FOR, fazes :

for(cont=0, y=0; y<5; y++)

acerca do resto da sintaxe, eu se fosse em C++ usaria um Switch Case, nao sei se tens no C essa opcao, mas com o If, é mais complicado... se tiveres a opcao de usar apontadores no C, terias de usar para puderes fazer com o IF...

PS: espero nao ter baralhado nem ter tido nenhuma asneira
 
Isso é porque estás a contar o mesmo número várias vezes, porque estás a comparar cada posição do vector com todas as outras, fazendo por isso várias vezes a mesma verificação.

Exemplo, tens o vector 1 3 3 3 4
Código:
para x=0:
   para y=0: 1==1 // é o próprio
      count=1.
   para y=1.
   para y=2.
   para y=3.
   para y=4.
// até aqui tudo bem
para x=1:
   para y=0:
   para y=1. 3==3
      count=1.
   para y=2. 3==3
      count=2.
   para y=3. 3==3
      count=3.
   para y=4.
   imprimir que o 3 está repetido 3x
// aqui continua tudo bem
para x=2: // mas já sabemos que o x=2 é um 3 e que está repetido com 3x, se continuarmos vamos estar a reverificar que está repetido.
   para y=1. 3==3 
      count=1.
   para y=2. 3==3 
      count=2.
   para y=3. 3==3
      count=3.
   para y=4.
   imprimir que o 3 está repetido 3x // como previsto
para x=3 .....

e portanto o teu programa faz isto:
Código:
Digite o 1 numero: 1Digite o 2 numero: 3
Digite o 3 numero: 3
Digite o 4 numero: 3
Digite o 5 numero: 4
O numero 3 repete 2 vezes
O numero 3 repete 2 vezes
O numero 3 repete 2 vezes

Uma solução é colocares as posições que já comparaste e são repetidas a um valor de descartável (p.e. 0 ou -1, se não fizerem parte dos valores aceitáveis pelo programa), outra solução é comparares com as posições anteriores do vector e caso o valor actual esteja numa delas, desistes de continuar a comparar, porque já sabes que está repetido.

Há mais soluções, mas que para serem eficientes precisas de conhecer outras estruturas de dados para além do vector.

Agora fiquei na dúvida, se eu tiver 1 2 3 3 4, digo que o 3 está repetido 2 vezes ou 1 vez?

Nota: se estás a usar C, o include correcto é o stdio.h, o iostream é uma biblioteca do C++ (e que por regras do C++, não devia ser incluido com o .h)

edit:
no meu curso damos C++ invez de C, contudo, se for pela logica de C++ tens o programa mal... nao sei se o C funciona da mesma maneira que o C++ mas nao devo estar errado... se for pela logica do C++ (e este foi o meu primeiro ano de C++) , nao deves abrir um ciclo FOR e depois declarares o contador a 0 e depois abrires outro..., para isso, das duas uma, ou declaras no sitio da declaracao das variaveis, ou dentro do teu 3º FOR, fazes :

for(cont=0, y=0; y<5; y++)

acerca do resto da sintaxe, eu se fosse em C++ usaria um Switch Case, nao sei se tens no C essa opcao, mas com o If, é mais complicado... se tiveres a opcao de usar apontadores no C, terias de usar para puderes fazer com o IF...

PS: espero nao ter baralhado nem ter tido nenhuma asneira
C++ é um superset de C, e estas coisas mais básicas é em tudo igual ao C. Neste código não há nada especifico do C++.

Ele está a colocar o count a 0 porque o count conta o número de vezes que o valor actual está repetido no programa actual. Não é o contador do ciclo. Mas por acaso esqueci-me de referir que usar nomes do tipo v,x,y,z é mau, porque dificulta muito a leitura do código.

Já agora quanto ao:
Código:
if(cont==1){
printf("");}
else{


printf ("O numero %d repete %d vezes\n", v[x], cont-1);
}
se tirares o printf(""); o programa corre exactamente da mesma maneira, e se quiseres ser correcto devias usar:
Código:
if(cont>1){
printf ("O numero %d repete %d vezes\n", v[x], cont-1);
}

Agora não percebi nada do que querias dizer com é mais fácil usar um switch() case:, em que sítio?
 
Última edição:
Back
Topo