Introdução à Programação em Java
Introdução à Programação em Java
Fascículo TP
Programação Orientada a Objetos
(Linguagem Java)
AymenFerjani
[Link]@[Link]
TP5: Impl´
implementação de interfaces e gestão de exceções 18
Fascículo TP Departamento de Informática
et T´el´ecoms
Programação Orientada a ObjetosNível: 2eme
`
SEIoT/IRS
1 Notions de cours
1.1 Compilação e execução de um programa Java
Antes de começar a escrever código Java, é necessário instalar um JDK (Java Development Kit).
kit de desenvolvimento) a fim de poder compilar e executar nosso código.
A escrita de um código fonte Java deve ser feita em um arquivo com a extensão .java.
a compilação deste último gerará outro arquivo com a extensão .classet que contém
pseudo-código. É este arquivo que é interpretado e executado pela máquina virtual Java (JVM).
A JVM é uma parte integrante do JDK.
A compilação e a execução de um arquivo Java podem ser feitas de duas maneiras diferentes,
seja com um IDE (Ambiente de Desenvolvimento Integrado), ou com um console.
Um arquivo fonte Java contém uma ou mais classes, mas apenas uma classe declarada.
publique. O nome do arquivo deve corresponder ao nome desta classe.
— Se o projeto desenvolvido é composto por um único arquivo, então este último deve necessariamente conter
a metodologia principal.
— Na programação procedural, os métodos são vistos como funções.
— O método principal deve sempre ter a seguinte assinatura:
Tipo Signification
caractere Caractere
booleano Bool´een
Observação
Existem também os tipos byte, short e long que são tipos inteiros.
— Também encontramos o tipo float que representa um real.
— Para as cadeias de caracteres, é preferível usar a classe String (que não é um
tipo primitivo).
int[]tab={20,-9,13,100,5};
// percorre e exibe cada elemento do array tab
para(intx: tab) {
[Link](x);
}
public classExempleSaisie{
public static void main(String[] args) {
String cadeia;
inteiro
duplamente;
// Cr´eation d'un objet Scanner
Scanner lectureClavier=new Scanner([Link]);
public classTest{
public static void main(String[] args) {
[Link]("O primeiro argumento é " + args[0]);
[Link]("O segundo argumento é " + args[1]);
[Link]("O terceiro argumento é " + args[2]);
}
}
2 Exercícios práticos
Para cada exercício, um novo projeto será criado.
Exercice 1
Criar a classe Hello com o seguinte código e, em seguida, testá-la:
public classHello{
public static void main(String[] args) {
[Link]("Olá a todos");
}
}
Exercício 2
Cr´eer la classeEx2, puis :
´
1. Escrever o método public int adição(int x, int y, int z) que retorna a soma de 3
entiersx,yetz.
2. Adicionar o método public int max(int x, int y, int z) que retorna o máximo entre
3 inteiros x, y, z.
3. Adicionar o método público booleano primo(int x) que verifica se x é um número primo
primeiro ou não.
4. Testar esses 3 métodos assim:
importar [Link];
classe pública Ex2{
//Definições dos métodos das questões 1, 2 e 3
...
public static void main(String[] args) {
Scanner saisie=new Scanner([Link]);
inta, b, c;
[Link]("Dê 3 inteiros: ");
a=[Link]();
b=[Link]();
c=[Link]();
Ex2 obj=newEx2();//Criação duma instância da classe Ex2
[Link](a+"+"+b+"+"+c+"="+[Link](a, b, c));
[Link]("O máximo dos 3 inteiros é " + [Link](a, b, c));
se([Link](a)) {
[Link](a+" é um número primo");
}
senão{
[Link](a + " nnão é um número primo);
}
}
}
Exercício 3
Écrire un programme qui calcule et affiche la somme et le produit de 4 entiers pass´es en
argumentos.
Pour chaque argument, utiliser la m´ethode pr´ed´efi[Link](x)pour obtenir un
entier a partir de cet argument.
Exercício 4
´
Escrever um programa que permita ler um inteiro positivo introduzido na linha de comando
e exibi-lo na forma binária.
— Entrada de valores.
— Passagem de valores em linha de comando (argumentos).
— Utilização de estruturas condicionais e iterativas.
Manipulação de tabelas.
1 Noções de curso
1.1 Criação e manipulação de um array de tamanho fixo
A criação de um array de tamanho fixo é feita pela seguinte instrução:
type[]nomTableau=newtype[NombreElements];
Aqui, "tipo" designa um tipo básico ou uma classe. Aqui está um exemplo:
1.2 Exemple
// Criação e inicialização de um array de 4 reais
double[]tab={12.0,2.6,0.5,100.11};
2 Exercices pratiques
Exercice 1
Écrire la classeAnn´eeavec une m´ethode qui permet de d´eterminer si une ann´ee est bissextile
ou não. Um ano é bissexto se tivermos um dos dois casos a seguir:
— O ano é divisível por 4 e não é divisível por 100.
— O ano é divisível por 400.
Exercício 2
Éscrever a classeDiaDaSemana com um método que, a partir de um inteiro representando um
jour de la semaine (entre 1 et 7), affiche le nom correspondant de ce jour.
Exemplos:
jour = 1 =>Affichage : ”C’est lundi”
jour = 2 =>Affichage : ”C’est mardi”
Exercício 3
Éscrever um programa que leia 2 argumentos que são um número inteiro positivo (denotado por n) e
uma cadeia de caracteres, então exibe essa cadeia n vezes (em linhas diferentes).
Por exemplo, se o usuário passar como argumentos "5" e "Olá", teremos a exibição seguinte
vant:
Bom dia1vez
Bonjour2fois
Bonjour3fois
Bonjour4fois
Bonjour5fois
Exercício 4
Éscreva a classe Perfeita com um método que recebe um inteiro positivo e indica se este último
é um número perfeito ou não. Um número perfeito é igual à soma de seus divisores próprios
(exceto ele mesmo).
Exemplos de números perfeitos:
6=1+2+3
28 = 1 + 2 + 4 + 7 + 14
496 = 1 + 2 + 4 + 8 + 16 + 31 + 62 + 124 + 248
Exercício 5
Écrire un programme qui calcule et affiche la somme des entiers pass´es en argument.
Exercício 6
Éscrever a classe Par que possui 2 métodos. O primeiro permite preencher um array de inteiros.
A segunda exibe os elementos pares de um array de inteiros.
importar [Link];
classe pública Par
public void preencherTab(int[] t)
{/* preencher t com inteiros inseridos */}
publicvoidaffichagePair(int[]t)
{/* exibir os elementos pares de t */}
Exercice 7
Éscrever a classe Tabayant com 3 métodos. O primeiro permite criar um array de inteiros de
taillen(`a saisir) e de le remplir. A segunda exibe os elementos de um array de inteiros. A
terceiro retorna o elemento mais alto de um array de inteiros.
importar [Link];
public classTab{
public staticint[]cr´eationTableau() {
/* 1. introduzir o tamanho do array, criação do array
[Link] le tableau`a partir d'entiers saisis
[Link] este quadro */}
Exercício 8
Éscrever um programa que cria e preenche um array de reais a partir dos argumentos, então
inverta esta tabela e exiba esses elementos.
Exercice 9
Éscrever um programa que captura e preenche um array de strings, depois captura
uma cadeia e indica se essa cadeia se encontra no array. No caso de a cadeia existir,
o programa também deverá exibir sua posição na tabela.
Nota: Use o método [Link](cadeia) para comparar entre duas cadeias.
Exemplos:
Exercício 10
Éscrever um programa que permite inserir e preencher os elementos de um array
d inteiros, depois realiza a ordenação por seleção em ordem crescente neste array, e por fim exibe
o quadro.
Príncipe :
Para cada elemento tab[i], determinar o índice do menor elemento à direita de tab[i]
(menor que tab[i]), então permutertab[i] e tab[min]. Se não encontrarmos um elemento mais
pequeno quetab[i], então nenhuma permutação é realizada.
Objetivos
1 Exercícios práticos
Exercício 1
Deseja-se modelar um ponto em um plano com um sistema de coordenadas ortonormal.
´
1. Escrever a classe Ponto contendo os atributos necessários assim como um construtor recebendo
parâmetros.
2. Adicionar outro construtor sem parâmetros que inicializa um ponto na posição (0,0).
3. Para cada atributo, adicione um método acessor (get) para retornar o valor de
o atributo, e um método mutador (set) para modificar o valor do atributo.
4. Adicionar o método public void modificarCoord(double x, double y) que
permite modificar as coordenadas de um ponto.
´
5. Escreva o método público booleano mesmaPosição(Ponto p) que verifica se um ponto tem as
mês coordenadas que o ponto p.
´
6. Escrever o método público booleano éSimétrico(Point p) que verifica se um ponto é
simétrico ao ponto p em relação à origem do referencial (0,0).
7. Adicionar o método público double distancia(Point p) que permite calcular e
retourner la distance entre un point et le point p selon la formule suivante:
(x−xp )2+ (y−yp )2
p
Utilizar os métodos pré-definidos [Link](x, 2) para calcular o quadrado de um x e [Link](x)
para a raiz quadrada de um x.
8. No mesmo pacote, crie a classe TestPoint contendo o método main para
tester les m´ethodes de la classePoint:
classe pública TestPoint
{
public static void main(String[] args)
{
Ponto p1=newPoint(5,3);
Ponto p2 = novoPonto();
[Link]("p1("+[Link]()+","+[Link]()+")");
[Link]("p2("+[Link]()+","+[Link]()+")");
[Link](5,10);
[Link]("p2("+[Link]()+","+[Link]()+")");
se()
[Link]("p1 e p2 n")não têm a mesma posição);
Ponto p3=newPoint(-5,-3);
[Link]("p3("+[Link]()+","+[Link]()+")");
se([Link](p3))
[Link]("p1 e p3 são simétricos");
[Link]("A distância entre p1 e p2 é " + [Link](p2));
}
}
Exercício 2
Deseja-se modelar uma data caracterizada por um dia, um mês e um ano.
´
1. Escrever a classe Data com os atributos necessários, bem como um construtor que
inicializar uma data.
2. Para cada atributo, adicione um método acessor (get) para retornar o valor de
o atributo, e um método mutador (set) para modificar o valor do atributo.
3. Redefinir o método público String toString() que retorna uma data na forma:
dia/mês/ano
4. Adicionar o método privado booleano anoBissexto() que verifica se o ano de uma data
é bissexto ou não. Um ano é bissexto nas seguintes situações:
— Ela é divisível por 4 e não por 100.
— Ela é divisível por 400.
5. Adicionar o método privado int numeroDiasDoMes() que retorna o número de dias
du mois (exemple: mois = 1⇒nombre de jours = 31). Utiliser la m´ethode pr´ec´edente.
´
6. Escrever o método público booleano estValide() permitindo verificar se uma data é
correto ou não. Usar o método anterior.
7. Adicionar o método público booleano maisRecente(Data d) que indica se uma data é
mais recente do que a data d.
8. No mesmo pacote, crie a classe TestDate contendo o método main a fim de testar
os métodos da classe Data:
public class TestDate
{
público estático vazio principal(String[] args)
{
Date d1=newDate(28,2,2018);
se([Link]())
[Link](d1+" é válido");
Data d2=new Date(30,2,2017);
if(![Link]())
[Link](d2+" n'não é válido);
Data d3=newDate(17,10,2020);
se([Link](d1))
[Link](d3 + " é mais recente do que " + d1);
}
}
Exercice 3
Desejamos modelar uma pilha de inteiros armazenada sob a forma de um array.
1. Definir a classePilha tendo como atributos um inteiro tamanho (o tamanho da pilha), um
outro inteiro nome detalheMax (o tamanho máximo da pilha, uma constante) e um array
de inteiros nomep.
2. Adicionar um construtor, que recebe um parâmetro inteiro não nulo, que inicializa o tamanho como zero
defina tailleMax, e então crie o array com o tamanho tailleMax.
3. Adicionar o método acessor público int getTaille() permitindo retornar o tamanho de
a pilha.
´
4. Ecrire la m´ethodepublic boolean estVide()qui indique si la pile est vide ou pas.
5. Adicione o método público boolean estPleine() que indica se a pilha está cheia ou não.
Exercício 4
Desejamos modelar uma lista encadeada composta por vários nós onde cada nó
contém um inteiro.
´
1. Escrever a classeNoeudayant com atributos um inteiro e uma referência ao nó
seguinte nomee seguinte (tipoNoeud).
2. Adicionar um construtor à classe Noeud, que recebe um parâmetro inteiro, que inicializa val
a valor do parâmetro. A referência a seguir apontará para nulo.
3. Adicionar métodos acessores e mutadores à classe Nó que permitem recuperar
e de modificar os atributos desta classe.
4. Adicionar, no mesmo pacote, a classe Lista com como atributos uma referência sobre a
tˆete de liste nomm´eetˆete(typeNoeud) et un entiertaillequi est la taille de cette liste.
5. Adicionar um construtor à classe Lista, sem parâmetro, que inicializa a referência cabeça
.orezaelliattelluna
6. Adicionar métodos acessores e mutadores à classe Lista que permitem recuperar a
tê e a altura e de modificar apenas a tê.
7. Adicionar o método público booleano estVide() que indica se a lista está vazia ou não.
8. Adicionar o método público void afficher() que percorre a lista e exibe os valores de
seus nós.
9. Adicionar o método público void adicionarInteiro(int val) que adiciona um nó, tendo a
valor inteiro, no final da lista e incremento de 1.
´
10. Escrever o método public void removerInteiro(int val) que remove o primeiro nó
encontrado desde a cabeça com o valor val, e decremento detalhado de 1 se este nó foi
encontrado.
11. No mesmo pacote, adicione a classe TesteLista contendo o método main com o
código seguinte:
Lista lst=newListe();
[Link](15);
[Link](-9);
[Link](5);
[Link](-26);
[Link](42);
[Link]();
[Link]("Supressão de -26 depois 15:");
[Link](-26);
[Link](15);
[Link]();
[Link]("Adicionando 103:");
[Link](103);
[Link]();
[Link]("A lista contém " + [Link]() + " nós");
— Utilização do patrimônio.
— Compreender o polimorfismo.
— Compreender a utilidade de uma classe abstrata.
— Criação e utilização de uma tabela dinâmica.
1 Noções de curso
1.1 Criação e manipulação de um array dinâmico
Para criar um array redimensionável, pode-se utilizar a classe ArrayList:
// Importar a classe ArrayList no início do arquivo
importar [Link];
...
// Criação de um array dinâmico de String
ArrayList<String>tab=newArrayList<>();
É preciso levar em conta que esta classe não permite criar arrays de tipos primitivos.
Para remediar essa falta, podemos utilizar as classes envoltórias.
Método Rˆole
adicionar(Objecte) Adicione o objeto ao final da tabela.
1.4 Exemple
// Importar a classe ArrayList no início do arquivo, logo após o pacote
importar [Link];
...
ArrayList<String>tab=new ArrayList<>();
[Link]("Olá");
[Link]("Olá");
[Link](0,"Coucou");// adiciona ao início do array
Adeus
[Link]("Obrigado");
2 Exercícios práticos
Exercice 1
Uma empresa deseja gerenciar a lista de seus empregados com uma aplicação Java. Há
principalmente dois tipos de empregados: os executivos e os operários.
1. Sabendo que um empregado é descrito por seu número de matrícula, seu nome, sua idade e seu salário, definir
a classe Empregado com um construtor com parâmetros que inicializa todos os seus atributos.
2. Adicionar um atributo inteiro estático número inicializado em 0 e que será incrementado em 1
cada vez que um empregado é criado.
3. Adicionar os métodos getIdade, getSalario e setSalario, assim como o método estático
getNombre.
4. Red´efinir la m´ethode publiquetoStringqui retourne les informations d’un employ´e selon
esta forma:
matricule nom,a^ge ans, salaire dt
//Exemplo: E10268 Ahmed SASSI, 34 anos, 1200 dt
5. Definir, no mesmo pacote, a classe Operario sabendo que um operário tem as mesmas
propri´et´es d’un employ´e. Ajouter un constructeur avec param`etres qui initialise les valeurs
dos atributos.
6. Definir, no mesmo pacote, a classe Cadre sabendo que, além das propriedades de um
empregado, cada quadro tem uma função. Adicionar um construtor com parâmetros que
inicializar os valores dos atributos.
7. Redefinir o método toString na classe Ouvrier adicionando a palavra "Ouvrier".
fim da cadeia retornada. Exemplo:
E10270 Mounir DRIDI, 36 anos, 900 dt, Operário
9. A empresa decidiu aumentar os salários de seus empregados de acordo com esta fórmula:
— Para os trabalhadores, um aumento de 100 dt.
— Para os executivos :
— Um aumento de 200 dt se a idade for inferior a 35 anos.
— Um aumento de 300 dt se a idade estiver entre 35 anos e 45 anos.
— Um aumento de 400 dt para os outros.
Declarar o método abstrato público aumentar na classe Empregado. Assim, a
classeEmpregado deverá ser abstrata, e o método aumentar deverá ser definido em
les classesOuvrieretCadre.
10. A fim de testar essas classes e seus métodos, crie, no mesmo pacote, a classe
TestEmpregado com o método mão com o seguinte código:
Empregado[] lista = novo Empregado[5];
liste[0] =newCadre("E10268","Ahmed SASSI",34,1200,"Analyste");
liste[1] =newCadre("E10269","Ridha DRIDI",46,1350,"Comptable");
liste[2] =newOuvrier("E10270","Mounir DRIDI",36,900);
liste[3] =newOuvrier("E10271","Alia ARBI",29,850);
liste[4] =newCadre("E10272","Amal TOUATI",38,1850,"Directeur RH");
Exercício 2
Queremos modelar os conceitos veículo, carro e avião.
1. Definir a classe Veículo que possui atributos de informações válidas para todo tipo
de v´ehicule: son mod`ele, son ann´ee d’achat, son prix d’achat et son prix courant.
2. Adicionar um construtor com 3 parâmetros (modelo, ano de compra e preço de compra) que
inicializar todos esses atributos. O preço corrente será fixado ao preço de compra.
3. Redefinir o método toString que retorna as informações de um veículo segundo a forma
seguinte:
mod`ele, ann´eeAchat, prixAchat dt, prixCourant dt
//Exemple: Peugeot 206, 2005, 16000 dt, 12000 dt
11. A fim de testar essas classes e seus métodos, crie, no mesmo pacote, a classe
TestVeículo que tem o método main com o código a seguir:
ArrayList<V´ehicule>tab=newArrayList<>();
[Link](newVoiture("PEUGEOT 206",2005,20000,4,5,200000));
[Link](novaCarro('SUZUKI SWIFT', 2016, 30000, 4, 4, 38000));
[Link](newVoiture("FIAT 500",2010,20000,4,4,150000));
[Link](newAvion("CESSNA CITATION II",1982,4000000,9,15300));
[Link](newAvion("DAHER-SOCATA TBM 700",2001,3500000,5,18000));
1 Exercício prático
On veut impl´ementer le diagramme de classe suivant :
(pReele + pImaginaire*i)
(5.2 + 3.6*i)
Complexo c1=newComplexo(2,3.6);
Complexo c2=newComplexo(5.1,10.22);
Complexo c3=(Complexo)[Link](c2);
[Link](c1+" + "+c2+" = "+c3);
Rolo r1 = novoRolo(9.0);
Reel r2=newReel(-2.1);
tente{
[Link]("A raiz quadrada de " + r1 + " é " + [Link]());
}
capturar(Exceção e) {
[Link]([Link]());
}
tente{
[Link]("A raiz quadrada de " + r2 + " é " + [Link]());
}
capturar(Exception e) {
[Link]([Link]());
}
Reel r3=(Reel)[Link](r2);
[Link](r1+" + "+r2+" = "+r3);