Mandar um cafézinho para o programador:


Me ajude a transformar café em código!
Mostrando postagens com marcador Array. Mostrar todas as postagens
Mostrando postagens com marcador Array. Mostrar todas as postagens

Array de Objetos em C++

 Neste tutorial de nosso livro de C++, vamos aprender a criar um array de objetos, bem como manipulá-los.

Criando um array com Objetos em C++

No tutorial passado, criamos uma classe que calculava médias de duas ou três notas, de estudantes. Vamos fazer algo parecido neste tutorial.

Vamos criar a classe Student, e inicialmente ela recebe duas notas. A função construtora seta corretamente as variáveis, e tem uma função chamada getAverage() que retorna a média das duas notas:

#include <iostream>
using namespace std;
class Student
{
    private:
        double grade1, grade2;

    public:
        Student();
        Student(double, double);
        double getAverage();
};

Student::Student()
{
    grade1 = 0;
    grade2 = 0;
}
double Student::getAverage() { return (grade1+grade2)/2; } int main() { Student NeilPeart(10, 8); cout<<NeilPeart.getAverage()<<endl; return 0; }

Note que criamos apenas um objeto, o aluno Neil Peart. Mas que escola tem apenas um aluno? Tem milhares, mas vamos com calma. Vamos trabalhar agora com 5 alunos. Poderíamos fazer:

  • Student alu1, alu2, alu3, alu4, alu5;

Mas, e se fosse um projeto real, com mil alunos? Ia fazer até o alu1000?
Claro que não, né, mané!

Você estudou pelo C++ Progressivo, é uma pessoa esperta e vai logo se lembrar dos nossos amados e queridos arrays, para se trabalhar com muitas variáveis ao mesmo tempo.

Para declarar 5 inteiros, fazemos:

int num[5];

Para declarar 5 chars, fazemos:
char letter[5];

Então adivinha só o que fazemos pra criar 5 objetos da classe Student? Isso mesmo:

  • Student alu[5];
Array de Objetos em C++

Rode o código o código abaixo:

#include <iostream>
using namespace std;

class Student
{
    private:
        double grade1, grade2;

    public:
        Student();
        Student(double, double);
        double getAverage();
};

Student::Student()
{
    grade1 = 0;
    grade2 = 0;
}

Student::Student(double g1, double g2)
{
    grade1 = g1;
    grade2 = g2;
}

double Student::getAverage()
{
    return (grade1+grade2)/2;
}


int main()
{
    Student alu[5];
    cout<<alu[0].getAverage()<<endl;

    return 0;
}

O resultado vai ser 0, pois não inicializamos os objetos do array.

Como inicializar Objetos de um Array

Poderíamos inicializar os objetos um por um, depois de declarar:

    Student alu[5];
    alu[0] = Student(10,9);
    alu[1] = Student(10,8);
    alu[2] = Student(10,7);
    alu[3] = Student(10,6);
    alu[4] = Student(10,5);

Ou poderíamos inicializar logo tudo na hora de instanciar os objetos:
    Student alu[5] = { Student(10,9),
                       Student(10,8),
                       Student(10,7),
                       Student(10,6),
                       Student(10,5) };
Ou até diretamente:
    Student alu[5] = { {10,9},
                       {10,8},
                       {10,7},
                       {10,6},
                       {10,5} };
Se você tiver outras funções construtoras (que recebam uma nota ou 3, por exemplo), também pode colocar diretamente no código, o C++ vai saber chamar a construtor correta. E se você não fornecer nenhuma informação de algum elemento do array, o C++ vai invocar o construtor padrão (é sempre bom ter um, na classe).

Como acessar membros do Array de Objetos

Ok, já declaramos e inicializamos vários objetos de uma vez só, agora precisa aprender a acessar seus membros.

Quando tínhamos um objeto de nome 'name', acessávamos seus membros usando ponto:
  • name.var
  • name.func()

Aqui é a mesma coisa, mas a variável é um elemento de array:
  • arr[0].grade
  • arr[1].getAverage();
Ou seja, mesma coisa, só usar o array bonitinho e o pontinho, seguido do membro da classe/objeto.
O programa a seguir cria 5 objetos, já inicializa com a nota dos alunos e exibe suas médias com a função getAverage():
#include <iostream>
using namespace std;

class Student
{
    private:
        double grade1, grade2;

    public:
        Student();
        Student(double, double);
        double getAverage();
};

Student::Student()
{
    grade1 = 0;
    grade2 = 0;
}

Student::Student(double g1, double g2)
{
    grade1 = g1;
    grade2 = g2;
}

double Student::getAverage()
{
    return (grade1+grade2)/2;
}


int main()
{
    Student alu[5] = { {10,9},
                       {10,8},
                       {10,6},
                       {10,5} };


    cout<<alu[0].getAverage()<<endl;
    cout<<alu[1].getAverage()<<endl;
    cout<<alu[2].getAverage()<<endl;
    cout<<alu[3].getAverage()<<endl;
    cout<<alu[4].getAverage()<<endl;

    return 0;
}
Note que inicializamos apenas os quatro primeiros alunos, então o quinto foi inicializado pelo construtor padrão. Qual foi a média do quinto aluno (alu[4])?

Agora faça outro teste: crie uma classe, que apenas tem o construtor padrão, exibindo uma mensagem na tela. Crie um array de tamanho 10, desses objetos. O que acontece?

Jogo da Velha em C++ : Como programar

Neste tutorial, vamos te ensinar do mais absoluto zero, como programar o jogo da velha em C++, um game super bacana que você pode usar para jogar com algum amigo.

Código completo do jogo da velha em C++

Lógica do Jogo da Velha em C++

Vamos usar uma matriz, 3x3, de inteiros, para representar as jogadas.
Se a casa tiver o número 0, ela está vazia. Se tiver o número 1 é porque o jogador 1 jogou lá, e se tiver -1, é porque o jogador 2 jogou naquela posição.

Vamos explicar, por partes, as funções.

A função init(), inicializa o tabuleiro, colocando 0 em todas as casas.

A função show() vai exibir o tabuleiro, imprimir o tabuleiro bonitinho, com barras, underlines, espaçamentos corretos e, se tem X ou 0 em cada casa. Essa última parte quem faz é a função printBlock().
A função printBlock() vai em cada casa do tabuleiro, se tiver 0 lá, ela retorna um espaço vazio ' '.
Se tiver o número 1 lá, ela imprime X. Se tiver -1 lá, é porque o jogador 2 jogou nessa casa, e lá vai ter um O.

A função playMove() realiza uma jogada, ou seja, pede a linha e a coluna que o jogador vai jogar.
Lembrando que ele vai digitar valores de 1 até 3, e o array vai de 0 até 2, por isso temos que subtrair uma unidade dos dados digitados pelo usuário (row-- e col--). Também devemos checar se ela está ocupada (board[row][col]), e se o usuário digitou valores corretos (entre 1 e 3). Se tudo estiver ok, ela preenche com 1 ou -1 a casa que o jogador escolheu.

A função checkContinue() vai verificar se ainda tem espaço em branco, ou seja, se ainda é possível realizar alguma jogada. Se tiver espaço em branco, retorna 1, se não tiver, retorna 0.

A função checkWin() vai checar se alguém ganhou. Para isso, basta somar cada linha, cada coluna e cada diagonal, se alguma dessas fileiras tiver soma 3, o jogador 1 ganhou e retornamos 1. Se a soma for -3, o jogador 2 ganhou, e retornamos -1. Se ninguém tiver ganhado, até aquele momento, retornamos 0.

Agora vamos pra função main(). Ela cria o tabuleiro 3x3, a variável cont (que vai perguntar se o jogador vai querer jogar de novo ou não, as variáveis player1 e player2 , que vão armazenar o placar do jogo), e a variável result, que armazena a informação de quem ganhou o jogo.

O jogo vai ocorrer dentro de um DO WHILE.
Primeiro, inicializamos o tabuleiro com valores 0.

Agora vamos fazer uma partida, para isso, chamamos a função game().

A função game() é onde ocorre a magia, o desenrolar do jogo.
Primeiro, declaramos a variável turn, que vai dizer se é o jogador 1 ou 2 que vai jogar. A cada jogada, devemos incrementar ela em uma unidade (turn++), para mudar a vez para o próximo jogador.

Após dizer de quem é a vez, vamos fazer a jogada, através da função playMove(). Note que passamos a informação de quem é o jogador, através da expressão turn%2. Se ela der 0, é a vez do jogador 1 (e coloca o número 1, representado pelo X no tabuleiro), se der 1, é a vez do jogador (e preenchemos a matriz com o número -1, que vai ser representado pelo caractere O no tabuleiro).

Em seguida, devemos checar se o tabuleiro ainda tem posições vazias, pra jogar. Se tiver, armazenamos o número 1 na variável cont, senão, armazenamos o valor 0.

Também devemos checar se após essa jogada, alguém ganhou. Se o jogador 1 tiver ganhado, armazenamos 1 na variável win. Se o jogador 2 tiver ganhado, armazenamos o valor -1. Se ninguém tiver ganhado, armazenamos o valor 0.

Pronto. Uma jogada terminou. Vai ter uma próxima jogada? Isso depende.
Se ainda tiver espaço vazio (cont=1) e  ninguém tiver ganhado (win=0, o mesmo que !win), vai ter outra jogada.

Se não tiver mais espaço vazio (cont=0) ou alguém tiver ganhado (win=1 ou win=-1), não vai ter próxima jogada, e sai do laço DO WHILE.

Após o laço, vamos verificar o que ocorreu. Se win=1, o jogador 1 ganhou e a função game retorna 1.
Se win=-1, o jogador 2 ganhou e retornamos 2. Se nenhum tiver ganhado, é porque o tabuleiro tá cheio (cont=0) e deu empate, então retornamos 0.

Esse retorno, vai lá pra função main(), na variável result. Ele pega o resultado, e manda pra função scoreboard(), junto com os valores de player1 e player2, ela é responsável por controlar o placar.

Após a exibição do placar, perguntamos se vai querer jogar novamente o jogo ou sair.
Se digitar 1 (continuar), a variável cont fica com valor 1, o laço WHILE dá verdadeiro, e outra partida será iniciada. Senão, se for 0, o laço termina junto com o jogo.

Bacana, não é?

Pessoal, o código abaixo tem quase 200 linhas. Podem existir erros, sem dúvidas.
Se encontrarem algum, ou alguma melhoria, por favor escreva nos comentários, ok?

Código do jogo da Velha em C++

#include <iostream>
using namespace std;

void init(int board[][3]);          // Initializes the board with 0's
char printBlock(int block);         // Prints each square of the board
void show(int board[][3]);          // Show the board
void playMove(int board[][3], int); // Play one move
int checkContinue(int *board[3]);   // Check if there is still white space
int checkWin(int *board[3]);        // Check if anyone won
int game(int board[][3]);           // PLay an entire game
void scoreboard(int, int &, int &); // Show the scoreboard

int main()
{
    int board[3][3];

    int cont=0, player1=0, player2=0, result;
    do{
        init(board);
        result = game(board);
        show(board);
        scoreboard(result, player1, player2);

        cout<<"\n Outra partida?"<<endl;
        cout<<"0. Sair"<<endl;
        cout<<"1. Jogar de novo"<<endl;
        cin >> cont;
    }while(cont);

    return 0;
}

void init(int board[][3])
{
    for(int i=0; i<3; i++)
        for(int j=0; j<3; j++)
            board[i][j]=0;

}

char printBlock(int block)
{
    if(block==0)
        return ' ';
    else if(block==1)
        return 'X';
    else
        return 'O';
}

void show(int board[][3])
{
    cout<<endl;
    for(int row=0 ; row<3 ; row++){
        cout<<" "<< printBlock(board[row][0]) <<" |";
        cout<<" "<< printBlock(board[row][1]) <<" |";
        cout<<" "<< printBlock(board[row][2]) <<endl;

        if(row!=2){
            cout<<"___ ___ ___\n"<<endl;
        }
    }
}

void playMove(int board[][3], int player)
{
    int row, col, check;
    do{
        cout<<"Linha: ";
        cin >>row;
        cout<<"Coluna: ";
        cin >> col;
        row--; col--;

        check = board[row][col] || row<0 || row>2 || col<0 || col>2;
        if(check)
            cout<<"Essa casa não está vazia ou fora do intervalo 3x3"<<endl;

    }while(check);

    if(player==0)
        board[row][col]=1;
    else
        board[row][col]=-1;
}

int checkContinue(int board[][3])
{
    for(int i=0 ; i<3 ; i++)
        for(int j=0 ; j<3 ; j++)
            if(board[i][j]==0)
                return 1;
    return 0;
}

int checkWin(int board[][3])
{
    int row, col, sum;

    // Adding the lines
    for(row=0 ; row<3 ; row++){
        sum=0;

        for(col=0 ; col<3 ; col++)
            sum += board[row][col];

        if(sum==3)
            return 1;
        if(sum==-3)
            return -1;
    }

    // Adding the columns
    for(col=0 ; col<3 ; col++){
        sum=0;

        for(row=0 ; row<3 ; row++)
            sum += board[row][col];

        if(sum==3)
            return 1;
        if(sum==-3)
            return -1;
    }

    // Adding the diagonals
    sum=0;
    for(row=0 ; row<3 ; row++)
        sum += board[row][row];
    if(sum==3)
        return 1;
    if(sum==-3)
        return -1;

    sum=board[0][2]+board[1][1]+board[2][0];
    if(sum==3)
        return 1;
    if(sum==-3)
        return -1;

    return 0;
}

int game(int board[][3])
{
    int turn=0, cont, win;

    do{
        show(board);
        cout<<"Jogador "<<1+turn%2<<endl;
        playMove(board, turn%2);
        turn++;

        cont=checkContinue(board);
        win = checkWin(board);
    }while(cont && !win);

    if(win==1){
        cout<<"Jogador 1 ganhou!\n"<<endl;
        return 1;
    }else
        if(win==-1){
            cout<<"Jogador 2 ganhou!\n"<<endl;
            return 2;
    }else
        cout<<"Empate\n"<<endl;
    return 0;
}

void scoreboard(int result, int &player1, int &player2)
{
    if(result==1)
        player1++;
    if(result==2)
        player2++;

    cout<<"Placar: "<<endl;
    cout<<player1<<" x "<<player2<<endl;
}

Desafio em C++

Crie uma versão modificada deste jogo, que pergunta ao usuário se ele deseja jogar com um amigo ou contra o computador. Se ele escolher jogar contra a máquina, faça com que seu código escolha alguma casa aleatória, quando for a vez da máquina.

Será que alguém seria capaz de fazer e postar nos comentários, o resultado?

Matrizes em Funções

Neste tutorial de nossa apostila de C++, vamos aprender como trabalhar com matrizes e funções, aprendendo a declarar, invocar e usar estes dois importantes tópicos, conjuntamente.

Como Passar Matriz para Função

No estudo de arrays, vimos que existem algumas maneiras de declarar o cabeçalho de funções com arrays como parâmetros, da seguinte maneira:
  • tipo func(tipo *array);
  • tipo func(tipo array[tamanho]);
  • tipo func(tipo array[]);

Ou seja, basta passar o ponteiro (*array - estudaremos mais na frente) ou o só com o par de colchetes em aberto (array[]).

No caso de arrays bidimensionais, precisamos especificar o número de colunas da matriz que estamos enviando:
  • void func(int arr[][COLUMN]);

Veja bem, o número de linhas não é obrigatório (até podemos passar), mas o número de colunas, sim.
Vamos declarar e inicializar uma matriz 2x2 e em seguida enviara para a função show(), que vai simplesmente exibir ela na forma de uma tabela, veja como fica nosso código:
#include <iostream>
using namespace std;

void show(int arr[][2], int row)
{
    for (int i=0 ; i<row ; i++){
        for(int j=0 ; j<2 ; j++)
            cout<<arr[i][j]<<"  ";
        cout<<endl;
    }
}

int main()
{
    int arr[][2]={ {1,2}, {3,4} };
    show(arr, 2);
    return 0;
}
Note algumas coisas importantes, no código acima.

Primeiro, passamos a matriz arr[][2] para a função, com o número de colunas.
Mas e o número de linhas? Como a função vai saber o tanto de linhas, para imprimir a tabela ?
Ela não sabe, por isso passamos outro parâmetro na função, o inteiro 'row'.

Matriz em C++: Passagem por referência

Toda passagem de dados para funções que envolvem arrays, é por referência. Sempre.
Ou seja, passou um array pra uma função? Ela vai acessar diretamente o array e seus dados, direto na memória. Não é uma cópia que vai pra função, não é passagem por valor, ok?

Isso quer dizer uma coisa: cuidado! As funções podem modificar seus arrays, lembre-se sempre disso.

O código abaixo introduz a função 'init', que vai receber um array e inicializar cada elemento dele, perguntando pro usuário:
#include <iostream>
using namespace std;
const int COLS = 3;
const int ROWS = 3;

void init(int arr[][COLS], int ROWS)
{
    for(int i=0 ; i<ROWS ; i++)
        for(int j=0 ; j<COLS ; j++){
            cout << "matrix["<<i+1<<"]["<<j+1<<"]: ";
            cin  >> arr[i][j];
        }
}

void show(int arr[][COLS], int ROWS)
{
    for (int i=0 ; i<ROWS ; i++){
        for(int j=0 ; j<COLS ; j++)
            cout<<arr[i][j]<<"  ";
        cout<<endl;
    }
}

int main()
{
    int arr[ROWS][COLS];
    init(arr, ROWS);
    show(arr, ROWS);
    return 0;
}
Para melhorar a organização, já definimos as linhas (ROWS) e colunas (ROLS) como variáveis globais do tipo constantes, para não ter perigo de ninguém, em algum local do código, alterar seus valores. Isso deixa o código mais claro e seguro, para manutenção.

Array de arrays em C++

Exercício de Matriz em C++

Crie uma matriz 4x4, onde cada linha representa as notas de um aluno, e cada coluna é uma matéria diferente. Você deve criar uma função que vai preenchendo as notas dos alunos, uma por uma, assinalando qual é a matéria e qual é o aluno.

Em seguida, seu programa deve exibir, de maneira organizada, as notas de cada aluno, bem como a média de cada um, a média da turma para cada matéria, e a média geral, de todos alunos de todas as notas.

Postem sua solução nos comentários.

Matriz em C++ : Array de Arrays

Neste tutorial de nosso Curso de C++, vamos aprender o importante conceito de matriz em C++.

Array de Arrays - O que é? Para que serve?

Até o momento, em nossa seção de arrays, criamos arrays de inteiros, float, doubles, char etc.
Ou seja, criamos arrays que armazenam números ou caracteres.
Porém, também é possível armazenar outras coisas em arrays.

Uma coisa curiosa de se armazenar em arrays, são outros arrays.

Por exemplo, imagine que você foi contratado por uma escola para fazer um programa em C++ que vai, dentre outras coisas, armazenar as notas dos alunos. Cada aluno tem, por exemplo, 5 notas diferentes.

Você pode, antes de tudo, raciocinar assim: criar um array para armazenar os alunos.
Por exemplo: alunos[10]

Porém, cada aluno tem 5 notas. Então cada aluno desses vai ter um array de notas:
notas[5]

Veja bem: temos um array de alunos, cada bloco representa um aluno. E dentro de cada bloco, ou seja, de cada aluno, tem uma espécie de array interno, com as notas de cada aluno. Cada aluno tem seu array de notas, e cada aluno faz parte do array de alunos.

Vamos formalizar isso?

Como declarar uma Matriz em C++

Chamamos pelo nome de matriz, um array de arrays, ou arrays multidimensionais.
Até o momento, trabalhamos apenas com arrays de uma dimensão, só uma 'linha' de bloquinhos, que formam um array.

Para aumentarmos o número de dimensões de um array, basta irmos acrescentando pares de colchetes, por exemplo:

  • Para declarar um array de uma dimensão, fazemos: float grade[5];
  • Para declarar um array de duas dimensões, fazemos: float students[10][5];


Vamos lá. Quando fazemos 'float grade[5]' queremos dizer: 5 bloquinhos de float.
Quando fazemos: 'float students[10][5]', queremos dizer: 10 bloquinhos, onde cada bloquinho desses tem um array dentro, de 5 floats.
Dizemos que essa é uma matriz 10x5 (10 linhas e 5 colunas, onde cada linha representa um aluno, e cada coluna representa uma nota diferente).

Para facilitar, vamos imaginar uma matriz 3x3, declaramos assim:

  • int matrix[3][3];


A expressão 'matrix[3]' quer dizer: um array de 3 elementos.
O que contém cada elemento? Um inteiro? Um float? Um char? Não, cada elemento é um outro array, de tamanho [3].

Veja como fica a representação dessa matriz:
Array de arrays em C++

O primeiro elemento de nossa matriz é: matrix[0]
Ele é um array, de 3 elementos, que são representados por:
Primeiro elemento: matrix[0][0]
Segundo elemento: matrix[0][1]
Terceiro elemento : matrix[0][2]

O segundo elemento de nossa matriz é: matrix[1]
Ele é um array, de 3 elementos, que são representados por:
Primeiro elemento: matrix[1][0]
Segundo elemento: matrix[1][1]
Terceiro elemento : matrix[1][2]

O terceiro elemento de nossa matriz é: matrix[2]
Ele é um array, de 3 elementos, que são representados por:
Primeiro elemento: matrix[2][0]
Segundo elemento: matrix[2][1]
Terceiro elemento : matrix[2][2]

Ou seja, para declaramos uma matriz de 'i' linhas e 'j' colunas, fazemos:

  • tipo matrix[i][j];

Se você já estudou matriz e determinantes, na escola, deve se lembrar de como se usa uma matriz, como sinalizar cada elemento etc. Aqui, a única diferença é que a contagem começa do índice 0, ao invés de 1.

Como inicializar uma Matriz em C++

Vamos criar uma matriz para armazenar as notas de 3 alunos, onde cada aluno tem duas notas.
Ou seja, teremos uma matriz de 3 linhas (uma para cada aluno) e 2 colunas (cada coluna representa uma nota). Declaramos essa matriz, então:

  • float grade[3][2];


Vamos agora inicializar essa matriz com as notas:
float grade[3][3] = { {9.5, 9.1},
                                  {8.8, 8.4},
                                  {10.0, 10.0} };

O array de notas do primeiro aluno é: {9.5, 9.1}
O array de notas do segundo aluno é: {8.8, 8.4}
O array de notas do terceiro aluno é : {10.0, 10.0}

Por exemplo, qual a primeira nota do segundo aluno? Segundo aluno é o aluno 1, primeira nota é a de índice 0, então essa nota está armazenada em: grade[1][0] = 8.8
Já a segunda nota do segundo aluno é: grade[1][1] = 8.4

Simples, não?

Ordenar elementos de um Array em C++

Neste tutorial de nosso curso de C++, vamos aprender como ordenar os elementos de um Array.

Ordenar elementos (sorting)

Ordenar, isto é, colocar elementos (como números) em uma determinada ordem (como crescente ou decrescente, por exemplo), é um dos assuntos mais importantes e estudados em computação, devido sua importância.

Na sua escola ou universidade, a lista de alunos é ordenada em ordem alfabética.
As seções eleitorais onde você vai votar, também usam algum tipo de ordem.
As contas bancárias, também organizam tudo de acordo com números, bem como os números de uma cartela de loteria.

Quando você for um programador profissional em C++, sua empresa vai pedir para você organizar diversas coisas, em algum tipo de ordem, como nomes, salários, identificações, cargos, tamanho ou peso de produtos, etc etc.

Ou seja, é um assunto absurdamente usado, importante demais mesmo, que você vai usar muito mesmo, várias vezes, em sua carreira, e vamos introduzir agora neste tutorial, um pouco do assunto.

Como ordenar um Array em C++

Vamos usar o algoritmo Selection Sort, para ordenar os elementos do Array.
Primeiro, criamos a função gen(), que vai gerar números aleatórios entre 1 até 100.

Vamos criar um array de tamanho size=10 e nome 'num'.
Vamos preencher, em seguida, cada posição desse array com um número aleatório, e depois imprimimos esse array de valores aleatórios. Próximo passo agora é ordenar esse array,

A lógica é a seguinte: pegamos o primeiro elemento do array, e comparamos com todos os outros. Ou seja, comparamos o elemento 0 com o de índice 1, depois o 0 com o de índice 2...até chegar no 0 com o de índice 9.

Se esses outros elementos forem menores que o de índice 0, invertemos os valores desses dois elementos. Pronto, ao término dessa operação, o menor valor do array estará na posição 0.

Agora vamos colocar o segundo menor valor na posição de índice 1.
Para isso, vamos comparar o elemento 1 com o 2, depois o 3, depois o 4...até compararmos o elemento 1 com o elemento 9, o último. Novamente, se esse outro elemento for menor que o de índice 1, invertemos a posição deles.

Ao final desta etapa, o segundo menor valor estará na posição 1. Agora basta fazer isso para os elementos 2, 3,...7 e 8. Na última 'rodada' de comparações, comparamos o elemento 8 com o 9 para decidir qual é maior e qual é menor.

O primeiro looping, usando um laço for, é o que controla o primeiro elemento, e dentro dele vamos comparar com todos os outros índices.
Vamos usar a variável 'prev' para receber o primeiro índice. Ela vai de 0 até 'size-2' (de 0 até 8, ou seja: for(prev=0; prev < size -1 ; prev++) ).

O segundo looping, um laço for aninhado, vai comparar o índice 'prev' com todos os outros elementos do array.
O segundo índice vai ser armazenado na variável 'next', ele começa sempre do valor 'prev+1' (quando o primeiro elemento é 0, ela começa do 1...quando o primeiro elemento é o de índice 1, ele começa no índice 2, etc etc...até o primeiro elemento ser o de índice 8 e ela será o índice 9), até 'size-1' (ou seja, for (next=prev+1 ; next < size ; next++) ).

Dentro desse laço interno, usamos um teste condicional IF pra saber se o segundo elemento é menor que o primeiro, se for, invertemos os valores desses elementos.

Veja como fica nosso código:
#include <iostream>
#include <random>
using namespace std;

int gen()
{
    std::random_device rd;
    std::mt19937 gen_numb(rd());
    std::uniform_int_distribution<> dis(1, 100);

    return dis(gen_numb);
}

int main()
{
    int size=10, prev, next, aux;
    int num[size];

    for(aux=0 ; aux<size ; aux++){
        num[aux] = gen();
    }

    cout<<"Array original: "<<endl;
    for(aux=0 ; aux<size ; aux++)
        cout<<num[aux]<<" ";
    cout<<endl;

    // Selection sort algorithm
    for(prev=0 ; prev<size-1 ; prev++)
        for(next=prev+1 ; next<size ; next++){
            aux=num[prev];

            if(num[next]<num[prev]){
                num[prev]=num[next];
                num[next] = aux;
            }
        }

    cout<<"Array Ordenado: "<<endl;
    for(aux=0 ; aux<size ; aux++)
        cout<<num[aux]<<" ";
    cout<<endl;

    return 0;
}

Exercícios de Arrays

01. Faça um algoritmo que ordena os elementos de um array do maior pro menor, ou seja, ordem decrescente.

02. Coloque o código anterior todo dentro de funções: função que preenche o array, função que inverte dois valores, função que faz o selection sort e função que exibe arrays. Use protótipos de função, pra deixar seu código bem profissional.

Solução na apostila

Ajude o C++ Progressivo

Que tal apoiar e fazer crescer o ensino da programação no Brasil ?

Ajudar nosso país a crescer e se desenvolver cada vez mais, tecnologicamente?

Clica abaixo pra saber mais!

Apoiar o Projeto Progressivo