Você está aqui: C++ ::: Desafios e Lista de Exercícios Resolvidos ::: Ordenação e Pesquisa (Busca)

Como usar a Ordenação da Bolha em C++ para ordenar os valores de um vetor em ordem crescente ou decrescente - Desafio de Programação Resolvido em C++

Quantidade de visualizações: 310 vezes
Pergunta/Tarefa:

A Ordenação da Bolha, ou ordenação por flutuação (literalmente "por bolha"), também chamada de Bubble Sort, é um algoritmo de ordenação dos mais simples. A ideia é percorrer o array diversas vezes, a cada passagem fazendo flutuar para o topo o maior elemento da sequência. Essa movimentação lembra a forma como as bolhas em um tanque de água procuram seu próprio nível, e disso vem o nome do algoritmo.

No melhor caso, o algoritmo executa n operações relevantes, onde n representa o número de elementos do vetor. No pior caso, são feitas n2 operações. A complexidade desse algoritmo é de ordem quadrática. Por isso, ele não é recomendado para programas que precisem de velocidade e operem com quantidade elevada de dados.

Escreva um programa C++ que declara, constrói um vetor de 10 inteiros e peça para o usuário informar os valores de seus elementos. Em seguida use a ordenação da bolha para ordenar os elementos em ordem crescente.

Sua saída deverá ser parecida com:

Informe o valor para o índice 0: 84
Informe o valor para o índice 1: 23
Informe o valor para o índice 2: 9
Informe o valor para o índice 3: 5
Informe o valor para o índice 4: 11
Informe o valor para o índice 5: 3
Informe o valor para o índice 6: 50
Informe o valor para o índice 7: 7
Informe o valor para o índice 8: 2
Informe o valor para o índice 9: 73

O array informado foi:

84   23   9   5   11   3   50   7   2   73   

O array ordenado é:

2   3   5   7   9   11   23   50   73   84
Resposta/Solução:

Veja a resolução comentada deste exercício usando C++:

----------------------------------------------------------------------
Se precisar de ajuda com o código abaixo, pode me chamar
no WhatsApp +55 (62) 98553-6711 (Osmar)
----------------------------------------------------------------------

#include <iostream>

#define TAM_VETOR 10

using namespace std;

// função principal do programa
int main(int argc, char *argv[]){
  // vamos declarar e construir um vetor de 10 elementos
  int valores[TAM_VETOR];
  	  
  // vamos pedir que o usuário informe os valores
  for(int i = 0; i < TAM_VETOR; i++){
    cout << "Informe o valor para o índice " << i << ": ";
    cin >> valores[i];
  }
    
  // vamos mostrar o vetor informado
  cout << "\nO array informado foi:\n\n";
  for(int i = 0; i < TAM_VETOR; i++){
    cout << valores[i] << "   ";
  }
    
  // vamos ordenar os elementos do vetor usando a ordenação da bolha
  // laço externo de trás para frente
  for(int i = TAM_VETOR - 1; i > 1; i--){
    for(int j = 0; j < i; j++){ // laço interno vai no fluxo normal
      if(valores[j] > valores[j + 1]){ // temos que trocá-los de lugar 
        int temp = valores[j];
        valores[j] = valores[j + 1];
        valores[j + 1] = temp;
      }
    }
  }
    
  // vamos exibir o vetor já ordenado
  cout << "\n\nO array ordenado é:\n\n";
  for(int i = 0; i < TAM_VETOR; i++){
    cout << valores[i] << "   ";
  }
  
  cout << "\n" << endl;
  system("PAUSE"); // pausa o programa
  return EXIT_SUCCESS;
}


Link para compartilhar na Internet ou com seus amigos:

C++ ::: Dicas & Truques ::: Programação Orientada a Objetos

Como criar uma classe C++ completa, incluindo os arquivos de definição .h e implementação .cpp

Quantidade de visualizações: 27976 vezes
Esta dica o guiará passo-a-passo na criação de uma classe C++, incluindo os arquivos .h e .cpp. Para isso vamos usar o Dev-C++ (acreditamos que o procedimento é parecido com outros compiladores).

Vamos começar com o arquivo de definição. Com um projeto já iniciado no Dev-C++, vá em File -> New -> Source File. Quando perguntado se deseja adicionar o arquivo ao projeto existente, clique Yes.

Salve o arquivo com o nome de "pessoa.h" e inclua nele o seguinte código:

----------------------------------------------------------------------
Se precisar de ajuda com o código abaixo, pode me chamar
no WhatsApp +55 (62) 98553-6711 (Osmar)
----------------------------------------------------------------------

/*
  Código de definição: pessoa.h
*/

#ifndef PESSOA_H
#define PESSOA_H

#include <string>
using std::string;

class Pessoa{
  public:
    void setNome(string nome);
    void setIdade(int idade);
    string getNome();
    int getIdade();
  private:
    string nome;
    int idade;
};

#endif

Salve este código como pessoa.h no diretório de sua aplicação C++. Este é o arquivo de definição da classe. É nele que declaramos os membros públicos e privados, incluindo as assinaturas dos métodos da classe. Passemos agora ao arquivo de implementação. Novamente vá em File -> New -> Source File. Quando perguntado se deseja adicionar o arquivo ao projeto existente, clique Yes. Salve o novo arquivo como "pessoa.cpp" e inclua nele o seguinte conteúdo:

----------------------------------------------------------------------
Se precisar de ajuda com o código abaixo, pode me chamar
no WhatsApp +55 (62) 98553-6711 (Osmar)
----------------------------------------------------------------------

/*
  Código de implementação: pessoa.cpp
*/

#include "pessoa.h"

void Pessoa::setNome(string nome){
  this->nome = nome;
}

void Pessoa::setIdade(int idade){
  this->idade = idade;
}

string Pessoa::getNome(){
  return this->nome;
}

int Pessoa::getIdade(){
  return this->idade;
}

Salve este código como pessoa.cpp no diretório de sua aplicação C++. Este é o arquivo de implementação dos métodos da classe Pessoa. Veja o uso da palavra-chave this quando queremos referenciar o objeto atual da classe e, é claro, evitar ambiguidade entre o nome das variáveis da classe e os nomes dos parâmetros dos métodos.

Hora de testar. Crie o arquivo principal da aplicação (aquele que contém o método main()):

----------------------------------------------------------------------
Se precisar de ajuda com o código abaixo, pode me chamar
no WhatsApp +55 (62) 98553-6711 (Osmar)
----------------------------------------------------------------------

#include <iostream>
#include "pessoa.h"

using namespace std;

int main(int argc, char *argv[])
{
  // declara um objeto da classe Pessoa
  Pessoa p;

  // informa o nome e idade da pessoa
  p.setNome("Osmar J. Silva");
  p.setIdade(27);

  // obtém o nome e idade da pessoa
  cout << "Nome: " << p.getNome() << endl;
  cout << "Idade: " << p.getIdade() << endl;

  cout << "\n" << endl;
  system("PAUSE"); // pausa o programa
  return EXIT_SUCCESS;
}

Funcionou tudo como planejado? Se funcionou, parabéns! Já fizemos um bom progresso na criação e uso de classes em C++.


C++ ::: Dicas & Truques ::: Arquivos e Diretórios

Como excluir um diretório em C++ usando a função rmdir()

Quantidade de visualizações: 8447 vezes
Em algumas situações nossos códigos C++ precisam excluir diretórios. Isso pode ser feito com o auxílio da função _rmdir() ou rmdir(), disponível no header direct.h (trazido da linguagem C). Veja a assinatura desta função:

int _rmdir(const char *pathname);
Se o diretório for excluído com sucesso a função retornará o valor 0. O retorno será -1 se um erro ocorrer. Neste caso a variável global errno será definido como um dos seguintes valores:

a) ENOTEMPTY - Directory not empty - O diretório não está vazio e portanto não pode ser excluído;

b) ENOENT - No such file or directory - O caminho do diretório é inválido;

c) EACCESS - Acesso negado - Algum outro programa está usando este diretório e mantém controle sobre o mesmo.

Veja um trecho de código C++ no qual excluímos um diretório:

----------------------------------------------------------------------
Se precisar de ajuda com o código abaixo, pode me chamar
no WhatsApp +55 (62) 98553-6711 (Osmar)
----------------------------------------------------------------------

#include <iostream>
#include <direct.h>

using namespace std;

int main(int argc, char *argv[]){
  // vamos excluir este diretório
  char diretorio[] = "C:\\Dev-Cpp\\estudos";

  // vamos testar se houve erro na exclusão do diretório
  if(rmdir(diretorio) == -1){
    cout << "Erro: " << strerror(errno) << endl;
  }
  else{
    cout << "Diretório excluído com sucesso" << endl;
  }

  system("PAUSE"); // pausa o programa
  return EXIT_SUCCESS;
}

É possível usar a versão Unicode de _rmdir(), ou rmdir(). O método _wrmdir(), também presente em direct.h é útil quando precisamos internacionalizar nossas aplicações. Veja o exemplo:

----------------------------------------------------------------------
Se precisar de ajuda com o código abaixo, pode me chamar
no WhatsApp +55 (62) 98553-6711 (Osmar)
----------------------------------------------------------------------

#include <iostream>
#include <direct.h>

using namespace std;

int main(int argc, char *argv[]){
  // vamos excluir este diretório
  wchar_t diretorio[] = L"C:\\Dev-Cpp\\estudos";

  // vamos testar se houve erro na exclusão do diretório
  if(_wrmdir(diretorio) == -1){
    cout << "Erro: " << strerror(errno) << endl;
  }
  else{
    cout << "Diretório excluído com sucesso" << endl;
  }

  system("PAUSE"); // pausa o programa
  return EXIT_SUCCESS;
}



C++ ::: Win32 API (Windows API) ::: Arquivos e Diretórios

Como renomear arquivos e diretórios em C++ usando a função MoveFile() da API do Windows

Quantidade de visualizações: 8692 vezes
A função MoveFile() da API do Windows pode ser usada quando precisamos renomear um arquivo ou diretório. Veja seu protótipo:

BOOL WINAPI MoveFile(
  LPCTSTR lpExistingFileName,
  LPCTSTR lpNewFileName
);


Note que só precisamos fornecer o nome atual e o novo nome do arquivo ou diretório que queremos renomear. Se houver algum erro ao renomear o arquivo ou diretório, a função MoveFile() retornará o valor 0 (zero). Se a operação for efetuada com sucesso, um valor diferente de 0 (zero) será retornado. É sempre uma boa idéia usar a função GetLastError() para retornar o código do erro em caso de falha.

Veja um trecho de código no qual renomeamos um arquivo:

----------------------------------------------------------------------
Se precisar de ajuda com o código abaixo, pode me chamar
no WhatsApp +55 (62) 98553-6711 (Osmar)
----------------------------------------------------------------------

#include <cstdlib>
#include <iostream>
#include <windows.h>

using namespace std;

int main(int argc, char *argv[]){
  // nome atual do arquivo
  CHAR nome_atual[] = "C:\\testes.txt";
  // novo nome do arquivo
  CHAR nome_novo[] = "C:\\novo.txt";
  
  // vamos renomear o arquivo
  if(MoveFile(nome_atual, nome_novo)){
    cout << "Arquivo renomeado com sucesso." << endl;                      
  }
  else{
    cout << "Erro ao renomear o arquivo: " << 
      GetLastError() << endl;     
  }
  
  system("PAUSE");
  return EXIT_SUCCESS;
}

Aqui nós estamos alterando o nome do arquivo testes.txt para novo.txt. Os possíveis erros nesta operação são:

a) ERROR_FILE_NOT_FOUND - Ocorre quando o arquivo fornecido como primeiro argumento para a função MoveFile() não existe. O código para este erro é 2 e a mensagem em português é "O sistema não pode encontrar o arquivo especificado (The system cannot find the file specified)".

b) ERROR_ALREADY_EXISTS - Ocorre quando o arquivo fornecido como segundo argumento para a função MoveFile() já existe. O código para este erro é 183 e a mensagem em português é "Não é possível criar um arquivo já existente (Cannot create a file when that file already exists)".

Veja agora um trecho de código no qual renomeamos um diretório:

----------------------------------------------------------------------
Se precisar de ajuda com o código abaixo, pode me chamar
no WhatsApp +55 (62) 98553-6711 (Osmar)
----------------------------------------------------------------------

#include <cstdlib>
#include <iostream>
#include <windows.h>

using namespace std;

int main(int argc, char *argv[]){
  // nome atual do diretório
  CHAR nome_atual[] = "C:\\imagens";
  // novo nome do diretório
  CHAR nome_novo[] = "C:\\imagens2";
  
  // vamos renomear o diretório
  if(MoveFile(nome_atual, nome_novo)){
    cout << "Diretório renomeado com sucesso." << endl;                      
  }
  else{
    cout << "Erro ao renomear o diretório: " << 
      GetLastError() << endl;     
  }
  
  system("PAUSE");
  return EXIT_SUCCESS;
}



Desafios, Exercícios e Algoritmos Resolvidos de C++

Veja mais Dicas e truques de C++

Dicas e truques de outras linguagens

Códigos Fonte

Programa de Gestão Financeira Controle de Contas a Pagar e a Receber com Cadastro de Clientes e FornecedoresSoftware de Gestão Financeira com código fonte em PHP, MySQL, Bootstrap, jQuery - Inclui cadastro de clientes, fornecedores e ticket de atendimento
Diga adeus às planilhas do Excel e tenha 100% de controle sobre suas contas a pagar e a receber, gestão de receitas e despesas, cadastro de clientes e fornecedores com fotos e histórico de atendimentos. Código fonte completo e funcional, com instruções para instalação e configuração do banco de dados MySQL. Fácil de modificar e adicionar novas funcionalidades. Clique aqui e saiba mais
Controle de Estoque completo com código fonte em PHP, MySQL, Bootstrap, jQuery - 100% funcional e fácil de modificar e implementar novas funcionalidadesControle de Estoque completo com código fonte em PHP, MySQL, Bootstrap, jQuery - 100% funcional e fácil de modificar e implementar novas funcionalidades
Tenha o seu próprio sistema de controle de estoque web. com cadastro de produtos, categorias, fornecedores, entradas e saídas de produtos, com relatórios por data, margem de lucro e muito mais. Código simples e fácil de modificar. Acompanha instruções para instalação e criação do banco de dados MySQL. Clique aqui e saiba mais

Linguagens Mais Populares

1º lugar: Java
2º lugar: Python
3º lugar: C#
4º lugar: PHP
5º lugar: C
6º lugar: Delphi
7º lugar: JavaScript
8º lugar: C++
9º lugar: VB.NET
10º lugar: Ruby



© 2025 Arquivo de Códigos - Todos os direitos reservados
Neste momento há 56 usuários muito felizes estudando em nosso site.