Programming - Week2 - PT
Programming - Week2 - PT
• 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
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
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ó.
fonte: ConwayLife
Projeto Capstone
UM
B C
A
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
Exemplo: A B C
Geração i + 1
fonte: ConwayLife
Projeto Capstone
A B C
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
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
Estruturas de natureza morta: Estas não mudam de uma geração para a outra!
fonte: ConwayLife
Projeto Capstone
Planador Leve
Nave Cabeça de
Espacial cobre
Armas: Objetos podem colidir uns com os outros na grade celular e produzir outros objetos!
Baiacu
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:
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.
Etapa 0: iniciar
Etapa 5: fim
Programa Java
Olá Mundo!
JVM
Compilador Java bytecode.class
javac Olá Mundo!
JVM
Ambientes Java
fonte: Inginea
Java
Versão Java Características Versão Java Características
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);
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
• 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
Fases de compilação
Análise
Léxica
Análise de
Sintaxe
Análise
Semântica
Geração de
código
fonte: GeeksforGeeks
Linguagens de programação
Fase de análise léxica (tokenização): O código-fonte é
lido da esquerda para a direita
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
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.
fonte: Baeldung
Linguagens de programação
Um token é apenas uma categoria dos lexemas.
identificador x, color, UP
separador }, (,;
operador +, <, =, *
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.
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.
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
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;
package example;
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
fonte: GeeksForGeeks
Linguagens de Programação
Exemplo de erros semânticos
package example;
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
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.
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
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:
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
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.
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?
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.
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
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;
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
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.
fonte: Java 17
A Linguagem Java
Relacional
Aritmética
Lógica
Booleana
declaração 2
...
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
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
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”);
}
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
false
Operador Ternário
A Linguagem Java
• Como posso interagir com um usuário?
fonte: Java 17
A Linguagem Java
Esta é uma classe,
Como posso interagir com um usuário? vamos analisá-las mais
tarde.
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()
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
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
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).