Ir ao conteúdo
  • Cadastre-se

C Pior e Melhor nota em um único printf


Noobia

Posts recomendados

Boa tarde! 😼 Por favor, eu estou com uma dúvida muito grande em relação a um programa que eu precisava fazer! Ele se divide em três partes, mas receio que esta seja a única parte que está sendo díficil pra mim.

 

Então, o programa irá pedir 15 notas diferentes de 15 diferentes atletas, e então, o programa deverá mostrar qual é a pior e qual é a melhor nota dentre essas 15, porém, eu não consigo chegar onde eu quero!

Obs: eu não aprendi vetor ainda, eu gostaria de resolver esse exercício sem o mesmo

Eu tentei de diversos modos diferentes, o que eu fiz abaixo está longe de ser do jeito que eu queria que aparecesse.
Aliás, eu conseguiria fazer isso se fosse somente com dois valores, mas não sei o que fazer agora que são 15 valores 🥺

 

#include <stdio.h>
#include <stdlib.h>
#include <locale.h>
int main ()
{
	setlocale (LC_ALL , "Portuguese");
	
	
	int atleta; 
	float at1, at2, at3, at4, at5, at6, at7, at8, at9, at10, at11, at12, at13, at14, at15, media;
	
	
	printf ("Informe a nota do primeiro atleta: ");
	scanf ("%f", &at1 );
	
	printf ("Informe a nota do segundo atleta: ");
	scanf ("%f", &at2 );
	
	printf ("Informe a nota do teceiro atleta: ");
	scanf ("%f", &at3 );
	
	printf ("Informe a nota do quarto atleta: ");
	scanf ("%f", &at4 );
	
	printf ("Informe a nota do quinto atleta: ");
	scanf ("%f", &at5 );
	
	printf ("Informe a nota do sexto atleta: ");
	scanf ("%f", &at6 );
	
	printf ("Informe a nota do sétimo atleta: ");
	scanf ("%f", &at7 );
	
	printf ("Informe a nota do oitavo atleta: ");
	scanf ("%f", &at8 );
	
	printf ("Informe a nota do nono atleta: ");
	scanf ("%f", &at9 );
	
	printf ("Informe a nota do décimo atleta: ");
	scanf ("%f", &at10 );
	
	printf ("Informe a nota do décimo primeiro atleta: ");
	scanf ("%f", &at11 );
	
	printf ("Informe a nota do décimo segundo atleta: ");
	scanf ("%f", &at12 );
	
	printf ("Informe a nota do décimo terceiro atleta: ");
	scanf ("%f", &at13 );
	
	printf ("Informe a nota do décimo quarto atleta: ");
	scanf ("%f", &at14 );
	
	printf ("Informe a nota do décimo quinto atleta: ");
	scanf ("%f", &at15 );
  
    	printf ("Vou mostrar a melhor e a pior nota. ");
      
	  if (at1 >at2 || at1 >at3  || at1 >at4  || at1 >at5  || at1 >at6 || at1 >at7 || at1 >at8 || at1 >at9 || at1 > at10 || at1 >at11  || at1 >at12 || at1 >at13 || at1 >at14 || at1 >at15)
      {
      	printf ("A nota do primeiro nadador é a melhor.");
	  }
      
	  if (at1 <at2 || at1 <at3  || at1 <at4  || at1 <at5  || at1 <at6 || at1 <at7 || at1 <at8 || at1 <at9 || at1  <at10 || at1 <at11  || at1 <at12 || at1 <at13 || at1 <at14 || at1 <at15)
      {
        printf ("A nota do primeiro nadador é a pior.");
      }
   
  //se fosse pra fazer desse jeito, eu teria que fazer dois ifs pra cada at, mas não acredito que saíria do jeito que eu quero
  //na realidade eu queria mostrar em um único printf a maior e a menor nota juntas, mas não consigo fazer isso :(
      
  
	return 0;
}

 

 

  • Obrigado 1
Link para o comentário
Compartilhar em outros sites

Esse é um exercício de ciclos (while, for, ou do while) e deve usar um ciclo para resolver.

 

A ideia básica é fazer um ciclo que repete várias vezes a pergunta pedindo a nota do n-ésimo atleta, dentro do ciclo deve guardar em uma variável a maior nota, e em outra variável no número do atleta com a maior nota, e também a menor nota, e em outra variável o número do atleta com a menor nota.

 

Note que isso é um exercício de máximo e mínimo, o que significa que inicialmente pode simplesmente admitir que o primeiro valor do primeiro atleta é tanto a maior quanto a menor nota de todos os atletas, e a partir do segundo atleta basta comparar com os valores guardados atualmente como maior ou menor, e então substituir se aparecer um novo valor maior que o maior atual (ou um valor menor que o menor atual).

  • Curtir 1
  • Amei 1
Link para o comentário
Compartilhar em outros sites

Se a finalidade do seu programa é encontrar somente o maior e o menor valor de um X numerosentrados por teclado você só precisa de 3 variáveis, n, maior e menor.

Basicamente é pegar n e comparar com maior(if(n>maior)), se for maior(verdadeiro) então atribuímos n a maior.
O mesmo acontece com menor, se n menor que menor(if(n<menor)) atribuimos n a menor. Praticamente repetimos isso 15 vezes dentro de um for, e no final imprimir menor e maior.

  • Curtir 1
  • Amei 1
Link para o comentário
Compartilhar em outros sites

@Noobia Você poderia criar um if para saber a maior nota logo de inicio: 

float nota(supondo que seja uma nota com virgula) = 0;

float maiornota = 0;

você pode dar scanf e, a cada nota, pode fazer: if(nota>maiornota){ maiornota = nota;}

só nisso você já vai saber a maior ^^

vou deixar esse raciocinio ai e tente pensar como fazer a da menor nota, boa sorte.

  • Curtir 1
  • Amei 1
Link para o comentário
Compartilhar em outros sites

para ficar mais fácil os passos são:
declarar n, maior = 0, menor = 32000
//repetir 15 vezes
-ler nota e atribuir a n
-comparar n com "maior", se n for maior que a variável "maior", atribuir n a maior
-comparar n com "menor", se n for menor que a variável "menor", atribuir n a "menor"

  • Curtir 1
  • Amei 1
Link para o comentário
Compartilhar em outros sites

@vangodp Também precisa guardar quais foram os atletas com maior e menor notas.

 

Eu sugiro passos um pouco diferentes:

 

declarar n, maior, atletamaior, menor, atletamenor

ler nota do primeiro atleta e atribuir a n

maior é a nota do primeiro atleta, menor nota é a nota do primeiro atleta, o primeiro atleta é o atletamaior e o atletamenor

>> Repete 14 vezes

-ler nota e atribuir a n
-comparar n com "maior", se n for maior que a variável "maior", atribuir n a maior e o número do atleta ao atletamaior
-comparar n com "menor", se n for menor que a variável "menor", atribuir n a "menor" e o número do atleta ao atletamenor

<<

  • Curtir 2
  • Amei 1
Link para o comentário
Compartilhar em outros sites

tem outras coisas a tomar em conta. por exemplo que rango de valores vai tomar esse numero que vai ser pedido por teclado. um int aceita de -2147483648 a 2147483647 ou seja, negativos e positivos, seu programa vai aceitar negativos?

adicionado 2 minutos depois

Se seu programa aceitar negativos você pode fazer a declaração de maior e menor assim:
int menor = -2147483648;
int maior =  2147483647;

Se seu programa não aceitar negativos vai ter mais problemas ainda porque um int sempre vai aceitar negativos

adicionado 4 minutos depois

Também tem outra solução no caso de não aceitar negativos. Trata-se de declarar inteiros sem sinal
 

adicionado 16 minutos depois
#include <stdio.h>
#include <limits.h>


int main() {
    //int menor = -2147483648;
    //int maior =  2147483647;
    
    //Da seguinte forma você precisa incluir limits.h
    int menor = INT_MIN; // É a mesma coisa que dizer int menor = -2147483648.  
    int maior = INT_MAX; // É a mesma coisa que dizer int maior =  2147483647.

    return 0;
}

por que esses valores? Por causa que um int só aguenta esses valores:
Untitled.png.1c64bfc267e1d48512f95bb6b7b055e2.png
dai se não levar números negativos precisaria usar unsigned int. E seria assim:
 

adicionado 18 minutos depois
#include <stdio.h>
#include <limits.h>


int main() {
    unsigned int menor = UINT_MAX; // UINT_MAX é maximo valor que aguenta um unsigned int 4294967295, praticamente o dobro que int, mas n aceita negativos
    unsigned int maior = 0;

    return 0;
}

 

adicionado 22 minutos depois

Para poder ler inteiros sem sinal(unsigned int) se faz assim:

#include <stdio.h>
#include <limits.h>


int main() {
    unsigned int n;
    unsigned int menor = UINT_MAX; // UINT_MAX é maximo valor que aguenta um unsigned int 4294967295, praticamente o dobro que int, mas n aceita negativos
    unsigned int maior = 0;

    
    //para poder ler
    scanf("%u", &n);//prove 4294967295
    
    printf("%u", n);
    
    
    return 0;
}

 

adicionado 23 minutos depois

note que em vez de %d se usa %u tanto no scanf como no printf, isso aguenta numeros de 0 a 4.294.967.295

adicionado 26 minutos depois

é o dobro do que agüenta int, mas n permite usar negativos. Na realidade sim agüenta, mais vai mostrar números estranhos. tente somar 1 a 4294967295, tipo, na hora de ler entre com 4294967296. Vai imprimir um bonito zero shuehsuehsushue

adicionado 42 minutos depois

O unsigned int é o denominado "número natural".
Um número natural é um número inteiro não negativo N = { 0 , 1 , 2 , … }
Só que um unsigned int é mais ou menos assim: unsigned int = { 0 , 1 , 2 , … , 4294967295}, ou seja, por enquanto que um numero natural não tem limite, o unsigned int sim tem limite, isso é assim porque a memória do computador é limitada, uma variável é só um pedaço da memoria, e por isso é limitada. Que acontece se tento estourar essa capacidade? Somar 1 a 4294967295 que acontece? Voltamos a ZERO!!! Por quê???? Porque acontece isso:
Screenshot_3.jpg.3204014622bf3cc641facbabf1cb6e9a.jpg

imagina que você tem
0 , 1 , 2 , … , 4294967295
E ao lado dos números aos extremos você tem
...4294967295, 0 , 1 , 2 , … , 4294967295, 0...

 

adicionado 58 minutos depois

Por isso se diz que um unsigned int só suporta de 0 a 4294967295, por que se eu somar -1 a zero vai cair no 4294967295, e se eu somar 1 a 4294967295. De fato você pode somar o que quiser a Zero e 4294967295, só que você sempre estará entre Zero e 4294967295, por que você esta praticamente em laço. em outras palavras unsigned int é isso:
Screenshot_4.jpg.aea1b8d7f5f8e05e3af10411f028617d.jpg

  • Curtir 2
  • Obrigado 1
  • Amei 1
Link para o comentário
Compartilhar em outros sites

  • 3 semanas depois...

Oi gente! Desculpa pela demora, eu acabei tendo que desenvolver outros programas na frente e acabou atrapalhando tudo.. Eu meio que consegui chegar em uma lógica, mas está dando diversos erros nesse código, o que poderia ser?

 

#include <stdio.h>
#include <stdlib.h>
#include <locale.h>
int main ()
{
	setlocale (LC_ALL, "Portuguese");
	char resp;
	int nadador, contnad=0, idade, somanad, qntdnad++, nota=0, melhor=0;
    float media;
	
	do
	{
		printf ("Digite uma nota: ");
		scanf ("%d", &nota);
		
		qntdnad++;
		
		if (nota > melhor)
		{
			melhor = nota;
			
		}
		
		printf ("Tem mais um nadador? : ");
		scanf (" %c", &resp);
		
	} while (resp == 's');
	
	media = somanad / qtdnad;
	
	
	printf ("O nadador com a melhor nota é o com a nota de %i.\n", melhor);
	
	printf ("O nadador com a pior nota teve uma nota de %i\n", pior);
	
	printf ("A média de pontos é de %.2f\n", media);
	
	return 0;
}

 

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

@Noobia Oi, tudo bem? Então, eu vejo alguns problemas no seu código, vou tentar comentar sobre cada separadamente : 

int nadador, contnad=0, idade, somanad, qntdnad++, nota=0, melhor=0; //aqui você está adicionando 1 a variavel que está sendo declarada, você precisa declarar ela para depois acrescentar.
int nadador, contnad=0, idade, somanad, qntdnad, nota=0, melhor=0; //ficaria assim
media = somanad / qtdnad; // o nome da variável está errado 
media = somanad / qntdnad; // mesmo consertando ainda teremos dois problemas: 
// Primeiro que a variável somanad nunca foi acrescentadando as notas recebidas durante o código. Sempre que o usuário inserir uma nota adicione a variável!
// Segundo que ambas são int que no caso se o resultado fosse 9.5 o retorno seria 9, se você quer consertar isso:
// Solução para isso seria declarar as variáveis somanad e qntdnad em floats ao invés de int.
float somanad, qntdnad;
printf ("O nadador com a pior nota teve uma nota de %i\n", pior); // aqui você está utilizando uma variável(pior) que você nunca declarou

Se ainda ocorrer algum problema, ou ainda tiver alguma dúvida, sinta-se livre para perguntar! 

Abraços.

  • Curtir 1
  • Obrigado 1
Link para o comentário
Compartilhar em outros sites

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