Java ::: Dicas & Truques ::: Strings e Caracteres |
Como remover espaços em excesso em uma string Java usando expressões regularesQuantidade de visualizações: 237 vezes |
Em algumas situações nós precisamos remover os espaços em excesso de um texto ou frase. Há várias formas de se realizar esta tarefa, e uma delas é por meio do uso de expressões regulares. Veja um trecho de código no qual usamos o método replaceAll() da classe Matcher para substituir dois ou mais espaços por apenas um espaço: package arquivodecodigos; // Este exemplo mostra como remover todos os espaços // duplicados de uma string import java.util.regex.*; public class Estudos{ public static void main(String[] args){ String frase = "Programar em Java e bom"; System.out.println("Com espaços em excesso: " + frase); frase = removerEspacosDuplicados(frase); System.out.println("Sem espaços em excesso: " + frase); System.exit(0); } public static String removerEspacosDuplicados(String str){ String patternStr = "\\s+"; String replaceStr = " "; Pattern pattern = Pattern.compile(patternStr); Matcher matcher = pattern.matcher(str); return matcher.replaceAll(replaceStr); } } Ao executarmos este código Java nós teremos o seguinte resultado: Com espaços em excesso: Programar em Java é bom Sem espaços em excesso: Programar em Java é bom |
Java ::: Desafios e Lista de Exercícios Resolvidos ::: Java Básico |
Exercícios Resolvidos de Java - Um programa Java que recebe o ano de nascimento de uma pessoa e o ano atual e mostra a idade da pessoa em anos, meses, dias e semanasQuantidade de visualizações: 6624 vezes |
Pergunta/Tarefa: Escreva um programa Java que recebe o ano de nascimento de uma pessoa e o ano atual, calcule e mostre: a) A idade da pessoa em anos; b) A idade da pessoa em meses; c) A idade da pessoa em dias; d) A idade da pessoa em semanas. Sua saída deverá ser parecida com: Informe o ano de seu nascimento: 1985 Informe o ano atual: 2023 A idade em anos é: 38 A idade em meses é: 456 A idade em dias é: 13680 A idade em semanas é: 1976 Veja a resolução comentada deste exercício usando Java: package estudos; import java.util.Scanner; public class Estudos { public static void main(String[] args) { // para ler a entrada do usuário Scanner entrada = new Scanner(System.in); // vamos ler o ano de nascimento System.out.print("Informe o ano de seu nascimento: "); int ano_nascimento = Integer.parseInt(entrada.nextLine()); System.out.print("Informe o ano atual: "); int ano_atual = Integer.parseInt(entrada.nextLine()); // calcula a idade em anos int idade_anos = ano_atual - ano_nascimento; System.out.println("A idade em anos é: " + idade_anos); // calcula a idade em meses int idade_meses = idade_anos * 12; System.out.println("A idade em meses é: " + idade_meses); // calcula a idade em dias int idade_dias = idade_anos * 12 * 30; System.out.println("A idade em dias é: " + idade_dias); // calcula a idade em semanas int idade_semanas = idade_anos * 52; System.out.println("A idade em semanas é: " + idade_semanas); } } |
Java ::: Estruturas de Dados ::: Árvore Binária e Árvore Binária de Busca |
Como percorrer uma árvore binária em Java usando o algorítmo depth-first search (DFS) de forma iterativaQuantidade de visualizações: 1059 vezes |
Nesta dica mostrarei como podemos implementar o algorítmo da Busca em Profundidade (DFS, do inglês depth-first search) em Java de forma iterativa, ou seja, sem usar recursão. Não farei a busca, mas sim o percurso, para que você entenda como a lógica dessa busca funciona. Antes de iniciarmos, veja a árvore binária que vamos usar no exemplo: ![]() Note que esta árvore possui seis nós. O nó 5 é o nó raiz, e possui como filhos os nós 4 e 9. O nó 4, por sua vez, possui apenas um filho, o nó 2, ou seja, o filho da esquerda. O nó 9 possui dois filhos: o nó 3 é o filho da esquerda e o nó 12 é o filho da direita. Os filhos da árvore binária que não possuem outros filhos são chamados de folhas. Com a abordagem da busca em profundidade, começamos com o nó raiz e viajamos para baixo em uma única ramificação. Se o nó desejado for encontrado naquela ramificação, ótimo. Do contrário, continuamos subindo e pesquisando por nós não visitados. Esse tipo de busca também tem uma notação big O de O(n). Vamos à implementação? Veja o código para a classe No, que representa um nó na árvore binária: // implementação da classe No class No{ public int valor; // o valor do nó public No esquerdo; // o filho da esquerda public No direito; // o filho da direita public No(int valor){ this.valor = valor; this.esquerdo = null; this.direito = null; } } Veja agora o código completo para o exemplo. Note que usei uma implementação não-recursiva, na qual todos os nós expandidos recentemente são adicionados a uma pilha, para realizar a exploração. O uso da pilha permite o retrocesso (backtracking) de forma a reiniciarmos o percurso ou busca no próximo nó. Para manter o código o mais simples possível, eu usei a classe Stack do Java, juntamente com seus métodos push() e pop() para simular a pilha. Usei também uma ArrayList para guardar os valores da árvore binária na ordem depth-first. Eis o código: package estudos; import java.util.ArrayList; import java.util.Stack; // implementação da classe No class No{ public int valor; // o valor do nó public No esquerdo; // o filho da esquerda public No direito; // o filho da direita public No(int valor){ this.valor = valor; this.esquerdo = null; this.direito = null; } } public class Estudos{ public static void main(String[] args){ // vamos criar os nós da árvore No cinco = new No(5); // será a raiz da árvore No quatro = new No(4); No nove = new No(9); No dois = new No(2); No tres = new No(3); No doze = new No(12); // vamos fazer a ligação entre os nós cinco.esquerdo = quatro; cinco.direito = nove; quatro.esquerdo = dois; nove.esquerdo = tres; nove.direito = doze; // agora já podemos efetuar o percurso depth-first ArrayList<Integer> valores = percursoDepthFirst(cinco); System.out.println("Os valores na ordem Depth-First são: " + valores); } public static ArrayList<Integer> percursoDepthFirst(No no){ // vamos usar uma ArrayList para retornar os elementos // na ordem Depth-First ArrayList<Integer> valores = new ArrayList<>(); // vamos criar uma nova instância de uma pilha Stack<No> pilha = new Stack<>(); // já vamos adicionar o primeiro nó recebido, que é a raiz pilha.push(no); // enquanto a pilha não estiver vazia while(pilha.size() > 0){ // vamos obter o elemento no topo da pilha No atual = pilha.pop(); // adicionamos este valor no ArrayList valores.add(atual.valor); // vamos colocar o filho direito na pilha if(atual.direito != null){ pilha.push(atual.direito); } // vamos colocar o filho esquerdo na pilha if(atual.esquerdo != null){ pilha.push(atual.esquerdo); } } return valores; // retorna os valores da árvore } } Ao executarmos este código Java nós teremos o seguinte resultado: Os valores na ordem Depth-First são: [5, 4, 2, 9, 3, 12] Compare estes valores com a imagem vista anteriormente para entender ainda melhor o percurso ou busca Depth-First. |
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: 519 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; } |
Java ::: Dicas & Truques ::: Geometria, Trigonometria e Figuras Geométricas |
Como testar se um ponto está dentro de um círculo em Java - Desenvolvimento de Games com JavaQuantidade de visualizações: 922 vezes |
Quando estamos trabalhando com computação gráfica, geometria e trigonometria ou desenvolvimento de jogos em Java, é comum precisarmos verificar se um determinado ponto (uma coordenada x, y) está contido dentro de um círculo. Para melhor entendimento, veja a imagem a seguir: ![]() Veja que temos um círculo com raio igual a 115 e com centro nas coordenadas (x = 205; y = 166). Temos também dois pontos. O ponto vermelho está nas coordenadas (x = 140; y = 90) e o ponto azul está nas coordenadas (x = 330; y = 500. Como podemos ver na imagem, o ponto vermelho está dentro do círculo, enquanto o ponto azul está fora. E nosso intenção nesta dica é escrever o código Java que permite fazer essa verificação. Tenha em mente que está técnica é muito útil para o teste de colisões no desenvolvimento de games. Veja o código completo para o exemplo: package estudos; // vamos declarar a classe Circulo class Circulo{ double xc; double yc; double raio; public Circulo(double xc, double yc, double raio){ this.xc = xc; // x do centro this.yc = yc; // y do centro this.raio = raio; // raio do círculo } } // agora vamos declarar a classe Ponto class Ponto{ double x; double y; public Ponto(double x, double y){ this.x = x; // coordenada x this.y = y; // coordenada y } } // classe principal da aplicação public class Estudos{ public static void main(String[] args){ // vamos criar um objeto Circulo Circulo c = new Circulo(205, 166, 115); // vamos criar um objeto Ponto Ponto p = new Ponto(140, 90); // vamos verificar se o ponto está dentro do // círculo double dx = p.x - c.xc; double dy = p.y - c.yc; if((Math.pow(dx, 2) + Math.pow(dy, 2)) < Math.pow(c.raio, 2)){ System.out.println("O ponto está dentro do círculo"); } else{ System.out.println("O ponto NÃO está dentro do círculo"); } } } Ao executar este código Java nós teremos o seguinte resultado: O ponto está dentro do círculo. Experimente com círculos de raios e coordenadas centrais diferentes e também com pontos em várias coordenadas e veja como os resultados são interessantes. |
Python ::: Dicas & Truques ::: Arquivos e Diretórios |
Como usar a função exists() do módulo os.path para testar a existência de um arquivo ou diretório em PythonQuantidade de visualizações: 3231 vezes |
Antes de efetuarmos qualquer ação em um arquivo ou diretório, é sempre uma boa idéia testar primeiro se tal arquivo ou diretório existe no sistema. Isso pode ser feito por meio do método exists() do módulo os.path. Este método retorna True se o arquivo ou diretório existir, e False em caso contrário. Veja um exemplo no qual checamos a existência de um arquivo chamado "teste.txt": from os import path def main(): # vamos verificar se este arquivo existe, neste local if path.exists("C:\\estudos_python\\teste.txt"): print("Arquivo foi encontrado") else: print("Arquivo não foi encontrado") if __name__== "__main__": main() Se o arquivo existir no caminho informado, o texto "Arquivo foi encontrado" será impresso na tela. Se o arquivo não puder ser encontrado, o texto "Arquivo não foi encontrado" será exibido. Veja agora como podemos verificar se um diretório existe ou não no sistema operacional: from os import path def main(): # vamos verificar se este diretório existe if path.exists("C:\\estudos_python"): print("Diretório existe.") else: print("Diretório não existe.") if __name__== "__main__": main() Execute este código e veja o resultado. Se o diretório pesquisado existir, o texto "Diretório existe." será exibido. |
Java ::: Desafios e Lista de Exercícios Resolvidos ::: Métodos, Procedimentos e Funções |
Exercício Resolvido de Java - Como converter minutos em segundos em Java usando uma funçãoQuantidade de visualizações: 868 vezes |
Pergunta/Tarefa: Escreva um programa Java para converter minutos em segundos. Você deverá criar uma função converter() que receberá, como argumento, um número inteiro representando os minutos e retornará, também como um inteiro, os segundos correspondentes. Os minutos deverão ser informados pelo usuário. Sua saída deverá ser parecida com: Informe os minutos: 15 A quantidade de segundos é: 900 Veja a resolução comentada deste exercício em Java: package estudos; import java.util.Scanner; public class Estudos { public static void main(String[] args) { // para ler a entrada do usuário Scanner entrada = new Scanner(System.in); // vamos pedir para o usuário informar os minutos System.out.print("Informe os minutos: "); int minutos = Integer.parseInt(entrada.nextLine()); // agora vamos chamar a função converter() para converter // os minutos em segundos int segundos = converter(minutos); // e mostramos o resultado System.out.println("A quantidade de segundos é: " + segundos); } // função usada para converter minutos em segundos public static int converter(int minutos){ int segundos = minutos * 60; return segundos; } } |
R ::: Dicas & Truques ::: Trigonometria - Funções Trigonométricas |
Como calcular o seno de um número ou ângulo usando a função sin() da linguagem RQuantidade de visualizações: 1691 vezes |
Em geral, quando falamos de seno, estamos falando do triângulo retângulo de Pitágoras (Teorema de Pitágoras). A verdade é que podemos usar a função seno disponível nas linguagens de programação para calcular o seno de qualquer número, mesmo nossas aplicações não tendo nenhuma relação com trigonometria. No entanto, é sempre importante entender o que é a função seno. Veja a seguinte imagem: ![]() Veja que temos um triângulo retângulo com as medidas já calculadas para a hipotenusa e os dois catetos, assim como os ângulos entre eles. Assim, o seno é a razão entre o cateto oposto (oposto ao ângulo theta) e a hipotenusa, ou seja, o cateto oposto dividido pela hipotenusa. Veja a fórmula: \[\text{Seno} = \frac{\text{Cateto oposto}}{\text{Hipotenusa}} \] Então, se dividirmos 20 por 36.056 (na figura eu arredondei) nós teremos 0.5547, que é a razão entre o cateto oposto e a hipotenusa (em radianos). Agora, experimente calcular o arco-cosseno de 0.5547. O resultado será 0.9828 (em radianos). Convertendo 0.9828 radianos para graus, nós obtemos 56.31º, que é exatamente o ângulo em graus entre o cateto oposto e a hipotenusa na figura acima. Pronto! Agora que já sabemos o que é seno na trigonometria, vamos entender mais sobre a função sin() da linguagem R. Esta função recebe um valor numérico e retorna um valor, também numérico) entre -1 até 1 (ambos inclusos). Veja: > sin(0) [ENTER] [1] 0 > sin(1) [ENTER] [1] 0.841471 > sin(2) [ENTER] [1] 0.9092974 > Note que calculamos os senos dos valores 0, 1 e 2. Observe como os resultados conferem com a curva da função seno mostrada abaixo: ![]() |
PHP ::: Dicas & Truques ::: Arquivos e Diretórios |
Arquivos e diretórios em PHP - Como montar uma árvore de arquivos e diretórios recursivamenteQuantidade de visualizações: 16361 vezes |
Este exemplo mostra como listar todo o conteúdo de um diretório recursivamente em forma de árvore. Note que usei um objeto da classe RecursiveDirectoryIterator da linguagem PHP para facilitar nosso trabalho. Veja o código completo para o exemplo: <html> <head> <title>Estudando PHP</title> </head> <body> <?php // nome e local do diretório $dir = $_SERVER["DOCUMENT_ROOT"] . "/escola/app"; // função recursiva que lista o diretório atual function montarArvore($it){ echo '<ul>'; for(; $it->valid(); $it->next()){ if($it->isDir() && !$it->isDot()) { printf('<li>%s</li>', $it->current()); if($it->hasChildren()) { $filho = $it->getChildren(); echo '<ul>' . montarArvore($filho) . '</ul>'; } } elseif($it->isFile()) { echo '<li>'. $it->current() . '</li>'; } } echo '</ul>'; } // faz a primeira chamada à função recursiva montarArvore(new RecursiveDirectoryIterator($dir)); ?> </body> </html> |
Java ::: Dicas & Truques ::: Formulários e Janelas |
Java Swing - Como centralizar a janela JFrame ao abrir a aplicação Java SwingQuantidade de visualizações: 20656 vezes |
Em várias ocasiões nós gostaríamos de centralizar a janela JFrame, ou seja, a janela principal de nossa aplicação Java Swing ao abrir o programa. Para isso nós podemos usar o método setLocationRelativeTo() e fornecer a ele o valor null. Veja como isso pode ser feito no código abaixo: import java.awt.*; import javax.swing.*; public class Estudos extends JFrame{ public Estudos() { super("Uso da classe JFrame"); setSize(350, 250); setVisible(true); // centraliza a janela setLocationRelativeTo(null); } public static void main(String args[]){ Estudos app = new Estudos(); app.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); } } |
Nossas 20 dicas & truques de programação mais populares |
Você também poderá gostar das dicas e truques de programação abaixo |
Delphi - Como usar o evento OnDrawCell para controlar o desenho das células em um TStringGrid do Delphi |
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 |