Você está na página 1de 162

De Pascal Para Java

Fernando Lozano
Consultor Independente
www.lozano.eti.br
<fernando@lozano.eti.br>

Sun Java Certified Programmer


IBM Visual Age Certified Associate Developer
MCSE – MCSD
RHCE – LPICP – SCP
Sobre Este Workshop

❑ O objetivo é “reciclar” os conhecimentos de um profissional


habituados a ambientes baseados em linguagens
estruturadas, como Delphi ou Visual Basic; ou de um
estudante dos primeiros períodos de ciência da computação,
que aprendeu programação estruturada, algoritmos e
estruturas de dados utilizando a linguagem Pascal
❑ A idéia é escrever programas estruturados utilizando a
sintaxe e os recursos da linguagem Java, sem nos
preocupar ainda em explorar os recursos de Programação
Orientada a Objetos e aplicações distribuídas que o Java
nos oferece
Conteúdo

1. Introdução:
❑ Paradigmas de programação
❑ Instalação do Java
2. Estrutura dos programas
3. Variáveis e Tipos de Dados
4. Comandos e Estruturas de Controle
5. Tipos de Dados Estruturados
6. Subprogramas
7. Entrada e Saída
1. Introdução

❑ Paradigmas (ou modelos) de programação


❑ Programação Procedural
❑ Programação Estruturada
❑ Programação Orientada a Objetos
❑ Programação Orientada a Eventos

❑ Instalação e operação do Java 2 Standard (J2SDK)


Programação Procedural

❑ É o paradigma de programação estilo “receita de bolo”, onde


fornecemos ao computador a sequência de passos exata
que ele deve realizar
❑ As primeiras linguagens de programação, como Assembler,
Fortran, COBOL e BASIC seguem esta paradigma
❑ Outros paradigmas, como a programação funcional, não
tiveram a mesma aceitação no mercado
❑ O paradigma procedural gera compiladores e interpretadores
eficientes porque é mapeado diretamente para a forma como
o processador do computador opera
(um computador é uma máquina procedural)
Programação Estruturada

❑ Surgiu da pesquisa sobre algoritmos e estruturas de dados


para ordenação, classificação, etc
❑ Utiliza a estratégia “dividir para conquistar” como forma de
organizar o código e comandos que expressem a intenção
do programador em vez de comandos que expressam o
funcionamento do processador (while x goto)
❑ Um programa estruturado deve dar a mesma atenção à
organização do código e à organização dos dados:
Algoritms + Data Structures = Programs (N. Wirth)
❑ Implementado pelas linguagens Pascal, Algol, Ada, C, ...
Programação Orientada a
Objetos
❑ Surgiu na linguagem Simula mas só foi plenamente
desenvolvido na linguagem Smalltalk
❑ Organiza o código em objetos, que encapsulam tanto dados
quanto código em uma unidade
❑ Os objetos são autônomos e trocam mensagens entre si
durante a execução do programa, imitando o comportamento
dos objetos do mundo real
❑ Tornou viável a construção de grandes sistemas como os
ambientes gráficos
❑ É a base das linguagens mais modernas como C++, Python
e Java
Programação Orientada a
Eventos
❑ Surgiu no desenvolvimento de aplicações gráficas para o
Mac e Unix (X Window System) e atingiu o mercado com a
popularização do Visual Basic para MS Windows
❑ Baseado no uso de objetos prontos representando janelas,
botões, caixas de texto, etc e na resposta assíncrona a
eventos gerados pela interação do usuário com o programa
❑ Embora um programa orientado a eventos pareça não-linear
(em oposição aos programas estruturados), na verdade
existe um loop de eventos que chama as subrotinas de
tratamento de eveto definidas pelo programador
Evolução x Revolução

❑ O mercado de Informática vende o mito da “revolução diária”


quando na verdade a tecnologia passa por um constante
processo de evolução
❑ Cada paradigma apresentado contém em seu interior os
paradigmas anteriores:
❑ Eventos são objetos representando as ações do usuário sobre
objetos representando a interface gráfica da aplicação
❑ O comportamento de objetos é implementado como métodos
(subrotinas) estruturadas em uma organização top-down
❑ Uma subrotina em um pograma estruturado é executada
sequencialmente, de modo procedural
Evolução e Abstração

❑ Do mais baixo nível para o mais alto nível:


❑ Programação Procedural
Foco nas instruções executadas pelo processador
❑ Programação Estruturada
Foco na organização dos dados e do código para resolver um
problema maior
❑ Programação Orientada a Objetos
Foco na representação dos objetos do mundo real (ou conceitual)
para objetos de código que os representam em um sistema ou
programa
❑ Programação Orientada a Eventos
Foco no estilo interação imposto pelas interfaces gráficas, mas é de
pouca aplicabilidade em outros estilos de interface como a web
Paradigmas de Programação
no Desenvolvimento Visual
Programação Orientada a Eventos

Programação Orientada a Objetos

Programação Estruturada

Programação Procedural
Paradigmas de Programação
no Desenvolvimento Web
Programação Baseada em Responsabilidades

Programação Orientada a Objetos

Programação Estruturada

Programação Procedural
Desenvolvimento para a Web

❑ É baseada na separação de responsabilidades entre


programadores e web designers e na separação
correspondente de papéis entre componentes responsáveis
por implementar regras de negócio (lógica do sistema) e
componentes responsávels por gerar as páginas visitadas
pelo usuário (interface com o usuário)
❑ O mesmo paradigma pode ser aplicado ao desenvolvimento
visual, com ganhos de produtividade, mas ainda não é
suportado pelos produtos populares no mercado
Instalação do Java2 SDK

❑ Baixe em www.javasoft.com o pacote correspondente à


sua plataforma (Windows ou Linux)
❑ Não é suficiente instalar o JRE pois ele não inclui o
compilador Java!
❑ Cuidado com a presença de versões anteriores do Java2
SDK (antigamente chamado de JDK) no seu computador
❑ A instalação realiza apenas a descompactação dos arquivos,
é necessário configurar o ambiente do computador para
localizar os comandos do Java e as suas bibliotecas de
classes padrão
Ambiente para Linux

❑ O java é instalado em /usr/java/j2sdk<versão>


ex: /usr/java/j2sdk1.4.1_01
❑ Crie o arquivo /etc/profile.d/j2sdk.sh com o conteúdo:

#!/bin/sh
export JAVA_HOME=/usr/java/j2sdk1.4.1_01
export PATH=$JAVA_HOME/bin:$PATH
export CLASSPATH=.

❑ Não há espaços antes ou depois do sinal de igual!


❑ Maiúsculas e minúsculas fazem diferença!
Ambiente para Windows 98

❑ O java é instalado em C:\J2sdk<versão>


ex: C:\J2sdk1.4.1_01
❑ Edite o arquivo c:\autoexec.bat e acrescente as linhas:

set JAVA_HOME=c:\j2sdk1.4.1_01
set PATH="%JAVA_HOME%\bin;%PATH%"
set CLASSPATH=.

❑ Login scripts da rede podem anular estas configurações;


contacte o administrador da rede para resolver eventuais
problemas
❑ Maiúsculas e minúsculas fazem diferença!
Ambiente para
Windows 2000 ou XP
❑ O java é instalado em C:\J2sdk<versão>
ex: C:\J2sdk1.4.1_01
❑ No ícone de Sistema do Painel de Controle, clique no
botão Variáveis de Ambiente e crie ou altere:
Nome da Variável Valor
JAVA_HOME c:\j2sdk1.4.1_01
PATH %JAVA_HOME%\bin;%PATH%
CLASSPATH .

❑ Substitua %PATH% pelo valor original da variável


❑ A não ser que as variáveis sejam definidas para todo o
sistema pelo administrador, cada usuário terá que repetir
estas definições
Testando o Ambiente

❑ É necessário uma reinicialização (reboot) do Windows 98 ou


um novo login no Windows 2000/XP e Linux
❑ Execure os comandos:

$ java -version
java version "1.4.1_01"
Java(TM) 2 Runtime Environment, Standard Edition (build 1.4.0_01-b01)
...
$ javac
Usage: javac <options> <source files>
where possible options include:
...

❑ O sinal de “$” não deve ser digitado; ele representa o aviso


de comandos (prompt)
Considerações sobre o
Windows 98
❑ Podem haver erros de “sem espaço de ambiente”. Eles são
resolvidos acrescentando a linha abaixo ao arquivo
C:\config.sys
shell=c:\windows\command.com /e:2048 /p

❑ A instalação do sistema não configura corretamente o


teclado brasileiro. Modifique ou acrescente as linhas abaixo
ao arquivo C:\autoexec.bat

C:\WINDOWS\COMMAND\doskey
mode con codepage prepare=((850) C:\WINDOWS\COMMAND\ega.cpi)
mode con codepage select=850
keyb br,,C:\WINDOWS\COMMAND\keybrd2.sys /id:275
Operação do Java2 SDK

❑ Compilar um programa: ❑ Rodar um programa:


❑ Edite o código-fonte em um ❑ Execute:
editor de textos qualquer $ java NomeDaClasse
(Notepad, Edit, SciTE, ...) ❑ Note que não incluímos a
❑ Não utilize um processador extensão .class ou .java para
de textos como o OpenOffice excecutar o programa!
ou MS Word ❑ Em ambos os casos, o
❑ Salve o arquivo para diretório que contém o
NomeDaClasse.java programa deve ser o diretório
corrente da janela de
❑ Execute: comandos
$ javac NomeDaClasse.java
Experimente

❑ Digite o programa:

class Oi
{
public static void main (String[] args) {
System.out.println ("Oi do Java!");
}
}

❑ Compile e execute:

$ javac Oi.java
$ java Oi
Oi do Java!
$
Observações

❑ Tudo deve ser digitado em minúsculas, exceto pelo “o” de


“Oi” e pelo “s” de “String”.
❑ Atenção para a pontuação: colchetes, chaves e ponto-e-
vírgula
❑ Se o comando javac não exibir nenhuma mensagem,
significa que a compilação foi realizada sem problemas.
❑ Qualquer outra mensagem indica um erro de compilação.
Corrija a digitação do programa e tente novamente
2. Pascal x Java

❑ Origens e objetivos de cada linguagem


❑ Comparação dos programas mínimos
❑ Estrutura de um programa
❑ Comentários
Épocas Diferentes

❑ Quando a linguagem ❑ Quando a linguagem Java


Pascal foi criada, os meios foi criada, não se pensava
de entrada e saída comuns mais em computadores
ainda eram cartões dentro de empresas que
perfurados, fitas de rolo e não fossem conectados a
impressoras de linha redes locais e que não
utilizassem interfaes
❑ Pouco tempo depois foi
gráficas ou web
inventado o "terminal burro"
ou "tty", que fornecia
apenas digitação e
visualização de texto ASCII
Objetivos Diferentes

❑ Pascal foi criada para ser ❑ Java foi criada para ser
uma ferramenta para o uma ferramenta poderosa
ensino de boas práticas de de modo a atender às
programação estruturada exigências das novas
aplicações, permitindo o
❑ A linguagem foi estendida
desenvolvimento
em produtos comerciais
multiplataforma de
para incorporar recursos de
aplicações distribuídas,
outras linguagens mais
utilizando técnicas de
“profissionais” como C e
Orientação a Objetos
C++
Ambientes Diferentes

❑ Pascal pressupõe um ❑ Java gera código para uma


ambiente de compilação máquina virtual, que deve
para código-nativo, e a ser interpretado (emulado)
maioria dos recursos da por um JRE (Java Run-
plataforma são fornecidos time Environment)
por bibliotecas específicas ❑ Todos os recursos
do sistema operacional
específicos de cada
❑ A linguagem Pascal não plataforma são fornecidos
define como o programa por bibliotecas padrão, de
interage com o sistema modo que o programa é o
operacional e serviços mesmo não importa o
como Bancos de Dados sistema operacional
Ambientes Diferentes
❑ A especificação da ❑ A especificação da
linguagem Pascal (assim linguagem Java é
como da maiora das complementada pela
linguagens de especificação da máquina
programação em uso) não virtual Java (JVM) e da API
fornece recursos do Java (bibliotecas de
suficientes para a classes) de modo que
construção de aplicações aplicações complexas
reais, de modo que cada possam ser escritas sem a
fabricante de compilador ou necessidade de extensões
de IDE tem que criar suas proprietárias – um
extensões proprietárias à programa Java é
linguagem independente do IDE ou
compilador utilizado
Ambientes Diferentes

Pascal (em Windows) Java (qualquer SO)


❑ Arquivo fonte *.pas ❑ Arquivo fonte *.java
❑ Compilação ❑ Compilação
❑ Arquivo objeto *.obj ❑ Arquivo de bytecodes
*.class
❑ Linkedição
(não há linkedição)
❑ Arquivo executável *.exe
❑ Execução pelo SO ❑ Execução pelo JRE
Estrutura do Programa
Program nome; class nome
{ comentário } {
// comentário
Const nome = <valor>;
<tipo> nome; ...
Type nome = <tipo>;
<método>...
Var nome : <tipo>;
static public void
<procedure ou function>... main (String args[])
{
Begin <comandos>...
<comandos>... }
End. }
Estrutura do Programa

❑ Um programa Pascal é ❑ Não existe um “programa


formado por uma Java” propriamente dito,
declaração de programa, mas apenas uma ou mais
que contém declarações de declarações de classe, que
constantes, tipos, variáveis, contém declarações de
subprogramas atributos (variáveis) e de
(procedimentos e funções) métodos (subprogramas)
e por fim um programa ❑ Várias classes podem ser
principal
empacotadas juntas em um
arquivo JAR apenas para
facilitar a distribuição
Estrutura do Programa

❑ Compiladores Pascal ❑ Uma classe pode fazer


populares como o Turbo referência a código em
Pascal, Delphi, GNU outras declarações de
Pascal e Free Pascal classe desde que o
também permitem a bytecode destas classes
declaração de unit e de (arquivos *.class) esteja em
library, pois aplicações diretórios ou pacotes *.jar
reais são muito grandes listados na variável de
para um único arquivo- ambiente CLASSPATH
fonte e uma única
declaração de programa
Programa Mínimo

Program oi; class Oi


{
Begin static public void
Writeln ('oi!'); main (String[] args)
End. {
System.out.println ("oi!");
}
}
Programa Mínimo

❑ É o menor programa que pode ser compilado e executado


em qualquer linguagem de programação, tipicamente
seguindo o estilo “Hello, World”, ou seja, um program aque
diz “Oi”
❑ Sua utilidade é ensinar como editar, compilar e executar
programas
Programa Básico

Program soma; class Soma


{
Const c = 2; static final int c = 2;
Var v : integer; static int v;

Begin static public void


v := 2; main (String[] args)
v := v + c; {
Writeln (v); v = 2;
End. v = v + c;
System.out.println (v);
}
}
Programa Básico

❑ O programa básico demonstra os elementos fundamentais


de qualquer linguagem de programação: comandos,
constantes, variáveis e expressões
❑ Observe o uso da palavra-chave static nas declarações de
variáveis e métodos (subprogramas) em Java, para que elas
se comportem da mesma forma que suas equivalentes em
Pascal
Programa Básico v2

Program soma2; class Soma2


{
procedure soma; static public void
const c = 2; main (String[] args)
Var v : integer; {
begin final int c = 2;
v := 2; int v = 2;
v := v + c; v = 2;
Writeln (v); v = v + c;
end; System.out.println (v);
}
Begin }
soma;
End.
Programa Básico v2

❑ Pascal incorpora o conceito de “programa principal”, que não


existe em linguagens mais modernas
❑ Em Java existe um método (subprograma) que é o início da
execução do programa, mas ele não é diferente de outros
meodos (subprogramas)
❑ O conceito de “programa principal” em Pascal leva à
confuzão entre variáveis globais do programa e variáveis
locais que servem apenas ao programa principal. Por isso há
o costume de mover toda a lógica que estaria no programa
principal para um procedimento (subprograma), eliminando
variáveis globais supérfulas
Programa Básico v3

Program soma2; class Soma3


{
procedure soma; static public void soma () {
const c = 2; final int c = 2;
Var v : integer; int v = 2;
begin v = 2;
v := 2; v = v + c;
v := v + c; System.out.println (v);
Writeln (v); }
end;
static public
Begin void main (String[] args) {
soma; soma();
End. }
}
Programa Básico v3

❑ Esta última versão mostra como seria um programa em Java


100% equivalente ao programa Pascal apresentado na
segunda versão
❑ Observe o estilo de identação modificado para se ajustar à
largura das colunas no slide
Sobre a Identação

❑ Java, assim como Pascal, é uma linguagem de formato livre:


podemos inserir quebras de linha ou espaços em branco em
qualquer ponto de qualquer comando
❑ As quebras do tipo

static public void


main (String[] args)

São apenas para que a listagem caiba na largura dos slides.


Em geral digitamos toda a declaração de método em uma
única linha:

static public void main (String[] args)


Estrutura do Programa

❑ Pascal divide o programa ❑ Java declara uma classe


em várias seções: que contém declarações de
declaração de constantes, métodos e variáveis;
tipos, variáveis e O “programa principal” é o
subprogramas, seguidas método
pelo programa principal static public void
main (String args[])
❑ Pascal usa ora ponto-e- ❑ Java sempre termina
vírgula, ora ponto final, ora comandos por ponto-e-
nada para terminar vírgula, exceto quando são
comandos utilizadas chaves
Estrutura do Programa

❑ Pascal utiliza chaves ❑ Java utiliza // (até o final da


{ .. } para os comentários linha) ou /* .. */
❑ O Pascal padrão define ❑ Podemos declarar métodos
uma ordem para as e variáveis em qualquer
declarações ordem
❑ Os comandos Begin .. End ❑ As chaves { .. } definem um
definem um comando comando composto
composto
❑ Maiúsculas e minúsculas ❑ Maiúsculas e minúsculas
são indiferentes fazem diferença!!!
Identificadores e Literais

// em geral, nomes de classes são iniciados por maiúsculas


class Area
{
// já nomes de métodos e de atributos são iniciados por minúsculas
static public void main (String[] args)
{
/* variáveis locais também são normalmente iniciadas por minúsculas
* exceto em constantes, quanto utilizamos maiusculas
*/
final double PI = 3.1416;
double raio = 10;
double area = PI * raio * raio;
// observe que podemos declarar e inicializar uma variável ao mesmo tempo
System.out.println ("A área do círculo de raio " + raio + " vale " + area);
}
}
Programa Área em Pascal

❑ { Em geral, todos os identificadores (nomes) em um programa Pascal são


iniciados por letras maiúsculas, mas na verdade o compilador não diferencia }
Program Area;
const
PI = 3.1416;
var
raio: real;
{ fomos obrigados a modificar o nome da variável
porque ele se torna igual ao nome do programa }
varea: real;
begin
{ não podemos declarar e inicializar uma variável ao mesmo tempo }
raio := 10;
varea := PI * raio * raio;
Writeln ('A área do círculo de raio ', raio , ' vale ', varea);
end.
Maiúsculas e Minúsculas

class Capitais
{
static public void main (String[] args)
{
String ESTADO = "RJ";
String estado = "Rio de Janeiro";
System.out.println ("A sigla do estado " + estado +
" é " + ESTADO);
}
}
Novamente o Exemplo em
Pascal
Program Capitais;
var
sigla_estado: String;
nome_estado: String;
begin
sigla_estado := 'RJ';
nome_estado := 'Rio de Janeiro';
Writeln ('A sigla do estado ', sigla_estado,
' é ', nome_estado);
end.
Outras Diferenças Entre
Pascal e Java
❑ Pascal utiliza 'aspas ❑ Java utiliza "aspas duplas"
simples' (apóstrofos) para para delimitar strings
delimitar strings;
❑ Pascal utiliza dois pontos ❑ Java utiliza apenas um
seguido por igual (:=) para sinal de igual (=) para
atribuição de variáveis atribuição de variáveis
❑ Pascal permite múltiplos ❑ Java permite um único
argumentos no comando argumento no comando
Writeln separados por System.out.println, por
vírgulas isso temos que concatenar
strings (+)
3. Dados em Pascal e Java

❑ Contantes, Literais e Variáveis


❑ Tipos de dados
❑ Variáveis e expressões
❑ Escopo e Visibilidade
❑ Objetos, tipos primitivos e referências
Constantes e Literais

❑ Const pi = 3.14159; ❑ public static final


double pi = 3.14159;
❑ 'String em Pascal' ❑ "String em Java"

❑ Note que as constantes em


Java são tipadas, como se
fossem variáveis
❑ Na verdade, elas são
variáveis com o
modificador final
Tipos de Dados Simples

❑ Char ❑ char / Char


❑ Integer ❑ int / Integer
❑ Real ❑ double / Double
❑ String ❑ String, StringBuffer
❑ Boolean ❑ boolean / Boolean
❑ True, False ❑ true, false

❑ Pascal possui apenas tipos ❑ Java diferencia tipos


primitivos primitivos e classes
Tipos Primitivos x Classes

❑ Um tipo primitivo em Java corresponde a algo que pode


ser manipulado diretamente pelo processador do
computador, ou seja, um número inteiro ou de ponto-
flutuante
❑ Todos os demais tipos de dados são classes porque
necessitam que sejam fornecidas algoritmos (métodos) para
sua manipulação pelo computador
❑ Existem classes Java correspondentes a cada tipo primitivos
porque algumas operações (como transmitir pela rede) só
podem ser realizadas sobre classes
Tipos Primitivos em Pascal

❑ Pascal fornece apenas tipos primitivos e tipos


estruturados, que são formados pelo agrupamento de
variáveis individuais de tipos primitivos
(mais adiante veremos como criar tipos estruturados em
Java utilizando classes)
❑ Alguns tipos de dados que não são manipulados pelo
processador, como string, são apesar disso tipos primitivos
da linguagem Pascal
❑ Procedimentos e funções pré-definidos na linguagem Pascal
fornecem os algoritmos para realizar operações sobre estes
tipos
Tipos de Dados Primitivos x
Classes
class Tipos
{
static public void main (String[] args)
{
Integer v1 = new Integer (1);
int v2 = 2;
int v3 = 2 + v1.intValue ();
Integer v4 = new Integer (v3);
System.out.println (v1 + " + " + v2 + " = " + v3);
}
}
Outros Tipos de Dados

❑ Java fornece uma série de tipos de dados nos pacotes


java.util, java.lang, java.io e outros, como por exemplo as
classes Date (java.util) e BigDecimal (java.math)
❑ Um pacote agrupa classes afins formando uma biblioteca de
classes, e evita conflitos de nomes entre classes de origens
diferentes
❑ Podemos nos referenciar ao nome completo da classe (que
inclui o nome do pacote), podemos importar uma classe de
um pacote (assim não precicamos usar o nome completo da
classe) ou podemos importar o pacote inteiro:
❑ import java.util.Date; ou import java.util.*;
Nomes de tipos Qualificados

class Hoje1 import java.util.Date;


{ // import java.util.*
static public
void main (String[] args) class Hoje2
{ {
java.util.Date hoje = static public
new java.util.Date (); void main (String[] args)
System.out.println (hoje); {
} Date hoje = new Date ();
} System.out.println (hoje);
}
}
Units em Pascal

❑ Pascal fornece tipos adicionais em units, que devem ser


inclusas no programa com o comando uses
❑ Muitas vezes Pascal reaproveita tipos primitivos com
significados diferentes, ou utiliza várias variáveis isoladas
em vez de definir um tipo estruturado
❑ Pascal não tem a mesma consistência de Java por ser uma
linguagem mais antiga
Data de Hoje em Pascal

Program Hoje;
{ apesar do nome, esta mesma unit pode ser utilizada em Windows e Linux }
uses Dos;
var
ano, mes, dia, diaSemana : integer;
begin
GetDate (ano, mes, dia, diaSemana);
Writeln (dia, '/ ', mes, '/ ',ano);
end.
Outra Forma de se Obter a
Data de Hoje em Pascal
Program Hoje2;
{ a unit systuils é padrão no Delphi e Free Pascal }
uses sysutils;
begin
Writeln ('A data corrente é :', DateToStr(Date));
end.

❑ Observem que tarefas corriqueiras não são definidas de


forma padrão na linguagem Pascal e na maioria das
linguagens pré-Internet (como BASIC, C e C++). Isto cria
uma dependência extrema em relação ao compilador ou IDE
adotado e compromete a vida útil das aplicações.
Conversão de Tipos em Java

❑ Java promove apenas tipos primitivos de menor precisão


para tipos primitivos com maior precisão
int i = 2; double d = 3.4;
d = i; // i = d; gera erro de compilação

❑ A maioria das classes em Java implementa o método


valueOf, que permite converter Strings em instâncias da
classe (que depois podem ser convertidas no tipo primitivo)
int n = 3; String s = "99";
n = Integer.valueOf (s).intValue ();

❑ A maioria das classes em Java implementa o método


toString que fornece uma representação textual do seu
valor
s = new Double (d).toString ();
Conversão de Tipos em Pascal

❑ Pascal promove apenas tipos numéricos de menor precisão


para tipos com maior precisão
var i: integer; d: real;
i := 2; d := 3.4;
d := i; { i := d; gera erro de compilação }

❑ Pascal fornece o procedimento pré-definido Val para


converter strings em números
var n: integer; s: string;
n := 3; s := '99';
Val (s, n);

❑ Pascal fornece a função pré-definida Str que converte um


número em string
s := Str (d);
Conversão de Tipos em Pascal
e Java
❑ Program Conversao; ❑ class Conversao
var {
i, n: integer; static public void main (String[] args) {
d: real; s: string; int i = 2; double d = 3.5;
begin System.out.println ("i = " + i + ", d = " + d);
i := 2; d := 3.5; d = i;
Writeln ('i = ', i, ', d = ', d); System.out.println ("i = " + i + ", d = " + d);
d := i; /* esta linha gera erro de compilação
Writeln ('i = ', i, ', d = ', d); i = d;
{ gera erro de compilação System.out.println ("i = " + i + ", d = " + d);
i := d; */
Writeln ('i = ', i, ', d = ', d); int n = 3; String s = "99";
} System.out.println ("n = " + n + ", s = " + s);
n := 3; s := '99'; n = Integer.valueOf (s).intValue ();
Writeln ('n = ', n, ', s = ', s); System.out.println ("n = " + n + ", s = " + s);
Val (s, n); s = new Double (d).toString ();
Writeln ('n = ', n, ', s = ', s); System.out.println ("d = " + d + ", s = " + s);
Str (d, s); }
Writeln ('d = ', d, ', s = ', s); }
end.
Variáveis

❑ Var nome : <tipo>; ❑ <tipo> nome;


❑ Var msg : String; ❑ String msg;
❑ As declarações de ❑ As declarações de
variáveis devem vir antes variáveis podem ser feitas
do bloco de comandos em qualquer lugar,
inclusive dentro de um
bloco de comandos
Atribuição de Variáveis

❑ Pascal utiliza o operador := ❑ Java utiliza o operador =


para atribuir valores à (não tem o sinal de dois
variáveis pontos)
❑ i := 2; ❑ i = 2;
❑ Posso inicializar uma
variável na declaração
❑ int idade = 29;
❑ i += 2; // i = i + 2
❑ i++; // i = i + 1
Expressões
❑ Operadores aritméticos: ❑ Operadores aritméticos:
+-*/ +-*/
❑ Funções pré-definidas: ❑ Métodos estáticos da
int abs round sin cos ... classe Math:
Math.abs, Math.sin ...
❑ Operadores binários ❑ Operadores binários:
(Free Pascal, Delphi, etc): &|~^
and or not xor
❑ Concatenação de Strings: ❑ Concatenação de Strings:
+ +
❑ Operadores de atribuição:
++ -- += -= *= /=
Ponteiros e Referências

❑ Pascal nos permite utilizar ❑ Java fornece várias


alocação dinâmica de estruturas de dados
memória para criar dinâmicas (que não tem
estruturas de dados uma dimensão pré-fixada)
complexas mas não permite ao
programador gerenciar
explicitamente a memória
❑ O uso de alocação ❑ Não utilizamos ponteiros
dinâmica pressupõe o uso em Java, mas utilizamos
de ponteiros uma construção bem
similar chamada de
referência
Ponteiros x Referências

❑ Qualquer tipo de dados, ❑ Podemos ter referências


simples ou composto, pode apenas para classes,
ter um tipo ponteiro nunca para tipos primitivos
correspondente (por isso existe int e
Integer, double e Double,
❑ Var pi : ^integer,
etc)
i : integer; ❑ Integer ri;
... int i;
new (pi); ...
pi^ := 1; ri = new Integer (1);
i := pi^; i = ri.intValue ();
dispose (pi);
Ponteiros x Referências

❑ Pascal define a constante ❑ Java define a constante


nil para indicar um ponteiro null para indicar uma
que não aponta para uma referência que não aponta
área de memória válida para nenhum objeto
❑ Veja os exemplos
ponteiro.pas e ❑ Veja os exemplos
ponteiro2.pas Ponteiro.java e
Ponteiro2.java
Gerenciamento de Memória

❑ Em Pascal, você aloca ❑ Em Java, você instancia


memória (new) e libera a um objeto (guardando uma
memória (dispose) referência)
❑ Utilizar um ponteiro antes ❑ Você nunca libera a
que seja alocada memória memória; o próprio Java
ou depois de sua liberação verifica quando não
são erros frequentes de existem mais referências
programação, assim como para um objeto e libera a
nunca liberar a memória memória ocupada; assim
alocada para um ponteiro não existem erros de
(telas azuis do Windows) programação associados à
gerenciamento de memória
Strings e Objetos

❑ Em Java, String não é um tipo primitivo (como o é em


Pascal) mas sim uma classe
❑ Portanto variáveis String em Java são referências a objetos
String, só que o compilador as trata como um caso especial,
para que elas funcionem de modo similar a um tipo primitivo
❑ Java fornece ainda o tipo (classe) StringBuffer, para quando
o tratamento especial do compilador para o tipo String for
inconveniente
Strings e Referências

❑ Você escreve em Java: ❑ O compilador Java entende


como:

String s1 = "teste"; String s1 = new String ("teste");


String s2; String s2;

s2 = s1; s2 = new String (s1);


Referências para Outras
Classes
❑ Import java.util.Date; ❑ O código ao lado faz com
... que ambas as variáveis, d1
Date d1 = new Date ();
Date d2; e d2, sejam referências
... para o mesmo objeto Date.
d2 = d1;
❑ Modificações feitas por d1
refletem em d2 e vice-
versa, já que ambas as
referências apontam para o
mesmo objeto
❑ É por isso que String é
tratada como um caso
especial pelo compilador
Referências x Valores

import java.util.Date;

class Amanha
{
static public void main (String[] args)
{
Date hoje = new Date ();
Date amanha = hoje;
amanha.setTime (amanha.getTime () +
1000 * 60 * 60 * 24);
// porque as duas linhas abaixo exibitão a mesma data?
System.out.println (hoje);
System.out.println (amanha);
}
}
O Mesmo Exemplo,
Estilo Java
import java.util.Date;

class Amanha2
{
static public void main (String[] args)
{
Date hoje = new Date ();
Date amanha = new Date (hoje.getTime () +
1000 * 60 * 60 * 24);
// porque as duas linhas abaixo exibitão datas diferentes?
System.out.println (hoje);
System.out.println (amanha);
}
}
Data de Amanhã em Pascal

❑ Program AmanhaPas;
{ cuidado pois o nome do programa e das
variáveis pode entrar em conflito }
uses sysutils;
var
hoje: TDateTime;
amanha: TDateTime;
begin
hoje := Date;
amanha := hoje + 1;
Writeln (DateToStr(hoje));
Writeln (DateToStr(amanha));
end.
Recapitulando

❑ Pascal sempre trabalha com valores, exceto quando o


programador trabalha com ponteiros
❑ Neste caso o programador deve gerenciar explicitamente a
memória
❑ Java sempre trabalha com referências, exceto com tipos
primitivos e com a classe String
❑ De um jeito ou de outro o Java gerencia a memória
automaticamente
Escopo

❑ Pascal define os escopos ❑ Java define os escopos de


global e local classe, de instância e local
❑ Local está dentro de um ❑ Local está dentro de um
procedimento ou função método ou de um bloco
(chaves)
❑ Senão é global
❑ Instância é o padrão
❑ Classe é indicado pela
palavra-chave static
❑ Para converter programas
Pascal, utilize apenas static
e local
Escopo em Pascal e Java
❑ Program Escopo; ❑ class Escopo {
var public static int v1 = 11;
v1: integer; public int v2;

procedure subrotina; static public void subrotina () {


var int v1 = 22;
v1: integer; System.out.println ("v1 (local) = " + v1);
begin }
v1 := 21;
writeln ('v1 (local) = ', v1); static public void main (String[] args) {
end; subrotina ();
System.out.println ("v1 (global) = " + v1);
begin Escopo obj1 = new Escopo ();
v1 := 12; obj1.v2 = 33;
subrotina; Escopo obj2 = new Escopo ();
writeln ('v1 (global) = ', v1); obj2.v2 = 33;
end. System.out.println ("v2 (obj1) = " + obj1.v1);
System.out.println ("v2 (obj2) = " + obj1.v2);
}
}
Visibilidade
❑ Pascal não define regras ❑ Java define as visibilidades
de visibilidade private, protected e public
❑ O Turbo Pascal define as ❑ private é visível apenas
seções de interface e dentro da classe
implementation de uma ❑ protected é visível também
Unit
em classes derivadas
❑ O Object Pascal (Delphi) ❑ public é visível em
define visibilidade para
qualquer classe
atributos de classes
❑ Para converter do Pascal
❑ Mas estamos preocupados
para Java, use public
apenas com o Pascal
estruturado
Visibilidade

❑ Este tópico só vem realmente ao caso em programas


maiores, que tem que ser quebrados em vários arquivos-
fonte, ou seja, várias units em Pascal ou várias classes em
Java.
❑ Mais detalhes serão vistos no módulo de Programação
Orientada a Objetos em Java
4. Comandos em Pascal e Java

❑ Estruturas de controle if, for, while, ...


❑ Expressões lógicas
❑ Comparação de objetos
❑ Linha de comandos
❑ Saída padrão e de erros
Estruturas de Controle

❑ If condição Then ❑ if (condição)


bloco bloco
Else else
bloco bloco
❑ While condição Do ❑ while (condição)
bloco bloco
❑ Repeat ❑ do
bloco bloco
Until condição while (condição)
❑ For v := m To n Do ❑ for (expr1; expr2; expr3)
bloco bloco
Exemplo de If

class Par
{
static public void main (String[] args)
{
int numero = 3;
if (numero % 2 == 0)
System.out.println ("O número " + numero + " é par");
else
System.out.println ("O número " + numero + " é ímpar");
}
}
Exemplo de If em Pascal

❑ Program Par;
var
numero : integer;
begin
numero := 2;
if numero mod 2 = 0 then
writeln ('O número ', numero, ' é par.')
else
writeln ('O número ', numero, ' é ímpar.');
end.
Exemplo de For

class Contador
{
static public void main (String[] args)
{
for (int i = 1; i <= 10; i++)
System.out.println ("contando: " + i);
}
}
Exemplo de For em Pascal

❑ Program Contador;
var
i : integer;
begin
for i := 1 to 10 do
writeln ('Contando: ', i)
end.
Estruturas de Controle

❑ No comando If, um ; no ❑ Os parênteses são parte da


lugar errado gera um erro sintaxe dos comandos,
de sintaxe portanto são obrigatórios
❑ Necessitamos das ❑ Não existem palavras-
palavras-chave Them no If chave extras nem casos
e Do no While e For especiais do ;
❑ Repeat..Until executa até ❑ do..while executa
que a condição seja enquanto a condição seja
verdadeira verdadeira
❑ Um loop For conta ❑ Um loop for pode não
números sequencialmente utilizar números!
Equivalênca de Loops
For e While
❑ For i := 1 To 5 Do Begin ❑ for (i = 1; i <= 5; i++) {
{comandos} //comandos
End; }
❑ i := 1; ❑ i = 1;
While i <= 5 Do Begin while (i <= 5) {
{comandos} //comandos
i := i + 1; i ++;
End; }
❑ No Pascal, a equivalência é ❑ Em Java, a equivalênca é
apenas do For para o nos dois sentidos: qualquer
While, nunca no sentido loop while pode ser
inverso transformado em um for
equivalente
Exemplo: Percorrer Uma
Lista Encadeada
❑ p := inicio; ❑ p = inicio;
While p <> nil Do Begin while (p != null) {
{comandos} //comandos
p := p^.prox; p = p.prox;
End; }
❑ for (p = inicio; p != null;
p = p.prox) {
// comandos
}
❑ Veja os exemplos
Percorre*.java e
percorre*.pas
Estruturas de Controle

❑ Case v Of ❑ switch (v) {


v1: {comandos}; v1: //comandos
v2: {comandos}; break;
... v2: //comandos
Else {comandos} break;
End; ...
default: //comandos
}
❑ v pode ser de qualquer tipo ❑ v pode ser de qualquer tipo
enumerado primitivo
❑ O comando break é
necessário!
Interrupção de Loops
❑ Condições extras no While ❑ Condições extras no while,
e Repeat..Until do..while e for
❑ Comando Goto no For ou ❑ Comando break em
If..Then qualquer estrutura (while,
do..while, for, switch e if)

❑ Veja os exemplos ❑ Veja os exemplos


break*.pas e Break*.java e
continue*.pas Continue*.Java
Interrupção de Loops

❑ Comando break interrompe toda a execução do loop


❑ Comando continue interrompe apenas a iteração corrente
❑ O comando switch executa do label especificando em
diante, por isso necessita do break para se tornar
equivalente ao comando case do Pascal

❑ Veja os exemplos Switch*.java e switch.pas


Exemplos de break e continue

❑ for (int i = 1; i <= 4; i++) ❑ for (int i = 1; i <= 4; i++)


{ {
if (i == 2) break; if (i == 2) continue;
System.out.println (i); System.out.println (i);
} }
❑ O resultado é: ❑ O resultado é:
1 1
3
4
Exemplos de break e continue
❑ int i = 2; ❑ O resultado é:
switch (i) { 2
case 1: 3
System.out.println ("1"); 4
case 2:
System.out.println ("2"); ❑ Para que o resultado seja
case 3: apenas “2”, temos que incluir
System.out.println ("3"); um comando break em cada
case 4: label
System.out.println ("4");
}
Continue e Break x Goto

❑ Enquanto que o uso do comando goto em Pascal e outras


linguagens que o suportam é desaconselhado por violar os
princípios da programação estruturada, o uso do continue
ou break em Java é considerado ok
❑ Continue e Break não podem realizar saltos para fora de
um método, e forçosamente seguem a estruturação do
programa em comandos aninhados, ao contrário do
comando goto.
❑ Sempre é possível reescrever o código para não usar break
e continue (ou goto), mas em muitos casos a lógica fica
mais clara se estes comandos forem utilizados
O Bom Uso de Break e
Continue
❑ Os comandos break e continue podem gerar sequências de
execução de instruções não-intuitivas no programa
(é por isso que o goto era desaconselhado)
❑ Por isso seu uso deve ser restrito a situações onde a
sequência normal de execução não poderá ser mantida, por
exemplo, ao serem detectados dados inválidos pelo
programa
Expressões Condicionais
❑ Comparação numérica: ❑ Comparação de tipos
= <> < > <= >= primitivos:
== != < > <= >=
❑ Comparação de Strings: ❑ Comparação de Strings e
= <> < > <= >= outros objetos:
.equals() .compareTo()
❑ Operadores lógicos: ❑ Operadores lógicos:
and or not && || !
❑ Expressões com and, not e ❑ Os operadores && ! e || tem
or em geral devem utilizar precedência menor, por
parênteses isso não necessitamos
utilizar parênteses
Expressões Condicionais

❑ If (a = 2) or (b = 3) Then ❑ if (a == 2 || b == 3)
... ...
❑ If not (a >= 2) Then ❑ if (! a >= 2)
... ...
❑ If s = 'teste' Then ❑ if (s.equals ("teste"))
... ...
❑ If s > 'abc' Then ❑ if (s.compareTo ("abc") > 0)
... ...

❑ Veja os exemplo ❑ Veja o exemplo


exprcond.pas Exprcond.java
Comparação de Objetos

❑ Em Java, os operadores condicionais atuam somente sobre


os tipos primitivos; se compararmos (== ou !=) em uma
variável cujo tipo seja uma classe, estamos comparando
para onde a referência aponta, e não o conteúdo do objeto
referenciado.
❑ Para comparar os valores de objetos, temos que utilizar os
métodos equals() ou compareTo()
❑ Como Strings são objetos em Java, utilizar os operadores ==
ou != irá sempre gerar resultados inesperados.
Comparação de Objetos

import java.util.Date;

class Amanha3
{
static public void main (String[] args)
{
Date hoje = new Date ();
Date amanha = new Date (hoje.getTime () +
1000 * 60 * 60 * 24);
if (hoje.equals (amanha))
System.out.println (hoje + " é igual a " + amanha);
if (hoje.compareTo (amanha) < 0)
System.out.println (hoje + " é menor que " + amanha);
}
}
Expressões Condicionais

❑ Os operadores lógicos em Java tem precedência tal que na


maioria dos casos não há necessidade de parênteses em
expressões complexas, ao contrário do Pascal...
❑ Java executa expressões condicionais ou lógicas em curto-
circuito, por exemplo:

a = 2; b = 3;
if (a == 2 || b == 3) ...

irá avaliar apenas a == 2, pois true “ou” qualquer coisa


sempre resulta em true
❑ Exemplos curtocircuito.pas e CurtoCircuito.java
Linha de Comando em Java

❑ Até agora todos os exemplos utilizaram dados pre-fixados no


código. É mais interessante rodar exemplos como Par.java
ou Contador.java se o programa puder receber dados do
usuário
❑ As necessidades de suporte a múltiplos idiomas e culturas
em Java torna um tanto complexa a digitação interativa de
dados, por isso vamos utilizar o recurso de linha de
comando
❑ Os argumentos de linha de comando utilizada na execução
de uma classe Java são passados para o método main
como um array de Strings.
Listando os argumentos na
linha de comando
❑ class Eco
{
static public void main (String[] args)
{
for (int i = 0; i < args.length; i++)
System.out.println ("args[" + i + "] = " + args[i]);
if (args.length == 0)
System.out.println ("Não foi passado nenhum argumento");
}
}
❑ $ java Eco 1 2 3 $ java Eco Este é um Teste
args[0] = 1 args[0] = Este
args[2] = 2 args[1] = é
args[3] = 3 args[2] = um
args[3] = Teste
Execício: Reescreva os
exemplos Par e Contador
$ java Par 2 $ java Contador 5
O número 2 é par contando: 1
contando: 2
$ Java Par 3 contando: 3
O número 3 é ímpar contando: 4
contando: 5

❑ Recapitule como converter ❑ Veja alguns exemplos


Strings em números na reescritos com a linha de
parte 3 deste curso comando no subdiretório
“comandos”
Saída Padrão e de Erros

❑ O Java define dois canais de saída para aplicações em


modo texto:
❑ System.out representa a saída padrão, que normalmente é a tela,
mas pode ser redirecionada para um arquivo
❑ System.err representa a saída de erros padrão, que normalmente
também é a tela. Entretanto, redirecionar a saída padrão não
redireciona a saída de erros, assim mensagens de erro não serão
perdidas pelo usuário
Redirecionamento da Saída

❑ class OutErr
{
static public void main (String[] args)
{
System.out.println ("mensagem normal do programa");
System.err.println ("mensagem de erro do programa");
}
}
❑ $ java OutErr
mensagem normal do programa
mensagem de erro do programa
$ java OutErr > saida.txt
mensagem de erro do programa
$ more saida.txt
mensagem normal do programa
Pascal e Linha de Comando

❑ A linguagem Pascal não define meios de se acessar a linha


de comando ou as saídas padrão e de erro
❑ Entretanto compiladores como o Free Pascal e o Turbo
Pascal definem extensões à linguagem para fornecer estas
características
❑ Os exemplos correspondentes também estão na pasta
“comandos”
Abortando um Programa

❑ Java fornece o método System.exit enquanto que o Free


Pascal, Turbo Pascal e derivados fornecem o procedimento
halt
❑ Ambos recebem um único parâmetro que, se for diferente de
zero, indica término anormal do programa. Se for zero,
indica que o programa executou até o final com sucesso
❑ Este valor de retorno pode ser testado por outros programas,
batches ou scripts
❑ if errorlevel = 0 ... (DOS/Windows)
❑ if [ $? = 0 ]; ... (Linux)
5. Estruturas de Dados em
Pascal e Java
❑ Vetores e Matrizes
❑ Registros
❑ Enumerações
❑ Estruturas encadeadas
❑ Vetores e Hashes
Tipos de Dados Compostos

❑ Pascal define vetores, ❑ Java define apenas vetores


enums, sets e records e classes; não existem sets
❑ Pascal permite dar novos ❑ Não existe a declaração de
nomes a tipos existentes tipos no Java, apenas a
declaração de classes
❑ Os records do pascal ❑ No Java não existem
podem ser variantes “classes variantes”, mas
podemos definir classes
derivadas e referencia-las
pelo tipo da superclasse ou
utilizar casts
Vetores

❑ Var v : array [0..9] of integer; ❑ int[] v = new int[10];


❑ V[1] := 2; ❑ v[2] = 2;

❑ Pascal define índices ❑ Java sempre inicia o array


iniciais e finais para o array no índice zero; você
declara apenas a
quantidade de elementos
❑ Os arrays em Pascal tem ❑ Um vetor em Java pode ser
tamanho fixo. Uma vez recriado com um tamanho
criados, não mudam de diferente, mas perde o
tamanho conteúdo
Matrizes

❑ Var mi[1..3,1..3] of integer; ❑ int[][] mi = new int[3][3];


❑ mi[1,1] := 1; ❑ mi = {
mi[1,2] := 0; { 1, 0, 0 },
mi[1,3] := 0; { 0, 1, 0 },
mi[2,1] := 0; { 0, 0, 1 }
mi[2,2] := 1; };
mi[2,3] := 0;
mi[3,1] := 0;
❑ mi[0][0] = 1;
mi[3,2] := 0; mi[0][1] = 0;
mi[3,3] := 1; mi[0][2] = 0;
mi[1][0] = 0;
...
Matrizes

❑ Pascal inclui vários índices ❑ Java utiliza um par de


entre colchetes, separados colchetes para cada índice,
por vírgulas de modo que uma matriz é
um vetor onde cada
elemento é por sua vez
outro vetor
(“vetor de vetores”)
❑ Note como Java fornece
uma sintaxe compacta para
se inicializar um vetor ou
matriz
Exemplos

❑ Compare os programas:
Vetor.java e vetor.pas
MatrizIdentidade.java e matrizidentidade.java
❑ MatrizIdentidade.java e matrizidentidade.java
demonstram como podemos inicializar vetores e matrizes
diretamente no código, sem recorrer a laços for
❑ Modifique os exemplos de matriz identidade para utilizar a
linha de comando, assim como foi feito em Vetor2.java ou
vetor2.pas
Registros

Type endereco = Record class Endereco


logradouro : string; {
numero : integer; public String logradouro;
complemento : string; public int numero;
bairro : string; public String complemento;
cep : string; public String bairro;
End; public String cep;
}

❑ Veja o exemplo ❑ Veja o exemplo


registro.pas Registro.pas
Registros

❑ Em Pascal você pode criar ❑ Em Java você é obrigado a


um tipo ou usar a sintaxe criar um novo tipo (uma
record .. end diretamente classe)
na declaração da variável ❑ Se você não declarar cada
variável como public, a
classe não poderá ser
manipulada como um
registro
❑ Assim como um vetor, a
variável do novo tipo deve
ser inicializada com o
comando new
Registros

Program UsaEndereco; class UsaEndereco


{
<declaração do record> static public void
... main (String[] args)
{
Var end1 : Endereco; Endereco end1 =
new Endereco ();
Begin
end1.logradouro := end1.logradouro =
'Rua Barata Ribeiro'; "Rua Barata Ribeiro";
end1.numero := 111; end1.numero = 111;
End. }
}
Comando With

❑ É definido em Pascal para reduzir a quantidade de código


escrita para manipular registros
❑ Não existe equivalente em Java, e na verdade ele é
desnecessário uma vez que sejam empregadas técnicas de
POO
❑ Veja RegtistroOO.java para ter uma primeira idéia de como
POO pode simplificar o código com registros
Registros e Arquivos-Fonte

❑ No Turbo Pascal ou no ❑ Normalmente, cada classe


Delphi, você pode inserir a Java é declarada em um
declaração do record em arquivo separado, mas
uma Unit (na seção de também podemos declarar
interface) e “usar” a unit no várias classes no mesmo
programa com a arquivo-fonte
declaração: ❑ Não é necessário fazer
nada de especial para usar
uses <unit>;
uma classe em outro
programa (outra classe),
desde que estejam no
mesmo diretório
Records Variantes

Type Funcionario = Record class Funcionario {


nome : String; public String nome;
Case gerente: Boolean Of public boolean gerente = false;
true: (depto : String); }
End;
class Gerente extends Funcionario {
public boolean gerente = false;
public String depto;
❑ Note que o campo }
“gerente” é necessário para
o Pascal mas poderia ser
omitido na versão Java
❑ FALTA VERSAO COM
UNITS!!!
Records Variantes

❑ Var func : Funcionario; ❑ Funcionario func, ger;


ger : Funcionario; ...
... func = new Funcionario ();
func.nome := 'Fulano'; func.nome = “Fulano”;
func.gerente := false;
ger = new Gerente ();
ger.nome := 'Sicrano'; ger.nome = “Sicrano”;
ger.gerente := true; ((Gerente)ger).depto =
ger.depto := 'Finanças'; “Finanças”

func := ger; func = ger;


Writeln (func.nome); System.out.println (
func.nome);
Registros e Referências

❑ Em pascal, podemos ter ❑ Em Java, temos apenas


variáveis do tipo registro e referências para objetos de
variáveis que apontam para uma certa classe
um registro
❑ Type reg = record ❑ class Reg
.... ...
Var r1 : reg, Reg r1;
r2 : ^reg; Reg r2;
... ...
new (r2); r2 = new Reg ():
r1 := r2; r1 = new Reg (r2);
Registros e Referências

❑ No Free Pascal, Delphi e ❑ Em Java, não precisamos


etc, podemos obter o do endereço de uma
endereço de uma variável: variável já que sempre
manipulamos referências
❑ Type reg = record ❑ class Reg
.... ...
Var r1 : reg, Reg r1 = new Reg ();
r2 : ^reg; Reg r2;
... ...
r2 := @r1; r2 = r1;
{ agora r1 e r2 apontam para o // agora r1 e r2 fazem
mesmo registro reg } // referência ao mesmo
// objeto Reg
Enumerações

❑ Em Pascal, utilizamos ❑ Podemos atingir o mesmo


enumerações para declarar intento com constantes em
constantes em grupo e uma classe Java, só que é
para limitar a faixa de mais trabalhoso
valores possíveis para uma ❑ Em Java perdemos a
variável
verificação dos valores
realizada pelo compilador
Pascal
Enumerações

❑ Type Situacao = ( ❑ class Situacao {


aprovado, rejeitado, static public final int
emAvaliacao aprovado = 1;
); static public final int
... rejeitado = 2;
static public final int
emAvaliacao = 3;
}
...
❑ Var pedido : Situacao; ❑ int pedido;
... ...
❑ pedido := emAvaliacao; ❑ pedido =
Situacao.emAvaliacao;
❑ pedido := 99; { erro } ❑ pedido = 99; // ok
Estruturas Encadeadas

❑ Em Pascal, utilizamos ❑ Em Java, podemos usar


registros e ponteiros para classes e referências para
criar uma lista encadeada criar as mesmas estruturas
ou uma árvore
❑ Type No = record ❑ class No
texto : String; {
prox : ^No; public String texto;
end; public No prox;
}
❑ Veja a série de exemplos
“percorre” na parte 4
Estruturas Encadeadas

❑ Em Pascal, criamos uma ❑ Em Java, criamos uma


série de procedimentos série de métodos para
para inserir, localizar e desempenhar as mesmas
excluir nós da lista funções
❑ Esses procedimentos ❑ Estes métodos fazem parte
recebem um ^No como da classe No, portanto não
parâmetro há necessidade de passar
um ponteiro como
parâmetro
❑ Dizemos que Java suporta
diretamente o conceito de
tipo abstrato de dados
Estruturas Encadeadas

❑ Em Pascal, temos que criar ❑ Em Java, podemos


vários tipos “No” e vários declarar dentro da classe
procedimentos para um atributo do tipo Object;
armazenar informações de este atributo pode
tipos diferentes diferentes referenciar qualquer classe
na lista, duplicando código pré-definida ou defina pelo
programador
❑ Na recuperação do objeto,
temos que utilizar um cast
para manipular o objeto
com a classe correta, ver
linha em negrito na próxima
página
Estruturas Encadeadas
❑ Type Pno : ^No; ❑ class No
No : record of {
str : String; public Object obj;
prox : Pno; public No prox;
End;
static void insere
Procedure insere (Object obj, No no)
(str : String; var no: No) {
Var novo : PNo; No novo = new No ();
Begin novo.obj = obj;
new (novo); novo.prox = no.prox;
novo^.str := str; no.prox = novo;
novo^.prox := no.prox; }
no.prox := novo; }
End;
Estruturas Encadeadas

❑ Var inicio : No; ❑ No inicio = new No ();


no : Pno; inicio.obj = “Primeiro”;
... inicio.prox = null;
inicio.str := “Primeiro”; No.insere (“Segundo”, inicio);
inicio.prox := nil; No.insere (“Terceiro”,
insere (“Segundo”, inicio); inicio.prox);
insere (“Terceiro”,
inicio.prox^); No no = inicio;
while (no != null) {
no := @inicio; System.out.println (
While (no <> nil) Do Begin (String)no);
Writeln (no^.str); no = no.prox;
no := no^.prox; }
End;
Estruturas Encadeadas

❑ É possível escrever, compilar e executar programas em Java


que implementam estruturas de dados no “estilo Pascal”,
como no exemplo ao lado
❑ Entretanto, dificilmente encontraremos um programa Java
neste estilo; programadores Java irão preferir utilizar os
mecanismos e “estilo” da Programação Orientada a Objetos,
que são bem mais poderosos
❑ Este workshop não pretende ensinar POO, portanto ficamos
com o estilo “estranho” para o Java de se criar estruturas de
dados encadeadas
Vetores e Hashes

❑ Em Java, utilizamos as classes pré-definidas Vector e Hash em


vez de criar as nossas próprias estruturas encadeadas
❑ Um Vector é similar a um array, associando objetos a um índice,
mas pode crescer (e encolher) dinamicamente
❑ Um Hash é similar a um array, mas associa objetos a outros
objetos. Pense no índice como podendo ser qualquer tipo de
objeto
❑ Nem o Vector nem o Hash são capazes de lidar com tipos de
dados primitivos
❑ Devemos importar o pacote java.util para utilizar essas classes
Vetores e Hahes

import java.util.Vector; import java.util.Hashtable;


... ...
Vector v = new Vector (); Hashtable h =
v.add (0, "Primeiro"); new Hashtable ();
v.add (1, "Segundo"); h.put ("RJ", "Rio de Janeiro");
v.add (1, "Terceiro"); h.put ("SP", "São Paulo");
System.out.println (v.get (1)); h.put ("MG", "Belo Horizonte");
String s = (String)v.get (2); System.out.println (h.get ("SP"));
System.out.println (s); String s = (String)h.get ("MG");
System.out.println (s);
❑ Lembre que, sempre que
utilizamos uma referência a
Object, temos que utilizar o
cast para associar a
referência à classe correta
6. Programação Top-Down em
Pascal e java
❑ Subprogramas ou subrotinas
❑ Passagem de argumentos por valor e referência
❑ Funções pré-definidas
Subprogramas

❑ Pascal define dois tipos de ❑ Java define apenas


subprogramas: procedures métodos, que podem ser
e functions de instância ou de classe
❑ Procedures não tem valor ❑ Um método que não
de retorno, mas functions retorna nada é do tipo void
tem que retornar um valor ❑ O valor retornado por um
❑ O programa é obrigado a método pode ser ignorado
utilizar o valor retornado
por uma funciton
Funções

Program exemplo; class Porcento


{
Function porcento
static public double
(taxa, total : real) : real;
porcento (double taxa, double total)
Begin
{
porcento := (taxa * total) / 100;
return (taxa * total) / 100;
End;
}
Begin
static public void
Writeln (porcento (10, 50));
main (String[] args)
End.
{
System.out.println
(porcento (10, 50));
}
}
Procedimentos

Program exemplo; class DizOi


{
Procedure dizoi (nome : String); static public void
Begin dizoi (String nome) {
Writeln ('Oi, ', nome); System.out.println ("Oi, " +
End; nome);
}
Begin
dizoi ('Fulano'); static public void
End. main (String[] args) {
dizoi ("Fulano");
}
}
Argumentos

❑ Em Pascal, os argumentos ❑ Em Java, os argumentos


imitam a declaração de também imitam a
variáveis, sendo separados declaração de variáveis,
por ponto-e-vírgula mas são separados por
vírgulas
❑ Pascal diferencia a ❑ Java sempre passa os
passagem de argumentos argumentos por valor, mas
por valor e por referência o efeito em classes é o
com a palavra-chave var mesmo da passagem por
referência
❑ tipos primitivos valor
classes referência
Passagem de Argumentos por
Referência
Program referencia; import java.util.Date;

Procedure altera (var n : String); class Referencia


Begin {
n := 'Fim'; static public void altera (Date d) {
End; d.setTime (d.getTime() + 24 *
60 * 60 * 1000 );
Var msg : String; }

Begin static public void


msg := 'Inicio'; main (String[] args) {
altera (msg); Date hoje = new Date ();
Writeln (msg); altera (hoje);
End. System.out.println (hoje);
}
}
Recursividade
Program Recursividade; class Recursividade{
static public int fatorial (int n) {
Function if (n == 0)
fatorial (n : integer) : integer; return 1;
Begin else
If n = 0 Then return fatorial (n - 1) * n;
fatorial := 1 }
Else
fatorial := fatorial (n - 1) * n; static public void
End; main (String[] args) {
System.out.println (fatorial (5));
Begin }
Writeln (fatorial (5)); }
End.
Escopo de Subprogramas

❑ Se definirmos uma Unit ❑ Os métodos estão sujeitos


(Free Pascal, Delphi, etc) às mesmas regras de
podemos ter subprogramas visibilidade que as
globais (seção de interface) variáveis (public, protected,
e subprogramas visíveis private)
apenas dentro da unit
(seção de implementation)
da mesma maneira que
variáveis globais
Funções Pré-Definidas
❑ A linguagem Pascal ❑ Java tem classes pré-
considera uma série de definidas, como parte de
procedimentos e funções um dos pacotes java.* e
como sendo pré-definidos, algumas destas classes
por exemplo Writeln ou definem métodos estáticos
Abs para funções como abs ou
sin
❑ O Free Pascal, o Delphi e ❑ O pacote java.lang.* é
etc inserem estes sempre importado
subprogramas na unit automaticamente, por isso
System e o todos os temos String e System
programas “usam” esta unit disponíveis em qualquer
programa
Funções Numéricas

❑ Round ❑ Math.round
❑ Abs ❑ Math.abs
❑ Sin, Cos, Tan, ... ❑ Math.sin, Math.cos, ...
❑ Rand ❑ Math.random ou a classe
java.util.Random
Funções Para Strings

❑ Length ❑ s.length onde s é uma


referência para String
❑ Substring ❑ s.substring
❑ Trim ❑ s.trim
❑ Str ❑ Integer.toString,
Double.toString, etc
❑ Val ❑ String.valueOf (int),
String.valueOf (double), etc
❑ Integer.parseInt,
Double.parseDouble, etc
7. Entrada e Saída em
Pascal e Java
❑ Arquivos
❑ Arquivos texto
❑ Serialização de objetos
❑ Arquivos binários
❑ Tratamento de erros e Excessões
Arquivos

❑ Pascal define uma série de ❑ Java define uma série de


tipos e procedimentos pré- classes e métodos no
definidos para manipulação pacote java.io para
de arquivos manipulação de arquivos e
outras fontes de dados
❑ Esses tipos e ❑ Em geral essas classes
procedimentos são parte são defindas em Java
do compilador, não podem
ser definidos em Pascal
❑ Free Pascal, Delphi e etc ❑ As classes padrão do Java
definem units extras para atendem mesmo aos usos
manipulação de arquivos mais incomuns
Arquivos

❑ Tipos de dados: ❑ Classes:


❑ File of <tipo> ❑ Stream
❑ Text ❑ Filtro
❑ Procedimentos: ❑ Reader / Writer
❑ Assign ❑ Temos que conjugar
❑ Reset
objetos das três classes
acima para ler ou escrever
❑ Rewrite de um arquivo
❑ Read / Readln
❑ Java não sabe o que é o
❑ Write / Writeln EOF
❑ Close
Escrita Em Um Arquivo Texto
Program GravaTexto; class GravaTexto
{
Var arq : Text; static public void
i : Integer; main (String args[])
{
Begin PrintWriter arq = new
Assign (arq, 'teste.txt'); PrintWriter (new
Rewrite (arq); BufferedWriter (new
For i := 1 To 5 Do Begin FileOutputStream (“teste.txt”)));
Writeln (arq, “linha ”, i); for (int i = 1; i <= 5; i++) {
End; arq.println (“linha ” + i);
Close (arq); }
End. arq.close ();
}
}
Leitura de Um Arquivo Texto
Program LeTexto; class LeTexto
{
Var arq : Text; static public void
linha : String; main (String args[])
{
Begin BufferedReader arq = new
Assign (arq, 'teste.txt'); BufferedReader (new
Reset (arq); InputStreamReader (new
While not EOF (arq) Do Begin FileInputStream (“teste.txt”)));
Readln (arq, linha); String linha = arq.readLine ();
Writeln (linha); while (linha != null) {
End; System.out.println (linha);
Close (arq); linha = arq.readLine ();
End. }
arq.close ();
}
}
Parece Complicado...
❑ São três objetos, trabalhando em conjunto, cada qual com sua
função
❑ O Stream é uma fonte de dados, pode ser um arquivo, uma
conexão de rede, uma porta serial, ...
❑ O Reader ou Writer sabe como ler ou escrever byte a byte ou em
blocos; cada fonte de dados é manipulada de modo mais eficiente
de uma destas formas
❑ O Filtro processa os dados após a leitura ou antes da escrita para
considerar finais de linha, formatos de data, etc
❑ Então faz sentido:
Leitura: Filtro (Reader (Stream)))
❑ Escrita: Writer (Filtro (Stream)))
... Mas É Flexível

❑ Mudando o Stream, um programa pode ler um arquivo em


disco ou um arquivo em um servidor Web
❑ Mudando o filtro, podemos converter acentos, finais de linha
(Windows / Unix), blocagem, ...
❑ Mudando o reader ou writer, podemos ler byte-a-byte,
caráter-a-caráter (não é o mesmo a byte-a-byte; pense em
árabe, japonês, russo, ...), bloco-a-bloco ou objeto-a-objeto
❑ Aninhando novos filtros, podemos compactar, descompactar,
criptografar, ...
Escrita Em Um Arquivo
Binário
Program GravaNumeros; class GravaNumeros
{
Var arq : File Of Integer; static public void
i : Integer; main (String args[])
{
Begin ObjectOutputStream arq = new
Assign (arq, 'teste.dat'); ObjectOutputStream (new
Rewrite (arq); FileOutputStream (“teste.dat”));
For i := 1 To 5 Do Begin for (int i = 1; i <= 5; i++) {
Write (arq, i); arq.writeObject (new Integer (i));
End; }
Close (arq); arq.close ();
End. }
}
Leitura de Um Arquivo Binário
Program LeNumeros; class LeNumeros
{
Var arq : File Of Integer; static public void
numero : Integer; main (String args[])
i : Integer; {
ObjectInputStream arq = new
Begin ObjectInputStream (new
Assign (arq, 'teste.dat'); FileInputStream (“teste.dat”));
Reset (arq); for (int i = 1; i <= 5; i++) {
For i := 1 To 5 Do Begin numero =
Read (arq, numero); (Integer)arq.readObject ();
Writeln (numero); System.out.println (numero);
End; }
Close (arq); arq.close ();
End. }
}
Completando Os Exemplos

❑ Os exemplos de leitura e ❑ Para compilar, temos que


escrita de arquivos em adicionar uma estrutura
Java não compilam, mas o try..catch:
compilador irá gerar erros ❑ static public void
do tipo: main (String args[])
{
❑ LeNumeros.java:9:
try {
unreported exception ...
java.io.FileNotFoundExceptio // código para ler/gravar
n; must be caught or declared ...
to be thrown catch (Exception e) {
System.err.println
(e.getMessage ());
}
}
Excessões

❑ Situações que podem gerar erros de execução do programa


(ex: nome de arquivo não encontrado, acesso negado)
geram Excessões em um programa Java
❑ O programador é obrigado a capturar as excessões e trata-
las de alguma maneira; esta é a finalidade do try (tentar) ..
catch (pegar)
❑ No try temos o código que pode gerar excessões
❑ No catch temos o código que trata das excesões
❑ A exceção em si é um objeto que contém informações sobre
o erro que a gerou
Excessões
❑ Você pode “jogar a ❑ static public void leArquivo ()
exceção para cima” throws Exception
{
(throws) em vez de trata-la; ... // código de leitura
mas o método main não }
pode deixar de tratar as
excessões geradas pelos static public void
métodos chamados por ele main (String args[])
{
try {
leArquivo ();
}
catch (Exception e) {
System.err.println
(e.getMessage ());
}
}
Excessões

❑ Existem várias classes ❑ try {


derivadas de Exception, ...
}
de modo que o programa catch (FileNotFoundException e) {
pode reagir de forma ...
diferente a cada tipo de }
erro catch (IOException e) {
...
❑ Sempre especifique os }
comandos catch da catch (Exception e) {
excessão mais específica ...
}
para a exceção mais
genérica
Lendo do Teclado

❑ Em Pascal, basta utilizar os ❑ Em Java, temos que criar


procedimentos Read ou objetos Reader e Filter
ReadLn sem especificar sobre o InputStream
um aquivo como parâmetro System.in
❑ O Pascal converte
automaticamente os tipos ❑ Temos que ler Strings e
de dados converte-las nos tipos
corretos
❑ BufferedReader teclado = new
BufferedReader (new
InputStreamReader (
System.in));
String linha = in.readLine ();
Lendo do Teclado

❑ Porque a classe System não me fornece um


BufferedReader da mesma forma que me fornece um
PrintStream – o atributo System.out ?
❑ Porque, caso a entrada padrão seja redirecionada, ela pode
conter dados que não são texto
❑ Além disso, a leitura de dados é sempre mais complexa do
que a gravação, pois existem mais situações de erro, mais
lógica para reconhecer o que está sendo lido, etc
❑ Por fim, a digitação de texto em idiomas orientais não é nada
simples...
Dicas de E/S

❑ Arrays são objetos em Java, portanto você pode ler ou


gravar um array (vetor ou matriz) diretamente em um
ObjectStream; não há necessidade de ler ou escrever cada
elemento individualmente
❑ O mesmo pode ser feito com objetos Vector, Hashtable,
Date, ...
❑ Temos também o DataInputStream e DataOutputStream
para lidar com tipos primitivos
❑ O EOF em um DataStream ou ObjectStream é a exceção
EOFException
Lendo E Gravando Registros

❑ Não podemos ler ou gravar objetos de qualquer classe em


um ObjectStream, mas apenas objetos de classes
serializáveis
❑ Para que suas classes sejam serializáveis, a declaração
dela deve implementar a interface Serializable
❑ class Cliente implements Serializable
{
...
}
❑ A maioria das classes pré-definidas do Java são
serializáveis
E Agora...
❑ Este workshop abordou como podemos fazer programação
estruturada com a linguagem Java
❑ Mas, para aproveitar plenamente a capacidade do Java,
devem ser utilizadas técnicas de Programação Orientada a
Objetos
❑ O Java Tutorial, em www.javasoft.com, ensina passo-a-
passo tanto a linguagem Java e seus principais pacotes
quanto princípios de POO
❑ O livro Thinking in Java de Bruce Eckel (www.eckel.com)
está inteiramente disponível em formato PDF (+ de 1000
páginas) e é um ótimo guia para técnias básicas e
avançadas de programação Java
Outras Referências

❑ Aprenda Java em 21 dias


❑ Core Java, Volumes I e II