• No results found

Discouragement and disillusionment

Ordenando um Array

Suponha um array de strings criado para armazenar alguns nomes de pessoas. É comum querer ordenar esses nomes utilizando a ordem alfabética. Essa tarefa pode ser realizada através do método Sort.

1 string[] nomes = new string[]{"rafael", "jonas", "marcelo" }; 2 System.Array.Sort(nomes);

3

4 foreach (string nome in nomes) 5 {

6 System.Console.WriteLine(nome); 7 }

Invertendo um Array

1 string[] nomes = new string[] {"rafael", "jonas", "marcelo" }; 2 System.Array.Sort(nomes);

3 System.Array.Reverse(nomes); 4

5 foreach (string nome in nomes) 6 {

7 System.Console.WriteLine(nome); 8 }

Copiando um Array

Para copiar o conteúdo de um array para outro, deve ser utilizado o método CopyTo.

1 string[] nomes = new string[] {"rafael", "jonas", "marcelo" }; 2 string[] nomesCopia = new string[3];

3 nomes.CopyTo(nomesCopia, 0);

4.5 Exercícios

1. Dentro da sua pasta de exercícios crie uma pasta para os arquivos desenvolvidos nesse capítulo chamada arrays.

2. Crie um programa que imprima na tela os argumentos passados na linha de comando

1 // arquivo: Imprime.cs

2 class Imprime 3 {

4 static void Main(string[] args)

5 {

6 foreach (string arg in args)

7 {

8 System.Console.WriteLine(arg);

9 }

10 } 11 }

Compile e execute a classe IMPRIME. Na execução não esqueça de passar alguns parâ-

metros na linha de comando.

Imprime.exe Rafael Alex Daniel Jonas

3. Faça um programa que ordene o array de strings recebido na linha de comando.

1 // arquivo: Ordena.cs

2 class Ordena 3 {

4 static void Main(string[] args)

5 {

6 System.Array.Sort(args); 7

8 foreach (string arg in args)

9 {

10 System.Console.WriteLine(arg);

11 }

12 } 13 }

Compile e execute a classe ORDENA. Na execução não esqueça de passar alguns parâ-

metros na linha de comando.

Ordena.exe Rafael Alex Daniel Jonas

4. (Opcional) Faça um programa que calcule a média dos elementos recebidos na linha de comando. Dica: para converter strings para double pode ser utilizado um código semelhante a este:

1 string s = "10";

2 double d = System.Convert.ToDouble(s);

5. (Opcional) Crie um programa que encontre o maior número entre os valores passados na linha de comando.

6. (Opcional) Crie um array de arrays na forma de triângulo com os valores do padrão abaixo e imprima na tela esses valores.

1 1 2 1 2 3 1 2 3 4 1 2 3 4 5

Capítulo 5

IDE - Integrated Development

Environment

No cotidiano do desenvolvimento de software, é comum querer aumentar a produtividade. A produtividade pode ser analisada em diversos aspectos, qualidade do software e velocidade de desenvolvimento são alguns deles.

A criação de um software envolve algumas etapas fundamentais. Por exemplo: codifica- ção, compilação, testes, documentação e debug. Em cada uma dessas etapas, uma ferramenta poderia auxiliar o desenvolvedor a fim de melhorar a produtividade.

Daí surge o conceito de IDE, Ambiente de Desenvolvimento Integrado. Uma IDE é uma ferramenta que provê facilidades para o desenvolvedor realizar as principais tarefas relaciona- das ao desenvolvimento de um software.

No caso específico da tecnologia .NET, a IDE mais utilizada e a ferramenta da Microsoft, o Microsoft Visual Studio. Essa ferramenta é bem abrangente e oferece recurcos sofisticados para o desenvolvimento de uma aplicação .NET. Contudo, ela não é gratuita.

Por outro lado, há versões modificadas do Microsoft Visual Studio fornecidas gratuita- mente pela própria Microsoft. Por exemplo, para desenvolver uma aplicação, utilizando a linguagem C#, há uma IDE chamada Microsoft Visual C# Express. Essa IDE será uti- lizada nesse treinamento. Confira a página de download do Microsoft Visual C# Express:

http://www.microsoft.com/express/download/.

5.1 Exercícios

1. Faça um novo projeto no Microsoft Visual C# Express e crie um programa que imprime na tela a mensagem "Olá Mundo".

Para criar um novo projeto, clique no menu File->New Project ou digite o atalho CTRL

+ SHIFT + N. Depois, selecione o template Empty Project, defina o nome do projeto

como "OlaMundo"e clique no botão OK.

Após a criação do projeto OlaMundo, ele deve aparecer na view Solution Explorer no canto direito. Clique com o botão direito do mouse no projeto OlaMundo e selecione o menu Add->New Item.

Na tela de criação de novo item, selecione o template Code File, defina o nome do arquivo com OlaMundo.cs e clique em no botão Add.

Para compilar, clique no menu Build->Build Solution ou digite o atalho F6. Para execu- tar, digite o atalho CTRL + F5.

Salve o projeto através do menu File-> SaveAll na pasta padrão do Microsoft Visual C#

Capítulo 6

Atributos e Métodos de Classe

6.1 Atributos Estáticos

Num sistema bancário, provavelmente, criaríamos uma classe para especificar os objetos que representariam os funcionários do banco.

1 class Funcionario 2 {

3 public string nome; 4 public double salario; 5

6 public void AumentaSalario(double aumento)

7 {

8 this.salario += aumento;

9 }

10 }

Supondo que o banco possui um piso salarial para os seus funcionários e que o sistema

tem que guardar esse valor, poderíamos definir um atributo na classe FUNCIONARIO para tal

propósito.

1 class Funcionario 2 {

3 public string nome; 4 public double salario; 5 public double pisoSalarial; 6

7 public void AumentaSalario(double aumento)

8 {

9 this.salario += aumento; 10 }

11 }

O atributoPISOSALARIALé de instância, ou seja, cada objeto criado a partir da classe FUN- CIONARIO teria o seu próprio atributoPISOSALARIAL. Porém, não faz sentido ter o valor do

piso salarial repetido em todos os objetos já que esse valor é único para todos os funcionários.

Para que o atributo PISOSALARIALnão se repita em cada objeto da classe FUNCIONARIO,

devemos torná-lo um atributo de classe ao invés de atributo de instância. Para isso devemos aplicar o modificador static na declaração do atributo.

1 class Funcionario 2 {

3 public string nome; 4 public double salario;

5 public static double PisoSalarial; 6

7 public void AumentaSalario(double aumento)

8 {

9 this.salario += aumento; 10 }

11 }

Um atributo de classe deve ser acessado através do nome da classe na qual ele foi declarado.

1 Funcionario.PisoSalarial = 2000;

6.2 Métodos Estáticos

Da mesma forma que definimos métodos para implementar as lógicas que manipulam os valores dos atributos de instância, podemos fazer o mesmo para os atributos de classe.

Suponha que o banco tenha um procedimento para reajustar o piso salarial baseado em uma

taxa. Poderíamos definir um método na classe FUNCIONARIOpara implementar esse reajuste.

1 public void ReajustaPisoSalarial(double taxa) 2 {

3 Funcionario.PisoSalarial += Funcionario.PisoSalarial * taxa; 4 }

O método REAJUSTAPISOSALARIAL() é de instância, ou seja, deve ser invocado a partir da

referência de um objeto da classe FUNCIONARIO. Porém, como o reajuste do piso salarial não

depende dos dados de um funcionário em particular não faz sentido precisar de uma referência

de um objeto da classe FUNCIONARIOpara poder fazer o reajuste.

Neste caso, poderíamos definir o REAJUSTAPISOSALARIAL() como método de classe ao

invés de método de instância através do modificadorSTATIC. Dessa forma, o reajuste poderia

ser executado independentemente da existência de objetos da classe FUNCIONARIO.

1 public static void ReajustaPisoSalarial(double taxa) 2 {

3 Funcionario.PisoSalarial += Funcionario.PisoSalarial * taxa; 4 }

Um método de classe deve ser invocado através do nome da classe na qual ele foi definido.

6.3 Exercícios

1. Crie um projeto no Microsoft Visual C# Express chamado Static.

2. Crie uma classe chamada Conta no projeto STATIC. Defina um atributo de classe para

contabilizar o número de objetos instanciados a partir da classe CONTA. Esse atributo

deve ser incrementado toda vez que um objeto é criado. Você pode utilizar construtores para fazer o incremento.

1 class Conta 2 {

3 // ATRIBUTO DE CLASSE

4 public static int Contador; 5 6 // CONSTRUTOR 7 public Conta() 8 { 9 Conta.Contador++; 10 } 11 }

3. Faça um teste criando dois objetos da classe CONTAe imprimindo o valor do contador

de contas antes, entre e depois da criação dos objetos.

1 class Teste 2 {

3 static void Main()

4 {

5 System.Console.WriteLine("Contador: " + Conta.Contador); 6 Conta c1 = new Conta();

7 System.Console.WriteLine("Contador: " + Conta.Contador); 8 Conta c2 = new Conta();

9 System.Console.WriteLine("Contador: " + Conta.Contador); 10 }

11 }

4. O contador de contas pode ser utilizado para gerar um número único para cada conta.

Acrescente na classe CONTAum atributo de instância para guardar o número das contas

e implemente no construtor a lógica para gerar esses números de forma única através do contador de contas.

1 public class Conta 2 {

3 // ATRIBUTO DE CLASSE

4 public static int Contador; 5

6 // ATRIBUTO DE INSTANCIA

7 public int numero; 8

9 // CONSTRUTOR

10 public Conta() 11 {

12 Conta.Contador++;

13 this.numero = Conta.Contador; 14 }

15 }

5. Altere o teste para imprimir o número de cada conta criada.

1 class Teste 2 {

3 static void Main()

4 {

5 System.Console.WriteLine("Contador: " + Conta.Contador); 6 Conta c1 = new Conta();

7 System.Console.WriteLine("Numero da primeira conta: " + c1.numero); 8

9 System.Console.WriteLine("Contador: " + Conta.Contador); 10 Conta c2 = new Conta();

11 System.Console.WriteLine("Numero da segunda conta: " + c2.numero); 12

13 System.Console.WriteLine("Contador: " + Conta.Contador); 14 }

15 }

6. (Opcional) Defina um método de classe na classe CONTApara zerar o contador e impri-

mir o total de contas anterior.

1 // METODO DE CLASSE

2 public static void ZeraContador() 3 {

4 System.Console.WriteLine("Contador: " + Conta.Contador); 5 System.Console.WriteLine("Zerando o contador de contas..."); 6 Conta.Contador = 0;

7 }

1 class Teste 2 {

3 static void Main()

4 {

5 Conta c1 = new Conta();

6 System.Console.WriteLine("Numero da primeira conta: " + c1.numero); 7

8 Conta c2 = new Conta();

9 System.Console.WriteLine("Numero da segunda conta: " + c2.numero); 10

11 Conta.ZeraContador(); 12 }

13 }

8. (Opcional) Crie uma classe para modelar os funcionários do banco. Defina nessa classe um atributo para armazenar o piso salarial.

9. (Opcional) Faça um teste para verificar o funcionamento do piso salarial. 10. (Opcional) Defina um método para reajustar o piso salarial a partir de uma taxa.

Capítulo 7

Encapsulamento

7.1 Atributos Privados

No sistema do banco, cada objeto da classe FUNCIONARIOpossuiria um atributo para guar-

dar o salário do funcionário que ele representa.

1 class Funcionario 2 {

3 public double salario; 4 }

O atributo SALARIO de um objeto da classe FUNCIONARIO pode ser acessado ou modi-

ficado por código escrito por qualquer classe. Portanto, o controle do atributo SALARIO é

descentralizado dificultando a detecção de erros relacionados à manipulação dos salários dos funcionários.

Para obter um controle centralizado, podemos fazer o atributo SALARIO ser privado na

classe FUNCIONARIO e criar métodos para implementar as lógicas que utilizam o valor desse

atributo.

1 class Funcionario 2 {

3 double salario; 4

5 public void AumentaSalario(double aumento)

6 {

7 // lógica para aumentar o salário

8 }

9 }

Um atributo privado só pode ser acessado ou alterado por código escrito na classe na qual

ele foi definido. Se algum código fora da classe FUNCIONARIOtenta acessar ou alterar o valor

do atributo privadoSALARIO de um objeto da classe FUNCIONARIOum erro de compilação é

gerado.

Definir todos os atributos como privados e métodos para implementar as lógicas de acesso e alteração é quase uma regra da orientação a objetos. O intuito é ter sempre um controle centralizado do dados dos objetos para facilitar a manutenção do sistema.

7.2 Métodos Privados

O papel de alguns métodos de uma classe pode ser auxiliar outros métodos da mesma classe. E muitas vezes, não é correto chamar esses métodos auxiliares diretamente.

Para garantir que métodos auxiliares não sejam chamados por código escrito fora da classe na qual eles foram definidos, podemos fazê-los privados.

1 class Conta 2 {

3 double saldo; 4

5 public void Deposita(double valor)

6 {

7 this.saldo += valor; 8 this.DescontaTarifa();

9 }

10

11 public void Saca(double valor) 12 {

13 this.saldo -= valor; 14 this.DescontaTarifa(); 15 } 16 17 void DescontaTarifa() 18 { 19 this.saldo -= 0.1; 20 } 21 }

No exemplo acima, o método DESCONTATARIFA() é um método auxiliar dos métodos

DEPOSITA() e SACA(). Além disso, ele não deve ser chamado diretamente pois a tarifa só

deve ser descontada quando ocorre um depósito ou um saque.

7.3 Métodos Públicos

Os métodos que devem ser acessados a partir de qualquer parte do sistema devem possuir o modificador de visibilidade public.

1 class Conta 2 {

3 double saldo; 4

5 public void Deposita(double valor)

6 {

7 this.saldo += valor; 8 this.DescontaTarifa();

9 }

10

11 public void Saca(double valor) 12 {

13 this.saldo -= valor; 14 this.DescontaTarifa(); 15 } 16 17 void DescontaTarifa() 18 { 19 this.saldo -= 0.1; 20 } 21 }