0% acharam este documento útil (0 voto)
18 visualizações

Programming - Week2 - PT

O documento discute o projeto capstone do curso, que envolve implementar o jogo da vida de Conway em Java. O jogo da vida é um autômato celular onde cada célula em uma grade 2D pode estar viva ou morta e evolui de acordo com regras simples. O projeto visa implementar as quatro regras do jogo da vida e gerar novas gerações automaticamente a partir da geração inicial definida pelo usuário. Existem diversas estruturas interessantes que podem surgir no jogo através de repetidas iterações, como osciladores, naves

Enviado por

Debora
Direitos autorais
© © All Rights Reserved
Formatos disponíveis
Baixe no formato PDF, TXT ou leia on-line no Scribd
0% acharam este documento útil (0 voto)
18 visualizações

Programming - Week2 - PT

O documento discute o projeto capstone do curso, que envolve implementar o jogo da vida de Conway em Java. O jogo da vida é um autômato celular onde cada célula em uma grade 2D pode estar viva ou morta e evolui de acordo com regras simples. O projeto visa implementar as quatro regras do jogo da vida e gerar novas gerações automaticamente a partir da geração inicial definida pelo usuário. Existem diversas estruturas interessantes que podem surgir no jogo através de repetidas iterações, como osciladores, naves

Enviado por

Debora
Direitos autorais
© © All Rights Reserved
Formatos disponíveis
Baixe no formato PDF, TXT ou leia on-line no Scribd
Você está na página 1/ 103

APR-114 Programação - 1

Este material destina-se apenas a uso acadêmico. É


Semana 2 — Elementos de Programação I — Masterclass proibida a sua distribuição ou publicação sem
autorização prévia por escrito. 2023 Universidade Jala
Prof. Dr. Javier ROCA | Todos os direitos reservados.
Agenda

• Revisão da Semana 1
• Introdução ao Projeto Capstone
• Tarefas da Masterclass Semana 2
• Linguagens de programação
• A Linguagem Java
• Criando Programas Java
• Variáveis e tipos de dados
• Operadores
• Saída e entrada do console
• Estrutura de um Programa Java Procedural
• Convenções de Codificação
• Blocos de construção de programação:
• Seqüência
• Seleção
• If - Else
• Repetição
• Ternário
Semana 1 - Resumo
Linguagem de
Alto nível

Problema Resolver Algoritmo Programação Computador App


problema

Podemos programar
Podemos resolver Podemos fornecer nosso algoritmo em Podemos ter nossa
problemas com uma solução para uma linguagem solução (software)
pensamento crítico nosso problema com imperativa de alto rodando em várias
um algoritmo nível (JAVA) plataformas
Conteúdo da Semana 2

Elementos de programação
Variáveis, operadores, seleção
Programas JAVA
Projeto Capstone

30% 50% 20%


Projeto Capstone
Nosso projeto Capstone é a implementação do
Conway's Game of Life em linguagem Java.

The Game of Life é um autômato celular desenvolvido


pelo matemático britânico John Horton Conway em
1970.

Um autômato é uma máquina autônoma que executa


uma função de acordo com um conjunto
predeterminado de instruções codificadas
automaticamente.
fonte: Fundação ConwayLife Simons
Projeto Capstone
Conway's Game of Life (GOL) é jogado
em uma grade quadrada 2D.

Cada quadrado (ou “célula”) na grade


pode estar vivo (por exemplo) ou morto
(vazio) e evoluir de acordo com regras
simples específicas.

Essas regras simples podem criar um


sistema complexo
Vivo Morto

fonte: ConwayLife
Projeto Capstone
No GoL, a evolução se refere a iterações (gerações) que acontecem
sequencialmente. Em cada geração, avaliaremos cada célula com um
conjunto de regras para calcular a próxima geração. Este é um jogo para zero
jogadores.
A primeira geração (semente) é definida pelo “jogador”. Em seguida, o jogo
evolui por si só.

Geração i Avaliar Geração i+1


células

fonte: ConwayLife
Projeto Capstone
UM
B C
A

As regras da GOL são: D E F

G H EU
Regra #1: Qualquer célula viva com menos de dois
vizinhos vivos morre (subpopulação) na próxima Geração i

geração.
A B C
Exemplo:
D E F
Na geração i, a célula A cumpre a Regra #1.
G H EU
-> Na geração i+1, A morre
Geração i + 1
fonte: ConwayLife
Projeto Capstone
UM
B C
A

As regras GoL são: D E F

Regra nº 2: Qualquer célula viva com mais de três G H EU


vizinhos vivos morre (superpopulação) na próxima
geração. Geração i

Exemplo: A B C

Na geração i, a célula E cumpre a Regra #2 D E F

-> Na geração i+1 E morre G H EU

Geração i + 1
fonte: ConwayLife
Projeto Capstone
A B C

As regras do GoL são: D E F

G H EU
Regra #3: Qualquer célula viva com dois ou três
vizinhos vivos vive (sobrevivência) na próxima Geração i

geração.
UM
B C
A
Exemplo:
D E F
Na geração i, a célula E cumpre a Regra #3
G H EU
-> Uma geração i+1 E vive
Geração i + 1
fonte: ConwayLife
Projeto Capstone
UM
B C
A

As regras do GoL são: D E F

G H EU
Regra #4: Qualquer célula morta com exatamente
três vizinhos vivos ganhará vida (nascimento) na Geração i

próxima geração.
A B C
Exemplo:
D E F
Na geração i, a célula D cumpre a Regra #4
G H EU
-> Na geração i+1 D ganha vida
Geração i + 1
fonte: ConwayLife
Projeto Capstone
• As regras GoL são aplicadas simultaneamente para cada célula
em cada geração I para calcular a próxima geração. A B C

• Neste exemplo, na geração i+1: D E F

• A vive, devido à Regra #3


G H EU
• B não muda, não cumpre nenhuma regra
Geração i
• C morre, devido à Regra #1
• D vive, devido à Regra #3
• E morre, devido à Regra #2 UM
A
B C

• F não muda (morto), não cumpre nenhuma regra D E F


• G ganha vida, mas morre para a Regra #4
G H EU
• H vive, devido à Regra #3
• I vive, devido à Regra #3
Geração i + 1
fonte: ConwayLife
Projeto Capstone

Existem estruturas bastante interessantes no GOL:

Estruturas de natureza morta: Estas não mudam de uma geração para a outra!

Bloquear Colméia Pão Barco Banheira

Você pode jogar o jogo da vida online aqui e aqui

fonte: ConwayLife
Projeto Capstone

Existem estruturas bastante interessantes no GOL:

Osciladores: Retorna ao seu estado original após um certo número de gerações

Pisca-pisca Sapo Pulsar Farol/Baliza


Trevo de Folhas

Você pode jogar o jogo da vida online aqui e aqui


fonte: ConwayLife
Projeto Capstone

Existem estruturas bastante interessantes no GOL:

Naves espaciais: elas podem viajar (se mover) na grade celular!

Planador Leve
Nave Cabeça de
Espacial cobre

Você pode jogar o jogo da vida online aqui e aqui


fonte: ConwayLife
Projeto Capstone

Existem estruturas bastante interessantes no GOL:

Armas: Objetos podem colidir uns com os outros na grade celular e produzir outros objetos!

Pistola Gosper Gliding

Você pode jogar o jogo da vida online aqui e aqui


fonte: ConwayLife
Projeto Capstone

Existem estruturas bastante interessantes no GOL:

Puffer: Uma nave espacial que deixa para trás detritos

Baiacu

Você pode jogar o jogo da vida online aqui e aqui


fonte: ConwayLife
Projeto Capstone
Por que o GOL é importante?

O Jogo da Vida de Conway nos mostra que o


comportamento complexo pode evoluir a partir de
origens simples e regras simples.

O Jogo da Vida de Conway contribuiu para a teoria


dos autômatos celulares, uma teoria fértil nas
ciências da computação. É uma boa introdução ao
B da dinâmica complexa.

É interessante ver como o visual da simulação


funciona! Viciante!
fonte: Fronteiras
Projeto Capstone
• Você precisa codificar o GOL em Java, considerando o seguinte:
• O tamanho da grade da célula será parametrizável
• w => (int) Largura em caracteres (10, 20, 40 ou 80 são os únicos valores
válidos)
• h => (int) Altura em caracteres (10, 20, 40 são os únicos valores
válidos)
• O número máximo de gerações será parametrizável
• g => (int) O número de gerações a serem executadas (>=0 são valores
válidos)
• Valor especial 0 => infinito (executará até que o usuário pressione uma
tecla)
• A velocidade das gerações será parametrizável
• s => (int) A velocidade em milissegundos ([250,1000] são valores
válidos) fonte: ConwayLife
Projeto Capstone
• A população inicial será parametrizável
• p => (str) Uma representação da população por seções de células separadas
pelo caractere “#” (precisa caber no tamanho da grade):
• “seção 1#$seção 2#... #sectionN”
• Cada seção é uma sequência de 0s ou 1s (0=>dead, 1=>alive), por
exemplo, 3x3 grid ”001#010#100” “01#11#10” ”##110”
”10101#1111#0000”
A B C A B C A B C
Inválido!
D E F D E F D E F
Não cabe na
G H I grade!
G H I G H I

• Se não forem definidas, as células na grade estarão mortas.


• Valor especial “rnd” => inicializa a população com valores aleatórios (morto, vivo).
• Todos os parâmetros são obrigatórios
fonte: ConwayLife
Projeto Capstone
• Exemplo 1 de como executar o GOL
• java GameOfLife w=10 h=20 g=100 s=300 p=”101#010#111”
• Executa o GOL com um tamanho de grade de 10x20, durante 100
gerações, a uma velocidade de 300 ms por geração e com a
seguinte população:

fonte: ConwayLife
Projeto Capstone
• Exemplo 2 de como executar o GOL
• java GameOfLife w=20 h=10 g=0 s=500 p=”rnd”
• Vai rodar o GOL com tamanho de grade 20x10, a uma velocidade
de 500 ms. por geração. Será executado até que pressionemos
uma tecla. A população inicial será criada aleatoriamente:

População criada com


células vivas aleatórias

fonte: ConwayLife
Projeto Capstone
• Exemplo 3 de como executar o GOL
• java GameOfLife w=10 h=10 g=500 s=1000 p=”##10101#1#01”
• Executará o GOL com um tamanho de grade de 10x10, a uma
velocidade de 1000 ms por geração, durante 500 gerações, a
população inicial será:

fonte: ConwayLife
Projeto Capstone
• O projeto envolverá também uma especificação para a “renderização”,
pois usaremos renderizadores externos para “desenhar” (renderizar) a
grade celular.

• Alguns aspectos nos quais você pode começar a pensar:


• O que é o algoritmo GOL?
• Represente-o como pseudocódigo e fluxograma
• Como representar uma grade celular?
• Como implementar as regras da GOL em uma grade celular?
• Como processar os parâmetros de fora (argumentos)?
• Toda semana você passará algum tempo com seu tutor revisando os
detalhes deste projeto.
fonte: ConwayLife
Tarefas da Semana 2
Tarefas da Semana 2
Algoritmos e Computação
Representação informal
e narrativa de um
Etapas, regras e instruções Representação gráfica
algoritmo. Mais perto do
para resolver um problema de um algoritmo
código (código falso)

Algoritmo para encontrar o maior dos 3 números


inseridos

Etapa 0: iniciar

Etapa 1: obtenha os números a, b e c

Etapa 2: se a for maior que b, vá para a etapa 3,


caso contrário, vá para a etapa 4

Etapa 3: compare a e c e imprima mais alto e vá para


a etapa 5

Etapa 4: compare b e c e imprima mais alto e vá para


a etapa 5

Etapa 5: fim

Algoritmo Pseudocódigo Fluxograma


Linguagens de programação

• A programação permite representar/implementar (codificar) um


algoritmo em uma linguagem de programação como um programa
que pode ser processado por um computador;
• Uma linguagem de programação inclui vários elementos para
representar um determinado algoritmo;
• Uma linguagem de programação segue um paradigma de
programação
Linguagem de
alto nível

Algoritmo Programação Computador App


Java
Principais recursos do Java
• É uma linguagem de alto nível
• É Orientada a Objetos
• Segue o paradigma imperativo
• Suporta multithreading
• Gerenciamento Automático de Memória (Garbage
Collection)
• Independência de plataforma (heterogeneidade
arquitetural)
• Escreva uma vez, execute em qualquer lugar
(WORA)
• Execução Cross-Platform
• Portátil

fonte: Coding Nomads Medium


Java
Edições do Java Usaremos esta edição

• Edição padrão (Java SE)


• O núcleo do Java, de uso geral (usaremos isso em nosso curso).
• Edição Enterprise (Java EE)
• Desenvolvida com base no Java SE, voltado para sistemas de rede
de grande escala
• Edição Java Micro (Java ME)
• Direcionado para aplicativos de dispositivos móveis e embarcados
• JavaFX (FX)
• Para criar aplicativos avançados para Desktop e Internet, com
aparência moderna.
fonte: Coding Nomads
Java
• Como o Java funciona?
Máquina Virtual
Java(JVM)
class HelloWorld {
public static void main (String [] args) { (intérprete)
System.out.println (“Olá, mundo!”) ;
1 }
3
}
Olá, Mundo!
HelloWorld.java
2 JVM

Programa Java
Olá Mundo!

JVM
Compilador Java bytecode.class
javac Olá Mundo!

JVM

1. Criar programa Java (arquivo fonte .java)


2. Compilar programa para bytecode Java
3. Executar programa java (executar por código)
Java

Ambientes Java

• JRE (Java Runtime Environment): O ambiente


mínimo necessário para executar um aplicativo
Java (sem suporte para desenvolvimento),
incluindo JVM mais bibliotecas de classe Java. JRE
existe por ambiente de destino.

• JDK (Java Development Kit): é um pacote para


desenvolvedores de software. Inclui o JRE e várias
outras ferramentas de desenvolvimento e
documentação. Existem muitos JDKs. Usaremos um JDK neste
curso.
ex.: openjdk

fonte: JRE em JAVA + EricNormand


Java

fonte: Evolution DZONE de Java


Java
Versão Java Características Versão Java Características

Java 8 - Data e hora Api Java 9 Métodos privados de interface


- Anotações repetidas API de processo
- Variáveis finais efetivas API Stack-Walking
- API de transmissão Melhorias na transmissão
- Interfaces funcionais Fábrica de coleções
- Expressões lambda Sistema de módulos
- Classe opcional API de fluxo
- Referências de métodos
- Métodos padrão e estáticos
da interface

Java 10 - var permitido para variáveis Java 11 TLS v1.3


locais Nova API de cliente HTTP
Var permitido em lambda
Novos métodos de string

fonte: Inginea
Java
Versão Java Características Versão Java Características

Java 12 - Novos métodos de string Java 14 Alternar expressões


- Classe
CompactNumberFormat
Java 15 Blocos de texto Java 16 - Tipo de registro
Novos métodos de string

Java 17 - Classes seladas Java 18 - Trechos de código na API


Java
- Servidor Web simples

fonte: Inginea
Linguagens de programação
Em poucas palavras, os elementos básicos de uma linguagem de programação
(paradigma imperativo) são:
programa
• Variáveis: partes nomeadas da memória do computador contendo {
informações de diferentes tipos de dados função getBonus (int x, int min) {
int bonusA = 10;
int bonUSB = 15;
• Declarações: Expressa alguma ação a ser realizada se (x > min) {
retorno (x * BonUsa);
} senão {
• Fluxo de controle: uma forma de definir o fluxo do programa retorno (x * bonUSB);
};
• Entrada/Saída: uma forma de se comunicar de/para usuários (por }
exemplo, via console)
int minVal = 100;
int val = read (” Insira o valor”);
• Operadores: uma operação (matemática, lógica etc.) int res = getBonus (val, minVal);

imprimir “Seu bônus é”, res


• Subrotinas: funções que podem ser invocadas no programa. }

• Uma linguagem de programação tem uma sintaxe específica para


codificar com ela
Linguagens de programação
programa Subrotinas (função
{ reutilizável)
Variáveis função getBonus (int x, int min) { Fluxo de controle
int bonusA = 10; (Seleção)
int bonUSB = 15;
se (x > min) {
retorno (x * BonUsa);
} senão { Operador *
Variáveis
retorno (x * bonUSB);
};
}

int minVal = 100; Entrada


int val = read (” Insira o valor”); Lerá do console
A saída será int res = getBonus (val, minVal);
impressa no console
imprimir “Seu bônus é”, res Fluxo de controle
} (Sequência)
Linguagens de programação
Fluxo de Controle - Blocos Acredite ou não, você pode
resolver quase tudo com esses 3
blocos! Esse é o núcleo da
programação imperativa

declaração 1
true false
condição

declaração 2
true
declaração 1 declaração 2 condição declaração

false
declaração n

Sequência Seleção Repetição


Linguagens de programação
Uma linguagem de programação é basicamente um conjunto de strings com
significado. As instruções para gerar essas strings e seu significado são
conhecidas como a gramática da linguagem, que especifica:

• Léxico:
• A lista completa de termos disponíveis (dicionário de cada termo/palavra
reconhecida pelo idioma)

• Sintaxe:
• As regras que indicam como podemos construir e combinar termos, de uma
determinada linguagem para formar unidades (frases)
• Para construir programas válidos, precisamos cumprir sua sintaxe

• Semântica:
• O significado de cada elemento da linguagem (qual é o seu propósito)
fonte: Upenn.edu
Linguagens de programação
A gramática de linguagem de programação é um conjunto de instruções sobre como
escrever declarações válidas para essa linguagem: regras que especificam como
caracteres e palavras podem ser colocados um após o outro para formar declarações
válidas (também chamadas de frases). Essa gramática pode ser especificada usando a
metalinguagem
… BNF (Formulário Backus-Naur).
Tipo:
BasicType {[]}
Tipo de referência {[]}

BasicType:
byte
short
char
int
long
float
double
boolean

Tipo de referência:
Identificador [TypeArguments] { . Identificador [TypeArguments] }

TipoArgumentos:
< TypeArgument { , TypeArgument } >

TypeArgument:
Tipo de referência
fonte: BNF para Java
? [ (estende | super) ReferenceType ]
Linguagens de programação
Como vimos anteriormente, um compilador traduz um programa escrito
em linguagem de alto nível para linguagem de máquina. Isso é feito em
diferentes fases:

Compilador

Código-fonte (linguagem de alto nível) Código de objeto (linguagem de máquina)


Linguagens de programação

Fases de compilação

Código-fonte (linguagem de alto nível)

Análise
Léxica

Análise de
Sintaxe
Análise
Semântica

Geração de
código

Compilação Código de objeto (linguagem de máquina)

fonte: GeeksforGeeks
Linguagens de programação
Fase de análise léxica (tokenização): O código-fonte é
lido da esquerda para a direita

Saída = Sequência de tokens lexicais com significado


identificado, com base em uma determinada gramática.
Código-fonte (linguagem de alto nível) Pode identificar se o código-fonte contém constantes
inválidas, grafia incorreta de palavras-chave, etc.
Análise
Lexical

Análise de
Sintaxe
Análise
O componente que faz a Análise Semântica
Léxica é conhecido como Lexer,
Tokenizer, Scanner Geração de
código

Compilação Código de objeto (linguagem de máquina)

fonte: GeeksforGeeks
Linguagens de programação
• A fase de análise léxica identifica os lexemas (unidade sintática mais
baixa) do código-fonte fornecido.
• Um lexema é uma string que corresponde ao padrão de um token.

print (“Olá, mundo”) int a = 10


Lexema Padrão Token Lexema Padrão Token

print Sequência de caracteres <function, int Sequência de <keyword, int>


(p, r, I, n, t) print> caracteres (i, n, t)
( Caracter ( <delimitador, a Sequência de <identificador,
(> caracteres a>
(a)
"Olá Uma string entre ” <literal
Mundo" const, “Olá, = Caracter = <operador, =>
mundo”>
) Caracter ) <delimitador,) 10 Sequência de <literal, 10>
> caracteres (1, 0)

fonte: Baeldung
Linguagens de programação
Um token é apenas uma categoria dos lexemas.

Nome do token Valores de token de amostra

identificador x, color, UP

palavra-chave if, while, return, int

separador }, (,;

operador +, <, =, *

literal verdadeiro, 3.1416, "Java é legal"

Comentário /* Algum comentário */, // Algum comentário

x = a + b * 2
Resultado da <operator, *> <literal, 2>[ <identifier, x>, <operator, =>,,,
análise léxica <identifier, a>, <operator, +> <identifier, b>,]

fonte: Baeldung
Linguagens de programação
• O lexer pode identificar se o código-fonte contém constantes
inválidas, ortografia incorreta das palavras-chave etc.

• O resultado final será uma lista de tokens identificados válidos.

Análise Tokens
Léxica

Código-fonte
[<identifier, x>,
<operador, =>,
x = a+ b * 2 <identifier, a>,
<operator, +>,
<identifier, b>,
<operator, *>,
<literal, 2>,

fonte: Baeldung
Linguagens de programação
Fase de Análise de Sintaxe (Análise): Verifica a
estrutura sintática (sensível ao contexto) da entrada
fornecida.

Código-fonte (linguagem de alto nível) Verifica se a sintaxe está correta (consistência do


código).

Análise
Lexical

Análise de
Sintaxe
Semântica
O componente que faz a análise de Análise
sintaxe é comumente conhecido
como Parser. Geração de
código

Compilação Código de objeto (linguagem de máquina)

fonte: GeeksforGeeks
Linguagens de programação
• Um analisador de sintaxe (analisador) recebe a entrada de um analisador
léxico na forma de fluxos de tokens.
• O analisador analisa o fluxo de tokens em relação às regras de produção
gramatical para detectar quaisquer erros no código. A saída dessa fase é
uma árvore de análise (AST - Abstract Syntax Tree).
Análise Análise
Token Árvore Parser
Léxica Sintática

Código-fonte
expr
[<identifier, x>,
=
x = a + b * 2 <operador, =>,
<identifier, a>,
<operator, +>,
<identifier, b>, var expr
<operator, *>, x +
<literal, 2>

var expr*
uma
var literal 2
b
fonte: Compiler Design
Linguagens de programação
Exemplo de AST

package example;

public class Example {


public static void main(final String[] args)
{
int a = 10;
int b = 20;
int x = a + b * 2;
}
}

fonte: AST Parser JSON Viewer


Linguagens de programação
Exemplo de um AST

package example;

public class Example {


public static void main(final String[] args)
{
int a = 10;
.
int .b = 20;
int x = a + b * 2;
}
}

fonte: AST Parser JSON Viewer


Linguagens de programação
Fase de análise semântica (parsing): Verifica a
estrutura semântica da entrada fornecida.

Garante que declarações e instruções de programas


estejam semanticamente corretas (por exemplo,
Código-fonte (linguagem de alto nível) verificação de tipo)

Análise
Léxica

Análise de
Sintaxe
Análise
O componente que faz a Análise de Semântica
Sintaxe é comumente conhecido
como Analisador Semântico Geração de
código

Compilação Código de objeto (linguagem de máquina)

fonte: GeeksForGeeks
Linguagens de Programação
Exemplo de erros semânticos

package example;

Variável não inicializada


public class Example {
public static void main(final String[] args)
{ Incompatibilidade de tipo
int a;
int b = “2”;
int c = a * b;
int while = 11; Uso indevido de
int c = 2; palavras-chave
d = 1;
} Declaração múltipla de variável
}
Variável não declarada
Linguagens de programação
Geração de código: Converte o código em código de
máquina

Seu objetivo é produzir código correto e eficiente

Código-fonte (linguagem de alto nível) Ele deve conter o significado exato do código-fonte

Análise
Léxica

Análise
Sintática

Os geradores de código podem Análise


usar otimização de código e Semântica
também gerar código para
diferentes alvos Geração de
código

Compilação Código de objeto (linguagem de máquina)

fonte: GeeksforGeeks
Linguagens de programação
// access flags 0x9
public static main([Ljava/lang/String;)V
Os geradores podem usar o AST para L0
LINENUMBER 3 L0
gerar código. BIPUSH 10
ISTORE 1
L1 O código gerado carrega
LINENUMBER 4 L1 o significado exato do
ICONST_2
ISTORE 2 código-fonte
public class Main {
public static void main(String[] args) { L2
LINENUMBER 5 L2
int a = 10;
ILOAD 1
int b = 2; ILOAD 2
int c = a * b; IMUL
System.out.println(c); ISTORE 3
} L3
} LINENUMBER 6 L3
GETSTATIC java/lang/System.out : Ljava/io/PrintStream;
ILOAD 3
INVOKEVIRTUAL java/io/PrintStream.println (I)V
L4
LINENUMBER 7 L4
RETURN
L5
LOCALVARIABLE args [Ljava/lang/String; L0 L5 0
LOCALVARIABLE a I L1 L5 1
LOCALVARIABLE b I L2 L5 2
LOCALVARIABLE c I L3 L5 3
MAXSTACK = 2
MAXLOCALS = 4
}
A linguagem Java
• Um programa Java é um programa escrito usando as regras e a
gramática da linguagem de programação Java.
• O desenvolvimento de um aplicativo Java simples envolve três
etapas:
• Escrever o código-fonte, por exemplo, usando uma IDE como IntelliJ
IDEA
• Compilar o código-fonte, usando um compilador java (javac)
• Executar o código compilado, usando o interpretador java (java)
public class Main {
public static void main(String[] args) {
System.out.println("Hello java!");
}
}
A Linguagem Java
• Você pode usar uma IDE como IntelliJ IDEA para executar essas 3
etapas
• Crie um projeto helllojava JAVA IntelliJ Java:
A linguagem Java
• Você pode usar uma IDE como IntelliJ IDEA para executar essas 3
etapas
• Escrevendo código: editor de código-fonte Java
A Linguagem Java
• Você pode usar uma IDE como IntelliJ IDEA para executar essas 3
etapas
• Compilando o código: Build Project
A linguagem Java
• Você pode usar uma IDE como IntelliJ IDEA para executar essas 3
etapas
• Código em execução: Executar projeto
A Linguagem Java
• Em poucas palavras, existem dois elementos principais na programação:
dados e instruções;
• Para trabalhar com dados, você precisa entender variáveis e tipos;
• Para trabalhar com instruções, você precisa entender de operadores,
estruturas de controle (fluxo de controle) e sub-rotinas.

Algoritmos + Estruturas de dados = Programas


Niklaus Wirth

fonte: Programação usando Java


A Linguagem Java
• Uma variável é apenas um local na memória que tem um nome
(identificador, string exclusiva) e pode ser referenciada e usada em um
programa. Uma variável contém dados.
• Em Java, uma variável tem um tipo (o tipo de dados que uma variável pode
conter). Dados variáveis
(Valor, literais, expressão)
Tipo de variável
int i = 10;
booleano b = falso;
char c = 'a';
Identificadores de longo l = 0L; Atribuição variável
variáveis
flutuante f = 1,2f;

fonte: Programação usando Java


A Linguagem Java
• O tipo mais básico de dados é chamado de dados primitivos (atômicos, no
sentido de que não podem ser divididos em unidades menores);

• Java tem 8 tipos de dados primitivos. Cada tipo tem um tamanho de


memória em bits e um intervalo para o tipo (valores possíveis);

• Observe que as palavras-chave primitivas do tipo de dados começam com


letras minúsculas. As variáveis primitivas também têm valores padrão (0
para as numéricas e false para as booleanas).

fonte: Java 17
A Linguagem Java
• Uma variável em Java é projetada para conter apenas um tipo particular de
dados;
• A variável pode conter legalmente esse tipo de dados e nenhum outro
• Java é uma linguagem fortemente tipada, o que significa que devemos
sempre declarar o tipo do dado que será utilizado antes de usá-lo.
• Java é considerada fortemente tipada porque exige a declaração de cada
variável com um tipo de dado. Uma vez declarado, o tipo de dados da
variável não pode ser alterado (a declaração de tipo ocorre apenas uma
vez).
O JAVA é alocado estaticamente: pois os tipos de dados
são verificados durante o TEMPO DE COMPILAÇÃO

O JAVA é fortemente tipado, pois as regras para tipos são


rigorosamente aplicadas

fonte: Java 17 Velog


A Linguagem Java
• Palavras-chave são palavras que têm significados predefinidos na
linguagem de programação Java.
• Elas só podem ser usadas em contextos específicos definidos pelo Java
• As palavras-chave não podem ser usadas como identificadores para
variáveis.

fonte: Java 17
A Linguagem Java
• Você pode atribuir um valor a uma variável usando a instrução de
atribuição (=)
• variável = expressão;
• onde expressão é qualquer coisa que se refere ou calcula um valor de dados.
• Em um programa, você representa valores constantes como literais. Um
literal é algo que você pode digitar em um programa para representar um
valor.
package example;

Atribuição de variáveis
public class Example {
com valor literal
public static void main(final String[] args) {
int a = 10;
int b = 20;
int x = a + b * 2; Atribuição variável
} com expressão
}

fonte: Java 17
A Linguagem Java
• Uma variável pode ser usada em um programa somente se tiver sido
declarada primeiro. O nome da variável deve ser único!
• Podemos declarar variáveis uma a uma, declarar muitas ou até mesmo
atribuir um valor a várias variáveis:

int a = 10; int a, b, c, d; int a, b, c, d;


int b = 20; a = b = c = d = 10;
int c = 30;
int d;

Declaração de variáveis Declaração de muitas Um valor único para


uma por uma variáveis por vez várias variáveis

fonte: Java 17
A Linguagem Java
• Você pode atribuir um valor de um tipo primitivo a outro tipo por meio da
conversão de tipo:
• Convertendo um tipo menor em um tamanho maior (automático), na ordem:
• byte -> short -> char -> int -> long -> float -> double

int someInt = 12; //12


double someDouble = someInt; //12.0

• Convertendo um tipo maior em um tipo de tamanho menor (manualmente)


• double -> float -> long -> int -> char -> short -> byte

double someDouble = 3.14; //3,14


int someInt = (int) someDouble; //3

fonte: Java 17
A Linguagem Java
Práticas recomendadas para a nomenclatura de variáveis
• Seja claro e conciso e respeite a sintaxe da linguagem (Case Sensitive,
etc.)

• Evite nomes sem sentido porque eles não revelam a intenção; eles
simplesmente reduzem a legibilidade.
• Por exemplo: evite “abc”, “temp”, “theData”, “var1”, etc.

• Dê nomes significativos que revelam a intenção do programador.


• Por exemplo: payDate é melhor que pd

• O nome da variável deve ser mnemômico (auxiliar na lembrança):


projetado para indicar ao observador casual a intenção de seu uso.

• Evite nomes confusos como l, m_, o_, b$a;

• Siga uma convenção de codificação (por exemplo: camelCase, etc.)


A Linguagem Java

• Qual é mais fácil de entender?

int a = 10; horasTrabalhadas = 10; int hs = 10;


int b = 20; valorPorHora = 20; int txp3_r = 20;
int c = a * b; remuneraçãoTotal = int tp1 = hs * txp3_r;
horasTrabalhadas * valorPorHora;

Use nomes de variáveis


mnemônicas (nomes
escolhidos com sabedoria)
A Linguagem Java
• Uma prática saudável é comentar o código.
• Os comentários são uma parte do programa que é completamente
ignorada pelos compiladores. Os comentários são usados principalmente
para ajudar os programadores a entender o código.

Comentários de linha
// A quantidade de horas trabalhadas única
int horas = 10; //comentário
// A taxa por hora trabalhada
int taxa = 20;
Comentários de
/*
várias linhas
O pagamento total por horas trabalhadas /* Comentários */
Este pagamento não inclui nenhum imposto ou desconto,
*/
O Java também suporta
int pagamento = horas * taxa;
comentários para
// Imprime o pagamento documentação (por
print (pagamento) exemplo, javadoc)
/** Comentários **/
A Linguagem Java
Em geral, os comentários devem explicar por que, não como. Aqui
algumas regras práticas:
• Regra 1: Os comentários não devem duplicar o código.
• Regra 2: Bons comentários não justificam código pouco claro.
• Regra 3: Se você não consegue escrever um comentário claro,
pode haver um problema com o código.
• Regra 4: Os comentários devem dissipar a confusão, não causá-
la.
• Regra 5: Explique o código unidiomático nos comentários.
• Regra 6: Forneça links para a fonte original do código copiado.
• Regra 7: Inclua links para referências externas onde elas serão
mais úteis.
• Regra 8: Adicione comentários ao corrigir bugs.
• Regra 9: Use comentários para marcar implementações
incompletas.
fonte: Blog do Stackoverflow
A Linguagem Java
O que é uma convenção de codificação?

Um conjunto de diretrizes para uma linguagem de


programação específica que recomenda estilo, práticas
e métodos de programação para cada aspecto de um
programa escrito nessa linguagem.

Também se refere a padrões e regras de codificação


para considerar um código java compatível com algum
estilo.

Por exemplo, as convenções de código Java da Oracle e o


Guia de estilo Java do Google,
A Linguagem Java
Guia de estilo Java do Google

No Google Style,
prefixos ou sufixos
especiais não são
usados. Por exemplo,
esses nomes não são do
Google Style: name_,
mName, s_name
kName.

fonte: Guia Java do Google Style


A Linguagem Java
Exemplos de convenções de código
• Siga a convenção de nomenclatura adequada;
• Adicione comentários;
• Identificador significa um nome simbólico que se refere ao nome de classes, pacotes,
métodos e variáveis em um programa Java;
• O nome da variável deve estar relacionado ao seu propósito;
• O nome do método deve estar relacionado à funcionalidade do método;
• O método não deve conter mais de n linhas;
• Não deve haver código duplicado na mesma classe ou em outra classe;
• Declare variáveis globais somente se necessário para usar nos outros métodos;
• Verifique a criação de variáveis estáticas dentro de uma classe;
• Evite acessar variáveis diretamente de outras classes, em vez disso, use métodos
getter e setter;
• Usar getters e setters;
• Mantenha o escopo das variáveis mínimo;
• Atribua nomes significativos às variáveis;
fonte: CodeGym
A Linguagem Java
Convenção de codificação, por que é importante?

int mHr = 10;


taxa de juros = 12; int horas = 10;
int _sala1= taxa de mHr*; int taxa = 12;
int salario = horas * taxa;

Código consistente
Código não consistente Todos seguem as mesmas regras
Nenhum estilo encontrado O código é padronizado

Convenção de Código
A Linguagem Java
• Uma expressão é uma parte do código do programa que representa ou computa um
valor. Uma expressão pode ser literal, variável, chamada de função ou várias dessas
coisas combinadas com operadores

• Em Java, uma declaração é uma unidade completa de execução (por exemplo,


frases em linguagem natural).

//declaração de atribuição if (band == “Hendrix”) {//início do bloco


int valor = 10; System.out.print (“Foxy”);
System.out.print (“Senhora!”) ;
//declaração de incremento declarações }//fim do bloco
terminam com ;
valor++;

//declaração de invocação do método Um bloco é um grupo de mais


System.out.println (“Olá, mundo!”) ; de 0 declarações entre chaves
{}

fonte: Java 17
A Linguagem Java
Em Java, uma declaração pode ser de três tipos:
int hour = 10;
• Declaração de Variável: Utilizada para declarar uma variável. int rate = 12;

• Declaração de Expressão: Consiste de literais, variáveis, operadores e invocações


de métodos e são os blocos de construção de um programa Java. Uma expressão é
avaliada e a avaliação pode produzir uma variável, um valor ou nada.
hour * rate

• Declaração de Fluxo de Controle: Podemos alterar a ordem de execução das


instruções usando declarações de fluxo de controle.

if (someExpression) while (SomeExpression) {


doA(); DoA (A);
else }
doB();
A Linguagem Java
• Um operador é um símbolo que executa
um tipo específico de operação em um,
dois ou mais operandos e produz um
resultado.
• O tipo do operador e seus operandos
determinam o tipo de operação
executada e o tipo do resultado
produzido.
• Os operadores em Java podem ser
categorizados com base em dois critérios:
• O número de operandos nos quais eles
operam
• O tipo de operação que eles realizam nos
operandos
fonte: Data-Flair
A Linguagem Java
Há três tipos de operadores com base no número de operandos:
Operador unário: usa um operando. Pode usar notação posfixo ou prefixo
Nome do operador Símbolo Descrição Exemplo Expressão equivalente

Operador Mais Unário É usado para representar +a a


+ um valor positivo.

Operador Menos Unário É usado para representar -a -a


- um valor negativo .

Operador de Ele incrementa o valor de ++a ou a++ a=a+1


Incremento
++ uma variável em 1.

Operador de Ele diminui o valor de uma --a ou a-- a=a-1


Decremento
-- variável em 1.

Operador de Ela inverte o valor de uma !true false


Complemento Lógico
! variável booleana.

fonte: JavaTpoint
A Linguagem Java
Existem três tipos de operadores com base no número de operandos:
Operador binário: Recebe dois operandos. Usa notação infixa

Nome do operador Símbolo Descrição Exemplo Resultado Categoria

Atribuição Atribui um valor a uma int num; A variável Atribuição


= variável num = 2 num contém o
valor 2
Adição Soma dois números 2 + 3 5 Aritmética
+

Composto Ele incrementa o valor num +=5 Adiciona 5 ao Aritmética


Aritmético
++ de uma variável em 1. valor de num.

Operador de Verifique a igualdade 2 == 3 falso Relacional


Igualdade
== dos operandos

Lógico ou Operador OU (2 > 3 | 11 > 10); verdadeiro Lógica booleana


|

fonte: Java 17
A Linguagem Java
Há três tipos de operadores com base no número de operandos:
• Operador ternário: usa três operando. É um operador condicional
(bloco de construção de seleção).
• Os símbolos ? e : fazem parte do operador ternário. Se a expressão
booleana for avaliada como verdadeira, ela avalia a expressão
verdadeira; caso contrário, ela avalia a expressão falsa.

• Sintaxe: expressão booleana ? expressão verdadeira : expressão falsa


int num1 = 50;
int num2 = 25;
// Atribui num2 a minNum, porque num2 é menor que num1
int minNum = (num1 < num2 ? num1 : num2)

fonte: Java 17
A Linguagem Java
Relacional

Aritmética

Lógica
Booleana

fonte: Java 17 - George Boole


A Linguagem Java

Operadores Java e sua


precedência

fonte: Java 17 - George Boole


A Linguagem Java
• A noção de sequência (bloco de construção) é simplesmente a
ideia de que as instruções são executadas em uma
declaração 1
determinada ordem. Cabe ao programador determinar qual é a
sequência correta para alcançar o resultado pretendido.

declaração 2
...

public class Example {


public static void main(String[] args) {
int a = 10;
declaração n int b = 2;
Sequência int c = a * b; Declarações
System.out.println(c); separadas por ;
}

Sequência
A Linguagem Java
• O fluxo de controle de seleção permite alterar a ordem de execução
das instruções com base em uma condição usando a instrução if-else

int scoreA;
int scoreB;
Condição

if (scoreA > scoreB)


print (“Player A wins!”); Statement 1
else
print (“Player B wins!”);
Statement 2

Seleção
A Linguagem Java
• O fluxo de controle de seleção permite alterar a ordem de execução das
instruções com base em uma condição usando a instrução if-else

int scoreA;
int scoreB;
int winsA;
int winsB;
Condição


Bloco de
if (scoreA > scoreB) { Declaração 1
print (“Player A wins!”);
++winsA;
} Bloco de declaração
else { 2
print (“Player B wins!”);
++winsB;
}

Seleção
A Linguagem Java
• A parte else if de uma instrução if-else é opcional.

bool isLucky;


Condição
print (“Hello!”)
if (isLucky)
print (“You are lucky today!”);
Declaração 1

int x;

if (x < 0) {
print(“X is negative”);
} else if (x == 0) { Aninhamento
print(“X is zero”);
}
else {
print(“X is positive”);
}
Seleção
A Linguagem Java
• E se você tiver que tomar uma decisão com base nos valores de uma
expressão (casos)?

expressão

Caso 1 Caso 2 Caso n Caso padrão


Declaração
declaração 1 declaração 2 … declaração n
default

Seleção multidirecional
A Linguagem Java
• Podemos implementar isso com a instrução switch.
○ Trabalha com expressões do tipo byte, short, char, int, Mudará o fluxo com
enum, String. base no valor desta
expressão
int input = 3 ;

Caso o valor da variável
switch (input) { “input” seja 1, ele executará
case (1): esta instrução
print(“I”);
break; Caso o valor da variável “input”
case (2): seja 2,
print(“II”); ele executará esta declaração
break;
case (3): Caso o valor da variável “input”
print(“III”); seja 3,
break; ele executará esta declaração
default:
Seleção multidirecional print(“Number not in range [1,3]”)
}
break transfere o controle
Caso contrário (nenhuma das condições
para fora da instrução switch.
anteriores correspondeu), ele executará
esta instrução
A Linguagem Java
• A instrução switch pode ajudar a simplificar construções complexas de if -
else

switch (grade) {
if (grade == 'A') { case ‘A’:
print("Great!"); print(“Great!”);
} else if (grade == 'B') { break;
print("Good!"); case ‘B’:
} else if (grade == 'C') { print(“Good!”);
print("Nice."); break;
} else { case ‘C’:
print("Not Good."); print(“Good!”);
} break;
default:
print(“Not Good”);
}

Aninhado if-else Switch


A Linguagem Java
• Java inclui um operador ternário condicional que ajuda no fluxo de controle de
atribuições
variável = (condição) ? expressão1 : expressão2

int a;
int a; int b;
int b; Operador Ternário int max; Mesma
int máximo; … implementação com
… if (a > b) if-then
int máximo = (a > b) ? a: b; max = a;
else
max = b;
;
true

Condição ? expressão 1 : expressão2

false
Operador Ternário
A Linguagem Java
• Como posso interagir com um usuário?

• A forma mais básica/primitiva de interação é por


meio de um console no terminal (teclado e tela).
Saída

• O Java tem uma funcionalidade (biblioteca) que


fornece métodos convenientes para ler a entrada e
gravar a saída nos fluxos de entrada (teclado) e
saída padrão (exibição) em programas de linha de
comando (console) (também conhecidos como Entrada

interface de linha de comando ou CLI).

fonte: Java 17
A Linguagem Java
Esta é uma classe,
Como posso interagir com um usuário? vamos analisá-las mais
tarde.

Para ler do teclado, podemos usar um Scanner e, para escrever no monitor,


podemos usar System.out.print
Esta é uma classe,
vamos analisá-las Imprimir no console
mais tarde.
Scanner input = new Scanner(System.in);
Leia do teclado
System.out.println("Enter your name:");

String name = input.nextLine();

System.out.println("Welcome to Programming 1 “ + name); Imprimir no console


(tela)

fonte: Java 17
A Linguagem Java
Por enquanto, pense que é uma
Como posso interagir com um usuário? função simples que você pode usar

Como alternativa, para ler no teclado e gravar em uma tela, podemos usar
System.console()

Console console = System.console();


Leia do teclado
String name = console.readLine("Enter your name: ");

console.printf("Welcome to Programming 1 “ + name);


Imprimir no console

fonte: Java 17
A Linguagem Java
Como posso interagir com um usuário?

Entrada Entrada
Saída

Entrada

Saída Saída

fonte: Java 17
A Linguagem Java

• O que é um programa Java mínimo?

Em Java, todo programa


começa com uma definição de
class OlaMundo { classe. OlaMundo é o nome
public static void main(String[] args) {
System.out.println("Olá, Mundo!");
da classe.
}
}

Esse é o método principal


(main). Todo programa java
deve conter um método
principal. Esse é o ponto de
entrada para executar o
programa,

fonte: Java 17
A Linguagem Java
O nome da classe que tem o
• O que é um programa Java mínimo? método principal a ser
executado

fonte: Java 17
A Linguagem Java
• Como funciona o main?
• Depois de compilar um programa java (HelloWorld.class), você pode
executá-lo em uma JVM.
• O comando java essencialmente inicia uma JVM.
• A JVM localiza e carrega a definição de classe HelloWorld na memória.
• Em seguida, ele procura uma declaração do método principal, que:
• É declarado como público e estático,
• retorna vazio (void),
• e tem um argumento de método como array String.
• Se encontrar a declaração do método main(), a JVM invoca o método.
• Se ele não encontrar o método main(), ele não saberá por onde iniciar
o aplicativo e lançará um erro.

fonte: Java 17
A linguagem Java

Preciso aprender POO agora?


• Você pode, mas sugerimos que primeiro aprenda os fundamentos do fluxo
de controle (blocos de construção) e os componentes básicos da
linguagem Java (por exemplo, conceitos de paradigma
procedural/imperativo).

• Você aplicará esses conceitos em POP e POO

• Você pode usar um template de uma classe e um método principal


class MyProgram { e
escrever seu código a partir daí. public static void main(String[] args) {
int hours = 10;
int rate = 20;
int pay = hours * rate;
• Revisaremos o aspecto OO de Java na semana 5. System.out.print(“Pay is “ + pay);
}
}

fonte: Java 17
Conclusões
• O projeto Capstone é baseado no Game Of Life
• Você pode começar a entender seu algoritmo.
• Existem várias fases para compilar um programa
• Análise léxica, análise sintática, análise semântica e geração de
código
• Java é uma linguagem em evolução
• Java tem 8 tipos primitivos com diferentes propósitos e usos.
• Programação é sobre dados e instruções.
• As variáveis contêm dados, elas têm um nome exclusivo e um valor.
• Os comentários ajudam os programadores a entender o código.
• Ter uma convenção de codificação é fundamental para a consistência
do código para desenvolver aplicativos em uma equipe
Conclusões
• Java tem várias categorias de operadores (aritméticos, lógicos,
relacionais, etc.), com diferentes números de operandos (unário,
ternário, binário).

• Você pode interagir com um console (teclado, monitor)


programaticamente com bibliotecas agrupadas em Java.

• O bloco de construção sequencial é suportado em Java como uma


sequência de instruções java.

• O bloco de construção de seleção é suportado em Java com


construções condicionais if-else, switch e ternário

• Um programa java precisa de um método principal para ser executado


• Até a semana 4, usaremos o Java sem focar no OOP.
Obrigado!
Perguntas?

Você também pode gostar