Preparatório EsFCEx TÉCNICAS DE PROGRAMAÇÃO Programação Orientada a Objetos Prof. Ricardo Sant'Ana
Sumário
1
Introdução
2
Conceitos
3
Conclusão
Introdução Lista de Assuntos 2. TÉCNICAS DE PROGRAMAÇÃO: • a. Lógica aplicada: algoritmos, técnicas de construção de algoritmos, resolução de problemas. • b. Estrutura de dados: vetores, matrizes, cadeia de caracteres, listas lineares, pilhas, filas, árvores, grafos, pesquisa de dados, classificação de dados, estruturas e tipos abstratos de dados, recursividade, eficiência e complexidade. • c. Programação estruturada: refinamentos sucessivos, estruturas em blocos, estruturas de controle de fluxo, programação modular, rotinas, sub-rotinas, procedimentos e funções (Linguagem C). • d. Programação orientada a objetos: classes e objetos, polimorfismo, herança, interface, linguagens orientadas a objetos (Linguagens C++ e Java). • e. Linguagens de programação para a internet: JAVA, PHP e JSP.
Introdução Bibliografia COSTA, Daniel G. JAVA em Rede: Recursos Avançados. Rio de Janeiro: Brasport, 2008. DEITEL, H. M. JAVA Como Programar. 6. ed. [S.l.]: Editora Bookman, 2006. GAMMA, Erich et al. Padrões de Projeto: Soluções Reutilizáveis de Software Orientado a Objetos. [S.l.]: Bookman, 2005. GUIMARÃES, Ângelo de Moura; LAGES, Newton de Castilho. Algoritmos Estruturados de Dados. [S.l.]: Editora LTC, 1994. MORGAN, Michael. JAVA 2 para Programadores Profissionais. [S.l.]: Editora Ciência Moderna, 2001. MUTO, Claudio Adonai. PHP & MYSQL Guia Completo. [S.l.]: Brasport, 2004. TENENBAUM, Aaron M.; LANGSAM, Yedidyah; AUGENSTEIN, Moshe J. Estruturas de Dados Usando C. [S.l.]: Makron Books, 1995. VELOSO, Paulo et al. Estrutura de Dados. [S.l.]: Editora Campus, 1983. WIRTH, Niklaus. Algorítmos e Estruturados de Dados. [S.l.]: Editora PHB, 1989.
Introdução Foco (baseado em questões) Primeira percepção: Programação Orientada a Objetos em Java Ponteiros em C Árvores e Pilhas (Estrutura da Dados)
Teoria e Exercícios Conhecimento prévio!
Conceitos Mas o que é Java ?
Conceitos Plataforma Java A classe MyProgram.java é compilada utilizando o javac e, o resultado, é executado numa máquina virtual java (JVM).
Conceitos Funcionamento Geral Texto comum com extensão .java • javac MyProgram.java → MyProgram.class
Bytecodes Java Virtual Machine (JVM) • java MyProgram
Conceitos Funcionamento Geral Multiplataforma
Conceitos Principais Estruturas Tipos da Dados Primitivos: • boolean, char, byte, int, long, float, double;
Operadores: • Aritméticos, Relacionais e Lógicos;
Estruturas Condicionais: • If, switch-case, ternário
Estruturas de repetição • For, while, do-while
Conceitos Observações Ternário public class Exemplo { public static void main(String[] args) { float nota = 7.5F; char situacao = nota > 7 ? 'A' : 'R'; System.out.println("Situacao: " + situacao); } }
• Observar que float nota=7.5; daria um erro, pois Java consideraria 7.5 como double.
Conceitos Observações Ternário
public class Exemplo { public static void main(String[] args) { float nota = 7.5F; char situacao = nota > 7 ? 'A' : 'R'; System.out.println("Situacao: " + situacao); } }
Sintaxe do ternário: (condição) ? resultado se V : resultado se F
Conceitos Observações Ternário
public class Exemplo { public static void main(String[] args) { float nota = 7.5F; char situacao = nota > 7 ? 'A' : 'R'; System.out.println("Situacao: " + situacao); } }
Resultado: Situacao: A
Conceitos Break no switch-case public class Exemplo { public static void main(String[] args) { int resposta = 2; switch (resposta) { case 1: System.out.println("Informatica"); break; case 2: System.out.println("Enfermagem"); break; case 3: System.out.println("Psicologia"); break; case 4: System.out.println("Pedagogia"); break; default: System.out.println("Nao encontrado"); } } }
Conceitos Break no switch-case public class Exemplo { public static void main(String[] args) { int resposta = 2; switch (resposta) { case 1: System.out.println("Informatica"); break; case 2: System.out.println("Enfermagem"); break; case 3: System.out.println("Psicologia"); break; case 4: System.out.println("Pedagogia"); break; default: System.out.println("Nao encontrado"); } } }
Enfermagem
Conceitos Break no switch-case public class Exemplo { public static void main(String[] args) { int resposta = 2; switch (resposta) { case 1: System.out.println("Informatica"); case 2: System.out.println("Enfermagem"); case 3: System.out.println("Psicologia"); case 4: System.out.println("Pedagogia"); default: System.out.println("Nao encontrado"); } } }
Enfermagem Psicologia Pedagogia Nao encontrado
Conceitos Break no switch-case public class Exemplo { public static void main(String[] args) { int resposta = 2; switch (resposta) { case 1: System.out.println("Informatica"); case 4: System.out.println("Pedagogia"); case 2: System.out.println("Enfermagem"); case 3: System.out.println("Psicologia"); default: System.out.println("Nao encontrado"); } } }
Enfermagem Psicologia Nao encontrado
Conceitos Utilização básica laço for public class Exemplo { public static void main(String[] args) { for (int i = 0; i < 10; i++) { System.out.print(i + " - "); } } }
Resultado 0-1-2-3-4-5-6-7-8-9-
Conceitos Utilização do continue public class Exemplo { public static void main(String[] args) { for (int i = 0; i < 10; i++) { if (i==7) continue; System.out.print(i + " - "); } } }
Resultado 0-1-2-3-4-5-6-8-9 O sete não aparece !!
Conceitos Utilização do break public class Exemplo { public static void main(String[] args) { for (int i = 0; i < 10; i++) { if (i==7) break; System.out.print(i + " - "); } } }
Resultado 0-1-2-3-4-5-6 A partir do sete não aparece mais nada !!
Conceitos Utilização do laço for public class Exemplo { public static void main(String[] args) { int i=0; for (i = 0; i < 10; i++) { System.out.print(i + " - "); } System.out.println(i); } }
Resultado 0 - 1 - 2 - 3 - 4 - 5 - 6 - 7 - 8 - 9 - 10
Conceitos Utilização do laço for public class Exemplo { public static void main(String[] args) {
}
}
for (int i=0; i < 10; i++) { System.out.print(i + " - "); } System.out.println(i);
Resultado Daria erro, pois a variável i foi declarada dentro do escopo do laço e, portanto, não existe for do laço !
Conceitos POO – parte 1 Classes e Objetos Atributos e Métodos Construtor e Destrutor
Conceitos Classes e Objetos Dada uma entidade qualquer que desejamos modelar, a classe é o projeto dessa entidade. Um objeto dessa classe representa a entidade em si. Exemplo1: public class Solicitacao { String nome; long cpf; int protocolo; } Exemplo de um trecho de código que cria um objeto da classe Solicitacao: Solicitacao W
= new Solicitacao();
Conceitos Atributos e Métodos Atributos:
• modelam o estado que a classe pode ter. São os atributos que diferenciam um objeto de outro da mesma classe. Métodos: • modelam as ações que os objetos poderão executar. Todos os objetos da mesma classe possuem os mesmos métodos. Atributos e Métodos são os MEMBROS da classe.
Conceitos Exemplo A classe Carro abaixo definida possui os atributos modelo, marca, cor, ano, proprietario e autorizados; possui o método imprime(); class Carro { String modelo; String marca; char cor; int ano; String proprietario; boolean autorizado; void imprime() { System.out.println("Dados do veículo"); System.out.println("Marca: " + marca + "\tModelo:" + modelo); System.out.println("Dono: " + proprietario + "\tAno: " + ano); } }
Conceitos Exemplo public class Executavel { public static void main(String[] args) { Carro A = new Carro(); A.modelo="siena"; A.autorizado=false; A.cor='B'; A.marca="fiat"; A.ano=2009; A.proprietario="Elias"; Carro B = new Carro(); B.modelo="palio"; B.autorizado=true; B.cor='N'; B.marca="fiat"; B.ano=2012; B.proprietario="Rafael"; A.imprime(); B.imprime(); } }
Conceitos Exemplo Dados do veículo Marca: fiat Modelo:siena Dono: Elias Ano: 2009 Dados do veículo Marca: fiat Modelo:palio Dono: Rafael Ano: 2012
Conceitos Construtor O construtor é um “método” da classe que é chamado sempre que instanciamos um objeto desta; O construtor não tem retorno (nem void) ; O construtor sempre tem o mesmo nome da classe; Se não for definido pelo programador, é adicionado automaticamente pelo compilador Java. O operador new exige , como parâmetro, um construtor.
Conceitos Construtor Em Java, construtor é método ? • Para a JVM é um método estático especial, cujo nome interno é "
", e é tratado de modo um pouco diferente dos métodos normais. • O construtor não é herdado, mesmo sendo public. O construtor não pode usar alguns modificadores que se aplicam a métodos - como final. O construtor não possui retorno. • Constructor declarations are not members. The body of a class declares members (fields and methods and nested classes and interfaces), instance and static initializers, and constructors Em Java, construtor não é método
Conceitos Exemplo class Ponto2D { double x; double y; String label; Ponto2D(){ x=0;y=0;label="nenhum"; }
}
void imprime(){ System.out.println("x= "+x+"\t y="+y+"\t"+label); }
Conceitos Exemplo (continuação) public class ExPonto01 { public static void main(String[] args) { Ponto2D Q = new Ponto2D(); Q.x = 10; Q.y = 10; Q.label = "marco01"; Q.imprime(); Chamando o construtor
P.imprime(); } }
Conceitos Destrutor Em outras linguagens de programação, o destrutor é um método utilizado para liberar o espaço de memória do objeto; O Java não possui destrutor. O Java possui o Garbage Collector: Todos os objetos que perdem todas as suas referências num programa são CANDIDATOS a serem descartados pelo Garbage Collector O método finalize() do Java torna o objeto candidato a ser descartado pelo Garbage Collector.
Conceitos POO – parte 2 Visibilidade Métodos Acessores e Modificadores • Encapsulamento Sobrecarga de Métodos
Conceitos Visibilidade A visibilidade permite que o programador defina quais atributos e métodos poderão ser acessados por outras classes.
Tipos de Visibilidade • private: somente a classe atual pode acessar • public: todas as outras classes podem acessar • protected: somente classes do mesmo pacote ou classes filhas terão acesso. • default: somente as classes do mesmo pacote tem acesso.
Conceitos Exemplo package app.sistema; public class Ponto2Dv { private double x; public double y; String label;
}
public Ponto2Dv(double x, double y, String label) { this.x = x; this.y = y; this.label = label; }
Conceitos Exemplo(cont.) package app.sistema; public class ExPonto2Dv { public static void main(String[] args) { Ponto2Dv Q = new Ponto2Dv(1,1,”ponto inicial”); Q.x=0; // erro Q.y=1; // ok Q.label=”teste”; // ok ! Mesmo pacote! } }
Conceitos Métodos Acessores e Modificadores Método Acessor: método, geralmente público, que dá acesso de leitura a um atributo da classe. Método Modificador (Mutante): método, geralmente público, que dá acesso de escrita a um atributo da classe.
Conceitos Exemplo public class Aluno { private String nome; private int matricula; public int getMatricula() { return matricula; } public void setMatricula(int matricula) { this.matricula = matricula; } public String getNome() { return nome; } public void setNome(String nome) { this.nome = nome; } }
Conceitos Exemplo public class ExemploAluno { public static void main(String[] args) { Aluno Q = new Aluno(); Q.setMatricula(700); Q.setNome("Roberto Caio"); System.out.println(Q.getMatricula()+" - "+Q.getNome()); } }
Modificadores: setMatricula setNome
Conceitos Exemplo public class ExemploAluno { public static void main(String[] args) { Aluno Q = new Aluno(); Q.setMatricula(700); Q.setNome("Roberto Caio"); System.out.println(Q.getMatricula()+" - "+Q.getNome()); } }
Acessores: getMatricula getNome
Conceitos Métodos Acessores e Modificadores Método Acessor:também são conhecidos como getters Método Modificador (Mutante): também são conhecidos como setters.
Conceitos Encapsulamento: encapsular significa “esconder/proteger a implementação” do usuário da classe. na prática, isso significa, principalmente, deixar os atributos (dados) private/protected.
Método Modificador
Atributos Encapsulados
Método Acessor
Conceitos Sobrecarga de Métodos: Sobrecarga de métodos permite que dentro de uma mesma classe, métodos que tenham o mesmo nome mas que tenham diferentes parâmetros. • em outras palavras, dizemos que podemos criar métodos com o mesmo nome. • da mesma forma que existe sobrecarga de métodos, existem a sobrecarga de construtor.
método sobrecarregado • overload
Conceitos Exemplo: Dois métodos imprime adicionados na classe Auno: public void imprime(){ System.out.println(matricula+" - "+nome); } public void imprime(int n){ for(int i=0; i
Conceitos POO – parte 3 Herança • Sobrescrita Interfaces
Conceitos Herança: mecanismo da POO que permite que uma classe seja definida a partir de uma outra préexistente. A nova classe (classe filha) herda todos os atributos e métodos da classe mãe (progenitora). Observação: devemos considerar a visibilidade Herança Simples x Herança Composta Sintaxe (Java): class ClasseFilha extends ClassePai
Conceitos Sobrescrita (override) Na classe filha é possível re-escrever um método existente na classe pai • Mesma assinatura da classe Pai • A visibilidade pode ser MENOS restritiva – – – –
private (mais restritiva) default protected public (menos restritiva)
Conceitos Exemplo public class protected protected protected
Ponto2D { double x; double y; String label;
Ponto2D(){ x=0;y=0;label="nenhum"; } void imprime(){ System.out.println("x= "+x+"\t y="+y+"\t"+label); } }
Conceitos Exemplo(cont.) public class Ponto3D extends Ponto2D { protected double z; Ponto3D() { super(); z = 0; } public void imprime() { super.imprime(); System.out.println("z=" + z); } }
Conceitos Exemplo(cont.) public class Ponto3D extends Ponto2D { protected double z; Ponto3D() { super(); z = 0; } public void imprime() { super.imprime(); System.out.println("z=" + z); } }
A classe herda os atributos x, y e label da classe pai O método imprime() da classe Ponto3D sobreescreve o método imprime da classe Ponto2D.
Conceitos Exemplo(cont.) public class Ponto3D extends Ponto2D { protected double z; Ponto3D() { super(); z = 0; } public void imprime() { super.imprime(); System.out.println("z=" + z); } }
O contrutor tem visibilidade default. Portanto, onde poderemos instanciar objetos da classe Ponto3D ?
Conceitos Aspectos particulares da Herança no Java: Toda classe é filha da classe Object Java somente permite Herança Simples Utilização de Herança: • Relacionamento “É UM” PESSOA É UM (A) ALUNO
Conceitos Diagrama de Classes
Conceitos Interfaces As interfaces em Java são similares às classes Possuem hierarquia de forma similar às classes • É possível utilizar extends entre interfaces As interfaces definem comportamentos • Na forma de uma lista de métodos públicos Definem o que uma classe deve implementar e não como essa classe irá implementar. Se uma classe implementa uma interface, ela deverá implementar todos os métodos/comportamentos desta interface.
Conceitos Exemplo: public interface Imprimivel{ public void imprime(); public Map getConfiguracoesImpressora(); public void setConfiguracao(String chave, String valor); }
Acima temos um aspecto geral de como é definida de uma interface Observe que a sintaxe utilizada é similar ao da classe – mas ao invés de utilizar class utilizamos interface. Os métodos da interface não possuem implementação
Conceitos Exemplo (cont.) public class Aluno implements Imprimivel{ private String nome; private int matricula;
}
public void imprime(){ System.out.println(matricula+" - "+nome); } public Map getConfiguracoesImpressora() { // codigo return null; } public void setConfiguracao(String chave, String valor) { // codigo }
Conceitos Classes Abstratas Não são instanciadas. Podem definir métodos sem implementação • Esses métodos também utilizam o modificador abstract • Neste caso, se uma classe (concreta) extender (extends) essa classe abstrata, ela DEVERÁ implementar esses métodos.
Conceitos Exemplo de classe Abstrata: public abstract class Aluno { private String nome; private int matricula; public Aluno(String nome, int matricula) { this.nome = nome; this.matricula = matricula; }
}
public abstract void imprime(); }
Conceitos Outros conceitos
Atributos e Métodos estáticos Classe Final Wrappers e AutoBoxing (*) Tratamento de Exceções (*)
Conceitos POO – Parte 4 Polimorfismo
Conceitos Polimorfismo Pilares da Programação Orientada a Objetos: • Encapsulamento • Herança • Polimorfismo
Conceitos Polimorfismo É o mecanismos da POO que permite que um serviço apresente diversos comportamentos. Tipos de Polimorfismo em Java: • Polimorfismo de Inclusão • Sobrecarga • Sobreposição ou sobrescrita
Conceitos A sobrecarga é a possibilidade de implementação de métodos que possuam a mesma assinatura de método mas que diferem nos parâmetros passados para o método. Esses métodos podem estar em classe pai e filha. A sobreposição é a possibilidade de reescrevermos um método de uma ancestral utilizando a mesma assinatura.
Conceitos Polimorfismo de Inclusão O polimorfismo de inclusão permite a criação de variáveis polimórficas, isto é, variáveis (ou objetos) de determinada classe que apresentam comportamentos distintos de acordo com o objeto que recebe.
Conceitos Exemplo package app.polimorfismo; public class Pessoa { public String nome; public void imprime() { System.out.println("Nome:" + nome); } } package app.polimorfismo; public class Aluno extends Pessoa { public int matricula; public void imprime() { super.imprime(); System.out.println("Matricula:" + matricula); } }
Conceitos Exemplo (cont.) package app.polimorfismo; public class Ex { public static void main(String[] args) { Pessoa A = new Pessoa(); A.nome = "Ricardo"; Pessoa B = new Pessoa(); B.nome = "Ana"; Aluno C = new Aluno(); C.nome = "Waleska"; C.matricula = 123; Aluno D = new Aluno(); D.nome = "Luiz"; D.matricula = 112; Pessoa E = new Pessoa(); E.nome = "Leandro";
Conceitos Exemplo(cont.) public class Ex { public static void main(String[] args) { . . . Pessoa[] vetor = { A, B, C, D, E }; for (int i = 0; i < vetor.length; i++) { vetor[i].imprime(); } } }
Conceitos Exemplo(cont.) Qual o resultado ? Nome:Ricardo Nome:Ana Nome:Waleska Matricula:123 Nome:Luiz Matricula:112 Nome:Leandro
Conceitos Exemplo (cont.) package app.polimorfismo; public class Ex { public static void main(String[] args) { Pessoa A = new Pessoa(); A.nome = "Ricardo"; Pessoa B = new Pessoa(); B.nome = "Ana"; Aluno C = new Aluno(); C.nome = "Waleska"; C.matricula = 123; Aluno D = new Aluno(); D.nome = "Luiz"; E agora ?? D.matricula = 112; Pessoa E = new Aluno(); E.nome = "Leandro";
Conceitos Exemplo(cont.) Qual o resultado ? Nome:Ricardo Nome:Ana Nome:Waleska Matricula:123 Nome:Luiz Matricula:112 Nome:Leandro Matricula:0
Conceitos Desafio Final public class A { public int getValor() { return 1; } }
public class B extends A { public int getValor() { return 2; } }
Conceitos Desafio Final public class Codigo { public static void main(String[] args) { A p1 = new A(); B p2 = new B(); A p3 = new B(); System.out.println(p1.getValor()); System.out.println(p2.getValor()); System.out.println(p3.getValor()); } }
Conceitos Resultado do Desafio Final 1 2 2
Conceitos POO Atributos Estáticos Métodos Estáticos
Observação: não estava claro na ementa que esse assunto seria abordado – no entanto, para resolver a questão de 2010, tal conhecimento foi necessário. Lembram do que comentei sobre Deitel ?
Conceitos Atributos Estáticos ou Atributos de Classe São atributos válidos para todos objetos da classe, classe ou seja, se você trocar o valor de um atributo de classe, você estará trocando o valor do atributo de TODOS os objetos daquela classe. • É como se houvesse um único atributo para a classe toda. Atributos de classe DEVEM ser acessados utilizando o nome da classe seguido pelo atributo • nomeDaClasse.nomeDoAtributo • Mas, como veremos adiante, isso não é obrigatório!
Conceitos Atributos Estáticos Isso torna o código mais claro do que se utilizássemos o: • nomeDaInstância.nomeDoAtributo.
O espaço de memória dos atributos estáticos é compartilhado entre os objetos daquela classe. • Atributos estáticos somente podem ser acessados internamente à classe – por métodos estáticos.
Conceitos Atributos Estáticos} public class Aluno { public String nome; public static String instituicao; }
public class ExAluno { public static void main(String[] Aluno P = new Aluno(); P.nome = "Fábio"; P.instituicao = "CDS"; System.out.println("Nome: " + Aluno Q = new Aluno(); Q.nome = "Aline"; Q.instituicao = "EME"; System.out.println("Nome: " + System.out.println("Nome: " + } }
args) {
P.nome + "\tInstituição: " + P.instituicao);
P.nome + "\tInstituição: " + P.instituicao); Q.nome + "\tInstituição: " + Q.instituicao);
Conceitos Atributos Estáticos Saída: Nome: Fábio Nome: Fábio Nome: Aline
Instituição: CDS Instituição: EME Instituição: EME
Para evitar confusão, portanto, utilizamos a notação com o nome da classe (e não da instância) • Observe o código a seguir que produz o MESMO resultado.
Conceitos Atributos Estáticos public class ExAluno2 { public static void main(String[] args) { Aluno P = new Aluno(); P.nome="Fábio"; Aluno.instituicao="CDS"; System.out.println("Nome:"+P.nome+"\tInstituição: "+Aluno.instituicao); Aluno Q = new Aluno(); Q.nome="Aline"; Aluno.instituicao="EME"; System.out.println("Nome:"+P.nome+"\tInstituição: "+Aluno.instituicao); System.out.println("Nome:"+Q.nome+"\tInstituição: "+Aluno.instituicao); } }
Conceitos Atributos Estáticos Saída é a mesma !!: Nome: Fábio Nome: Fábio Nome: Aline
Instituição: CDS Instituição: EME Instituição: EME
Isso significa que você deve conhecer as duas sintaxes → do ponto de vista de programação, a segunda é ideal. Do ponto de vista de prova, você deve conhecer o resultado de ambas.
Conceitos Métodos Estáticos Os métodos de classe devem ser acessados utilizando o nome da classe – de forma similar ao que foi visto anteriormente com os atributos estáticos. Não é necessário instanciar um objeto da classe para acessar o método estático da mesma. Métodos de classe somente podem acessar métodos/atributos estáticos daquela classe. • Exemplo: Classe Math do Java. Tipicamente utilizados quando a classe não possui estado (portanto não possui atributos e, assim, somente tem métodos). Ex: classes utilitárias.
Conceitos Métodos Estáticos import java.util.LinkedList; import java.util.Random; public class Utils { public static String Anagrama(String s) { LinkedList P = new LinkedList(); for (int i = 0; i < s.length(); i++) P.add(new Character(s.charAt(i))); Random Q = new Random(); String res = ""; while (P.size() > 0) { res = res + P.remove(Q.nextInt(P.size())); } return res; } }
Conceitos Métodos Estáticos Exemplo de como utilizar o método anagrama da classe do slide anterior: public class ExUtils { public static void main(String[] args) { System.out.println(Utils.Anagrama("ricardo")); } }
Exemplo do uso de métodos static. Observe que não é necessário criar um objeto da classe Utils para utilizar o método Anagrama. Métodos estáticos são interessantes quando desejamos criar uma biblioteca de funções ou utilidades (classe utilitária)
Conceitos Métodos Estáticos Da mesma forma que os atributos estáticos, métodos estáticos podem ser acessados por meio das instâncias: public class Ex2 { public static void main(String[] args) { Utils W = new Utils(); System.out.println(W.Anagrama("ricardo")); } }
Conceitos Métodos Estáticos Observação Importante: • Métodos estáticos podem chamar outros métodos estáticos e/ou atributos estáticos. • Não é possível fazer um acesso a instância de dentro de um método estático – Ou seja, não é possível utilizar o “this” dentro de um método estático !
Conclusão Chegamos aqui ?
FIM CIDADE IDIOMAS & CURSOS PREPARATÓRIOS CLN 113 - Bloco C - Sala 207 a 210 Asa Norte - Brasília - DF - CEP 70.763-503 Tel: (61) 3340-0433 / 9975-4464 / 8175-4509 E-mail: [email protected] Site: www.iic.pro.br Skype: luizcidade
Prof. Ricardo Sant'Ana