Ir ao conteúdo
  • Cadastre-se

C Retornar os dois maiores valores


pedro.maciel
Ir à solução Resolvido por arfneto,

Posts recomendados

Preciso fazer um programa que retorne as 2 maiores notas. Creio que isso deva ser feito com passagem por referência, mas confesso que estou um pouco perdido. Tenho total ciência que meu código está errado, então gostaria que me dessem umas dicas de como chegar no correto

 

#include <locale.h>

float maioresnotas(float *n1, float *n2, float *n3){

    if ( ( *n1 > *n2 ) && ( *n1 > *n3 ) )
        return (*n1);
    if ( ( *n2 > *n1 ) && ( *n2 > *n3 ) )
        return (*n2);
    return (*n3);
  
  //não estou conseguindo chegar no raciocinio de como retornar 2 valores aqui


int main(){
    float n1, n2, n3;
    printf("Digite a primeira nota: ");
    scanf("%f", &n1);
    printf("Digite a segunda nota ");
    scanf("%f", &n2);
    printf("Digite a terceira nota: ");
    scanf("%f", &n3);

    maioresnotas(&n1, &n2, &n3);

    printf("\n%.1f e %.1f\n", n1, n2, n3);


}

 

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

  • Membro VIP

Você pode fazer 2 funções, uma para o maior e outra para o segundo maior.

Você também pode usar ponteiro como um tipo de retorno. Eu não sei usar ponteiros. Dê uma olhada nesse artigo:

https://www.ime.usp.br/~yoshi/2001ii/CompI/Lista/msg00016.html

 

Aqui tem um exemplo usando vetor (genial rsrs) e ponteiro.

https://pt.stackoverflow.com/questions/96059/retorno-múltiplo-em-c-c

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

@pedro.maciel Talvez isso ajude, é uma árvore de decisão:

image.png.21d92eb16194d0d32ef8301b79236641.png

 

22 minutos atrás, pedro.maciel disse:

Preciso fazer um programa que retorne as 2 maiores notas

Um "programa" que retorne as 2 maiores notas? Não quer dizer função?

Você pode fazer isso usando ponteiros mesmo, da uma olhada nesse link.

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

@pedro.maciel    seu código está bom e quase funcionando , e não precisa retornar nada ,  só se você quiser mesmo fazer isso , por algum motivo , talvez para estudos , pois os valores estarão nas próprias variáveis ao voltar para a main , e aí só escrever elas na mesma ordem que foram colocadas lá na função , e essas comparações para decidir os maiores , desse modo , são bem confusas ,  melhor usar um método de ordenação de vetores como o bubblesort  , para colocar os números em ordem decrescente , assim os maiores serão os primeiros , transferir eles para as mesmas variáveis enviadas , e seu código poderia ser assim  :

#define _CRT_SECURE_NO_WARNINGS
#include <locale.h>
#include <stdio.h>
float maioresnotas(float* n1, float* n2, float* n3)
{
    float vet[3] = { *n1,*n2,*n3 },aux;
    for(int _x=0; _x<3;_x++)
        for (int _y = _x+1; _y < 3; _y++)
            if (vet[_x] < vet[_y])
            {
                aux     = vet[_x];
                vet[_x] = vet[_y];
                vet[_y] =     aux;
            }
    *n1 = vet[0];
    *n2 = vet[1];
    *n3 = vet[2];
    return 32768;
}
int main()
{
    float n1, n2, n3,ret;
    printf("Digite a primeira nota: ");
    scanf("%f", &n1);
    printf("Digite a segunda nota ");
    scanf("%f", &n2);
    printf("Digite a terceira nota: ");
    scanf("%f", &n3);
    ret = maioresnotas(&n1, &n2, &n3);//  ret pega o valor retornado
    printf("\nos dois maiores Numeros Sao -> %.1f e %.1f\n", n1, n2);
    printf("o valor retornado foi %.f\n\n", ret);
    return 512;
}

 

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

  • Solução
float maioresnotas(float *n1, float *n2, float *n3){

    if ( ( *n1 > *n2 ) && ( *n1 > *n3 ) )
        return (*n1);
    if ( ( *n2 > *n1 ) && ( *n2 > *n3 ) )
        return (*n2);
    return (*n3);

 

21 horas atrás, pedro.maciel disse:

//não estou conseguindo chegar no raciocinio de como retornar 2 valores aqui


Sim, está confuso. 

 

Escreva sempre em torno dos dados.

 

Precisa retornar as duas maiores notas de um conjunto de 3 notas.
 

21 horas atrás, pedro.maciel disse:

Preciso fazer um programa que retorne as 2 maiores notas. Creio que isso deva ser feito com passagem por referência, mas confesso que estou um pouco perdido


Você precisa retornar as DUAS maiores notas mas está retornando uma em n3. De nada serve.

 

Há duas maneiras de retornar isso: ou você coloca as duas notas em um registro, uma struct, e retorna a tal struct, ou passa para a função dois endereços de float onde você enfia as duas maiores notas. Isso quer dizer passar por referência, da função para fora. 

 

Então note que sua função tem 3 argumentos de entrada e dois de saída. Se vai retornar os valores por referência então não vai retornar nada pela função. Não complique as coisas. Veja os dados e escreva de acordo. Por exemplo:
 

    void maioresnotas(
        float nota1, float nota2, float nota3, // entrada por valor
        float* maior1, float* maior2 // saida por referencia
    );

 

Você não pode zoar nenhuma das 3 notas de entrada. Quem chamar sua função não vai te dar esse direito. E você pode muito bem querer chamar com constantes, como em 
 

	float maior1 = 0;
	float maior2 = 0;
	maioresnotas( 5.5, 3., 6.7, &maior1, &maior2 );

 

E aí nem vai compilar seu programa. E fica menos prático. Observe os dados. São 3 notas. Só 3 notas. Só precisa isolar a menor. Então se a primeira for menor que a segunda já sabe uma das que vai retornar, certo? Certamente vai retornar a segunda.
 

É matemática, não C/C++/C#


Então

  • se a primeira nota é maior que a segunda as maiores são 1 e 3 ou 1 e 2 
  • se a segunda é maior que a primeira então as maiores são 2 e 3 ou 2 e 1
  • São 3 if. Álgebra de Boole, o George Boole. Que deu nome ao Boolean. :) 


Na prática isso:

 

void maiores_notas(
	float nota1, float nota2, float nota3, // entrada por valor
	float* maior1, float* maior2           // saida por referencia
)
{
	if (nota1 > nota2)
	{	*maior2 = nota1;
		if (nota3 > nota2)
			*maior1 = nota3;
		else
			*maior1 = nota2;
	}
	else
	{	*maior2 = nota2;
		if (nota3 > nota1)
			*maior1 = nota3;
		else
			*maior1 = nota1;
	};
	return;
};

 

Como testar?

 

No mundo "sério" chamam isso de test unit:
 

void testa(float nota1, float nota2, float nota3)
{
	float maior1 = 0;
	float maior2 = 0;
	maiores_notas(
		nota1, nota2, nota3, &maior1, &maior2);
	printf("\tNotas: %f, %f e %f\n\tMaiores: %f e %f\n",
		nota1, nota2, nota3, maior1, maior2);
	return;
};

 

E main() pode testar as 6 possíveis condições: 

 

int main(void)
{
	testa(1., 2., 3.);
	testa(1., 3., 2.);
	testa(2., 1., 3.);
	testa(2., 3., 1.);
	testa(3., 1., 2.);
	testa(3., 2., 1.);
};

 

e mostrar
 

        Notas: 1.000000, 2.000000 e 3.000000
        Maiores: 3.000000 e 2.000000
        Notas: 1.000000, 3.000000 e 2.000000
        Maiores: 2.000000 e 3.000000
        Notas: 2.000000, 1.000000 e 3.000000
        Maiores: 3.000000 e 2.000000
        Notas: 2.000000, 3.000000 e 1.000000
        Maiores: 2.000000 e 3.000000
        Notas: 3.000000, 1.000000 e 2.000000
        Maiores: 2.000000 e 3.000000
        Notas: 3.000000, 2.000000 e 1.000000
        Maiores: 2.000000 e 3.000000

 

O programa "todo"

Spoiler

#include <stdio.h>

void maiores_notas(
	float nota1, float nota2, float nota3, // entrada por valor
	float* maior1, float* maior2 // saida por referencia
);

void testa(float,float,float);

int main(void)
{
	testa(1., 2., 3.);
	testa(1., 3., 2.);
	testa(2., 1., 3.);
	testa(2., 3., 1.);
	testa(3., 1., 2.);
	testa(3., 2., 1.);
};

void maiores_notas(
	float nota1, float nota2, float nota3, // entrada por valor
	float* maior1, float* maior2           // saida por referencia
)
{
	if (nota1 > nota2)
	{
		*maior2 = nota1;
		if (nota3 > nota2)
			*maior1 = nota3;
		else
			*maior1 = nota2;
	}
	else
	{
		*maior2 = nota2;
		if (nota3 > nota1)
			*maior1 = nota3;
		else
			*maior1 = nota1;
	};
	return;
};

void testa(float nota1, float nota2, float nota3)
{
	float maior1 = 0;
	float maior2 = 0;
	maiores_notas(
		nota1, nota2, nota3, &maior1, &maior2);
	printf("\tNotas: %f, %f e %f\n\tMaiores: %f e %f\n",
		nota1, nota2, nota3, maior1, maior2);
	return;
};

 

 

E se fosse retornar as duas notas?

 

Algo simples assim:
 

typedef struct
{
	float maior1;
	float maior2;

}	Duas_notas;

 

E a função poderia retornar isso por valor mesmo, dado o contexto e o tamanho super modesto da estrutura
 

Duas_notas maiores_notas(
	float nota1, float nota2, float nota3);

 

A função mudaria em umas linhas
 

Duas_notas maiores_notas(
	float nota1, float nota2, float nota3)
{
	Duas_notas maiores;
	if (nota1 > nota2)
	{
		maiores.maior2 = nota1;
		if (nota3 > nota2)
			maiores.maior1 = nota3;
		else
			maiores.maior1 = nota2;
	}
	else
	{
		maiores.maior2 = nota2;
		if (nota3 > nota1)
			maiores.maior1 = nota3;
		else
			maiores.maior1 = nota1;
	};
	return maiores;
};

 

Só isso. O uso é mais simples:
 

void testa(float nota1, float nota2, float nota3)
{
	Duas_notas tst = maiores_notas(nota1, nota2, nota3);
	printf("\tNotas: %f, %f e %f\n\tMaiores: %f e %f\n",
		nota1, nota2, nota3, tst.maior1, tst.maior2);
	return;
};

 

Claro, o resultado é o mesmo. Isso é tão comum que em C++ tem uma classe pair e se pode declarar
 

pair<float><float> Duas_notas;

 

 

 

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

@pedro.maciel Quando puder marque o post #6 como uma possível solução, assim alguém que veja o post inicial e tenha um problema similar pode ir direto para o post em questão. E se chegou a um resultado satisfatório poste seu código e pode marcar seu próprio post como solução ao invés do que eu te mostrei no #6

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