Ir ao conteúdo

Posts recomendados

Postado

Olá, gente!

Estou tendo dificuldade para finalizar o meu código, pois nele está ocorrendo dois problemas:

1. Se eu entrar com todos os valores no vetor valendo zero, o código imprime: 0 1

2. Se eu entrar com todos os valores diferentes no vetor, ou seja, sem apresentar uma moda, o código imprime: 1 1

 

#include <stdio.h>
#define MAX 100000

 int main()
{
	int i, j, tamanho, vetor[MAX], aux, moda, cont1=0, cont2=-1;
	
	scanf("%d", &tamanho);	// LEITURA DOS VALORES DO VETOR		
	for(i=0; i<tamanho; i++){	
		scanf("%d", &vetor[i]);
	}
	
	for(i=0; i<tamanho; i++){ 	// ALGORITMO PARA ORGANIZAR O VETOR EM ORDEM CRESCENTE
		for(j=i+1; j<tamanho; j++){
			if(vetor[i]>vetor[j]){
				aux = vetor[j];
				vetor[j] = vetor[i];
				vetor[i] = aux;
			}
		}	
	}
	
	for(i=0; i<tamanho; i++){ 	// ALGORITMO PARA ENCONTRAR A MODA E A FREQUÊNCIA
		for(j=i+1; j<tamanho; j++){
			if(vetor[i]==vetor[j] && vetor[i]!=vetor[i-1]){
				cont1++;
			}
		}
		if(cont1>cont2){
			moda = vetor[i];
			cont2 = cont1;
			cont1 = 0;	
		}
	}

	printf("%d\n%d\n", moda, cont2+1);	
  return 0;
}

 

Um exemplo de resposta que foi dado pela questão:

Entrada
10
1
7
4
29
7
4
7
8
7
29
Saída
7
4

Postado

Seu programa  tem muitos problemas, talvez pela maneira como devem estar ensinando isso.


Vou listar alguns.

 

Antes de tudo veja que
 

    for (i = 0; i < tamanho; i++)
    {  // ALGORITMO PARA ENCONTRAR A MODA E A FREQUÊNCIA
        for (j = i + 1; j < tamanho; j++)
        {
            if (vetor[i] == vetor[j] && vetor[i] != vetor[i - 1])
            {
                cont1++;
            }
        }
        if (cont1 > cont2)
        {
            moda  = vetor[i];
            cont2 = cont1;
            cont1 = 0;
        }
    }

    printf("%d\n%d\n", moda, cont2 + 1);

 

2 horas atrás, gabriel_gcb disse:

Se eu entrar com todos os valores diferentes no vetor, ou seja, sem apresentar uma moda, o código imprime: 1 1

 

Pois é: para o seu programa não existe esse lance de não apresentar uma moda, já que o printf() está fora do loop e não tem um teste para saber se identificou ou não uma moda.

 

moda é uma medida meio besta. Se todos os valores são diferentes a moda pode ser qualquer um. Mas a literatura diz que não existe moda. Mas e se forem 6 elementos e dentro dele só tiverem 3 valores, como { 1,1,2,2,3,3 }? Em alguns lugares se diz que a moda é um conjunto e vai ser { 1,2,3 }.

 

Então em que ponto a moda deixa de existir? 

 

De volta ao seu programa

 

#define MAX 100000

 

Acho que sabe que isso é difícil de ler, ficar contando os zeros. Prefira 
 

#define MAX 100 * 1000

 

que é muito mais fácil de ler e vai gerar o mesmo código, já que o compilador sabe fazer as contas. Outras linguagens como português (100.000), java (100,000) e C++ (100'000) tem separadores de dígitos, mas C não tem.

 

    int i, j, tamanho, vetor[MAX], aux, moda, cont1 = 0, cont2 = -1;

 

Declare uma variável por linha. É grátis e muito mais seguro e fácil de ler.

 

Entenda que está declarando aí 
 

	int		vetor[100 * 1000];

 

Se um int na sua plataforma ocupar 4 bytes então tem um um vetor estático de quase  400K. Seu compilador não reclamou de nada? Consegue compilar isso num compilador online? Em geral o espaço para as variáveis, o espaço total, é uma fração disso.

 

O padrão do MSVC por exemplo é de super modestos 16K. Claro que pode aumentar, mas não há propósito em declarar 100.000 deles se pretende digitar na hora de rodar o programa


1681165840_CapturadeTela(48).png.f1ffc743522e4879e06ab1d61bdecbd2.png

 

Mais sobre o programa

 

  • nunca use variáveis com nomes assim ingênuos como i,j,aux globais em main(). Isso sempre vai cair na sua cabeça.
  • declare as variáveis de controle do loop no loop. Levou anos para corrigir isso em C, só que foi corrigido há 40 anos.
  • TESTE o retorno de scanf(). Sempre. É ingênuo seguir se não leu
  • Use funções. Notou que sequer mostrou o vetor lido ou o vetor classificado? Seria bom fazer isso para se sentir mais seguro em relação ao que está fazendo. Use uma função para mostrar o vetor, outra classificar, outra para calcular os parâmetros estatísticos
  • se vai ler o vetor e sabe que vai classificar os dados considere inserir já em ordem no vetor. É muito mais simples. Assim que termina de ler já estão em ordem
  • NUNCA escreva um programa interativo. Só vai perder tempo. Não acha um p0rr3 ficar digitando um vetor TODA vez que for testar seu programa?... ;)

Exemplo:
 

2 horas atrás, gabriel_gcb disse:

Um exemplo de resposta que foi dado pela questão:

Entrada
10
1
7
4
29
7
4
7
8
7
29

 

Você postou isso. Agora considere

 

    int vetor[] = {1, 7, 4, 29, 7, 4, 7, 8, 7, 29};
    int tamanho  = sizeof(vetor)/sizeof(vetor[0]);

 

Isso é a mesma coisa. Não seria MUITO melhor testar seu programa com isso até dar o resultado que você já tem: 7 4?

 

Depois que estiver funcionando você coloca a leitura. É mais simples. Muito mais simples. E pode colocar os casos de teste ali também, usando o popular comentário.

 

Exemplo

 

    int vetor[] = {0, 0, 0, 0, 0};
    //int vetor[] = {0, 0, 2, 2 };
    //int vetor[] = {1, 7, 4, 29, 7, 4, 7, 8, 7, 29};
    int tamanho  = sizeof(vetor)/sizeof(vetor[0]);

 

E você pode ir testando rápido algumas condições.

 

Exemplo

 

    for (int i = 0; i < tamanho; i++)
    {
        for (int j = i + 1; j < tamanho; j++)
        {
            if (vetor[i] > vetor[j])
            {
                int aux  = vetor[j];
                vetor[j] = vetor[i];
                vetor[i] = aux;
            }
        }
    }

 

Veja como é mais seguro declarar i,j e aux aí dentro: não precisa sair pelo programa afora procurando se em algum outro lugar vai usar i j ou aux... Nem todos seus programas vão ter 30 linhas.

 

  • Comente o que está fazendo, em especial comente o modo como está fazendo algo. Mas talvez possa evitar comentários óbvios como "ALGORITMO PARA ENCONTRAR A MODA E A FREQUÊNCIA"
  • Evite acentos em comentários. Nada acrescentam e nem sempre saem na tela.
  • use nomes mais expressivos. con1 e cont2, i,j e aux não são assim explicativos.
  • inicialize todas as variáveis
  • se não fez isso, habilite TODOS os avisos do compilador

Exemplo (de novo)
 

    for (i = 0; i < tamanho; i++)
    {  // ALGORITMO PARA ENCONTRAR A MODA E A FREQUÊNCIA
        for (j = i + 1; j < tamanho; j++)
        {
            if (vetor[i] == vetor[j] && vetor[i] != vetor[i - 1])
            {
                cont1++;
            }
        }
        if (cont1 > cont2)
        {
            moda  = vetor[i];
            cont2 = cont1;
            cont1 = 0;
        }
    }

    printf("%d\n%d\n", moda, cont2 + 1);

 

moda não foi inicializado na declaração. Só vai ser alterado dentro daquele if e o compilador não sabe se o programa sempre vai passar por lá. Isso quer dizer que o printf() vai acessar uma variável que pode não ter sido inicializada. E o compilador deveria ter te avisado. E você não deveria ter escrito assim, de qualquer forma.

 

Seu comentário aqui não expressa a situação: está calculando a moda e a frequência DA MODA em um vetor já classificado. Acho que era isso que o comentário deveria ressaltar. E o algoritmo parece confuso. Não testei de fato.

 

 

 

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

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

LANÇAMENTO!

eletronica2025-popup.jpg


CLIQUE AQUI E BAIXE AGORA MESMO!