Java ::: Desafios e Lista de Exercícios Resolvidos ::: Estruturas de Dados - Árvores Binárias e Árvores Binárias de Busca |
Exercícios Resolvidos de Java - Travessia de uma árvore binária de busca usando o percurso em-ordem (in-order, In-ordem ou ordem simétrica)Quantidade de visualizações: 2509 vezes |
Pergunta/Tarefa: O percurso em ordem (em-ordem, in-order, In-ordem ou ordem simétrica) é usado quando queremos exibir os valores dos nós da árvore binária de busca em ordem ascendente. Neste tipo de percurso nós visitamos primeiramente a sub-árvore da esquerda, então o nó atual e finalmente a sub-árvore à direita do nó atual. É importante notar que esta travessia é feita por meio de uma função recursiva. Escreva um programa Java que contenha uma árvore binária de busca cujos nós guardarão, além das referências para o filho esquerdo e o filho direito, apenas um valor inteiro. Forneça uma função inserir() que permitirá inserir os valores na árvore. Em seguida forneça uma função recursiva que permitirá fazer a travessia in-order da árvore. Sua saída deverá ser parecida com: Informe um valor inteiro: 7 Informe um valor inteiro: 3 Informe um valor inteiro: 18 Informe um valor inteiro: 4 Informe um valor inteiro: 9 Percurso em ordem: 3 4 7 9 18 Veja a resolução comentada deste exercício usando Java: Código para NoArvore.java: package estudos; public class NoArvore { int valor; // valor armazenado no nó NoArvore esquerdo; // filho esquerdo NoArvore direito; // filho direito // construtor do nó public NoArvore(int valor){ this.valor = valor; } } Código para ArvoreBinariaBusca.java: package estudos; public class ArvoreBinariaBusca { private NoArvore raiz; // referência para a raiz da árvore // método usado para inserir um novo nó na árvore // retorna true se o nó for inserido com sucesso e false // se o elemento não puder ser inserido (no caso de já // existir um elemento igual) public boolean inserir(int valor){ // a árvore ainda está vazia? if(raiz == null){ // vamos criar o primeiro nó e definí-lo como a raiz da árvore raiz = new NoArvore(valor); // cria um novo nó } else{ // localiza o nó pai NoArvore pai = null; NoArvore noAtual = raiz; // começa a busca pela raiz // enquanto o nó atual for diferente de null while(noAtual != null){ if(valor < noAtual.valor) { pai = noAtual; noAtual = noAtual.esquerdo; } else if(valor > noAtual.valor){ pai = noAtual; noAtual = noAtual.direito; } else{ return false; // um nó com este valor foi encontrado } } // cria o novo nó e o adiciona ao nó pai if(valor < pai.valor){ pai.esquerdo = new NoArvore(valor); } else{ pai.direito = new NoArvore(valor); } } return true; // retorna true para indicar que o novo nó // foi inserido } // método que permite disparar a travessia em-ordem public void emOrdem(){ emOrdem(raiz); } // sobrecarga do método emOrdem com uma parâmetro (esta é a // versão recursiva do método) private void emOrdem(NoArvore raiz){ if(raiz == null){ // condição de parada return; } // visita a sub-árvore da esquerda emOrdem(raiz.esquerdo); // visita o nó atual System.out.print(raiz.valor + " "); // visita a sub-árvore da direita emOrdem(raiz.direito); } } E aqui está o código para a classe que permite testar a árvore: package estudos; import java.util.Scanner; public class Estudos { public static void main(String[] args) { Scanner entrada = new Scanner(System.in); // vamos criar um novo objeto da classe ArvoreBinariaBusca ArvoreBinariaBusca arvore = new ArvoreBinariaBusca(); // vamos inserir 5 valores na árvore for(int i = 0; i < 5; i++){ System.out.print("Informe um valor inteiro: "); int valor = Integer.parseInt(entrada.nextLine()); // vamos inserir o nó e verificar o sucesso da operação if(!arvore.inserir(valor)){ System.out.println("Erro. Um elemento já contém este valor."); } } // vamos exibir os nós da árvore usando o percurso em ordem System.out.println("\nPercurso em ordem:"); arvore.emOrdem(); System.out.println("\n"); } } |
VisuAlg ::: Desafios e Lista de Exercícios Resolvidos ::: Estruturas de Controle |
Exercício Resolvido de VisuAlg - Um programa que lê três números inteiros e mostra o maiorQuantidade de visualizações: 1357 vezes |
Pergunta/Tarefa: Faça um algoritmo VisuAlg que solicita três números inteiros e mostra o maior deles. Exiba uma mensagem caso os três números não forem diferentes. Sua saída deverá ser parecida com: Informe o primeiro número: 34 Informe o segundo número: 83 Informe o terceiro número: 72 O segundo número é o maior Veja a resolução comentada deste exercício usando VisuAlg: Algoritmo "Um programa que lê três números inteiros e mostra o maior" Var // variáveis usadas na resolução do problema num1, num2, num3: inteiro Inicio // vamos solicitar os três números inteiros escreva("Informe o primeiro número: ") leia(num1) escreva("Informe o segundo número: ") leia(num2) escreva("Informe o terceiro número: ") leia(num3) // o primeiro número é o maior? se (num1 > num2) e (num1 > num3) entao escreva("O primeiro número é o maior") senao // o segundo número é o maior? se (num2 > num1) e (num2 > num3) entao escreva("O segundo número é o maior") senao // o terceiro número é o maior? se (num3 > num1) e (num3 > num2) entao escreva("O terceiro número é o maior") senao // os números não são diferentes escreva("Os três números não são diferentes") fimse fimse fimse Fimalgoritmo |
VB.NET ::: Desafios e Lista de Exercícios Resolvidos ::: Laços de Repetição |
Exercícios Resolvidos de VB.NET - Um laço for que solicita ao usuário 10 números inteiros e mostra o menor e o maior valor informadoQuantidade de visualizações: 581 vezes |
Pergunta/Tarefa: Escreva um programa VB.NET que usa o laço for para solicitar ao usuário que informe 10 números inteiros. Em seguida mostre o maior e o menor valor lido. Não é permitido usar vetores ou matrizes (arrays). Sua saída deve ser parecida com: Informe o 1º valor: 5 Informe o 2º valor: 1 Informe o 3º valor: 20 Informe o 4º valor: 6 Informe o 5º valor: 3 Informe o 6º valor: 4 Informe o 7º valor: 7 Informe o 8º valor: 12 Informe o 9º valor: 9 Informe o 10º valor: 8 O maior valor lido foi: 20 O menor valor lido foi: 1 Veja a solução comentada deste exercício usando a linguagem VB.NET: Imports System Module Program Sub Main(args As String()) Dim valor As Integer ' guarda o valor lido Dim maior, menor As Integer ' variáveis que guardarão ' o maior e o menor valor lido ' vamos pedir ao usuário que informe 10 valores inteiros For i As Integer = 1 To 10 Step 1 Console.Write("Informe o " & i & "º valor: ") valor = Integer.Parse(Console.ReadLine()) ' esta é a primeira iteração do laço? se for vamos assumir que o ' maior e menor valor lido são o primeiro valor informado If i = 1 Then maior = valor menor = valor Else ' não é a primeira iteração ' vamos verificar se é maior que o valor atual da variável maior If valor > maior Then maior = valor End If ' vamos verificar se é menor que o valor atual da variável menor If valor < menor Then menor = valor End If End If Next ' vamos exibir o maior e o menor valor lido Console.WriteLine(vbCrLf & "O maior valor lido foi: " & maior) Console.WriteLine("O menor valor lido foi: " & menor) Console.WriteLine(vbCrLf & "Pressione qualquer tecla para sair...") ' pausa o programa Console.ReadKey() End Sub End Module |
C++ ::: Dicas & Truques ::: Strings e Caracteres |
Como adicionar caracteres ao final de uma string C++ usando a função push_back()Quantidade de visualizações: 9165 vezes |
A função push_back() do C++ é útil quando precisamos adicionar caracteres individuais ao final de uma string. Veja um exemplo: #include <string> #include <iostream> using namespace std; int main(int argc, char *argv[]){ string str = "Gosto muito de PHP"; string temp; // vamos percorrer os caracteres da primeira string // e adicioná-los na segunda um de cada vez for(int i = 0; i < str.length(); i++){ temp.push_back(str[i]); } // exibe o resultado cout << temp << "\n\n"; system("PAUSE"); // pausa o programa return EXIT_SUCCESS; } Ao executar este código C++ nós teremos o seguinte resultado: Gosto muito de PHP Note que usamos um laço for para percorrer individualmente todos os caracteres da primeira string e adicioná-los um de cada vez na segunda string. Veja uma variação deste código, no qual exibimos o conteúdo da primeira string invertido: #include <string> #include <iostream> using namespace std; int main(int argc, char *argv[]) { string str = "Gosto muito de PHP"; string temp; // vamos percorrer os caracteres da primeira string // e adicioná-los na segunda um de cada vez. // desta vez vamos obter o resultado invertido for(int i = str.length() - 1; i >= 0; i--){ temp.push_back(str[i]); } // exibe o resultado cout << "String original: " << str << endl; cout << "String invertida: " << temp << endl;; system("PAUSE"); // pausa o programa return EXIT_SUCCESS; } Ao executar este novo código C++ nós teremos o seguinte resultado: String original: Gosto muito de PHP String invertida: PHP ed otium otsoG |
JavaScript ::: Dicas & Truques ::: Mouse e Teclado |
Como obter o código da tecla pressionada em um elemento HTML usando o evento onkeypress do JavaScriptQuantidade de visualizações: 300 vezes |
Nesta dica eu mostrarei como é possível usar o evento onkeypress do HTML + JavaScript para obter o código da tecla pressionada pelo usuário. Note que usei a propriedade keyCode do objeto event para capturar o código da tecla. Veja o código JavaScript completo, incluindo a página HTML: <html> <head> <title>Estudando JavaScript</title> </head> <body> <p>Experimente pressionar qualquer tecla e uma mensagem mostrará o código da tecla pressionada.</p> <script type="text/javascript"> function tecla(){ window.alert("O código da tecla pressionada foi: " + event.keyCode); } document.body.onkeypress = tecla; </script> </body> </html> Abra esta página no seu navegador e experimente pressionar uma tecla. Se você presssionar, por exemplo, a tecla "a", teremos a seguinte mensagem: O código da tecla pressionada foi: 97 |
Java ::: Classes, Controles e Componentes ::: JSplitPane |
Java Swing - Como usar a classe JSplitPane para dividir o espaço ocupado pelos componentes de suas aplicações Java SwingQuantidade de visualizações: 10630 vezes |
A classe JSplitPane é usada quando precisamos controlar o espaço ocupado por dois ou mais componentes. Objetos desta classe podem ser redimensionados, de modo a aumentar ou diminuir a área ocupada por um dos componentes. Veja a posição desta classe na hierarquia de classes Java:java.lang.Object java.awt.Component java.awt.Container javax.swing.JComponent javax.swing.JSplitPane No trecho de código abaixo você verá como é possível dividir a área ocupada por duas áreas de texto (JTextArea). Execute a aplicação e experimente aumentar ou diminuir o espaço ocupado pelos componentes: import javax.swing.*; import java.awt.*; public class Estudos extends JFrame{ public Estudos(){ super("Como usar a classe JSplitPane"); // primeira área de texto JTextArea textArea1 = new JTextArea(5, 30); textArea1.setText("Sou a área de texto 1."); JScrollPane sPane1 = new JScrollPane(textArea1); // segunda área de texto JTextArea textArea2 = new JTextArea(5, 30); textArea2.setText("Sou a área de texto 2."); JScrollPane sPane2 = new JScrollPane(textArea2); // Cria o JSplitPane JSplitPane splitPane = new JSplitPane( JSplitPane.HORIZONTAL_SPLIT, sPane1, sPane2); add(splitPane, BorderLayout.CENTER); setSize(300, 150); setVisible(true); } public static void main(String args[]){ Estudos app = new Estudos(); app.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); } } Ao executar esta aplicação Java Swing nós teremos o seguinte resultado: ![]() |
PHP ::: Fundamentos da Linguagem ::: Passos Iniciais |
PHP para iniciantes - Quais as diferenças entre include e require do PHP?Quantidade de visualizações: 13893 vezes |
A principal diferença entre as diretivas require() e include() do PHP é que, se usarmos require() para incluir um arquivo que não pode ser incluído (talvez o arquivo não exista), um erro fatal será gerado e a execução de código na página será imediatamente suspenso. Um exemplo de tal mensagem de erro é:Warning: require(inexistente.php) [function.require]: failed to open stream: No such file or directory in /public_html/testes.php on line 3 Fatal error: require() [function.require]: Failed opening required 'inexistente.php' (include_path='.:/usr/share/pear') in /public_html/testes.php on line 3 Veja que geralmente recebemos um Warning e depois um Fatal error. Experimente criar o arquivo "inexistente.php" e as mensagens de advertência e erro desaparecerão. Se usarmos include() e o arquivo de inclusão não puder ser localizado, teremos uma advertência mas a execução do código na página não será interrompida: Warning: include(inexistente.php) [function.include]: failed to open stream: No such file or directory in /public_html/testes.php on line 3 Warning: include() [function.include]: Failed opening 'inexistente.php' for inclusion (include_path='.:/usr/share/pear') in /public_html/testes.php on line 3 O uso de require() ou include() vai depender da situação: require() é melhor empregado para carregar arquivos que são essenciais para o restante da página, por exemplo, se você tiver um site usando banco de dados, então usar require() para incluir o arquivo contendo o login e senha do banco de dados é muito melhor que usar include(). Se usarmos include() nesta situação, poderemos terminar gerando mais erros e advertências que o pretendido. include() deve ser usado quando o arquivo a ser incluído não é essencial para o correto funcionamento da página. Um exemplo disso é quando incluímos um arquivo de topo ou rodapé de páginas. |
Delphi ::: Data Controls (Controles de Dados) ::: TDBGrid |
Como usar a classe TDBGrid do Delphi em suas aplicaçõesQuantidade de visualizações: 9794 vezes |
Um objeto da classe TDBGrid permite a exibição e manipulação de registros a partir de um conjunto de dados (dataset) em uma grid tabular. Em geral os dados exibidos em um TDBGrid vêm de uma tabela no banco de dados ou como resultados de uma query. Por meio deste controle o usuário consegue adicionar, excluir e modificar informações em uma tabela do banco de dados. Antes de prosseguirmos, veja a posição desta classe na hierarquia de classes do Delphi: System.TObject Classes.TPersistent Classes.TComponent Controls.TControl Controls.TWinControl Controls.TCustomControl Grids.TCustomGrid DBGrids.TCustomDBGrid DBGrids.TDBGrid A forma mais comum de se usar um controle TBGrid em aplicações Delphi é colocá-lo em um formulário e definir suas propriedades em tempo de design. A exibição dos dados é feita indicando um componente TDataSource para a sua propriedade DataSource. Isso pode ser feito em tempo de design ou durante a execução do programa. Veja um trecho de código no qual usamos o evento Click de um botão para definir a fonte de dados (TDataSource) para a propriedade DataSource de um TDBGrid chamado "DBGrid1": procedure TForm3.Button2Click(Sender: TObject); begin DBGrid1.DataSource := DataSource1; end; Em outras dicas sobre Delphi + Banco de dados você encontrará exemplos de como efetuar conexões com diversos bancos de dados. É importante que você saiba como efetuar conexões com o banco de dados e extrair informações antes de estudar o componente TDBGrid. Em tempo de execução os usuários podem usar um navegador de base de dados (TDBNavigator) para percorrer os dados na grid e inserir, excluir ou editar as informações. As modificações feitas nas células de um TDBGrid são enviadas ao conjunto de dados somente quando o usuário acessa um registro diferente daquele sendo atualizado ou fecha a aplicação. O TDBGrid implementa o comportamento genérico introduzido na classe TCustomDBGrid. A classe TDBGrid publica muitas das propriedades herdadas de TCustomDBGrid, mas não introduz nenhum novo comportamento. Esta dica foi escrita e testada no Delphi 2009. |
Revit C# ::: Dicas & Truques ::: Pontos e Coordenadas |
Como pedir para o usuário selecionar um ponto na área de desenho do Revit usando a função PickPoint() do objeto Selection da Revit C# APIQuantidade de visualizações: 381 vezes |
Em várias situações nós precisamos que o usuário indique um ponto na área de desenho do Revit, ou seja, as coordenadas x, y e z na qual nosso código Revit C# efetuará alguma ação. Para isso nós podemos usar a função PickPoint() do objeto Selection, que retorna um objeto da classe XYZ. O primeiro passo é acessar o documento ativo UIDocument, por meio de uma chamada a this.ActiveUIDocument. Em seguida nós definimos o tipo de snap usando a enumeração ObjectSnapTypes. Para este exemplo eu usei Endpoints e Intersections, mas você pode usar outros também, tais como Midpoints, Nearest, Intersections, etc. Uma vez obtido o tipo de snap, nós o usamos para a chamada à função PickPoint(). Feito isso nós só precisamos acessar o objeto XYZ retornado e mostrar as suas coordenadas. Veja o código Revit C# completo para o exemplo: using System; using Autodesk.Revit.UI; using Autodesk.Revit.DB; using Autodesk.Revit.UI.Selection; using System.Collections.Generic; using System.Linq; namespace Estudos { [Autodesk.Revit.Attributes.Transaction(Autodesk.Revit.Attributes. TransactionMode.Manual)] [Autodesk.Revit.DB.Macros.AddInId("ED8EC6C4-9489-48F7-B04E-B45B5D1BEB12")] public partial class ThisApplication { private void Module_Startup(object sender, EventArgs e) { // vamos obter uma referência ao UIDocument ativo UIDocument uidoc = this.ActiveUIDocument; // agora mostramos uma mensagem para o usuário selecionar um // elemento TaskDialog.Show("Aviso", "Selecione um ponto na área de desenho"); // vamos escolher o tipo de snap ObjectSnapTypes tiposSnap = ObjectSnapTypes.Endpoints | ObjectSnapTypes.Intersections; // agora o usuário seleciona um ponto e nós o guardamos na // variável ponto, do tipo XYZ XYZ ponto = uidoc.Selection.PickPoint(tiposSnap, "Selecione um ponto de extremidade ou intersecção"); // acessamos as coordenadas do ponto string coordenadas = "X = " + ponto.X + "\nY = " + ponto.Y + "\nZ = " + ponto.Z; // e mostramos o resultado TaskDialog.Show("Revit", "As coordenadas do ponto são:\n" + coordenadas); } private void Module_Shutdown(object sender, EventArgs e) { // para fazer alguma limpeza de memória ou algo assim } #region Revit Macros generated code private void InternalStartup() { this.Startup += new System.EventHandler(Module_Startup); this.Shutdown += new System.EventHandler(Module_Shutdown); } #endregion } } Ao executar este código Revit C# você terá uma mensagem TaskDialog com um resultado parecido com: As coordenadas do ponto são: X = 4.7533122 Y = 11.429872 Z = 23.3871198 |
PHP ::: Dicas & Truques ::: Arrays e Matrix (Vetores e Matrizes) |
Como retornar a quantidade de elementos em um array PHP usando a função sizeof()Quantidade de visualizações: 17394 vezes |
Em várias ocasiões nós precisamos retornar o tamanho de um vetor em PHP, ou seja, a quantidade de elementos do array. Para isso nós podemos usar a função sizeof(). Veja a seguir um exemplo de seu uso: <?php /* Este exemplo mostra como obter a quantidade de elementos em um array usando sizeof(). */ $pessoas[0] = "Carlos"; $pessoas[1] = "Juliana"; $pessoas[2] = "Igor"; $pessoas[3] = "Marcelo"; $pessoas[4] = "Amélia"; $tam = sizeof($pessoas); echo "O array contém " . $tam . " elementos."; ?> Ao executar este código PHP nós teremos o seguinte resultado: O array contém 5 elementos. |
Nossas 20 dicas & truques de programação mais populares |
Você também poderá gostar das dicas e truques de programação abaixo |
Java - Programação Orientada a Objetos em Java - Como usar o modificador static em suas aplicações Java Python - Como testar se um ponto está dentro de um círculo em Python - Desenvolvimento de Games com Python |
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 |