Skip to content

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:

  1. Acesse o site oficial do VSCode: https://code.visualstudio.com/
  2. Clique no botão "Download" e escolha a versão adequada para o seu sistema operacional (Windows, macOS ou Linux).
  3. 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:

  1. Abra o VSCode.
  2. Clique no ícone de extensões na barra lateral esquerda (ou pressione Ctrl+Shift+X).
  3. Na barra de pesquisa, digite "Extension Pack for Java".
  4. Clique no botão "Install" para instalar a extensão.
  5. Aguarde a instalação ser concluída.
  6. 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:

  1. Abra o VSCode.
  2. Pressione Ctrl+Shift+P para abrir a paleta de comandos.
  3. Digite > Java: Create Java Project e selecione a opção quando ela aparecer.
  4. Escolha um local para salvar o projeto e dê um nome a ele.
  5. Selecione "No build tools" para criar um projeto simples.
  6. O VSCode criará uma estrutura básica de projeto com uma pasta src para o código-fonte.
  7. Dentro da pasta src, crie um novo arquivo chamado Main.java.
  8. Adicione o seguinte código ao arquivo Main.java:
public class Main {
    public static void main(String[] args) {
        System.out.println("Olá, Mundo!");
    }
}
  1. Salve o arquivo.
  2. Para executar o programa, clique com o botão direito no arquivo Main.java e selecione "Run Java".
  3. O terminal integrado do VSCode exibirá a saída do programa, que deve ser "Olá, Mundo!".
  4. 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 Exception no main para 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. O FileInputStream pode gerar uma exceção se o arquivo não for encontrado FileNotFoundException e 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:

  1. Define a URL do banco de dados, o usuário e a senha.
  2. Cria uma conexão com o banco de dados usando DriverManager.getConnection().
  3. Prepara uma consulta SQL para selecionar todos os campos da tabela estudante.
  4. Executa a consulta e obtém os resultados em um ResultSet.
  5. 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ção WHERE, 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 WHERE com o ID específico ao atualizar dados. Sem ela, todos os registros da tabela serão atualizados com os mesmos valores!