Programação Orientada por Objectos had, jvo Tutorial 1: Familiarização com o JDK, Eclipse e Mooshak Tutorial 1A: Java a partir da linha de comandos 0. Verificar se a máquina virtual e o compilador estão instalados e acessíveis em qualquer ponto da árvore do directório. 0.1. Windows: A partir do menu Start -> Run, escreva cmd e pressione <enter> de modo a abrir a linha de comandos. Linux: Numa consola em modo de texto ou abrindo uma consola virtual ou xterm no ambiente gráfico. 0.2. Na linha de comandos escreva: javac -version Se o compilador estiver instalado e acessível será mostrada a sua versão e um resumo dos parâmetros do compilador, como por exemplo: javac <current javac version> javac: no source files Usage: javac <options> <source files> where possible options include: -g Generate all debugging info (...) 0.3. Agora, na mesma linha de comandos escreva: java -version Se a máquina virtual (JVM) de Java estiver instalada e acessível será mostrada a sua versão: java version "<current java version>" Java(TM) SE Runtime Environment (build …) Java HotSpot(TM) 64-Bit Server VM (build …, mixed mode) 0.4. Se as versões do compilador e da JVM (“Java Virtual Machine”) forem apresentadas o JAVA SDK (JDK) está instalado podendo ser desenvolvidas e executadas aplicações JAVA. Se Não forem apresentadas deve-se verificar se a instalação foi efectuada. Para isso procurar o jdk em: 0.4.1. C:\Program Files\Java\ (Windows) /opt/ (Linux) Se o directório do jdk existir verificar se o compilador e JVM estão presentes: C:\Program Files\Java\jdk<version>\bin\java C:\Program Files\Java\jdk<version>\bin\javac (Windows) /opt/jdk<version>/bin/java /opt/jdk<version>/bin/javac (Linux) http://w3.ualg.pt/~jvo/poo POO Tutorial 1 - 1 Programação Orientada por Objectos had, jvo Se estiverem é apenas necessário indicar no caminho de busca estas ferramentas, tal como indicado no ponto 0.4.2. Se não existirem é necessário instalar primeiro o JDK. O ficheiro de instalação para Windows ou Linux pode ser obtido no site da Oracle, em: http://www.oracle.com/technetwork/java/javase/downloads/index.html Após efetuado o download executar o ficheiro de instalação. Em sistemas Linux poderá também estar disponível através do gestor de pacotes de instalação, o instalador do JDK, embora possa ser uma versão não tão atualizada como a obtida no site da Oracle. Em sistemas baseados no Debian (Debian, ubuntu, etc.) a instalação pode ser efetuada na linha de comandos com: apt-get install openjdk-6-jdk apt-get install openjdk-7-jdk apt-get install oracle-java7-installer 0.4.2. (JDK livre) (JDK oracle) Após a instalação poderá ser necessário indicar no caminho de busca as ferramentas da linha de comandos. Para isso em Windows sobre o ícone My Computer clicar com o botão esquerdo, ou de contexto, e escolher properties: Editar a variável de ambiente path, de modo a acrescentar ao caminho de busca já existente um ponto e vírgula e o caminho para o directório com as ferramentas do SDK: ; C:\Program Files\Java\jdk<version>\bin\ http://w3.ualg.pt/~jvo/poo POO Tutorial 1 - 2 Programação Orientada por Objectos had, jvo É necessário abrir uma nova linha de comandos para que seja atualizado o caminho de busca e verificar se o compilador e a JVM já estão acessíveis escrevendo o seu nome na linha de comandos, como indicado em 0.2 e 0.3. Em Linux pode-se adicionar o caminho de busca ao ficheiro de perfil do sistema: /etc/profile No final deste ficheiro adicionar a linha seguinte e gravar: export PATH = $PATH;/opt/jdk<versio>/bin Este ficheiro é executado sempre que o sistema inicializa. Para evitar inicializar o sistema apenas para atualizar o caminho de busca, podemos executar o ficheiro com perfil do sistema (que é um script da shaell) na linha de comandos com: . /etc/profile Nota: Repare-se que é necessário escrever um ponto final “.” antes do nome do ficheiro para que este seja executado Agora verificar se o compilador e a JVM já estão acessíveis escrevendo o seu nome na linha de comandos, como indicado em 0.2 e 0.3. http://w3.ualg.pt/~jvo/poo POO Tutorial 1 - 3 Programação Orientada por Objectos had, jvo 1. Java Hello World Normalmente o primeiro programa que se apresenta numa dada linguagem de programação apenas imprime uma frase no ecrã (o famoso Hello world). Abaixo encontra-se uma versão para Java: // Ficheiro: HelloWorld.java public class HelloWorld { public static void main(String[] args) { System.out.println("Hello world!"); } } Repare-se que o ponto de entrada no programa, a função main ( ), ao contrário da linguagem C/C++, tem de estar dentro de uma classe pública. O ficheiro com o código fonte deve ter o mesmo nome desta classe, com extensão .java. A função ou método void main (stirng args[]) deverá ser público para que possa ser acedido de fora da classe e estático para que seja acessível mesmo sem que a classe seja instanciada. Esta função não retorna nada, tendo, por isso, void como tipo de retorno. Como argumentos têm-se um array de Strings onde se pode aceder aos parâmetros da linha de comandos. 1.1. Criar um directório na área de utilizador, por exemplo: …\poo\HelloJava ~/poo/HelloJava 1.2. Abrir um editor de texto, como por exemplo o Notepad, Notepad++, GEdit e escrever o código acima e guardar com o nome: HelloWorld.java no directório já criado. 1.3. Na linha de comandos compilar com: javac HelloWorld.java é criado o ficheiro HelloWorld.class, com código adequado a ser interpretado pela JVM. 1.4. Para executar, na linha de comandos basta invocar a JVM indicando o ficheiro *.class que se pretende executar sem extensão: java HelloWorld Deve ser apresentado na linha de comandos a frase: Hello world! Nota: Mesmo na linha de comandos, ao invocar a JVM, devem ser respeitadas as letras maiúsculas e minúsculas no nome da classe a executar. http://w3.ualg.pt/~jvo/poo POO Tutorial 1 - 4 Programação Orientada por Objectos had, jvo 2. Distância entre 2 pontos no 1º quadrante Pretende-se desenvolver um editor gráfico em que seja possível escolher dois pontos e calcular a distância entre eles. Vamos admitir que neste editor os pontos têm coordenadas exclusivamente inteiras positivas, como na figura seguinte: Se os pontos A e B tiverem de coordenadas (xA, yA) e (xB, yB) respetivamente, a distância d entre eles é dada por: d = ( x A − xB ) 2 + ( y A − y B ) 2 Vamos começar por implementar a classe Point, que permite implementar a funcionalidade básica indicada acima. Para isso: 2.1. Criar um diretório na área de utilizador, por exemplo ..\poo\EditorGrafico em Windows e ~/ poo/EditorGrafico em Linux. 2.2. Escrever o código da classe Point, e gravar no ficheiro Point.java no directório criado no ponto anterior: // File: Point.java class Point { private int _x_, _y_; public Point(int x, int y) { setX(x); setY(y); } public int getX() { return _x_; } public int getY() { return _y_; } public void setX(int x) { assert x>0; _x_ = x; } public void setY(int y) { assert y>0; _y_ = y; } public double dist (Point p) { int dx = getX() - p.getX(); int dy = getY() - p.getY(); return Math.sqrt(dx*dx + dy*dy); } }; 2.3. Escrever o código do cliente, e gravar no ficheiro Client.java no mesmo directório: public class Client { public static void main (String[] args) { Point A = new Point(1,1); Point B = new Point(4,2); System.out.println("Distância AB = " + A.dist(B)); } } http://w3.ualg.pt/~jvo/poo POO Tutorial 1 - 5 Programação Orientada por Objectos had, jvo 2.4. Navegando para o directório onde estão os ficheiros fonte, compilar a Classe Point e a classe Client: javac Point.java javac Client.java ou apenas: javac *.java de qualquer forma resultam os ficheiro compilados: Point.class Client.class 2.5. Para executar a aplicação, na linha de comandos, deve ser invocada a JVM para executar a classe que contém o método main (): java Client Deve ser apresentado na linha de comandos a distância entre os dois pontos. http://w3.ualg.pt/~jvo/poo POO Tutorial 1 - 6 Programação Orientada por Objectos had, jvo Tutorial 1B: Breve tutorial sobre o Eclipse O Eclipse encontra-se instalado nos PCs da sala C1 1.53 tanto em Windows como em Linux. Em Windows deverá existir um atalho no ambiente de trabalho, semelhante a: Se não existir o atalho, o executável do Eclipse tipicamente encontra-se em: C:\Eclipse\eclipse.exe ou C:\Program Files\Eclipse\eclipse.exe Em Linux pode aceder-se ao Eclipse a partir do ambiente gráfico Gnome no menu Applications sub-menu Programming ou development ou iniciá-lo correndo o executável eclipse que se encontra no diretório de instalação. 0. Instalação do IDE Eclipse Caso pretenda instalar o Eclipse no seu computador: 0.1. O Eclipse necessita que o JDK esteja previamente instalado como indicado na primeira parte deste tutorial, no ponto 0.4. 0.2. Para instalação do eclipse deve ser efetuado o download do ficheiro de instalação de: http://www.eclipse.org/downloads/ Existem várias versões. Para POO recomenda-se a instalação do Eclipse IDE for Java Developers A instalação é simples, consiste apenas em descompactar o ficheiro de instalação para um diretório. O executável do eclipse ficará na raiz desse diretório com o nome eclipse.exe no Windows ou apenas eclipse em Linux. Opcionalmente pode ser criado um atalho para o IDE no ambiente de trabalho. Em sistemas Linux poderá também estar disponível através do gestor de pacotes de instalação, o instalador do Eclipse, embora possa ser uma versão não tão atualizada como a obtida no site do Eclipse indicado acima. Em sistemas baseados no Debian (Debian, ubuntu, etc.) a instalação pode ser efetuada na linha de comandos, com: apt-get install eclipse http://w3.ualg.pt/~jvo/poo POO Tutorial 1 - 7 Programação Orientada por Objectos had, jvo 1. Execução do IDE Eclipse 1.1. Ao se executar o Eclipse é perguntado qual o WorkSpace que o utilizador pretende. Este consiste na raiz de uma árvore de directórios onde serão guardadas as aplicações desenvolvidas com este IDE. Deve ser escolhido um directório na área de utilizador, por exemplo: y:\disk1\WorkSpace. Na janela pode ser colocado uma marca para evitar que esta pergunta se faça sempre que o IDE inicia: Pode-se verificar que no directório y:\disk1\WorkSpace, foi criado o sub-directório .metada. Posteriormente o WorkSpace pode ser alterado a partir do menu window->preferences, alterando as preferências do item: General Workspace StartUp and ShutDown Prompt for WorkSpace on StartUp 1.2. Ao executar-se o Eclipse surge um ecrã de boas-vindas que permite aceder a alguns tutorais sobre o ambiente, como por exemplo, criar um projecto simples, ou desenvolver aplicações com GUI (graphical user interface). Este ecrã pode ser acedido também a partir do menu: Help -> Welcome Ajuda para o IDE e para o Visual Editor (se instalado) pode ser acedida também em: Help -> Help contents http://w3.ualg.pt/~jvo/poo POO Tutorial 1 - 8 Programação Orientada por Objectos had, jvo 2. Java Hello World no Eclipse 2.1. Executar o IDE eclipse e criar um novo projecto a partir do menu: File -> New -> Project Na janela que se abre escolher Java Project e pressionar o botão next. Na janela seguinte escrever o nome do projecto: HelloWorld e pressionar o botão Finish. Repare que no WorkSpace foi criado um directório com o nome do projecto HelloWorld, e dois ficheiros que descrevem o projecto: .classpath e .project, e portanto não devem ser apagados nem modificados directamente. 2.2. Na zona esquerda do IDE a Janela PackageExplorer têm uma entrada com o nome do projecto criado. O IDE suporta alguns templates para o código fonte, de modo a poupar ao programador que repita o mesmo código sempre que deseja criar um novo módulo do programa. Assim, como o método main () deve estar dentro de uma classe, clicando no nome do projecto no PackageEditor e escolhendo File -> new -> class abre-se uma janela que permite criar o código base de uma dada classe. No nome da classe colocar: HelloWorld e colocar uma marca em: public static void main (String[] args) uma marca de modo que este método seja criado com o corpo vazio. http://w3.ualg.pt/~jvo/poo POO Tutorial 1 - 9 Programação Orientada por Objectos had, jvo Após pressionar Finish é criado no directório de projecto o ficheiro HelloWorld.java, sendo também apresentado no centro do IDE: public class HelloWorld { /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub } } 2.3. Repare-se que o corpo do método main () tem um comentário: //TODO ..., indicando onde deve ser escrito o código. Para terminar o código basta substituir esta linha por: System.out.println("Hello world!"); 2.4. Aproveite para gravar com File -> save ou File -> Save all, ou apenas ctrl <S>. 2.5. Para compilar e executar a partir do menu: Run -> Run as -> Java Application http://w3.ualg.pt/~jvo/poo POO Tutorial 1 - 10 Programação Orientada por Objectos had, jvo Na parte inferior do IDE, na consola aparece a saída do programa, neste caso a frase: HelloWorld. Em caso de erro, na mesma posição do IDE no TAB problems surge a descrição do erro e das linhas onde ocorreu. 3. Distância entre 2 pontos no 1º quadrante no Eclipse Vamos agora implementar o código para a distância entre dois pontos já apresentado na primeira parte deste tutorial no Eclipse: 3.1. No IDE eclipse e criar um novo projecto a partir do menu: File -> New -> Project Na janela que se abre escolher Java Project e pressionar o botão next. Na janela seguinte escrever o nome do projecto: GraphEditor e pressionar o botão Finish. No WorkSpace é criado o directório do projecto: GraphEditor. 3.2. No PackageExplorer clicar no nome do projecto e escolher File -> new -> class abre-se uma janela onde basta dar o nome da classe em Name: Point e pressionar Finish. 3.3. Repetir o ponto anterior para criar a classe Client. No PackageExplorer, à esquerda no IDE, aparecem agora referências a ambos os ficheiros do projecto. 3.4. Clicando no nome de qualquer classe no PackageEditor abre um editor de texto para cada ficheiro. Copie o código fonte apresentado na primeira parte deste tutorial para os ficheiros respetivos. Após ter sido copiado o código, grave com File -> Save all. 3.5. Para compilar e executar, seleccionar no PackageEditor o nome da classe, ou do ficheiro, que contém o método main(), e a partir do menu: Run -> Run as -> Java Application Em baixo no IDE, na consola aparece a distância entre os dois pontos: http://w3.ualg.pt/~jvo/poo POO Tutorial 1 - 11 Programação Orientada por Objectos had, jvo Distância AB = 3.1622776601683795 http://w3.ualg.pt/~jvo/poo POO Tutorial 1 - 12 Programação Orientada por Objectos had, jvo Tutorial 1C: Breve tutorial sobre o Mooshak 0. Vamos agora usar o Mooshak para verificar a correção de um programa que corresponde a uma nova versão do problema da distância entre dois pontos apresentado anteriormente. O problema a resolver é apresentado no fim deste tutorial, em anexo. 0.1. Antes de mais inscreva-se num turno e num grupo. Use o link disponível na tutoria eletrónica ou http://www.deei.fct.ualg.pt/POO/Entregas 0.2. Depois, aceda ao mooshak através http://mooshak.deei.fct.ualg.pt/~mooshak 0.3. 0.4. do link da tutória ou Para obter User/Password clique em Register [for On-line Contest] 0.3.1. Em Contest, selecione POO 2015/16 0.3.2. Em Group, selecione a sua turma Em Name, escreva POO1516t<i>G<j> onde <i> é a sua turma prática (A ou B) e <j> é o seu número de grupo, usando os dados fornecidos em http://www.deei.fct.ualg.pt/POO/Entregas. 0.4.1. Em Email, escreva o endereço de correio eletrónico de um dos elementos do grupo para onde será enviada a password. 0.5. Depois de efetuado o login, pode escolher, entre outras coisas, o seguinte: 0.5.1. Problema – Escolha A – Tutorial 1 0.5.2. Visualizar (View) – lista o enunciado do problema selecionado 0.5.3. Perguntar (Ask) – coloque aqui as suas questões sobre o problema selecionado 0.5.4. Escolher ficheiro … Submeter (Submit) – permite fazer o upload do ficheiro com o código java. Neste momento, vamos submeter sempre um único ficheiro de código. 0.5.5. Depois de devidamente testado, faça o upload do seu ficheiro .java submetendo-o. 0.5.6. Aguarde pela resposta do Mooshak e veja no Help o seu significado, se necessário. Alguns aspetos práticos (Extraídos de http://ctp.di.fct.unl.pt/~amd/cpn/2007tiup/etapa5/praticos.html) <quote> Dados de entrada Os dados de entrada, usados para testar as soluções, são lidos da entrada padrão. Consistem em texto cuidadosamente formatado para ser simples de processar: • Normalmente, nas primeiras linhas dos dados de entrada surgem alguns números inteiros que anunciam o tamanho das diversas partes do texto que se segue. Isso evita a necessidade de testar a condição de "fim-de-ficheiro", durante a leitura dos dados. • A última linha do ficheiro está sempre devidamente terminada por uma mudança de linha. • Espaços em branco, quando usados, são sempre considerados como separadores. Os espaços em branco nunca ocorrem em grupos. Uma linha nunca começa com um espaço em branco. Uma linha nunca acaba com um espaço em branco. http://w3.ualg.pt/~jvo/poo POO Tutorial 1 - 13 Programação Orientada por Objectos had, jvo Note que as linhas com números inteiros que ocorrem no início dos dados de entrada devem ser consumidas bem até ao fim para evitar desalinhamentos na leitura dos dados subsequentes. Eis como isso se faz em Java: import java.util.* ; Scanner sc = new Scanner(System.in); /* Aviso: nunca crie mais do que um Scanner sobre o input. */ int n = sc.nextInt(); sc.nextLine(); /* Salta a mudança de linha. */ • Supondo que os dados se iniciam por uma linha contendo dois inteiros separados por um espaço em branco: import java.util.* ; Scanner sc = new Scanner(System.in); int n = sc.nextInt(); int m = sc.nextInt(); sc.nextLine(); /* Salta a mudança de linha. */ Dados de saída Os dados de saída, produzidos pelos programas submetidos aos mooshak, são escritos na saída padrão. É necessário respeitar rigorosamente o formato exigido no enunciado. Qualquer desacerto, mesmo ligeiro, é suficiente para que um programa seja classificado como "Presentation error". Note que não é possível detectar visualmente certas anomalias nos dados de saída. Por exemplo: um espaço em branco no final duma linha, uma linha em branco no final dos dados, a omissão da mudança de linha na última linha dos dados. Todas estas situações são inaceitáveis e provocam um "Presentation error". </quote> http://w3.ualg.pt/~jvo/poo POO Tutorial 1 - 14 Programação Orientada por Objectos had, jvo Submissão ao Mooshak Para submissão ao Mooshak temos duas hipóteses ou submetemos um único ficheiro .java ou um ficheiro compactado .zip ou .gz Hipótese ficheiro .java: o programa completo é integralmente incluído num único ficheiro de extensão .java; é esse ficheiro que é submetido ao mooshak. O conteúdo possível de desses ficheiros é: 1. opcionalmente, uma diretiva package; 2. zero ou mais diretivas import; 3. uma ou mais definições de classes, sendo que uma e só será pública e terá o mesmo nome do ficheiro. Hipótese ficheiro compactado: Compacte o diretório raiz do código fonte src (e todos os subdiretorios) num arquivo .zip ou .gz; é esse ficheiro que é submetido ao mooshak. Por defeito, o diretório raiz está em Workspace, num subdirectório com o nome do projeto: …/<Workspace>/<Nome projeto>/src Avisos do Compilador Alguns compiladores geram avisos (warnings) quando encontram caracteres que não conseguem identificar, mesmo nos comentários. Isto sucede com caracteres acentuados como os portugueses (por vezes pode ser apenas uma questão de codepage diferente entre o sistema onde foi escrito o código e o sistema onde é compilado). O Mooshak pode estar configurado para abortar a compilação não só quando o compilador encontra erros no código mas também quando o compilador gera avisos, sendo indicado “Compilation error”. Por isso recomenda-se que se evite a utilização no código fonte de caracteres acentuados mesmo nos comentários (no caso geral caracteres cujo código ASCII é superior a 127). http://w3.ualg.pt/~jvo/poo POO Tutorial 1 - 15 Programação Orientada por Objectos had, jvo Anexo: Distância inteira entre dois pontos Desenvolva um programa que, dados dois pontos, calcule a parte inteira da distância entre eles. Os pontos têm coordenadas exclusivamente inteiras positivas, como na figura seguinte. Se os pontos A e B tiverem de coordenadas (xA, yA) e (xB, yB) respetivamente, a distância d entre eles é dada por d = ( x A − xB ) 2 + ( y A − y B ) 2 Entrada A entrada é composta por duas linhas. A primeira linha contem dois inteiros, XA, YA, representado as coordenadas do ponto A, 0 <= XA <= 1000, 0 <= YA <= 1000. A segunda linha é em tudo idêntica à primeira, representando as coordenadas do ponto B. Saída A saída tem uma única linha, que contém a parte inteira da distância entre os dois pontos dados. Exemplo de Entrada 11 42 Exemplo de Saída 3 http://w3.ualg.pt/~jvo/poo POO Tutorial 1 - 16