Ir ao conteúdo
  • Cadastre-se
Vinicius Antony

C++ Ordenar de Forma Crescente uma Lista

Posts recomendados

Bom, em um trabalho de faculdade preciso criar um sistema no qual eu entre com quantos e quais valores eu quero e o mesmo me devolva esses valores ordenados e também me mostre o Menor e o Maior valor.

Até agora consegui fazer com que o programa me devolva os valores digitados, mas estes são listados na ordem digitada.

 

#include <iostream>
using namespace std;

struct Numero
{
	int numero;
};

void Ordena (int qtde, Numero num[]);
void Menor (int qtde, Numero num[]);
void Maior (int qtde, Numero num[]);

int main()
{
	int qtde = 0;
	cout << "Informe a quantidade de numeros: ";
	cin >> qtde;
	
	Numero*num = new Numero[qtde];
	Ordena(qtde, num);
	Menor(qtde, num);
	Maior(qtde, num);
	
}

void Ordena (int qtde, Numero num[])
{
	for (int i = 0; i < qtde; i++)
	{
		cout << "Digite o numero: ";
		cin >> num[i].numero;
	}
	
	for (int i = 0; i < qtde; i++)
	{
		cout << " " << num[i].numero;
	}
}

void Menor (int qtde, Numero num[])
{	

}

void Maior (int qtde, Numero num[])
{	

}

 cCHvISM.png

 

Fico grato se alguém puder me ajudar.

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

@Vinicius Antony       para a ordenação de vetores você pode usar um método como o bubblesort ,  e depois de ordenar os números de forma crescente  dentro do vetor  você pega o primeiro número , que estará na posição zero do vetor ,  como sendo o menor , e pega o último número , que estará na posição apontada por qtde menos hum , pois o vetor começa em zero  , como sendo o maior ,  então seu código inicial está bom , faltou ordenar e ver qual o maior e menor ,  e com algumas modificações poderia ser assim  :

#include <iostream>
#include <conio.h>
#include <cstdlib>
#include <iomanip>
#define pausa for(f=0;f<50000000;f++);
using namespace std;
struct Numero{
	int numero;
};
void Ordena (int qtde, Numero num[]);
int Menor (int qtde, Numero num[]);
int Maior (int qtde, Numero num[]);
int main(){
    system("color ec");
    int qtde = 0,maior,menor,f;
    cout << "Informe a quantidade de numeros -: ";
    cin >> qtde;
	
    Numero*num = new Numero[qtde];
    Ordena(qtde, num);
    menor = Menor(qtde, num);
    maior = Maior(qtde, num);
    Maior(qtde, num);

    cout<<"O Menor eh -> "<<setw(3)<<menor<<endl;
    cout<<"O Maior eh -> "<<setw(3)<<maior<<endl;
	
    cout<<"\n\n     Tecle  !\n"<<endl;
    while( ! kbhit()){/* a conio e esse while aqui é apenas huma animação ! */
        cout<<"       |\r";pausa;
        cout<<"       /\r";pausa;
        cout<<"       -\r";pausa;
        cout<<"       "<<(char)92<<"\r";pausa;
    }
    return 0;
}
void Ordena (int qtde, Numero num[]){
    for (int i = 0; i < qtde; i++){
        cout << "Digite o numero -: ";
        cin >> num[i].numero;
    }
    cout<<"\nNumeros Digitados !"<<endl;
    for(int i = 0; i < qtde; i++){
        cout<<num[i].numero<<" ";
    }
    for(int i=0;i<qtde-1;i++)
        for(int j=i+1;j<qtde;j++)
            if( num[i].numero > num[j].numero ){
                int aux       = num[i].numero;
                num[i].numero = num[j].numero;
                num[j].numero = aux ;                                         
            }
    cout<<"\n\nNumeros Ordendos Crecentes !"<<endl;
    for(int i=0;i<qtde;i++)
        cout<<num[i].numero<<" ";
    cout<<"\n"<<endl;
}
int Menor (int qtde, Numero num[]){	
    return num[0].numero;
}
int Maior (int qtde, Numero num[]){	
    return num[qtde-1].numero;
}

 

  • Obrigado 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá!

 

Talvez esteja se preocupando com mais que o necessário. Métodos para ordenar e encontrar maior e menor valor e tal.

Pensando de um modo ingênuo até, encontrar o menor e o maior é o mesmo serviço então não precisa fazer duas vezes. Ordenar se vai ler um por um talvez não seja preciso, já que vem um por um. Você pode simplesmente colocar cada um já no seu lugar e assim não precisa arrumar depois... E já que vem um por um porque não marcar logo o maior e o menor vistos até o momento? 

 

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

E estamos escrevendo em C++ então compare

struct Numero
{
    int num;
}

Numero* num = new Numero[qtde];

Com o pobre num sózinho na struct e você tendo que declarar um vetor de Numero para na verdade declarar um vetor de num.  E os valores de maior e menor que só tem a ver com um vetor de Numero? Por isso C++ --- ou qualquer outra linguagem com objetos --- é tão mais expressiva que C em termos de relações entre as coisas. Veja um outro exemplo em C++:

struct Numeros
{
    int     maior;
    int     menor;
    int*    valores;

    Numeros(int quantos)
    {
        valores = new int[quantos];
    }
};

Numeros num =   Numeros(qtde);
Numeros outro = Numeros(30);
Numeros um =    Numeros(1500);

Nesse caso cada struct Numero tem o que importa: o vetor do tamanho certo, mais o maior e o menor elemento. E quando você declara uma o sistema cria as variáveis menor e maior e aloca a memória necessária para o vetor valores[]

 

E como ficaria um programa C++ usando isso?

 

Uma possibilidade: Pense assim: primeiro você declara uma dessas estruturas. Em C++ são chamadas de classes, e já lê um primeiro valor 

   int quantos;
    int v;

    cout << "Quantos?     : ";
    cin >> quantos;

    if (quantos < 1) return 0;
    Numeros num = Numeros(quantos);

    cout << "Primeiro Valor: ";
    cin >> v;
    num.menor = v;
    num.maior = v;
    num.valores[0] = v;

Claro que tem outras maneiras de resolver, mas queremos só resolver o que foi pedido e vamos fazer como se fosse em uma ficha de papel, nesse exemplo. Então agora posso ler o resto. A cada número novo, não vou perder a oportunidade de já ver se é o maior ou o menor da série até aqui. O trecho abaixo lê todos os valores e marca o menor e o maior

    for (int n = 0; n < quantos-1; n++)
    {
        cout << "Valor " << n + 2 << " de " << quantos << ": ";
        cin >> v;
        if (v > num.maior) num.maior = v;
        if (v < num.maior) num.menor = v;
        num.valores[n+1] = v;
     }    // end for

Esse trecho mostraria todos na tela

    // agora mostra os valores...
    cout << quantos << " valores" << endl;
    cout << "menor valor: " << num.menor << endl;
    cout << "maior valor: " << num.maior << endl;
    cout << "valores: " << endl;
    for (int n = 0; n < quantos; n++) cout << num.valores[n] << endl;

Mostraria na tela algo assim depois de ler o primeiro e os outros como acima

Quantos?     : 5
Primeiro Valor: 5
Valor 2 de 5: 4
Valor 3 de 5: 3
Valor 4 de 5: 2
Valor 5 de 5: 1
5 valores
menor valor: 1
maior valor: 5
valores:
5
4
3
2
1

E pra colocar na ordem? Seguindo o princípio de não fazer mais do que o que foi pedido e a necessidade de não fazer menos que o pedido:

  • podemos já ir colocando os números em ordem no vetor.
  • Já sabemos que cabem todos porque foi a primeira coisa que perguntamos pro usuário. E alocamos o espaço de acordo.
  • Quando lemos os valores no loop já tem o primeiro lá, por simplicidade. Quando só tem um já está resolvido:o único é o menor, o maior, o mais bonito, o mais solitário e tudo mais. E o segundo loop não executaria nem uma única vez.

Tudo certo. Mostraria isso para um só:

Quantos?     : 1
Primeiro Valor: 150
1 valores
menor valor: 150
maior valor: 150
valores:
150

E como colocar em ordem sem criar um método e varrer o vetor todo de novo?

 

Podemos pensar que

  • com um elemento só sempre está em ordem

  • ao colocar mais um posso ir vendo a partir dos que estão lá e arrumar o lugar pro novo deslocando todos os maiores para baixo. Simples assim.
  •         int ix;
            for (ix=n+1; ix>0; ix--)
            {    // comeca do final    
                if ( v > num.valores[ix-1] ) break;
                num.valores[ix] = num.valores[ix-1];    // abre espaco
            }    // end for
            num.valores[ix] = v;        // ix marca o lugar certo

    Apenas antes de colocar a gente abre um espaço para ele no lugar certo, ix.E não é que funciona?

Quantos?     : 4
Primeiro Valor: 4
Valor 2 de 4: 3
Valor 3 de 4: 2
Valor 4 de 4: 1
4 valores
menor valor: 1
maior valor: 4
valores:
1
2
3
4

Por exemplo...

Eis um programa de teste:


 

#include <iostream>
using namespace std;

struct Numeros
{
    int        maior;
    int        menor;
    int*    valores;

    Numeros(int quantos)
    {
        valores = new int[quantos];
    }
};


int main()
{
    int quantos;
    int v;

    cout << "Quantos?     : ";
    cin >> quantos;

    if (quantos < 1) return 0;
    Numeros num = Numeros(quantos);

    cout << "Primeiro Valor: ";
    cin >> v;
    num.menor = v;
    num.maior = v;
    num.valores[0] = v;

    for (int n = 0; n < quantos-1; n++)
    {
        cout << "Valor " << n + 2 << " de " << quantos << ": ";
        cin >> v;
        if (v > num.maior) num.maior = v;
        if (v < num.maior) num.menor = v;
        int ix;
        for (ix=n+1; ix>0; ix--)
        {    // comeca do final    
            if ( v > num.valores[ix-1] ) break;
            num.valores[ix] = num.valores[ix-1];    // abre espaco
        }    // end for
        num.valores[ix] = v;        // ix marca o lugar certo
    }    // end for

    // agora mostra os valores...
    cout << quantos << " valores" << endl;
    cout << "menor valor: " << num.menor << endl;
    cout << "maior valor: " << num.maior << endl;
    cout << "valores: " << endl;
    for (int n = 0; n < quantos; n++) cout << num.valores[n] << endl;
    return 0;
}

Espero que ajude a entender uma diferença entre C e C++

  • Curtir 2
  • Obrigado 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisar ser um membro 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 publicações 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...

GRÁTIS: minicurso “Como ganhar dinheiro montando computadores”

Gabriel TorresGabriel Torres, fundador e editor executivo do Clube do Hardware, acaba de lançar um minicurso totalmente gratuito: "Como ganhar dinheiro montando computadores".

Você aprenderá sobre o quanto pode ganhar, como cobrar, como lidar com a concorrência, como se tornar um profissional altamente qualificado e muito mais!

Inscreva-se agora!