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

Como remover elementos duplicados de um array em JavaScript usando as funções filter() e indexOf() do objeto Array

Quantidade de visualizações: 5013 vezes
Em várias ocasições temos códigos JavaScript envolvendo arrays (vetores, matrizes) e gostaríamos de eliminar os valores duplicados, ou seja, retornar um novo vetor sem elementos repetidos. Para isso podemos usar os métodos filter() e indexOf().

Como pode ser visto em dicas nesta mesma seção, o método filter() é usado para retornar apenas os elementos do vetor que se encaixem em uma determinada condição. O método indexOf(), por sua vez, retorna o índice da primeira ocorrência do elemento no vetor. Assim, a combinação desses dois métodos é perfeita para esta situação, ainda que você consiga fazer de outras formas.

Veja o trecho de código a seguir:

<script type="text/javascript">
  function removerDuplicados(valor, indice, vetor){
    // o índice desse elemento é o primeiro encontrado
    // no vetor?
    if(indice == vetor.indexOf(valor)){
      return true;
    }

    return false;
  }  

  var valores = new Array(6, 6, 1, 7, 3, 7, 1, 7, 4, 3, 5);
  // vamos obter um vetor sem repetições
  var novoVetor = valores.filter(removerDuplicados);
  // vamos mostrar o resultado
  window.alert(novoVetor);
</script>

Execute este código e veja que apenas os valores únicos serão retornados. Note agora como o mesmo código pode ser escrito de forma mais reduzida:

<script type="text/javascript">
  var valores = new Array(8, 8, 1, 7, 3, 7, 1, 7, 8, 3, 5);
  // vamos obter um vetor sem repetições
  var novoVetor = valores.filter(function(val, ind, vet){
    return vet.indexOf(val) == ind;
  });
  // vamos mostrar o resultado
  window.alert(novoVetor);
</script>



Java ::: Classes e Componentes ::: JComponent

Java Avançado - Como verificar se uma classe herda de JComponent

Quantidade de visualizações: 8695 vezes
Nesta dica mostrarei como podemos tirar proveito dos métodos getClass(), getSuperclass() e getName() da classe Class para verificarmos se uma determinada classe herda da classe JComponent.

Embora este exemplo busque relacionar controles do Java Swing, a técnica usada pode ser aplicada em qualquer classe da linguagem Java.

Veja o código completo:

package arquivodecodigos;

import javax.swing.*;
 
public class Estudos{
  public static void main(String args[]){
    // verifica se JLabel herda de JComponent
    JLabel label = new JLabel("Teste");
    if(herdaJComponent(label)){
      System.out.println("JLabel herda de JComponent");
    }
    else{
      System.out.println(
        "JLabel não herda de JComponent");
    }
 
    // verifica se Timer herda de JComponent
    java.util.Timer timer = new java.util.Timer();
    if(herdaJComponent(timer)){
      System.out.println(
        "java.util.Timer herda de JComponent");
    }
    else{
      System.out.println(
        "java.util.Timer não herda de JComponent");
    }
 
    System.exit(0);
  }
 
  static boolean herdaJComponent(Object obj){
    Class cls = obj.getClass();
    Class superclass = cls.getSuperclass();
    while(superclass != null){
      String className = superclass.getName();
       
      if(className.equals("javax.swing.JComponent")){
        return true;
      }
 
      cls = superclass;
      superclass = cls.getSuperclass();
    }
 
    return false;
  }
}

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

JLabel herda de JComponent
java.util.Timer não herda de JComponent


C++ ::: Win32 API (Windows API) ::: Arquivos e Diretórios

Arquivos e diretórios em C++ - Como escrever em arquivos usando a função WriteFile() da API do Windows

Quantidade de visualizações: 9227 vezes
A função WriteFile() da Win32 API é útil quando precisamos escrever em arquivos. Esta função foi projetada para escritas síncronas e assíncronas, enquanto WriteFileEx() é somente para escritas assíncronas.

Veja o protótipo desta função:

BOOL WINAPI WriteFile(
  HANDLE hFile,
  LPCVOID lpBuffer,
  DWORD nNumberOfBytesToWrite,
  LPDWORD lpNumberOfBytesWritten,
  LPOVERLAPPED lpOverlapped
);


Antes de escrevermos em um arquivo, é importante entendermos o significado dos parâmetros da função WriteFile():

a) HANDLE hFile - Este é o handle para o arquivo no qual queremos escrever. Este handle deve ser criado com os direitos de acesso de escrita GENERIC_WRITE.

b) LPCVOID lpBuffer - Um ponteiro para o buffer que contém os dados que serão escritos no arquivo.

c) DWORD nNumberOfBytesToWrite - O número de bytes a serem escritos no arquivo.

d) LPDWORD lpNumberOfBytesWritten - Um ponteiro para uma variável que receberá o número de bytes escritos. A função WriteFile() define o valor desta variável como zero antes de fazer seu trabalho ou verificação de erro.

d) LPOVERLAPPED lpOverlapped - Um ponteiro para um estrutura OVERLAPPED. Esta estrutura é exigida se o handle para o arquivo for obtido usando FILE_FLAG_OVERLAPPED para o parâmetro dwFlagsAndAttributes da função CreateFile(). Geralmente usamos NULL para este parâmetro.

Veja um trecho de código no qual usamos a função WriteFile() para escrever duas linhas em um arquivo texto:

#include <cstdlib>
#include <iostream>
#include <windows.h>

using namespace std;

int main(int argc, char *argv[]){
  // dados a serem escritos no arquivo
  CHAR frase[80];
  DWORD nOut; // bytes escritos
  
  // nome do arquivo
  CHAR arquivo[] = "C:\\testes.txt";
  
  // vamos abrir o arquivo para escrita.
  // se o arquivo não existir nós vamos criá-lo.
  HANDLE hArquivo = CreateFile(arquivo, GENERIC_WRITE, 0, NULL,
    CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);

  if(hArquivo == INVALID_HANDLE_VALUE){
    cout << "Erro ao abrir o arquivo: " << GetLastError() << endl;
  }
  else{
    // arquivo aberto com sucesso. Vamos escrever
    
    // dados a serem escritos no arquivo
    CHAR frase1[80] = "Programar em C++ é bom demais\r\n";
    CHAR frase2[80] = "E a Win32 é da hora!!!!";
    DWORD nOut; // bytes escritos
    
    // vamos escrever a primeira frase
    WriteFile(hArquivo, frase1, strlen(frase1), &nOut, NULL);
    cout << nOut << " bytes foram escritos. " << endl;
    
    // vamos escrever a segunda frase
    WriteFile(hArquivo, frase2, strlen(frase2), &nOut, NULL);
    cout << nOut << " bytes foram escritos. " << endl;   
  }
    
  // vamos fechar o handle
  CloseHandle(hArquivo);
  
  system("PAUSE");
  return EXIT_SUCCESS;
}



PHP ::: Dicas & Truques ::: Trigonometria - Funções Trigonométricas

Como obter o valor de PI em PHP

Quantidade de visualizações: 9370 vezes
Quando estamos escrevendo códigos que envolvem computação gráfica em PHP, ou até mesmo cálculos de trigonometria, é comum precisarmos do valor de PI (algo em torno de 3,14159...). O PI é o valor da razão entre a circunferência de qualquer círculo e seu diâmetro.

A linguagem PHP nos fornece a função pi(), que retorna um valor decimal de alta precisão. Veja no código abaixo como usá-la:

<html>
<head>
  <title>Estudos PHP</title>
</head>
 
<body>

<?php  
  $PI = pi();
  echo "O valor de PI é: " . $PI;
?>  

</body>
</html>
 
  $PI = pi();
  echo "O valor de PI é: " . $PI;
?>

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

O valor de PI é: 3.1415926535898


Java ::: Java + MySQL ::: Metadados da Base de Dados (Database Metadata)

Java MySQL - Como obter os tipos de tabelas suportados pelo MySQL usando o método getTableTypes() da classe DatabaseMetaData

Quantidade de visualizações: 5494 vezes
Em algumas situações precisamos obter os tipos de tabelas suportados por uma determinada versão do MySQL. Isso pode ser feito com uma chamada ao método getTableTypes() da classe com.mysql.jdbc.DatabaseMetaData. Um objeto desta classe é obtido a partir do método getMetaData() da interface Connection (para o driver com.mysql.jdbc.Driver, é claro).

A assinatura do método getTableTypes() é:

public ResultSet getTableTypes() throws SQLException 
O retorno do método é um ResultSet contendo os tipos de tabelas, tais como "TABLE", "VIEW", "SYSTEM TABLE", "GLOBAL TEMPORARY", "LOCAL TEMPORARY", "ALIAS" e "SYNONYM".

Vamos ver um exemplo? Veja um trecho de código que usei para listar os tipos de tabelas disponíveis no MySQL 5.0:

package estudosbancodados;

import java.sql.*;

public class EstudosBancoDados{
  public static void main(String[] args) {
    // strings de conexão
    String databaseURL = "jdbc:mysql://localhost/estudos";
    String usuario = "root";
    String senha = "osmar1234";
    String driverName = "com.mysql.jdbc.Driver";

    try {
      Class.forName(driverName).newInstance();
      Connection conn = DriverManager.getConnection(databaseURL, usuario, senha);

      // vamos obter um objeto da classe com.mysql.jdbc.DatabaseMetaData
      DatabaseMetaData dbmd = conn.getMetaData();

      // vamos obter os tipos de tabelas suportadas por esta versão do MySQL
      ResultSet tiposTabelas = dbmd.getTableTypes();
      while(tiposTabelas.next()){
        System.out.println(tiposTabelas.getString("TABLE_TYPE"));
      }
      
      // vamos fechar o ResultSet
      tiposTabelas.close();
    }
    catch (SQLException ex) {
      System.out.println("SQLException: " + ex.getMessage());
      System.out.println("SQLState: " + ex.getSQLState());
      System.out.println("VendorError: " + ex.getErrorCode());
    }
    catch (Exception e) {
      System.out.println("Problemas ao tentar conectar com o banco de dados: " + e);
    }
  }
}

O resultado da execução deste código foi:

TABLE
VIEW
LOCAL TEMPORARY


Revit Python Shell ::: Dicas & Truques ::: Grupos - Groups

Como copiar grupos no Revit usando a função Create.PlaceGroup() e o Revit Python Shell

Quantidade de visualizações: 312 vezes
O código que apresento nesta dica mostra como podemos pedir para o usuário selecionar um grupo na área de desenho do Revit e, em seguida, usando a API do Revit e o Revit Python Shell, criar uma cópia do grupo escolhido e posicioná-la em um ponto escolhido pelo usuário.

Em realidade, este código é o mesmo apresentado no tutorial "Como criar seu primeiro plug-in no Revit usando a Revit C# API" da documentação oficial fornecida pela Autodesk. O que fiz foi modificar o código para usar Revit Python Shell em vez de C#, como mostrado no tutorial.

O primeiro passo é importar o objeto ObjectType a partir do módulo Autodesk.Revit.UI.Selection. Em seguida nós usamos __window__.Hide() para que o foco vá para a janela do Revit. Isso é necessário para que o usuário possa selecionar um grupo usando uidoc.Selection.PickObject. Note que coloquei uma mensagem TaskDialog.Show() chamando a atenção do usuário para esta tarefa.

Como a função PickObject() retorna um objeto Reference, nós precisamos fornecer essa referência para a função doc.GetElement() e assim obter o elemento real que queremos manipular. Então, o passo seguinte é pedir para o usuário indicar um ponto na tela de desenho do Revit usando a função uidoc.Selection.PickPoint(). Esta função vai nos retornar um objeto da classe XYZ da API do Revit.

Depois que o usuário selecionar o grupo e o ponto, nós criamos uma nova transação usando Transaction(doc, "Copiar grupo") e a iniciamos com uma chamada à sua função Start(). Então, para concluir, basta uma chamada à doc.Create.PlaceGroup(ponto, grupo.GroupType) e verificar o resultado na tela de desenho do Revit.

Veja o código Revit Python Shell completo para o exemplo:

# faz o import necessário
from Autodesk.Revit.UI.Selection import ObjectType

# precisamos ocultar a janela do Revit Python Shell
__window__.Hide()

# agora fazemos uma chamada à função PickObject() do objeto Selection e retornamos
# uma Reference
TaskDialog.Show("Aviso", "Selecione um grupo")
selecionado = uidoc.Selection.PickObject(ObjectType.Element, "Selecione um grupo")
# obtemos o grupo a partir de sua referência usando a função
# GetElement() do objeto Document
grupo = doc.GetElement(selecionado)
# vamos pedir para o usuário selecionar um ponto na área de
# desenho do Revit
TaskDialog.Show("Aviso", "Selecione um ponto")
ponto = uidoc.Selection.PickPoint("Selecione um ponto para posicionar o grupo")
 
# criamos uma nova transação e posicionamos a cópia do
# grupo nas coordenadas indicadas pelo usuário
transacao = Transaction(doc, "Copiar grupo")
# iniciamos a transação
transacao.Start()
# copiamos o grupo selecionado pelo usuário e o colocamos no
# ponto indicado
doc.Create.PlaceGroup(ponto, grupo.GroupType)
# fechamos a transação
transacao.Commit()
 
# e mostramos o resultado
TaskDialog.Show("Aviso", "O grupo foi copiado com sucesso") 
  
# depois que o usuário fizer a seleção nós mostramos a janela do
# Revit Python Shell novamente 
__window__.Show() 
__window__.Topmost = True



Java ::: Dicas & Truques ::: Sistema

Como efetuar captura de tela (screenshot) em seus programas Java usando o método createScreenCapture() da classe Robot

Quantidade de visualizações: 15116 vezes
Nesta dica eu vou mostrar como é possível usar o método createScreenCapture() da classe Robot, do pacote java.awt, para tirar um print screen, ou seja, capturar uma determinada região da tela do seu computador. Note que, ao tirar o print da região que queremos, nós salvamos a imagem em um determinado diretório.

Veja o código completo para o exemplo:

package arquivodecodigos;

import java.awt.AWTException;
import java.awt.Rectangle;
import java.awt.Robot;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;

public class Estudos{
  public static void main(String[] args){
    try{
      Robot robot = new Robot();
      // Captura a tela na àrea definida pelo retângulo
      BufferedImage bi = robot.createScreenCapture(new
        Rectangle(0, 0, 300, 250));
      // Salva a imagem
      ImageIO.write(bi, "jpg", new 
        File("C:\\estudos_java\\captura_tela.jpg"));
    }
    catch(AWTException e){
      e.printStackTrace();
    }
    catch(IOException e){
      e.printStackTrace();
    }
  }
}

Execute este código e verá uma imagem JPG ser gravada no endereço "C:\\estudos_java\\captura_tela.jpg".


Java ::: Java Swing - Componentes Visuais ::: JPanel

Como fazer uma sub-classe de JPanel para desenhar um gráfico no Java Swing

Quantidade de visualizações: 12098 vezes
Nesta dica mostrarei como podemos criar uma classe Desenho que herda da classe JPanel do Java Swing para criar uma área de desenho. Esta é uma das práticas mais comuns quando queremos desenhar gráficos ou exibir imagens em Java Swing.

Note como sobrescrevemos o método paintComponent(Graphics g) herdado da classe JPanel para pintar o fundo do painel na cor amarela e depois desenhamos um retângulo azul.

Veja o código Java Swing completo para o exemplo:

package estudos;

import java.awt.*;
import javax.swing.*;

public class Estudos extends JFrame{
  public Estudos() {
    super("A classe JPanel");
    
    Container c = getContentPane();
    Desenho desenho = new Desenho();
    c.add(desenho);

    setSize(350, 250);
    setVisible(true);
  }
  
  public static void main(String args[]){
    Estudos app = new Estudos();
    app.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  }
}

// Sub-classe de JPanel
class Desenho extends JPanel{
  public void paintComponent(Graphics g){ 
    super.paintComponent(g);
    
    // Define a cor de fundo
    setBackground(Color.YELLOW);
    
    // Desenha um quadrado na cor azul
    g.setColor(Color.BLUE);
    g.fillRect(10, 10, 100, 100);
  } 
}



C ::: Dicas & Truques ::: Arquivos e Diretórios

Como escrever em um arquivo um caractere de cada vez usando a função fputc() da linguagem C

Quantidade de visualizações: 9431 vezes
Em algumas situações precisamos escrever em um arquivo um caractere de cada vez. Para isso podemos usar a função fputc() do header stdio.h. Esta função recebe o caractere a ser escrito e um ponteiro para o objeto FILE que identifica o arquivo no qual queremos escrever. Se o caractere for escrito com sucesso, o indicador de posição interna do arquivo é adiantado para a inserção do próximo caractere.

Veja um exemplo no qual escrevemos o alfabeto maiúsculo em um arquivo chamado alfabeto.txt:

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

int main(int argc, char *argv[]){
  FILE *arquivo;
  char letra;

  // vamos abrir o arquivo para escrita
  arquivo = fopen("alfabeto.txt", "w");
  if(arquivo != NULL){
    for(letra = 'A'; letra <= 'Z'; letra++){
      fputc((int)letra, arquivo);
    }
    fclose(arquivo);
  }

  puts("Tentei escrever no arquivo. Veja se funcionou.");

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

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

Tentei escrever no arquivo. Veja se funcionou.

Em seguida, se olharmos o conteúdo do arquivo "alfabeto.txt" veremos que o conteúdo foi escrito da forma que imaginamos.


Python ::: Fundamentos da Linguagem ::: Estruturas de Controle

Como usar o laço for do Python - Apostila Python para iniciantes - O laço for

Quantidade de visualizações: 12933 vezes
O laço for (laço para) em Python é um pouco diferente daquele encontrado em Java, C ou C++. Na verdade, o laço for da Python está mais para o laço foreach do C# e o novo laço for do Java 1.5.

Em Python, o laço for funciona com sequencias (range), ou seja, a cada iteração do laço, um elemento da sequencia é retornado. Vamos ver isso mais de perto. Veja o exemplo a seguir:

def main():
  for i in range(1, 11):
    print(i)   
 
if __name__== "__main__":
  main()

Este trecho de código exibirá os números de 1 até 10. Veja que o último limite não é incluído na contagem. Este exemplo pode também ser escrito assim:

def main():
  for i in [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]:
    print(i)   
 
if __name__== "__main__":
  main()


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