
// MAC110 - 2004
// [07/12/2004]
// 
// Computo de frequência (e vetor de índices de ocorrências)

#define M 15

// as duas linhas abaixos funcionam igualmente (são equivalentes)
//int encontra(int v[3], int n, int x) { // é irrelevante colocar o núm. 3
//int encontra(int v[], int n, int x) { 
//int encontra(int *v, int n, int x) {

int encontra(int vf[], int *nf, int v[], int n, int x) {
  int f=0, i;
  for (i=0; i<n; i++)
    if (x == v[i]) {
       vf[f] = i; // guarda o índice da atual ocorrência de "x"
       f++;       // contabiliza mais um ocorrência de "x"
       }
  *nf = f; // na verdade este parâmetro poderia ser eliminado, já que seu valor sempre
           // coincide com o valor de "f", mas ele é mantido por razão didática (ilustrar como
           // funciona a passagem de parâmetro por referência - ou apontado)
  return f;
  }

int main (void) {
  int v[M], // vetor dos dados
      F[M]; // vetor que ao final conterá os índices de onde ocorre o elemento procurado
  int x, i, nF;
  
  for (i=0; i<M; i++) {
     v[i] = rand()%100; // gera "pseudo-aleatoriamente" valores entre 0 e 99
     printf("%3d: %4d\n", i, v[i]); // lista valor gerado
     }

  x = 86; // este é o elemento procurado - pode-se colocar um "scanf" aqui para ficar mais geral...

  printf(" Freq. de %d é %d\n", x, encontra(F, &nF, v,M,x));

  // Note que neste ponto, os elementos encontrados estão na posições
  // "v[F[0]]", "v[F[1]]" até "v[F[nF]]".
  printf("nF = %d\n", nF);
  for (i=0; i<nF; i++)
    printf("v[%3d] = %d\n", F[i], v[F[i]]);     
  }
   
