Você está aqui: C ::: Dicas & Truques ::: Ordenação e Pesquisa (Busca)

Como implementar a ordenação Quicksort em C - Apostila de C para iniciantes

Quantidade de visualizações: 252 vezes
A ordenação Quicksort é um dos algorítmos de ordenação mais encontrados em aplicações reais de programação. No Delphi esta ordenação é encontrada no objeto TList. No Java podemos encontrá-lo no método Arrays.sort(). Na linguagem C a ordenação Quicksort é implementada na função qsort() da biblioteca padrão.

O algoritmo de ordenação Quicksort é do tipo dividir para conquistar (divide-and-conquer principle). Neste tipo de algoritmo o problema é dividido em sub-problemas e a solução é concatenada quando as chamadas recursivas atingirem o caso base.

O vetor (ou array) a ser ordenado é dividido em duas sub-listas por um elemento chamado pivô, resultando em uma lista com elementos menores que o pivô e outra lista com os elementos maiores que o pivô. Esse processo é repetido para cada chamada recursiva. Sim, a ordenação Quicksort faz uso extensivo de recursividade, razão pela qual devemos ter muito cuidado para não estourar a pilha do sistema.

Existem muitos estudos sobre o pivô ideal para a ordenação Quicksort. Nessa dica adotarei o último elemento do array ou sub-array como pivô. Em vetores não ordenados essa estratégia, em geral, resulta em uma boa escolha.

Vamos ao código C então? Veja um programa C completo demonstrando o uso da ordenação Quicksort para um array de 10 elementos inteiros:

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

#include <stdio.h>
#include <stdlib.h>

// função de implementação da ordenação Quicksort
void quick_sort(int vetor[], int inicio, int fim) {
  int indice_particao;
	
  // o início é menor que o fim?
  if (inicio < fim) {
    // vamos obter o novo índice da partição
    indice_particao = particionar(vetor, inicio, fim);

    // efetuamos novas chamadas recursivas
    quick_sort(vetor, inicio, indice_particao - 1);
    quick_sort(vetor, indice_particao + 1, fim);
  }
}
  
// função que retorna o índice de partição
int particionar(int vetor[], int inicio, int fim) {
  // para guardar o pivô
  int pivot = vetor[fim];
  int i = (inicio - 1);
  int j, temp; 
 
  for (j = inicio; j < fim; j++) {
    if (vetor[j] <= pivot) {
      i++;

      // fazemos a troca
      temp = vetor[i];
      vetor[i] = vetor[j];
      vetor[j] = temp;
    }
  }

  // efetua a troca
  temp = vetor[i + 1];
  vetor[i + 1] = vetor[fim];
  vetor[fim] = temp;

  return i + 1;
}

// função principal do programa
int main(int argc, char *argv[]){
  // vamos declarar um array de 10 elementos
  int valores[10];
  int i;
	  
  // vamos pedir ao usuário para informar os valores para o vetor
  for(i = 0; i < 10; i++){
    printf("Informe o valor do elemento %d: ", i);
    scanf("%d", &valores[i]); 
  }

  // vamos mostrar o array informado
  printf("\nO array informado foi:\n\n");
  for(i = 0; i < 10; i++){
    printf("%d   ", valores[i]);
  }
    
  // vamos ordenar o vetor usando a ordenação Quicksort
  quick_sort(valores, 0, 10 - 1);
    
  // vamos mostrar o array ordenado
  printf("\n\nO array ordenado é:\n\n");
  for(i = 0; i < 10; i++){
    printf("%d   ", valores[i]);
  }
  
  printf("\n\n");
  system("PAUSE");
  return 0;
}

Ao executar este código C nós teremos o seguinte resultado:

Informe o valor do elemento 0: 7
Informe o valor do elemento 1: 2
Informe o valor do elemento 2: 43
Informe o valor do elemento 3: 1
Informe o valor do elemento 4: 9
Informe o valor do elemento 5: 6
Informe o valor do elemento 6: 22
Informe o valor do elemento 7: 3
Informe o valor do elemento 8: 37
Informe o valor do elemento 9: 5

O array informado foi:

7 2 43 1 9 6 22 3 37 5

O array ordenado é:

1 2 3 5 6 7 9 22 37 43

Link para compartilhar na Internet ou com seus amigos:

C ::: Dicas & Truques ::: Matemática e Estatística

Como calcular juros compostos e montante usando C

Quantidade de visualizações: 11867 vezes
O regime de juros compostos é o mais comum no sistema financeiro e portanto, o mais útil para cálculos de problemas do dia-a-dia. Os juros gerados a cada período são incorporados ao principal para o cálculo dos juros do período seguinte.

Chamamos de capitalização o momento em que os juros são incorporados ao principal. Após três meses de capitalização, temos:

1º mês: M = P .(1 + i)
2º mês: o principal é igual ao montante do mês anterior: M = P x (1 + i) x (1 + i)
3º mês: o principal é igual ao montante do mês anterior: M = P x (1 + i) x (1 + i) x (1 + i)

Simplificando, obtemos a fórmula:

M = P . (1 + i)^n

Importante: a taxa i tem que ser expressa na mesma medida de tempo de n, ou seja, taxa de juros ao mês para n meses.

Para calcularmos apenas os juros basta diminuir o principal do montante ao final do período:

J = M - P

Vejamos um exemplo:

Considerando que uma pessoa empresta a outra a quantia de R$ 2.000,00, a juros compostos, pelo prazo de 3 meses, à taxa de 3% ao mês. Quanto deverá ser pago de juros?

Veja o código C para a resolução:

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

#include <stdio.h>
#include <stdlib.h>
#include <math.h>

int main(int argc, char *argv[])
{
  float principal = 2000.00;
  float taxa = 0.03; // 3%
  int meses = 3;

  float montante = principal * pow((1 + taxa), meses);
  float juros = montante - principal;

  printf("O total de juros a ser pago é: %f\n", juros);
  printf("O montante a ser pago é: %f", montante);

  printf("\n\n");
  system("pause");
  return 0;
}

Um outra aplicação interessante é mostrar mês a mês a evolução dos juros. Veja o código a seguir:

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

#include <stdio.h>
#include <stdlib.h>
#include <math.h>

int main(int argc, char *argv[])
{
  float principal = 2000.00;
  float taxa = 0.03; // 3%
  int meses = 3;
  float anterior = 0.0;
  float montante;
  float juros;

  for(int i = 1; i <= meses; i++){
    montante = principal * pow((1 + taxa), i);
    juros = montante - principal - anterior;

    anterior += juros;

    printf("Mês: %d - Montante: %f - Juros %f\n", i, montante, juros);
  }

  printf("\n\n");
  system("pause");
  return 0;
}



C ::: Dicas & Truques ::: Struct (Estruturas, Registros)

Como escrever um função que retorna uma estrutura (struct) usando a linguagem C

Quantidade de visualizações: 16162 vezes
Muitas vezes precisamos escrever funções que retornam estruturas, ou melhor, que alocam e retornam ponteiros para estruturas. Esta não é, definitivamente, uma tarefa para iniciantes em C. Contudo, esta dica lhe fornecerá um código completo indicando-lhe uma das formas mais simples de conseguir tal proeza.

Antes de executar o código, porém, dê uma olhada atenta na função obter_livro(). Veja que esta função recebe o título, o código e o número de páginas de um livro. Em seguida a função aloca memória para uma estrutura, preenche seus membros e retorna um ponteiro para tal estrutura. Eis a listagem completa:

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

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

// define a estrutura Livro
struct Livro{
  char *titulo;
  int codigo;
  int paginas;
};

// função que aloca e retorna um ponteiro para uma
// estrutura Livro
struct Livro* obter_livro(char *titulo, int codigo, int paginas){
  // aloca memória para uma estrutura Livro
  struct Livro *temp = (struct Livro*)malloc(sizeof(struct Livro));

  // preeche os membros da estrutura
  temp->titulo = titulo;
  temp->codigo = codigo;
  temp->paginas = paginas;

  return temp;
}

int main(int argc, char *argv[]){
  // obtém uma instância da estrutura Livro
  struct Livro *a = obter_livro("Programando em Java", 345, 120);

  // verifica se a estrutura foi retornada com
  // sucesso
  if(a != NULL){
    printf("Titulo: %s\nCodigo: %d\nPaginas: %d\n",
      a->titulo, a->codigo, a->paginas);
  }

  // obtém uma segunda instância da estrutura Livro
  struct Livro *b = obter_livro("JavaScript - Guia", 540, 800);

  // verifica se a estrutura foi retornada com
  // sucesso
  if(b != NULL){
    printf("Titulo: %s\nCodigo: %d\nPaginas: %d\n",
      b->titulo, b->codigo, b->paginas);
  }

  puts("\n\n");
  system("PAUSE");
  return 0;
}

Ao executar este código nós teremos o seguinte resultado:

Titulo: Programando em Java
Codigo: 345
Paginas: 120
Titulo: JavaScript - Guia
Codigo: 540
Paginas: 800

Pressione qualquer tecla para continuar...


C ::: Dicas & Truques ::: Recursão (Recursividade)

Como somar os elementos de um vetor em C usando uma função recursiva - Linguagem C para iniciantes

Quantidade de visualizações: 5291 vezes
Em algumas ocasiões ficamos imaginando o que pode ser feito com os métodos e funções recursivas. A resposta é: praticamente tudo.

Veja abaixo um programa C completo no qual eu mostro como escrever uma função recursiva que recebe um array e mostra a soma de seus elementos (lembre-se de que um array é o mesmo que vetor, ou seja, uma matriz de uma linha e várias colunas):

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

#include <stdio.h>
#include <stdlib.h>

// função recursiva para somar todos os elementos de um array
int somar(int indice, int tamanho, int vetor[]){
  // o caso base...hora de encerrar a recursividade
  if(indice == (tamanho - 1)){
    return vetor[indice];
  }
  else{
    // ainda não é o caso base? vamos fazer uma nova chamada à função somar()
    return vetor[indice] + somar(indice + 1, 10, vetor);
  }
}

// função principal do programa
int main(int argc, char *argv[]){
  // vamos declarar um array de 10 elementos
  int valores[10];
  int i, soma;

  // vamos pedir ao usuário para informar os valores para o vetor
  for(i = 0; i < 10; i++){
    printf("Informe o valor do elemento %d: ", i);
    scanf("%d", &valores[i]); 
  }

  // vamos efetuar uma chamada à função recursiva somar();
  // nota que estamos passando o índice inicial, o tamanho do
  // array e o array em si
  soma = somar(0, 10, valores);
  printf("\nA soma dos elementos è: %d", soma);
  
  printf("\n\n");
  system("PAUSE");
  return 0;
}

Ao executarmos este código C nós teremos o seguinte resultado:

Informe o valor do elemento 0: 7
Informe o valor do elemento 1: 3
Informe o valor do elemento 2: 1
Informe o valor do elemento 3: 3
Informe o valor do elemento 4: 8
Informe o valor do elemento 5: 9
Informe o valor do elemento 6: 4
Informe o valor do elemento 7: 3
Informe o valor do elemento 8: 2
Informe o valor do elemento 9: 6

A soma dos elementos é: 46


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á 48 usuários muito felizes estudando em nosso site.