Python ::: Dicas & Truques ::: Ordenação e Pesquisa (Busca) |
Como usar a busca binária em Python - Pesquisa binária na linguagem PythonQuantidade de visualizações: 672 vezes |
A busca binária, ou pesquisa binária, é um algoritmo eficiente para encontrar um item em uma lista (vetor ou array) ordenada. Sim, os itens devem, obrigatoriamente, estar ordenados. O processo é bem simples. A busca binária começa a partir do meio da lista e compara o item nesta posição com o valor sendo pesquisado. Se o valor não for encontrado e for menor que o item no meio da lista, o algoritmo passa para a porção à esquerda da lista, eliminando, assim, metade dos elementos do vetor ou array (a porção maior que o valor pesquisado). Se o valor não for encontrado e for maior que o item no meio da lista, então a busca reinicia a partir da metade da sub-lista à direita (os itens maiores que o valor pesquisado). Essa divisão continua até que o valor seja encontrado ou não seja mais possível dividir a lista pela metade. Se um array ou vetor possuir 100 elementos e usarmos a busca binária nele, precisaremos efetuar no máximo 7 tentativas para encontrar o valor desejado. Se a lista possuir 4 bilhões de itens nós teremos que fazer no máximo 32 tentativas. Isso acontece porque a pesquisa binária é executada em tempo logarítmico, ou seja, log2 n, onde n é a quantidade de itens no vetor. Dessa forma, se tivemos 1.000 itens em um array, log2 1000 = 10 tentativas. Lembre-se de que, na programação log e log2 retornam resultados diferentes: log(10) = 2.302585092994046 enquanto log2(10) = 3.321928094887362. Na análise da busca binária nós usamos sempre log2. Vamos agora ver como podemos codificar a busca binária em Python. Veja o código a seguir: # função principal do programa def main(): # vamos criar uma lista ordenada de inteiros valores = [3, 5, 7, 8, 9, 12, 43, 50, 52, 60] print("Os valores da lista são: {0}".format(valores)) # vamos pedir o item a ser pesquisado numero = int(input("Informe o número a ser pesquisado: ")) # agora vamos pesquisar o número no array usando a pesquisa # binária # a variável esquerda aponta para o primeiro elemento do vetor esquerda = 0 # a variável direita aponta para o último elemento do vetor direita = len(valores) - 1 # para indicar se o valor foi encontrado encontrado = False # enquanto houver mais de um elemento a ser comparado while esquerda <= direita: # obtemos o elemento na metade da lista meio = (esquerda + direita) // 2 # fazemos a comparação if numero == valores[meio]: print("O número foi encontrado no índice {0}".format( meio)) encontrado = True break # sai do laço # o item atual é maior que o valor pesquisado? if valores[meio] > numero: direita = meio - 1 # o item atual é menor que o valor pesquisado? else: esquerda = meio + 1 # o valor foi encontrado? if not encontrado: print("O valor pesquisado não foi encontrado") if __name__== "__main__": main() Ao executar este código Python nós teremos o seguinte resultado: Os valores da lista são: [3, 5, 7, 8, 9, 12, 43, 50, 52, 60] Informe o número a ser pesquisado: 9 O número foi encontrado no índice 4 |
Java ::: Desafios e Lista de Exercícios Resolvidos ::: Java Básico |
Exercícios Resolvidos de Java - Uma locadora de charretes cobra R$ 10,00 de taxa para cada 3 horas de uso destasQuantidade de visualizações: 6039 vezes |
Exercício Resolvido de Java - Uma locadora de charretes cobra R$ 10,00 de taxa para cada 3 horas de uso destas Pergunta/Tarefa: Uma locadora de charretes cobra R$ 10,00 de taxa para cada 3 horas de uso destas e R$ 5,00 para cada 1 hora abaixo destas 3 horas. Faça um programa (algorítmo) Java que leia a quantidade de horas que a charrete foi usada, calcule e escreva o valor a ser pago pelo cliente. Sua saída deverá ser parecida com: Quantidade de horas que a charrete foi usada: 7 Valor total a ser pago: R$ 25,00 Veja a resolução comentada deste exercício usando Java console: package exercicio; import java.text.NumberFormat; import java.util.Scanner; public class Exercicio { public static void main(String[] args) { // vamos fazer a leitura usando a classe Scanner Scanner entrada = new Scanner(System.in); // vamos ler a quantidade de horas que a charrete foi usada System.out.print("Quantidade de horas que a charrete foi usada: "); int horas = Integer.parseInt(entrada.nextLine()); // vamos calcular o valor por 3 horas exatas int valor = horas / 3; // valor a ser pago para cada hora abaixo de 3 int restante = horas % 3; // finalmente calculamos o valor total a ser pago double valor_total = (valor * 10.0) + (restante * 5); // e exibimos o resultado NumberFormat formato = NumberFormat.getCurrencyInstance(); System.out.println("Valor total a ser pago: " + formato.format(valor_total)); } } |
Portugol ::: Dicas & Truques ::: Cadeias e Caracteres |
Como acessar os caracteres individuais de uma palavra ou frase em Portugol usando a função obter_caracter() da biblioteca TextoQuantidade de visualizações: 536 vezes |
Em algumas situações nós precisamos acessar os caracteres individuais de uma palavra ou frase no Portugol Studio ou Portugol Web Studio. Para isso nós podemos usar a função obter_caracter() da biblioteca Texto. Esta função pede, como primeiro argumento, a palavra ou frase a partir da qual o caractere será extraído e, como segundo argumento, o índice do caractere (sempre começando em 0 para o primeiro caractere). Veja um programa Portugol completo no qual obtemos o primeiro caractere de uma palavra: programa { // vamos importar a biblioteca Texto inclua biblioteca Texto --> tx funcao inicio() { cadeia palavra = "PORTUGOL" caracter letra = tx.obter_caracter(palavra, 0) escreva("A letra retornada é: ", letra) } } Ao executar este código Portugol nós teremos o seguinte resultado: A letra retornada é: P Veja agora como podemos usar o laço PARA para percorrer e exibir todos os caracteres individuais da palavra ou frase: programa { // vamos importar a biblioteca Texto inclua biblioteca Texto --> tx funcao inicio() { cadeia palavra = "PORTUGOL" para (inteiro i = 0; i <= tx.numero_caracteres(palavra) - 1; i++) { caracter letra = tx.obter_caracter(palavra, i) escreva("A letra é: ", letra, "\n") } } } Ao executar o código novamente nós teremos o seguinte resultado: A letra é: P A letra é: O A letra é: R A letra é: T A letra é: U A letra é: G A letra é: O A letra é: L |
C++ ::: Win32 API (Windows API) ::: Processos |
Como usar a função EnumProcesses() da WinAPI em seus códigos C++ para obter os identificadores de cada processo ativo no WindowsQuantidade de visualizações: 8469 vezes |
A função EnumProcesses() pode ser usada quando queremos obter os ids de todos os processos sendo executados no momento no Windows. Veja o protótipo desta função:BOOL WINAPI EnumProcesses( DWORD* pProcessIds, DWORD cb, DWORD* pBytesReturned ); Esta função possui três parâmetros: a) DWORD* pProcessIds - Um ponteiro para uma matriz que receberá a lista de identificadores dos processos. É importante definir uma matriz um pouco grande, visto que não sabemos de antemão quantos processos serão retornados. b) DWORD cb - O tamanho da matriz pProcessIds em bytes. c) DWORD* pBytesReturned - O números de bytes retornados na matriz pProcessIds. Podemos facilmente saber quantos processos foram encontrados simplesmente dividindo o número de bytes retornados pela quantidade de bytes em um DWORD. Veja um trecho de código no qual listamos os ids de todos os processos sendo executados atualmente. #include <cstdlib> #include <iostream> #include <windows.h> #include <psapi.h> /* Este exemplo usa o header <psapi.h> É necessário fazer uma referência à psapi.lib */ using namespace std; int main(int argc, char *argv[]){ DWORD processos[1024]; // vamos listar até 1024 processos DWORD pBytesReturned; // bytes retornados pela função EnumProcesses() // vamos listar os processos EnumProcesses(processos, sizeof(processos), &pBytesReturned); // quantidade de processos retornados int retornados = pBytesReturned / sizeof(DWORD); // agora vamos listar os ids dos processos retornados for(int i = 0; i < retornados; i++){ if(!processos[i] == 0){ cout << "Processo " << (i + 1) << ": " << processos[i] << endl; } } system("PAUSE"); return EXIT_SUCCESS; } O id de um processo pode ser fornecido para muitas funções úteis do Windows, entre elas OpenProcess(). Veja um trecho de código no qual fechamos (forçadamente) um processo mediante o fornecimento de seu id: #include <cstdlib> #include <iostream> #include <windows.h> using namespace std; int main(int argc, char *argv[]){ // vamos fechar o processo com o id 3040 // CUIDADO: Verifique o id do processo antes de fechá-lo // pode ser que você esteja fechando processos essenciais // para o bom funcionamento do Windows // vamos abrir o processo desejado // vai retornar ERROR_INVALID_HANDLE se o processo não // puder ser aberto HANDLE hProcesso = OpenProcess(PROCESS_TERMINATE, 0, 3040); // vamos fechar o processo if(TerminateProcess(hProcesso, 0)){ cout << "Processo finalizado com sucesso." << endl; } else{ cout << "Erro ao finalizar o processo: " << GetLastError() << endl; } // vamos fechar o handle do processo CloseHandle(hProcesso); system("PAUSE"); return EXIT_SUCCESS; } |
Delphi ::: Data Controls (Controles de Dados) ::: TDBGrid |
Como usar a propriedade PickList para definir ou obter a lista de escolhas para uma determinada coluna do TDBGrid do DelphiQuantidade de visualizações: 11706 vezes |
A propriedade PickList, do tipo TStrings, é usada quando queremos fornecer uma lista de itens da qual um poderá ser escolhido como conteúdo da célula pertencente a uma determinada coluna. Em tempo de design podemos definir os itens da lista clicando no DBGrid e escolhendo a opção Columns Editor. Em seguida escolha a coluna desejada e dê duplo-clique na propriedade PickList. Imediatamente o String List Editor será exibido. Neste editor podemos inserir os itens, cada um em sua linha. Em tempo de execução a lista de itens será exibida quando a célula estiver em edição. Note que, isso só acontecerá se o valor cbsAuto estiver definido para a propriedade ButtonStyle da coluna. Em tempo de execução podemos adicionar itens na propriedade PickList usando o seguinte trecho de código: procedure TForm3.Button3Click(Sender: TObject); begin // vamos adicionar um novo item na PickList da primeira coluna DBGrid1.Columns[0].PickList.Add('40'); end; Veja agora um trecho de código no qual acessamos a propriedade PickList da coluna e exibimos seu conteúdo em um TMemo: procedure TForm3.Button3Click(Sender: TObject); var i: Integer; begin // vamos adicionar o conteúdo da PickList da primeira coluna // a um TMemo for i := 0 to DBGrid1.Columns[0].PickList.Count - 1 do begin Memo1.Lines.Add(DBGrid1.Columns[0].PickList[i]); end; end; Como a propriedade PickList da classe TColumn é do tipo TStrings, podemos efetuar várias operações na lista de itens, tais como, adicionar novos itens, excluir, ordenar os itens, etc. Esta dica foi escrita e testada no Delphi 2009. |
Delphi ::: Dicas & Truques ::: Trigonometria - Funções Trigonométricas |
Como calcular o cateto oposto dadas as medidas da hipotenusa e do cateto adjascente em DelphiQuantidade de visualizações: 2794 vezes |
Todos estamos acostumados com o Teorema de Pitágoras, que diz que "o quadrado da hipotenusa é igual à soma dos quadrados dos catetos". Baseado nessa informação, fica fácil retornar a medida do cateto oposto quando temos as medidas da hipotenusa e do cateto adjascente. Isso, claro, via programação em linguagem Delphi. Comece observando a imagem a seguir: ![]() Veja que, nessa imagem, eu já coloquei os comprimentos da hipotenusa, do cateto oposto e do cateto adjascente. Para facilitar a conferência dos cálculos, eu coloquei também os ângulos theta (que alguns livros chamam de alfa) e beta já devidamente calculados. A medida da hipotenusa é, sem arredondamentos, 36.056 metros. Então, sabendo que o quadrado da hipotenusa é igual à soma dos quadrados dos catetos (Teorema de Pitógoras): \[c^2 = a^2 + b^2\] Tudo que temos que fazer é mudar a fórmula para: \[a^2 = c^2 - b^2\] Veja que agora o quadrado do cateto oposto é igual ao quadrado da hipotenusa menos o quadrado do cateto adjascente. Não se esqueça de que a hipotenusa é o maior lado do triângulo retângulo. Veja agora como esse cálculo é feito em linguagem Delphi: procedure TForm2.Button1Click(Sender: TObject); var a, b, c: Real; begin c := 36.056; // medida da hipotenusa b := 30; // medida do cateto adjascente // agora vamos calcular o comprimento da cateto oposto a := sqrt(sqr(c) - sqr(b)); // e mostramos o resultado Edit1.Text := 'A medida do cateto oposto é: ' + FloatToStr(a); end; Veja que o cálculo é feito a partir do evento Click de um botão Button1 e o resultado é apresentado na propriedade Text de uma caixa de texto Edit1. Ao executar este código Delphi nós teremos o seguinte resultado: A medida do cateto oposto é: 20,0008783807112 Como podemos ver, o resultado retornado com o código Delphi confere com os valores da imagem apresentada. |
Java ::: Dicas & Truques ::: Arrays e Matrix (Vetores e Matrizes) |
Como ordenar um vetor de inteiros em ordem decrescente em JavaQuantidade de visualizações: 21032 vezes |
Nesta dica mostrarei como é possível ordenar um array (vetor) de ints em ordem decrescente usando o método sort() da classe Arrays e um método inverter() personalizado. É claro que há várias outras formas de se conseguir realizar esta tarefa. Espero que esta seja mais uma técnica adicionada ao seu arsenal. Veja o código Java completo: package arquivodecodigos; import java.util.*; public class Estudos{ public static void main(String[] args){ // vamos declarar e construir um vetor de 5 inteiros int[] valores = new int[5]; // inicializa os elementos do array valores[0] = 23; valores[1] = 65; valores[2] = 2; valores[3] = 87; valores[4] = 34; // ordena os valores Arrays.sort(valores); System.out.println("Ordenado em ordem crescente:"); for(int valor : valores){ System.out.print(valor + " "); } // vamos inverter o vetor agora inverter(valores); // exibe os valores dos elementos do array // usando o laço for melhorado System.out.println("\nOrdenado em ordem decrescente:"); for(int valor : valores){ System.out.print(valor + " "); } System.out.println("\n"); System.exit(0); } // método que recebe um array e inverte a ordem // de seus elementos public static void inverter(int[] b){ int esquerdo = 0; int direito = b.length-1; while (esquerdo < direito) { int temp = b[esquerdo]; b[esquerdo] = b[direito]; b[direito] = temp; esquerdo++; direito--; } } } Ao executar este código Java nós teremos o seguinte resultado: Ordenado em ordem crescente: 2 23 34 65 87 Ordenado em ordem decrescente: 87 65 34 23 2 |
C++ ::: Desafios e Lista de Exercícios Resolvidos ::: Métodos, Procedimentos e Funções |
Exercício Resolvido de C++ - Escreva uma função C++ que recebe três números inteiros e retorna o menor delesQuantidade de visualizações: 520 vezes |
Pergunta/Tarefa: Escreva um programa C++ que contenha uma função, método ou procedimento que recebe três números inteiros e retorne o menor deles como um inteiro. Seu método não deve produzir nenhuma saída, apenas retornar o menor número entre os três argumentos fornecidos. Sua saída deverá ser parecida com: Informe o primeiro número: 8 Informe o segundo número: 10 Informe o terceiro número: 7 O menor número é: 7 Veja a resolução comentada deste exercício em C++: #include <iostream> #include <algorithm> using namespace std; // função que recebe três números e retorna o menor deles int menor(int a, int b, int c){ return min(min(a, b), c); } // função principal do programa int main(int argc, char *argv[]){ int n1, n2, n3, menor_numero; // vamos pedir para o usuário informar três // números inteiros cout << "Informe o primeiro número: "; cin >> n1; cout << "Informe o segundo número: "; cin >> n2; cout << "Informe o terceiro número: "; cin >> n3; // agora vamos calcular o menor número menor_numero = menor(n1, n2, n3); // e mostramos o resultado cout << "O menor numero é: " << menor_numero << endl; cout << "\n" << endl; system("PAUSE"); // pausa o programa return EXIT_SUCCESS; } |
C# ::: Dicas & Truques ::: Tipos de Dados |
C# para iniciantes - Como usar o tipo de dados char da linguagem C#Quantidade de visualizações: 15828 vezes |
O tipo de dados char é usado quando queremos declarar, definir e usar caracteres em nossos programas. Em C#, uma variável do tipo char armazena um caractere Unicode, que são caracteres de 16 bits usados para representar a maioria das linguagens escritas mais conhecidas no mundo. O tipo char é um apelido C# para o tipo System.Char da plataforma .NET e sua faixa de valores varia de U+0000 à U+ffff (de 0 à 65535). Variáveis do tipo char podem ser declaradas e receber valores literais de três formas. Veja: // define uma letra char letra = 'A'; // define um valor hexadecimal equivalente à letra "A" char letra2 = '\x0041'; // define um valor Unicode equivalente à letra "A" char letra3 = '\u0041'; Há ainda a possibilidade de efetuar um cast de um valor inteiro para o tipo char. Veja: // converte o valor 65 para um char char letra = (char)65; // exibe o resultado Console.WriteLine("A letra é: " + letra); Quando se trata de conversões implícitas, o tipo char pode ser convertido implicitamente para os tipos ushort, int, uint, long, ulong, float, double e decimal. Contudo, o caminho contrário não é possível, ou seja, nenhum outro tipo de dados pode ser convertido para o tipo char sem a necessidade de um cast (conversão explícita). Para finalizar, veja um trecho de código que exibe o alfabeto completo em letras maiúsculas: static void Main(string[] args){ for(int i = 65; i <= 90; i++){ char letra = (char)i; Console.Write(letra + " "); } // pausa o programa Console.ReadKey(); } |
Java ::: Dicas & Truques ::: Data e Hora |
Como construir uma data no passado ou futuro em Java usando a classe GregorianCalendarQuantidade de visualizações: 8272 vezes |
Esta dica mostra como construir uma data no passado ou futuro na linguagem Java usando a classe GregorianCalendar, que é uma classe derivada e concreta da classe Calendar. Veja a linha na qual informamos a data a ser criada: Calendar data = new GregorianCalendar(2008, 11, 13); Aqui nós estamos usando o construtor da classe GregorianCalendar que requer três valores inteiros. O ano, o mês e o dia. O mês é informado como um valor inteiro na faixa de 0 a 11, ou seja, 0 para janeiro, 1 para fevereiro e assim por diante. Veja o exemplo: package arquivodecodigos; import java.util.*; import java.text.*; public class Estudos{ public static void main(String args[]){ // vamos construir a data "13/12/2008" Calendar data = new GregorianCalendar(2008, 11, 13); // vamos exibir o resultado Format formato = new SimpleDateFormat( "EEEE, dd 'de' MMMM 'de' yyyy"); System.out.println(formato.format(data.getTime())); } } Ao executar este código Java nós teremos o seguinte resultado: Sábado, 13 de Dezembro de 2008 |
Você também poderá gostar das dicas e truques de programação abaixo |
Java - Como testar se um ponto está dentro de um círculo em Java - Desenvolvimento de Games com Java Excel - Como gerar números aleatórios inteiros entre 1 e 10 no Excel usando as funções ALEATÓRIO() e INT() Python - Como converter Centímetros Cúbicos em Metros Cúbicos em Python - Python para Física e Engenharia |
Nossas 20 dicas & truques de programação mais recentes |
Últimos Projetos e Códigos Fonte Liberados Para Apoiadores do Site |
Python - Como criar o jogo Pedra, Papel, Tesoura em Python - Jogo completo em Python com código comentado |
Últimos Exercícios Resolvidos |
E-Books em PDF |
||||
|
||||
|
||||
Linguagens Mais Populares |
||||
1º lugar: Java |