1. Este site usa cookies. Ao continuar a usar este site está a concordar com o nosso uso de cookies. Saber Mais.

C - contador de frequência

Discussão em 'Programação' iniciada por redbird88, 24 de Julho de 2012. (Respostas: 7; Visualizações: 2027)

  1. redbird88

    redbird88 Power Member

    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: 24 de Julho de 2012
  2. começa por definir o que queres dizer com "distribuição de frequência".
     
  3. redbird88

    redbird88 Power Member

    Inserir 5 números e dizer quantas vezes repetiste 1 número, caso repitas.
     
  4. DotcomL

    DotcomL Power Member

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

    redbird88 Power Member


    já tenho isto feito. o problema é que quando o programa diz que determinado numero repete, na linha seguinte diz novamente que esse numero repete
     
  6. zakalash

    zakalash Power Member

    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
     
  7. 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:
    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: 25 de Julho de 2012
  8. zakalash

    zakalash Power Member

    defacto baralha muito, mas obrigado pela informacao sobre o C :D
     

Partilhar esta Página