Dioguex Posted October 16, 2013 at 03:10 PM Report #529232 Posted October 16, 2013 at 03:10 PM (edited) 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 October 16, 2013 at 04:45 PM by thoga31 GeSHi
HappyHippyHippo Posted October 16, 2013 at 03:19 PM Report #529236 Posted October 16, 2013 at 03:19 PM 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 Portugol Plus
Dioguex Posted October 16, 2013 at 03:32 PM Author Report #529245 Posted October 16, 2013 at 03:32 PM 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
nelsonr Posted October 16, 2013 at 04:00 PM Report #529250 Posted October 16, 2013 at 04:00 PM (edited) Talvez criar um array auxiliar em que adicionas cada elemento unico, com um contador para o numero de vezes encontrado Edited October 16, 2013 at 04:02 PM by nelsonr
HappyHippyHippo Posted October 16, 2013 at 04:37 PM Report #529262 Posted October 16, 2013 at 04:37 PM mais ou menos IRC : sim, é algo que ainda existe >> #p@p Portugol Plus
Dioguex Posted October 17, 2013 at 09:42 AM Author Report #529353 Posted October 17, 2013 at 09:42 AM (edited) 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 October 17, 2013 at 08:41 PM by thoga31 GeSHi
HappyHippyHippo Posted October 17, 2013 at 09:54 AM Report #529355 Posted October 17, 2013 at 09:54 AM (edited) 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 October 17, 2013 at 09:56 AM by HappyHippyHippo IRC : sim, é algo que ainda existe >> #p@p Portugol Plus
Flinger Posted October 17, 2013 at 10:00 AM Report #529356 Posted October 17, 2013 at 10:00 AM 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++)).
Dioguex Posted October 17, 2013 at 10:08 AM Author Report #529358 Posted October 17, 2013 at 10:08 AM 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.
HappyHippyHippo Posted October 17, 2013 at 10:10 AM Report #529359 Posted October 17, 2013 at 10:10 AM if (f>fmax){ // qual o valor de f na primeira passagem ? e na segunda ? IRC : sim, é algo que ainda existe >> #p@p Portugol Plus
Dioguex Posted October 17, 2013 at 10:13 AM Author Report #529360 Posted October 17, 2013 at 10:13 AM (edited) 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 October 17, 2013 at 10:14 AM by Dioguex
Flinger Posted October 17, 2013 at 10:23 AM Report #529362 Posted October 17, 2013 at 10:23 AM 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?
HappyHippyHippo Posted October 17, 2013 at 10:26 AM Report #529364 Posted October 17, 2013 at 10:26 AM (edited) 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 October 17, 2013 at 10:26 AM by HappyHippyHippo IRC : sim, é algo que ainda existe >> #p@p Portugol Plus
Dioguex Posted October 17, 2013 at 10:46 AM Author Report #529368 Posted October 17, 2013 at 10:46 AM (edited) 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 October 17, 2013 at 10:47 AM by Dioguex
Dioguex Posted October 17, 2013 at 11:09 AM Author Report #529376 Posted October 17, 2013 at 11:09 AM (edited) 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 October 17, 2013 at 08:41 PM by thoga31 GeSHi
HappyHippyHippo Posted October 17, 2013 at 11:11 AM Report #529377 Posted October 17, 2013 at 11:11 AM porque o f=0 está mal IRC : sim, é algo que ainda existe >> #p@p Portugol Plus
Flinger Posted October 17, 2013 at 01:17 PM Report #529401 Posted October 17, 2013 at 01:17 PM 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.
Dioguex Posted October 17, 2013 at 02:28 PM Author Report #529416 Posted October 17, 2013 at 02:28 PM 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?
Flinger Posted October 17, 2013 at 03:27 PM Report #529422 Posted October 17, 2013 at 03:27 PM (edited) 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 October 17, 2013 at 03:28 PM by Flinger
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now