Práticas C# Programação Orientada por Objectos

Page 1


Prefácio

Esta obra, Práticas de C#: Programação Orientada por Objetos, adota a metodologia do livro que a precede – Práticas de C#: Algoritmia e Programação Estruturada (FCA, 2010) – para promover o estudo da linguagem de programação C#, através da resolução de diversos exercícios especialmente concebidos para demonstrar os princípios e as regras da programação orientada por objetos (POO). O livro é dedicado ao paradigma da POO, que tem a montante a algoritmia e a programação estruturada, e a jusante a programação orientada por componentes (POC). Os 156 exercícios apresentados são de dificuldade crescente e foram classificados segundo os tópicos fundamentais das disciplinas de Programação I e Programação II de cursos de licenciatura e de especialização em Engenharia, Economia e Gestão. Por conseguinte, estes exercícios versam: • A definição de classes, a sua instanciação em objetos, a hierarquia de classes e subclasses e as noções subjacentes de abstração, encapsulação, herança e polimorfismo; • A distinção entre classes e interfaces; • A distinção entre classes (referência) e estruturas (valor); • As estruturas de dados complexas e a sua implementação de “caixa negra” com recurso às bibliotecas da Framework Class Library (FCL); • As estruturas de dados complexas, listas ligadas e árvores binárias, a sua implementação com recurso à definição de classes e a sua instanciação; • As interfaces gráficas e as noções subjacentes de forms, controlos, delegados e eventos. O último capítulo, “Integração do C# com o Excel”, antecipa a POC, formulando soluções em que os programas de C# manipulam o Excel como se fosse uma sua classe. Em geral, a resolução dos exercícios baseia-se na metodologia top-down e consiste na definição das estruturas de dados, na elaboração de um algoritmo apropriado, na elaboração do respetivo programa em C# e na sua verificação através da sua execução para dados apropriados. Porém, nalguns casos, não se justifica nesta etapa do estudo da programação a enunciação explícita da abordagem top-down e algorítmica. Todos os exercícios foram resolvidos com o Visual C# 2010 Express. © FCA – Editora de Informática

XV


Práticas de C#: Programação Orientada por Objetos Crê-se, e a minha experiência como professora confirma-o, que este livro poderá constituir um elemento de aprendizagem e de consulta útil para professores, estudantes, investigadores e profissionais de diversas áreas científicas, em que a programação seja uma disciplina nuclear ou um auxiliar essencial para a automatização de sistemas de tratamento de dados. A Autora Adelaide Carvalho junho de 2011

XVI

© FCA – Editora de Informática


Classes e Objetos MaisKm="Os dois carros têm a mesma quilometragem média."; return MaisKm;}} public class ComparacaoDeCarros {static void Main(string[] args) {Carro A=new Carro ("Joana Costa", 2000, 10000); Carro B=new Carro ("Aníbal Pinto", 1998, 15000); Console.WriteLine(A.Comparacao(2010, B));}}}

EXECUÇÃO O carro de Aníbal Pinto tem maior quilometragem média.

? EXERCÍCIO 24: CLASSIFICAÇÃO MÉDIA Defina a classe Disciplina com as seguintes variáveis de instante: Variável de instante Desig

Tipo string

Significado Nome da disciplina

A classe Disciplina tem também as seguintes variáveis estáticas: Variável estática NumAlunos SomaNotas

Tipo int int

Significado Número de alunos das duas disciplinas Somatório das notas das duas disciplinas

A classe Disciplina deve conter métodos que permitam calcular a classificação média obtida pelos alunos do 1.º ano de Engenharia em Informática e Matemática. Elabore também um programa de teste que leia as notas de Informática e de Matemática, e invoque o método de cálculo da classificação média das duas disciplinas. VARIÁVEIS DE INSTANTE E VARIÁVEIS ESTÁTICAS DA CLASSE DISCIPLINA private string Desig; public static int SomaNotas; public static int NumAlunos; © FCA – Editora de Informática

55


Práticas de C#: Programação Orientada por Objetos CONSTRUTORES DA CLASSE DISCIPLINA public Disciplina() { } public Disciplina(string Disc, int N) {Desig = Disc; SomaNotas += N; NumAlunos++;}

MÉTODO MEDIATOTAL DA CLASSE DISCIPLINA public static double MediaTotal() {return (double)SomaNotas / NumAlunos;}

CLASSE DISCIPLINA public class Disciplina {private string Desig; private static int SomaNotas; private static int NumAlunos; public Disciplina(string Disc, int N) {Desig = Disc; SomaNotas += N; NumAlunos++;} public static double MediaTotal() {return (double)SomaNotas / NumAlunos; }}

ALGORITMO MEDIAINFMAT Ler (Nota) Enquanto Nota >= 0 I:= Nova Disciplina("Informática", Nota) Ler (Nota) FimEnq Ler(Nota) Enquanto Nota >= 0 M:= Nova Disciplina("Matemática", Nota) Ler(Nota) FimEnq Escrever("Classif. média das duas disciplinas", Disciplina.MediaTotal())

PROGRAMA MEDIAINFMAT using System; namespace CO24 {public class Disciplina {private string Desig; private static int SomaNotas; 56

© FCA – Editora de Informática


Classes e Objetos private static int NumAlunos; public Disciplina(string Disc, int N) {Desig = Disc; SomaNotas += N; NumAlunos++;} public static double MediaTotal() {return (double)SomaNotas / NumAlunos;}} public class MediaInfMat {static void Main(string[] args) {Console.Write("Digite uma nota de Informática(-1 para terminar) "); int Nota= Convert.ToInt16(Console.ReadLine()); while (Nota >= 0) {Disciplina I = new Disciplina("Informática", Nota); Console.Write("Digite uma nota de Informática(-1 para terminar) "); Nota = Convert.ToInt16(Console.ReadLine());} Console.Write("Digite uma nota de Matemática(-1 para terminar) "); Nota = Convert.ToInt16(Console.ReadLine()); while (Nota >= 0) {Disciplina M = new Disciplina("Matemática", Nota); Console.Write("Digite uma nota de Matemática(-1 para terminar) "); Nota = Convert.ToInt16(Console.ReadLine());} Console.WriteLine("Classificação média das duas disciplinas " +"{0, 2:F2}", Disciplina.MediaTotal());}}}

EXECUÇÃO Digite uma nota de Informática (-1 para terminar) Digite uma nota de Informática (-1 para terminar) Digite uma nota de Informática (-1 para terminar) Digite uma nota de Informática (-1 para terminar) Digite uma nota de Informática (-1 para terminar) Digite uma nota de Matemática (-1 para terminar) Digite uma nota de Matemática (-1 para terminar) Digite uma nota de Matemática (-1 para terminar) Classificação média das duas disciplinas 12,33

12 13 10 15 -1 14 10 -1

? EXERCÍCIO 25: FORNO E PRATO Defina duas classes, Forno e Prato, com variáveis de instante e métodos que permitam calcular a temperatura, expressa em graus centígrados (ºC), que um © FCA – Editora de Informática

57


Classes Seladas, Abstratas e Interfaces ? EXERCÍCIO 10:

PESSOAS E BENS

As classes Pessoa, Carro e Telemovel implementam uma interface, ISumario, que sumaria os seus dados:

A classe Pessoa encapsula: • Duas variáveis de instante, com o título e o apelido do proprietário; • Um construtor; • A implementação do método da interface ISumario, para imprimir o título e o apelido do proprietário. A classe Carro encapsula: • Duas variáveis de instante, com a marca e o modelo do carro; • Um construtor; • A implementação do método da interface ISumario, para imprimir a marca e o modelo do carro. A classe Telemovel encapsula: • Duas variáveis de instante, com a marca e o número do telemóvel; • Um construtor; • A implementação do método da interface ISumario, para imprimir a marca e o número do telemóvel. Defina esta estrutura de interface e classes e elabore um programa de testes. Â INTERFACE ISUMARIO public interface ISumario {string Sumario {get;}} © FCA – Editora de Informática

137


Estruturas Ligadas public NoDaLista(string Pessoa) {Nome = Pessoa; Proximo = null;} public NoDaLista(string Pessoa, NoDaLista Prox) {Nome = Pessoa; Proximo = Prox;} public string PNome {get {return Nome;}} public NoDaLista PProx {get {return Proximo; } set {Proximo = value; }}} public class Lista {private NoDaLista PrimeiroNo; private NoDaLista UltimoNo; public Lista() {PrimeiroNo = UltimoNo = null; } public void InserirACauda(string PessoaAInserir) {if (ListaVazia()) PrimeiroNo = UltimoNo = new NoDaLista(PessoaAInserir); else UltimoNo = UltimoNo.PProx = new NoDaLista(PessoaAInserir);} public bool ListaVazia() {return PrimeiroNo == null; } public void ImprimirLista() {if (ListaVazia()) {Console.WriteLine("Lista Vazia"); } else {NoDaLista Corrente = PrimeiroNo; while (Corrente != null) {Console.WriteLine(Corrente.PNome); Corrente = Corrente.PProx;}}}} public class ImpressaoLista {static void Main(string[] args) {Lista L = new Lista(); Console.Write("Digite um nome ou ZZZ para terminar "); string NovoNome = Console.ReadLine(); while (NovoNome.ToUpper().CompareTo("ZZZ") != 0) {L.InserirACauda(NovoNome); Console.Write("Digite um nome ou ZZZ para terminar "); NovoNome = Console.ReadLine();} L.ImprimirLista();}}}

© FCA – Editora de Informática

221


Delegados e Eventos EXECUÇÃO Somatório do dobro, triplo e quadrúplo de 5=45

? EXERCÍCIO 3: COMPOSIÇÃO DE FUNÇÕES A classe seguinte contém a definição dos métodos de cálculo do dobro e do triplo de um inteiro: public class ContentorDeFuncoes {public static int Dobro(int X) {return X * 2;} public static int Triplo(int X) {return X * 3;}}

Defina um delegado que permita calcular a função composta “O triplo do dobro de um inteiro”. VARIÁVEIS DE COMPOSICAODEFUNCOES Variável

Tipo

Significado

D

DelegadoParaComposicaoFunc[]

I

int

X

int

Vetor de delegado para executar funções Índice de cada elemento vetor de delegados Argumento das funções

ALGORITMO COMPOSICAODEFUNCOES D:={Multiplos.Triplo, Multiplos.Dobro} X:=5 Escrever ("Triplo do dobro de ", X, D[0](D[1](X)))

PROGRAMA COMPOSICAODEFUNCOES using System; namespace DE3 {delegate int DelegadoParaComposicaoFunc( int X); public class ContentorDeFunc {public static int Dobro( int X) {return X * 2;} public static int Triplo( int X) {return X * 3;}} © FCA – Editora de Informática

331


Práticas de C#: Programação Orientada por Objetos PROGRAMA ACTIVACAO using System; using System.Windows.Forms; namespace Gui11 {static class Activacao {static void Main() {ETNegrito F= new ETNegrito(); Application.Run(F);}}}

EXECUÇÃO

? EXERCÍCIO 12: INTERFACE COM INTERRUPTOR Elabore um programa que defina uma interface gráfica com um botão interruptor. Quando se ativa o interruptor, a interface fica com fundo verde e o botão diz “Ligado”; quando se desativa o interruptor, a interface fica com fundo vermelho e o botão diz “Desligado”. INTERFACE GRÁFICA Form

Nome Form1

Texto

Altura

Interruptor

190

Largura

240

CONTROLO Controlo Button

372

Nome

Texto

Interruptor

Desligado

© FCA – Editora de Informática

Altura 67

Largura 187

Esquerda 30

Topo 40

Fundo Vermelho


Interfaces Gráficas Definidas pelo Utilizador 1. Crie uma aplicação Windows de C# com o nome Gui12 2. Elimine o Form que foi gerado automaticamente visualizando o explorador de projeto selecionando Form1.cs no explorador de projeto premindo o botão direito do rato e escolhendo Delete 3. Insira uma classe selecionando Project – Add New Item C# class digitando GuiComInterruptor em Name

CLASSE GUICOMINTERRUPTOR using System; using System.Drawing; using System.Windows.Forms; namespace Gui12 {public class GuiComInterruptor: Form {private Button Interruptor; public GuiComInterruptor () {this.Interruptor = new System.Windows.Forms.Button(); // Interruptor this.Interruptor.BackColor = System.Drawing.Color.Red; this.Interruptor.Font = new System.Drawing.Font("Times New Roman", 16F); //System.Drawing.GraphicsUnit.Point, ((byte)(0))); this.Interruptor.Location = new System.Drawing.Point(30, 40); this.Interruptor.Name = "Interruptor"; this.Interruptor.Size = new System.Drawing.Size(187, 67); this.Interruptor.TabIndex = 0; this.Interruptor.Text = "Desligado"; this.Interruptor.UseVisualStyleBackColor = false; this.Interruptor.Click += new System.EventHandler(this.Interruptor_Click); // Form1 this.AutoScaleDimensions = new System.Drawing.SizeF(9F, 20F); this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; this.ClientSize = new System.Drawing.Size(240, 190); this.Controls.Add(this.Interruptor); this.Name = "Form1"; this.Text = "Interruptor"; this.ResumeLayout(false); this.PerformLayout();} private void Interruptor_Click(object sender, EventArgs e) {if (this.Interruptor.BackColor == System.Drawing.Color.Red) {this.Interruptor.BackColor = System.Drawing.Color.Lime; this.Interruptor.Text = "Ligado";} else © FCA – Editora de Informática

373


Turn static files into dynamic content formats.

Create a flipbook
Issuu converts static files into: digital portfolios, online yearbooks, online catalogs, digital photo albums and more. Sign up and create your flipbook.