Ir ao conteúdo

Posts recomendados

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

/* faça um programa que leia um valor N e crie dinamicamente um vetor 
de N elementos e informe a média, o maior e o menor dos valores fornecidos
pelo usuário. Além disso, antes de finalizar o programa, deve-se liberar a área
de memória alocada.  */

int main(int argc, char *argv[]) {
	
	int q, i, n, soma=0, maior=0, menor=0;
	float media;
	int *p;
	
	
	
	printf("Digite a quantidade de elementos: ");
	scanf("%i", &q);
	
	p = (int *)malloc(q*sizeof(int));
	
	for(i=1;i<=q;i++){
		printf("\nDigite o numero para o indice [%i]: ", i);
		scanf("%i", &p[i]);
		soma=soma+p[i];
		if(p[i] < menor){
			menor = p[i];
		}else{
			if(p[i] > maior){
				maior = p[i];
			}
		}
	}
	
	printf("\n");
	
	for(i=1;i<=q;i++){
		printf("\nValor do elemento armazenado no indice [%i] = [%i] ", i, p[i]);
	}

	for(i=1;i<=q;i++){
		
		if(p[i] <= menor){
			menor = p[i];
		}else{
			if(p[i] > maior){
				maior = p[i];
			}
		}
	}
	
	media = soma/q;
	
	printf("\n\nA media dos valores eh igual a %.2f", media);
	
	printf("\n\nMenor elemento eh %i", menor);
	printf("\nMaior elemento eh %i", maior);
	
	free(p);
	
	return 0;
}

 

Boa noite!
Gostaria de ajuda para descobrir porque a variável menor está retornando sempre 0.

 

  • Obrigado 1
Postado

@Vitor Nata Zanetta Santos

49 minutos atrás, Vitor Nata Zanetta Santos disse:
int q, i, n, soma=0, maior=0, menor=0;

Você inicializou menor com 0, então se inserir apenas valores maiores que zero, menor vai continuar com valor 0. Você pode atribuir o primeiro elemento de `p` às variáveis `menor` e `maior` para inicializar. Faça isso na primeira passagem pelo loop: use if para verificar se o valor do índice `i` é 0.

Aliás...

49 minutos atrás, Vitor Nata Zanetta Santos disse:
for(i=1;i<=q;i++)

Vetores em C começam pelo índice 0, e o último elemento tem índice N-1.

for(i = 0; i < q; i++) { }

 

49 minutos atrás, Vitor Nata Zanetta Santos disse:
media = soma/q;

`q` ou `soma` tem que ser do tipo ponto flutuante pra que o resultado da operação seja um ponto flutuante.

float soma = 0.0f;

Caso contrário, vai ser uma média com valor inteiro.

  • Obrigado 1
Postado

@Vitor Nata Zanetta Santos    ele está retornando zero por que foi esse valor que você quis atribuir à essa variáveL menor , e durante as comparações ela não foi modificada pois já era a menor mesmo e assim no final escreve o valor dela que continua sendo zero mesmo ,  e então você pode usar muitas formas de inicializar essas duas variáveis , maior e menor ,  e uma delas pode ser com um if assim  :

scanf("%i", &p[i]);
if( i == 0 )                          /// ou sem usar INT_MAX  e INT_MIN
{
  menor = p[i];                       /// pega o primeiro valor inserido no vetor
  maior = p[i];                       /// e maior e menor recebem esse primeiro valor
}                                     /// para depois fazer as comparacoes

ou usando a biblioteca #include <limits.h> , que permite obter o menor e o maior valor de um int na linguagem C  ,  usando os comandos INT_MAX e INT_MIN ,   e seu código modificado com correções poderia ser assim  :

#include <stdio.h>
#include <stdlib.h>
#include <limits.h>
/* faça um programa que leia um valor N e crie dinamicamente um vetor
   de N elementos e informe a média, o maior e o menor dos valores fornecidos
   pelo usuário. Além disso, antes de finalizar o programa, deve-se liberar a área
   de memória alocada.
*/
int main(int argc, char *argv[])
{
  int q, i, n, soma=0,                     /// soma eh do tipo int
      maior = INT_MIN, menor = INT_MAX;    /// maior pega o menor valor possível para um int
	                                       /// menor pega o maior valor possível para um int
  float media;                             /// media eh do tipo float com casas decimais
  int *p;
  printf("Digite a quantidade de elementos: ");
  scanf("%i", &q);
  p = (int *) malloc ( q * sizeof( int ));/// a primeira posicao esta no indice zero

  for( i=0; i<q; i++ )                    /// comecando de zero aproveita um a posicao do vetor
  {
    printf("Digite o numero para o indice [%i]: ", i);
    scanf("%i", &p[i]);
    if( i == 0 )                          /// ou sem usar INT_MAX  e INT_MIN
    {
      menor = p[i];                       /// pega o primeiro valor inserido no vetor
      maior = p[i];                       /// e maior e menor recebem esse primeiro valor
    }                                     /// para depois fazer as comparacoes
    soma = soma + p[i];
    if( p[i] < menor )
    {
      menor = p[i];
    }
    else
    {
      if( p[i] > maior )
      {
        maior = p[i];
      }
    }
  }
  printf("\n");
  for( i=0; i<q; i++ ) /// normalmente os loop's comecam em Zero
  {
    printf("Valor do elemento armazenado no indice [%i] = [%i]\n", i, p[i]);
  }
  for( i=0; i<q; i++ )
  {
    if( p[i] < menor )  /// se for igual n precisa , deixa ele quieto
    {
      menor = p[i];
    }
    else
    {
      if(p[i] > maior)
      {
        maior = p[i];
      }
    }
  }
  media = (float)soma/q;  /// um Cast , converter para float
  printf("\n\n");
  printf("A media dos valores eh igual a %.2f\n\n", media);
  printf("Menor elemento      eh %i\n", menor);
  printf("Maior elemento      eh %i\n", maior);
  free(p);
  printf("\n\n\n");
  return 0;
}

 

  • Curtir 1
  • 2 anos depois...
Postado

Olá!

 

O Problema

Faça um programa que leia um valor N e crie dinamicamente um vetor 
de N elementos e informe a média, o maior e o menor dos valores fornecidos
pelo usuário. Além disso, antes de finalizar o programa, deve-se liberar a área
de memória alocada.

 

Uma análise.

Supostamente, N≥0, porque é quantia de elementos, tratando-se de leitura (Ler), o programa não segue e não finaliza enquanto não ler N.

 

Em 21/04/2022 às 20:18, Vitor Nata Zanetta Santos disse:
	printf("Digite a quantidade de elementos: ");
	scanf("%i", &q);

 

Tua expressão é mais para solicitar que leia (no caso do teclado), porque não se checa a N<0 para quantidade de elemento. Abaixo expresso, o que para mim é um ler N.

 

  while (q<0) {
    printf ("%c%s",'\r',"Entre com a quantidade de elementos: ");

    int c= getchar ();
    if (EOF==c) {
      perror ("Abortar quantidade de elementos");
      return 1;
      }
    if ('\n'==c) continue;
    ungetc (c,stdin);
    scanf ("%d",&q);
    while ('\n'!=(c= getchar ()) && EOF!=c);
    }

O fluxo não cederá enquanto N<0; ele repetirá a leitura do decimal.

 

Ate que... depois

Em 21/04/2022 às 20:18, Vitor Nata Zanetta Santos disse:
for(i=1;i<=q;i++){
		printf("\nDigite o numero para o indice [%i]: ", i);
		scanf("%i", &p[i]);
		soma=soma+p[i];
		if(p[i] < menor){
			menor = p[i];
		}else{
			if(p[i] > maior){
				maior = p[i];
			}
		}
	}

Nada disso, não é — supostamente — uma solicitação. Mas, sim, leituras!

 

***O fundamento é mesmo, não ceder até ler N dados, e incrementar somente depois de testar a leitura (Ler 1 de N).

 

 

 

  • Curtir 1

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!