Вы находитесь на странице: 1из 136

C#: A Linguagem de Programao

CSharp bsico

por

Prof. Dr. Paulo Roberto Gomes Luzzardi

facebook: Paulo Roberto Gomes Luzzardi


e-mail: pluzzardi@gmail.com e pluzzardi@yahoo.com.br
dropbox: https://www.dropbox.com/sh/kea9kr4j2qttnjg/4xXvw0pvxX?m
Hostinger: http://pluzzardi.zz.mu e http://pluzzardi.w.pw

OS X Server (Apple): http://pluzzardi.no-ip.info:8080

Verso 1.03
07-04-2014

Bibliografia recomendada:

Deitel, Harvey M. and Deitel, Paul J. C# Como Programar. Makron Books,


2003.

Pelotas, segunda-feira, 7 de abril de 2014 (09:40:57 am)


Sumrio

1. Arquitetura de um programa em C# ......................................................................................... 5


1.1 Elementos bsicos de um programa em C# .............................................................. 5
1.2 Elementos bsicos de um mtodo esttico em C#.............................................. 6
1.3 Como compilar um programa em C# via Terminal ................................................ 6
1.4 Como executar um programa em C# via Terminal ................................................ 6
1.5 Pasta contendo os projetos/arquivos em C# ....................................................... 6
2. Estrutura de um programa em C# .............................................................................................. 6
2.1 Identificadores em C# ....................................................................................................... 6
2.2 Comentrios do programador em C# ............................................................................. 7
2.3 Regras gerais para escrever um programa em C#.............................................. 7
2.4 Palavras reservadas do C#.............................................................................................. 8
2.5 Declarao de variveis em C# .................................................................................... 8
2.5.1 Onde as variveis podem ser declaradas em C# ....................................... 8
2.5.2 Inicializao de variveis em C# .................................................................. 10
2.6 Constantes em C# ................................................................................................................. 10
2.6.1 Constantes hexadecimais e octais em C#.................................................... 10
2.6.2 Constantes Strings em C# ..................................................................................... 11
2.6.3 Constantes especiais em C# ................................................................................ 12
2.7 Comandos do pr-processador do C# ........................................................................ 12
2.7.1 O comando using ........................................................................................................... 12
3. Tipos de dados em C# .................................................................................................................... 12
3.1 Tipos bsicos em C# .......................................................................................................... 12
3.2 Escrevendo uma classe em C# ....................................................................................... 13
3.2.1 Conceitos bsicos sobre orientao objetos ......................................... 13
3.2.2 Referncia this em C# ................................................................................................ 19
3.2.3 Lista de Exerccios sobre Classes em C# ..................................................... 20
3.3 Sobrecarga de mtodos em C# ....................................................................................... 31
3.4 Ponteiros, referncias e endereos em C#........................................................ 31
Operadores de ponteiros .......................................................................................................... 33
4. Mtodos de entrada e sada de dados ................................................................................ 33
4.1 Entrada e sada de dados usando TextReader e TextWriter.................... 33
4.2 Entrada e sada de dados utilizando Console ................................................ 34
4.3 Leitura de uma tecla em C# (pausa por teclado) ......................................... 34
5. Operadores em C#.............................................................................................................................. 35
5.1 Operadores aritmticos em C# .................................................................................... 35
5.2 Operadores relacionais em C# .................................................................................... 35
5.3 Operadores lgicos em C# .............................................................................................. 35
5.4 Incremento e decremento em C# .................................................................................. 36
5.5 Operador de atribuio em C# .................................................................................... 36
5.6 Casts em C# ............................................................................................................................. 37
5.7 Expresses em C# ................................................................................................................. 38
6. Mtodos para funes matemticas padres em C#...................................................... 38
6.1 Math.Abs .................................................................................................................................... 38
6.2 Math.Asin .................................................................................................................................. 38
6.3 Math.Acos .................................................................................................................................. 38
6.4 Math.Atan .................................................................................................................................. 39
6.5 Math.Sin .................................................................................................................................... 39
6.6 Math.Cos .................................................................................................................................... 39
6.7 Math.Tan .................................................................................................................................... 39
6.8 Math.Exp .................................................................................................................................... 39
6.9 Math.Pow .................................................................................................................................... 39
6.10 Math.Sqrt................................................................................................................................ 39
6.11 Math.Log .................................................................................................................................. 39
6.12 Convert.ToDouble ............................................................................................................... 40

2
6.13 Convert.Int?? (16, 32 ou 64) .................................................................................. 40
6.14 Convert.ToByte.................................................................................................................... 40
6.15 Math.Log10 ............................................................................................................................. 40
6.16 Random ....................................................................................................................................... 40
6.17 Math.PI .................................................................................................................................... 40
6.18 Converso de graus para radianos ........................................................................ 41
7. Comandos em C# .................................................................................................................................. 41
7.1 Tipos de comandos em C# ................................................................................................ 41
7.1.1 Sequncia em C# ........................................................................................................... 41
7.1.2 Seleo em C#................................................................................................................ 41
7.1.3 Repetio em C# ........................................................................................................... 43
7.2 Comando if em C# ................................................................................................................. 43
7.2.1 if encadeados em C# ................................................................................................. 44
7.3 O comando switch em C# ................................................................................................... 45
7.4 Comando while no C# .......................................................................................................... 48
7.5 O comando for no C# .......................................................................................................... 50
7.6 O loop do { } while no C#............................................................................................ 52
7.7 Interrupo de loops em C# ......................................................................................... 52
7.7.1 O comando break em C# ............................................................................................ 52
7.7.2 O comando continue no C# ..................................................................................... 53
7.8 O mtodo Environment.Exit () .................................................................................... 54
8. Sada formatada com String.Format ..................................................................................... 54
9. Lista de exerccios (comandos) ............................................................................................ 57
10. Vetores, Matrizes e Strings em C# .................................................................................. 60
10.1 Vetores em C# ...................................................................................................................... 61
10.2 Strings em C# ...................................................................................................................... 62
10.3 Matrizes (Multidimensional) em C# ...................................................................... 63
10.4 Vetor de Strings em C# ................................................................................................ 64
10.5 Inicializao de matrizes e vetores em C# ................................................... 65
10.6 Inicializao de um vetor de caracteres em C# ......................................... 65
10.7 Inicializao de matrizes multidimensionais em C#................................ 65
10.8 Inicializao de vetores e matrizes sem tamanho em C# ...................... 65
10.9 Classificao de dados ou ordenao (sort) em C# .................................. 67
10.10 Lista de exerccios (vetores) ............................................................................. 69
11. Manipulao de Strings em C# .............................................................................................. 72
11.1 Mtodos para manipular Strings em C# ............................................................... 72
11.2 Lista de exerccios (Strings)................................................................................ 74
12. Mtodos estticos definidos pelo programador em C#.......................................... 76
12.1 Valores de retorno em C#............................................................................................ 77
12.2 Passagem de parmetros por valor em C# .......................................................... 80
12.3 Passagem de parmetros por refernciaem C# ................................................ 80
12.4 Mtodos que devolvem valores no-inteiros em C# .................................... 82
12.5 Argumentos do Main (String [] args) em C# ................................................... 82
12.6 Recursividade em C#........................................................................................................ 84
12.7 Lista de Exerccios (mtodos)................................................................................ 86
13. Classes existentes em C# ........................................................................................................ 88
13.1 Object (classe base de objetos) em C# ............................................................ 89
13.2 List (lista tipada de objetos) em C# ............................................................... 89
13.3 ArrayList (lista de arrays) em C# ...................................................................... 91
13.4 IList (lista de objetos indexados) em C# ..................................................... 92
13.5 Stack (Pilha) em C#........................................................................................................ 93
13.6 Queue (Fila) em C# .......................................................................................................... 94
14. Entrada e sada em disco (Arquivos) em C# ............................................................... 95
14.1 Mtodos para manipular arquivos em C# ............................................................ 95
14.2 Abertura de um arquivo texto em C#.................................................................... 95
14.3 Listar um diretrio em C# ......................................................................................... 96

3
14.4 Manipulao de um arquivo texto de palavras em C#................................ 98
14.5 Arquivo Texto em C#...................................................................................................... 101
14.6 Lista de exerccios (arquivos) ........................................................................... 105
14.7 Arquivos binrios em C# ............................................................................................ 109
15. Conceitos diversos em C# ...................................................................................................... 111
15.1 Operadores bit a bit em C# ..................................................................................... 111
15.2 Formas abreviadas de C# ............................................................................................ 112
16. Listas Lineares: Pilha, Fila e Fila Circular em C#........................................ 112
16.1 Implementao de um lista em vetor em C# ................................................... 113
16.2 Implementao de uma Pilha em C# ...................................................................... 116
16.3 Implementao de uma Fila em C# ......................................................................... 118
16.4 Implementao de uma Fila Circular em C# ................................................... 119
17. Tratamento de erros em C#.................................................................................................... 121
17.1 Tratamento de excees em C# ................................................................................ 122
17.2 Tratamento de erros na entrada de nmero inteiro em C#.................. 122
17.3 Tratamento de erros: Diviso por zero em C# ............................................ 123
18. Herana em C# ................................................................................................................................ 124
18.1 Herana simples em C# ................................................................................................. 124
18.2 Controle de acesso na definio de uma classe derivada em C# ... 125
18.3 Tipos de acessos (especificadores de acesso) em C# ........................... 126
18.4 Lista de exerccios sobre Herana em C#...................................................... 128
18.4.1 Herana (primeiro) em C# ..................................................................................... 128
18.4.2 Herana (segundo) em C# ....................................................................................... 129
18.4.3 Herana (terceiro) em C# ..................................................................................... 130
19. Coletor de Lixo (Garbage Collector) em C# ............................................................. 132
20. Construtor e finalizador em C#........................................................................................ 133
21. Data e Hora em C# ....................................................................................................................... 135
22. Eliminar problemas na converso na entrada de dados ..................................... 135

4
1. Arquitetura de um programa em C#

1.1 Elementos bsicos de um programa em C#


using diretiva;

namespace nomePrograma
{
class nome_da_classe
{

public static void Main(string[] args) // mtodo principal


{
corpo_da_classe;
}
}
}

Exemplos:

// -------------------------------------------- Fonte: ProgA.cs

using System;

namespace ProgA
{
class MainClass
{
public static void Main (string[] args)
{
float x = 3, y = 4, t = x + y;

Console.WriteLine ("Soma: " + t); // imprimir na tela


}
}
}

Resultado do Programa:

Soma: 7

// -------------------------------------------- Fonte: ProgB.cs

using System;

namespace ProgB
{
class MainClass
{
public static void Main (string[] args)
{
float x, y, t;

Console.Write ("x = ");


x = float.Parse (Console.ReadLine()); // ler do teclado
Console.Write ("y = ");
y = float.Parse (Console.ReadLine()); // ler do teclado
t = x + y;
Console.WriteLine ("Soma: {0}", t); // forma alternativa de imprimir na tela
}
}
}

Resultado do Programa:

x = 3
y = 4
Soma: 7

Programa Fonte: nome_da_classe.cs // ProgA.cs e ProgB.cs

5
1.2 Elementos bsicos de um mtodo esttico em C#
static tipo_de_retorno nome_do_mtodo(tipo_do_agumento nome_do_argumento, ...)
{
corpo_do_mtodo;
return(valor_de_retorno);
}

1.3 Como compilar um programa em C# via Terminal

$ gmcs Prog1.cs <enter> // gera o arquivo Prog1.exe


$

1.4 Como executar um programa em C# via Terminal

$ mono Prog1.exe <enter>


$

1.5 Pasta contendo os projetos/arquivos em C#


/Users/pluzzardi/Projects // MacOsX

2. Estrutura de um programa em C#

2.1 Identificadores em C#

So os nomes criados pelo programador para fazer referncia a


namespaces, variveis, constantes, argumentos, atributos e mtodos.

Regras para a criao de identificadores:

O primeiro caracter pode ser uma letra ou sublinha ( _ );


Os caracteres seguintes devem ser letras, nmeros ou sublinhas;
No permitido a utilizao de caracteres em branco (caracter
espao);
Podem ser letras maisculas e minsculas.

Exemplos em variveis: int numeroDentes = 32;


double inflacao;
char a, _a;

Exemplos em constantes: final char letra = A;


final int tamanho = 10;
final double d = 123.45;

Exemplos de argumentos: public int Div(int x, int y) {


public bool strChr(String s, char ch) {

Exemplos de atributos: private int numElementos;


private int []vetor;
private int topo;

Exemplos em mtodos: x = raizQuadrada(y);


Console.WriteLine(Valor: {0}, inverso(n));

Observao: o mtodo inverso definido pelo programador (1/n).

6
2.2 Comentrios do programador em C#

Os comentrios do programador so linhas de cdigo que no so


compiladas pelo compilador, ou seja, servem apenas como anotaes
(documentao) para serem lembradas mais tarde (por exemplo, quando
forem feitas manutenes no programa). Em C# os comentrios podem ser
feitos de duas formas:

/* Assim pode ser usado para comentrio de vrias linhas */


// Isto um comentrio de uma linha apenas

Um comentrio, pode ainda, utilizar vrias linhas do programa.


Veja o exemplo abaixo:

/* ----------------------------------------------------
Mtodo: STRING
Argumentos de entrada: x, y
Argumentos de sada: c[], t[]
Retorno: Sem Retorno
------------------------------------------------------- */

2.3 Regras gerais para escrever um programa em C#

Um programa em CSharp constitudo de uma ou mais classes


delimitadas por chaves { }, onde uma destas classes, obrigatoriamente
possui um mtodo chamada Main(). As principais regras so:

Letras maisculas e minsculas so tratadas como caracteres diferentes;


O formato do texto livre;
O mtodo Main(){} especifica onde o programa comea e termina de ser
executado;
Todos os comandos so terminados por ponto e vrgula;
Todas as variveis devem ser declaradas;
{ mtodo comea a ser executado;
} mtodo termina de ser executado.

Programa exemplo: Imprimir a data no seguinte formato: [Data:


dd/mm/aaaa].

// -------------------------------------------- Fonte: Prog1.cs

using System;

namespace Prog1
{
class MainClass
{
public static void Main (string[] args)
{
int dia, mes, ano;

dia = 16;
mes = 11;
ano = 2013;
// Console.WriteLine ("Data: " + dia + "/" + mes + "/" + ano); // forma alternativa de imprimir na tela
Console.WriteLine ("Data: {0}/{1}/{2}", dia, mes, ano);
}
}
}

Resultado do Programa:

Data: 16/11/2013

7
2.4 Palavras reservadas do C#

As palavras reservadas no podem ser utilizadas como identificadores


pelo programador para nomes de namespaces, variveis, constantes, argumentos,
atributos ou mtodos.

abstract event new struct


as explicit null switch
base extern object this
bool false operator throw
break finally out true
byte fixed override try
case float params typeof
catch for private uint
char foreach protected ulong
checked goto public unchecked
class if readonly unsafe
const implicit ref ushort
continue in return using
decimal int sbyte virtual
default interface sealed volatile
delegate internal short void
do is sizeof while
double lock stackalloc
else long static
enum namespace string

Palavras reservadas no especficas ao C#

from join select yield


get let set group
orderby value into partial

2.5 Declarao de variveis em C#

Sintaxe: tipo_dado_base lista_de_variveis;

tipo_dado_base: deve ser um tipo de dado vlido (bool, byte, sbyte,


char, decimal, double, float, int, uint, long, ulong, object, short,
ushort e String)
lista_de_variveis: um ou mais identificadores separados por vrgulas.

Exemplos:

int i, j ,k;
float a, b;
char ch;

2.5.1 Onde as variveis podem ser declaradas em C#

Definidas fora de todas os mtodos, incluindo o mtodo Main()


so chamadas de variveis globais e podem ser acessadas em
qualquer parte do programa. Estas variveis so alocadas
estaticamente na memria RAM (Random Access Memory Memria de
acesso randmico).
Quando definidas dentro de um mtodo so chamadas de variveis
locais e s podem ser acessadas dentro deste mtodo. Estas
variveis so alocadas dinamicamente na memria RAM.
Na declarao de parmetros formais (argumentos) de um mtodo.
Sendo estas locais e alocadas dinamicamente na memria RAM.

Observao: Memria ROM (Read Only Memory Memria somente de leitura).

8
Alocao de memria: Forma de reservar espao de memria (RAM) para
alocar uma informao (esttica ou dinmica).

Alocao esttica de memria: Tipo de alocao de memria em que


uma varivel alocada (tem um espao reservado) na memria RAM
durante toda a execuo do programa. Este espao de memria
desalocado somente quando o programa acaba.
Alocao dinmica de memria: Tipo de alocao de memria em que
uma varivel alocada (tem um espao reservado) na memria RAM
temporariamente. Este espao de memria desalocado quando o
espao no mais necessrio (coleta automtica de lixo garbage
collector).

Coletor de lixo explcito em C#: GC.Collect();

Programa exemplo: O programa realiza uma operao de potncia Xy.

// -------------------------------------------- Fonte: Prog2.cs

using System;

namespace Prog2
{

class MainClass
{
static double resultado; // varivel global

// ---------------------------------- mtodo esttico POTENCIA

static double POTENCIA (double x, double y)


{
// corpo do mtodo POTENCIA definido pelo programador
// os argumentos x e y so variveis locais

// definio de uma varivel local


double resp;

resp = Math.Exp (Math.Log (x) * y);


return(resp); // retorno do mtodo
}

public static void Main(String[] args)


{

// definio das variveis locais


double Base, Expoente;

// mtodo que permite imprimir na tela em modo texto


Console.Write ("Base: ");

// mtodo que permite entrada de dados via teclado em terminal texto


String s = Console.ReadLine ();

// mtodo que converte String em float


Base = float.Parse (s);

Console.Write ("Expoente: ");


s = Console.ReadLine ();
Expoente = float.Parse (s);

// chamada do mtodo POTENCIA


resultado = POTENCIA (Base, Expoente);

// mtodo que imprime a resposta na tela


Console.WriteLine ("Resposta = {0}\n", resultado);
}
}
}

9
Resultado do Programa:

Base: 3
Expoente: 4
Resposta = 81

Variveis globais: resultado


Variveis locais: base, expoente, resp, x, y

Compilar por linha de comandos (via terminal):

$ gmcs Prog2.cs <enter> // gera arquivo Prog2.exe


$

Executar por linha de comandos (via terminal):

$ mono Prog2.exe <enter> // executa o arquivo Prog2.exe

2.5.2 Inicializao de variveis em C#

Em CSharp possvel fornecer valores iniciais a maioria das


variveis ao mesmo tempo em que elas so declaradas, colocando um
sinal de igual e uma constante aps o nome da varivel.

tipo_dado_base nome_da_varivel = constante;


Exemplos:

char ch = 'a'; // tipo_dado_base nome_da_varivel = constante_caracter


String s = Pelotas; // tipo_dado_base nome_da_varivel = constante_string
int n = 0; // tipo_dado_base nome_da_varivel = constante_inteira
float y = 123.45f; // tipo_dado_base nome_da_varivel = constante_real
double z = 123.45;
int [] v = {10, 20, 30}; // vetor unidimensional
int [,] t = {{1, 2}, {3, 4}, {5, 6}}; // matriz bidimensional
String [] cidade = {Pelotas, Rio Grande, Poa};
char [] caracter = {S, s, N, n};

2.6 Constantes em C#

Valores fixos que o programa no pode alterar. As constantes


podem ser de qualquer tipo bsico.

Tipo Exemplos de constantes

char 'a' 'n' '9'


int 1 123 2100 -234
float 123.23 4.34e-3
String "CSharp" (classe String)

Forma de declarar uma constante tipada em C#:

const int numeroElementos = 10;


const char ch = 'A';
const float f = 1.234f;

2.6.1 Constantes hexadecimais e octais em C#

A linguagem de programao CSharp permite especificar constantes


inteiras em octal. Uma constante octal comea com um 0 (zero) antes
dos demais nmeros.

Exemplos:

int hexadecimal = 0xf; // 15 em decimal


int octal = 011; // 9 em decimal

10
Observaes:

Qualquer nmero octal formado por oito nmeros ( 0 .. 7 ).


Qualquer nmero hexadecimal formado por dezesseis nmeros (0
..9, A, B, C, D, E, F).

// ------------------------------------------------------- Fonte: Hexadecimal.cs

using System;

namespace Hexadecimal
{
class MainClass
{
public static void Main (string[] args)
{
for (int valorDecimal = 0;valorDecimal < 16; valorDecimal++) {
string valorHexadecimal = valorDecimal.ToString("X");
Console.WriteLine ("Hexadecimal: "+ valorHexadecimal);
// int hexaToDecimal = int.Parse(valorHexadecimal, System.Globalization.NumberStyles.HexNumber);
// Console.WriteLine("Hexadecimal para Decimal: " + hexaToDecimal);
}
}
}
}

Resultado do Programa:

Hexadecimal: 0
Hexadecimal: 1
Hexadecimal: 2
Hexadecimal: 3
Hexadecimal: 4
Hexadecimal: 5
Hexadecimal: 6
Hexadecimal: 7
Hexadecimal: 8
Hexadecimal: 9
Hexadecimal: A
Hexadecimal: B
Hexadecimal: C
Hexadecimal: D
Hexadecimal: E
Hexadecimal: F

2.6.2 Constantes Strings em C#

Uma String um conjunto de caracteres delimitados por aspas


duplas. Em C# existe uma classe especfica para trabalhar com Strings
(classe String).

Uma String finalizada pelo caracter especial \0 (chamado de


null).

Exemplo: String s = "Senac";


\0 igual a null
0 1 2 3 4 5
S e n a c null
Figura 1: String
Memria ocupada: 6 bytes

Observao: 'a' diferente de "a"

'a' ocupa 1 byte na memria RAM ( do tipo char)


"a" ocupa 2 bytes na memria (toda String terminada com o caracter null)

A palavra null quer dizer nulo.

11
Vetor de Strings:

String [] s = {Paulo, Roberto, Gomes, Luzzardi};

Vetor de caracteres:

char [] s = {'U', 'C', 'P', 'e', 'l'}; char ch = \0;

2.6.3 Constantes especiais em C#

As constantes especiais so usadas para representar caracteres


que no podem ser inseridos pelo teclado. So elas:
Tabela 1: Constantes especiais
Constante Significado
\b Retrocesso
\f Alimentao de formulrio
\n Nova linha
\r Retorno de carro <CR>
\t Tab horizontal
\ Aspas duplas
\ Aspas simples
\\ Barra invertida
\o Constante octal
\x Constante hexadecimal

2.7 Comandos do pr-processador do C#

2.7.1 O comando using

O comando using faz o compilador incluir um pacote de classes


dentro do programa fonte. Cada pacote possui diversas classes.

using System;

Na URL abaixo voc encontra as diversas api C#:


URL: http://msdn.microsoft.com/en-us/library/d11h6832%28v=vs.71%29.aspx

3. Tipos de dados em C#

3.1 Tipos bsicos em C#

A tabela abaixo exibe os quinze (15) tipos de dados bsicos que


podem ser utilizados pelo programador para definir suas variveis e
constantes em C#. Na Tabela 2 so exibidos os tipos bsicos, a faixa
de valores vlida, a quantidade de bits, e o tipo de framework (using)
que cada tipo de dados ocupa ou representa na memria RAM (memria
principal) ou em disco (quando armazenados na memria secundria).

Tabela 2: Tipos de dados

Tipo Faixa de valores Bits bytes Tipo de FrameWork


bool verdadeiro ou falso System.Boolean
byte 0 255 8 1 System.Byte
sbyte -128 127 8 1 System.SByte
char um caracter 16 2 System.Char
decimal 1.0 1028 7.9 1028 128 16 System.Decimal
double 5.0 10324 1.7 10308 64 8 System.Double
float 1.5 1045 3.4 1038 32 4 System.Single
int -2147483648 2147483647 32 4 System.Int32
uint 0 4294967295 32 4 System.UInt32

12
long 9223372036854775808 64 8 System.Int64
9223372036854775807
ulong 0 18446744073709551615 64 8 System.UInt64
object qualquer tipo System.Object
short 32768 32767 16 2 System.Int16
ushort 0 65535 16 2 System.UInt16
string Seqncia de caracteres 16 2 System.String
(cada)

3.2 Escrevendo uma classe em C#

3.2.1 Conceitos bsicos sobre orientao objetos

O paradigma orientado objetos possui cinco componentes


bsicos: objetos (possui atributos e mtodos), mensagens (chamada dos
mtodos), classes (tipo de dado), instncias (criao de objetos de
uma classe especfica - new) e mtodos (funes definidas pelo
programador que manipulam os atributos).

Objetos, mensagens, classes, instncias e mtodos

Objetos so entidades lgicas que contm atributos (dados


armazenados em variveis) e mtodos (funes) que manipulam estes
dados. Um objeto pode ser definido atravs de um tipo de dado chamado
classe (class).

Resumo:

a) Atributos: So as variveis definidas e declaradas para cada


objeto.
b) Mtodos: So as funes definidas pelo programador que serviro
para manipular os atributos.
c) Mensagens: So as chamadas dos mtodos.
d) Classe: um tipo de dado definido por class. Uma classe no
um objeto, sim uma descrio do objeto.
e) Instncia: Os objetos so instncias de uma classe, ou seja,
criado um objeto pertencente a uma classe especfica. O objeto
pode responder chamadas dos mtodos e armazenar informaes nos
atributos.

Resumidamente, objetos so instncias de classes que respondem


as mensagens atravs dos mtodos escritos pelo programador.

Uma linguagem de programao orientada objetos pode suportar


ou implementar seis propriedades: abstrao, encapsulamento,
polimorfismo, herana, associao (agregao e composio) e classes
abstratas e concretas.

Exemplo de uma classe Vetor em C#:

// -------------------------------------------------------- Prog3.cs

using System;

namespace Prog3
{
public class Vetor
{
// -------------------------- atributos

private int[] vetor;


private int n;
private int max;

13
// ------------------------------ construtor

public Vetor(int tam) // obrigado o modificador de acesso public


{
max = tam;
vetor = new int[max];
n = 0;
}

// ------------------------------ add

public void add(int valor)


{
if (n < max) {
vetor[n] = valor;
n++;
} else {
Console.WriteLine("Erro: Vetor excedeu Limite");
}
}

// ------------------------------ exibe

public void exibe()


{
Console.Write("Vetor: [");
for (int i = 0; i < n; i++) {
Console.Write(vetor[i] + " ");
}
Console.WriteLine("]");
}
}
}

// ----------------------------------------------- Prog3.cs

using System;

namespace Prog3
{
class MainClass
{
public static void Main (string[] args)
{
Vetor v = new Vetor (5); // declarao do objeto v da classe Vetor

v.add (10);
v.add (20);
v.add (30);
v.add (40);
v.add (50);
v.exibe ();
v.add (60); // testar o limite do vetor de 5 elementos
v.exibe ();
}
}
}

Resultado do Programa:

Vetor: [10 20 30 40 50 ]
Erro: Vetor excedeu Limite
Vetor: [10 20 30 40 50 ]

Tente implementar os seguintes mtodos para a classe Vetor:

v.remove();
v.exibe();
Console.WriteLine("Total de Elementos: " + v.length());
int pri = v.primeiro();
Console.WriteLine("Primeiro: " + pri);
int ult = v.ultimo();
Console.WriteLine("ltimo: " + ult);
int elemento = 20;

14
bool flag = v.existe(elemento);
if (flag) {
Console.WriteLine("Status: Existe elemento 20");
} else {
Console.WriteLine("Status: No Existe elemento 20");
}
v.removeElemento(elemento);
flag = v.existe(elemento);
if (flag) {
Console.WriteLine("Status: Existe elemento " + elemento);
} else {
Console.WriteLine("Status: No Existe elemento " + elemento);
}
v.exibe();
v.removePosicao(1);
v.exibe();

Resultado do Programa:

Vetor: [10 20 30 40 50 ]
Erro: Vetor excedeu Limite
Vetor: [10 20 30 40 50 ]
Vetor: [10 20 30 40 ]
Total de Elementos: 4
Primeiro: 10
ltimo: 40
Status: Existe elemento 20
Status: No Existe elemento 20
Vetor: [10 30 40 ]
Vetor: [10 40 ]

// -------------------------------------------------------- Prog3a.cs

using System;

namespace Prog3a
{
class MainClass
{
public static void Main (string[] args)
{
Vetor v = new Vetor (5);

v.add (10);
v.add (20);
v.add (30);
v.add (40);
v.add (50);
v.exibe ();
v.add (60); // testa o limite do vetor de 5 elementos
v.exibe ();
v.remove();
v.exibe();
Console.WriteLine("Total de Elementos: " + v.length());
int pri = v.primeiro();
Console.WriteLine("Primeiro: " + pri);
int ult = v.ultimo();
Console.WriteLine("ltimo: " + ult);
int elemento = 20;
bool flag = v.existe(elemento);
if (flag) {
Console.WriteLine("Status: Existe elemento 20");
} else {
Console.WriteLine("Status: No Existe elemento 20");
}
v.removeElemento(elemento);
flag = v.existe(elemento);
if (flag) {
Console.WriteLine("Status: Existe elemento " + elemento);
} else {
Console.WriteLine("Status: No Existe elemento " + elemento);
}
v.exibe();
v.removePosicao(1);
v.exibe();

15
}
}
}

Soluo do Problema:

using System;

namespace Prog3a
{
public class Vetor
{
// -------------------------- atributos

private int[] vetor;


private int n;
private int max;

// ------------------------------ construtor

public Vetor(int tam) // obrigado o modificador de acesso public


{
max = tam;
vetor = new int[max];
n = 0;
}

// ------------------------------ add

public void add(int valor)


{
if (n < max) {
vetor[n] = valor;
n++;
} else {
Console.WriteLine("Erro: Vetor excedeu Limite");
}
}

// ------------------------------ remove

public void remove()


{
if (n > 0) {
n--;
} else {
Console.WriteLine("Erro: Vetor vazio");
}
}

// ------------------------------ removeElemento

public void removeElemento(int num)


{
if (n == 0) {
Console.WriteLine ("Erro: Vetor vazio");
} else {
for (int i = 0; i < n; i++) {
if (num == vetor[i]) {
for (int j = i; j < n; j++) {
vetor [j] = vetor [j + 1];
}
n--;
break;
}
}
}
}

// ------------------------------ removePosicao

public void removePosicao(int pos)


{
int fim = length ();
if (pos < 0 || pos > fim) {

16
Console.WriteLine ("Erro: Posio Invlida");
} else {
for (int i = pos; i < n; i++) {
vetor [i] = vetor [i + 1];
}
n--;
}
}

// ------------------------------ exibe

public void exibe()


{
Console.Write("Vetor: [");
for (int i = 0; i < n; i++) {
Console.Write(vetor[i] + " ");
}
Console.WriteLine("]");
}

// ------------------------------- length

public int length()


{
return(n);
}

// ------------------------------- primeiro

public int primeiro()


{
return(vetor[0]);
}

// ------------------------------- ultimo

public int ultimo()


{
return(vetor[n-1]);
}

// ------------------------------- existe

public bool existe(int num)


{
bool exist = false;

for (int i = 0; i < n; i++) {


if (num == vetor[i]) {
exist = true;
break;
}
}
return(exist);
}
}
}

Resultado do Programa:

Vetor: [10 20 30 40 50 ]
Erro: Vetor excedeu Limite
Vetor: [10 20 30 40 50 ]
Vetor: [10 20 30 40 ]
Total de Elementos: 4
Primeiro: 10
ltimo: 40
Status: Existe elemento 20
Status: No Existe elemento 20
Vetor: [10 30 40 ]
Vetor: [10 40 ]

Uma linguagem de programao, orientada objetos, pode suportar


e/ou implementar seis (6) propriedades: abstrao, encapsulamento,

17
polimorfismo, herana, associao (agregao e composio) e classes
abstratas e concretas.

Abstrao

Objetos devem representar dados do mundo real.

Encapsulamento (encapsulao)

Os objetos possuem internamente atributos e mtodos agrupados no


mesmo local, onde os mtodos manipulam os atributos. Esta
caracterstica protege os dados (atributos) de alteraes indevidas,
somente os membros da classe podem acessar os atributos, desde que
eles sejam privados (private) ou protegidos (protected) (caso das
classes derivadas, que herdam o direito de acesso aos atributos).

Polimorfismo (grego: muitas formas)

a capacidade de objetos diferentes reagirem segundo a sua


funo a uma ordem padro. Significa que o nome de um objeto pode ser
utilizado para vrios propsitos ligeiramente diferentes, ou seja,
... uma interface, vrios mtodos ... . A caracterstica de
polimorfismo utilizada principalmente na sobrecarga de mtodos,
sobrecarga de operadores e nas classes abstratas, onde os mtodos so
declarados mas no definidos. Como tipos de polimorfismo tem-se: (a)
Universal (incluso [como em Java, por exemplo, List lista = new
LinkedList();] e paramtrico [templates como em C++]) e (b) ad-hoc
(sobrecarga de mtodos e operadores).

Sobrecarga de operador: Permite sobrecarregar operadores para


realizar diferentes tipos de operaes;

Sobrecarga de mtodo: Permite que um mtodo retorne diferentes


tipos de informaes e aceite argumentos de vrios tipos,
inclusive com quantidade diferentes de argumentos;

Classes abstratas e concretas: Permite representar entidades e


conceitos abstratos, sendo sempre uma superclasse (ou classe
Base) e no permite ser instanciada, a classe abstrata apenas
define um modelo (template) para uma funcionalidade e fornece
uma implementao incompleta que herdada pelas classes
derivadas. Cada classe derivada implementa as funcionalidades da
classe abstrata. Uma classe abstrata pode possuir mtodos
abstratos, mas os mtodos so escritos nas classes derivadas
concretas. Mtodos abstratos definem apenas a forma do mtodo
no contendo nenhum tipo de cdigo. Classes concretas
implementam todos os mtodos e podem ser instanciadas.

Herana

o processo pelo qual uma classe de objetos pode adquirir as


propriedades de outra classe de objetos, em outras palavras, um objeto
herda as caractersticas de outro (herana simples) ou vrios objetos
(herana mltipla). A classe Base chamada de superclasse, enquanto a
classe derivada pode ser chamada de subclasse.

Associao

um vnculo que permite que objetos de uma ou mais classes se


relacionem entre si. Esta associao pode ser: unria (o vnculo

18
entre objetos da mesma classe), binria (vnculo ocorre entre dois
objetos de classes diferentes) ou mltipla (vnculo ocorre entre mais
de 2 objetos de classes diferentes). Cada associao pode possuir
caractersticas de (a) cardinalidade ou multiplicidade (indica quantos
objetos so possveis em cada associao) e (b) navegao (existe a
possibilidade dos objetos acessarem outros objetos da mesma
associao).
Uma associao pode ser de duas formas: agregao
(Relacionamento com caractersticas onde existe um grau menos intenso
de coeso entre os elementos, pode haver um certo grau de
independncia) ou composio (relacionamento com caractersticas onde
existe um alto grau de coeso e total grau de dependncia entre os
elementos).

Classes Abstratas e Concretas

Criada para representar entidades e conceitos abstratos. Uma


classe abstrata sempre uma superclasse ou classe base que no possui
instncias. Ela define apenas o modelo (como um template em C++) para
uma funcionalidade e fornece uma implementao incompleta chamada de
parte genrica sendo compartilhada por um conjunto de classes
derivadas ou subclasses. As classes derivadas completam as funcionali-
dades da classe abstrata anexando um comportamento especfico. Classes
abstratas possuem mtodos abstratos. Esses mtodos so implementados
nas suas classes derivadas concretas com o objetivo de definir o
comportamento especfico. O mtodo abstrato define apenas a assinatura
do mtodo no contendo nenhum cdigo. Classes concretas implementam
seus mtodos e permitem instanciar objetos. Classes concretas no
possuem mtodos abstratos quando so classes derivadas de uma classe
abstrata.

Vantagens da Orientao a Objetos: (a) reutilizao de cdigo, (b)


proteo aos dados; (c) organizao ou estruturao dos dados em forma
de classes e objetos; (d) sobrecarga de mtodos e de operadores; (e)
criao de pacotes de classes; (f) ter um conjunto de pacotes pr-
definidos e (g) permitir ao desenvolvedor criar seus prprios pacotes.

Em C#, o programador pode criar suas prprias classes. Uma


classe possui duas partes distintas: atributos (variveis) e mtodos
(funes ou procedimentos) que manipulam estes atributos.

3.2.2 Referncia this em C#

Em C#, quando um mtodo de uma classe chamado, passado


automaticamente um argumento que uma referncia para o objeto que
gerou a chamada. Esta referncia chamada this, ou seja, a
referncia this referencia o objeto que chamou o mtodo.
Cada objeto tem acesso a uma referncia a ele prprio, chamada
this. Esta referncia faz referncias aos atributos e mtodos de um
objeto.

Exemplo da utilizao da referncia this em C#:

// -------------------------------------------------------- Data.cs

using System;

namespace Prog4
{
public class Data
{
// ------------------------------- atributos

19
private int dia, mes, ano;

// ------------------------------- construtor

public Data(int dia, int mes, int ano) {


this.dia = dia;
this.mes = mes;
this.ano = ano;
}

public String toString()


{
String data = "Data: " + String.Format("{0:00}", dia) + "/";
data = data + String.Format ("{0:00}", mes) + "/";
data = data + String.Format ("{0:0000}", ano) ;
return(data);
}
}
}

// ----------------------------------------------------------- Prog4.cs

using System;

namespace Prog4
{
class MainClass
{
public static void Main (string[] args)
{
Data data = new Data(7, 6, 2013);

Console.WriteLine (data.toString ());


}
}
}

Resultado do Programa:

Data: 07/06/2013

3.2.3 Lista de Exerccios sobre Classes em C#

3.2.3.1 Dado o seguinte programa principal, implemente a classe


Circulo e seus mtodos:

// ------------------------------------------ TestaCirculo.cs

using System;

namespace TestaCirculo
{
class MainClass
{
public static void Main (string[] args)
{
Circulo circ = new Circulo();

circ.setaRaio(3);
circ.calculaArea();
double area = circ.getArea();
Console.WriteLine("rea: " + area);
}
}
}
2
Observao: area = pi . raio onde pi 3.1416

Crculo
double area, raio
setaRaio
calculaArea

20
getArea
Diagrama de classe

3.2.3.2 Dado o seguinte programa principal, implemente a classe


PesoIdeal e seus mtodos:

// --------------------------------------------- Peso.cs

using System;

namespace Peso
{
class MainClass
{
public static void Main (string[] args)
{
PesoIdeal piHomem = new PesoIdeal('H', 1.67);
PesoIdeal piMulher = new PesoIdeal('m', 1.65);

piHomem.calculaPesoIdeal();
Console.WriteLine("Peso Ideal Homem: " + piHomem.getPesoIdeal());

piMulher.calculaPesoIdeal();
Console.WriteLine("Peso Ideal Mulher: " + piMulher.getPesoIdeal());
}
}
}

Resultado do Programa:

Peso Ideal Homem: 63,41


Peso Ideal Mulher: 57,77

Clculo do Peso Ideal:

PIH = 72,7 x altura 58


PIM = 62,1 x altura 44,7

PesoIdeal
double altura, pi
char sexo
calculaPesoIdeal
getPesoIdeal
Diagrama de classe

3.2.3.3 Dado o seguinte programa principal, implemente a classe


CPF e seus mtodos:

// --------------------------------------------------------------- ValidaCPF.cs

using System;

namespace ValidaCPF
{
class MainClass
{
public static void Main (string[] args)
{
String s = "123456789";
CPF cpf = new CPF(s);

int digitoVerificador = cpf.verificaCPF();


Console.WriteLine("Digito verificador: {0:00} ", digitoVerificador);
Console.WriteLine("CPF: {0}-{1:00}", s , digitoVerificador);
}
}
}

Resultado do Programa:

Digito verificador: 09
CPF: 123456789-09

21
CPF
String cpf
int digito
verificaCPF
Diagrama de classe

Como calcular os Dgitos do CPF:

Entrada: CPF: 123456789

1) Primeiramente pega-se os dgitos da base do CPF e se faz a soma da multiplicao


individual dos dgitos, iniciando por 10 e indo at 2 como exemplificado abaixo:

1 2 3 4 5 6 7 8 9
x x x x x x x x x
10 9 8 7 6 5 4 3 2
-- -- -- -- -- -- -- -- --
10 + 18 + 24 + 28 + 30 + 30 + 28 + 24 + 18 = 210

2) O valor do primeiro dgito o resultado da subtrao de 11 pelo resto da diviso da


soma acima por 11. Se este valor for 10 ou 11, o dgito 0 (zero), do contrrio o
prprio valor. No exemplo em questo o dgito encontrado calculado conforme v-se a
seguir:

11 - (210 % 11) = 10

3) O clculo do segundo dgito feito da mesma forma que o primeiro, porm com os 9
dgitos da base do CPF e o primeiro dgito verificador encontrado, iniciando por 11 e
indo at 2.

1 2 3 4 5 6 7 8 9 0
x x x x x x x x x x
11 10 9 8 7 6 5 4 3 2
-- -- -- -- -- -- -- -- -- --
11 + 20 + 27 + 32 + 35 + 36 + 35 + 32 + 27 + 0 = 255

4) O valor do segundo dgito o resultado da subtrao de 11 pelo resto da diviso da


soma acima por 11. Se este valor for 10 ou 11, o dgito 0 (zero), do contrrio o
prprio valor. No exemplo em questo o dgito encontrado calculado conforme v-se a
seguir:

11 - (255 % 11) = 9

Sada: CPF vlido 123.456.789-09 ou 123456789-09

3.2.3.4 Dado o seguinte programa principal, implemente a classe


DiaSemana e seus mtodos:

// ------------------------------------------------------- TestaDiaSemana.cs

using System;

namespace TestaDiaSemana
{
class MainClass
{
public static void Main (string[] args)
{
DiaSemana dia = new DiaSemana(17, 11, 2013);

dia.verificaDiaSemana();
dia.exibeDiaSemana();
}
}
}

Resultado do Programa:

Dia da Semana: Tera-Feira

DiaSemana
int dia, mes, ano
String semama

22
verificaDiaSemana
exibeDiaSemana
Diagrama de classe

Como calcular o Dia da Semana:

Deve-se calcular o Dia do Sculo:

Para qualquer clculo com datas essencial que se disponha do Dia do Sculo para a(s)
data(s) em questo. O Dia do sculo o nmero de dias decorridos desde o inicio do
sculo (1 de janeiro de 1901) at a data em questo. Se usa como referncia 1901 porque
a maioria das datas com as quais se trabalha ainda so do sculo passado. L por 2040 ou
mais poder se mudar para 2001.

A frmula (vlida para datas entre 1901 e 2099) a seguinte:

Dia_do_Seculo = (ano - 1901) * 365 + (ano - 1901) DIV 4 + dia + (ms - 1) *31 - [(ms *
4 + 23) DIV 10] * [(ms + 12) DIV 15] + [(4 - ano MOD 4) DIV 4) * [(ms + 12) DIV 15]

Entrada: Dia [1..31]: 18


Ms [1..12]: 12
Ano [1901..2099]: 2007

Dia_do_Seculo = 39.068 (para a data acima)

Verificao do Dia da Semana:

Para saber o Dia_da_Semana basta dividir por 7 e entrar com o resto na tabela abaixo:

0 Segunda
1 Tera
2 Quarta
3 Quinta
4 Sexta
5 Sbado
6 Domingo

Sada: 18/12/2007 uma Tera-Feira

Observao: DIV diviso inteira de dois nmeros e MOD o resto inteiro da diviso de
dois nmeros

3.2.3.5 Dado o seguinte programa principal, implemente a classe


Data e seus mtodos:

// ------------------------------------------------- TestData.cs

using System;

namespace TestData
{
class MainClass
{
public static void Main (string[] args)
{
Data data = new Data();

data.setaData(17, 11, 2013);


data.extenso();
}
}
}

Resultado do Programa:

Data: 17 de novembro de 2013

Data
int dia, mes, ano
setaData
extenso
Diagrama de classe

23
3.2.3.6 Implemente os mtodos sortForcaBruta e bubleSort na
classe Vetor vista no item 3.2.

// --------------------------------------------------- Ordena.cs

using System;

namespace Ordena
{
class MainClass
{
public static void Main (string[] args)
{
Vetor v = new Vetor (5);

v.add (30);
v.add (20);
v.add (10);
v.add (50);
v.add (40);
v.exibe ();
v.add (60); // testar o limite do vetor de 5 elementos
v.exibe ();
v.sortForcaBruta();
v.exibe();
// v.bubbleSort();
// v.exibe();
}
}
}

3.2.3.7 Dado o seguinte programa principal, implemente a classe


Pessoa e seus mtodos.

// --------------------------------------------------- TestaPessoa.cs

using System;

namespace TestaPessoa
{
class MainClass
{
public static void Main (string[] args)
{
Pessoa p1 = new Pessoa();
Pessoa p2 = new Pessoa();
Pessoa p3 = new Pessoa();

p1.setaDados("Paulo Roberto", 1962, 'm');


p2.setaDados("Renato Luis", 1965, 'm');
p3.setaDados("Francisco Carlos", 1959, 'm');
p1.calculaIdade();
p2.calculaIdade();
p3.calculaIdade();
p1.exibePessoa();
p2.exibePessoa();
p3.exibePessoa();
}
}
}

Resultado do Programa:

Nome: Paulo Roberto


Idade: 51 ano(s)
Sexo: Masculino
Nome: Renato Luis
Idade: 48 ano(s)
Sexo: Masculino
Nome: Francisco Carlos
Idade: 54 ano(s)
Sexo: Masculino

24
Pessoa
String nome, ano
char sexo
setaDados
calculaIdade
exibePessoa
Diagrama de classe

3.2.3.8 Dado o seguinte programa principal, implemente a classe


Pessoa e seus mtodos.

// ----------------------------------------------------- TestaPessoaVetor2.cs

using System;

namespace TestaPessoa2
{
class MainClass
{
public static void Main (string[] args)
{
Pessoa [] pessoa = new Pessoa[3];

pessoa[0] = new Pessoa();


pessoa[0].setaDados("Paulo Roberto", 1962, 'm');
pessoa[0].calculaIdade();
pessoa[0].exibePessoa();

pessoa[1] = new Pessoa();


pessoa[1].setaDados("Renato Luis", 1960, 'm');
pessoa[1].calculaIdade();
pessoa[1].exibePessoa();

pessoa[2] = new Pessoa();


pessoa[2].setaDados("Francisco Carlos", 1959, 'm');
pessoa[2].calculaIdade();
pessoa[2].exibePessoa();
}
}
}

Resultado do Programa:

Nome: Paulo Roberto


Idade: 51 ano(s)
Sexo: Masculino
Nome: Renato Luis
Idade: 53 ano(s)
Sexo: Masculino
Nome: Francisco Carlos
Idade: 54 ano(s)
Sexo: Masculino

Pessoa
String nome, ano
char sexo
setaDados
calculaIdade
exibePessoa
Diagrama de classe

3.2.3.9 Dado o seguinte programa principal, implemente a classe


Pessoa e seus mtodos.

// -------------------------------------------------- Sort.cs

using System;

namespace Sort
{
class MainClass
{

25
public static void Main (string[] args)
{
Pessoa pessoa = new Pessoa(7);

pessoa.insereDados("Beatriz", 11);
pessoa.insereDados("Debora", 13);
pessoa.insereDados("Ftima", 15);
pessoa.insereDados("Geni", 16);
pessoa.insereDados("Carla", 12);
pessoa.insereDados("Eva", 14);
pessoa.insereDados("Ana", 10);
pessoa.exibeDados();
pessoa.sort();
pessoa.exibeDados();
}
}
}

Resultado do Programa:

Lista de Pessoas
Nome: Beatriz Idade: 11
Nome: Debora Idade: 13
Nome: Ftima Idade: 15
Nome: Geni Idade: 16
Nome: Carla Idade: 12
Nome: Eva Idade: 14
Nome: Ana Idade: 10
Lista de Pessoas
Nome: Ana Idade: 10
Nome: Beatriz Idade: 11
Nome: Carla Idade: 12
Nome: Debora Idade: 13
Nome: Eva Idade: 14
Nome: Ftima Idade: 15
Nome: Geni Idade: 16

Pessoa
String [] nome
int [] idade
int n
insereDados
exibeDados
sort
Diagrama de classe

3.2.3.10 Dado o seguinte programa principal, implemente a classe


Agenda e seus mtodos.
// ------------------------------------------------------- TestAgenda.cs

using System;

namespace TestAgenda
{
class MainClass
{
public static void Main (string[] args)
{
Agenda agenda = new Agenda(5);

agenda.insereTelefone("Ana", "99811234");
agenda.insereTelefone("Beatriz", "99812345");
agenda.insereTelefone("Carla", "99813456");
agenda.insereTelefone("Debora", "99814567");
agenda.insereTelefone("Eva", "99815678");
agenda.insereTelefone("Ftima", "99816789");
String fone = "99815678";
String nome = agenda.consultaNome(fone);
if (nome.CompareTo("") != 0) {
Console.WriteLine("Nome: " + nome + " - Telefone: " + fone);
} else {
Console.WriteLine("ERRO: Usurio no Encontrado");
}

26
fone = "99810123";
nome = agenda.consultaNome(fone);
if (nome.CompareTo("") != 0) {
Console.WriteLine("Nome: " + nome + " - Telefone: " + fone);
} else {
Console.WriteLine("ERRO: Usurio no Encontrado");
}
}
}
}

Resultado do Programa:

ERRO: Excedeu limite do Vetor


Nome: Eva - Telefone: 99815678
ERRO: Usurio no Encontrado

Agenda
String [] nome
String [] fone
int n
int max
insereTelefone
consultaNome
Diagrama de classe

Exemplo da definio de uma classe Data:

// ----------------------------------------------- Fonte: Data.cs

using System;

namespace TestaData
{
public class Data
{
private int dia, mes, ano; // atributos da classe

public Data ()
{
}

public Data(int dia, int mes, int ano) { // construtor da classe


this.dia = dia;
this.mes = mes;
this.ano = ano;
}

// ------------------------------- sobrecarga do mtodo toString

public String toString() {


return(dia + "/" + mes + "/" + ano);
}

}
}

Programa exemplo que utiliza a classe Data:

// --------------------------------------------- Fonte: TestaData.cs


using System;

namespace TestaData
{
class MainClass
{
public static void Main (string[] args)
{
Data data = new Data(19, 11, 2013);

Console.WriteLine(data.toString());
}
}
}

27
Exemplo da definio de uma classe Calculadora:

// -------------------------------------------------------- Fonte: Calculadora.cs

using System;

namespace Calc
{
public class Calculadora
{
// ............................................. lista de atributos da classe
private double x, y, resp;
private char op;
private int erro;

// ............................................. mtodos pblicos da classe


public Calculadora () // construtor
{
erro = 0;
}

// ---------------------------- entradaDados
public void entradaDados ()
{
Console.Write ("Digite um Valor: ");
String s = Console.ReadLine ();
x = Convert.ToDouble (s);
do {
Console.Write ("Operador [+ - * / Rr Pp Ss Cc Tt]: ");
s = Console.ReadLine ();
op = s [0];
} while (!strChr ("+-*/RrPpSsCcTt", op));
if (!strChr ("RrSsCcTt", op)) {
Console.Write ("Digite outro Valor: ");
s = Console.ReadLine ();
y = Convert.ToDouble (s);
}
}

// ---------------------------- operaCalculadora
public void operaCalculadora ()
{
switch (op) {
case '+':
resp = soma (x, y);
break;
case '-':
resp = subtracao (x, y);
break;
case '*':
resp = multiplicacao (x, y);
break;
case '/':
if (y == 0)
erro = 1; // divisao por zero
else
resp = divisao (x, y);
break;
case 'R':
case 'r':
if (x < 0)
erro = 2; // raiz negativa
else
resp = raizQuadrada (x); // Raiz Quadrada
break;
case 'P':
case 'p':
resp = power (x, y); // potencia
break;
case 'S':
case 's':
resp = seno (x); // seno
break;
case 'C':

28
case 'c':
resp = cosseno (x); // cosseno
break;
case 'T':
case 't':
if (x == 90 || x == 180) {
erro = 3;
} else {
resp = tangente (x); // tangente
}
break;
}
}

// ---------------------------- exibeCalculadora
public void exibeCalculadora ()
{
if (erro == 1) {
Console.WriteLine ("Erro: Divisao por Zero");
} else {
if (erro == 2) {
Console.WriteLine ("Erro: Raiz Complexa");
} else {
if (erro == 3) {
Console.WriteLine ("Erro: Tangente Infinita");
} else {
Console.WriteLine ("Resposta: " + resp);
}
}
}
}

// ................................................ mtodos privados da classe


// ---------------------------- strChr
private bool strChr (String s, char ch)
{
for (int i = 0; i < s.Length; i++) {
if (s [i] == ch) {
return(true);
}
}
return(false);
}

// ---------------------------- soma
private double soma (double x, double y)
{
return(x + y);
}

// ---------------------------- subtracao
private double subtracao (double x, double y)
{
return(x - y);
}

// ---------------------------- multiplicacao
private double multiplicacao (double x, double y)
{
return(x * y);
}

// ---------------------------- divisao
private double divisao (double x, double y)
{
if (y == 0) {
erro = 1;
return(-1);
}
return(x / y);
}

// ---------------------------- raizQuadrada
private double raizQuadrada (double x)
{
return(Math.Sqrt (x));

29
}

// ---------------------------- power
private double power (double x, double y)
{
return(Math.Pow (x, y));
}

// ---------------------------- seno
private double seno (double x)
{
const double pi = 3.14158;
double rads;

rads = x * pi / 180.0;
return(Math.Sin (rads));
}

// ---------------------------- cosseno
private double cosseno (double x)
{
const double pi = 3.14158;
double rads;

rads = x * pi / 180.0;
return(Math.Cos (rads));
}

// ---------------------------- tangente
private double tangente (double x)
{
const double pi = 3.14158;
double rads;

rads = x * pi / 180.0;
return(Math.Tan (rads));
}
}
}

Programa exemplo que utiliza a classe Calculadora:

// ---------------------------------------------- Fonte: Calc.cs

using System;

namespace Calc
{
class MainClass
{
public static void Main (string[] args)
{
Calculadora calc = new Calculadora();

calc.entradaDados();
calc.operaCalculadora();
calc.exibeCalculadora();
}
}
}

Modificadores de Acesso:

public: Os atributos e mtodos tornam-se pblicos, ou seja,


qualquer outro mtodo pode chamar ou utilizar estes atributos
e/ou mtodos.

private: Somente os mtodos da classe (membros) da classe podem


chamar ou utilizar atributos ou mtodos privados.

protected: Utilizado em herana simples de classe (construo de


subclasses), ou seja, uma subclasse herda todos os atributos e

30
mtodos da classe base (superclasse). Deixa acessvel os
atributos e/ou mtodos para todas as outras classes (classe
base) e subclasses (classe derivada).

3.3 Sobrecarga de mtodos em C#

CSharp permite que mtodos estticos sejam sobrecarregados,


desta forma, o retorno, nmero de argumentos ou mesmo o tipo de dados
dos argumentos possam ser diferentes.

// ------------------------------------------ Fonte: SobreCarga.cs

using System;

namespace SobreCarga
{
class MainClass
{
public static void Main (string[] args)
{
imprime ("Pelotas-RS");
imprime (123.45);
imprime (123.45f);
imprime (123);
imprime ('A');
}

static void imprime (String s)


{
Console.WriteLine ("String: " + s);
}

static void imprime (double d)


{
Console.WriteLine ("Double: " + d);
}

static void imprime (float f)


{
Console.WriteLine ("Float: " + f);
}

static void imprime (int i)


{
Console.WriteLine ("Inteiro: " + i);
}

static void imprime (char ch)


{
Console.WriteLine ("Caracter: " + ch);
}
}
}

Resultado do programa:

String: Pelotas-RS
Double: 123,45
Float: 123,45
Inteiro: 123
Caracter: A

3.4 Ponteiros, referncias e endereos em C#

A seguir so mostrados alguns conceitos e diferenas entre


Ponteiros, Referncias e Endereos.

Endereo um local na memria aonde um dado est armazenado, ou seja,


corresponde a uma posio de memria capaz de armazenar os dados de um
programa com um determinado quantidade de bytes.

31
Ponteiro um tipo de dado (varivel) que permite acessar um endereo
qualquer.

Referncia um grau de abstrao de um endereo mas de forma que o


programador no pode alterar, somente us-lo. uma referncia a um
item de dados ou a um objeto. O programador/compilador no pode
manipular uma referncia diretamente.

// ------------------------------------------ Fonte: Ponteiro.cs

using System;

namespace Ponteiro
{
class MainClass
{
public static void Main (string[] args)
{
unsafe { // necessrio configurar para executar
char x = 'A';
char *p;

p = &x; // p recebe o endereo de x (&x)


Console.WriteLine("Valor de x...: {0}", x); // *p valor 65
Console.WriteLine("Caracter ....: {0}", *p); // caracter 'A'
}
}
}
}

Resultado do programa:

Valor de x...: A
Caracter ....: A

Observao: Para utilizar este cdigo necessrio configurar o compilador ou ambiente


de programao (Permitir cdigo inseguro).

Resumo: x -> 65
&x -> 100

32
p -> &x -> 100
*p -> 65
&p -> 200

Definio:

tipo_dado_base *nome_do_ponteiro;

tipo_dado_base: qualquer tipo bsico vlido em C#.


nome_da_ponteiro: nome da varivel que representa o ponteiro.

O tipo de dados do ponteiro define para que tipos de variveis o


ponteiro pode apontar e qual o tamanho ocupado na memria por estas
variveis.

Operadores de ponteiros

& - endereo de memria do operando.


* - contedo do endereo apontado pelo ponteiro.

Exemplo: ponteiro = &varivel;

Logo: varivel = *ponteiro;

4. Mtodos de entrada e sada de dados

A seguir so mostrados alguns mtodos que permitem fazer entrada


de dados via teclado e sada de dados via monitor (tela).

4.1 Entrada e sada de dados usando TextReader e TextWriter


A seguir visto um exemplo de entrada de dados usando as
classes TextReader e TextWriter.

Programa exemplo: Entrada de Dados via teclado em terminal de texto


usando a classe TextReader e sada via monitor utilizando a classe
TextWriter.

// ---------------------------------------------- Fonte: Input.cs

using System.IO;

namespace Input
{
class MainClass
{
public static void Main (string[] args)
{
TextReader leitor = System.Console.In;
TextWriter escritor = System.Console.Out;
escritor.Write("Digite seu nome: ");
string nome = leitor.ReadLine();
escritor.WriteLine("Nmero de Caracteres: {0}", nome.Length);
}
}
}

Resultado do Programa:

Digite seu nome: Paulo Roberto Gomes Luzzardi


Nmero de Caracteres: 28

33
4.2 Entrada e sada de dados utilizando Console
A seguir visto outra forma de entrada e sada utilizando a
classe Console.

Programa exemplo: Entrada de dados via teclado em caixa de dilogo


grfica sobreposta a interface usando a classe Console.

// --------------------------------------------- Fonte: EntradaSaida.cs

using System;

namespace EntradaSaida
{
class MainClass
{
public static void Main (string[] args)
{
Console.Write("Digite seu Nome: ");
string nome = Console.ReadLine();
Console.WriteLine("Nmero de Caracteres: {0}", nome.Length);
}
}
}

Resultado do Programa:

Digite seu nome: Paulo Roberto Gomes Luzzardi


Nmero de Caracteres: 28

4.3 Leitura de uma tecla em C# (pausa por teclado)


Em C# possvel ler via teclado uma tecla.

// --------------------------------------------- Fonte: Caracter.cs

using System;

namespace Caracter
{
class MainClass
{
public static void Main (string[] args)
{
for (int ch = 0; ch < 255; ch++) {
Console.Write ("Cdigo: " + ch + " - Caracter: " + (char)ch);
Console.ReadKey ();
}
}
}
}

Resultado do Programa:

Cdigo: 35 - Caracter: #
Cdigo: 36 - Caracter: $
Cdigo: 37 - Caracter: %
Cdigo: 38 - Caracter: &
Cdigo: 39 - Caracter: '
Cdigo: 40 - Caracter: (
Cdigo: 41 - Caracter: )
Cdigo: 42 - Caracter: *
Cdigo: 43 - Caracter: +
Cdigo: 44 - Caracter: ,
Cdigo: 45 - Caracter: -
Cdigo: 46 - Caracter: .
Cdigo: 47 - Caracter: /

34
Cdigo: 48 - Caracter: 0
Cdigo: 49 - Caracter: 1
Cdigo: 50 - Caracter: 2
Cdigo: 51 - Caracter: 3
Cdigo: 52 - Caracter: 4

5. Operadores em C#
So smbolos especiais que obrigam o compilador a executar
determinadas operaes. Estas operaes podem ser aritmticas,
comparativas ou lgicas.

5.1 Operadores aritmticos em C#

So operadores que realizam uma operao matemtica.


Tabela 3: Operadores aritmticos
Operador aritmtico Ao
- Subtrao
+ Adio
* Multiplicao
/ Diviso
% Resto inteiro da diviso
-- ++ Decremento/incremento

Precedncia dos operadores aritmticos (Hierarquia nas Operaes)

Tabela 4: Precedncia dos operadores aritmticos


Hierarquia Operao
1 Parnteses
2 Mtodos
3 ++ --
4 - (menos unrio)
5 * / %
6 + -

Observao: Quando houver duas ou mais operaes de mesma hierarquia,


o compilador executa-as da esquerda para a direita.

5.2 Operadores relacionais em C#

So operadores que permitem comparar valores, ou seja, so


utilizados principalmemte em comandos que possuem condies.

Tabela 5: Operadores relacionais


Operador Ao
> Maior que
>= Maior ou igual a
< Menor que
<= Menor ou igual
== Igual a
!= Diferente de

5.3 Operadores lgicos em C#

So operadores utilizados em comandos que tem mais de uma


condio.

Exemplo: if (condio1 && condio2 || condio3)

Tabela 6: Operadores lgicos

35
Operador lgica Ao
&& ou & AND (e)
|| ou | OR (ou)
! NOT (no)

Observao: $$ e || so chamados Short Circuit Operator, ou seja,


quando o resultado das condies no puder mais ser alterado, h um
truncamento nas prximas condies.

Precedncia (Hierarquia dos operadores)

Tabela 7: Precedncia dos operadores relacionais e lgicos


Hierarquia Operao
1 !
2 > >= < <=
3 == !=
4 &&
5 ||

Observao: As expresses que utilizam operadores relacionais e


lgicos retornam 0 (zero) para falso e !0 (no zero) para verdadeiro,
ou seja:

true diferente de 0 (!= 0) e false igual 0 (== 0)

5.4 Incremento e decremento em C#

So operadores aritmticos que permitem realizar operaes de


soma e subtrao de forma simplificada.

++ adiciona (1) ao operando


subtrai (1) ao operando

As seguintes operaes so equivalentes:


x++; x = x + 1;
x--; x = x - 1;

Observao:

Os operadores (++ ou --) podem ser colocados antes ou depois do


operando. Quando precede seu operando, C# efetua a operao de
incremento ou decremento antes de utilizar o valor do operando. Quando
o operador vier depois do operando, C# utiliza o valor do operando
antes de increment-lo ou decrement-lo.

Exemplo:
Equivalncia

x = 10; // y ser 11 x = 10;


y = ++x; // x ser 11 x = x + 1;
y = x;

x = 10; // y ser 10 x = 10;


y = x++; // x ser 11 y = x;
x = x + 1;
5.5 Operador de atribuio em C#

O operador de atribuio o sinal de igual =. A sintaxe do


operador de atribuio pode ser escrito em uma das seguintes formas:

36
varivel = constante; x = 3;
varivel = varivel; x = y;
varivel = expresso; x = a + b;
varivel = mtodo(x); x = Math.sqrt(y);

Programa exemplo: O programa calcula a idade de uma pessoa.

// ------------------------------------------ Fonte: Operadores.cs

using System;

namespace Operadores
{
class MainClass
{
public static void Main (string[] args)
{
// leitura do ano atual
Console.Write("Ano ATUAL: ");
String s = Console.ReadLine();
int ano_atual = Convert.ToInt32 (s);

Console.Write("Ano de NASCIMENTO: ");


s = Console.ReadLine();

// leitura do ano de nascimento


int ano_nasceu = Convert.ToInt32(s);

// atribuio clculo da idade


int idade = ano_atual - ano_nasceu;
Console.WriteLine("Sua IDADE " + idade + " anos");
}
}
}

Resultado do Programa:

Ano ATUAL: 2013


Ano de NASCIMENTO: 1962
Sua IDADE 51 anos

A linguagem de programao CSharp permite utilizar o operador de


atribuio em expresses, junto com operadores matemticos, lgicos,
relacionais, chamada de mtodos, e outros (como foi mencionado acima).

if ((produto = x * y) < 0)

Funcionamento: Primeiramente C# atribui o valor x * y a varivel


produto, para depois avaliar a expresso, ou seja, comparar se o
produto menor (<) que zero.

5.6 Casts em C#

possvel forar que o resultado de uma expresso seja de um


determinado tipo. Para tanto deve ser utilizado uma construo chamada
de cast, ou seja, pode ser utilizado para "tipar" uma varivel com um
tipo diferente do resultado da expresso.

varivel = (tipo) expresso;

Programa exemplo: O programa imprime na tela o resultado de uma


diviso.

// -------------------------------------------- Fonte: Cast.cs

using System;

namespace Cast

37
{
class MainClass
{
public static void Main (string[] args)
{
Console.Write("x = ");
String s = Console.ReadLine();
int x = Convert.ToInt32(s);
Console.Write("y = ");
s = Console.ReadLine();
int y = Convert.ToInt32(s);
// necessrio um cast (float) pois a diviso de dois inteiros resula em um inteiro
float resp = (float) x / y; // CAST para float
Console.WriteLine("Diviso: {0:0.00}", resp);
}
}
}

Resultado do Programa:

x = 3
y = 4
Diviso: 0,75

Observao: Em C#, o tipo resultante de um inteiro dividido por outro


inteiro um inteiro, logo, deve-se utilizar um cast (float) para que
o tipo resultante atribudo a varivel resp seja float.

5.7 Expresses em C#

Uma expresso em C# qualquer combinao vlida de operadores


(aritmticos, relacionais, lgicos), constantes, variveis e mtodos.

Exemplo: c = Math.Sqrt (a) + b / 3.4;

6. Mtodos para funes matemticas padres em C#


CSharp possui uma classe: Math que possui diversos mtodos para
resolver funes matemticas. Algumas so descritas a seguir:

6.1 Math.Abs

O mtodo Math.Abs retorna o valor positivo (absoluto).

Sintaxe: int Math.Abs(int x);


float Math.Abs(float x);
long Math.Abs(long x);
double Math.Abs(double x);
6.2 Math.Asin

O mtodo Math.Asin retorna o valor do arco seno. A varivel x


deve estar em radianos.

Sintaxe: double Math.Asin (double x);


Faixa: -pi / 2 pi / 2

6.3 Math.Acos

O mtodo Math.Acos retorna o valor do arco cosseno. A varivel x


deve estar em radianos.

Sintaxe: double Math.Acos (double x);

38
Faixa: 0 pi

6.4 Math.Atan

O mtodo Math.Atan retorna o valor do arco tangente. A varivel


x deve estar em radianos.

Sintaxe: double Math.Atan (double x);


Faixa: -pi / 2 pi / 2

6.5 Math.Sin

O mtodo Math.Sin retorna o valor do seno. A varivel x deve


estar em radianos.

Sintaxe: double Math.Sin (double x);


Faixa: -1 1

6.6 Math.Cos

O mtodo Math.Cos retorna o valor do cosseno. A varivel x deve


estar em radianos.

Sintaxe: double Math.cos (double x);


Faixa: -1 1

6.7 Math.Tan

O mtodo Math.Tan retorna o valor da tangente. A varivel x deve


estar em radianos.

Sintaxe: double Math.Tan (double x);

6.8 Math.Exp

O mtodo Math.Exp retorna o valor do expoente (ex).

Sintaxe: double Math.Exp (double x);

6.9 Math.Pow

O mtodo Math.Pow (power) retorna o valor da potncia (xy).

Sintaxe: double Math.Pow (double x, double y);

6.10 Math.Sqrt

O mtodo Math.Sqrt (square root) retorna o valor da raiz


quadrada.

Sintaxe: double Math.Sqrt (double x);

6.11 Math.Log

O mtodo Math.Log retorna o valor do logaritmo natural.

39
Sintaxe: double Math.Log (double x);

6.12 Convert.ToDouble

O mtodo Convert.ToDouble converte string em ponto flutuante.

Sintaxe: double Convert.ToDouble (String s);

6.13 Convert.Int?? (16, 32 ou 64)

Os mtodos Convert.ToInt?? convertem uma string em inteiro.

Sintaxe: int Convert.ToInt?? (String s);

6.14 Convert.ToByte

O mtodo Convert.ToByte converte uma string em byte.

Sintaxe: byte Convert.ToByte (String s);

6.15 Math.Log10

O mtodo Math.Log10 retorna o logartmo na base 10.

Sintaxe: double Math.Log10 (double x);

6.16 Random

A classe Random permite gerar um nmero aleatrio. Veja o


exemplo abaixo:

// ------------------------------------------ Fonte: Gera.cs

using System;

namespace Gera
{
class MainClass
{
public static void Main (string[] args)
{
Random rnd = new Random ();
int numero = rnd.Next (10);
Console.WriteLine ("Nmero: " + numero);
}
}
}

Resultado do Programa:

Nmero: 6

6.17 Math.PI

O mtodo Math.PI retorna o valor do pi radianos.

Sintaxe: double Math.PI (void);


Valor: 3.141592653589793

40
6.18 Converso de graus para radianos

Figura 2: Converso de graus para radianos

Converso de graus para radianos:

rads = graus * Math.PI / 180.0;

Converso de radianos para graus:

graus = rads * 180.0 / Math.PI;

7. Comandos em C#

7.1 Tipos de comandos em C#

7.1.1 Sequncia em C#

So comandos, que no fluxo de controle do programa, so sempre


executados passando a execuo para a prxima instruo, ou seja,
todos os comandos de seqncia so executados desde que eles no
dependem de um comando de seleo.

Exemplo: (todas as instrues abaixo so de seqncia)

Console.Write("Digite uma nmero: "); // imprime na tela


String s = Console.ReadLine(); // entrada de dados via teclado
float valor = Convert.ToFloat(s); // converso de String para float
float resp = valor * 1.25; // atribuio um comando de seqncia

7.1.2 Seleo em C#

So comandos, que no fluxo de controle do programa, permitem a


seleo entre duas ou mais instrues, ou seja, este tipo de comando
faz com que alguns comandos no sejam executados.

Exemplo:

if (numero % 2 == 0) // testa se o nmero par ou mpar


{
Console.WriteLine("Nmero: PAR");
}
else {
Console.WriteLine("Nmero: MPAR");
}

ou

Programa Exemplo: Programa extrai a raiz quadrada de um nmero.

// ------------------------------------------ Fonte: Raiz.cs

41
using System;

namespace Raiz
{
class MainClass
{
public static void Main (string[] args)
{
Console.Write("Digite um valor: ");
String s = Console.ReadLine();
Double x = Convert.ToDouble(s);
if (x < 0)
{
// esta instruo s executada se o valor de x for negativo
x = Math.Abs(x);
}
Double raiz = Math.Sqrt(x);
Console.WriteLine("Raiz Quadrada: {0:0.00}", raiz);
}
}
}

Resultado do Programa:

Digite um valor: -16


Raiz Quadrada: 4,00

Operador Ternrio (?) em C#:

Funcionamento: Se a condio for verdadeira, executa comando1 seno


executa comando2.

condio ? comando1 : comando2;


| ^ ^
| | |
+--------+ |
| |
+-------------------+

Exemplo (1): int menor = x <= y ? x : y;

// se x <= y ... menor = x;


// se x > y ... menor = y;

Exemplo (2): int menor;


x <= y ? menor = x : menor = y;

// se x <= y ... menor = x;


// se x > y ... menor = y;

// --------------------------------------------------------------- Fonte: Ternario.cs

using System;

namespace Ternario
{
class MainClass
{
public static void Main (string[] args)
{
Console.Write("Digite um valor: ");
String s = Console.ReadLine();
int x = Convert.ToInt32(s);
Console.Write("Digite outro valor: ");
s = Console.ReadLine();
int y = Convert.ToInt32(s);
int menor = x < y ? x : y; // operador ternrio
Console.WriteLine("menor: " + menor);

42
int maior = x > y ? x : y; // operador ternrio
Console.WriteLine("maior: " + maior);
}
}
}

Resultado do Programa:

Digite um valor: 3
Digite outro valor: 4
menor: 3
maior: 4

7.1.3 Repetio em C#

So comandos, que no fluxo de controle do programa, permitem a


repetio de uma ou mais instrues.

Programa Exemplo: O programa exibe na tela de 0 at 9.

// ----------------------------------------------- Fonte: Repete.cs

using System;

namespace Repete
{
class MainClass
{
public static void Main (string[] args)
{
const int n = 10;
int i = 0;

do {
Console.WriteLine("n = " + i);
i++;
} while (i < n);
}
}
}

Resultado do Programa:

n = 0
n = 1
n = 2
n = 3
n = 4
n = 5
n = 6
n = 7
n = 8
n = 9

7.2 Comando if em C#

O comando if um comando de seleo que permite selecionar um


comando entre dois outros comandos (comandos simples) ou dois
conjuntos de comandos (comandos compostos). Isto feito atravs da
avaliao de uma condio. O resultado desta avaliao (teste da
condio) pode ser verdadeiro (true) ou falso (false). Dependendo
deste resultado um dos comandos executado e o outro no.

Sintaxe:

if (condio) if (condio)
{ {
comando 1; comando;
} ou }

43
else {
comando 2;
}

Observao: O else opcional.

Se a condio for avaliada como verdadeira (qualquer valor


diferente de 0), o comando 1 ser executado, caso contrrio (condio
falsa, valor igual a zero) o comando 2 ser executado. Comando 1,
comando 2 ou comando podem ser simples ou compostos (quando h mais de
um comando ligado a outro, deve-se utilizar chaves ({ }). Veja
exemplos abaixo

if (condio) if (condio)
{ {
comando 1; comando 1;
comando 2; comando 2;
} comando 3;
else }
{
comando 3;
comando 4; // todos os comando so compostos
}

Programa exemplo: O usurio digita um nmero e o programa diz se este


par ou mpar.

// ------------------------------------------- Fonte: Par.cs

using System;

namespace Par
{
class MainClass
{
public static void Main (string[] args)
{
Console.Write("Digite um nmero: ");
String s = Console.ReadLine();
int numero = Convert.ToInt32(s);
if ((numero % 2) == 0) {
Console.WriteLine ("Nmero PAR");
}
else {
Console.WriteLine ("Nmero IMPAR");
}
}
}
}

Resultado do Programa:

Digite um nmero: 7
Nmero IMPAR

7.2.1 if encadeados em C#

Um if aninhado (ou encadeado) um comando if dentro de outro


comando if ou if ... else.

Programa exemplo: O usurio digita um nmero e o programa diz se este


zero, positivo ou negativo.

// -------------------------------------------- Fonte: Numero.cs

using System;

44
namespace Numero
{
class MainClass
{
public static void Main (string[] args)
{
Console.Write ("Digite um nmero: ");
String s = Console.ReadLine ();
int num = Convert.ToInt32 (s);
if (num == 0) {
Console.WriteLine ("Nmero Zero");
} else {
if (num > 0) {
Console.WriteLine ("Nmero Positivo");
} else {
Console.WriteLine ("Nmero Negativo");
}
}
}
}
}

Resultado do Programa:

Digite um nmero: 0
Nmero Zero

7.3 O comando switch em C#

O comando switch um comando de seleo que permite selecionar


um comando entre vrios outros comandos. Isto feito atravs da
comparao de uma varivel a um conjunto de constantes. Cada um dos
comandos est ligado a uma constante.

Sintaxe:

switch (varivel)
{
case constante_1 : seqncia de comandos;
break;
case constante_2 : seqncia de comandos;
break;
.
.
.
default: seqncia de comandos;
}

O programa testa uma varivel sucessivamente contra uma lista de


constantes inteiras ou caracteres (int ou char). Depois de encontrar
uma coincidncia, o programa executa o comando ou bloco de comandos
que estejam associados quela constante. O comando default executado
se no houver nenhuma coincidncia.

O comando break utilizado para obrigar a sada do comando


switch.
A opo default opcional.

Observao: A varivel no pode ser uma String e nem real (float ou


double).

Programa exemplo: O programa recebe um dgito de 0 9 e imprime na


tela, este dgito, por extenso. Neste exemplo a varivel dgito
inteira.

// ---------------------------------------------- Fonte: TestaSwitch.cs

45
using System;

namespace TestaSwitch
{
class MainClass
{
public static void Main (string[] args)
{
Console.Write ("Digito: ");
String s = Console.ReadLine ();
byte digito = Convert.ToByte (s);
switch (digito) {
case 0:
Console.WriteLine ("Zero");
break;
case 1:
Console.WriteLine ("Um");
break;
case 2:
Console.WriteLine ("Dois");
break;
case 3:
Console.WriteLine ("Trs");
break;
case 4:
Console.WriteLine ("Quatro");
break;
case 5:
Console.WriteLine ("Cinco");
break;
case 6:
Console.WriteLine ("Seis");
break;
case 7:
Console.WriteLine ("Sete");
break;
case 8:
Console.WriteLine ("Oito");
break;
case 9:
Console.WriteLine ("Nove");
break;
default:
Console.WriteLine ("ERRO: No um Dgito");
break;
}
}
}
}

Resultado do Programa:

Digito: 7
Sete

Programa exemplo: O programa recebe um dgito de 0 9 e imprime na


tela, este dgito, por extenso. Neste exemplo a varivel dgito
caracter, por causa disto as constantes esto entre apostrofes.

// ----------------------------------------- Fonte: SwitchChar.cs

using System;

namespace SwitchChar
{
class MainClass
{
public static void Main (string[] args)
{
Console.Write ("Digito: ");
String s = Console.ReadLine ();
char digito = s [0];
switch (digito) {

46
case '0':
Console.WriteLine ("Zero");
break;
case '1':
Console.WriteLine ("Um");
break;
case '2':
Console.WriteLine ("Dois");
break;
case '3':
Console.WriteLine ("Trs");
break;
case '4':
Console.WriteLine ("Quatro");
break;
case '5':
Console.WriteLine ("Cinco");
break;
case '6':
Console.WriteLine ("Seis");
break;
case '7':
Console.WriteLine ("Sete");
break;
case '8':
Console.WriteLine ("Oito");
break;
case '9':
Console.WriteLine ("Nove");
break;
default:
Console.WriteLine ("ERRO: No um Dgito");
break;
}
}
}
}

Resultado do Programa:

Digito: 6
Seis

Programa exemplo (21): O programa constri um menu com trs mtodos:


incluso, alterao e trmino.

// ------------------------------------------ Fonte: SwitchMenu.cs

using System;

namespace SwitchMenu
{
class MainClass
{
static void inclusao() {
Console.WriteLine("Opo Escolhida: Incluso");
}

static void alteracao() {


Console.WriteLine("Opo Escolhida: Alterao");
}

static void termino() {


Console.WriteLine("Opo Escolhida: Trmino");
}

public static void Main (string[] args)


{
Console.WriteLine("[I]ncluso");
Console.WriteLine("[A]lterao");
Console.WriteLine("[T]rmino");
Console.Write("Qual a opo: ");
String s = Console.ReadLine();
char opcao = s[0];
switch (opcao) {

47
case 'i':
case 'I': inclusao();
break;
case 'a':
case 'A': alteracao();
break;
case 't':
case 'T': termino();
break;
default: Console.WriteLine("ERRO: Opo Invlida");
break;
}
}
}
}

Resultado do Programa:

[I]ncluso
[A]lterao
[T]rmino
Qual a opo: a
Opo Escolhida: Alterao

7.4 Comando while no C#

O comando while um comando de repetio que permite executar


um comando (simples) ou vrios comandos (composto) diversas vezes.
Isto feito atravs da avaliao de uma condio. Enquanto a condio
for verdadeira os comandos so repetidos. Quando a condio se tornar
falsa o comando while finalizado. O teste da condio feita no
incio do comando, ou seja, antes que todos os comandos sejam
executados.

Observao: Note que os comandos podem no ser executados nenhuma vez,


basta a condio comear como falsa.

Sintaxe:

while (condio) { while (condio)ou


comando; {
} comando 1;
comando 2;
}
Condio: Qualquer expresso vlida em C# com resultado 0 (false) ou
!0 (true). Na condio podem ser utilizados ainda variveis, constan-
tes, mtodos, operadores (aritmticos, relacionais e lgicos).

Funcionamento do comando: O loop (lao) repetido enquanto a condio


for verdadeira. Quando a condio se tornar falsa o controle do
programa passa para a prxima instruo. O lao while verifica a
condio no incio do lao, por causa disto, normalmente, a varivel
de controle do lao deve ser inicializado.

Exemplo:

int i = 0; // inicializao da varivel de controle


while (i <= 10) { // condio i <= 10
Console.WriteLine(i = {0}, i);
i = i + 1; // incremento
}

Comando: Pode ser um comando vazio, simples ou composto que sero


repetidos.

Comando vazio: while (1); // comando while no repete nenhum comando

48
for (int i = 0; i <= 1000; i++); // comando for no repete nenhum comando

Verifique: Note que no final dos dois comandos (while e for) existe
apenas um ponto-e-vrgula, isto o sinal de comando vazio, ou seja,
os comandos while e for que teriam outros comandos no os tem,
caracterizando comandos vazios.

Problema freqente de digitao: Muitas vezes o programador insere um


ponto-e-vrgula no final de um comando for ou while por engano. Isto
um grave problema, pois este ponto-e-vrgula (inserido acidentalmente)
faz com que os comandos que seriam repetidos, no so. Veja o exemplo
abaixo:

Exemplo:

for (int x = 1; x <= 10; x++); // note o ponto-e-vrgula no final do comando for
Console.WriteLine(x = {0}, x); // impresso x = 11 na tela, porque?

Explicao: O comando Console.WriteLine no faz parte do comando if


devido ao ponto-e-vrgula no comando for. O comando for termina quando
a varivel de controle x chega ao valor 11.

Comando correto: for (int x = 1; x <= 10; x++) {


Console.WriteLine(x = {0}, x);
}

Programa exemplo: O programa imprime caracteres de A at Z na


tela.

// ----------------------------------------- Fonte: Letras.cs

using System;

namespace Letras
{
class MainClass
{
public static void Main (string[] args)
{
char letra = 'A'; // inicializao da varivel de controle

while (letra != 'Z') {


Console.WriteLine ("Letra: {0}", letra);
letra++; // incremento
}
}
}
}

Resultado do Programa:

Letra: A
Letra: B
Letra: C
Letra: D
Letra: E
Letra: F
Letra: G
Letra: H
Letra: I
Letra: J
Letra: K
Letra: L
Letra: M
Letra: N
Letra: O
.
.
.
Letra: V

49
Letra: W
Letra: X
Letra: Y

7.5 O comando for no C#

O comando for um comando de repetio que permite executar um


comando (comando simples) ou vrios comandos (comando composto)
diversas vezes. Isto feito atravs da avaliao de uma condio.
Enquanto a condio for verdadeira os comandos so repetidos. Quando
a condio se tornar falsa o comando for finalizado.

Sintaxe: for (inicializao; condio; incremento ou decremento) {


comando;
}

Exemplos:

Com uma varivel de controle:


for (int i = 0;i < 9;i++) {
Console.WriteLine(i);
}

Com duas varivel de controle:


for (int i = 1, int j = 5;i != j;i++, j--) {
Console.WriteLine(i + - + j);
}

Inicializao: um comando de atribuio (ou vrios, separados por


vrgula) que o compilador utiliza para inicializar a(s) varivel(is)
de controle do lao.

Condio: uma expresso qualquer, que testa a varivel de controle


do lao contra algum valor para determinar quando o lao terminar.

Incremento ou decremento: Define a maneira como a(s) varivel(is) de


controle do lao sero alteradas aps a repetio do lao.

O lao (for) repetido enquanto a condio verdadeira.


A condio sempre testada no comeo do lao.
Qualquer uma das 3 partes do comando for (inicializao; condio;
incremento) podem ser qualquer expresso vlida em C#.

Programa exemplo: O programa imprime de 1 at 10 na tela.

// --------------------------------------------- Fonte: For.cs

using System;

namespace For
{
class MainClass
{
public static void Main (string[] args)
{
for (int i = 1; i <= 10; i++) { // inicializao: i = 1
Console.Write("{0} ",i); // condio: i <= 10
} // incremento: i++
Console.WriteLine ();
}
}
}

Resultado do Programa:

1 2 3 4 5 6 7 8 9 10

50
Programa exemplo: O programa imprime na tela: i = 1 - j = 9
i = 2 - j = 8
// --------------------------- Fonte: For2.cs i = 3 j = 7
i = 4 j = 6
using System;

namespace For2
{
class MainClass
{
public static void Main (string[] args)
{
for (int i = 1, j = 9; i != j; i++,j--) {
Console.WriteLine ("i = {0} - j = {1}", i, j);
}
}
}
}

Resultado do Programa:

i = 1 - j = 9
i = 2 - j = 8
i = 3 - j = 7
i = 4 - j = 6

O lao for equivalente ao seguinte comando:

inicializao;
while (condio)
{
comando;
incremento; // ou decremento
}

ou

inicializao;
do {
comando;
incremento; // ou decremento
} while (condio);

C# possui ainda um for especial chamado foreach que pode ser


utilizado para iterao com array, Strings, ArrayList, dentre outras
classes do C#. Veja exemplo abaixo:

// --------------------------------------------- Fonte: ForReach.cs

using System;

namespace ForReach
{
class MainClass
{
public static void Main (string[] args)
{
string[] nomes = { "Paulo", "Roberto", "Gomes", "Luzzardi" };
foreach (string nome in nomes) {
Console.WriteLine (nome);
}
}
}
}

Resultado do programa:

Paulo

51
Roberto
Gomes
Luzzardi

7.6 O loop do { } while no C#

O comando do ... while um comando de repetio que permite


executar um comando (comando simples) ou vrios comandos (comando
composto) diversas vezes. Isto feito atravs do teste de uma
condio. Enquanto a condio for verdadeira os comandos so
repetidos. Quando a condio se tornar falsa o comando do ... while
finalizado. O teste da condio feita no final do comando, ou seja,
depois que os comandos so executados (Note que os comandos so
executados pelo menos uma vez).

Sintaxe:

do {
comando;
} while (condio);

Repete o lao enquanto a condio for verdadeira.


Testa a condio no final, fazendo com que o lao seja executado
pelo menos uma vez.

Programa exemplo: Imprime na tela de 1 at 10.

// ----------------------------------------------- Fonte: While.cs

using System;

namespace While
{
class MainClass
{
public static void Main (string[] args)
{
int i = 1;

do {
Console.Write("{0} ",i);
i++;
} while (i <= 10);
Console.WriteLine ();
}
}
}

Resultado do Programa:

1 2 3 4 5 6 7 8 9 10

7.7 Interrupo de loops em C#

7.7.1 O comando break em C#

Quando o programa encontra o comando break dentro de um lao,


ele imediatamente encerra o lao, e o controle do programa segue para
o prximo comando aps o lao.

Programa exemplo: O programa imprime na tela a tecla digitada pelo


usurio at que ele digite <F> ou <f>.

// ---------------------------------------------- Fonte: Break.cs

52
using System;

namespace Break
{
class MainClass
{
public static void Main (string[] args)
{
char tecla;

do {
Console.Write ("Tecla ou [F]im: ");
String s = Console.ReadLine ();
tecla = s [0];
if (tecla == 'F' || tecla == 'f') {
// encerra o lao quando o usurio teclar 'F' ou 'f'
break;
}
Console.WriteLine ("Tecla: " + (char)tecla + " - Cdigo: " + (int)tecla);
} while (true); // lao eterno
}
}
}

Resultado do Programa:

Tecla ou [F]im: a
Tecla: a - Cdigo: 97
Tecla ou [F]im: b
Tecla: b - Cdigo: 98
Tecla ou [F]im: A
Tecla: A - Cdigo: 65
Tecla ou [F]im: B
Tecla: B - Cdigo: 66
Tecla ou [F]im: f

7.7.2 O comando continue no C#

O comando continue em vez de forar o encerramento, fora a


prxima interao do lao e "pula", ou seja, no executa o cdigo que
estiver depois do comando continue.

Programa exemplo (27): O programa imprime na tela somente os nmeros


pares de 0 at 100.

// ------------------------------------------ Fonte: Continue.cs

using System;

namespace Continue
{
class MainClass
{
public static void Main (string[] args)
{
for (int i = 0; i < 20; i++) {
if (i % 2 == 1) { // 0 par, 1 impar
continue;
}
// imprime somente nmeros pares
Console.WriteLine("Par: {0}", i);
}
}
}
}

Resultado do Programa:

Par: 0
Par: 2
Par: 4
Par: 6
Par: 8

53
Par: 10
Par: 12
Par: 14
Par: 16
Par: 18
Par: 20
Nos laos while e do {} while um comando continue faz com que o
controle do programa execute diretamente o teste da condio e depois
continue o processo do lao.

No caso do comando for, o programa primeiro executa o incremento


(ou decremento) do lao e, depois, executa o teste da condio antes
de finalmente fazer o lao continuar.

7.8 O mtodo Environment.Exit ()

O mtodo Environment.exit aborta o programa em qualquer


situao, pode-se ainda utilizar o comando return.

Modo de usar: Environment.Exit(0); ou Environment.Exit(1);

8. Sada formatada com String.Format


Em C# possvel formatar a sada atravs do mtodo
String.Format e depois imprimir na tela.

Sintaxe:
String String.Format("string de controle", lista de variveis);

String de controle: Formada por especificadores que permitem formatar


a string resultante.

// ------------------------------------------ Fonte: Cpf.cs

using System;

namespace Cpf
{
class MainClass
{
public static void Main (string[] args)
{
long cpf = 12345678909;

string cpfFormat = String.Format("{0:000\\.000\\.000-00}", cpf);


Console.WriteLine ("cpf: " + cpfFormat);
}
}
}

Resultado do programa:

cpf: 123.456.789-09

Alguns especificadores utilizados no String.Format

Tabela 8: Especificadores utilizados no String.Format

Especificador Tipo Formato Sada


c moeda {0:c} R$ 12,345.00
d decimal {0:d} -12345
e notao cientfica {0:e} -1.234500e+004

54
f ponto flutuante {0:f} -12345.00
g genrico {0:g} -12345
n numrico {0:n} -12,345.00
r arredonda {0:r} System.FormatException
x hexadecimal {0:x4} 07b

Tabela 9: Especificadores utilizados no String.Format

Especificador Tipo Formato Sada


0 completa com zeros {0:00.000} 1234.560
# mscara para um nmero {0:#.##} 1234.56
. posiciona o separador de decimal {0:0.0} 1234.6
, posiciona o separador de milhar {0:0,0} 1,235
% Porcentagem {0:0%} 123456%

Tabela 10: Especificadores utilizados no String.Format (data)

Especificador Tipo Formato


t tempo curto hh:mm
d data curta dd/mm/aaaa
T tempo longo hh:mm:ss
D data longa dddd, mmm dd, aaaa
f combinao entre D and t dddd, mmm dd, aaaa hh:mm
F data completa dddd, mmm dd, aaaa hh:mm:ss
g combinao entre d and t mm/dd/aaaa hh:mm
G combinao of d and T mm/dd/aaaa hh:mm:ss
m, M dia e ms mmm dd
y, Y ms e ano mmm, aaaa
ddd, dd mmm aaaa hh':'mm':'ss
r, R data e hora completos
'GMT'
s data e hora completos aaaa'-'mm'-'dd'T'hh':'mm':'ss
u data universal aaaa'-'mm'-'dd hh':'mm':'ss'Z'

Tabela 11: Especificadores utilizados no String.Format (data)

Especificador Tipo Formato Sada


d data curta dd/mm/aaaa 21/11/2013
D data longa dd mmmm aaaa 21 Novembro 2013
t hora curta hh/mm 22:13
T hora longa hh/mm/ss 22:13:34
f data e hora dd mmmm aaaa hh/mm 21 Novembro 2013 22:13
F data e hora completo dd mmmm aaaa hh/mm/ss 21 Novembro 2013 22:13:34
g data de hora padro dd/mm/aaaa hh/mm 21/11/2013 22:13
data de hora padro dd/mm/aaaa hh/mm/ss
G 21/11/2013 22:13:34
longo
M dia/nome do ms dd mmmm 21 Novembro
???, dd mmm aaaa
r date string Qui, 21 Nov 2013 22:13:34 GMT
hh/mm/ss GMT
s data/hora aaaa-mm-ddThh/mm/ss 2013-11-21T22:13:34
u hora universal aaaa-mm-ddThh/mm/ss 2013-11-21 22:13:34Z
Y nome do ms ano mmm aaaa Novembro 2013

Tabela 12: Especificadores utilizados no String.Format (data)

Especificador Tipo Sada


Dd dia 21
Ddd nome do dia curto Qui
Dddd nome do dia Quinta-feira

55
hh hora com 2 dgitos 02
hh hora em 24 horas 14
mm minuto com 2 dgitos 30
mm ms com 2 dgitos 11
mmm nome do ms curto Nov
mmmmmm nome do ms Novembro
ss Segundos com 2 dgitos 34
tt AM/PM PM
aa Ano com 2 dgitos 13
aaaa Ano com 4 dgitos 2013
: separador {0:hh:mm:ss} 22:13:34
/ separador {0:dd/mm/aaaa} 21/11/2013

// ------------------------------------------ Fonte: Formato.cs

using System;

namespace Formato
{
class MainClass
{
public static void Main (string[] args)
{
DateTime data = DateTime.Now; // l a data do sistema
String Format = String.Format("{0:yy yyyy}", data);
Console.WriteLine ("Data: " + Format);
String Format1 = String.Format("{0:M MM MMM MMMM}", data);
Console.WriteLine ("Data: " + Format1);
String Format2 = String.Format("{0:d dd ddd dddd}", data);
Console.WriteLine ("Data: " + Format2);
String Format3 = String.Format("{0:h hh H HH}", data);
Console.WriteLine ("Data: " + Format3);
String Format4 = String.Format("{0:m mm}", data);
Console.WriteLine ("Data: " + Format4);
String Format5 = String.Format("{0:s ss}", data);
Console.WriteLine ("Data: " + Format5);
String Format6 = String.Format("{0:f ff fff ffff}", data);
Console.WriteLine ("Data: " + Format6);
String Format7 = String.Format("{0:F FF FFF FFFF}", data);
Console.WriteLine ("Data: " + Format7);
String Format8 = String.Format("{0:t tt}", data);
Console.WriteLine ("Data: " + Format8);
String Format9 = String.Format("{0:z zz zzz}", data);
Console.WriteLine ("Data: " + Format9);

int numero = 123;


Format1 = String.Format ("{0:C}", numero); // moeda
Console.WriteLine ("Valor: " + Format1);
Format2 = String.Format ("{0:C6}", numero); // moeda com 6 casas decimais
Console.WriteLine ("Valor: " + Format2);
Format3 = String.Format ("{0:D}", numero); // decimal
Console.WriteLine ("Valor: " + Format3);
Format4 = String.Format ("{0:D12}", numero); // decimal com 12 posies
Console.WriteLine ("Valor: " + Format4);
Format5 = String.Format ("{0:E}", numero); // exponencial XXX.XXXe+xxx
Console.WriteLine ("Valor: " + Format5);
Format6 = String.Format ("{0:F}", numero); // ponto Fixo
Console.WriteLine ("Valor: " + Format6);
Format7 = String.Format ("{0:G}", numero); // formato Geral ou Cientfico
Console.WriteLine ("Valor: " + Format7);
Format8 = String.Format ("{0:N}", numero); // numrico
Console.WriteLine ("Valor: " + Format8);
Format9 = String.Format ("{0:N4}", numero); // numrico com 4 casas decimais
Console.WriteLine ("Valor: " + Format9);
String Format10 = String.Format ("{0:X}", numero); // hexadecimal
Console.WriteLine ("Valor: " + Format10);
String Format11 = String.Format ("{0:x3}", numero); // hexadecimal
Console.WriteLine ("Valor: " + Format11);
}
}
}

56
Resultado do programa:

Data: 13 2013
Data: 11 11 nov novembro
Data: 21 21 qui quinta-feira
Data: 11 11 23 23
Data: 10 10
Data: 15 15
Data: 1 10 100 1009
Data: 1 1 1 1009
Data: P PM
Data: -2 -02 -02:00
Valor: R$ 123,00
Valor: R$ 123,000000
Valor: 123
Valor: 000000000123
Valor: 1,230000E+002
Valor: 123,00
Valor: 123
Valor: 123,00
Valor: 123,0000
Valor: 7B
Valor: 07b

9. Lista de exerccios (comandos)


9.1 Escreva um programa em C# que recebe dois valores via teclado:
cateto adjacente (b) e cateto oposto (a) e calcula o valor da
hipotenusa dado pela seguinte frmula:
Frmula: h2 = a2 + b2

Exemplo (Tela):

Cateto adjacente (b): 3 <enter>


Cateto oposto (a): 4 <enter>
Hipotenusa: 5

9.2 Escreva um programa em C# que l 4 notas via teclado: n1, n2, n3 e


n4 obtidas por um aluno em 4 avaliaes. Calcule a mdia utilizando a
seguinte frmula:

n1 + n2 * 2 + n3 * 3 + n4
Mdia = ---------------------------
7

A seguir imprima na tela a mdia e o conceito do aluno baseado na seguinte


tabela:

Mdia Conceito
9,0 ou acima de 9,0 A
entre 7,5 (inclusive) e 9,0 B
entre 6,0 (inclusive) e 7,5 C
abaixo de 6,0 D

9.3 Escreva um programa em C# que recebe via teclado: comprimento da


circunferncia. O programa deve calcular e imprimir na tela o dimetro
e o raio da circunferncia (veja exemplo abaixo).

57
Exemplo: Comprimento da circunferncia: 36 <enter>
Dimetro: 11.46
Raio: 5.73
Continua [S/N]? N <enter>

comprimento da circunferncia = 2 . PI . raio


dimetro = 2 . raio

Observao: Programa termina se usurio digitar N ou n na pergunta: Continua [S/N]?

9.4 Desenvolva um programa em C# que recebe via teclado: peso da carne


que ser vendida (em quilos) e preo por quilo. O programa deve
calcular e imprimir na tela o total a pagar, o valor pago ao ICMS
(17%) e o lucro lquido do aougue.

Exemplo (Tela):

Peso: 3.5 <enter>


Preo por Kg (R$): 4.90 <enter>
Total a pagar: 17.15
ICMS (17%): 2.91
Lucro lquido do aougue (R$): 14.24
Sair [S/N]? n <enter>
Peso: 1.5 <enter>
Preo por Kg (R$): 9.00 <enter>
Total a pagar: 13.5
ICMS (17%): 2.29
Lucro lquido do aougue (R$): 11.21
Sair [S/N]? S <enter>

9.5 Escreva um programa em C# que recebe via teclado: tipo de animal


[1] Gado, [2] Eqinos ou [3] Ovinos, preo unitrio do animal e
quantidade de animais comprados. O programa deve calcular e imprimir
na tela: preo total pago e a comisso do escritrio de remate (gado -
5%, eqinos - 7% e ovinos - 3%), conforme exemplo abaixo:

Exemplo (Tela):

Tipo de animal [1] Gado, [2] Eqinos ou [3] Ovinos: 1 <enter>


Preo unitrio do animal (R$): 200 <enter>
Quantidade de animais: 10 <enter>
Preo total pago (R$): 2100.00
Comisso a pagar (R$): 100.00
Continua [S/N]? s <enter>
Tipo de animal [1] Gado, [2] Eqinos ou [3] Ovinos: 2 <enter>
Preo unitrio do animal (R$): 1000 <enter>
Quantidade de animais: 1 <enter>
Preo total pago (R$): 1070.00
Comisso a pagar (R$): 70.00
Continua [S/N]? N <enter>

9.6 Reescreva o programa anterior recebendo via teclado uma letra para
o tipo de animal [G]ado, [E]qinos ou [O]vinos, preo unitrio do
animal e quantidade de animais comprado. O programa deve calcular e
imprimir na tela: preo total pago e a comisso do escritrio de
remate (gado: 5%, eqinos: 7% e ovinos: 3%), conforme exemplo abaixo:

Exemplo (Tela):

Tipo de animal [G]ado, [E]qinos ou [O]vinos: g <enter>


Preo unitrio do animal (R$): 200 <enter>
Quantidade de animais: 10 <enter>
Preo total pago (R$): 2100.00
Comisso a pagar (R$): 100.00
Continua [S/N]? s <enter>

9.7 Escreva um programa em C# que recebe via teclado: a data de hoje


da seguinte forma: dia, ms, ano e a sua idade, da seguinte forma:

58
anos, meses e dias vividos. O programa deve calcular e imprimir a data
de nascimento no seguinte formato: dd/mm/aaaa.

Exemplo (Tela):

Qual a data de hoje:


Dia: 16 <enter>
Ms: 6 <enter>
Ano: 2003 <enter>
Qual a sua idade:
Anos: 41 <enter>
Meses: 4 <enter>
Dias: 6 <enter>
Data de Nascimento: 10/02/1962
Continuar [S/N]? s <enter>

9.8 Escreva um programa em C# que recebe via teclado um nmero inteiro


de 0 99. O programa deve imprimir na tela este nmero por extenso
(conforme exemplo abaixo). O programa termina quando o usurio digitar
0 (zero).

Exemplo: Nmero [0..99]: 23 <enter>


Vinte e trs
Nmero [0..99]: 45 <enter>
Quarenta e cinco
Nmero [0..99]: 0 <enter>

9.9 Escreva um programa em C# que recebe via teclado: quantidade de


litros vendidos, tipo de combustvel ([A]lcool, [G]asolina ou
[D]iesel) e o tipo de pagamento ([P]razo ou [V]ista). O programa deve
calcular e imprimir na tela: total prazo, desconto e o total
vista. O programa termina quando o usurio digitar 'N' ou 'n' na
pergunta "Continua [S/N]?".

Tela de execuo: Valores:

Quantidade de litros? 50 <enter> lcool - 1,23


Tipo de combustvel [A]lcool, [G]asolina ou [D]iesel ? G <enter> Gasolina - 2,19
Tipo de pagamento [P]razo ou a [V]ista ? V <enter> Diesel - 1,46
Total prazo (R$) : 109.50
Desconto (R$): 5.48 Desconto vista: 5%
Total vista (R$): 104.02
Continua [S/N]? N <enter>

9.10 Escreva um programa em C# que recebe via teclado duas notas:


nota1 e nota2. O programa deve imprimir na tela a mdia, o conceito do
aluno (dado pela tabela abaixo) e a situao (aprovado, exame ou
reprovado):

Conceito Mdia Situao


A 9,0 10,0 Aprovado
B 7,0 8,9 Aprovado
C 6,0 6,9 Exame
D 0,0 5,9 Reprovado

Nota1 + Nota2 Exemplo:


Mdia = -----------------
2 Nota1: 7 <enter>
Nota2: 8 <enter>
Mdia: 7.5
Conceito: B
Situao: Aprovado
Sair [S/N]? s <enter>

Observao: Programa termina se o usurio digitar S ou s na pergunta: Sair [S/N]?

9.11 Escreva um programa em C# que recebe via teclado uma temperatura


e o tipo de converso (converter para: [C]elsius ou [F]ahrenheit).
Calcule e imprima na tela a temperatura correspondente a solicitao
do usurio, conforme exemplos abaixo:

59
Exemplo: Temperatura: 30 <enter>
Tipo de converso (converte para: [C]elsius ou [F]ahrenheit): F <enter>
Temperatura em Fahrenheit: 86
Continua [S/N]? S <enter>
Temperatura: 86 <enter>
Tipo de converso (converte para: [C]elsius ou [F]ahrenheit): C <enter>
Temperatura em Celsius: 30
Continua [S/N]? n <enter>

Frmula: C
9 . --- = F - 32
5

9.12 Escreva um programa em C# que recebe via teclado: graus (0


360), minutos (0 59) e segundos (0 59). O programa deve calcular e
imprimir na tela o ngulo em graus, dado pela seguinte frmula:

minutos segundos
ngulos em graus = graus + ---------- + ----------
60 3600
Exemplo:

Graus: 45 <enter>
Minutos: 45 <enter>
Segundos: 45 <enter>
ngulo em Graus: 45.76
Continua [S]im ou [N]o? S <enter>
Graus: 45 <enter>
Minutos: 10 <enter>
Segundos: 15 <enter>
ngulo em Graus: 45.17
Continua [S]im ou [N]o? N <enter>

Observao: Imprimir mensagens de erro se os valores de entrada estiverem fora da faixa:


ERRO: Graus fora da faixa, ERRO: Minutos fora da faixa ou ERRO: Segundos fora da faixa.

9.13 Escreva um programa em C# que recebe via teclado: sexo


([M]asculino ou [F]eminino), altura e peso da pessoa. O programa deve
calcular e imprimir na tela: peso ideal, diferena de peso e situao
(MAGRO, IDEAL ou GORDO) (conforme exemplo abaixo):

Exemplo: Sexo [M]asculino ou [F]eminino: M <enter>


Altura: 1.65 <enter>
Peso: 92 <enter> PIM = 72,7 x altura 58
Peso Ideal: 62.0 PIF = 62,1 x altura 44,7
Diferena de Peso: 30.0
Situao: GORDO
Sair [S/N]? s <enter>

MAGRO IDEAL GORDO


-------------------|-------------------|---------------------
-5% pi 5%

Observao: Programa termina se o usurio digitar S ou s na pergunta: Sair [S/N]?

10. Vetores, Matrizes e Strings em C#


Um vetor uma coleo de variveis de mesmo tipo (agregados
homogneos) que so referenciadas pelo mesmo nome, utilizando-se um
ndice para diferencia-los.

Um vetor consiste em locaes contguas de memria, ou seja, os


elementos encontram-se em sequncia (contiguidade fsica). O menor
endereo corresponde ao primeiro elemento, e o maior corresponde ao
ltimo elemento.

60
Uma vantagem na utilizao de um vetor poder armazenar vrios
valores (elementos), na memria RAM, ao mesmo tempo, permitindo, por
exemplo, compar-los e classific-los.

Exemplo: Vetor unidimensional de inteiros (idades).

Tabela 13: Exemplo de um vetor unidimensional


ndice Valor
0 24
1 12
2 36
3 41
10.1 Vetores em C#

Vetor (matriz de uma dimenso - 1D) um tipo especial de


matriz que possui apenas um ndice, ou seja, permite armazenar
variveis unidimensionais (permite representar uma tabela).

tipo_dado [] nome_do_vetor = new tipo_dado [nmero_de_elementos];

Onde:

tipo_dado: tipo de dado de cada elemento (char, byte, int, short,


long, float, double).
nome_do_vetor: nome da varivel que ir representar o vetor
nmero_de_elementos: nmero total de elementos do vetor

primeiro elemento: 0
ltimo elemento: nmero_de_elementos 1
nmero de bytes ocupados na memria RAM:
nmero_de_elementos x quantidade_de_bytes_de_um_elemento

Exemplo: int [] x = new int[5]; // 5 elementos: x[0] x[4]

primeiro elemento: x[0]


ltimo elemento: x[nmero_de_elementos 1], ou seja, x[4]
nmero de bytes: 5 x 4 = 20 bytes (um inteiro ocupa 4 bytes)

// ------------------------------------------ Fonte: Vetor1.cs

using System;

namespace Vetor1
{
class MainClass
{
public static void Main (string[] args)
{
const int max = 5;
int [] vetor = new int[max];

for (int i = 0;i < max;i++) {


Console.Write("Valor: ");
vetor[i] = Convert.ToInt32(Console.ReadLine());
}
for (int i = 0;i < max;i++) {
Console.WriteLine("vetor[" + i + "] = " + vetor[i]);
}
}
}
}

Resultado do programa:

61
Valor: 1
Valor: 2
Valor: 3
Valor: 4
Valor: 5
vetor[0] = 1
vetor[1] = 2
vetor[2] = 3
vetor[3] = 4
vetor[4] = 5

// ------------------------------------------ Fonte: Vetor2.cs

using System;

namespace Vetor2
{
class MainClass
{
public static void Main (string[] args)
{
const int max = 5;
int[] vetor = { 1, 2, 3, 4, 5 };

for (int i = 0; i < max; i++) {


Console.WriteLine ("vetor[" + i + "] = " + vetor [i]);
}
}
}
}

Resultado do programa:

vetor[0] = 1
vetor[1] = 2
vetor[2] = 3
vetor[3] = 4
vetor[4] = 5

10.2 Strings em C#

Um objeto do tipo String (cadeia de caracteres) pode ser copiado


para um vetor de caracteres. Veja o exemplo a seguir:

ASCII: Americam Standard Code for Information Interchange.


url: http://www.asciitable.com

// ------------------------------------------ Fonte: Vetor3.cs

using System;

namespace Vetor3
{
class MainClass
{
public static void Main (string[] args)
{
String [] vetor = { "Paulo", "Roberto", "Gomes", "Luzzardi" };
int max = vetor.Length;

for (int i = 0; i < max; i++) {


Console.WriteLine ("vetor[" + i + "] = " + vetor [i]);
}
}
}
}

Resultado do programa:

vetor[0] = Paulo
vetor[1] = Roberto
vetor[2] = Gomes

62
vetor[3] = Luzzardi

Programa Exemplo: Programa cpia todos os caracteres de uma String


para um vetor de caracteres.

// ----------------------------------------- Fonte: Vetor3.cs

using System;

namespace Vetor4
{
class MainClass
{
public static void Main (string[] args)
{
Console.Write ("String: ");
String s = Console.ReadLine ();
int n = s.Length;
char[] vetorCaracter = new char[n];

for (int i = 0; i < s.Length; i++) {


vetorCaracter [i] = s [i];
}

Console.Write ("Vetor: ");


for (int i = n - 1; i >= 0; i--) {
Console.Write (vetorCaracter [i]);
}
Console.WriteLine ();
}
}
}

Resultado do programa:

String: pelotas
Vetor: satolep

10.3 Matrizes (Multidimensional) em C#

tipo_dado [,] nome_matriz = new tipo_dado [tamanho, tamanho];

Exemplo: float [,] y = new float [5, 5]; // matriz 2D

Para acessar o elemento 3, 4 da matriz y, deve-se escrever


y[3,4]. Note que o primeiro elemento y[0,0] e o ltimo elemento
y[4,4]. O total de elementos 25.

Programa Exemplo: O programa possui uma matriz bidimensional para


gerar e exibir na tela n palpites para a MegaSena (ateno: gera
palpites repetidos e nmeros repetidos).

// ------------------------------------------- Fonte: vetor5.cs

using System;

namespace Vetor5
{
class MainClass
{
// --------------------------- entradaDados
static int entradaDados ()
{
Console.Write ("Nmero de Palpites: ");
String s = Console.ReadLine ();
int n = Convert.ToInt32 (s);
return(n);
}
// --------------------------- verificaRepetido
static bool verificaRepetido (int j, int n, int num, int[,]sena)
{

63
bool repetido = false;

for (int i = 0; i < n; i++) {


if (num == sena [j, i]) {
return(true);
}
}
return(repetido);
}
// --------------------------- geraPalpites
static void geraPalpites (int n, int[,] sena)
{
Random random = new Random ();

for (int i = 0; i < n; i++) {


for (int j = 0; j < 6; j++) {
int num = 1 + random.Next (60);
bool repetido = verificaRepetido (i, j, num, sena);
if (!repetido) {
sena [i, j] = num;
}
}
}
}
// --------------------------- sort
static void sort (int n, int[,] sena)
{
for (int k = 0; k < n; k++) {
for (int i = 0; i < 5; i++) {
for (int j = i + 1; j < 6; j++) {
if (sena [k, i] > sena [k, j]) {
int temp = sena [k, i];
sena [k, i] = sena [k, j];
sena [k, j] = temp;
}
}
}
}
}
// --------------------------- exibePalpites
static void exibePalpites (int n, int[,] sena)
{
for (int i = 0; i < n; i++) {
String extenso = "";
for (int j = 0; j < 6; j++) {
extenso = extenso + String.Format ("{0:00} ", sena [i, j]);
}
Console.WriteLine ("Palpite: " + extenso);
}
}
// ------------------------------------------- Main
public static void Main (string[] args)
{
int n = entradaDados ();
int[,] sena = new int [n, 6];
geraPalpites (n, sena);
sort (n, sena);
exibePalpites (n, sena);

}
}
}

Resultado do programa:

Nmero de Palpites: 5
Palpite: 06 09 11 25 36 37
Palpite: 07 17 31 45 54 58
Palpite: 12 17 20 24 38 55
Palpite: 26 28 43 47 54 58
Palpite: 16 33 45 47 48 55

10.4 Vetor de Strings em C#

64
Para criar um vetor de Strings, deve-se utilizar um vetor de
Strings.

Exemplo: String [] nome = new String[3];

nome[0] = Senac;
nome[1] = UCS;
nome[2] = UFPel;

String [] s = {Pelotas, Rio Grande, Bag};

Tabela 14: Exemplo de um vetor de strings


0 1 2 3 4 5
0 S e n a c null
1 U C S null
2 U F P e l null

Cria um vetor com trs Strings. Para acessar uma String em


particular deve-se especificar o ndice entre colchetes, ou seja,
nome[0], nome[1] ou nome[2].

10.5 Inicializao de matrizes e vetores em C#

tipo_dado [,] nome_matriz = {lista_valores};

lista_valores: lista de constantes separadas por vrgulas que so


compatveis em tipo com o tipo base da matriz.

Exemplo com vetor: int[] i = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 }; // 10 elementos

Observao: Quando um vetor declarado e inicializado (ao mesmo


tempo) o nmero de elementos (neste caso 10) pode ser suprimido, ou
seja, neste caso opcional (veja exemplo anterior).

Exemplo com matriz: int[,] x = { { 1, 2 }, { 3, 4 }, { 5, 6 } };

10.6 Inicializao de um vetor de caracteres em C#

char [] nome_vetor = {lista_de_caracteres};

Exemplo com vetor de caracteres: char[] str = { 's', 'i', 'm' };

0 1 2
s i m

10.7 Inicializao de matrizes multidimensionais em C#

int[,] y = { { 1, 1 }, { 2, 4 }, { 3, 9 }, { 4, 16 } };

y[0][0] = 1 y[2][0] = 3
y[0][1] = 1 y[2][1] = 9
y[1][0] = 2 y[3][0] = 4
y[1][1] = 4 y[3][1] = 16

10.8 Inicializao de vetores e matrizes sem tamanho em C#

65
Na inicializao de uma matriz (ou vetor), se no for
especificado seu tamanho, ento o compilador C# cria uma matriz (ou
vetor) grande o suficiente para conter todos os inicializadores
presentes.

Exemplo: char [] s = {p,a,u,l,o}; // s ocupa 5 bytes

Programa exemplo: O programa permite armazenar n nomes e idades em


dois vetores.

// ---------------------------------------------- Fonte: String3.cs

using System;

namespace String3
{
class MainClass
{
public static void Main (string[] args)
{
Console.Write ("Numero de Elementos: ");
String s = Console.ReadLine ();
int numElementos = Convert.ToInt32 (s);
String[] nome = new String[numElementos];
int[] idade = new int[numElementos];
for (int i = 0; i < numElementos; i++) {
Console.Write ("Nome: ");
nome [i] = Console.ReadLine ();
Console.Write ("Idade: ");
s = Console.ReadLine ();
idade [i] = Convert.ToInt32 (s);
}
for (int i = 0; i < numElementos; i++) {
String extenso = String.Format("{0,-20:C}", nome[i]) + String.Format("{0:00}", idade [i]);
Console.WriteLine (extenso);
}

}
}
}

Resultado do programa:

Nmero de Elementos: 3
Nome: paulo
Idade: 51
Nome: renato
Idade: 49
Nome: francisco
Idade: 53
paulo 51
renato 49
francisco 53

Programa exemplo: O programa realiza a soma de duas matrizes (A e B)


bidimensionais, gerando uma matriz resultante C.

// ---------------------------------------------- Fonte: Matriz.cs

using System;

namespace Matriz
{
class MainClass
{
public static void Main (string[] args)
{
const int max = 10;
int[,] a = new int [max,max];
int[,] b = new int [max,max];
int[,] c = new int [max,max];

66
int col, lin, m, n;

Console.Write ("Informe a ORDEM da MATRIZ: (mxn)\n");


do {
Console.Write ("Nmero de linhas (m): ");
String s = Console.ReadLine ();
m = Convert.ToInt32 (s);
} while (m < 1 || m > max); // m de 1 10
do {
Console.Write ("Nmero de colunas (n): ");
String s = Console.ReadLine ();
n = Convert.ToInt32 (s);
} while (n < 1 || n > max); // n de 1 10
for (lin = 1; lin <= m; lin++) {
for (col = 1; col <= n; col++) {
Console.Write ("A[" + lin + "," + col + "] = ");
String s = Console.ReadLine ();
a [lin,col] = Convert.ToInt32 (s);
Console.Write ("B[" + lin + "," + col + "] = ");
s = Console.ReadLine ();
b [lin,col] = Convert.ToInt32 (s);
}
}
Console.WriteLine ();
for (lin = 1; lin <= m; lin++) {
for (col = 1; col <= n; col++) {
c [lin,col] = a [lin,col] + b [lin,col];
Console.WriteLine ("C[" + lin + "," + col + "] = " + c [lin,col]);
}
}
}
}
}

Resultado do programa:

Informe a ORDEM da MATRIZ: (mxn)


Nmero de linhas (m): 2
Nmero de colunas (n): 2
A[1,1] = 1
B[1,1] = 2
A[1,2] = 3
B[1,2] = 4
A[2,1] = 5
B[2,1] = 6
A[2,2] = 7
B[2,2] = 8

C[1,1] = 3
C[1,2] = 7
C[2,1] = 11
C[2,2] = 15

10.9 Classificao de dados ou ordenao (sort) em C#

Para exemplificar melhor as variveis do tipo vetor, abaixo so


mostrados dois tipos de ordenao, tambm chamado sort (classificao
de dados):

Programa exemplo: O programa classifica os nomes digitados pelo


usurio.

// -------------------------------------------- Fonte: ForcaBruta.cs

using System;

namespace ForcaBruta
{
class MainClass
{
public static void Main (string[] args)
{

67
Console.Write("Nmero de Elementos: ");
String s = Console.ReadLine();
int numElementos = Convert.ToInt32(s);
String [] nome = new String[numElementos];
for (int i = 0;i < numElementos;i++) {
Console.Write("Nome: ");
nome[i] = Console.ReadLine();
}

for (int i = 0; i < numElementos - 1; i++) {


for (int j = i+1; j < numElementos; j++) {
if (nome[i].CompareTo(nome[j]) > 0) {
String temp = nome[i];
nome[i] = nome[j];
nome[j] = temp;
}
}
}

Console.WriteLine("\nNomes ORDENADOS\n");
for (int i = 0; i < numElementos; i++) {
Console.WriteLine("Nome: {0}", nome[i]);
}
}
}
}

Resultado do programa:

Nmero de Elementos: 5
Nome: Beatriz
Nome: Debora
Nome: Ana
Nome: Eva
Nome: Carla

Nomes ORDENADOS

Nome: Ana
Nome: Beatriz
Nome: Carla
Nome: Debora
Nome: Eva

Programa exemplo: O programa utiliza um mtodo de sort chamado bubble


sort (mtodo da bolha) para classificar nomes.

// ------------------------------------------- Fonte: Bubble.cs

using System;

namespace Bubble
{
class MainClass
{
public static void Main (string[] args)
{
bool sort;

Console.Write("Nmero de Elementos: ");


String s = Console.ReadLine();
int numElementos = Convert.ToInt32(s);
String []nome = new String[numElementos];
for (int i = 0;i < numElementos;i++) {
Console.Write("Nome: ");
nome[i] = Console.ReadLine();
}

int k = numElementos - 1;
do {
sort = false;
for (int i = 0; i < k; i++) {
if (nome[i].CompareTo(nome[i+1]) > 0) {
String temp = nome[i];
nome[i] = nome[i+1];

68
nome[i+1] = temp;
sort = true;
}
}
k--;
} while (sort);

Console.WriteLine("\nNomes ORDENADOS\n");
for (int i = 0; i < numElementos; i++) {
Console.WriteLine("Nome: {0}", nome[i]);
}
}
}
}

Resultado do programa:

Nmero de Elementos: 5
Nome: Eva
Nome: Carla
Nome: Debora
Nome: Ana
Nome: Beatriz

Nomes ORDENADOS

Nome: Ana
Nome: Beatriz
Nome: Carla
Nome: Debora
Nome: Eva

10.10 Lista de exerccios (vetores)

10.10.1 Escreva um programa em C# que recebe via teclado um conjunto de


letras (mximo 20). Armazene todas as letras em um vetor (letras) at
que o usurio digite um F ou f. Logo aps copie todas as letras (em
ordem inversa) para outro vetor (inverso). Ao final imprima os dois
vetores.
Exemplo: Letra: L <enter>
Letra: I <enter>
Letra: M <enter>
Letra: A <enter>
Letra: f <enter>
LIMA
AMIL

10.10.2 Escreva um programa em C# que recebe via teclado: nmero de


idades e as respectivas idades. Armazene todas as idades em um vetor
(idade). Logo aps a entrada de todas as idades, o programa deve
receber via teclado: idade para consulta. O programa deve imprimir na
tela, o nmero de idades antes da idade de consulta e o nmero de
idades depois da idade de consulta.

Exemplo: Nmero de idades: 6 <enter>


Idade: 30 <enter>
Idade: 60 <enter>
Idade: 10 <enter>
Idade: 50 <enter>
Idade: 20 <enter>
Idade: 40 <enter>
Idade para consulta: 50 <enter>
Antes: 3
Depois: 2
Continua [S/N]? n <enter>

10.10.3 Escreva um programa em C# que recebe via teclado um conjunto de


nmeros inteiros (mximo 50). Armazene todos os nmeros inteiros em um
vetor at que o usurio digite 0 (zero). Logo aps permita ao usurio
consultar um nmero informando o seu valor. O programa deve imprimir na

69
tela a posio do nmero no vetor ou ERRO: Nmero no encontrado (veja
exemplos abaixo):
Exemplo: Nmero: 50 <enter>
Nmero: 30 <enter>
Nmero: 20 <enter>
Nmero: 10 <enter>
Nmero: 40 <enter>
Nmero: 0 <enter>
Valor: 20 <enter>
Posio no vetor: 2
Valor: 40 <enter>
Posio no vetor: 4
Valor: 60 <enter>
ERRO: Nmero no encontrado
Valor: 0 <enter>

Observao: O programa termina quando o usurio digitar 0 (zero).

10.10.4 Escreva um programa em C# que recebe via teclado "n" conceitos


(A, B, C, D e E) (mximo 25) at que o usurio digite F ou f. Armazene
todos os conceitos em um vetor (conceito). Imprima na tela o nmero de
alunos: aprovados (A, B e C), reprovados (D) e os infreqentes (E).

Exemplo: Conceito: B <enter>


Conceito: A <enter>
Conceito: E <enter>
Conceito: B <enter>
Conceito: D <enter>
Conceito: C <enter>
Conceito: A <enter>
Conceito: E <enter>
Conceito: f <enter>
5 Aprovado(s)
1 Reprovado(s)
2 Infreqente (s)

10.10.5 Escreva um programa em C# que recebe via teclado n (mximo


50) nomes. A entrada dos nomes termina quando o usurio digitar apenas
<enter>. Logo aps a entrada de todos os nomes o programa deve
permitir a entrada via teclado de uma letra. O programa deve imprimir
na tela todos os nomes que comeam com a letra especificada pelo
usurio. O programa termina quanto o usurio digitar (nada) na
entrada da letra (conforme exemplos abaixo):
Exemplo: Nome: Paulo <enter>
Nome: Roberto <enter>
Nome: Renato <enter>
Nome: Pedro <enter>
Nome: Fabio <enter>
Nome: <enter>
Letra: R <enter>
Nome: Roberto
Nome: Renato
Letra: P <enter>
Nome: Paulo
Nome: Pedro
Letra: T <enter>
Letra: <enter>

10.10.6 Escreva um programa em C# que recebe via teclado n (mximo


30) nomes e idades. A entrada dos dados termina quando o usurio
digitar 'N' ou 'n' na pergunta "Continua [S/N]?". Logo aps a entrada
de todos os dados o programa deve imprimir na tela todos os nomes e
idades desde o mais velho at o mais novo.

Exemplo: Nome: Ana <enter>


Idade: 12 <enter>
Continua [S/N]? s <enter>
Nome: Beatriz <enter>

70
Idade: 13 <enter>
Continua [S/N]? s <enter>
Nome: Carla <enter>
Idade: 14 <enter>
Continua [S/N]? N <enter>
Carla 14
Beatriz 13
Ana 12

71
11. Manipulao de Strings em C#
A linguagem C# possui uma classe especifica para manipular
strings, ou seja, permite manipular uma cadeia de caracteres.

11.1 Mtodos para manipular Strings em C#


Considere que: String s = Pelotas;

Tabela 15: Construtores da classe string

Construtor Tipo
String (Char *) Ponteiro de caracteres
String(Char[])) Vetor de caracteres.
String(SByte*) Ponteiro de bytes
String(Char, Int32) Caracter repetido n vezes
String(Char*, Int32, Int32) Ponteiro de caracteres com uma posio e um comprimento
String(Char[], Int32, Int32) Vetor de caracteres com uma posio e um comprimento
String(SByte*, Int32, Int32) Ponteiro de caracteres com uma posio e um comprimento

A seguir so descritos os principais mtodos que permitem


manipular objetos do tipo String.

Mtodo Funcionamento
Compare(String, Compara duas Strings e retorna um nmero inteiro que indica sua
String) posio relativa na ordem de classificao
Concat(String[]) Concatena os elementos de um vetor de Strings
Retorna um valor indicando se o objeto String ocorre dentro desta
Contains
instncia
Cria uma nova instncia de String com o mesmo valor de um
Copy
objeto String especificado
Copia um nmero especificado de caracteres de uma posio
CopyTo especificada nesta instncia para uma posio especificada em
um vetor de caracteres
Determina se esta instncia e outro objeto String especificado tm
Equals(String)
o mesmo valor.
Equals(String,
Determina se dois objetos String especificados tm o mesmo valor
String)
Retorna o ndice da primeira ocorrncia nesta String do caractere
IndexOf(Char)
especificado
Retorna o ndice da primeira ocorrncia da String especificada
IndexOf(String)
nesta instncia
Insere uma String especificada em uma posio especificada nesta
Insert
instncia
Exclui todos os caracteres desta String, comeando em uma posio
Remove(Int32)
especificada e continuando at a ltima posio
Exclui um nmero especificado de caracteres desta instncia,
Remove(Int32, Int32)
comeando em uma posio especificada
Retorna uma nova seqncia na qual todas as ocorrncias de um
Replace(Char, Char) caracter especificado so substitudos por um outro caractere
especificado
Retorna uma nova seqncia na qual todas as ocorrncias de
Replace(String,
uma String especificada so substitudas por outra String
String)
especificada
Retorna um vetor de Strings que contm os substrings nesta
Split(Char[]) instncia que so delimitados por elementos de um vetorde
caracteres especificado
Retorna um vetor de Strings que contm os substrings nesta
Split(Char[], Int32) instncia que so delimitados por elementos de um vetorde
caracteres especificado
Substring(Int32) Recupera uma substring desta instncia
Substring(Int32,
Recupera uma substring desta instncia
Int32)
ToCharArray() Copia os caracteres nesta instncia para um vetor de caracteres

72
ToCharArray(Int32, Copia os caracteres em uma substring especificada nesta instncia
Int32) para um vetor de caracteres
ToLower() Retorna uma cpia da string convertida para caracteres minsculos
ToString() Retorna a instncia da String
Retorna uma cpia desta String convertida para caracteres
ToUpper()
maisculos

Exemplos:

a) Exemplo do uso de toUpperCase e toLowerCase:

// ----------------------------------------------------- Fonte: Converter.cs

using System;

namespace Converter
{
class MainClass
{
public static void Main (string[] args)
{
String s = "Paulo Roberto Gomes Luzzardi";

Console.WriteLine("Nome: " + s);


Console.WriteLine("Nome: " + s.ToUpper());
Console.WriteLine("Nome: " + s.ToLower());
}
}
}

Resultado do Programa:

Nome: Paulo Roberto Gomes Luzzardi


Nome: PAULO ROBERTO GOMES LUZZARDI
Nome: paulo roberto gomes luzzardi

b) Exemplo do uso de Length e IndexOf:


// ------------------------------------------------------ Fonte: Inverte.cs

using System;

namespace Inverte
{
class MainClass
{
public static void Main (string[] args)
{
char op;
do {
Console.Write("Nome: ");
String s = Console.ReadLine();
Console.Write("Invertido: ");
int n = s.Length; // nmero de caracteres da String s
for (int i = n-1;i >= 0;i--) {
Console.Write(s[i]); // acesso a cada caracter de s
}
Console.WriteLine();
do {
Console.Write("Continua [S/N]? ");
s = Console.ReadLine();
op = s[0];
} while ("SsNn".IndexOf(op) == -1); // verifica se op SsNn
} while ("Ss".IndexOf(op) != -1);
}
}
}

Resultado do Programa:

Nome: pelotas

73
Invertido: satolep
Continua [S/N]? s
Nome: satolep
Invertido: pelotas
Continua [S/N]? N

c) Exemplo do uso de String.format:


// -------------------------------------------- Fonte: StringFormat.cs

using System;

namespace StringFormat
{
class MainClass
{
public static void Main (string[] args)
{
float numero = 123.4567f;

String formato = String.Format("{0:0.000}", numero);


Console.WriteLine("Peso Ideal: " + formato);
}
}
}

Resultado do Programa:

Peso Ideal: 123,457

11.2 Lista de exerccios (Strings)

11.2.1 Escreva um programa em C# que recebe via teclado um nome. Logo


aps a entrada do nome imprima: nmero de letras maisculas, nmero de
letras minsculas, nmero de vogais e o nmero de consoantes, conforme
exemplo abaixo:

Exemplo: Nome: Faculdade de Tecnologia Senac <enter>


(3) maiscula(s)
(23) minscula(s)
(12) vogais(s)
(14) consoante(s)

11.2.2 Escreva um programa em C# que recebe via teclado uma palavra e


uma letra. Logo aps a entrada do nome e da letra imprima o nmero de
letras que existe no nome ou ERRO: No existe a letra (?) na palavra
(?), conforme exemplo abaixo:

Exemplo: Palavra: Luzzardi <enter>


Letra: z <enter>
2 letra(s)
Continua [S]im ou [N]o? S <enter>
Palavra: Luzzardi <enter>
Letra: w <enter>
ERRO: No existe a letra (w) na palavra (Luzzardi)
Continua [S]im ou [N]o? N <enter>

Observao: O programa deve ser encerrado quando o usurio digitar N ou n na


pergunta: Continua [S]im ou [N]o?.

11.2.3 Escreva um programa em C# que recebe via teclado uma palavra e


uma posio. O programa deve imprimir na tela, a letra antecessora, a
letra (da referida posio) e a letra sucessora, conforme exemplo
abaixo:

Exemplo: Palavra: Universidade <enter>


Posio: 7 <enter>
Antecessora: s
Letra: i
Sucessora: d

74
Observao: O programa deve imprimir na tela as seguintes mensagens de erro, se for o
caso: Letra antecessora no existe, Letra sucessora no existe ou Posio invlida.

11.2.4 Escreva um programa em C# que recebe via teclado um nome. O


programa deve imprimir, na tela, as palavras do nome em ordem inversa,
uma por linha, conforme exemplo abaixo:

Exemplo: Nome: Paulo Roberto Gomes Luzzardi <enter>


Luzzardi
Gomes
Roberto
Paulo

11.2.5 Escreva um programa em C# que recebe via teclado um nome. Logo


aps a entrada do nome o programa deve imprimir (EM LETRA MAISCULA) o
sobrenome da pessoa, conforme exemplos abaixo:

Exemplo: Nome: Paulo Roberto Gomes Luzzardi <enter>


Sobrenome: LUZZARDI
Sair [S/N]? N <enter>
Nome: Renato Souza <enter>
Sobrenome: SOUZA
Sair [S/N]? s <enter>

Observao: O programa termina quando o usurio digitar S ou s na pergunta: Sair


[S/N]?

11.2.6 Escreva um programa em C# que recebe via teclado um nome. Logo


aps a entrada do nome o programa deve imprimir na tela: sobrenome,
primeiro nome e demais nomes abreviados, conforme exemplos abaixo:

Exemplo: Nome: Paulo Roberto Gomes Luzzardi <enter>


Autor: Luzzardi, Paulo R. G.
Sair [S/N]? N <enter>
Nome: Renato Lima Souza <enter>
Autor: Souza, Renato L.
Sair [S/N]? s <enter>

Observao: O programa termina quando o usurio digitar S ou s na pergunta: Sair


[S/N]?

11.2.7 Escreva um programa em C# que recebe via teclado o nome de um


estado. Logo aps a entrada do nome do estado imprima: a sigla do
estado (2 letras maisculas), conforme exemplos abaixo:

Exemplo: Estado: Rio Grande do Sul <enter>


Sigla: RS
Estado: so paulo <enter>
Sigla: SP
Estado: rio de janeiro <enter>
Sigla: RJ
Estado: <enter>

Observao: O programa encerra quando o usurio digitar apenas <enter> na entrada do


nome do estado.

11.2.8 Escreva um programa em C# que recebe via teclado uma palavra,


incio e fim. Logo aps a entrada de todos os dados imprima a string
resultante ou ERRO: Fim invlido ou Incio invlido, conforme exemplos
abaixo:

Exemplo: Palavra: universidade <enter>


Incio: 7 <enter>
Fim: 11 <enter>
String resultante: idade
Continua [S/N]? s <enter>
Palavra: eletricidade <enter>
Incio: 7 <enter>

75
Fim: 15 <enter>
ERRO: Fim Invlido
Continua [S/N]? N <enter>

Observao: O programa termina quando o usurio digitar N ou n na pergunta: Continua


[S/N]?.

12. Mtodos estticos definidos pelo programador em C#


A linguagem de programao C# permite que o programador crie e
utilize seus prprios mtodos estticos.

Forma Geral:

static tipo_do_retorno nome_do_mtodo (tipo_dado_base parmetros ou argumentos)


{
tipo_dado_base variveis;

corpo do mtodo;

return(x);
}

tipo_do_retorno: Especifica o tipo de dado que ser retornado pelo


mtodo. O retorno do mtodo feito pelo comando return (valor).

Parmetros ou argumentos: uma lista, separada por vrgulas, com os


nomes das variveis (e seus tipos) que recebero os argumentos quando
o mtodo for chamado ou executado.

Mtodo procedural: um tipo especial de mtodo que no possui


retorno, ou seja, simplesmente um procedimento. Um mtodo deste tipo
void.

Exemplo: Programa que gera 10 nmeros aleatrios, usando um mtodo


esttico escrito pelo programador.

// ----------------------------------------------- Fonte: rand.cs

using System;

namespace Rand
{
class MainClass
{
static Random rnd = new Random (); // varivel global, no uma boa prtica de programao
// ----------------------------------------------- random
static int random (int n)
{
int numero = rnd.Next (n);
return(numero);
}
// ------------------------------------------------ main
public static void Main (string[] args)
{
for (int i = 1; i <= 10; i++) {
Console.WriteLine ("Valor: " + random (100));
}
}
}
}

Resultado do Programa:

Valor: 13
Valor: 45
Valor: 96
Valor: 29
Valor: 58

76
Valor: 10
Valor: 37
Valor: 54
Valor: 33
Valor: 95

Chamada do mtodo: n = random(100); // retorna um nmero aleatrio entre 0 e 99

Programa exemplo: O programa possui um mtodo esttico que calcula o


inverso 1/x.

// ---------------------------------------------- Fonte: Inverso.cs

using System;

namespace Inverso
{
class MainClass
{
// ----------------------------- Mtodo definido pelo programador
static double inverso (double x)
{
double i;

i = (double)1 / x;
return(i);
}
// -----------------------------------------Main
public static void Main (string[] args)
{
Console.Write ("x: ");
String s = Console.ReadLine ();
double x = Convert.ToDouble (s);
double inv = inverso (x); // chamada do mtodo inverso
Console.WriteLine ("Inverso = {0}", inv);
}
}
}

Resultado do Programa:

x: 4
Inverso = 0,25

12.1 Valores de retorno em C#

Todas os mtodos, exceto aqueles que so declaradas como sendo


do tipo void, devolvem um valor. O valor devolvido (retornado) pelo
mtodo atravs do comando return.

Normalmente so escritas trs tipos de mtodos:

a) Mtodos que efetuam operaes com os parmetros e retornam um valor


com base nas operaes.

Programa exemplo: O programa calcula e imprime na tela o valor da


potncia xy atravs de um mtodo esttico chamado: potencia.

// --------------------------------------------- Fonte: Metodo1.cs

using System;

namespace Metodo1
{
class MainClass
{
// ------------------------------------------------- Mtodo definido pelo programador
static double potencia (double x, int y)
{
double valor;

77
valor = Math.Exp (Math.Log (x) * y);
return(valor);
}
// ---------------------------------------------------- Main
public static void Main (string[] args)
{
Console.Write ("Base: ");
String s = Console.ReadLine ();
double _base = Convert.ToDouble (s);
Console.Write ("Expoente: ");
s = Console.ReadLine ();
int _expoente = Convert.ToInt32 (s);
double resp = potencia (_base, _expoente); // chamada do mtodo potencia
Console.WriteLine ("Potencia = {0}", resp);
}
}
}

Resultado do Programa:

Base: 3
Expoente: 4
Potencia = 81

b) Mtodos que manipulam informaes e retornam um valor que


simplesmente indica o sucesso ou o fracasso da manipulao.

Programa exemplo: O programa calcula e verifica o determinante de uma


equao de segundo grau atravs de um mtodo esttico chamado:
verificaDeterminante.

// ------------------------------------------ Fonte: Metodo2.cs

using System;

namespace Metodo2
{
class MainClass
{
// ---------------------------------------------------------------------------- mtodo definido pelo programador

static int verificaDeterminante (float a, float b, float c)


{
float det;

det = b * b - 4 * a * c;
if (det == 0) {
return(0);
}
else {
if (det > 0) {
return(1);
}
else {
return(-1);
}
}
}
// ------------------------------------------------------------- Main
public static void Main (string[] args)
{
Console.Write("a = ");
String s = Console.ReadLine();
float a = float.Parse(s);
Console.Write("b = ");
s = Console.ReadLine();
float b = float.Parse(s);
Console.Write("c = ");
s = Console.ReadLine();
float c = float.Parse(s);
int retorno = verificaDeterminante(a,b,c);
if (retorno == 0) {

78
Console.WriteLine("Determinante ZERO");
}
else {
if (retorno > 0) {
Console.WriteLine("Determinante POSITIVO");
}
else {
Console.WriteLine("Determinante NEGATIVO");
}
}
}

}
}

Resultado do Programa:

a = 1
b = 2
c = -4
Determinante POSITIVO

c) Mtodos que no retornam nenhum valor, ou seja, so puramente


procedimentos.

Programa exemplo: O programa abaixo possui um mtodo esttico


sobrecarregado que imprime um nmero (int ou float) na tela atravs do
mtodo chamado: imprimeNumero.

// -------------------------------------- Fonte: Metodo3.cs

using System;

namespace Metodo3
{
class MainClass
{
// --------------------------------------------- ImprimeNumero
static void imprimeNumero (int n)
{
Console.WriteLine ("Nmero digitado foi {0}", n);
}
// -------------------------------------------- ImprimeNumero
static void imprimeNumero (float n)
{
Console.WriteLine ("Nmero digitado foi {0}", n);
}
// --------------------------------------------- Main
public static void Main (string[] args)
{
Console.Write ("Digite um nmero inteiro: ");
String s = Console.ReadLine ();
int x = int.Parse (s);
imprimeNumero (x);
Console.Write ("Digite outro nmero real: ");
s = Console.ReadLine ();
float y = float.Parse (s);
imprimeNumero (y);
}
}
}

Resultado do Programa:

Digite um nmero inteiro: 123


Nmero digitado foi 123
Digite outro nmero real: 123,45
Nmero digitado foi 123,45

Observao: Note que o mtodo imprimeNumero foi sobrecarregado, ou


seja, ele funciona quando o argumento int ou float.

79
12.2 Passagem de parmetros por valor em C#

Forma de chamada de um mtodo, onde o valor do argumento


apenas copiado para o parmetro formal do mtodo. Portanto, alteraes
feitas nos parmetros no tero efeito nas variveis utilizadas para
cham-la.

Programa exemplo: O programa possui um mtodo que desenha um retngulo


na tela.

// ------------------------------------------- Fonte: Metodo4.cs

using System;

namespace Metodo4
{
class MainClass
{
// ------------------------ desenhaRetangulo
static void desenhaRetangulo (int ci, int li, int cf, int lf)
{
int c, l;

for (l = li; l <= lf; l++) {


for (c = ci; c <= cf; c++) {
Console.Write ("#");
}
Console.WriteLine ();
}
}
// ----------------------------------------- Main
public static void Main (string[] args)
{
desenhaRetangulo (1, 1, 20, 10);
}
}
}

Resultado do Programa:

####################
####################
####################
####################
####################
####################
####################
####################
####################
####################

Onde: ci -> coluna inicial


li -> linha inicial
cf -> coluna final
lf -> linha final

Ateno: Os argumentos do mtodo recebem, respectivamente: ci=1, li=1,


cf=20 e lf=10.

12.3 Passagem de parmetros por refernciaem C#

A passagem de parmetros ou argumentos por referncia em C#


acontece com qualquer tipo de dado desde que o identificador ref seja
utilizado na declarao do mtodo e na chamada do mtodo. Veja o
exemplo troca abaixo.

Programa exemplo: O programa tem um mtodo que troca o valor de duas


variveis.

80
// ------------------------------------------------- Fonte: Troca.cs

using System;

namespace Troca
{
class MainClass
{
static void troca(ref int x, ref int y) // ref - referncia
{
int temp = x;
x = y;
y = temp;
}
public static void Main (string[] args)
{
int x = 3, y = 4;
Console.WriteLine ("x = {0} - y = {1}", x, y);

troca (ref x, ref y); // ref referncia

Console.WriteLine ("x = {0} - y = {1}", x, y);


}
}
}

Resultado do Programa:

x = 3 - y = 4
x = 4 - y = 3

A seguir visto uma forma exatamente semelhante a linguagem de


programao C e C++:

// ------------------------------------------------- Fonte: Troca2.cs

using System;

namespace Troca2
{
class MainClass
{
unsafe static void troca(int *x, int *y) // unsafe cdigo inseguro
{
int temp = *x;
*x = *y;
*y = temp;
}
public static void Main (string[] args)
{
unsafe {
int x = 3, y = 4;
Console.WriteLine ("x = {0} - y = {1}", x, y);

troca (&x, &y); // unsafe cdigo inseguro

Console.WriteLine ("x = {0} - y = {1}", x, y);


}
}
}
}

Resultado do Programa:

x = 3 - y = 4
x = 4 - y = 3

Observao: necessrio configurar o cdigo fonte para que ele seja


compilado e executado (No MacOs X: boto direito no fonte Options ...
Compilar ... Permitir cdigo inseguro).

81
12.4 Mtodos que devolvem valores no-inteiros em C#

Todas os mtodos que devolvem valores no-inteiros devem ter seu


tipo de retorno declarado.

tipo_do_retorno nome_do_metodo (tipo_dado_base parmetros);

Programa exemplo: O programa calcula e imprime na tela a diviso de


dois valores usando um mtodo esttico chamado diviso.

// ------------------------------------------ Fonte: Divisao.cs

using System;

namespace Divisao
{
class MainClass
{
// -------------------------------------------- mtodo definido pelo programador
static float divisao (int x, int y)
{
return((float)x / y);
}
// -------------------------------------------- Main
public static void Main (string[] args)
{
Console.Write ("x = ");
String s = Console.ReadLine ();
int x = int.Parse (s);
Console.Write ("y = ");
s = Console.ReadLine ();
int y = int.Parse (s);
float resposta = divisao (x, y);
Console.WriteLine ("Diviso = {0}", resposta);
}
}
}

Resultado do Programa:

x = 3
y = 4
Diviso = 0,75

12.5 Argumentos do Main (String [] args) em C#

O mtodo esttico Main possui um argumento args intrnsecos


utilizados para receber parmetros da linha de comando do Sistema
Operacional.

args Vetor de Strings

Programa exemplo: O programa recebe parmetros do Sistema Operacional


(uma palavra qualquer) e imprime a palavra em sentido inverso. O
programa deve ser executado via terminal do Sistema Operacional da
seguinte forma:

Execuo pela linha de comandos (terminal):

$ mono Program.exe pelotas <enter>

Resultado na tela: satolep

Programa recebe:

argv[0] = pelotas

82
// --------------------------------------- Fonte: Inverter.cs

using System;

namespace Inverter
{
class MainClass
{
public static void Main (string[] args)
{
int n, argc = args.Length;

if (argc != 1) {
Console.WriteLine("Sintaxe: Inverter <palavra>\n");
}
else {
Console.Write("Palavra: ");
n = args[0].Length;
for (int i = n-1; i >= 0; i--) {
Console.Write("{0}", args[0][i]);
}
Console.WriteLine();
}
}
}
}

Resultado do Programa:

MacBook-Air-de-Paulo:Inverter pluzzardi$ ls -l
total 24
-rw-r--r-- 1 pluzzardi staff 1663 22 Nov 23:55 Inverter.csproj
-rw-r--r-- 1 pluzzardi staff 401 22 Nov 23:57 Program.cs
-rwxr-xr-x 1 pluzzardi staff 3584 22 Nov 23:58 Program.exe
drwxr-xr-x 3 pluzzardi staff 102 22 Nov 23:55 Properties
drwxr-xr-x 3 pluzzardi staff 102 22 Nov 23:55 bin
drwxr-xr-x 3 pluzzardi staff 102 22 Nov 23:55 obj
MacBook-Air-de-Paulo:Inverter pluzzardi$ mono Program.exe pelotas
Palavra: satolep
MacBook-Air-de-Paulo:Inverter pluzzardi$

Programa exemplo: O programa deve receber parmetros pelo Sistema


Operacional (conjunto de caracteres) e deve ordenar (coloca em ordem
alfabtica), imprimindo-os a seguir.

Execuo pela linha de comandos: $ mono Program.exe dbeacgf <enter>

Resultado na tela: abcdefg

Programa recebe:

agv[0] = dbeacgf

// ------------------------------------- Fonte: Ordem.cs

using System;
namespace Ordem
{
class MainClass
{
public static void Main (string[] args)
{
int argc = args.Length;
int numCar;

if (argc != 1) {
Console.WriteLine("Sintaxe: Ordem <palavra> \n");
}
else {

83
numCar = args[0].Length;
char [] ch = new char[numCar];
for (int i = 0;i < numCar;i++) {
ch[i] = args[0][i];
}
for (int i = 0; i < numCar-1; i++) {
for (int j = i+1; j < numCar; j++) {
if (ch[i] > ch[j]) {
char temp = ch[i];
ch[i] = ch[j];
ch[j] = temp;
}
}
}
for (int i =0;i < numCar;i++) {
Console.Write("{0}", ch[i]);
}
Console.WriteLine();
}
}
}
}

Resultado do Programa:

MacBook-Air-de-Paulo:Ordem pluzzardi$ cd Ordem


MacBook-Air-de-Paulo:Ordem pluzzardi$ ls -l
total 16
-rw-r--r-- 1 pluzzardi staff 1657 23 Nov 00:02 Ordem.csproj
-rw-r--r-- 1 pluzzardi staff 678 23 Nov 00:06 Program.cs
drwxr-xr-x 3 pluzzardi staff 102 23 Nov 00:02 Properties
drwxr-xr-x 3 pluzzardi staff 102 23 Nov 00:02 bin
drwxr-xr-x 3 pluzzardi staff 102 23 Nov 00:02 obj
MacBook-Air-de-Paulo:Ordem pluzzardi$ gmcs Program.cs
MacBook-Air-de-Paulo:Ordem pluzzardi$ mono Program.exe dbeacgf
abcdefg
MacBook-Air-de-Paulo:Ordem pluzzardi$

12.6 Recursividade em C#

Um mtodo recursivo se este fizer uma chamada a si prpria.

Programa exemplo: O programa calcula o fatorial de um nmero


recursivamente.

// ------------------------------------------ Fonte: Fatorial.cs

using System;

namespace Fatorial
{
class MainClass
{
// ----------------------------------------- fatorial

static long fatorial(int num) {


if (num == 0) {
return 1;
}
return(num * fatorial(num - 1)); // recursividade
}
// -------------------------------------------- Main
public static void Main (string[] args)
{
int n;

do {
do {
Console.Write("n = ");
String s = Console.ReadLine();
n = int.Parse(s);
} while (n < 0 || n > 100);
long fat = fatorial(n);

84
Console.WriteLine("Fatorial: {0}", fat);
} while (n != 0);
}
}
}

Resultado do Programa:

n = 5
Fatorial: 120
n = 10
Fatorial: 3628800
n = 15
Fatorial: 1307674368000
n = 20
Fatorial: 2432902008176640000
n = 30
Fatorial: -8764578968847253504 // erro
n = 0
Fatorial: 1

Programa exemplo: O programa calcula a soma de um nmero


recursivamente.

// ------------------------------------------- Fonte: Soma.cs

using System;

namespace Soma
{
class MainClass
{
// ----------------------------------- soma
static long soma (int n)
{
long s;

if (n == 1) {
return(1);
}
s = n + soma (n - 1); // recursividade
return(s);
}
// ---------------------------------------------------- Main
public static void Main (string[] args)
{
int n;
long sum;

do {
do {
Console.Write ("n = ");
String s = Console.ReadLine ();
n = int.Parse (s);
} while (n < 0 || n > 19);
if (n > 0) {
sum = soma (n);
Console.WriteLine ("Soma: {0}", sum);
}
} while (n != 0);
}
}
}

Resultado do Programa:

n = 1
Soma: 1
n = 2
Soma: 3
n = 3
Soma: 6
n = 4
Soma: 10
n = 5

85
Soma: 15
n = 6
Soma: 21
n = 7
Soma: 28
n = 8
Soma: 36
n = 0

12.7 Lista de Exerccios (mtodos)

12.7.1 Escreva em C# o mtodo nmeroPalavras. O mtodo recebe uma


String (nome) e retorna o nmero de palavras do nome (veja exemplo
abaixo):

// ------------------------------------------------------ Fonte: Palavras.cs

using System;

namespace Palavras
{
class MainClass
{
public static void Main (string[] args)
{
Console.Write("Nome: ");
String nome = Console.ReadLine();
int n = numeroPalavras(nome);
Console.WriteLine("Seu nome tem {0} palavra(s)", n);
}

// ---------------------------- numeroPalavras

}
}

Resultado do Programa:

Nome: Paulo Roberto Gomes Luzzardi <enter>


Seu nome tem 4 palavra(s)

12.7.2 Escreva em C# o mtodo verificaQuadrante. O mtodo recebe um


valor para x e um valor para y e retorna o nmero do quadrante (1, 2,
3 ou 4).

// --------------------------------------------------------- Fonte: Quadrante.cs

using System;

namespace Quadrante
{
class MainClass
{
public static void Main (string[] args)
{
Console.Write ("x: ");
String s = Console.ReadLine ();
int x = int.Parse (s);
Console.WriteLine ("y: ");
s = Console.ReadLine ();
int y = int.Parse (s);
int n = verificaQuadrante (x, y);
Console.WriteLine ("Quadrante: {0}", n);
}
// ---------------------------- verificaQuadrante
}
}

Resultado do Programa:
2 | 1
x: 1 <enter> ________________________

86
y: 2 <enter> |
Quadrante: 1 3 | 4

12.7.3 Escreva o mtodo: final_da_placa. O mtodo recebe uma placa de


automvel no formato: xxx9999 e retorna o ltimo dgito da placa.
// ------------------------------------------------------------ Fonte: Placa.cs

using System;

namespace Placa
{
class MainClass
{
public static void Main (string[] args)
{
Console.Write ("Qual a placa de seu carro [xxx9999]: ");
String placa = Console.ReadLine ();
char fim = finalPlaca (placa);
Console.WriteLine ("Final da Placa : {0}", fim);
}
// ---------------------------- finalPlaca
}
}

Resultado do Programa:

Qual a Placa de seu carro [xxx9999]: IDJ7345 <enter>


Final da Placa : 5

12.7.4 Escreva o mtodo numVogais. O mtodo recebe uma String (nome) e


retorna a quantidade de vogais da String.

// ------------------------------------------------------------ Fonte: Vogais.cs

using System;

namespace Vogais
{
class MainClass
{
public static void Main (string[] args)
{
Console.Write("Nome: ");
String nome = Console.ReadLine();
int vogais = numVogais(nome);
Console.WriteLine("Vogais: {0}", vogais);
}

// -------------------------- numVogais

}
}

Resultado do Programa:

Nome: Paulo <enter>


Vogais: 3

12.7.5 Escreva o mtodo calculaHipotenusa. O mtodo recebe o cateto


adjacente (b) e o cateto oposto (a) e retorna o valor da hipotenusa
dado pela seguinte frmula:

Frmula: h2 = a2 + b2

// ------------------------------------------------------------ Fonte: Hipotenusa.cs

using System;

namespace Hipotenusa
{
class MainClass

87
{
public static void Main (string[] args)
{
Console.Write ("Cateto Adjacente: ");
String s = Console.ReadLine ();
float a = float.Parse (s);
Console.Write ("Cateto Oposto: ");
s = Console.ReadLine ();
float b = float.Parse (s);
float h = calculaHipotenusa (a, b);
Console.WriteLine ("Hipotenusa: {0}", h);
}
// ---------------------------- calculaHipotenusa
}
}

Resultado do Programa:

Cateto Adjacente: 3 <enter>


Cateto Oposto: 3 <enter>
Hipotenusa: 4.242640

12.7.6 Escreva em C# o mtodo calculaReajuste. O mtodo recebe o valor


do salrio e o ndice de reajuste e retorna o salrio atualizado.

// ------------------------------------------------------------ Fonte: Reajuste.cs

using System;

namespace Reajuste
{
class MainClass
{
public static void Main (string[] args)
{
Console.Write ("Salrio (R$): ");
String s = Console.ReadLine ();
float salario = float.Parse (s);
Console.Write ("ndice de Reajuste: ");
s = Console.ReadLine ();
float indice = float.Parse (s);
float reajuste = calculaReajuste (salario, indice);
Console.WriteLine ("Salrio Atualizado (R$): {0}", reajuste);
}
// ---------------------------- calculaReajuste
}
}

Resultado do Programa:

Salrio (R$): 1000 <enter>


ndice de Reajuste: 10 <enter>
Salrio Atualizado (R$): 1100

13. Classes existentes em C#


C# possui diversas classes pr-existentes chamadas de colees.
A seguir so descritas algumas delas.

Tabela 16: Classes em C#


Classes Descrio
Object Classe base de objetos
List <T> Lista fortemente tipada de objetos
ArrayList Representa uma matriz de objetos dinmica
IList Representa uma coleo de objetos no-genricos
que podem ser acessados individualmente pelo
ndice
SortedList Representa uma coleo de pares chave/valor que
so ordenados pelas chaves e so acessveis por
chave e por ndice

88
HashTable Representa uma coleo de pares de chave / valor
que so organizados com base no cdigo de hash da
chave
Queue Fila
Stack Pilha

Collections (Colees)

Pacote: using System.Collections;

Em CSharp uma coleo uma classe.

13.1 Object (classe base de objetos) em C#

A classe Object d suporte a todas as outras classe do C#, ela


fornece os servios de baixo nvel para as classes derivadas. Ela a
classe base de todas as outras classes.

Pacote: using System;

Tabela 17: Principais mtodos da classe Object


Mtodo Descrio
Equals(Object) Verifica se o objeto especificado igual ao objeto atual
Equals(Object,
Verifica se as instncias dos objetos especificados so iguais
Object)
Permite que um objeto libere recursos e execute outras operaes de
Finalize
limpeza antes do coletor de lixo
GetHashCode Serve como a funo hash padro
GetType Obtm o tipo da instncia atual
MemberwiseClone Cria uma cpia do objeto atual
ReferenceEquals Determina se as instncias dos objetos so iguais
ToString Retorna uma string que representa o objeto atual

// ------------------------------------------------------------ Fonte: Objeto.cs

using System;

namespace Objeto
{
class MainClass
{
public static void Main (string[] args)
{
Object[] objeto = new Object[3];

objeto[0] = new { primeiroNome = "Paulo", ultimoNome = "Luzzardi" };


objeto[1] = new { marca = "Mercedes" };
objeto[2] = new { cidade = "Pelotas", estado = "RS" };
Console.WriteLine (objeto[0]);
Console.WriteLine (objeto[1]);
Console.WriteLine (objeto[2]);
}
}
}

Resultado do Programa:

{ primeiroNome = Paulo, ultimoNome = Luzzardi }


{ marca = Mercedes }
{ cidade = Pelotas, estado = RS }

13.2 List (lista tipada de objetos) em C#

A classe List permite criar uma lista tipada com qualquer tipo,
ou seja, o programador escolhe que tipo vai poder utilizar, isto pode
ser chamado de lista genrica.

89
Pacote: using System.Collections.Generic;

Tabela 18: Construtores da classe List <T>

Construtor Descrio
List<T>() Inicializa com uma nova instncia da classe List<T> vazia
Inicializa com uma nova instncia da classe List<T> com elementos
List<T>(IEnumerable<T>)
copiados de uma coleo especificada
Inicializa com uma nova instncia da classe List<T> vazia com uma
List<T>(Int32)
quantidade especificada

A seguir so descritos os principais mtodos da classe List <T>.

Tabela 19: Principais mtodos da classe List <T>

Mtodo Funcionamento
Add Adiciona um objeto para o fim da List<T>
Pesquisa o List<T> para um elemento utilizando o comparador padro e
BinarySearch(T)
retorna o ndice
Clear Remove todos os elementos da List<T>
Contains Determina se um elemento est presente na List<T>
CopyTo(T[]) Copia todo o List<T> para um vetor
Equals(Object) Verifica se o objeto especificado igual ao objeto atual
Exists Determina se o List<T> contm os elementos
Pesquisa um elemento e retorna a primeira ocorrncia dentro de toda a
Find
List<T>
FindAll Recupera os elementos
Pesquisa um elemento e retorna a ltima ocorrncia dentro de toda a
FindLast
List<T>.
ForEach Percorre todos os elemento da List<T>
GetType Obtm o tipo do objeto
IndexOf(T) Procura o objeto e retorna o ndice
Insert Insere um elemento para o List<T>
Remove Remove a primeira ocorrncia de um objeto no List<T>
RemoveAll Remove todos os elementos especificados
Sort() Ordena os elementos do List<T>
ToArray Copia os elementos do List<T> para um vetor
ToString Retorna em forma de string

// ------------------------------------------------------------ Fonte: TestList.cs

using System;
using System.Collections.Generic;

namespace TestList
{
class MainClass
{
public static void Main (string[] args)
{
var pessoas = new List<string> { "Paulo Roberto", "Renato Luis", "Francisco", "Ana Maria", "Julia Helena" };

for (var index = 0; index < pessoas.Count; index++)


{
Console.WriteLine(pessoas[index] + " ");
}
}
}
}

Resultado do Programa:

Paulo Roberto
Renato Luis
Francisco

90
Ana Maria
Julia Helena

13.3 ArrayList (lista de arrays) em C#

A classe ArrayList permite criar um vetor dinmico, ou seja, o


nmero de elementos cresce enquanto houver memria livre para a
insero dos elementos.

Pacote: using System.Collections.Generic;

Tabela 20: Construtores da classe ArrayList

Construtor() Descrio
Inicializa uma nova instncia da classe ArrayList que est vazia e
ArrayList()
tem a capacidade de padro inicial
Inicializa uma nova instncia da classe ArrayList que contm os
ArrayList(ICollection) elementos copiados de coleo especificada e que possui a mesma
capacidade inicial que o nmero de elementos copiou
Inicializa uma nova instncia da classe ArrayList que est vazia e
ArrayList(Int32)
tem a capacidade inicial especificada

A seguir so descritos os principais mtodos da classe


ArrayList.

Tabela 21: Principais mtodos da classe ArrayList

Mtodo Descrio
Add Adiciona um objeto no final do ArrayList
BinarySearch(Object) Procura um objeto em um ArrayList ordenado
Clear Remove todos os elementos de ArrayList
Clone Cria uma cpia de ArrayList
Contains Verifica se um elemento est no ArrayList
CopyTo(Array) Copia o ArrayList a um vetor 1D
CopyTo(Array, Int32) Copia o ArrayList a um vetor 1D, a partir do ndice especificado
Equals(Object) Verifica se o objeto especificado igual ao objeto atual
Retorna o ArrayList que representa um subconjunto dos elementos do
GetRange
ArrayList.
GetType Obtm o tipo do ArrayList
Pesquisa por objetos e retorna o ndice da primeira ocorrncia
IndexOf(Object)
dentro de ArrayList
Insert Insere um elemento em ArrayList no ndice
Remove Remove a primeira ocorrncia de um objeto do ArrayList
RemoveAt Remove o elemento no ndice de ArrayList
RemoveRange Remove um intervalo de elementos de ArrayList
Repeat Retorna ArrayList cujos elementos so cpias do valor
Reverse() Inverte a ordem dos elementos do ArrayList
Copia elementos da coleo de um intervalo de elementos do
SetRange
ArrayList
Sort() Ordena os elementos em ArrayList
ToArray() Copia elementos de ArrayList para um novo vetor
ToString Retorna uma string que representa o objeto

Programa Exemplo: Programa mostra um exemplo de dois arrays que


armazenam respectivamente: nomes e idades.

// ------------------------------------------- Fonte: TestaArrayList.cs

using System;
using System.Collections;

namespace TestaArrayList
{
class MainClass
{

91
public static void Main (string[] args)
{
ArrayList nome = new ArrayList ();
nome.Add("Paulo Roberto");
nome.Add (51);
nome.Add("Renato Luis");
nome.Add (49);
nome.Add("Francisco Carlos");
nome.Add (53);
nome.Add("Ana Maria");
nome.Add (55);
nome.Add("Julia Helena");
nome.Add (54);

foreach (Object obj in nome) {


Console.WriteLine("{0}", obj);
}
}
}
}

Resultado do Programa:

Paulo Roberto
51
Renato Luis
49
Francisco Carlos
53
Ana Maria
55
Julia Helena
54

13.4 IList (lista de objetos indexados) em C#

A classe IList representa uma coleo de objetos no-genricos


que podem ser acessados individualmente pelo ndice.

Pacote: using System.Collections.Generic;

Tabela 22: Principais mtodos da classe IList

Mtodo Descrio
Add Adiciona um item a IList.
Clear Remove todos os itens de IList.
Contains Determina se IList contm um valor especfico.
Copia os elementos da ICollection para um Array, inicial de um determinado
CopyTo
Array ndice. (Herdado de ICollection)
Retorna um enumerador que executa iteraes atravs de uma coleo.
GetEnumerator
(Herdado de IEnumerable)
IndexOf Determina o ndice de um item especfico em IList.
Insert Insere um item a IList no ndice especificado.
Remove Remove a primeira ocorrncia de um determinado objeto de IList.
RemoveAt Remove o item de IList no ndice especificado.

// ------------------------------------------- Fonte: IListTeste.cs

using System;
using System.Collections.Generic;

class IListTeste
{
static void exibeLista (IList<int> lista)
{
foreach (int value in lista) {
Console.WriteLine ("Elemento: " + value);
}
Console.WriteLine ("Total de Elementos: {0}", lista.Count);
}

92
public static void Main (string[] args)
{
int[] vetor = new int[3];
vetor [0] = 10;
vetor [1] = 20;
vetor [2] = 30;
exibeLista (vetor);

List<int> lista = new List<int> ();


lista.Add (40);
lista.Add (50);
lista.Add (60);
lista.Add (70);
exibeLista (lista);
}
}

Resultado do Programa:

Elemento: 10
Elemento: 20
Elemento: 30
Total de Elementos: 3
Elemento: 40
Elemento: 50
Elemento: 60
Elemento: 70
Total de Elementos: 4

13.5 Stack (Pilha) em C#

A classe Stack utilizada para armazenar elementos em uma


Pilha.

Pacote: using System.Collections;

A seguir so descritos os principais mtodos da classe Stack.

Tabela 23: Principais mtodos da classe Stack

Mtodo Descrio
Count Retorna o nmero de elementos da pilha
Clear Remove todos os objetos da pilha
Clone Create uma copia da pilha
Contains Verifica se um elemento est na pilha
CopyTo Copia a pilha para um array 1D
Equals(Object) Determina se o objeto especificado igual ao objeto
GetType Obtm o tipo
Peek Retorna o objeto no topo da pilha sem remov-lo
Pop Remove e retorna o objeto no topo da pilha
Push Insere um objeto no topo da pilha
ToArray Copia a pilha para um novo vetor
ToString Retorna uma string que representa o objeto atual

Programa Exemplo: Exemplo de uma pilha usando a classe Stack.

// --------------------------------------------- Fonte: Pilha.cs

using System;
using System.Collections;

namespace Pilha
{
class MainClass
{
public static void Main (string[] args)

93
{
Stack pilha = new Stack();
int nodo;

do {
Console.Write("Nodo: ");
String s = Console.ReadLine();
nodo = int.Parse(s);
if (nodo != 0) {
pilha.Push(nodo);
}
} while (nodo != 0);
String extenso = "";
int n = pilha.Count;
Console.WriteLine ("Nmero de Elementos: " + n);
for (int i = 0;i < n;i++ ) {
extenso = extenso + pilha.Pop () + " ";
}
Console.WriteLine("Pilha: " + extenso);
}
}
}

Resultado do Programa:

Nodo: 10
Nodo: 20
Nodo: 30
Nodo: 40
Nodo: 50
Nodo: 0
Nmero de Elementos: 5
Pilha: 50 40 30 20 10

13.6 Queue (Fila) em C#

A classe Queue utilizada para armazenar elementos em uma Fila.

Pacote: using System.Collections;

A seguir so descritos os principais mtodos da interface queue.

Tabela 24: Principais mtodos da classe Queue

Mtodo Descrio
Clear Remove todos os objetos da fila
Clone Create uma cpia da fila
Contains Verifica se um elemento est na fila
CopyTo Copia os elementos da fila para um vetor 1D
Dequeue Remove e retorna o objeto do incio da fila
Enqueue Adiciona um objeto no fim da fila
Equals(Object) Determine se um objeto especfico igual a um objeto da fila
GetType Obtm o tipo do elemento da fila
Peek Retorna o objeto no incio do fila sem remov-lo
ToArray Copia os elementos da fila para um vetor 1D
ToString Retura uma string que representa os objetos da fila

Programa Exemplo: Exemplo de uma fila usando a classe Queue.

// -------------------------------------- Fonte: Fila.cs

using System;
using System.Collections;

namespace Fila
{
class MainClass
{

94
public static void Main (string[] args)
{
Queue fila = new Queue();
int nodo;

do {
Console.Write("Nodo: ");
String s = Console.ReadLine();
nodo = int.Parse(s);
if (nodo != 0) {
fila.Enqueue(nodo);
}
} while (nodo != 0);
String extenso = "";
int n = fila.Count;
for (int i = 0;i < n;i++) {
extenso = extenso + fila.Dequeue() + " ";
}
Console.WriteLine("Fila: " + extenso);
}
}
}

Resultado do Programa:

Nodo: 10
Nodo: 20
Nodo: 30
Nodo: 40
Nodo: 50
Nodo: 0
Nmero de Elementos: 5
Fila: 10 20 30 40 50

14. Entrada e sada em disco (Arquivos) em C#


Em C# possvel manipular arquivos atravs da classe File
(Arquivo).

14.1 Mtodos para manipular arquivos em C#

A seguir so descritos os principais mtodos da classe


StreamReader para manipular arquivos em C#:

Tabela 25: Principais mtodos da classe StreamReader

Mtodo Descrio
Close Fecha o arquivo
Equals(Object) Verifica se o arquivo igual ao arquivo especificado
Peek Retorna o prximo caracter disponvel
L o prximo caracter de fluxo de entrada e avana a posio do por
Read()
um caracter, ou seja, acesso sequencial
Read(Char[], Int32, L o mximo especificado de caracteres de fluxo atual em um buffer,
Int32) comeando no ndice especificado
L o nmero mximo especificado de caracteres de fluxo atual e grava
ReadBlock
os dados de um buffer, comeando no ndice especificado
L uma linha de caracteres e retorna os dados como uma cadeia de
ReadLine
caracteres
ToString Retorna uma string que representa o objeto atual

14.2 Abertura de um arquivo texto em C#

A seguir sero vistos alguns programas exemplos mostrando a


manipulao de arquivos em C#.

95
Programa exemplo: O programa abre um arquivo texto e exibe o nmero de
bytes do referido arquivo.

// ----------------------------------------- Fonte: File1.cs

using System;
using System.IO;

namespace File1
{
class MainClass
{
public static void Main (string[] args)
{
String path = "/Users/pluzzardi/";
Console.Write ("Nome do Arquivo Texto: ");
String nomeArquivo = Console.ReadLine ();
nomeArquivo = path + nomeArquivo;
try {
long bytes = 0;
using (StreamReader file = new StreamReader (nomeArquivo)) {
string line;
while ((line = file.ReadLine ()) != null) {
bytes = bytes + line.Length;
}
Console.WriteLine ("Arquivo: " + nomeArquivo);
Console.WriteLine ("Bytes: " + bytes);

}
} catch (Exception e) {
Console.WriteLine ("Erro: Arquivo no existe");
Console.WriteLine (e.Message);
}
}
}
}

Resultado do Programa:

Nome do Arquivo Texto: luzzardi.txt


Arquivo: /Users/pluzzardi/luzzardi.txt
Bytes: 125

ou

Nome do Arquivo Texto: banana.txt


Erro: Arquivo no existe
Could not find file "/Users/pluzzardi/banana.txt".

A seguir so descritos os principais mtodos da classe


StreamWriter para manipular arquivos em C#:

Tabela 26: Principais mtodos da classe StreamWriter

Mtodo Descrio
Close Fecha o arquivo
Dispose() Libera qualquer recurso utilizado pelo arquivo
Equals(Object) Verifica se o arquivo especificado igual ao arquivo atual
Limpa todos os buffers para o gravador atual e fora gravao em
Flush
disco
ToString Retorna uma string que representa o arquivo atual
Write(tipo_base) Grava o tipo_base no arquivo
Grava um terminador de linha para a cadeia de caracteres de texto ou
WriteLine()
para o fluxo
WriteLine(tipo_base) Grava o tipo_base no arquivo com newLine

14.3 Listar um diretrio em C#

Programa exemplo: O programa exibe na tela (lista) os arquivos e


diretrios do pathname especificado.

96
// ------------------------------------------- Fonte: FileDir.cs

using System;
using System.IO;

namespace FileDir
{
public class MainClass
{
public static void Main ()
{
DirectoryInfo diretorio = new DirectoryInfo ("/Users/pluzzardi");
// --------------------------------------------------------------------- listar diretrio
DirectoryInfo[] fileDir = diretorio.GetDirectories ();
Console.WriteLine ("Lista de Diretrios: ");
foreach (DirectoryInfo dirinfo in fileDir) {
Console.WriteLine (dirinfo.Name);
}
// ---------------------------------------------------------------------- listar arquivos
Console.WriteLine ("Lista de Arquivos: ");
FileInfo[] files = diretorio.GetFiles ("*.*");
foreach (FileInfo fileinfo in files) {
Console.WriteLine (fileinfo.Name);
}
}
}
}

Resultado do Programa:

Lista de Diretrios:
.Trash
.config
.cups
.dropbox
.local
.netbeans-derby
.ssh
Desktop
Documents
Downloads
Dropbox
Library
Movies
Music
NetBeansProjects
Pictures
Projects
Public
Lista de Arquivos:
.CFUserTextEncoding
.DS_Store
.bash_history
.gbas
.viminfo
Frutas.txt
Leitura.zip
Luzzardi.txt
frutas.luz
nomes.txt

Programa exemplo: O programa exibe (lista) na tela os arquivos e


diretrios do pathname especificado pelo usurio.

// -------------------------------------------- Fonte: FileDir2.cs

using System;
using System.IO;

namespace FileDir2
{
public class MainClass
{
public static void Main ()

97
{
Console.Write ("Pathname: ");
String pathName = Console.ReadLine ();
DirectoryInfo diretorio = new DirectoryInfo (pathName);
// --------------------------------------------------------------------- listar diretrio
DirectoryInfo[] fileDir = diretorio.GetDirectories ();
Console.WriteLine ("Lista de Diretrios: ");
foreach (DirectoryInfo dirinfo in fileDir) {
Console.WriteLine (dirinfo.Name);
}
// ---------------------------------------------------------------------- listar arquivos
Console.WriteLine ("Lista de Arquivos: ");
FileInfo[] files = diretorio.GetFiles ("*.*");
foreach (FileInfo fileinfo in files) {
Console.WriteLine (fileinfo.Name);
}
}
}
}

Resultado do Programa:

Pathname: /Users/pluzzardi
Lista de Diretrios:
.Trash
.config
.cups
.dropbox
.local
.netbeans-derby
.ssh
Desktop
Documents
Downloads
Dropbox
Library
Movies
Music
NetBeansProjects
Pictures
Projects
Public
Lista de Arquivos:
.CFUserTextEncoding
.DS_Store
.bash_history
.gbas
.viminfo
Frutas.txt
Leitura.zip
Luzzardi.txt
frutas.luz
nomes.txt

14.4 Manipulao de um arquivo texto de palavras em C#

A seguir so mostrados alguns programas exemplos que manipulam


um arquivo texto contendo palavras. Veja o formato no exemplo abaixo:

5 <enter>
carambola
beringela
abacate
ervilha
damasco

Programa exemplo: O programa permite criar um arquivo de palavras


(palavras.dat) permitindo a gravao destas palavras.

// --------------------------------------------- Fonte: FileWrite.cs

98
using System;
using System.IO;

namespace FileWrite
{
class MainClass
{
public static void Main (string[] args)
{
String line;
String path = "/Users/pluzzardi/";
String nomeArquivo = "palavras.dat";
nomeArquivo = path + nomeArquivo;
if (!File.Exists (nomeArquivo)) {
try {
using (StreamWriter file = new StreamWriter (nomeArquivo)) {
Console.Write ("Nmero de palavras: ");
String s = Console.ReadLine ();
int numeroPalavras = int.Parse (s);
file.WriteLine(s);
for (int i = 1; i <= numeroPalavras; i++) {
Console.Write ("Palavra: ");
line = Console.ReadLine ();
file.WriteLine (line);
}
file.Close();
}
} catch (Exception e) {
Console.WriteLine ("Erro: Arquivo no existe");
Console.WriteLine (e.Message);
}
} else {
Console.WriteLine ("Erro: Arquivo j existe");
}
}
}
}

Resultado do Programa:

Nmero de palavras: 5 <enter>


Palavra: carambola <enter>
Palavra: beringela <enter>
Palavra: abacate <enter>
Palavra: ervilha <enter>
Palavra: damasco <enter>

Arquivo gerado:

5
carambola
beringela
abacate
ervilha
damasco

Programa exemplo: O programa permite abrir o arquivo de palavras


(palavras.dat) e exibe-os na tela.

// ------------------------------------------ Fonte: FileRead.cs

using System;
using System.IO;

namespace FileRead
{
class MainClass
{
public static void Main (string[] args)
{
String path = "/Users/pluzzardi/";
String nomeArquivo = "palavras.dat";
nomeArquivo = path + nomeArquivo;
try {

99
using (StreamReader file = new StreamReader (nomeArquivo)) {
string line;
while ((line = file.ReadLine ()) != null) {
Console.WriteLine(line);
}
file.Close();
}
} catch (Exception e) {
Console.WriteLine ("Erro: Arquivo no existe");
Console.WriteLine (e.Message);
}
}
}
}

Resultado do Programa:

5
carambola
beringela
abacate
ervilha
damasco

Programa exemplo: O programa permite consultar o arquivo de palavras


(palavras.dat). Para tanto solicitado, ao usurio, o nmero do
registro para ser calculado a posio deste registro no arquivo. Logo
aps o registro exibido na tela.

// ----------------------------------------- Fonte: FileConsulta.cs

using System;
using System.IO;

namespace FileConsulta
{
class MainClass
{
public static void Main (string[] args)
{
int numeroLinhas;
String path = "/Users/pluzzardi/";
String nomeArquivo = "palavras.dat";
nomeArquivo = path + nomeArquivo;
try {
using (StreamReader file = new StreamReader (nomeArquivo)) {
numeroLinhas = System.IO.File.ReadAllLines(nomeArquivo).Length;
Console.WriteLine("Nmero de Linhas: " + numeroLinhas);
String [] linhas = new String[numeroLinhas];
string line;
int n = 0;
while ((line = file.ReadLine ()) != null) {
linhas[n] = line;
n++;
}
file.Close();
int posicao;
do {
Console.Write("Posio da Linha [1.." + numeroLinhas + "]: ");
String s = Console.ReadLine();
posicao = int.Parse(s);
if (posicao >= 1 && posicao <= numeroLinhas) {
Console.WriteLine("Linha: " + linhas[posicao - 1]);
} else {
Console.WriteLine("Erro: Posio Invlida");
}
} while (posicao != 0);
}
} catch (Exception e) {
Console.WriteLine ("Erro: Arquivo no existe");
Console.WriteLine (e.Message);
}
}

100
}
}

Resultado do Programa:

Nmero de Linhas: 6
Posio da Linha [1..6]: 1
Linha: 5
Posio da Linha [1..6]: 2
Linha: carambola
Posio da Linha [1..6]: 3
Linha: beringela
Posio da Linha [1..6]: 4
Linha: abacate
Posio da Linha [1..6]: 5
Linha: ervilha
Posio da Linha [1..6]: 6
Linha: damasco
Posio da Linha [1..6]: 7
Erro: Posio Invlida
Posio da Linha [1..6]: 0
Erro: Posio Invlida

14.5 Arquivo Texto em C#

A seguir mostrado um programa que l um arquivo texto


contendo: (a) Total de Palavras e (b) Lista de Palavras (nome de
frutas) e sorteia e exibe na tela uma destas palavras

Arquito Texto: Frutas.txt

15
abacaxi
abacate
banana
pitanga
goiaba
morango
carambola
kiwi
laranja
bergamota
tomate
uva
caqui
lima
jaca

// ---------------------------------------------- Fonte: Leitura.cs

using System;
using System.IO;

namespace Leitura
{
class MainClass
{
public static void Main (string[] args)
{
int numeroLinhas;
String path = "/Users/pluzzardi/";
String nomeArquivo = "frutas.txt";
nomeArquivo = path + nomeArquivo;
try {
using (StreamReader file = new StreamReader (nomeArquivo)) {
numeroLinhas = System.IO.File.ReadAllLines(nomeArquivo).Length;
Console.WriteLine("Nmero de Linhas: " + numeroLinhas);
String [] linhas = new String[numeroLinhas];
string line;
int n = 0;
while ((line = file.ReadLine ()) != null) {
linhas[n] = line;
Console.WriteLine(line);

101
n++;
}
file.Close();
Random rnd = new Random ();
int numeroSorteado = rnd.Next (numeroLinhas);
Console.WriteLine("Palavra Sorteada: " + linhas[numeroSorteado]);
}
} catch (Exception e) {
Console.WriteLine ("Erro: Arquivo no existe");
Console.WriteLine (e.Message);
}
}
}
}

Resultado do Programa:

Total de palavras: 15
Palavra: abacaxi
Palavra: abacate
Palavra: banana
Palavra: pitanga
Palavra: goiaba
Palavra: morango
Palavra: carambola
Palavra: kiwi
Palavra: laranja
Palavra: bergamota
Palavra: tomate
Palavra: uva
Palavra: caqui
Palavra: lima
Palavra: jaca
Palavra Sorteada: bergamota

A seguir mostrado um programa que l um arquivo texto


contendo: (a) Total de Palavras e (b) Lista de Palavras (nome de
frutas) lendo as linhas do arquivo texto com Read.

// ---------------------------------------------- Fonte: Acesso.cs

using System;
using System.IO;
using System.Text;

namespace Acesso
{
class MainClass
{
public static void Main (string[] args)
{
Console.Write ("Nome do arquivo texto: ");
string path = Console.ReadLine ();
if (File.Exists (path)) {
using (FileStream arq = File.OpenRead (path)) {
byte[] line = new byte[1024];
while (arq.Read (line, 0, line.Length) > 0) {

int i = 0;
while (line [i] != 10) {
Console.Write ((char)line [i]);
i++;
if (line [i] == 13) {
Console.WriteLine ();
}
}
}
arq.Close ();
}
} else {
Console.WriteLine ("Erro: Problema no Arquivo");
}
}
}
}

102
Resultado do Programa:

Nome do arquivo texto: /Users/pluzzardi/frutas.txt


15
abacaxi
abacate
banana
pitanga
goiaba
morango
carambola
kiwi
laranja
bergamota
tomate
uva
caqui
lima
jaca

A seguir mostrado um outro programa que l um arquivo texto


exibindo: (a) Nmero de Linhas e (b) Nmero de Bytes.

// --------------------------------------------------- Fonte: Bytes.cs

using System;
using System.IO;

namespace Bytes
{
class MainClass
{
public static void Main (string[] args)
{
Console.Write ("Nome do Arquivo Texto: ");
String nomeArquivo = Console.ReadLine ();
try {
using (StreamReader file = new StreamReader (nomeArquivo)) {
long linhas = System.IO.File.ReadAllLines(nomeArquivo).Length;
long bytes = 0;
string line;
while ((line = file.ReadLine ()) != null) {
bytes += line.Length;
}
file.Close();
Console.WriteLine(linhas + " Linhas(s)");
Console.WriteLine(bytes + " Byte(s)");
}
} catch (Exception e) {
Console.WriteLine ("Erro: Arquivo no existe");
Console.WriteLine (e.Message);
}
}
}
}

Resultado do Programa:

Nome do Arquivo Texto: /Users/pluzzardi/Frutas.txt


16 Linha(s)
93 Byte(s)

A seguir mostrado um outro programa que l um arquivo texto


exibindo:

a) Todas as linhas do arquivo texto com seu respectivo nmero


b) Nmero de Linhas
c) Nmero de Bytes

// --------------------------------------------------- Fonte: Listar.cs

103
using System;
using System.IO;

namespace Listar
{
class MainClass
{
public static void Main (string[] args)
{
Console.Write ("Nome do Arquivo Texto: ");
String nomeArquivo = Console.ReadLine ();
try {
using (StreamReader file = new StreamReader (nomeArquivo)) {
long linhas = System.IO.File.ReadAllLines(nomeArquivo).Length;
long bytes = 0;
string line;
while ((line = file.ReadLine ()) != null) {
bytes += line.Length;
Console.WriteLine(line);
}
file.Close();
Console.WriteLine(linhas + " Linhas(s)");
Console.WriteLine(bytes + " Byte(s)");
}
} catch (Exception e) {
Console.WriteLine ("Erro: Arquivo no existe");
Console.WriteLine (e.Message);
}
}
}
}

Resultado do Programa:

Nome do Arquivo: /Users/luzzardi/Frutas.txt


1: 15
2: abacaxi
3: abacate
4: banana
5: pitanga
6: goiaba
7: morango
8: carambola
9: kiwi
10: laranja
11: bergamota
12: tomate
13: uva
14: caqui
15: lima
16: jaca
16 Linha(s)
93 Byte(s)

A seguir mostrado um outro programa que l um arquivo texto e


o nmero de uma linha e exibe: (a) A linha especificada

// ------------------------------------------------------------ Fonte: Linha.cs

using System;
using System.IO;

namespace Linha
{
class MainClass
{
public static void Main (string[] args)
{
Console.Write ("Nome do Arquivo Texto: ");
String nomeArquivo = Console.ReadLine ();
Console.Write ("Nmero da Linha: ");
int numeroLinha = int.Parse (Console.ReadLine());
int linha = 1;
try {
using (StreamReader file = new StreamReader (nomeArquivo)) {

104
string line;
while ((line = file.ReadLine ()) != null) {
if (numeroLinha == linha) {
Console.WriteLine(linha + ": " + line);
}
linha++;
}
file.Close();
}
} catch (Exception e) {
Console.WriteLine ("Erro: Arquivo no existe");
Console.WriteLine (e.Message);
}
}
}
}

Resultado do Programa:

Nome do Arquivo Texto: /Users/pluzzardi/Frutas.txt


Nmero da Linha: 5
5: pitanga

14.6 Lista de exerccios (arquivos)

14.6.1 Escreva um programa em C# que recebe via teclado o nome de um


arquivo texto. O programa deve imprimir na tela o nmero de bytes
(caracteres) e o nmero de linhas do arquivo ou ERRO: Arquivo no
existe.

Exemplo:

Nome do arquivo texto: LISTA.CS <enter>


(12345) Bytes
(44) Linhas

ou

ERRO: Arquivo no existe

14.6.2 Escreva um programa em C# que recebe via teclado o nome de um


arquivo texto. O programa deve permitir ao usurio consultar o arquivo
atravs da entrada via teclado do nmero da linha. O programa deve
imprimir a linha especificada ou ERRO: Linha no existe (zero para
abandonar).

Exemplo:

Nome do arquivo texto: LISTA.CS <enter>


Nmero de linha: 7 <enter>
7: int i, j, k;
Nmero de linha: 70 <enter>
ERRO: Linha no existe
Nmero de linha: 0 <enter> // sada do programa
ERRO: Arquivo no existe

14.6.3 Escreva um programa em C# que recebe via teclado o nome de dois


arquivos texto (origem e destino). O programa deve copiar o contedo
do arquivo origem para o arquivo destino.

Exemplo:

Arquivo origem: LISTA.CS <enter>


Arquivo destino: LISTA.tmp <enter>

105
(20345) Bytes copiados

14.6.4 Escreva um programa em C# que recebe via teclado o nome do


arquivo texto fonte e o nome do arquivo texto destino. O programa deve
converter o arquivo para maisculo ou minsculo (conforme escolha do
usurio) gerando o arquivo texto destino.

Exemplo:

Arquivo fonte: LISTA.CS <enter>


Arquivo destino: LISTA.TMP <enter>
[+] Maisculo ou [-] Minsculo: + <enter>
(1234) Bytes convertidos

14.6.5 Escreva um programa em C# que recebe via teclado o nome de um


arquivo texto e uma palavra. O programa deve imprimir todas as linhas
que possuem esta palavra.

Exemplo:

Nome do arquivo texto: PALAVRA.DAT <enter>


Palavra: if <enter>
23: if (a == b) {
33: if (ch == '\n') {
37: if (compara(linha,palavra)) {
41: if (ch != '\n') {
59: if (linha[i] == palavra[0]) {
65: if (linha[k] != palavra[j]) {
69: if (achei) {

14.6.6 Escreva um programa em C# que recebe via teclado o nome de um


arquivo texto. O programa deve permitir ao usurio consultar o arquivo
atravs da entrada via teclado do nmero inicial e nmero final. O
programa deve imprimir desde a linha inicial at a linha final ou
ERRO: Linhas no existem.

Exemplo:

Nome do arquivo texto: LISTA.CS <enter>


Nmero inicial: 7 <enter>
Nmero final: 9 <enter>
7: int i, j, k;
8: char tecla;
9: long bytes = 0;

ou

Nmero inicial: 70 <enter>


Nmero final: 90 <enter>
ERRO: Linhas no existem

14.6.7 Escreva um programa em C# (grava.cs) que recebe via teclado o


nome de um arquivo texto. O programa deve permitir ao usurio inserir
nomes (mximo 30 caracteres) neste arquivo via teclado. O programa
termina quando o usurio digitar <enter> na entrada do nome.

Exemplo:

Nome do arquivo texto: NOMES.DAT <enter>


Nome: Beatriz <enter>
Nome: Eva <enter>

106
Nome: Debora <enter>
Nome: Carla <enter>
Nome: Fatima <enter>
Nome: Ana <enter>
Nome: <enter>

14.6.8 Escreva um programa em C# (ler.cs) que recebe via teclado o


nome de um arquivo texto. O programa deve ler e imprimir na tela todos
os nomes armazenados no arquivo pelo programa "grava.cs".

Exemplo:

Nome do arquivo texto: NOMES.DAT <enter>


Nome: Beatriz
Nome: Eva
Nome: Debora
Nome: Carla
Nome: Fatima
Nome: Ana

14.6.9 Escreva um programa em C# (sort.cs) que recebe via teclado o


nome de um arquivo texto. O programa deve ler, ordenar e gravar
novamente os nomes no mesmo arquivo.

Exemplo:

Nome do arquivo texto: NOMES.DAT <enter>


Ok, arquivo ordenado

Observao: Utilize o programa anterior (ler.cs) para ver os nomes


ordenados.

14.6.10 Escreva um programa em C# (salva.cs) que recebe via teclado o


nome de um arquivo texto. O programa deve permitir ao usurio inserir
nome, idade e sexo ([M]asculino ou [F]eminino) neste arquivo via
teclado. O programa termina quando o usurio digitar <enter> na
entrada do nome.

Exemplo:

Nome do arquivo texto: DADOS.DAT <enter>


Nome: Paulo Roberto <enter>
Idade: 41 <enter>
Sexo [M/F]: m <enter>
Nome: Renato Luis <enter>
Idade: 38 <enter>
Sexo [M/F]: m <enter>
Nome: Ana Maria <enter>
Idade: 44 <enter>
Sexo [M/F]: f <enter>
Nome: <enter>

14.6.11 Escreva um programa em C# (list.cs) que recebe via teclado o


nome de um arquivo texto. O programa deve ler e imprimir na tela todos
os dados (nome, idade e sexo) armazenados no arquivo pelo programa
"salva.cs" (veja exemplo abaixo).

Exemplo:

Nome do arquivo texto: DADOS.DAT <enter>


Nome: Paulo Roberto

107
Idade: 41
Sexo: MASCULINO
Nome: Renato Luis
Idade: 38
Sexo: MASCULINO
Nome: Ana Maria
Idade: 44
Sexo: FEMININO

14.6.12 Escreva um programa em C# (conta.cs) que recebe via teclado o


nome de um arquivo texto. O programa deve verificar a quantidade de
homens e a quantidade de mulheres no aquivo criado pelo programa
"salva.cs".

Exemplo:

Nome do arquivo texto: DADOS.DAT <enter>


(2) Homens
(1) Mulheres

Soluo do problema 14.6.2:

// ------------------------------------------------------------ Fonte: FileSeek.cs

using System.IO;
using System.Text;

namespace FileSeek
{
class MainClass
{
public static void Main (string[] args)
{
int nl, linha = 1;
Console.Write ("Nome do arquivo texto: ");
string path = Console.ReadLine ();
if (File.Exists (path)) {
using (FileStream arq = File.OpenRead (path)) {
byte[] line = new byte[1024];
while (arq.Read (line, 0, line.Length) > 0) {
do {
bool existe = false;
Console.Write ("Nmero da Linha: ");
String s = Console.ReadLine ();
nl = int.Parse (s);
Console.Write (linha + ": ");
int i = 0;
while (line [i] != 10) {
if (nl == linha) {
Console.Write ((char)line [i]);
existe = true;
}
i++;
if (line [i] == 13) {
linha++;
}
}
if (!existe) {
Console.Write("Erro: Linha no existe");
}
linha = 1;
Console.WriteLine ();
} while (nl != 0);
}
// arq.Seek (0, SeekOrigin.Begin);
arq.Close ();
}
} else {
Console.WriteLine ("Erro: Problema no Arquivo");
}

108
}
}
}

Resultado do Programa:

Nome do arquivo texto: /Users/pluzzardi/frutas.txt


Nmero da Linha: 6
goiaba
Nmero da Linha: 8
carambola
Nmero da Linha: 4
banana
Nmero da Linha: 90
1: Erro: Linha no existe
Nmero da Linha: 0
1: Erro: Linha no existe

14.7 Arquivos binrios em C#

Arquivos em disco so organizados como uma fila de bytes, enquanto


um arquivo texto organizado com linhas que contm caracteres
finalizados com um \n, normalmente cdigo 10 (LF - LineFeed) mais
cdigo 13 (CR Carriage Return) e um end of file (EOF) marcando o
final do arquivo, um arquivo binrio grava e recupera as informaes
em blocos de dados, ou seja, um nmero inteiro qualquer salvo,
normalmente com 4 bytes, isto , um nmero tipo cpf 12345678909, que
seria armazenado num arquivo texto com 11 bytes, gravado num arquivo
binrio com apenas 4 bytes.

A seguir mostrado um resumo das classes que operam com arquivos


texto e binrios.

Arquivos Texto
o StreamReader - escrever em arquivos texto
o StreamWriter - ler de arquivos texto
Arquivos Binrios
o BinaryWriter escrever em arquivos binrios
o BinaryReader ler de arquivos binrios

Abaixo, note que as declaraes para criar e carregar o arquivo


binrio utilizado nos programas a seguir utilizam os mtodos:
FileMode.Create e FileMode.Open. Veja na lista abaixo o porque disto.

FileStream file = new FileStream (nomeArquivo, FileMode.Create);


FileStream file = new FileStream (nomeArquivo, FileMode.Open);

FileMode.Create: Cria um novo arquivo. Se o arquivo existir, os


dados sero adicionados no final
FileMode.CreateNew: Cria um novo arquivo. Se o arquivo j existir,
uma exceo ser lanada
FileMode.Append: Abre um arquivo e adiciona dados ao final. Se o
arquivo no existir, ele criado
FileMode.Open: Abre um arquivo existente. Se o arquivo no
existir, uma exceo ser lanada

O programa a seguir mostra a gravao e leitura dos seguintes


dados: nome (string), idade (int) e sexo (char) em um arquivo binrio.

// ------------------------------------------------------- Fonte: BinaryWrite.cs

using System;
using System.Runtime.Serialization.Formatters.Binary;
using System.IO;

109
namespace BinaryWrite
{
class MainClass
{
public static void Main (string[] args)
{
String nome;
Console.Write ("Nome do arquivo binrio: ");
String nomeArquivo = Console.ReadLine ();
FileStream file = new FileStream (nomeArquivo, FileMode.Create);
BinaryWriter binario = new BinaryWriter (file);
do {
Console.Write ("Nome: ");
nome = Console.ReadLine ();
if ("".CompareTo (nome) != 0) {
Console.Write ("Idade: ");
String s = Console.ReadLine ();
int idade = int.Parse (s);
Console.Write ("Sexo [M/F]: ");
s = Console.ReadLine ();
char sexo = s [0];
binario.Write (nome);
binario.Write (idade);
binario.Write (sexo);
}
} while ("".CompareTo (nome) != 0);
binario.Close ();
file.Close ();
}
}
}

Resultado do Programa:

Nome do arquivo binrio: /Users/pluzzardi/Pessoas.luz


Nome: Paulo Roberto
Idade: 51
Sexo [M/F]: m
Nome: Renato Luis
Idade: 49
Sexo [M/F]: m
Nome: Francisco Carlos
Idade: 53
Sexo [M/F]: m
Nome:

// ------------------------------------------------------- Fonte: BinaryRead.cs

using System;
using System.Runtime.Serialization.Formatters.Binary;
using System.IO;

namespace BinaryRead
{
class MainClass
{
public static void Main (string[] args)
{
String nome;
long bytesLidos = 0;
Console.Write ("Nome do arquivo binrio: ");
String nomeArquivo = Console.ReadLine ();
if (File.Exists (nomeArquivo)) {
FileStream file = new FileStream (nomeArquivo, FileMode.Open);
BinaryReader binario = new BinaryReader (file);
long bytes = file.Length;
Console.WriteLine ("Bytes: " + bytes);
while (bytes > 0) {
nome = binario.ReadString ();
Console.WriteLine ("Nome: " + nome);
int idade = binario.ReadInt32 ();
Console.WriteLine ("Idade: " + idade);
char sexo = binario.ReadChar ();
Console.WriteLine ("Sexo: " + sexo);
bytesLidos = nome.Length + sizeof(Int32) + sizeof(char) + 1; // clculo do nmero de bytes lidos

110
Console.WriteLine ("Bytes Lidos: " + bytesLidos);
bytes = bytes - bytesLidos;
Console.WriteLine ("Bytes: " + bytes);
}
binario.Close ();
file.Close ();
} else {
Console.WriteLine ("Erro: Arquivo no existe");
}
}
}
}

Resultado do Programa:

Nome do arquivo binrio: /Users/pluzzardi/Pessoas.luz


Bytes: 58
Nome: Paulo Roberto
Idade: 51
Sexo: m
Bytes Lidos: 20
Bytes: 38
Nome: Renato Luis
Idade: 49
Sexo: m
Bytes Lidos: 18
Bytes: 20
Nome: Francisco Carlos
Idade: 53
Sexo: m
Bytes Lidos: 23
Bytes: -3

15. Conceitos diversos em C#

15.1 Operadores bit a bit em C#


Se referem ao teste, ajuste ou troca de bits reais por um byte
ou palavra (podem ser dos tipos char, int, byte, short ou long).

Tabela 27: Operadores bit a bit


Operador Ao
& And
| Or
^ Or exclusivo (XOr)
~ Complemento de um (Not)
>> Deslocar para a direita (shift)
<< Deslocar para a esquerda (shift)

Deslocamento (shift): varivel >> nmero de deslocamentos;

Exemplo:

// ---------------------------------------------- Fonte: bit.cs

using System;

namespace Bit
{
class MainClass
{
public static void Main (string[] args)
{
int a = 128, b, c; // a = 128 - binrio -> 10000000

b = a >> 1; // b = 64 - binrio -> 0100000


c = b << 1; // c = 128 -binrio -> 1000000
Console.WriteLine("a = {0}",a);
Console.WriteLine("b = {0}",b);

111
Console.WriteLine("c = {0}",c);
}
}
}

Resultado do Programa:

A = 128
b = 64
c = 128

15.2 Formas abreviadas de C#


C# tem abreviaes especiais que simplificam a codificao de um
certo tipo de comando de atribuio.

Exemplo:

x = x + 10; ... pode ser escrito como ... x += 10;

Esta forma abreviada funcionar com todos os operadores


aritmticos do C#.

Forma normal: varivel = varivel operador constante;


x = x + 7;

Forma abreviada: varivel operador= constante;


x += 7;

16. Listas Lineares: Pilha, Fila e Fila Circular em C#


A seguir visto a implementao de uma Pilha, uma Fila e uma
Fila Circular implementada em um vetor de inteiros.

Pilha: Estrutura linear organizada de forma que a entrada e a sada


dos dados feita na mesma extremidade.

Forma de acesso: LIFO (Last Input First Output), ou seja, o ltimo


elemento a entrar na pilha o primeiro a sair dela.

Fila: Estrutura linear organizada em forma que a entrada dos dados


feita por uma extremidade da lista linear e, a sada, feita na outra
extremidade.

Forma de acesso: FIFO (First Input First Output), ou seja, o primeiro


elemento a entrar na fila o primeiro a sair da fila.

E - Entrada de Dados
S - Sada de Dados

112
Figura 4: Representao de uma fila e uma pilha

Funcionamento desta pilha: Funcionamento desta fila:

Entrada: 1, 2 e 3 Entrada: 1, 2 e 3
Sada: 3, 2 e 1 Sada: 1, 2 e 3

16.1 Implementao de um lista em vetor em C#

A seguir visto um programa em C# que simula uma lista linear


armazenada em um vetor. Note que o nmero de elementos da lista
armazenado no primeiro nodo do vetor, ou seja, v[0].

Programa exemplo: O programa permite inserir nmeros inteiros em uma


Lista Linear implementada em um vetor. Quando o nmero digitado for
igual zero (0), todos os nmeros da lista so listados.

// ----------------------------------------------- Fonte: Linear.cs

using System;

namespace Linear
{
class MainClass
{
const int SUCESSO = 0;
const int LISTA_CHEIA = 1;
const int LISTA_VAZIA = 2;
// -------------------------------------------------- criaLista
static void criaLista (int[] v)
{
v [0] = 0; // armazena o nmero de elementos da lista
}
// -------------------------------------------------- incluiFim
static int incluiFim (int m, int[] v, int valor)
{
int n = v [0];

if (n < m - 1) {
v [0]++;
v [v [0]] = valor;
return(SUCESSO);
} else
return(LISTA_CHEIA);
}
// -------------------------------------------------- exibeLista
static void exibeLista (int[] v)
{
String s = "";
int n = v [0];

113
if (n == 0)
Console.WriteLine ("Erro: Lista Vazia");
else {
for (int i = 1; i <= n; i++)
s = s + v [i] + " ";
Console.WriteLine ("Lista: " + s);
}
}

public static void Main (string[] args)


{
const int m = 7;
int[] v = new int [m];
int valor;
int erro = 0;

criaLista (v);
do {
Console.Write ("Elemento: ");
String s = Console.ReadLine();
valor = int.Parse (s);
if (valor != 0)
erro = incluiFim (m, v, valor);
if (erro == LISTA_CHEIA) {
Console.WriteLine("Erro: Lista Cheia");
exibeLista (v);
return;
}
} while (valor != 0);
exibeLista (v);
}
}
}

Resultado do Programa:

Elemento: 10
Elemento: 20
Elemento: 30
Elemento: 40
Elemento: 50
Elemento: 0
Lista: 10 20 30 40 50

Programa exemplo: O programa permite inserir ([I]ncio, [P]osio ou


[F]im) nmeros inteiros em uma Lista Linear implementada em um vetor.
Quando o nmero digitado for igual zero (0), todos os nmeros da
lista so exibidos na tela.

// --------------------------------------------------------- Fonte: Linear2.cs

using System;

namespace Linear2
{
class MainClass
{
const int SUCESSO = 0;
const int LISTA_CHEIA = 1;
const int LISTA_VAZIA = 2;
// -------------------------------------------------- criaLista
static void criaLista (int[] v)
{
v [0] = 0; // armazena o nmero de elementos
}
// -------------------------------------------------- incluiFim
static int incluiFim (int m, int[] v, int valor)
{
int n = v [0];

if (n < m - 1) {
v [0]++;
v [v [0]] = valor;

114
return(SUCESSO);
} else
return(LISTA_CHEIA);
}
// -------------------------------------------------- incluiInic
static int incluiInic (int m, int[] v, int valor)
{
int n = v [0];

if (n < m - 1) {
v [0]++;
for (int i = n + 1; i >= 2; i--)
v [i] = v [i - 1];
v [1] = valor;
return(SUCESSO);
} else
return(LISTA_CHEIA);
}
// -------------------------------------------------- incluiPos
static int incluiPos (int m, int[] v, int valor, int pos)
{
int n = v [0];

if (n < m - 1) {
v [0]++;
if (pos == v [0] - 1) {
v [v [0]] = v [n];
v [n] = valor;
} else {
for (int i = n + 1; i >= pos; i--) {
v [i] = v [i - 1];
Console.WriteLine ("Valor: " + v [i]);
}
v [pos] = valor;
}
return(SUCESSO);
} else
return(LISTA_CHEIA);
}
// -------------------------------------------------- tamanhoLista
static int tamanhoLista (int[] v)
{
return(v [0]);
}
// -------------------------------------------------- exibeLista
static void exibeLista (int[] v)
{
String s = "";
int n = v [0];

if (n == 0) {
Console.WriteLine ("Erro: Lista Vazia");
} else {
for (int i = 1; i <= n; i++)
s = s + v [i] + " ";
Console.WriteLine ("Lista: " + s);
}
}

public static void Main (string[] args)


{
const int m = 7;
int[] v = new int [m];
int valor, pos, n;
int erro = 0;

criaLista (v);
do {
Console.Write ("Elemento [0 - sair]: ");
String s = Console.ReadLine ();
valor = int.Parse (s);
if (valor != 0) {
Console.Write ("[I]inicio, [P]osio ou [F]im: ");
s = Console.ReadLine();
char op = s [0];
switch (op) {

115
case 'I':
case 'i':
erro = incluiInic (m, v, valor);
break;
case 'P':
case 'p':
n = tamanhoLista (v);
do {
Console.Write ("Posio [1.." + n + "]: ");
s = Console.ReadLine ();
pos = int.Parse (s);
} while (pos < 1 && pos > n);
erro = incluiPos (m, v, valor, pos);
break;
case 'F':
case 'f':
erro = incluiFim (m, v, valor);
break;
}
if (erro == LISTA_CHEIA) {
Console.WriteLine ("Erro: Lista Cheia");
exibeLista (v);
return;
}
}
} while (valor != 0);
exibeLista (v);
}
}
}

Resultado do Programa:

Elemento [0 - sair]: 10
[I]inicio, [P]osio ou [F]im: i
Elemento [0 - sair]: 20
[I]inicio, [P]osio ou [F]im: f
Elemento [0 - sair]: 40
[I]inicio, [P]osio ou [F]im: f
Elemento [0 - sair]: 30
[I]inicio, [P]osio ou [F]im: p
Posio [1..3]: 3
Elemento [0 - sair]: 0
Lista: 10 20 30 40

16.2 Implementao de uma Pilha em C#

A seguir mostrado uma implementao de Pilha usando a classe


Pilha.

Programa exemplo: O programa permite inserir nmeros inteiros em uma


Pilha usando uma classe Pilha implementada pelo programador. Quando o
nmero digitado for igual zero (0), todos os nmeros da pilha so
listados.

// -------------------------------------------------------- Fonte: TestaPilha.cs

using System;

namespace TestaPilha
{
class MainClass
{
public static void Main (string[] args)
{
Pilha pilha = new Pilha(5);
int nodo;

do {
Console.Write("Elemento: ");
String s = Console.ReadLine();
nodo = int.Parse(s);

116
if (nodo != 0)
pilha.push(nodo);
} while (nodo != 0);
pilha.exibe();
}
}
}

// ---------------------------------------------------------- Fonte: Pilha.cs

using System;

namespace TestaPilha
{
public class Pilha
{
private int topo;
private int [] dados;

// ----------------------------------------------- construtor

public Pilha(int numElementos) { // construtor


dados = new int[numElementos];
topo = -1;
}

// ------------------------------------------------ push

public void push(int i) {


int n = dados.Length;

if (topo < n-1) {


topo++;
dados[topo] = i;
}
else
Console.WriteLine("Erro: Pilha Cheia");
}

// ------------------------------------------------ pop

public int pop() {


if (topo != 0) {
int valor = dados[topo];
topo--;
return(valor);
}
else
return(0);
}

// ------------------------------------------------ exibe

public void exibe() {


Console.Write("Pilha: ");
for (int i = topo;i >= 0;i--) {
Console.Write(dados[i] + " ");
}
Console.WriteLine();
}
}
}

Resultado do Programa:

Elemento: 10
Elemento: 20
Elemento: 30
Elemento: 40
Elemento: 50
Elemento: 60
Erro: Pilha Cheia
Elemento: 0
Pilha: 50 40 30 20 10

117
16.3 Implementao de uma Fila em C#

A seguir visto uma implementao de uma Fila usando a classe


Fila escrita pelo programador.

Programa exemplo: O programa permite inserir nmeros inteiros em uma


Fila usando uma classe Fila implementada pelo programador. Quando o
nmero digitado for igual zero (0), todos os nmeros da fila so
listados.
// ------------------------------------------------- Fonte: TestaFila.cs

using System;

namespace TestaFila
{
class MainClass
{
public static void Main (string[] args)
{
Fila fila = new Fila (5);
int nodo;

do {
Console.Write ("Elemento: ");
String s = Console.ReadLine ();
nodo = int.Parse (s);
if (nodo != 0)
fila.insereFila (nodo);
} while (nodo != 0);
nodo = fila.retiraFila ();
if (nodo == 0) {
Console.WriteLine ("Fila: Vazia");
} else {
String nodos = "";
while (nodo != 0) {
nodos = nodos + nodo + " ";
nodo = fila.retiraFila ();
}
Console.WriteLine ("Fila: " + nodos);
}
}
}
}

// --------------------------------------------------- Fonte: Fila.cs

using System;

namespace TestaFila
{
public class Fila
{
private int inic, fim, n;
private int [] dados;

// ---------------------------------------- construtor

public Fila(int numElementos) { // construtor


inic = -1;
fim = 0;
n = 0;
dados = new int[numElementos];
}

// ------------------------------------------------ insereFila

public void insereFila(int i) {


int max = dados.Length;

if (n < max) {
dados[fim] = i;
fim++;
n++;

118
}
else
Console.WriteLine("Erro: Fila Cheia");
}

// ------------------------------------------------ retiraFila

public int retiraFila() {


if (n != 0) {
inic++;
n--;
return(dados[inic]);
}
else
return(0);
}
}
}

Resultado do Programa:

Elemento: 10
Elemento: 20
Elemento: 30
Elemento: 40
Elemento: 50
Elemento: 60
Erro: Fila Cheia
Elemento: 0
Fila: 10 20 30 40 50

16.4 Implementao de uma Fila Circular em C#

Um problema que ocorre em estruturas de dados do tipo Fila que


aps algumas operaes de insero e remoo de elementos, pode
existir nodos vagos que no podem ser reaproveitados, pois normalmente
uma fila possui trs informaes que a controlam: primeiro, ltimo e
nmero de elementos, no permitindo que os nodos excludos sejam
ocupados novamente.

Uma forma de resolver este problema, a utilizao de uma Fila


Circular, onde todo nodo inserido ou removido tem sua posio
calculada por uma equao, fazendo com que, desta forma, sempre todos
os nodos sejam reocupados com uma informao.

Programa exemplo: O programa permite inserir nmeros inteiros em uma


Fila Circular, ou seja, existe reaproveitamento da fila. Quando o
nmero digitado for igual zero (0), todos os nmeros da fila so
listados.
// ------------------------------------------------------------ Fonte: Circular.cs

using System;

namespace Circular
{
class MainClass
{
public static void Main (string[] args)
{
FilaCircular fila = new FilaCircular(5);
int valor;
char ch;

do {
Console.Write("[I]ncluir, [E]xcluir ou [F]im? ");
do {
String s = Console.ReadLine();
ch = s[0];
} while (ch != 'I' && ch != 'i' && ch != 'E' && ch != 'e' &&
ch != 'F' && ch != 'f');

119
switch (ch) {
case 'I':
case 'i': Console.Write("Valor: ");
String s = Console.ReadLine();
valor = int.Parse(s);
fila.insereFilaCircular(valor);
break;
case 'E':
case 'e': valor = fila.excluiFilaCircular();
Console.WriteLine("Elemento Retirado da Fila: " + valor);
break;
}
} while (ch != 'F' && ch != 'f');
fila.exibeFilaCircular();
}
}
}

// --------------------------------------------------- Fonte: FilaCircular.cs

using System;

namespace Circular
{
public class FilaCircular
{
private int primeiro, ultimo, tamanho;
private int [] elem;

public FilaCircular(int numElementos) {


primeiro = 0;
ultimo = -1;
tamanho = 0;
elem = new int[numElementos];
}

// ------------------------------------ insereFilaCircular

public void insereFilaCircular(int dado) {


int n = elem.Length;

if (tamanho == n) {
Console.WriteLine("ERRO: Fila Cheia");
}
else {
tamanho++;
ultimo = (ultimo + 1) % n;
elem[ultimo] = dado;
}
}

// ----------------------------------- excluiFilaCircular

public int excluiFilaCircular() {


int n = elem.Length;

if (tamanho == 0) {
Console.WriteLine("ERRO: Fila Vazia");
return(-1);
}
else {
tamanho--;
int temp = primeiro;
primeiro = (primeiro + 1) % n;
return(elem[temp]);
}
}

// -------------------------------- exibeFilaCircular

public void exibeFilaCircular() {


int n = elem.Length;

if (tamanho == 0) {
Console.WriteLine("Fila Circular: Fila Vazia");
}

120
else {
int temp = primeiro;
Console.Write("Fila Circular: ");
for (int i = 1;i <= tamanho;i++) {
Console.Write(elem[temp] + " ");
temp = (temp + 1) % n;
}
Console.WriteLine();
}
}
}
}

Resultado do Programa:

[I]ncluir, [E]xcluir ou [F]im? i


Valor: 10
[I]ncluir, [E]xcluir ou [F]im? i
Valor: 20
[I]ncluir, [E]xcluir ou [F]im? i
Valor: 30
[I]ncluir, [E]xcluir ou [F]im? i
Valor: 40
ERRO: Fila Cheia
[I]ncluir, [E]xcluir ou [F]im? e
Elemento Retirado da Fila: 10
[I]ncluir, [E]xcluir ou [F]im? e
Elemento Retirado da Fila: 20
[I]ncluir, [E]xcluir ou [F]im? i
Valor: 50
[I]ncluir, [E]xcluir ou [F]im? i
Valor: 60
[I]ncluir, [E]xcluir ou [F]im? i
Valor: 70
ERRO: Fila Cheia
[I]ncluir, [E]xcluir ou [F]im?

17. Tratamento de erros em C#


Na execuo de um programa em C#, podem ocorrer erros no
previstos que podem interromper a execuo normal do programa. Tais
erros podem ser:

Converso numrica invlida;


Limite de um vetor (acessor a ndice invlido);
Problemas com arquivos: abertura, criao ou caminho;
Overflow;
Erro de entrada e sada (input/output);
Divizo por zero;
Validao de dados.

Em C#, o programa tem condies de assumir o controle da execuo


em caso que ocorra uma situao de erro no prevista.

Isso feito atravs do mecanismo de tratamento de excees que ao


detectar uma situao de erro, o programa em C# gera uma exceo. Se o
programa que estiver sendo executado possuir um tratamento de
excees, ele assume o controle da execuo. Mas se a exceo no
tiver um tratamento associado, o programa interrompido o programa em
C# gera uma mensagem de erro.

Uma exceo um evento que indica uma condio anormal que


interrompe a execuo normal de um programa.

O tratamento de erros no C# cria objetos da classe erro, o


tratamento destes erros feita pela manipulao destes objetos.

121
O tratamento de erros em C# basea-se em:

try {} catch {} finally {}.

A execuo de um bloco de cdigo, protegido por um tratamento de


erros, feito colocando o bloco no try, e para cada erro que se
deseja tratar, deve-se colocar uma clusula catch (tipo_de_erro
varivel_erro) {} e/ou uma clusula finally (opcional) que executada
aps a execuo do bloco try se no houver erro.

Sintaxe:

try {
// cdigo fonte normal
return;

} catch (Exception error) {


// cdigo que trata um tipo de erro ou mostra o erro

} catch (Exception error) {


// cdigo que trata outro tipo de erro ou exibe o erro

} finally { // opcional
// cdigo executado, mesmo tendo excesso
}

17.1 Tratamento de excees em C#

Excees so instncias de classes geradas quando houver erro.


Estas excees podem ser captadas e tratadas para que no ocorra erros
em tempo de execuo.

Os mtodos utilizados por classes de excees so:

getMessage(): Retorna uma string com o erro.

printStackTrace(): Imprime na tela um histrico do erro e as


linhas aonde os erros ocorreram.

toString(): Converte a exceo numa String.

getCause(): Retorna a causa da exceo ou null se a causa for


desconhecida ou no existir.

17.2 Tratamento de erros na entrada de nmero inteiro em C#

O programa exemplo abaixo verifica e trata a exceo: formato


invlido do nmero (FormatException).

// ------------------------------------------------------- Fonte: inteiro.cs

using System;

namespace Inteiro
{
class MainClass
{
public static void Main (string[] args)
{
int inteiro = -999;

122
try {
Console.Write ("Inteiro: "); // cdigo protegido contra erro
String s = Console.ReadLine ();
inteiro = int.Parse (s);
return;
} catch (FormatException error) {
// error.printStackTrace(); // mostra as linhas do erro
Console.WriteLine ("ERRO: " + error); // exibe o erro
} finally { // OPCIONAL
Console.WriteLine ("INTEIRO: " + inteiro); // executa depois do catch
}
}
}
}

Resultado do Programa (sem erro): [usurio digitou 120]

Inteiro: 120
INTEIRO: 120

Resultado do Programa (sem erro): [usurio digitou abc]

Inteiro: abc
ERRO: System.FormatException: Input string was not in the correct format
at System.Int32.Parse (System.String s) [0x00000] in <filename unknown>:0
at Inteiro.MainClass.Main (System.String[] args) [0x00019] in
/Users/pluzzardi/Projects/Inteiro/Inteiro/Program.cs:14
INTEIRO: -999

17.3 Tratamento de erros: Diviso por zero em C#

O programa exemplo abaixo verifica e trata os seguintes erros:


(a) diviso por zero; (b) usurio apenas digitou <enter> sem nenhum
nmero e (c) digitou letras (NumberFormatException e ArithmeticException).
// ------------------------------------------------------ Fonte: Divisao.cs

using System;

namespace DivideZero
{
class MainClass
{
public static void Main (string[] args)
{
float x, y, div = -999;

try {
Console.Write ("Dividendo: ");
String s = Console.ReadLine ();
x = float.Parse (s);
Console.Write ("Divisor: ");
s = Console.ReadLine ();
y = float.Parse (s);
div = x / y;
Console.WriteLine ("Diviso: " + div);
} catch (FormatException error) {
Console.WriteLine ("Status: " + error);
Console.WriteLine ("Diviso: " + div);
} catch (ArithmeticException error) { // no funcionou
Console.WriteLine ("Status: " + error);
Console.WriteLine ("Diviso: " + div);
}
}
}
}

Resultado do Programa (sem erro): [usurio digitou 3 + 2]


Dividendo: 3
Divisor: 2
Divisao: 1.5

123
Resultado do Programa (sem erro): [usurio digitou 3 + 0]
Dividendo: 3
Divisor: 0
Divisao: +Infinity

Resultado do Programa (com erro): [usurio digitou abc]


Dividendo: abc
Status: System.FormatException: Unknown char: a
at System.Double.Parse (System.String s, NumberStyles style, IFormatProvider provider)
[0x00000] in <filename unknown>:0
at System.Single.Parse (System.String s) [0x00000] in <filename unknown>:0
at DivideZero.MainClass.Main (System.String[] args) [0x00013] in
/Users/pluzzardi/Projects/DivideZero/DivideZero/Program.cs:14
Diviso: -999

18. Herana em C#

18.1 Herana simples em C#

A herana simples permite que uma classe incorpore os atributos


e mtodos de outra classe, ou seja, permite a construo de
hierarquias de classes.

O primeiro passo envolve a definio de uma classe base


(superclasse) que define as caractersticas comuns a todos os objetos
derivados desta classe. As classes oriundas da classe base so
chamadas classes derivadas ou extenso da classe (subclasse)

Uma classe derivada herda todas as caractersticas da classe


base e pode ter novas caractersticas adicionadas a ela. Uma classe
derivada segue a seguinte diretriz em relao a classe base:

classe_derivada um(a) classe_base

Exemplo: um cardial um pssaro // classe base: pssaro


// classe derivada: cardial

Especificadores de acesso:

public (pblico)

Quem tem acesso classe tem acesso tambm a qualquer membro


pblico.
raro ter atributos pblicos, mas comum ter mtodos
pblicos.
Qualquer mtodo tem acesso.

private (privado)

Um membro privado no acessvel fora da classe, somente


pelos membros da classe.
A inteno permitir que apenas quem escreve a classe possa
usar esse membro.

protected (protegido)

O membro protegido acessvel classe e a suas sub-classes


(classes derivadas).

124
A inteno dar acesso aos programadores que estendero sua
classe.

18.2 Controle de acesso na definio de uma classe derivada em C#

Quando uma classe derivada definida, ou seja, na definio de


herana simples, seus membros (atributos e mtodos) so declarados
internamente e o acesso a estes pode ser pblico (public), privativo
(private) ou protegido (protected). O acesso a membros protegidos
igual ao acesso a membros privativos, exceto para o acesso das classes
derivadas da classe.
A forma geral de especificar herana simples :

Especificador_de_acess class nome_classe_derivada extends nomeclasse_base {


// atributos
// mtodos
}
Quando uma classe herda as caractersticas de outra classe,
todos os membros da classe base tornam-se membros da classe derivada.
O tipo de acesso da classe base dentro da classe derivada
determinado pelo especificador de acesso. Qualquer que seja o
especificador de acesso, membros privativos da classe base continuam
sendo propriedade privada da classe base, e no podem ser acessados
por classes derivadas.
Quando o especificador de acesso public, todos os membros
pblicos da classe base tornam-se membros pblicos da classe derivada,
e os membros protegidos da classe base tornam-se membros protegidos da
classe derivada. Esta a diferena que existe entre membros
privativos e membros protegidos.
Quando o especificador de acesso private, todos os membros
pblicos e protegidos da classe base tornam-se membros privativos da
classe derivada, ou seja, a classe derivada no pode transferir seus
privilgios de acesso a outras classes.
Quando o especificador de acesso protected, todos os membros
pblicos e protegidos da classe base tornam-se membros protegidos da
classe derivada.

Programa exemplo: O objetivo do programa a seguir demonstrar a


utilizao de herana simples (atributos da classe base so privados).

// ------------------------------------------------------- Fonte: Heranca.cs

using System;

namespace Heranca
{
class MainClass
{
public static void Main (string[] args)
{
Derivada objeto = new Derivada(3);
int resp;

objeto.Seta(1, 2);
resp = objeto.Soma();
Console.WriteLine("Somador (x + y + z): " + objeto.Somador(resp));
}
}
}

// -------------------------------------------------------- Fonte: base.cs

125
using System;

namespace Heranca
{
public class Base
{
private int x, y; // atributos privados

public Base ()
{
}
public void Seta(int a, int b)
{
x = a;
y = b;
Console.WriteLine("x = " + x);
Console.WriteLine("y = " + y);
}

public int Soma()


{
Console.WriteLine("Soma (x + y): " + (x + y));
return(x + y);
}
}
}

// ---------------------------------------------------------- Fonte: Derivada.cs

using System;

namespace Heranca
{
public class Derivada : Base
{
private int z;

public Derivada (int x)


{
z = x;
Console.WriteLine ("z = " + z);
}

public int Somador (int soma)


{
// no possvel acessar x e y pois so privados da classe base
return(soma + z);
}
}
}

Resultado do Programa:

z = 3
x = 1
y = 2
Soma (x + y): 3
Somador (x + y + z): 6

Responda: Porque o atributo z mostrado primeiro?

18.3 Tipos de acessos (especificadores de acesso) em C#

public (pblico): Todos os atributos da classe base so pblicos


na classe derivada.
private (privado): Os atributos s podem ser acessados pelos
mtodos que fazem parte da classe.
protected (protegido): Os atributos podem ser acessados pelos
mtodos de classes derivadas.

126
Programa exemplo: O objetivo do programa demonstrar a utilizao de
herana simples (atributos da classe base so protegidos).

// ---------------------------------------------------------- Fonte: Heranca2.cs

using System;

namespace Heranca1
{
class MainClass
{
public static void Main (string[] args)
{
Derivada objeto = new Derivada(3);
int resp;

objeto.Seta(1, 2);
resp = objeto.Soma();
Console.WriteLine("Somador (x + y + z): " + objeto.Somador(resp));
}
}
}

// ----------------------------------------------------------- Fonte: base.cs

using System;

namespace Heranca1
{
public class Base
{
protected int x, y; // atributos protegidos

public Base() {
}

public void Seta(int a, int b) {


x = a;
y = b;
Console.WriteLine("x = " + x);
Console.WriteLine("y = " + y);
}

public int Soma() {


Console.WriteLine("Soma (x + y): " + (x + y));
return(x + y);
}
}
}

// ------------------------------------------------------------ Fonte: Derivada.cs

using System;

namespace Heranca1
{
public class Derivada : Base
{
private int z;

public Derivada (int x)


{
z = x;
Console.WriteLine ("z = " + z);
}

public int Somador (int soma)


{
return(x + y + z); // possvel acessar x e y pois so protegidos na classe base
}
}
}

Resultado do Programa:

127
z = 3
x = 1
y = 2
Soma (x + y): 3
Somador (x + y + z): 6

18.4 Lista de exerccios sobre Herana em C#

18.4.1 Herana (primeiro) em C#

Dado os seguintes cdigos em C#:



// ------------------------------------------------------------------ TestaHeranca.cs

using System;

namespace TestaHeranca
{
class MainClass
{
public static void Main (string[] args)
{
Cliente cliente = new Cliente("Paulo Roberto", "123.456-78", 1234.56);

cliente.imprimePessoa();
cliente.imprimeCliente();
}
}
}

// ----------------------------------------------------------------------- Pessoa.cs

using System;

namespace TestaHeranca
{
public class Pessoa
{
protected String nome;
protected String cpf;

public Pessoa() {
this.nome = "xxxx";
this.cpf = "xxx.xxx.xxx-xx";
}

public Pessoa(String nome, String cpf) {


this.nome = nome;
this.cpf = cpf;
}

public void imprimePessoa() {


Console.WriteLine("Nome: " + nome);
Console.WriteLine("CPF: " + cpf);
}
}
}

// ----------------------------------------------------------------------- Cliente.cs

using System;

namespace TestaHeranca
{
public class Cliente : Pessoa
{
private double conta;

public Cliente (String nome, String cpf, double conta)


{
this.conta = conta;
}

128
public void imprimeCliente ()
{
Console.WriteLine ("Conta: " + conta);
}
}
}

Resultado correto do programa:

Nome: Paulo Roberto


CPF: 123.456-78
Conta: 1234.56

Resultado do cdigo do programa acima:

Nome: xxxx
CPF: xxx.xxx.xxx-xx
Conta: 1234.56

Que modificaes devem ser feitas no cdigo fonte para que o


resultado do programa seja o esperado?

18.4.2 Herana (segundo) em C#

Dado a classe base Pessoa e o programa principal TestaHomem,


construa as classes derivadas Homem e Mulher que contenha os atributos
e mtodos abaixo descritos:

// -------------------------------------------------------------- Pessoa.cs

using System;

namespace TestaSexo
{
public class Pessoa
{
protected double altura;
protected char sexo;

public Pessoa() {
this.altura = 0.0;
this.sexo = 'g';
}

public Pessoa(double altura, char sexo) {


this.altura = altura;
this.sexo = sexo;
}

public void imprimePessoa() {


Console.WriteLine("Altura: " + altura);
Console.WriteLine("Sexo: " + sexo);
}
}
}

Pessoa
altura
sexo
imprimePessoa

Homem
pesoIdeal
calculaPesoIdealHomem
imprimePesoIdealHomem

129
Mulher
pesoIdeal
calculaPesoIdealMulher
imprimePesoIdealMulher

// ------------------------------------------------------------- TestaSexo.cs

using System;

namespace TestaSexo
{
class MainClass
{
public static void Main (string[] args)
{
Homem homem = new Homem(1.64, 'm');
Mulher mulher = new Mulher(1.59, 'f');

homem.calculaPesoIdealHomem();
homem.imprimePessoa();
homem.imprimePesoIdealHomem();
mulher.calculaPesoIdealMulher();
mulher.imprimePessoa();
mulher.imprimePesoIdealMulher();
}
}
}

Resultado do Programa:

Altura: 1,64
Sexo: m
Peso Ideal (Homem): : 61,228
Altura: 1,59
Sexo: f
Peso Ideal (Mulher): : 54,039

18.4.3 Herana (terceiro) em C#

Dados os seguintes cdigos em C#:

// ----------------------------------------------------------- TestaObjetos.cs

using System;

namespace TestaObjetos
{
class MainClass
{
public static void Main (string[] args)
{
Linha linha = new Linha(1, 2, 3, 4);
Retangulo retangulo = new Retangulo(1, 2, 3, 4);

Console.WriteLine("Linha: ");
linha.imprimeLinha();
Console.WriteLine("Retngulo: ");
retangulo.imprimeRetangulo();
}
}
}

// ------------------------------------------------------------- Objeto.cs

using System;

namespace TestaObjetos
{
public class Objeto
{
protected int x;
protected int y;

130
public Objeto() {
x = 0;
y = 0;
}

public Objeto(int x, int y) {


this.x = x;
this.y = y;
}

public void imprimeObjeto() {


Console.WriteLine("x = " + x + " - y = " + y);
}
}
}

// ----------------------------------------------------------------- Linha.cs

using System;

namespace TestaObjetos
{
public class Linha
{
private Objeto p1;
private Objeto p2;

public Linha (int xi, int yi, int xf, int yf) {
p1 = new Objeto(xi, yi);
p2 = new Objeto(xf, yf);
}

public void imprimeLinha() {


p1.imprimeObjeto();
p2.imprimeObjeto();
}
}
}

Implemente a classe derivada Retangulo para que o programa


funcione conforme o resultado do programa abaixo:

Resultado do Programa:

Linha:
x = 1 - y = 2
x = 3 - y = 4
Retngulo:
x = 1 - y = 2
x = 3 - y = 2
x = 3 - y = 4
x = 1 - y = 4

131
19. Coletor de Lixo (Garbage Collector) em C#
O C# possui um coletor de lixo automtico, mas pode-se cham-lo
implicitamente atravs do mtodo: GC.Collect. Veja no exemplo abaixo:

// ------------------------------------------------ Fonte: HerancaColetor.cs

using System;

namespace HerancaColetor
{
class MainClass
{
public static void Main (string[] args)
{
Derivada objeto = new Derivada(3);
int resp;

objeto.Seta(1, 2);
resp = objeto.Soma();
Console.WriteLine("Somador (x + y + z): " + objeto.Somador(resp));
objeto = null; // marca para coletor de lixo
GC.Collect(); // chamada do coletor de lixo
Console.WriteLine("Somador (x + y + z): " + objeto.Somador(resp));
}
}
}

// ------------------------------------------------ Fonte: base.cs

using System;

namespace HerancaColetor
{
public class Base
{
protected int x, y; // atributos protegidos

public Base ()
{
}

public void Seta(int a, int b) {


x = a;
y = b;
Console.WriteLine("x = " + x);
Console.WriteLine("y = " + y);
}

public int Soma() {


Console.WriteLine("Soma (x + y): " + (x + y));
return(x + y);
}

132
}
}

// --------------------------------------------------- Fonte: Derivada.cs

using System;

namespace HerancaColetor
{
public class Derivada : Base
{
private int z;

public Derivada(int x) {
z = x;
Console.WriteLine("z = " + z);
}

public int Somador(int soma) {


return(x + y + z); // possvel acessar x e y pois so privados a classe base
}
}
}

Resultado do Programa:

z = 3
x = 1
y = 2
Soma (x + y): 3
Somador (x + y + z): 6

Unhandled Exception:
System.NullReferenceException: Object reference not set to an instance of an object
at HerancaColetor.MainClass.Main (System.String[] args) [0x00040] in
/Users/pluzzardi/Projects/HerancaColetor/HerancaColetor/Program.cs:17
[ERROR] FATAL UNHANDLED EXCEPTION: System.NullReferenceException: Object reference not
set to an instance of an object
at HerancaColetor.MainClass.Main (System.String[] args) [0x00040] in
/Users/pluzzardi/Projects/HerancaColetor/HerancaColetor/Program.cs:17

Observao: O erro acontece na linha tracejada porque o objeto foi


desalocado pela chamada explcita do coletor de lixo.

20. Construtor e finalizador em C#


Em C#, uma classe alm de poder ter um construtor, pode ter um
finalizador - destrutor (~construtor) que executado automaticamente
no trmino do programa.

Sintaxe: ~nome_construtor {}

A seguir o programa exemplo mostra o uso do destrutor:

// -------------------------------------------------------- Fonte: base.cs

using System;

namespace Finalizador
{
public class Base
{
// atributos protegidos
protected int x, y;

public Base ()
{
}

public void Seta (int a, int b)

133
{
x = a;
y = b;
Console.WriteLine ("x = " + x);
Console.WriteLine ("y = " + y);
}

public int Soma ()


{
Console.WriteLine ("Soma (x + y): " + (x + y));
return(x + y);
}
}
}

// ---------------------------------------------------- Fonte: Derivada.cs

using System;

namespace Finalizador
{
public class Derivada : Base
{
private int z;

public Derivada (int x)


{
z = x;
Console.WriteLine ("z = " + z);
}

public int Somador (int soma)


{
return(x + y + z); // possvel acessar x e y pois so privados a classe base
}

~ Derivada () // destrutor
{
Console.WriteLine ("Finalizador: Final do programa");
}
}
}

// ------------------------------------------------------ Fonte: Finalizador.cs

using System;

namespace Finalizador
{
class MainClass
{
public static void Main (string[] args)
{
Derivada objeto = new Derivada (3);
int resp;

objeto.Seta (1, 2);


resp = objeto.Soma ();
Console.WriteLine ("Somador (x + y + z): " + objeto.Somador (resp));
objeto = null; // marca para coletor de lixo
GC.Collect (); // chamada do coletor de lixo
}
}
}

Resultado do Programa:

z = 3
x = 1
y = 2
Soma (x + y): 3
Somador (x + y + z): 6
Finalizador: Final do programa

134
21. Data e Hora em C#
Em C# possvel verificar a data e hora da mquina. Abaixo
visto vrias formas de imprimir na tela a data e horrio.

// ------------------------------------------ Fonte: Data.cs

using System;

namespace Data
{
class MainClass
{
public static void Main (string[] args)
{
DateTime data = DateTime.Now;
// ---------------------------------------------------------------- data
Console.WriteLine (data.ToShortDateString ());
Console.WriteLine(data.ToLongDateString());
// ---------------------------------------------------------------- tempo
Console.WriteLine (data.ToShortTimeString ());
Console.WriteLine(data.ToLongTimeString());
}
}
}

Resultado do Programa:

27/11/2013
quarta-feira, 27 de novembro de 2013
22:32
22:32:27

22. Eliminar problemas na converso na entrada de dados


Como em qualquer outra linguagem de programao, um grave
problema que ocorre em C# na entrada de dados, via teclado, quando o
usurio digita letras (caracteres) numa entrada de nmeros (inteiros
ou reais), pois mesmo que os dados lidos e armazenados no buffer de
entrada sejam armazenados em uma String, no momento da converso para
inteiro ou real, os mtodos utilizados no permitem a converso e
retornam erro em tempo de execuo. J foi visto anteriormente, que
este problema pode ser resolvido com tratamento de excesso, mas ainda
pode-se resolver este problema com a implementao de um mtodo
esttico que retira todos os caracteres que no sejam nmeros.
// ------------------------------------------ Fonte: EntradaDados.cs

using System;

namespace EntradaDados
{
class MainClass
{
static String retiraLetras (String s)
{
string t;
if (s [0] == '-') {
t = "-";
} else {
t = "";
}
int n = s.Length;
for (int i = 0; i < n; i++) {
if (s [i] >= '0' && s [i] <= '9') {
t = t + s [i];
}
}
return(t);
}

135
public static void Main (string[] args)
{
// entrada do usurio lida e armazenada em uma String
Console.Write ("Digite um nmero: ");
String s = Console.ReadLine ();
// mtodo replace elimina todos os caracteres que no so nmeros ou -
s = retiraLetras (s);
Console.WriteLine ("s = " + s);
if ("".CompareTo (s) == 0) {
Console.WriteLine ("ERRO: Problema na Converso para Inteiro");
} else {
// converso pode ser feita sem problemas, pois a String s no possui letras
int numero = int.Parse (s);
Console.WriteLine ("Nmero: " + numero);
}
}
}
}

136