C ::: Dicas & Truques ::: Ordenação e Pesquisa (Busca)

Ordenação e pesquisa em C - Como ordenar um vetor de inteiros usando a ordenação Insertion Sort (Ordenação por Inserção)

Quantidade de visualizações: 3059 vezes
A ordenação Insertion Sort, ou Ordenação por Inserção, possui uma complexidade de tempo de execução igual à ordenação Bubble Sort (Ordenação da Bolha), ou seja, O(n2). Embora mais rápido que o Bubble Sort, e ser um algorítmo de ordenação quadrática, a ordenação Insertion Sort é bastante eficiente para problemas com pequenas entradas, sendo o mais eficiente entre os algoritmos desta ordem de classificação, porém, nunca recomendada para um grande conjunto de dados.

A forma mais comum para o entendimento da ordenação Insertion Sort é compará-la com forma pela qual algumas pessoas organizam um baralho num jogo de cartas. Imagine que você está jogando as cartas. Você está com as cartas na mão e elas estão ordenadas. Você recebe uma nova carta e deve colocá-la na posição correta da sua mão de cartas, de forma que as cartas obedeçam à ordenação.

A cada nova carta adicionada à sua mão de cartas, a nova carta pode ser menor que algumas das cartas que você já tem na mão ou maior, e assim, você começa a comparar a nova carta com todas as cartas na sua mão até encontrar sua posição correta. Você insere a nova carta na posição correta, e, novamente, a sua mão é composta de cartas totalmente ordenadas. Então, você recebe outra carta e repete o mesmo procedimento. Então outra carta, e outra, e assim em diante, até não receber mais cartas.

Esta é a ideia por trás da ordenação por inserção. Percorra as posições do vetor (array), começando com o índice 1 (um). Cada nova posição é como a nova carta que você recebeu, e você precisa inseri-la no lugar correto no sub-vetor ordenado à esquerda daquela posição.

Vamos ver a implementação na linguagem C agora? Observe o seguinte código, no qual temos um vetor de inteiros com os elementos {4, 6, 2, 8, 1, 9, 3, 0, 11}:

#include <stdio.h>
#include <stdlib.h>
 
// função que permite ordenar um vetor de inteiros
// usando a ordenação Insertion Sort
void insertionSort(int vetor[], int tam){
  int i, temp, j;
  
  // este laço varre os elementos a partir do segundo
  // elemento, ou seja, o índice 1
  for(i = 1; i < tam; i++){
    // guardamos o elemento atual em temp
    temp = vetor[i];
		
    for(j = i; ((j > 0) && (vetor[j - 1] > temp)); j--){ 
      vetor[j] = vetor[j - 1]; // houve uma troca
    }
    
    vetor[j] = temp; // colocamos temp em seu devido lugar
  }
}  
 
int main(int argc, char *argv[]){
  int valores[] = {4, 6, 2, 8, 1, 9, 3, 0, 11};
  int i, tamanho = 9;
 
  // imprime a matriz sem a ordenação
  puts("Sem ordenação:\n");
  for(i = 0; i < 9; i++){
    printf("%d ", valores[i]);
  }
 
  // vamos ordenar a matriz
  insertionSort(valores, tamanho);
 
  // imprime a matriz ordenada
  puts("\n\nOrdenada usando Insertion Sort:\n");
  for(i = 0; i < 9; i++){
    printf("%d ", valores[i]);
  }   
  
  printf("\n\n");
  system("PAUSE");
  return 0;
}

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

Sem ordenação:

4 6 2 8 1 9 3 0 11

Ordenada usando Insertion Sort:

0 1 2 3 4 6 8 9 11


Python ::: Tkinter GUI Toolkit ::: Entry

Como setar o foco em uma caixa de texto Entry do Tkinter usando a função focus_set()

Quantidade de visualizações: 1218 vezes
Em várias situações durante o processo de programação em Tkinter nós precisamos, via programação, trocar o foco de uma caixa de texto para outra. Isso pode ser feito com o auxílio da função focus_set().

No código abaixo nós temos uma janela Tkinter com duas caixas de texto Entry e um botão Button. Experimente digitar conteúdo nas duas caixas de texto e depois clicar no botão. Você verá que o foco é colocado novamente na primeira caixa de texto.

Veja o código Python completo:

# vamos importar o módulo Tkinter
from tkinter import *
from tkinter.ttk import *

# variáveis globais
caixa_texto_1 = None

# método principal
def main():
  # acessamos a variável global
  global caixa_texto_1
  
  # vamos criar o frame principal da aplicação Tkinter
  janela = Tk()

  # agora definimos o tamanho da janela
  janela.geometry("600x400")

  # criamos uma caixa de texto Entry de linha única
  caixa_texto_1 = Entry(janela, width=40)
  caixa_texto_1.grid(column=0, row=0, sticky=W, padx=15, pady=10)

  # criamos uma segunda caixa de texto Entry de linha única
  caixa_texto_2 = Entry(janela, width=40)
  caixa_texto_2.grid(column=0, row=1, sticky=W, padx=15, pady=0)

  # vamos criar um botão Button
  btn = Button(janela, text="Definir Foco", width=20, command=definir_foco)
  btn.grid(column=0, row=2, sticky=W, padx=15, pady=10)

  # entramos no loop da aplicação
  janela.mainloop()  

# função para definir o foco na primeira caixa de texto
def definir_foco():
  # definimos o foco na primeira caixa de texto Entry
  caixa_texto_1.focus_set()

if __name__== "__main__":
  main()



PHP ::: Dicas & Truques ::: Data e Hora

PHP para iniciantes - Como obter a diferença em horas entre duas datas (e suas respectivas horas)

Quantidade de visualizações: 68 vezes
Nesta dica eu mostro como podemos usar as funções mktime() e gmdate() da linguagem PHP para obter e retornar a diferença em horas entre duas datas, e suas horas, é claro. Note que vamos fornecer duas datas diferentes (e suas horas) e vamos obter a diferença entre elas em segundos.

Veja o código completo:

<head>
<title>Estudando PHP</title>
</head>
<body>

<?php
  // data e hora inicial = 23/11/2006 - 13:23:15
  $data_inicial = mktime(13, 23, 15, 11, 23, 2006);
  // data e hora final = 23/11/2006 - 10:23:15
  $data_final = mktime(22, 23, 15, 11, 23, 2006);
  $segundos = $data_final - $data_inicial;
  echo "A diferença em horas entre as duas 
    datas é: " . gmdate("H:i:s", $segundos);
?>
 
</body>
</html>

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

A diferença em horas entre as duas datas é: 09:00:00


VB.NET ::: VB.NET para Engenharia ::: Geometria Analítica e Álgebra Linear

Como somar os elementos da diagonal principal de uma matriz em VB.NET

Quantidade de visualizações: 283 vezes
A Matriz quadrada é um tipo especial de matriz que possui o mesmo número de linhas e o mesmo número de colunas, ou seja, dada uma matriz Anxm, ela será uma matriz quadrada se, e somente se, n = m, onde n é o número de linhas e m é o número de colunas.

Em geral as matrizes quadradas são chamadas de Matrizes de Ordem n, onde n é o número de linhas e colunas. Dessa forma, uma matriz de ordem 4 é uma matriz que possui 4 linhas e quatro colunas.

Toda matriz quadrada possui duas diagonais, e elas são muito exploradas tanto na matemática quanto na construção de algorítmos. Essas duas diagonais são chamadas de
Diagonal Principal e Diagonal Secundária.

A diagonal principal de uma matriz quadrada une o seu canto superior esquerdo ao canto inferior direito. Veja:



Nesta dica veremos como calcular a soma dos valores dos elementos da diagonal principal de uma matriz usando VB.NET. Para isso, só precisamos manter em mente que a diagonal principal de uma matriz A é a coleção das entradas Aij em que i é igual a j. Assim, tudo que temos a fazer é converter essa regra para código VB.NET.

Veja um trecho de código VB.NET completo no qual pedimos para o usuário informar os elementos da matriz e em seguida mostramos a soma dos elementos da diagonal superior:

Imports System

Module Program
  ' função principal do programa VB.NET
  Sub Main(args As String())
    ' vamos declarar e construir uma matriz de três linhas
    ' e três colunas
    Dim matriz(2, 2) As Integer
    ' guarda a soma dos elementos na diagonal principal
    Dim soma_diagonal As Integer = 0

    For i As Integer = 0 To matriz.GetUpperBound(0)
      For j As Integer = 0 To matriz.GetUpperBound(1)
        Console.Write("Informe o valor para a linha " & i & " e coluna " _
          & j & ": ")
        ' lê o número e guarda na linha e coluna especificadas
        matriz(i, j) = Integer.Parse(Console.ReadLine())
      Next
    Next

    ' vamos mostrar a matriz da forma que ela foi informada
    Console.WriteLine(vbCrLf & "Valores na matriz: " & vbCrLf)

    For i As Integer = 0 To matriz.GetUpperBound(0)
      For j As Integer = 0 To matriz.GetUpperBound(1)
        Console.Write(matriz(i, j).ToString().PadLeft(5) & "  ")
      Next
      ' passa para a próxima linha
      Console.WriteLine()
    Next

    ' vamos calcular a soma dos elementos da diagonal   
    ' principal
    For i As Integer = 0 To matriz.GetUpperBound(0)
      For j As Integer = 0 To matriz.GetUpperBound(1)
        If i = j Then
          soma_diagonal = soma_diagonal + matriz(i, j)
        End If
      Next
    Next

    ' finalmente mostramos a soma da diagonal principal
    Console.WriteLine(vbCrLf & "A soma dos elementos da diagonal principal é: " _
      & soma_diagonal)

    Console.WriteLine(vbCrLf & vbCrLf & "Pressione qualquer tecla para sair...")
    ' pausa o programa
    Console.ReadKey()
  End Sub

End Module

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

Informe o valor para a linha 0 e coluna 0: 3
Informe o valor para a linha 0 e coluna 1: 7
Informe o valor para a linha 0 e coluna 2: 9
Informe o valor para a linha 1 e coluna 0: 2
Informe o valor para a linha 1 e coluna 1: 4
Informe o valor para a linha 1 e coluna 2: 1
Informe o valor para a linha 2 e coluna 0: 5
Informe o valor para a linha 2 e coluna 1: 6
Informe o valor para a linha 2 e coluna 2: 8

   3   7   9
   2   4   1
   5   6   8

A soma dos elementos da diagonal principal é: 15



PHP ::: Dicas & Truques ::: Variáveis e Constantes

Como verificar se uma variável contém um valor numérico válido - Usando a função is_numeric() do PHP - Revisado

Quantidade de visualizações: 22471 vezes
Em várias situações nós precisamos verificar se uma variável ou constante possui um valor numérico válido. Para isso podemos usar a função is_numeric() da linguagem PHP. Esta função retorna um valor true se o argumento for um valor númerico válido e false em caso contrário.

Veja um exemplo completo de seu uso:

<?
  /*
  Este trecho de código mostra como usar a função
  is_numeric para verificar se o valor de uma variável
  é um valor numérico válido
  */
   
  $valor = 34; // válido
  // $valor = "45,3"; // inválido
  // $valor = "45.4"; // válido
  // $valor = ".5"; // válido
  if(is_numeric($valor))
    echo "$valor é um valor numérico válido";
  else
    echo "$valor NÃO é um valor numérico válido";
?>

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

34 é um valor numérico válido

Esta dica foi revisada e testada no PHP 8.


VB.NET ::: Dicas & Truques ::: Strings e Caracteres

Como inverter o conteúdo de uma string em VB.NET usando os métodos ToCharArray() e Reverse()

Quantidade de visualizações: 7893 vezes
Nesta dica mostrarei como podemos tirar proveito do método ToCharArray() da classe String e do método Reverse() da classe Array do VB.NET para inverter a ordem dos caracteres de uma palavra, frase ou texto.

Note que criamos uma função personalizada InverterString() que recebe uma string, a inverte e devolve uma nova string com a ordem dos caracteres invertida.

Veja o código completo para o exemplo:

Imports System

Module Program
  Sub Main(args As String())
    ' vamos declarar uma string
    Dim frase As String = "Gosto de VB.NET"

    ' mostramos a frase original
    Console.WriteLine("Frase original: " & frase)

    ' inverte o conteúdo da string
    frase = InverterString(frase)

    ' mostramos a frase invertida
    Console.WriteLine("A frase invertidade é: " & frase)

    Console.WriteLine(vbCrLf & "Pressione qualquer tecla para sair...")
    ' pausa o programa
    Console.ReadKey()
  End Sub

  ' Função que recebe uma string e a devolve invertida
  Function InverterString(ByVal str As String) As String
    Dim invertida As String
    Dim arrChar() As Char = str.ToCharArray()
    Array.Reverse(arrChar)
    invertida = arrChar
    Return invertida
  End Function
End Module

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

Frase original: Gosto de VB.NET
A frase invertidade é: TEN.BV ed otsoG


Java ::: Coleções (Collections) ::: HashMap

Como adicionar novos mapeamentos chave-valor a um HashMap do Java usando o método put()

Quantidade de visualizações: 9610 vezes
Novos mapeamentos chave-valor são adicionados a um HashMap da linguagem Java usando-se o método put(). Veja sua assinatura:

public V put(K key, V value)


Note que este método recebe a chave e o valor a ser inserido e retorna um objeto do mesmo tipo daquele fornecido no segundo argumento. Este retorno é muito útil para sabermos se o novo valor não sobrepôs um valor já existente. Se o retorno for null, o novo valor foi inserido. Caso contrário o retorno será o valor existente antes da sobreposição. Apenas tenha cuidado com valores null existentes como chaves ou valores. Nestes casos o retorno do método put não ajudará em nada.

Veja um exemplo do uso do método put():

package estudos;

import java.util.*;

public class Estudos{
  public static void main(String[] args){
    
    // vamos criar uma instância de HashMap
    HashMap<Integer, String> clientes = new HashMap<Integer, String>();

    // vamos adicionar três chaves e seus valores
    clientes.put(new Integer(1), "Osmar J. Silva");
    clientes.put(new Integer(2), "Salvador Miranda de Andrade");
    clientes.put(new Integer(3), "Marcos da Costa Santos");

    // é possível também referenciar o valor adicionado
    // ao HashMap, uma vez que este é o retorno do métoto put()
    String nome = clientes.put(new Integer(2), "Carlos"); 

    if(nome == null){
      System.out.println("Novo valor inserido com sucesso");
    }
    else{
      System.out.println("Valor já existia. Houve sopreposição"); 
    }

    System.exit(0);
  }
}

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

Valor já existia. Houve sopreposição


Delphi ::: Dicas & Truques ::: Data e Hora

Como retornar a hora atual em Delphi usando as funções Time(), GetTime() e TimeToStr()

Quantidade de visualizações: 19474 vezes
Como retornar a hora atual em Delphi usando as funções Time(), GetTime() e TimeToStr()

Em algumas situações precisamos obter a hora atual (apenas a hora, desconsiderando a data) do sistema. Em Delphi isso pode ser feito com o auxílio da função Time(), presente na unit SysUtils. Esta função não requer nenhum argumento e retorna a hora atual como um TDateTime. Veja o exemplo:

procedure TForm1.Button1Click(Sender: TObject);
var
  hora: TDateTime;
begin
  // vamos obter a hora atual
  hora := Time();

  // podemos também usar a função GetTime()
  //hora := GetTime();

  // vamos exibir o resultado
  ShowMessage(TimeToStr(hora));
end;

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

15:17:17

Note que podemos também obter a hora atual (sem a data) usando a função GetTime(), também na unit SysUtils.

Para fins de compatibilidade, esta dica foi escrita usando Delphi 2009.


C# ::: Dicas & Truques ::: Strings e Caracteres

Como substituir todos os espaços em uma string pelo caractere de underline em C# usando o método Replace() da classe String

Quantidade de visualizações: 8268 vezes
Nesta dica de C# eu trago um trecho de código que mostra como substituir todos os espaços em uma string pelo caractere de sublinhado (underline). Para a realização desta tarefa nós vamos usar o método Replace() da classe String da linguagem C#.

Veja o código completo para o exemplo:

using System;

namespace Estudos {
  class Program {
    static void Main(string[] args) {
      string frase = "Gosto muito de C#";
      Console.WriteLine("Frase original: " + frase);

      // substitui os espaços por underline
      frase = frase.Replace(" ", "_");
      Console.WriteLine("Depois da substituição: " + frase);

      Console.WriteLine("\n\nPressione uma tecla para sair...");
      Console.ReadKey();
    }
  }
}

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

Frase original: Gosto muito de C#
Depois da substituição: Gosto_muito_de_C#


Delphi ::: Dicas & Truques ::: Arrays e Matrix (Vetores e Matrizes)

Como declarar e inicializar uma matriz de Integer em Delphi

Quantidade de visualizações: 12351 vezes
Nesta dica eu mostrarei como declarar e inicializar uma matriz de inteiros (Integer) em Delphi. Mostrarei também como exibir o valor de cada elemento usando um laço For. Veja o código:

procedure TForm3.Button1Click(Sender: TObject);
var
  // vamos declarar uma matriz de 10 inteiros
  valores: array[1..10] of Integer;
  i: Integer;
begin
  // vamos inicializar a matriz com os números pares de 2 até 20
  for i := Low(valores) to High(valores) do
    begin
      valores[i] := i * 2;
    end;

  // vamos exibir os valores dos elementos
  for i := Low(valores) to High(valores) do
    begin
      Memo1.Lines.Add(IntToStr(valores[i]));
    end;
end;


Ao executar este código teremos o seguinte resultado:

2
4
6
8
10
12
14
16
18
20

Carregar Publicações Anteriores


Nossas 20 dicas & truques de programação mais populares

Você também poderá gostar das dicas e truques de programação abaixo

Nossas 20 dicas & truques de programação mais recentes

Últimos Projetos e Códigos Fonte Liberados Para Apoiadores do Site

Últimos Exercícios Resolvidos

E-Books em PDF

E-Book 350 Exercícios Resolvidos de Java - PDF com 500 páginas
Domine lógica de programação e a linguagem Java com o nosso E-Book 350 Exercícios Exercícios de Java, para você estudar onde e quando quiser.

Este e-book contém exercícios resolvidos abrangendo os tópicos: Java básico, matemática e estatística, programação dinâmica, strings e caracteres, entrada e saída, estruturas condicionais, vetores e matrizes, funções, laços, recursividade, internet, arquivos e diretórios, programação orientada a objetos e muito mais.
Ver Conteúdo do E-book
E-Book 650 Dicas, Truques e Exercícios Resolvidos de Python - PDF com 1.200 páginas
Domine lógica de programação e a linguagem Python com o nosso E-Book 650 Dicas, Truques e Exercícios Exercícios de Python, para você estudar onde e quando quiser.

Este e-book contém dicas, truques e exercícios resolvidos abrangendo os tópicos: Python básico, matemática e estatística, banco de dados, programação dinâmica, strings e caracteres, entrada e saída, estruturas condicionais, vetores e matrizes, funções, laços, recursividade, internet, arquivos e diretórios, programação orientada a objetos e muito mais.
Ver Conteúdo do E-book

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