Jump to content

[Resolvido] Encontrar 3 maiores numeros


askazy
 Share

Recommended Posts

Bom estou fazendo uma lista da faculdade, e tenho esse exercício para fazer.

Dado "n" números, encontre os 3 maiores, fiz da seguinte maneira.

#include <stdio.h>
int main (){
 float num,um=0,dois=0,tres=0;
 int i,n;
 scanf ("%d",&n);
	 for (i=1;i<=n;i++){
	 scanf ("%f",&num);
		 if (num >= um){
		 dois=um;
		 tres=dois;
		 um=num;
		 }
			 else{
			 if (num>=dois){
				 tres=dois;
					 dois=num;
			 }
					 else if (num >= tres)
					 tres=num;
			 }
	 }
	 printf ("%.2f %.2f %.2f\n",um,dois,tres);
return 0;
}

Não sei se esse seria a melhor maneira de fazer, mas foi a que encontrei, se alguém souber outra solução mais prática. Minha maior dúvida é se em uma prova eu tivesse que achar por exemplo os 10 maiores de uma sequência de "n" números, teria que usar vetor ou tem um modo alternativo?

Link to comment
Share on other sites

se em uma prova eu tivesse que achar por exemplo os 10 maiores de uma sequência de "n" números, teria que usar vetor ou tem um modo alternativo?

obviamente terias de arranjar outra solução, seja com arrays ou outra estrutura qualquer.

no entanto, esse tipo de código está ainda fora dos teus conhecimentos

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

#define BUFFER_SIZE 256

int compare(const void * a, const void * b) {
 return *(double *)b - *(double *)a;
}

int main(void) {
 char buffer[bUFFER_SIZE] = {0};
 double * numbers = NULL;
 size_t i = 0, n = 0, m = 0;

 // ciclo de leitura do número de valores a serem inseridos
 do {
   // mensagem de pedido ao utilizador
   printf("Insira o numero total de valores a considerar (min: 3) : ");
   // forcar a apresentação da mensagem
   fflush(stdout);
   // ler do teclado para um buffer e ler o valor do buffer se sucesso
   if (fgets(buffer, BUFFER_SIZE, stdin))
     sscanf(buffer, "%lu", &n);
 // forçar que o número lido seja pelo menos 3
 } while (n < 3);

 // reservar memória para guardar os números
 if ((numbers = malloc(sizeof(double) * n)) == NULL) {
   // apresentar erro e sair
   fprintf(stderr, "Erro de alocacao de memoria");
   return -1;
 }

 // ciclo de leitura do número de maiores valores inseridos
 do {
   // mensagem de pedido ao utilizador
   printf("Insira o numero de maiores valores inseridos a apresentar (min: 1, max: %lu) : ", n);
   // forcar a apresentação da mensagem
   fflush(stdout);
   // ler do teclado para um buffer e ler o valor do buffer se sucesso
   if (fgets(buffer, BUFFER_SIZE, stdin))
     sscanf(buffer, "%lu", &m);
 // forçar que o número lido seja pelo menos 1 e menor que o número de valores existentes
 } while (m < 1 || m > n);

 // ler os valores
 for (i = 0; i < n; ++i) {
   // mensagem de pedido ao utilizador
   printf("Insira o valor (%lu) : ", i);
   // forcar a apresentação da mensagem
   fflush(stdout);
   // ler do teclado para um buffer e ler o valor do buffer se sucesso
   if (fgets(buffer, BUFFER_SIZE, stdin))
     sscanf(buffer, "%lf", &numbers[i]);
 }

 // ordenar os valores
 qsort(numbers, n, sizeof(double), compare);

 // ciclo de apresentação dos maiores 'm' valores
 for (i = 0; i < m; ++i)
   printf("%lf ", numbers[i]);
 printf("\n");

 // libertar a memória alocada
 free(numbers);

 return 0;
}
Edited by HappyHippyHippo
IRC : sim, é algo que ainda existe >> #p@p
Link to comment
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
 Share

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