Jump to content
Dioguex

Problema a contar caracteres do Array

Recommended Posts

Dioguex

Boa tarde,

Estou a iniciar-me me C e estou com algumas dúvida na elaboração de um programa.

O program consiste em identificar os números repetidos num determinado array e contar os que aparecem em maior número.

Até agora fiz o seguinte código:

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

int conta_freq(int a[], int t);

int main() {
int array[] = { 1,2,2,2,2,3,4,5,5,6 };
int t = 10;
conta_freq(array, t);
return 0;
}
int conta_freq(int a[], int t) {
int cont = 0, i = 0, aux = 0, auxmaior=0;
for (i = 0; i <= t; i++) {
 if (a[i] == a[i - 1]) {
  aux = a[i];
  cont++;
 }
}
printf("O valor que aparece mais vezes é: %d - Aparece %d vezes.", aux, cont);
return 0;
}

O output é: O valor que aparece mais vezes é: 5 - Aparece 4 vezes.

Ou seja, pelo que me parece está a contar bem o número de vezes que o mesmo número aparece repetido, o que não imprime bem é qual o número que está repetido.

Sei que tenho que usar um if, para verificar se o número repetido seguinte, é maior ou menor que o anterior, e acrescentar uma nova variavel para guardar o maior (no código é o auxmaior),

Neste momento não estou a conseguir solucionar este problema, podem ajudar, por favor?

Desde já muito obrigado.

Edited by thoga31
GeSHi

Share this post


Link to post
Share on other sites
HappyHippyHippo

o problema é mais complicado do que estás a pensar :

números repetidos não é o mesmo que números consecutivos

terás de saber/calcular o número de ocorrências de todas as diferentes entradas no array


IRC : sim, é algo que ainda existe >> #p@p

Share this post


Link to post
Share on other sites
Dioguex

HappyHippyHippo, nem tinha pensado nisso, e agora que vi bem, o que pretendo saber é os número repetidos e não os consecutivos.

Neste caso o meu if (a == a) também está mal.

Tenho que criar um array auxiliar e, por cada índice do array, copiar o conteúdo para o array auxiliar e verificar se já existe, é isto?

Obrigado

Share this post


Link to post
Share on other sites
nelsonr

Talvez criar um array auxiliar em que adicionas cada elemento unico, com um contador para o numero de vezes encontrado

Edited by nelsonr

Share this post


Link to post
Share on other sites
Dioguex

Bom dia,

Desculpem insistir com este assunto.

Refiz o meu código apenas para fazer o print do valor que aparece com mais frequência e não, o valor e as vezes que aparece e neste momento tenho assim o código:

#include <stdio.h>
#include <stdlib.h>
int conta_freq(int a[], int t);
int main() {
int array[] = {1,2,2,2,2,3,4,5,5,6};
int t = 10;
conta_freq(array, t);
return 0;
}
int conta_freq(int a[], int t) {
int  i = 0, j=0, f=0, fmax=0, n=0;
for (i = 0; i <= t; i++) {
 for (j=0; j<t; j++)
 if (a[j] == a[i]) {
  f++;
 }
 if (f>fmax){
  n=a[i];
  fmax=f;
 }
}
printf("O elemento com mais frequencia é: %d", n);
return 0;
}

O que mesmo assim não está bem, o output que dá é: O elemento com mais frequencia é: 6

E deveria ser 2.

Podem dar uma ajuda para identificar o que estou a fazer mal?

Obrigado.

Edited by thoga31
GeSHi

Share this post


Link to post
Share on other sites
HappyHippyHippo

vou indentar o código para ver se v~e o problema

#include <stdio.h>
#include <stdlib.h>
int conta_freq(int a[], int t);
int main() {
 int array[] = {1,2,2,2,2,3,4,5,5,6};
 int t = 10;

 conta_freq(array, t);
 return 0;
}

int conta_freq(int a[], int t) {
 int  i = 0, j=0, f=0, fmax=0, n=0;

 for (i = 0; i <= t; i++) { // i <= t ??
   for (j=0; j<t; j++)
     if (a[j] == a[i]) {
       f++;
     }

   if (f>fmax){             // qual o valor de f na primeira passagem ? e na segunda ?
     n=a[i];
     fmax=f;
   }
 }
 printf("O elemento com mais frequencia é: %d", n);
 return 0;
}

indentação não é um desvaneio dos programadores que possuem ideias de que são artistas plásticos !!!

Edited by HappyHippyHippo

IRC : sim, é algo que ainda existe >> #p@p

Share this post


Link to post
Share on other sites
Flinger

Além do ponto que o Hippo apontou, vê lá o que acontece ao teu f, cada vez que terminar o for com o j (for (j=0; j<t; j++)).

Share this post


Link to post
Share on other sites
Dioguex

Obrigado pela resposta HappyHippyHippo.

Normalmente costumo indentar o código, mas quando copio para o site fica alterado, não sei porque, devo estar a fazer algo mal.

Estive a olhar para o código, e faz sentido que o i seja i < t e não i <= t, mas mesmo assim o resultado sai igual, olhando para o código, não estou a conseguir perceber.

Flinger, o f incrementa sempre que o valor (a[j] == a) certo?

Obrigado pela ajuda.

Share this post


Link to post
Share on other sites
HappyHippyHippo

   if (f>fmax){             // qual o valor de f na primeira passagem ? e na segunda ?


IRC : sim, é algo que ainda existe >> #p@p

Share this post


Link to post
Share on other sites
Dioguex

Na primeira passagem pelo if (f>fmax) é 1, e na segunda já é 5. Não estou a perceber porque.

O f só devia ser maior que fmax até ao a[5] certo?

Edited by Dioguex

Share this post


Link to post
Share on other sites
Flinger

o teu ciclo for(com o j) conta as ocorrências do caracter que está na posição a, no vector inteiro. Até aqui tudo bem.

Para o primeiro, conta as ocorrências de 1, e dá 1. Tudo bem.

Mas antes de começares a contar as ocorrências do primeiro 2, qual é o valor que tens no f? E quando vais começar a contar o segundo 2, quantas ocorrências(f) já tens?

Share this post


Link to post
Share on other sites
HappyHippyHippo

faz esta alteração para perceberes o que se está a passar :

#include <stdio.h>
#include <stdlib.h>
int conta_freq(int a[], int t);
int main() {
 int array[] = {1,2,2,2,2,3,4,5,5,6};
 int t = 10;

 conta_freq(array, t);
 return 0;
}

int conta_freq(int a[], int t) {
 int  i = 0, j=0, f=0, fmax=0, n=0;

 for (i = 0; i <= t; i++) { // i <= t ??
   for (j=0; j<t; j++)
     if (a[j] == a[i]) {
       f++;
       printf("ocorrencia detectada para o valor %d : freq = %d\n", a[j], f);
     }

   if (f>fmax){
     n=a[i];
     fmax=f;
   }
 }
 printf("O elemento com mais frequencia é: %d", n);
 return 0;
}

Edited by HappyHippyHippo

IRC : sim, é algo que ainda existe >> #p@p

Share this post


Link to post
Share on other sites
Dioguex

Flinger, com a alteração que o HappyHippyHippo fez, acho que já percebi. Quando começo a contar o digito dois, já tenho 1 ocorrência, que é do digito 1, ou seja, o f está a incrementar por cada valor, e, sempre que entra num novo valor, o f deveria voltar a 0 certo? E começar nova contagem sempre que o a é um novo valor, é isso?

Mas, segundo o if(a[j]==a) o f não devia incrementar apenas quando a condição se verifica?

Obrigado aos dois.

Edited by Dioguex

Share this post


Link to post
Share on other sites
Dioguex

Bem, parece que já está a funcionar.

O código ficou assim:

#include <stdio.h>
#include <stdlib.h>
int conta_freq(int a[], int t);
int main() {
int array[] = {1,2,2,2,2,2,2,5,5,6};
int t = 10;
conta_freq(array, t);
return 0;
}
int conta_freq(int a[], int t) {
int i = 0, j = 0, f = 0, fmax = 0, n = 0;
for (i = 0; i < t; i++) {
 for (j = 0; j < t; j++) {
  if (a[j] == a[i]) {
   f++;
   //printf("ocorrencia detectada para o valor %d : freq = %d\n",a[j], f);
  } else
   f = 0;
  if (f > fmax) {
   n = a[i];
   fmax = f;
  }
 }
}
printf("O elemento com mais frequencia é: %d - Aparece %d vezes", n, fmax);
return 0;
}

Tive que colocar o segundo if dentro do segundo for e acrescentar o else no fim do primeiro if. A única coisa que ainda não faz é se tiver o mesmo número no array, mas separado por ou outro, exemplo: {1,2,2,2,3,2} o programa penas conta 3 dois.

Vou ver se descubro porque.

Muito obrigado aos dois pela ajudar.

Edited by thoga31
GeSHi

Share this post


Link to post
Share on other sites
Flinger

Exacto. Colocaste o f=0 no sítio errado.

Quando é que tu queres começar a contar de novo?Neste momento estás a colocá-lo a zero de cada vez que encontras um caracter que é diferente do que está à procura.

Pegando no exemplo que deste, {1,2,2,2,3,2}, quando estás à procura do 2, e encontras o 3, tens o f com o valor 3 (correcto, já que já encontraste o 2, 3 vezes), mas ao comparares com o 3, como são diferentes, pões o contador a zero outra vez. Quando chegas ao último 2, o contador está a 0, por isso em vez de te contar como uma 4.ª ocorrência do 2, vai contar como a primeira.

Share this post


Link to post
Share on other sites
Dioguex

Flinger, percebi muito bem o que me disseste e faz todo o sentido claro, sempre que há um número novo o f começa do 0. Mas já dei voltas e voltas e não estou a conseguir alterar essa situação na minha estrutura, estou a fazer algo mal e não consigo perceber o que.

O output que me dá, e faz todo o sentido é este:

ocorrencia detectada para o valor 1 : freq = 1

ocorrencia detectada para o valor 2 : freq = 0

ocorrencia detectada para o valor 2 : freq = 0

ocorrencia detectada para o valor 2 : freq = 0

ocorrencia detectada para o valor 3 : freq = 0

ocorrencia detectada para o valor 2 : freq = 0

ocorrencia detectada para o valor 1 : freq = 0

ocorrencia detectada para o valor 2 : freq = 1

ocorrencia detectada para o valor 2 : freq = 2

ocorrencia detectada para o valor 2 : freq = 3

ocorrencia detectada para o valor 3 : freq = 0

ocorrencia detectada para o valor 2 : freq = 1

ocorrencia detectada para o valor 1 : freq = 0

ocorrencia detectada para o valor 2 : freq = 1

ocorrencia detectada para o valor 2 : freq = 2

ocorrencia detectada para o valor 2 : freq = 3

ocorrencia detectada para o valor 3 : freq = 0

ocorrencia detectada para o valor 2 : freq = 1

ocorrencia detectada para o valor 1 : freq = 0

ocorrencia detectada para o valor 2 : freq = 1

ocorrencia detectada para o valor 2 : freq = 2

ocorrencia detectada para o valor 2 : freq = 3

ocorrencia detectada para o valor 3 : freq = 0

ocorrencia detectada para o valor 2 : freq = 1

ocorrencia detectada para o valor 1 : freq = 0

ocorrencia detectada para o valor 2 : freq = 0

ocorrencia detectada para o valor 2 : freq = 0

ocorrencia detectada para o valor 2 : freq = 0

ocorrencia detectada para o valor 3 : freq = 1

ocorrencia detectada para o valor 2 : freq = 0

ocorrencia detectada para o valor 1 : freq = 0

ocorrencia detectada para o valor 2 : freq = 1

ocorrencia detectada para o valor 2 : freq = 2

ocorrencia detectada para o valor 2 : freq = 3

ocorrencia detectada para o valor 3 : freq = 0

ocorrencia detectada para o valor 2 : freq = 1

O elemento com mais frequência é: 2 - Aparece 3 vezes

Ou seja, quando o valor 2 é 3, de seguida o f passa a 0 e quando volta a ser 2 é 1. Ou seja, antes do valor ser 3, eu tenho que guardar o f numa outra variável, e verificar se voltar a aparecer valores iguais, se sim, incremento a nova variável certo?

Share this post


Link to post
Share on other sites
Flinger

Nem por isso.

Vamos isolar a segunda iteração do for (i = 0; i < t; i++)

em que a é 2

ocorrencia detectada para o valor 1 : freq = 0 => certo, ainda não detectaste nenhum 2

ocorrencia detectada para o valor 2 : freq = 1 => certo, já detectaste um 2

ocorrencia detectada para o valor 2 : freq = 2 => certo, já detectaste dois 2

ocorrencia detectada para o valor 2 : freq = 3 => certo, já detectaste três 2

ocorrencia detectada para o valor 3 : freq = 0 => ??? quantos 2 detectaste até agora? Porque é que volta a zero se ainda não acabou de correr o array?

ocorrencia detectada para o valor 2 : freq = 1

Edited by Flinger

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.