Documento 03 - Terceiro Trimestre
Migrando para o Java
O Portugol Studio é uma ferramenta excelente para aprender lógica de programação, mas em algum momento você pode querer migrar para uma linguagem de programação mais utilizada no mercado, como o Java.
O Java é uma linguagem de programação amplamente utilizada em diversas áreas. Desde os websites que acessamos, aplicativos de celular, sistemas bancários e jogos (como o Minecraft).
Ambiente de Desenvolvimento Integrado (IDE)
Uma IDE é um software que reúne diversas ferramentas em um único ambiente, facilitando o desenvolvimento de software. Com uma IDE, você pode escrever, compilar, depurar e executar seu código em um único lugar.
O Portugol Studio é uma IDE, mas sua linguagem é limitada ao Portugol. Para programar em Java, você precisará de uma IDE que suporte essa linguagem.
VSCode
O Visual Studio Code (VSCode) é uma IDE gratuita e de código aberto, desenvolvida pela Microsoft. Ele é amplamente utilizado por desenvolvedores de software devido à sua flexibilidade, extensibilidade e suporte a diversas linguagens de programação, incluindo Java.
Para instalar o VSCode, siga os passos abaixo:
- Acesse o site oficial do VSCode: https://code.visualstudio.com/
- Clique no botão "Download" e escolha a versão adequada para o seu sistema operacional (Windows, macOS ou Linux).
- Após o download, execute o instalador e siga as instruções na tela para concluir a instalação.
Extensão Java
Para programar em Java no VSCode, você precisará instalar a extensão "Extension Pack for Java". Siga os passos abaixo:
- Abra o VSCode.
- Clique no ícone de extensões na barra lateral esquerda (ou pressione
Ctrl+Shift+X). - Na barra de pesquisa, digite "Extension Pack for Java".
- Clique no botão "Install" para instalar a extensão.
- Aguarde a instalação ser concluída.
- Reinicie o VSCode para garantir que todas as funcionalidades da extensão sejam carregadas corretamente.
Criando um Projeto Java
No Portugol, aprendemos a criar programas simples, com foco na lógica de programação e em algoritmos.
Um programa é geralmente composto de diversos arquivos, que juntos formam um projeto. No Java, um projeto é uma coleção de arquivos de código-fonte, bibliotecas e outros recursos necessários para construir e executar um aplicativo.
Para criar um projeto Java no VSCode, siga os passos abaixo:
- Abra o VSCode.
- Pressione
Ctrl+Shift+Ppara abrir a paleta de comandos. - Digite
> Java: Create Java Projecte selecione a opção quando ela aparecer. - Escolha um local para salvar o projeto e dê um nome a ele.
- Selecione "No build tools" para criar um projeto simples.
- O VSCode criará uma estrutura básica de projeto com uma pasta
srcpara o código-fonte. - Dentro da pasta
src, crie um novo arquivo chamadoMain.java. - Adicione o seguinte código ao arquivo
Main.java:
public class Main {
public static void main(String[] args) {
System.out.println("Olá, Mundo!");
}
}
- Salve o arquivo.
- Para executar o programa, clique com o botão direito no arquivo
Main.javae selecione "Run Java". - O terminal integrado do VSCode exibirá a saída do programa, que deve ser "Olá, Mundo!".
- Parabéns! Você criou e executou seu primeiro programa em Java!
Diferenças entre Portugol e Java
Embora o Portugol e o Java sejam usados para programar, eles possuem algumas diferenças importantes. Uma das primeiras diferenças é a sintaxe. No Portugol, usamos palavras em português para definir comandos e estruturas, enquanto no Java usamos palavras em inglês.
A função principal (aquela que executa quando o programa é iniciado) no Portugol é chamada de inicio. No Java, essa função é chamada de main e tem uma sintaxe específica.
Exemplo de função principal em Java:
public class Main {
public static void main(String[] args) {
// código a ser executado
}
}
Tipos de Dados
No Portugol, os tipos de dados são mais simples e limitados. No Java, existem mais tipos de dados e eles são escritos em inglês.
| Descrição | Portugol | Java | Exemplo |
|---|---|---|---|
| Números inteiros | inteiro |
int |
int idade = 25; |
| Números com virgula | real |
double |
double altura = 1.75; |
| Texto | cadeia |
String |
String nome = "Ana"; |
| Verdadeiro/Falso | logico |
boolean |
boolean ativo = true; |
| Caractere (letra ou número) | caractere |
char |
char letra = 'A'; |
| Vetores de Inteiros | inteiro[] |
int[] |
int[] numeros = new int[5]; |
Entrada e Saída de Dados
No Portugol, usamos escreva para exibir mensagens na tela e leia para ler dados do usuário. No Java, usamos System.out.println para exibir mensagens e a classe Scanner para ler dados.
Exemplo de programa que lê o nome do usuário e exibe uma mensagem personalizada:
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.println("Digite seu nome:");
String nome = scanner.nextLine();
System.out.println("Olá, " + nome + "!");
scanner.close();
}
}
Estruturas de Decisão
No Portugol, usamos se e senao para criar estruturas de decisão. No Java, usamos if e else.
Exemplo de uso do se e senao no java:
if (condicao) {
// código a ser executado se a condição for verdadeira
} else {
// código a ser executado se a condição for falsa
}
Também iremos usar switch para múltiplas decisões, ao invés de escolha do Portugol.
Exemplo de uso do switch no Java:
switch (variavel) {
case valor1:
// código a ser executado se variavel == valor1
break;
case valor2:
// código a ser executado se variavel == valor2
break;
default:
// código a ser executado se variavel não corresponder a nenhum caso
break;
}
Estruturas de Repetição
No Portugol, usamos enquanto para criar estruturas de repetição. No Java, usamos while.
Exemplo de uso do para no Java:
for (int contador = 0; contador < 10; contador++) {
System.out.println("Contador: " + contador);
}
Exemplo de uso do enquanto no Java:
while (condicao) {
// código a ser executado enquanto a condição for verdadeira
}
Vetores
No Portugol, declaramos vetores usando colchetes. No Java, também usamos colchetes, mas a sintaxe é um pouco diferente.
Exemplo de declaração e uso de vetores no Java:
int[] numeros = new int[5];
for (int i = 0; i < 5; i++) {
numeros[i] = i * 2;
}
Programa que preenche um vetor com os primeiros 5 números pares.
Lendo Arquivos em Java
Para ler arquivos em Java, podemos usar duas ferramentas: o FileInputStream e o Scanner. Pense no FileInputStream como uma chave que abre a porta de um arquivo para que possamos pegar as informações que estão lá dentro. Já o Scanner funciona como um leitor, que pega essas informações e nos mostra de forma organizada.
Quando usamos o FileInputStream, guardamos ele em uma variável chamada InputStream. Você pode imaginar o InputStream como um cano por onde os dados do arquivo vão passar até chegarem ao nosso programa.
Por exemplo, quando usamos System.in, estamos dizendo para o programa ler o que digitamos no teclado. Já com o FileInputStream, pedimos para o programa ler o que está escrito em um arquivo.
Assim, com essas ferramentas, conseguimos pegar informações que estão salvas em arquivos e usar no nosso programa, de forma parecida com quando lemos algo que está escrito em um caderno.
import java.io.FileInputStream;
import java.io.InputStream;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
FileInputStream input = new FileInputStream("dados.txt");
Scanner scanner = new Scanner(input);
String nomeCompleto = scanner.nextLine();
System.out.println("Nome completo: " + nomeCompleto);
}
}
Nesse exemplo, precisamos que o arquivo arquivo.txt esteja dentro da pasta do projeto. O programa vai abrir esse arquivo, ler a primeira linha (nextLine()) e mostrar o nome completo na tela.
dados.txt
Fulano de Tal
Lendo mais de uma linha
Podemos utilizar mais comandos do Scanner para ler diferentes tipos de dados, como números inteiros e números com vírgula (números reais).
import java.io.FileInputStream;
import java.io.InputStream;
import java.util.Scanner;
public class Main {
public static void main(String[] args) throws Exception {
InputStream input = new FileInputStream("dados.txt");
Scanner scanner = new Scanner(input);
String nomeCompleto = scanner.nextLine();
int idade = scanner.nextInt();
double altura = scanner.nextDouble();
System.out.println("Nome completo: " + nomeCompleto);
System.out.println("Idade: " + idade);
System.out.println("Altura: " + altura);
scanner.close();
}
}
dados.txt
Fulano de Tal
30
1.75
Não esqueça de usar o
throws Exceptionnomainpara evitar erros de compilação. Exceções são problemas que podem acontecer durante a execução do programa, como tentar abrir um arquivo que não existe. OFileInputStreampode gerar uma exceção se o arquivo não for encontradoFileNotFoundExceptione o compilador exige que tratemos essa possibilidade.
Lendo Infinitas Linhas
Para ler um arquivo infinitamente, podemos usar o hasNextLine() do Scanner junto com uma estrutura de loop (while).
import java.io.FileInputStream;
import java.io.InputStream;
import java.util.Scanner;
public class Main {
public static void main(String[] args) throws Exception {
InputStream input = new FileInputStream("pessoas.txt");
Scanner scanner = new Scanner(input);
while (scanner.hasNextLine()) {
String linha = scanner.nextLine();
System.out.println(linha);
}
scanner.close();
}
}
pessoas.txt
Fulano de Tal
Ciclano de Tal
Beltrano de Tal
Escrevendo em um arquivo
Para escrever em um arquivo, usamos o PrintWriter. O PrintWriter é uma classe que permite escrever em um arquivo, sem que o programa tenha acesso ao arquivo.
import java.io.PrintWriter;
public class Main {
public static void main(String[] args) throws Exception {
PrintWriter writer = new PrintWriter("dados.txt");
writer.println("Fulano de Tal");
writer.println("Beltrano da Silva");
writer.println("Ciclano de Souza");
writer.close();
}
}
Nesse exemplo, o programa vai criar um arquivo chamado dados.txt e escrever as informações que precisamos.
Formatando Strings
Podemos formatar Strings usando o System.out.printf(). Esse comando permite que você crie uma String formatada, onde pode inserir variáveis dentro de um texto.
String nome = "Fulano";
int idade = 30;
boolean ativo = true;
double altura = 1.75;
System.out.printf("Nome: %s, Idade: %d, Altura: %.2f, Ativo: %b\n", nome, idade, altura, ativo);
Nesse exemplo, usamos %s para Strings, %d para inteiros, %.2f para números com vírgula (com duas casas decimais) e %b para booleanos. O \n no final adiciona uma quebra de linha.
Banco de Dados
Lendo Dados de um Banco de Dados
Vamos usar como modelo o banco de dados cedup e a tabela estudante, nos moldes do modelo abaixo:
CREATE DATABASE cedup;
USE cedup;
CREATE TABLE estudante (
id INT AUTO_INCREMENT PRIMARY KEY,
nome VARCHAR(100),
email VARCHAR(100),
media DOUBLE,
turma VARCHAR(50)
);
INSERT INTO estudante (nome, email, media, turma) VALUES
('Fulano de Tal', 'fulano@example.com', 7.5, '151'),
('Ciclano de Souza', 'ciclano@example.com', 8.0, '152'),
('Beltrano da Silva', 'beltrano@example.com', 6.5, '153');
O código Java para conectar ao banco de dados MySQL e ler os dados da tabela estudante é o seguinte:
package com.example;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
public class Main {
private static final String DB_URL = "jdbc:mysql://localhost:3306/cedup?useSSL=false&serverTimezone=UTC&allowPublicKeyRetrieval=true";
private static final String USER = "root";
private static final String PASS = "root";
public static void main(String[] args) {
String sql = "SELECT id, nome, email, media, turma FROM estudante";
try (Connection conn = DriverManager.getConnection(DB_URL, USER, PASS);
PreparedStatement ps = conn.prepareStatement(sql);
ResultSet rs = ps.executeQuery()) {
while (rs.next()) {
int id = rs.getInt("id");
String nome = rs.getString("nome");
String email = rs.getString("email");
double media = rs.getDouble("media");
String turma = rs.getString("turma");
System.out.printf("id=%d, nome=%s, email=%s, media=%.2f, turma=%s%n",
id, nome, email, media, turma);
}
} catch (SQLException e) {
System.err.println("DB error: " + e.getMessage());
e.printStackTrace();
}
}
}
Esse código faz o seguinte:
- Define a URL do banco de dados, o usuário e a senha.
- Cria uma conexão com o banco de dados usando
DriverManager.getConnection(). - Prepara uma consulta SQL para selecionar todos os campos da tabela
estudante. - Executa a consulta e obtém os resultados em um
ResultSet. - Itera sobre os resultados, lendo cada campo e imprimindo na tela.
Se tudo estiver correto, a saída será algo assim:
id=1, nome=Fulano de Tal, email=fulano@example.com, media=7.50, turma=151
id=2, nome=Ciclano de Souza, email=ciclano@example.com, media=8.00, turma=152
id=3, nome=Beltrano da Silva, email=beltrano@example.com, media=6.50, turma=153
Caso algum erro ocorra durante a conexão ou a execução da consulta, uma mensagem de erro será exibida no console. Isso acontece pois utilizamos um bloco try-catch, que é responsável por "monitorar" qualquer problema que aconteça e executar o que estiver dentro da instrução catch se algo errado acontecer.
Inserindo Dados no Banco
Para inserir novos dados no banco de dados, usamos o comando SQL INSERT INTO. No Java, fazemos isso através do PreparedStatement, que permite executar comandos SQL de forma segura.
package com.example;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;
public class Main {
private static final String DB_URL = "jdbc:mysql://localhost:3306/cedup?useSSL=false&serverTimezone=UTC&allowPublicKeyRetrieval=true";
private static final String USER = "root";
private static final String PASS = "root";
public static void main(String[] args) {
String sql = "INSERT INTO estudante (nome, email, media, turma) VALUES (?, ?, ?, ?)";
try (Connection conn = DriverManager.getConnection(DB_URL, USER, PASS);
PreparedStatement ps = conn.prepareStatement(sql)) {
ps.setString(1, "João Silva");
ps.setString(2, "joao@example.com");
ps.setDouble(3, 8.5);
ps.setString(4, "154");
int linhasAfetadas = ps.executeUpdate();
System.out.println("Registros inseridos: " + linhasAfetadas);
} catch (SQLException e) {
System.err.println("Erro no banco: " + e.getMessage());
}
}
}
Nesse exemplo, usamos ? como um coringa (placeholders) no comando SQL. Depois, usamos os métodos setString(), setDouble(), etc., para preencher esses valores. O método executeUpdate() executa o comando e retorna o número de linhas afetadas.
Deletando Dados do Banco
Para deletar dados do banco de dados, usamos o comando SQL DELETE FROM. No Java, também utilizamos o PreparedStatement para executar essa operação de forma segura.
package com.example;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;
public class Main {
private static final String DB_URL = "jdbc:mysql://localhost:3306/cedup?useSSL=false&serverTimezone=UTC&allowPublicKeyRetrieval=true";
private static final String USER = "root";
private static final String PASS = "root";
public static void main(String[] args) {
String sql = "DELETE FROM estudante WHERE id = ?";
try (Connection conn = DriverManager.getConnection(DB_URL, USER, PASS);
PreparedStatement ps = conn.prepareStatement(sql)) {
ps.setInt(1, 3);
int linhasAfetadas = ps.executeUpdate();
System.out.println("Registros deletados: " + linhasAfetadas);
} catch (SQLException e) {
System.err.println("Erro no banco: " + e.getMessage());
}
}
}
Nesse exemplo, deletamos o estudante com id = 3 do banco de dados. O método executeUpdate() retorna o número de linhas que foram deletadas. Se nenhum registro corresponder à condição, o valor retornado será 0.
Atenção: Tenha cuidado ao usar o comando
DELETE. Se você não especificar uma condiçãoWHERE, todos os registros da tabela serão deletados!
Atualizando Dados no Banco
Para atualizar dados existentes no banco de dados, usamos o comando SQL UPDATE. No Java, utilizamos o PreparedStatement para executar essa operação de forma segura.
package com.example;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;
public class Main {
private static final String DB_URL = "jdbc:mysql://localhost:3306/cedup?useSSL=false&serverTimezone=UTC&allowPublicKeyRetrieval=true";
private static final String USER = "root";
private static final String PASS = "root";
public static void main(String[] args) {
String sql = "UPDATE estudante SET nome = ?, email = ?, media = ?, turma = ? WHERE id = ?";
try (Connection conn = DriverManager.getConnection(DB_URL, USER, PASS);
PreparedStatement ps = conn.prepareStatement(sql)) {
ps.setString(1, "Maria Santos");
ps.setString(2, "maria@example.com");
ps.setDouble(3, 9.0);
ps.setString(4, "155");
ps.setInt(5, 1);
int linhasAfetadas = ps.executeUpdate();
System.out.println("Registros atualizados: " + linhasAfetadas);
} catch (SQLException e) {
System.err.println("Erro no banco: " + e.getMessage());
}
}
}
Nesse exemplo, atualizamos os dados do estudante com id = 1. O método executeUpdate() retorna o número de linhas que foram atualizadas. Se nenhum registro corresponder ao ID especificado, o valor retornado será 0.
Atenção: Sempre utilize a cláusula
WHEREcom o ID específico ao atualizar dados. Sem ela, todos os registros da tabela serão atualizados com os mesmos valores!