Pascal Java

162
De Pascal Para Java Fernando Lozano Consultor Independente www.lozano.eti.br <[email protected]> Sun Java Certified Programmer IBM Visual Age Certified Associate Developer MCSE – MCSD RHCE – LPICP – SCP

Transcript of Pascal Java

Page 1: Pascal Java

De Pascal Para Java

Fernando LozanoConsultor Independente

www.lozano.eti.br<[email protected]>

Sun Java Certified ProgrammerIBM Visual Age Certified Associate Developer

MCSE – MCSDRHCE – LPICP – SCP

Page 2: Pascal Java

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

Page 3: Pascal Java

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

Page 4: Pascal Java

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)

Page 5: Pascal Java

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)

Page 6: Pascal Java

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, ...

Page 7: Pascal Java

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

Page 8: Pascal 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

Page 9: Pascal Java

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

Page 10: Pascal Java

Evolução e Abstração

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

❑ Programação ProceduralFoco nas instruções executadas pelo processador

❑ Programação EstruturadaFoco na organização dos dados e do código para resolver um problema maior

❑ Programação Orientada a ObjetosFoco 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 EventosFoco no estilo interação imposto pelas interfaces gráficas, mas é de pouca aplicabilidade em outros estilos de interface como a web

Page 11: Pascal Java

Paradigmas de Programação no Desenvolvimento Visual

Programação Orientada a Eventos

Programação Orientada a Objetos

Programação Estruturada

Programação Procedural

Page 12: Pascal Java

Paradigmas de Programação no Desenvolvimento Web

Programação Baseada em Responsabilidades

Programação Orientada a Objetos

Programação Estruturada

Programação Procedural

Page 13: Pascal Java

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

Page 14: Pascal Java

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

Page 15: Pascal Java

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/shexport JAVA_HOME=/usr/java/j2sdk1.4.1_01export PATH=$JAVA_HOME/bin:$PATHexport CLASSPATH=.

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

❑ Maiúsculas e minúsculas fazem diferença!

Page 16: Pascal Java

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_01set 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!

Page 17: Pascal Java

Ambiente paraWindows 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 ValorJAVA_HOME c:\j2sdk1.4.1_01PATH %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

Page 18: Pascal Java

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 -versionjava version "1.4.1_01"Java(TM) 2 Runtime Environment, Standard Edition (build 1.4.0_01-b01)...$ javacUsage: javac <options> <source files>where possible options include:...

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

Page 19: Pascal Java

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\doskeymode con codepage prepare=((850) C:\WINDOWS\COMMAND\ega.cpi)mode con codepage select=850keyb br,,C:\WINDOWS\COMMAND\keybrd2.sys /id:275

Page 20: Pascal Java

Operação do Java2 SDK

❑ Compilar um programa:

❑ Edite o código-fonte em um editor de textos qualquer (Notepad, Edit, SciTE, ...)

❑ Não utilize um processador de textos como o OpenOffice ou MS Word

❑ Salve o arquivo para NomeDaClasse.java

❑ Execute:$ javac NomeDaClasse.java

❑ Rodar um programa:

❑ Execute:$ java NomeDaClasse

❑ Note que não incluímos a extensão .class ou .java para excecutar o programa!

❑ Em ambos os casos, o diretório que contém o programa deve ser o diretório corrente da janela de comandos

Page 21: Pascal 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 OiOi do Java!$

Page 22: Pascal 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

Page 23: Pascal Java

2. Pascal x Java

❑ Origens e objetivos de cada linguagem

❑ Comparação dos programas mínimos

❑ Estrutura de um programa

❑ Comentários

Page 24: Pascal Java

Épocas Diferentes

❑ Quando a linguagem Pascal foi criada, os meios de entrada e saída comuns ainda eram cartões perfurados, fitas de rolo e impressoras de linha

❑ Pouco tempo depois foi inventado o "terminal burro" ou "tty", que fornecia apenas digitação e visualização de texto ASCII

❑ Quando a linguagem Java foi criada, não se pensava mais em computadores dentro de empresas que não fossem conectados a redes locais e que não utilizassem interfaes gráficas ou web

Page 25: Pascal Java

Objetivos Diferentes

❑ Pascal foi criada para ser uma ferramenta para o ensino de boas práticas de programação estruturada

❑ A linguagem foi estendida em produtos comerciais para incorporar recursos de outras linguagens mais “profissionais” como C e C++

❑ Java foi criada para ser uma ferramenta poderosa de modo a atender às exigências das novas aplicações, permitindo o desenvolvimento multiplataforma de aplicações distribuídas, utilizando técnicas de Orientação a Objetos

Page 26: Pascal Java

Ambientes Diferentes

❑ Pascal pressupõe um ambiente de compilação para código-nativo, e a maioria dos recursos da plataforma são fornecidos por bibliotecas específicas do sistema operacional

❑ A linguagem Pascal não define como o programa interage com o sistema operacional e serviços como Bancos de Dados

❑ Java gera código para uma máquina virtual, que deve ser interpretado (emulado) por um JRE (Java Run-time Environment)

❑ Todos os recursos específicos de cada plataforma são fornecidos por bibliotecas padrão, de modo que o programa é o mesmo não importa o sistema operacional

Page 27: Pascal Java

Ambientes Diferentes❑ A especificação da

linguagem Pascal (assim como da maiora das linguagens de programação em uso) não fornece recursos suficientes para a construção de aplicações reais, de modo que cada fabricante de compilador ou de IDE tem que criar suas extensões proprietárias à linguagem

❑ A especificação da linguagem Java é complementada pela especificação da máquina virtual Java (JVM) e da API do Java (bibliotecas de classes) de modo que aplicações complexas possam ser escritas sem a necessidade de extensões proprietárias – um programa Java é independente do IDE ou compilador utilizado

Page 28: Pascal Java

Ambientes Diferentes

Pascal (em Windows)

❑ Arquivo fonte *.pas

❑ Compilação

❑ Arquivo objeto *.obj

❑ Linkedição

❑ Arquivo executável *.exe

❑ Execução pelo SO

Java (qualquer SO)

❑ Arquivo fonte *.java

❑ Compilação

❑ Arquivo de bytecodes *.class(não há linkedição)

❑ Execução pelo JRE

Page 29: Pascal Java

Estrutura do Programa

Program nome;{ comentário }

Const nome = <valor>;

Type nome = <tipo>;

Var nome : <tipo>;

<procedure ou function>...

Begin <comandos>...End.

class nome{ // comentário

<tipo> nome; ...

<método>...

static public void main (String args[]) { <comandos>... }}

Page 30: Pascal Java

Estrutura do Programa

❑ Um programa Pascal é formado por uma declaração de programa, que contém declarações de constantes, tipos, variáveis, subprogramas (procedimentos e funções) e por fim um programa principal

❑ Não existe um “programa Java” propriamente dito, mas apenas uma ou mais declarações de classe, que contém declarações de atributos (variáveis) e de métodos (subprogramas)

❑ Várias classes podem ser empacotadas juntas em um arquivo JAR apenas para facilitar a distribuição

Page 31: Pascal Java

Estrutura do Programa

❑ Compiladores Pascal populares como o Turbo Pascal, Delphi, GNU Pascal e Free Pascal também permitem a declaração de unit e de library, pois aplicações reais são muito grandes para um único arquivo-fonte e uma única declaração de programa

❑ Uma classe pode fazer referência a código em outras declarações de classe desde que o bytecode destas classes (arquivos *.class) esteja em diretórios ou pacotes *.jar listados na variável de ambiente CLASSPATH

Page 32: Pascal Java

Programa Mínimo

Program oi;

Begin Writeln ('oi!');End.

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

Page 33: Pascal Java

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

Page 34: Pascal Java

Programa Básico

Program soma;

Const c = 2;Var v : integer;

Begin v := 2; v := v + c; Writeln (v);End.

class Soma{ static final int c = 2; static int v;

static public void main (String[] args) { v = 2; v = v + c; System.out.println (v); }}

Page 35: Pascal Java

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

Page 36: Pascal Java

Programa Básico v2

Program soma2;

procedure soma; const c = 2; Var v : integer;begin v := 2; v := v + c; Writeln (v);end;

Begin soma;End.

class Soma2{ static public void main (String[] args) { final int c = 2; int v = 2; v = 2; v = v + c; System.out.println (v); }}

Page 37: Pascal Java

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

Page 38: Pascal Java

Programa Básico v3

Program soma2;

procedure soma; const c = 2; Var v : integer;begin v := 2; v := v + c; Writeln (v);end;

Begin soma;End.

class Soma3{ static public void soma () { final int c = 2; int v = 2; v = 2; v = v + c; System.out.println (v); }

static public void main (String[] args) { soma(); }}

Page 39: Pascal Java

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

Page 40: Pascal Java

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)

Page 41: Pascal Java

Estrutura do Programa

❑ Pascal divide o programa em várias seções: declaração de constantes, tipos, variáveis e subprogramas, seguidas pelo programa principal

❑ Pascal usa ora ponto-e-vírgula, ora ponto final, ora nada para terminar comandos

❑ Java declara uma classe que contém declarações de métodos e variáveis;O “programa principal” é o métodostatic public voidmain (String args[])

❑ Java sempre termina comandos por ponto-e-vírgula, exceto quando são utilizadas chaves

Page 42: Pascal Java

Estrutura do Programa

❑ Pascal utiliza chaves{ .. } para os comentários

❑ O Pascal padrão define uma ordem para as declarações

❑ Os comandos Begin .. End definem um comando composto

❑ Maiúsculas e minúsculas são indiferentes

❑ Java utiliza // (até o final da linha) ou /* .. */

❑ Podemos declarar métodos e variáveis em qualquer ordem

❑ As chaves { .. } definem um comando composto

❑ Maiúsculas e minúsculas fazem diferença!!!

Page 43: Pascal Java

Identificadores e Literais

// em geral, nomes de classes são iniciados por maiúsculasclass 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); }}

Page 44: Pascal Java

Programa Área em Pascal

❑ { Em geral, todos os identificadores (nomes) em um programa Pascal sãoiniciados 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.

Page 45: Pascal Java

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); }}

Page 46: Pascal Java

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.

Page 47: Pascal Java

Outras Diferenças EntrePascal e Java

❑ Pascal utiliza 'aspas simples' (apóstrofos) para delimitar strings;

❑ Pascal utiliza dois pontos seguido por igual (:=) para atribuição de variáveis

❑ Pascal permite múltiplos argumentos no comando Writeln separados por vírgulas

❑ Java utiliza "aspas duplas" para delimitar strings

❑ Java utiliza apenas um sinal de igual (=) para atribuição de variáveis

❑ Java permite um único argumento no comando System.out.println, por isso temos que concatenar strings (+)

Page 48: Pascal Java

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

Page 49: Pascal Java

Constantes e Literais

❑ Const pi = 3.14159;

❑ 'String em Pascal'

❑ public static finaldouble pi = 3.14159;

❑ "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

Page 50: Pascal Java

Tipos de Dados Simples

❑ Char

❑ Integer

❑ Real

❑ String

❑ Boolean

❑ True, False

❑ Pascal possui apenas tipos primitivos

❑ char / Char

❑ int / Integer

❑ double / Double

❑ String, StringBuffer

❑ boolean / Boolean

❑ true, false

❑ Java diferencia tipos primitivos e classes

Page 51: Pascal Java

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

Page 52: Pascal Java

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

Page 53: Pascal Java

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); }}

Page 54: Pascal Java

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.*;

Page 55: Pascal Java

Nomes de tipos Qualificados

class Hoje1{ static public void main (String[] args) { java.util.Date hoje = new java.util.Date (); System.out.println (hoje); }}

import java.util.Date;// import java.util.*

class Hoje2{ static public void main (String[] args) { Date hoje = new Date (); System.out.println (hoje); }}

Page 56: Pascal Java

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

Page 57: Pascal Java

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.

Page 58: Pascal Java

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.

Page 59: Pascal Java

Conversão de Tipos em Java

❑ Java promove apenas tipos primitivos de menor precisão para tipos primitivos com maior precisãoint 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 valors = new Double (d).toString ();

Page 60: Pascal Java

Conversão de Tipos em Pascal

❑ Pascal promove apenas tipos numéricos de menor precisão para tipos com maior precisãovar 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úmerosvar 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 strings := Str (d);

Page 61: Pascal Java

Conversão de Tipos em Pascal e Java

❑ Program Conversao;var i, n: integer; d: real; s: string; begin i := 2; d := 3.5; Writeln ('i = ', i, ', d = ', d); d := i; Writeln ('i = ', i, ', d = ', d); { gera erro de compilação i := d; Writeln ('i = ', i, ', d = ', d); } n := 3; s := '99'; Writeln ('n = ', n, ', s = ', s); Val (s, n); Writeln ('n = ', n, ', s = ', s); Str (d, s); Writeln ('d = ', d, ', s = ', s);end.

❑ class Conversao{ static public void main (String[] args) { int i = 2; double d = 3.5; System.out.println ("i = " + i + ", d = " + d); d = i; System.out.println ("i = " + i + ", d = " + d); /* esta linha gera erro de compilação i = d; System.out.println ("i = " + i + ", d = " + d); */ int n = 3; String s = "99"; System.out.println ("n = " + n + ", s = " + s); n = Integer.valueOf (s).intValue (); System.out.println ("n = " + n + ", s = " + s); s = new Double (d).toString (); System.out.println ("d = " + d + ", s = " + s); }}

Page 62: Pascal Java

Variáveis

❑ Var nome : <tipo>;

❑ Var msg : String;

❑ As declarações de variáveis devem vir antes do bloco de comandos

❑ <tipo> nome;

❑ String msg;

❑ As declarações de variáveis podem ser feitas em qualquer lugar, inclusive dentro de um bloco de comandos

Page 63: Pascal Java

Atribuição de Variáveis

❑ Pascal utiliza o operador := para atribuir valores à variáveis

❑ i := 2;

❑ Java utiliza o operador = (não tem o sinal de dois pontos)

❑ i = 2;

❑ Posso inicializar uma variável na declaração

❑ int idade = 29;

❑ i += 2; // i = i + 2

❑ i++; // i = i + 1

Page 64: Pascal Java

Expressões

❑ Operadores aritméticos:+ - * /

❑ Funções pré-definidas:int abs round sin cos ...

❑ Operadores binários(Free Pascal, Delphi, etc):and or not xor

❑ Concatenação de Strings:+

❑ Operadores aritméticos:+ - * /

❑ Métodos estáticos da classe Math:Math.abs, Math.sin ...

❑ Operadores binários:& | ~ ^

❑ Concatenação de Strings:+

❑ Operadores de atribuição:++ -- += -= *= /=

Page 65: Pascal Java

Ponteiros e Referências

❑ Pascal nos permite utilizar alocação dinâmica de memória para criar estruturas de dados complexas

❑ O uso de alocação dinâmica pressupõe o uso de ponteiros

❑ Java fornece várias estruturas de dados dinâmicas (que não tem uma dimensão pré-fixada) mas não permite ao programador gerenciar explicitamente a memória

❑ Não utilizamos ponteiros em Java, mas utilizamos uma construção bem similar chamada de referência

Page 66: Pascal Java

Ponteiros x Referências

❑ Qualquer tipo de dados, simples ou composto, pode ter um tipo ponteiro correspondente

❑ Var pi : ^integer,i : integer;

...new (pi);pi^ := 1;i := pi^;dispose (pi);

❑ Podemos ter referências apenas para classes, nunca para tipos primitivos (por isso existe int e Integer, double e Double, etc)

❑ Integer ri;int i;...ri = new Integer (1);i = ri.intValue ();

Page 67: Pascal Java

Ponteiros x Referências

❑ Pascal define a constante nil para indicar um ponteiro que não aponta para uma área de memória válida

❑ Veja os exemplos ponteiro.pas e ponteiro2.pas

❑ Java define a constante null para indicar uma referência que não aponta para nenhum objeto

❑ Veja os exemplos Ponteiro.java e Ponteiro2.java

Page 68: Pascal Java

Gerenciamento de Memória

❑ Em Pascal, você aloca memória (new) e libera a memória (dispose)

❑ Utilizar um ponteiro antes que seja alocada memória ou depois de sua liberação são erros frequentes de programação, assim como nunca liberar a memória alocada para um ponteiro(telas azuis do Windows)

❑ Em Java, você instancia um objeto (guardando uma referência)

❑ Você nunca libera a memória; o próprio Java verifica quando não existem mais referências para um objeto e libera a memória ocupada; assim não existem erros de programação associados à gerenciamento de memória

Page 69: Pascal Java

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

Page 70: Pascal Java

Strings e Referências

❑ Você escreve em Java:

String s1 = "teste"; String s2;

s2 = s1;

❑ O compilador Java entende como:

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

s2 = new String (s1);

Page 71: Pascal Java

Referências para Outras Classes

❑ Import java.util.Date;...Date d1 = new Date ();Date d2;...d2 = d1;

❑ O código ao lado faz com que ambas as variáveis, d1 e d2, sejam referências para o mesmo objeto Date.

❑ 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

Page 72: Pascal Java

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); }}

Page 73: Pascal Java

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); }}

Page 74: Pascal Java

Data de Amanhã em Pascal

❑ Program AmanhaPas;{ cuidado pois o nome do programa e dasvariá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.

Page 75: Pascal Java

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

Page 76: Pascal Java

Escopo

❑ Pascal define os escopos global e local

❑ Local está dentro de um procedimento ou função

❑ Senão é global

❑ Java define os escopos de classe, de instância e local

❑ Local está dentro de um método ou de um bloco (chaves)

❑ Instância é o padrão

❑ Classe é indicado pela palavra-chave static

❑ Para converter programas Pascal, utilize apenas static e local

Page 77: Pascal Java

Escopo em Pascal e Java

❑ Program Escopo;var v1: integer; procedure subrotina;var v1: integer;begin v1 := 21; writeln ('v1 (local) = ', v1);end;

begin v1 := 12; subrotina; writeln ('v1 (global) = ', v1);end.

❑ class Escopo { public static int v1 = 11; public int v2;

static public void subrotina () { int v1 = 22; System.out.println ("v1 (local) = " + v1); }

static public void main (String[] args) { subrotina (); System.out.println ("v1 (global) = " + v1); Escopo obj1 = new Escopo (); obj1.v2 = 33; Escopo obj2 = new Escopo (); obj2.v2 = 33; System.out.println ("v2 (obj1) = " + obj1.v1); System.out.println ("v2 (obj2) = " + obj1.v2); }}

Page 78: Pascal Java

Visibilidade

❑ Pascal não define regras de visibilidade

❑ O Turbo Pascal define as seções de interface e implementation de uma Unit

❑ O Object Pascal (Delphi) define visibilidade para atributos de classes

❑ Mas estamos preocupados apenas com o Pascal estruturado

❑ Java define as visibilidades private, protected e public

❑ private é visível apenas dentro da classe

❑ protected é visível também em classes derivadas

❑ public é visível em qualquer classe

❑ Para converter do Pascal para Java, use public

Page 79: Pascal Java

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

Page 80: Pascal 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

Page 81: Pascal Java

Estruturas de Controle

❑ If condição Then blocoElse bloco

❑ While condição Do bloco

❑ Repeat blocoUntil condição

❑ For v := m To n Do bloco

❑ if (condição) blocoelse bloco

❑ while (condição) bloco

❑ do blocowhile (condição)

❑ for (expr1; expr2; expr3) bloco

Page 82: Pascal Java

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"); }}

Page 83: Pascal Java

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.

Page 84: Pascal Java

Exemplo de For

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

Page 85: Pascal Java

Exemplo de For em Pascal

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

Page 86: Pascal Java

Estruturas de Controle

❑ No comando If, um ; no lugar errado gera um erro de sintaxe

❑ Necessitamos das palavras-chave Them no If e Do no While e For

❑ Repeat..Until executa até que a condição seja verdadeira

❑ Um loop For conta números sequencialmente

❑ Os parênteses são parte da sintaxe dos comandos, portanto são obrigatórios

❑ Não existem palavras-chave extras nem casos especiais do ;

❑ do..while executa enquanto a condição seja verdadeira

❑ Um loop for pode não utilizar números!

Page 87: Pascal Java

Equivalênca de LoopsFor e While

❑ For i := 1 To 5 Do Begin {comandos}End;

❑ i := 1;While i <= 5 Do Begin {comandos} i := i + 1;End;

❑ No Pascal, a equivalência é apenas do For para o While, nunca no sentido inverso

❑ for (i = 1; i <= 5; i++) { //comandos}

❑ i = 1;while (i <= 5) { //comandos i ++;}

❑ Em Java, a equivalênca é nos dois sentidos: qualquer loop while pode ser transformado em um for equivalente

Page 88: Pascal Java

Exemplo: Percorrer UmaLista Encadeada

❑ p := inicio;While p <> nil Do Begin {comandos} p := p^.prox;End;

❑ Veja os exemplos Percorre*.java e percorre*.pas

❑ p = inicio;while (p != null) { //comandos p = p.prox;}

❑ for (p = inicio; p != null; p = p.prox) { // comandos}

Page 89: Pascal Java

Estruturas de Controle

❑ Case v Of v1: {comandos}; v2: {comandos}; ... Else {comandos}End;

❑ v pode ser de qualquer tipo enumerado

❑ switch (v) { v1: //comandos break; v2: //comandos break; ... default: //comandos}

❑ v pode ser de qualquer tipo primitivo

❑ O comando break é necessário!

Page 90: Pascal Java

Interrupção de Loops

❑ Condições extras no While e Repeat..Until

❑ Comando Goto no For ou If..Then

❑ Veja os exemplos break*.pas econtinue*.pas

❑ Condições extras no while, do..while e for

❑ Comando break em qualquer estrutura (while, do..while, for, switch e if)

❑ Veja os exemplos Break*.java e Continue*.Java

Page 91: Pascal 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

Page 92: Pascal Java

Exemplos de break e continue

❑ for (int i = 1; i <= 4; i++){ if (i == 2) break; System.out.println (i);}

❑ O resultado é:1

❑ for (int i = 1; i <= 4; i++){ if (i == 2) continue; System.out.println (i);}

❑ O resultado é:134

Page 93: Pascal Java

Exemplos de break e continue

❑ int i = 2;switch (i) { case 1: System.out.println ("1"); case 2: System.out.println ("2"); case 3: System.out.println ("3"); case 4: System.out.println ("4");}

❑ O resultado é:234

❑ Para que o resultado seja apenas “2”, temos que incluir um comando break em cada label

Page 94: Pascal Java

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

Page 95: Pascal Java

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

Page 96: Pascal Java

Expressões Condicionais

❑ Comparação numérica:= <> < > <= >=

❑ Comparação de Strings:= <> < > <= >=

❑ Operadores lógicos:and or not

❑ Expressões com and, not e or em geral devem utilizar parênteses

❑ Comparação de tipos primitivos:== != < > <= >=

❑ Comparação de Strings e outros objetos:.equals() .compareTo()

❑ Operadores lógicos:&& || !

❑ Os operadores && ! e || tem precedência menor, por isso não necessitamos utilizar parênteses

Page 97: Pascal Java

Expressões Condicionais

❑ If (a = 2) or (b = 3) Then ...

❑ If not (a >= 2) Then ...

❑ If s = 'teste' Then ...

❑ If s > 'abc' Then ...

❑ Veja os exemplo exprcond.pas

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

❑ if (! a >= 2) ...

❑ if (s.equals ("teste")) ...

❑ if (s.compareTo ("abc") > 0)...

❑ Veja o exemplo Exprcond.java

Page 98: Pascal 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.

Page 99: Pascal Java

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); }}

Page 100: Pascal Java

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

Page 101: Pascal 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.

Page 102: Pascal Java

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 Testeargs[0] = 1 args[0] = Esteargs[2] = 2 args[1] = éargs[3] = 3 args[2] = um

args[3] = Teste

Page 103: Pascal Java

Execício: Reescreva os exemplos Par e Contador

$ java Par 2O número 2 é par

$ Java Par 3O número 3 é ímpar

❑ Recapitule como converter Strings em números na parte 3 deste curso

$ java Contador 5contando: 1contando: 2contando: 3contando: 4contando: 5

❑ Veja alguns exemplos reescritos com a linha de comando no subdiretório “comandos”

Page 104: Pascal Java

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

Page 105: Pascal Java

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 OutErrmensagem normal do programamensagem de erro do programa$ java OutErr > saida.txtmensagem de erro do programa$ more saida.txtmensagem normal do programa

Page 106: Pascal Java

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”

Page 107: Pascal Java

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)

Page 108: Pascal Java

5. Estruturas de Dados emPascal e Java

❑ Vetores e Matrizes

❑ Registros

❑ Enumerações

❑ Estruturas encadeadas

❑ Vetores e Hashes

Page 109: Pascal Java

Tipos de Dados Compostos

❑ Pascal define vetores, enums, sets e records

❑ Pascal permite dar novos nomes a tipos existentes

❑ Os records do pascal podem ser variantes

❑ Java define apenas vetores e classes; não existem sets

❑ Não existe a declaração de tipos no Java, apenas a declaração de classes

❑ No Java não existem “classes variantes”, mas podemos definir classes derivadas e referencia-las pelo tipo da superclasse ou utilizar casts

Page 110: Pascal Java

Vetores

❑ Var v : array [0..9] of integer;

❑ V[1] := 2;

❑ Pascal define índices iniciais e finais para o array

❑ Os arrays em Pascal tem tamanho fixo. Uma vez criados, não mudam de tamanho

❑ int[] v = new int[10];

❑ v[2] = 2;

❑ Java sempre inicia o array no índice zero; você declara apenas a quantidade de elementos

❑ Um vetor em Java pode ser recriado com um tamanho diferente, mas perde o conteúdo

Page 111: Pascal Java

Matrizes

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

❑ mi[1,1] := 1;mi[1,2] := 0;mi[1,3] := 0;mi[2,1] := 0;mi[2,2] := 1;mi[2,3] := 0;mi[3,1] := 0;mi[3,2] := 0;mi[3,3] := 1;

❑ int[][] mi = new int[3][3];

❑ mi = { { 1, 0, 0 }, { 0, 1, 0 }, { 0, 0, 1 }};

❑ mi[0][0] = 1;mi[0][1] = 0;mi[0][2] = 0;mi[1][0] = 0;...

Page 112: Pascal Java

Matrizes

❑ Pascal inclui vários índices entre colchetes, separados por vírgulas

❑ Java utiliza um par de colchetes para cada índice, 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

Page 113: Pascal Java

Exemplos

❑ Compare os programas:Vetor.java e vetor.pasMatrizIdentidade.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

Page 114: Pascal Java

Registros

Type endereco = Record logradouro : string; numero : integer; complemento : string; bairro : string; cep : string;End;

❑ Veja o exemplo registro.pas

class Endereco{ public String logradouro; public int numero; public String complemento; public String bairro; public String cep;}

❑ Veja o exemplo Registro.pas

Page 115: Pascal Java

Registros

❑ Em Pascal você pode criar um tipo ou usar a sintaxe record .. end diretamente na declaração da variável

❑ Em Java você é obrigado a criar um novo tipo (uma classe)

❑ 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

Page 116: Pascal Java

Registros

Program UsaEndereco;

<declaração do record>...

Var end1 : Endereco;

Begin end1.logradouro := 'Rua Barata Ribeiro'; end1.numero := 111;End.

class UsaEndereco{ static public void main (String[] args) { Endereco end1 = new Endereco ();

end1.logradouro = "Rua Barata Ribeiro"; end1.numero = 111; }}

Page 117: Pascal Java

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

Page 118: Pascal Java

Registros e Arquivos-Fonte

❑ No Turbo Pascal ou no Delphi, você pode inserir a declaração do record em uma Unit (na seção de interface) e “usar” a unit no programa com a declaração:

uses <unit>;

❑ Normalmente, cada classe Java é declarada em um arquivo separado, mas também podemos declarar várias classes no mesmo arquivo-fonte

❑ Não é necessário fazer nada de especial para usar uma classe em outro programa (outra classe), desde que estejam no mesmo diretório

Page 119: Pascal Java

Records Variantes

Type Funcionario = Record nome : String; Case gerente: Boolean Of true: (depto : String);End;

❑ Note que o campo “gerente” é necessário para o Pascal mas poderia ser omitido na versão Java

❑ FALTA VERSAO COM UNITS!!!

class Funcionario { public String nome; public boolean gerente = false;}

class Gerente extends Funcionario { public boolean gerente = false; public String depto;}

Page 120: Pascal Java

Records Variantes

❑ Var func : Funcionario; ger : Funcionario;...func.nome := 'Fulano';func.gerente := false;

ger.nome := 'Sicrano';ger.gerente := true;ger.depto := 'Finanças';

func := ger;Writeln (func.nome);

❑ Funcionario func, ger;...func = new Funcionario ();func.nome = “Fulano”;

ger = new Gerente ();ger.nome = “Sicrano”;((Gerente)ger).depto = “Finanças”

func = ger;System.out.println ( func.nome);

Page 121: Pascal Java

Registros e Referências

❑ Em pascal, podemos ter variáveis do tipo registro e variáveis que apontam para um registro

❑ Type reg = record....Var r1 : reg,

r2 : ^reg;...new (r2);r1 := r2;

❑ Em Java, temos apenas referências para objetos de uma certa classe

❑ class Reg...Reg r1;Reg r2;...r2 = new Reg ():r1 = new Reg (r2);

Page 122: Pascal Java

Registros e Referências

❑ No Free Pascal, Delphi e etc, podemos obter o endereço de uma variável:

❑ Type reg = record....Var r1 : reg,

r2 : ^reg;...r2 := @r1;{ agora r1 e r2 apontam para o mesmo registro reg }

❑ Em Java, não precisamos do endereço de uma variável já que sempre manipulamos referências

❑ class Reg...Reg r1 = new Reg ();Reg r2;...r2 = r1;// agora r1 e r2 fazem// referência ao mesmo// objeto Reg

Page 123: Pascal Java

Enumerações

❑ Em Pascal, utilizamos enumerações para declarar constantes em grupo e para limitar a faixa de valores possíveis para uma variável

❑ Podemos atingir o mesmo intento com constantes em uma classe Java, só que é mais trabalhoso

❑ Em Java perdemos a verificação dos valores realizada pelo compilador Pascal

Page 124: Pascal Java

Enumerações

❑ Type Situacao = ( aprovado, rejeitado, emAvaliacao);...

❑ Var pedido : Situacao;...

❑ pedido := emAvaliacao;

❑ pedido := 99; { erro }

❑ class Situacao { static public final int aprovado = 1; static public final int rejeitado = 2; static public final int emAvaliacao = 3;}...

❑ int pedido;...

❑ pedido = Situacao.emAvaliacao;

❑ pedido = 99; // ok

Page 125: Pascal Java

Estruturas Encadeadas

❑ Em Pascal, utilizamos registros e ponteiros para criar uma lista encadeada ou uma árvore

❑ Type No = record texto : String; prox : ^No;end;

❑ Em Java, podemos usar classes e referências para criar as mesmas estruturas

❑ class No{ public String texto; public No prox;}

❑ Veja a série de exemplos “percorre” na parte 4

Page 126: Pascal Java

Estruturas Encadeadas

❑ Em Pascal, criamos uma série de procedimentos para inserir, localizar e excluir nós da lista

❑ Esses procedimentos recebem um ^No como parâmetro

❑ Em Java, criamos uma série de métodos para desempenhar as mesmas funções

❑ Estes métodos fazem parte da classe No, portanto não há necessidade de passar um ponteiro como parâmetro

❑ Dizemos que Java suporta diretamente o conceito de tipo abstrato de dados

Page 127: Pascal Java

Estruturas Encadeadas

❑ Em Pascal, temos que criar vários tipos “No” e vários procedimentos para armazenar informações de tipos diferentes diferentes na lista, duplicando código

❑ Em Java, podemos declarar dentro da classe um atributo do tipo Object; este atributo pode referenciar qualquer classe 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

Page 128: Pascal Java

Estruturas Encadeadas

❑ Type Pno : ^No; No : record of str : String; prox : Pno; End;

Procedure insere(str : String; var no: No)Var novo : PNo;Begin new (novo); novo^.str := str; novo^.prox := no.prox; no.prox := novo;End;

❑ class No{ public Object obj; public No prox;

static void insere (Object obj, No no) { No novo = new No (); novo.obj = obj; novo.prox = no.prox; no.prox = novo; }}

Page 129: Pascal Java

Estruturas Encadeadas

❑ Var inicio : No; no : Pno;...inicio.str := “Primeiro”;inicio.prox := nil;insere (“Segundo”, inicio);insere (“Terceiro”, inicio.prox^);

no := @inicio;While (no <> nil) Do Begin Writeln (no^.str); no := no^.prox;End;

❑ No inicio = new No ();inicio.obj = “Primeiro”;inicio.prox = null;No.insere (“Segundo”, inicio);No.insere (“Terceiro”, inicio.prox);

No no = inicio;while (no != null) { System.out.println ( (String)no); no = no.prox;}

Page 130: Pascal Java

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

Page 131: Pascal Java

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

Page 132: Pascal Java

Vetores e Hahes

import java.util.Vector;...Vector v = new Vector ();v.add (0, "Primeiro");v.add (1, "Segundo");v.add (1, "Terceiro");System.out.println (v.get (1));String s = (String)v.get (2);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

import java.util.Hashtable;...Hashtable h = new Hashtable ();h.put ("RJ", "Rio de Janeiro");h.put ("SP", "São Paulo");h.put ("MG", "Belo Horizonte");System.out.println (h.get ("SP"));String s = (String)h.get ("MG");System.out.println (s);

Page 133: Pascal Java

6. Programação Top-Down em Pascal e java

❑ Subprogramas ou subrotinas

❑ Passagem de argumentos por valor e referência

❑ Funções pré-definidas

Page 134: Pascal Java

Subprogramas

❑ Pascal define dois tipos de subprogramas: procedures e functions

❑ Procedures não tem valor de retorno, mas functions tem que retornar um valor

❑ O programa é obrigado a utilizar o valor retornado por uma funciton

❑ Java define apenas métodos, que podem ser de instância ou de classe

❑ Um método que não retorna nada é do tipo void

❑ O valor retornado por um método pode ser ignorado

Page 135: Pascal Java

Funções

Program exemplo;

Function porcento(taxa, total : real) : real;Begin porcento := (taxa * total) / 100;End;

Begin Writeln (porcento (10, 50));End.

class Porcento

{ static public double porcento (double taxa, double total) { return (taxa * total) / 100; }

static public void main (String[] args) { System.out.println (porcento (10, 50)); }}

Page 136: Pascal Java

Procedimentos

Program exemplo;

Procedure dizoi (nome : String);Begin Writeln ('Oi, ', nome);End;

Begin dizoi ('Fulano');End.

class DizOi{ static public void dizoi (String nome) { System.out.println ("Oi, " + nome); }

static public void main (String[] args) { dizoi ("Fulano"); }}

Page 137: Pascal Java

Argumentos

❑ Em Pascal, os argumentos imitam a declaração de variáveis, sendo separados por ponto-e-vírgula

❑ Pascal diferencia a passagem de argumentos por valor e por referência com a palavra-chave var

❑ Em Java, os argumentos também imitam a declaração de variáveis, mas são separados por vírgulas

❑ Java sempre passa os argumentos por valor, mas o efeito em classes é o mesmo da passagem por referência

❑ tipos primitivos valorclasses referência

Page 138: Pascal Java

Passagem de Argumentos por Referência

Program referencia;

Procedure altera (var n : String);Begin n := 'Fim';End;

Var msg : String;

Begin msg := 'Inicio'; altera (msg); Writeln (msg);End.

import java.util.Date;

class Referencia{ static public void altera (Date d) { d.setTime (d.getTime() + 24 * 60 * 60 * 1000 ); }

static public void main (String[] args) { Date hoje = new Date (); altera (hoje); System.out.println (hoje); }}

Page 139: Pascal Java

Recursividade

Program Recursividade;

Functionfatorial (n : integer) : integer;Begin If n = 0 Then fatorial := 1 Else fatorial := fatorial (n - 1) * n;End;

Begin Writeln (fatorial (5));End.

class Recursividade{ static public int fatorial (int n) { if (n == 0) return 1; else return fatorial (n - 1) * n; }

static public void main (String[] args) { System.out.println (fatorial (5)); }}

Page 140: Pascal Java

Escopo de Subprogramas

❑ Se definirmos uma Unit (Free Pascal, Delphi, etc) podemos ter subprogramas globais (seção de interface) e subprogramas visíveis apenas dentro da unit (seção de implementation) da mesma maneira que variáveis globais

❑ Os métodos estão sujeitos às mesmas regras de visibilidade que as variáveis (public, protected, private)

Page 141: Pascal Java

Funções Pré-Definidas❑ A linguagem Pascal

considera uma série de procedimentos e funções como sendo pré-definidos, por exemplo Writeln ou Abs

❑ O Free Pascal, o Delphi e etc inserem estes subprogramas na unit System e o todos os programas “usam” esta unit

❑ Java tem classes pré-definidas, como parte de um dos pacotes java.* e algumas destas classes definem métodos estáticos para funções como abs ou sin

❑ O pacote java.lang.* é sempre importado automaticamente, por isso temos String e System disponíveis em qualquer programa

Page 142: Pascal Java

Funções Numéricas

❑ Round

❑ Abs

❑ Sin, Cos, Tan, ...

❑ Rand

❑ Math.round

❑ Math.abs

❑ Math.sin, Math.cos, ...

❑ Math.random ou a classe java.util.Random

Page 143: Pascal Java

Funções Para Strings

❑ Length

❑ Substring

❑ Trim

❑ Str

❑ Val

❑ s.length onde s é uma referência para String

❑ s.substring

❑ s.trim

❑ Integer.toString, Double.toString, etc

❑ String.valueOf (int), String.valueOf (double), etc

❑ Integer.parseInt, Double.parseDouble, etc

Page 144: Pascal Java

7. Entrada e Saída emPascal e Java

❑ Arquivos

❑ Arquivos texto

❑ Serialização de objetos

❑ Arquivos binários

❑ Tratamento de erros e Excessões

Page 145: Pascal Java

Arquivos

❑ Pascal define uma série de tipos e procedimentos pré-definidos para manipulação de arquivos

❑ Esses tipos e procedimentos são parte do compilador, não podem ser definidos em Pascal

❑ Free Pascal, Delphi e etc definem units extras para manipulação de arquivos

❑ Java define uma série de classes e métodos no pacote java.io para manipulação de arquivos e outras fontes de dados

❑ Em geral essas classes são defindas em Java

❑ As classes padrão do Java atendem mesmo aos usos mais incomuns

Page 146: Pascal Java

Arquivos

❑ Tipos de dados:

❑ File of <tipo>

❑ Text

❑ Procedimentos:

❑ Assign

❑ Reset

❑ Rewrite

❑ Read / Readln

❑ Write / Writeln

❑ Close

❑ Classes:

❑ Stream

❑ Filtro

❑ Reader / Writer

❑ Temos que conjugar objetos das três classes acima para ler ou escrever de um arquivo

❑ Java não sabe o que é o EOF

Page 147: Pascal Java

Escrita Em Um Arquivo Texto

Program GravaTexto;

Var arq : Text; i : Integer;

Begin Assign (arq, 'teste.txt'); Rewrite (arq); For i := 1 To 5 Do Begin Writeln (arq, “linha ”, i); End; Close (arq);End.

class GravaTexto{ static public void main (String args[]) { PrintWriter arq = new PrintWriter (new BufferedWriter (new FileOutputStream (“teste.txt”))); for (int i = 1; i <= 5; i++) { arq.println (“linha ” + i); } arq.close (); }}

Page 148: Pascal Java

Leitura de Um Arquivo Texto

Program LeTexto;

Var arq : Text; linha : String;

Begin Assign (arq, 'teste.txt'); Reset (arq); While not EOF (arq) Do Begin Readln (arq, linha); Writeln (linha); End; Close (arq);End.

class LeTexto{ static public void main (String args[]) { BufferedReader arq = new BufferedReader (new InputStreamReader (new FileInputStream (“teste.txt”))); String linha = arq.readLine (); while (linha != null) { System.out.println (linha); linha = arq.readLine (); } arq.close (); }}

Page 149: Pascal Java

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)))

Page 150: Pascal Java

... 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, ...

Page 151: Pascal Java

Escrita Em Um Arquivo Binário

Program GravaNumeros;

Var arq : File Of Integer; i : Integer;

Begin Assign (arq, 'teste.dat'); Rewrite (arq); For i := 1 To 5 Do Begin Write (arq, i); End; Close (arq);End.

class GravaNumeros{ static public void main (String args[]) { ObjectOutputStream arq = new ObjectOutputStream (new FileOutputStream (“teste.dat”)); for (int i = 1; i <= 5; i++) { arq.writeObject (new Integer (i)); } arq.close (); }}

Page 152: Pascal Java

Leitura de Um Arquivo Binário

Program LeNumeros;

Var arq : File Of Integer; numero : Integer; i : Integer;

Begin Assign (arq, 'teste.dat'); Reset (arq); For i := 1 To 5 Do Begin Read (arq, numero); Writeln (numero); End; Close (arq);End.

class LeNumeros{ static public void main (String args[]) { ObjectInputStream arq = new ObjectInputStream (new FileInputStream (“teste.dat”)); for (int i = 1; i <= 5; i++) { numero = (Integer)arq.readObject (); System.out.println (numero); } arq.close (); }}

Page 153: Pascal Java

Completando Os Exemplos

❑ Os exemplos de leitura e escrita de arquivos em Java não compilam, mas o compilador irá gerar erros do tipo:

❑ LeNumeros.java:9: unreported exception java.io.FileNotFoundException; must be caught or declared to be thrown

❑ Para compilar, temos que adicionar uma estrutura try..catch:

❑ static public voidmain (String args[]){ try { ... // código para ler/gravar ... catch (Exception e) { System.err.println (e.getMessage ()); }}

Page 154: Pascal Java

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

Page 155: Pascal Java

Excessões

❑ Você pode “jogar a exceção para cima” (throws) em vez de trata-la; mas o método main não pode deixar de tratar as excessões geradas pelos métodos chamados por ele

❑ static public void leArquivo ()throws Exception{ ... // código de leitura}

static public voidmain (String args[]){ try { leArquivo (); } catch (Exception e) { System.err.println (e.getMessage ()); }}

Page 156: Pascal Java

Excessões

❑ Existem várias classes derivadas de Exception, de modo que o programa pode reagir de forma diferente a cada tipo de erro

❑ Sempre especifique os comandos catch da excessão mais específica para a exceção mais genérica

❑ try { ...}catch (FileNotFoundException e) { ...}catch (IOException e) { ...}catch (Exception e) { ...}

Page 157: Pascal Java

Lendo do Teclado

❑ Em Pascal, basta utilizar os procedimentos Read ou ReadLn sem especificar um aquivo como parâmetro

❑ O Pascal converte automaticamente os tipos de dados

❑ Em Java, temos que criar objetos Reader e Filter sobre o InputStream System.in

❑ Temos que ler Strings e converte-las nos tipos corretos

❑ BufferedReader teclado = new BufferedReader (new InputStreamReader ( System.in));String linha = in.readLine ();

Page 158: Pascal Java

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...

Page 159: Pascal Java

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

Page 160: Pascal Java

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

Page 161: Pascal Java

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

Page 162: Pascal Java

Outras Referências

❑ Aprenda Java em 21 dias

❑ Core Java, Volumes I e II