Ir ao conteúdo
  • Cadastre-se

Problema com algoritmo de moda


Ronrow
Ir à solução Resolvido por dontpanic,

Posts recomendados

Preciso criar um programa pra ler um vetor de 10 posições , o programa deve informar a media e a moda, ai que cheguei em um problema, não consigo calcular a moda no C#, ele da um erro na hora de verificar se o int do vetor é igual. Pra ficar mais fácil de entender meu problema, segue o codigo

 

O erro em si não aparece no visual studio, a não ser que execute o programa no console.

 

Erro na Linha 57 if(a[x] == a[y])  

using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading.Tasks;namespace Exercicio_2_P2{    class Program    {        static void Main(string[] args)        {            const int q = 10;            int[] a = new int[q];            int x , y;            int soma = 0, contx = 1, conty = 0, moda= -1;            Console.WriteLine("------------Digite 10 valores para preencher o vetor--------------");            Console.WriteLine("============Será calculado a media e a moda do vetor==============");            for (x = 0; x < a.Length; x++)            {                Console.Write("valor da pocição [" + x + "] = ");                a[x] = int.Parse(Console.ReadLine());            }                         Console.Write("\nO vetor digitado e: ");            for (y = 0; y < a.Length; y++)            {                Console.Write(a[y] + " ");            }            Console.Write("\n\nA media do vetor é:  ");            for (y = 0; y < a.Length; y++)            {                soma = soma + a[y];                            }            int media = soma / 10;                        Console.Write(media);            ///moda não funciona            for (x = 0; x < q; x++)            {                contx = 1;                for (y = q-1; y >= 0; y--)                {                    if (x == y)                    {                        y--;                        if (a[x] == a[y])                        {                            contx++;                            if (contx > conty)                            {                                moda = a[x];                            }                        }                    }                }                if (contx > conty)                {                    moda = a[x];                }            }            if (moda == -1)            {                Console.Write("\nnão existe moda: ");            }            else            {                Console.Write("\na moda é:" + moda);            }            Console.ReadKey();        }    }}
Link para o comentário
Compartilhar em outros sites

  • Solução

for (x = 0; x < q; x++) {    contx = 1;    for (y = q-1; y >= 0; y--) {        if (x == y) {            y--;            if (a[x] == a[y])            ...
No primeiro loop do FOR exterior, x vai ser igual a zero.

No último loop do FOR interior, y também vai ser igual a zero.

O primeiro IF vai dar true (0 == 0), em seguida você vai transformar o teu "y" em -1 (y--).

Daí você vai estar acessando a[0] e a[-1] no segundo IF. Daí o erro.

Link para o comentário
Compartilhar em outros sites

for (x = 0; x < q; x++) {    contx = 1;    for (y = q-1; y >= 0; y--) {        if (x == y) {            y--;            if (a[x] == a[y])            ...

No primeiro loop do FOR exterior, x vai ser igual a zero.

No último loop do FOR interior, y também vai ser igual a zero.

O primeiro IF vai dar true (0 == 0), em seguida você vai transformar o teu "y" em -1 (y--).

Daí você vai estar acessando a[0] e a[-1] no segundo IF. Daí o erro

 

eu até entendi, mas ainda não consegui resolver o problema, não sei muito sobre, se puder dar uma dica pra solucionar o problema ficaria grato.

Link para o comentário
Compartilhar em outros sites

Moda de um conjunto de dados é o valor mais frequente do conjunto, certo?

Então basta você fazer uma função que retorna a frequencia de um elemento do conjunto, depois faz um FOR com o teu conjunto testando quem tem a frequencia maior.

Eu não sei muito bem a sintaxe do C#, mas a lógica desse algoritmo seria algo assim:

 

int getFrequencia(int[] conjunto, int elemento) {    int freq = 0;    for (int x = 0; x < conjunto.Lenght; x++)        if (conjunto[x] == conjunto[elemento]) freq++;    return freq;}...// main:int ElemComMaiorFreq = 0;for (int x = 1; x < conjunto.Lenght; x++)    if (getFrequencia(conjunto, x) > getFrequencia(conjunto, ElemComMaiorFreq))        ElemComMaiorFreq = x;// A moda vai ser igual ao valor de conjunto[ElemComMaiorFreq].
Link para o comentário
Compartilhar em outros sites

Visitante
Este tópico está impedido de receber novas respostas.

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...

 

GRÁTIS: ebook Redes Wi-Fi – 2ª Edição

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!