Apostila C-Sharp V10

Fazer download em pdf ou txt
Fazer download em pdf ou txt
Você está na página 1de 92

Aprendendo a Programar com a

Linguagem C#

Professor Odair Jacinto da Silva


Captulo Um

Captulo Um

A evoluo das linguagens de programao incorpora, nas novas linguagens, os pontos fortes
de suas predecessoras e aperfeioa os pontos fracos; evidentemente, por se tratar de um novo
produto, novos defeitos podem ser inseridos, o que pode ser melhorado ou corrigido em
verses futuras. Outro aspecto relacionado com esta corrida evolutiva refere-se s novas
necessidades ou novos usos para estas linguagens, o advento da Internet comercial em 1995,
por exemplo, gerou uma demanda por linguagens comerciais que aumentassem a
produtividade dos programadores na criao e manuteno de programas para este ambiente
que prometia ser a nova plataforma de software da humanidade.

A linguagem C++, ainda muito utilizada nos dias de hoje, teve suas origens em 1967, quando
Martin Richards criou a linguagem BCPL, uma linguagem para a criao de software bsico
como, por exemplo, sistemas operacionais e compiladores. Ken Thompson, em 1970, criou a
linguagem B. B foi baseada na BCPL e foi utilizada para escrever as primeiras verses do
sistema operacional UNIX. BCPL e B eram linguagens sem definio de tipo, ou seja, o
tratamento do tipo de dado como texto ou nmero era de responsabilidade dos
programadores.

A linguagem C, desenvolvida em 1973 no Bell Laboratories por Dennis Richie. C utilizava muitos
recursos da BCPL e B e implementava tipagem de dados alm de recursos adicionais. C foi
muito utilizada para a criao do sistema operacional UNIX. Apesar disso, C est disponvel
para todas as plataformas e muito utilizada para a criao de muitos sistemas operacionais
que esto em uso at os dias atuais. C uma linguagem multiplataforma, ou seja, com um
projeto cuidadoso pode gerar programas portteis para a maioria dos computadores.

O C++ uma linguagem criada no incio dos anos 80 por Bjarne Stroustrup no Bell
Laboratories. C++ foi baseada na linguagem de simulao Simula 67 e na linguagem C. Uma
evoluo da linguagem C++ a incorporao de recursos de programao orientada a objetos
(POO). A POO foi uma resposta a alta demanda por software cada vez mais complexo e com
fortes requisitos de qualidade e confiabilidade. A principal idia por trs da POO era a
modelagem do mundo real em objetos ou componentes que pudessem ser reutilizados em
qualquer projeto de software. Esta estratgia, em tese, seria a soluo tcnica para escrever
software de alta qualidade, em prazos cada vez menores e economicamente viveis.

2
Captulo Um

Alm do C++ outras linguagens orientadas a objetos foram desenvolvidas como, por exemplo,
a Smalltalk, criada no Palo Alto Research Center (PARC) da Xerox. Smalltalk uma linguagem
orientada a objetos pura, ou seja, tudo em Smalltalk um objeto. C++, por sua, vez, permite
que sejam escritos programas orientados a objetos ou no, por isso considerada como uma
linguagem hbrida.

Com a popularizao dos computadores pessoais (PC) no incio dos anos 80 diversas empresas
de todos os tamanhos e segmentos de mercado perceberam que aquelas mquinas de
computar, antes acessveis apenas s grandes corporaes, poderiam ser teis aos seus
negcios. A demanda por aplicaes de software aumentou desde ento, juntamente com sua
complexidade. Os programas para gesto empresarial, os ERPs, comearam a se popularizar
nesta poca. Algumas empresas comearam a portar seus produtos da plataforma mainframe
para os PCs. As redes de computadores se desenvolveram e as necessidades de integrao de
software idem. Tudo isso gerou um caldeiro de programas e integraes necessrias. Como
desenvolver aplicaes dentro dos prazos necessrios aos negcios? Como aumentar a
produtividade? A linguagem C e C++, criadas em ambientes cujo propsito era a pesquisa
cientfica, no eram linguagens que atendiam s novas demandas do mercado.

Linguagens como o BASIC e Pascal se popularizaram neste perodo. Estas linguagens


encapsulavam algumas dificuldades do desenvolvimento de software em bibliotecas de
comandos, tornando mais simples e rpido o desenvolvimento de software.

Com o lanamento do ambiente operacional Windows no final dos anos 80 e incio dos 90, as
interfaces grficas (graphical user interface GUI) se desenvolveram e se popularizaram,
gerando outro tipo de necessidade por parte dos usurios de aplicaes para PCs, os softwares
com interface grfica. At ento a maioria das aplicaes tinham interfaces conhecidas por
caractere, por no apresentar nenhum elemento grfico e serem compostas totalmente por
letras, nmeros e alguns smbolos. Nesta poca qualquer programador experiente dominava
os cdigos da tabela ASCII para a criao de interfaces.

Neste cenrio a Microsoft lanou o Visual Basic (VB), uma evoluo do antigo BASIC. Na
realidade o VB era uma linguagem bastante diferente do BASIC, apresentando recursos de
interfaces grficas (janelas, botes, listas etc), tratamento de eventos (click do mouse em um
boto, por exemplo) e recursos de programao orientada a objetos (classes), apesar de no
se tratar de uma linguagem orientada a objetos. O VB se tornou uma das linguagens de
programao orientadas a eventos mais populares de todos os tempos.

3
Captulo Um

Na mesma poca em que o VB estava sendo desenvolvido existia uma aposta corporativa nos
dispositivos inteligentes, isto , uma geladeira poderia, atravs de um programa instalado
nela, verificar que seu usurio esqueceu-se de comprar ovos e ento acessar o servidor de um
supermercado local e fazer um pedido de uma dzia de ovos, que seriam entregues no
endereo indicado pelo software da geladeira.

Assim, para se preparar para este novo e promissor mercado, a Sun Microsystems iniciou, em
1991, um projeto de pesquisa denominado Green, liderado por James Gosling. Gosling a
denominou de Oak, em homenagem ao carvalho que observava da janela de sua sala, mas
depois descobriu que j existia uma linguagem com este mesmo nome. Um grupo de
funcionrios da Sun, aps visitar uma casa de cafs, sugeriu um novo nome: Java.

Inicialmente, por uma questo de mercado, a Sun teve dificuldades com a linguagem. O
mercado de dispositivos inteligentes no se desenvolveu como ela imaginava e o projeto corria
o risco de ser cancelado. Em 1993, com a possibilidade de abertura comercial da World Wide
Web a Sun reposicionou sua linguagem como sendo adequada para o desenvolvimento de
contedo dinmico, isto , contedo animado e interativo em pginas Web. Em maio de 1995
a Sun apresentou, formalmente, a linguagem Java ao mundo.

A Microsoft anunciou em julho de 2000 a sua estratgia para revolucionar o uso da Internet,
chamada Microsoft .NET. O Microsoft .NET um novo ambiente em tempo de execuo que
executado no sistema operacional Windows. Verses futuras do .NET devero ser integradas
ao sistema operacional. Um aspecto interessante da estratgia .NET a independncia de
linguagem ou plataforma especfica. Existem diversas linguagens de programao disponveis
para .NET e a especificao aberta, o que significa que qualquer empresa interessada pode
criar sua prpria linguagem para esta plataforma. Um mesmo projeto pode ter partes escritas
em Visual Basic .NET, C# (que ser apresentada mais adiante), Visual C++.NET entre outras.
Outra linguagem que faz parte do .NET a Active Server Pages, mais conhecida como ASP.NET,
uma linguagem voltada para o desenvolvimento de pginas Web dinmicas.

O conceito de reuso de software pauta o .NET, permitindo que os programadores foquem em


suas especialidades, sem ter que implementar cada componente em cada aplicativo. Com o
.NET possvel consumir servios atravs da Web, sem ter que desenvolv-los, por exemplo
um servio de verificao e validao de CNPJ ou CPF, que pode ser obtido a partir do site da
SERASA ou ainda um servio que verifica se um nmero de CEP vlido e retorna o endereo
correspondente, que pode ser contratado a partir do site dos Correios do Brasil, estes servios

4
Captulo Um

so chamados WebServices e eles se comunicam atravs do protocolo SOAP e integram seus


dados atravs de XML.

O .NET Framework o produto por trs desta estratgia. O .NET Framework gerencia e
executa programas e servios Web, contm uma biblioteca de classes chamada Framework
Class Library (FCL), garante a segurana e fornece outros recursos de programao. Toda a
plataforma foi especificada atravs da Common Language Specification (CLS), que contm
todas as informaes sobre tipos de dados, objetos e outros detalhes da plataforma. A CLS foi
submetida para padronizao pela European Computer Manufaturer Association (ECMA). Isso
significa que qualquer um pode ter acesso s especificaes da plataforma .NET e construir
linguagens ou objetos para ela. Isso permitiu o desenvolvimento de projetos da plataforma
.NET para outros ambientes operacionais. Um projeto que se destaca o Mono. Mono um
projecto liderado pela Novell para criar um conjunto de ferramentas compatvel com a
plataforma .NET, conforme s normas ECMA, incluindo, entre outras, um compilador C# e um
CLR. O Mono pode ser executado nos sistemas operacionais Linux, BSD, UNIX, Mac OS X,
Solaris e Windows.

Outro componente importante que compe a arquitetura da soluo .NET o Common


Language Runtime (CLR); ele executa os programas .NET. Do cdigo fonte at as instrues
compiladas em cdigo de mquina, para a execuo, so necessrias duas etapas.
Primeiramente o cdigo fonte compilado para Microsoft Intermediate Language (MSIL), que
define instrues para o CLR. O cdigo convertido em MSIL pode ser reutilizado pelo CLR.
Depois, outro compilador, existente no CLR, chamado Just In Time ou JIT, converte o cdigo
MSIL em cdigo de mquina para o sistema operacional em uso. Essa converso ocorre
somente para a parte do cdigo que ser executada. A Figura 1 ilustra este processo.

5
Captulo Um

Figura 1 - Processo de compilao e execuo pelo CLR

Finalmente chegamos linguagem C# (em ingls pronuncia-se ci-sharp, em portugus, c-


sharp). A apresentao acima ajudar o leitor a contextualizar a linguagem e entender seus
objetivos.

C# foi desenvolvida por Anders Hejlsberg e Scott Wiltamuth especificamente para a plataforma
Microsoft .NET. C# foi baseada nas melhores caractersticas de C, C++ e Java, isso a torna
bastante familiar para muitos programadores, facilitando seu aprendizado e adoo. Hejlsberg
tambm ficou conhecido como o criador do Turbo Pascal e Delphi, quando era engenheiro de
software da Borland.

C# foi criada para atender s necessidades de uma linguagem que pudesse ser executada no
apenas em PCs como tambm nos diversos dispositivos disponveis, como celulares e Personal
Digital Assistentes (PDAs). Problemas de instalao, integrao entre estes dispositivos e
acesso a servios via Web tambm foram endereados em seu projeto.

C# uma linguagem de programao visual dirigida por eventos e totalmente orientada a


objetos, na qual os programas so criados utilizando-se um Integrated Development
Environment (IDE). No IDE o programador pode criar, executar, testar e depurar programas C#.
O IDE aumenta sensivelmente a produtividade do desenvolvimento de software oferecendo
diversos recursos como, por exemplo, o IntelliSense, que completa o comando que o
programador est digitando. O desenvolvimento de aplicaes de software utilizando um IDE
denominado Rapid Application Development (RAD).

Um IDE, gratuito, para aprendizado da linguagem C#, denominado Visual C# 2008 Express
Edition, est disponvel para download no site

6
Captulo Um

http://www.microsoft.com/express/Downloads/#2008-Visual-CS. A Figura 2 mostra o local


para realizar o download do programa de instalao do Visual C# atravs da Internet, esta
uma opo para acessos Internet atravs de banda larga. Para acessos mais lentos sugere-se
o download da verso completa (All Offline Install ISO image file), que baixa o programa de
instalao completo. Este programa no precisar acessar a Internet durante o processo de
instalao do software. Apesar de ser um produto direcionado ao estudo e aprendizagem da
linguagem C# ele possui diversos recursos que permitem o desenvolvimento de programas
bastante complexos.

Figura 2 - Web site para download do Visual C# 2008 Express Edition

Referncias

Deitel, H. M., Deitel, P. J., Listfield, J. A. Nieto, T., Yaeger, C., Zlatkina, M., C# - Como Programar,
Pearson Makron Books, So Paulo, 2003.

Platt, D. S., Iniciando Microsoft .NET, Makron Books, So Paulo, 2002.

Vijay, M., C# - Fundamentos, Makron Books, So Paulo, 2002.

Visual C# Developer Center, http://msdn.microsoft.com/pt-br/vcsharp/default.aspx, acessado


em 17-fevereiro-2010.

Projeto Mono, http://pt.wikipedia.org/wiki/Mono_(projeto), acessado em 18-fevereiro-2010.

7
Captulo Dois

Captulo Dois

Este captulo apresenta os recursos bsicos do IDE do Visual C# 2008 Express Edition,
doravante denominado Visual C#.

A Figura 3 exibe a tela de apresentao do Visual C#.

Na regio 1, denominada Recent Projects, so apresentados os ltimos projetos utilizados.

Na regio 2, janela Solution Explorer, apresentado o arquivo que representa a soluo e os


projetos e arquivos que a compem.

Na regio 3, so apresentados a barra de menus e a barra de ferramentas.

Figura 3 - Interface inicial do Visual C# 2008 Express Edition

8
Captulo Dois

Como criar um novo projeto

Para criar um novo projeto selecione File e depois New Project Figura 4.

Figura 4 - Criar novo projeto

Na janela New Project (Figura 5):

1. Selecionar o template (modelo) de projeto Console Application.


2. Informar o nome do projeto, programa1.
3. Clicar no boto OK.

Projetos baseados no template Console Application possuem interface caractere, elas so


similares s janelas de comando do prompt do MS-DOS do Windows 95/98 e prompt de
comando do Windows XP/NT/2000.

Janelas de console so ideais para iniciar o aprendizado da linguagem C#, principalmente para
aqueles que esto aprendendo as tcnicas bsicas de programao de computadores. Por ter
um conjunto limitado de recursos, possvel focar o exerccio da lgica de programao
utilizando a linguagem C#. Posteriormente sero apresentados outros recursos da linguagem,
como as interfaces visuais, utilizao de controles, acesso de arquivos etc.

No IDE do Visual C# so apresentadas duas regies bem distintas (Figura 6):

No lado esquerdo apresentado o editor dos programas C#. em destaque, no exemplo


ilustrado na Figura 6, a guia (ou aba) Program.cs, exibindo algumas linhas de cdigo geradas
automaticamente pelo IDE. O .cs indica a extenso de um arquivo de programa C Sharp.

No lado direito apresentada a janela Solution Explorer, responsvel pela exibio da


organizaes dos arquivos que pertencem soluo. O Visual C# organiza seus projetos
atravs de solues, ou seja, uma soluo pode conter diversos projetos e cada projeto pode
conter diversos programas C# (arquivos .cs).

Cada projeto possui referncias a diversas bibliotecas (este assunto ser tratado em breve),
no exemplo observa-se as referncias s bibliotecas System.Data, System.Core, System.XML
etc.

9
Captulo Dois

Cada projeto tambm possui propriedades que so gerenciadas pelo prprio IDE. Estas
propriedades so registradas no arquivo Assembly.Info, que aparece na pasta Properties
tambm na janela Solution Explorer.

Figura 5 - Selecionar tipo de projeto

Figura 6 - Estrutura de um projeto

10
Captulo Dois

Como salvar um projeto

1. Selecionar a opo Save All, no menu File. Figura 7.


2. Informar o nome do programa e clicar no boto Save. Figura 8. Ateno para a
localizao (caminho) onde o programa ser gravado.

Figura 7 - Como salvar um projeto

Sobre a localizao do onde o programa ser salvo vale comentar que ser criada uma pasta
(ou folder) com o nome da soluo indicada no campo Solution Name da janela Save
Project, conforme mostra a Figura 8. Dentro desta pasta sero copiados todos os arquivos
que compem a soluo criada. Para transportar a soluo para outro local necessrio
copiar a pasta que indica a soluo e todo seu contedo.

Figura 8 - Janela "Save Project"

11
Captulo Dois

Como executar um projeto

1. Selecionar a opo Start Without Debugging no menu Debug. Figura 9.


Alternativamente possvel utilizar as teclas de atalho CTRL+F5.

Figura 9 - Como executar um programa

Como fechar um projeto

Selecionar a opo Close Solution no menu File. Figura 10.

Figura 10 - Como fechar uma soluo

12
Captulo Trs

Captulo Trs

Dados primitivos so os tipos bsicos de dados utilizados pelos computadores. Um dado


primitivo uma abstrao advinda da observao do mundo real. Cada linguagem de
programao implementa seus prprios tipos de dados, ou seja, no existe uma padronizao
sobre este assunto, isso significa que uma das primeiras tarefas de um programador, ao
aprender uma nova linguagem de programao, estudar seus tipos de dados primitivos.

Cada tipo de dado possui um conjunto de valores, operaes e relaes associado.

Para processamento, os programas utilizam os dados armazenados na memria dos


computadores. O prprio programa precisa estar na memria para ser processado. Como a
memria formada por um conjunto grande, mas finito, de endereos para armazenamento
de dados, cada programa identifica os endereos onde so armazenados os dados atravs de
um nome. Como o valor armazenado no endereo pode variar ao longo do processamento do
programa, o endereo chamado de varivel. Ento, um programa pode alocar diversas
variveis na memria do computador enquanto executado. Cada dado armazenado na
memria deve ser de um tipo definido pela linguagem utilizada.

A definio das variveis que sero utilizadas no programa bem como seu tipo de dado
chamada de declarao de varivel.

Ao armazenar um valor em uma varivel de memria o programa est realizando uma


atribuio. Se o tipo do dado atribudo no combinar com o tipo de dado declarado na criao
da varivel um erro ocorrer.

A Tabela 1 apresenta os tipos de dados disponveis na linguagem C# e seus respectivos


domnios de valores. Por exemplo, uma varivel declarada como sendo do tipo byte pode
receber valores entre 0 (zero) e 255. Para trabalhar com nmeros inteiros a linguagem oferece
o tipo int, para trabalhar com inteiros positivos existe o tipo uint, onde o u significa
unsigned, ou seja, unsigned integer ou inteiro sem sinal, resumindo, inteiros positivos.

Os tipos char e string so utilizados para manipular dados alfanumricos. O tipo char
opera com apenas um caractere enquanto string pode manipular uma sequncia de
qualquer tamanho.

13
Captulo Trs

Tabela 1 - Tipos de dados da linguagem C#

Como declarar e atribuir valor a uma varivel de memria em C#.

Exemplo 1: Declarando uma varivel para trabalhar com nmeros inteiros.

int idade;

Exemplo 2: Declarando uma varivel para trabalhar com nmeros inteiros e a seguir atribuindo
um valor a ela.

int idade;
idade=20;

Exemplo 3: Declarando uma varivel para trabalhar com nmeros inteiros e a seguir atribuindo
um valor a ela, na mesma linha de comando.

int idade=20;

Exemplo 4: Declarando trs variveis para trabalhar com nmeros inteiros e a seguir
atribuindo um valor a ela, na mesma linha de comando.

int numHabCidA=10000, numHabCidB=15000, numHabCidC=25000;

14
Captulo Trs

Exemplo 5: Declarando variveis para trabalhar com nmeros no inteiros.

double salarioMinimo, peso, altura;


salarioMinimo=545.99;
peso=90.55;
altura=1.75;

Exemplo 6: Declarando variveis para trabalhar com dados alfanumricos.

string nome;
char sexo;
nome=Linguagem C#;
sexo=F;

Observaes:

Em uma mesma linha s podem ser definida variveis de um mesmo tipo de dado.
A atribuio de valor varivel pode ocorrer no momento de sua declarao ou
posteriormente.
A linguagem C# case sensitive, isso significa que ela diferencia maisculas de
minsculas, por exemplo, salMinimo e salminimo so duas variveis diferentes.
Valores do tipo string so delimitados por ... (aspas duplas) enquanto valores do tipo
char por ... (aspas simples). Observar o exemplo 6 atentamente.
S possvel utilizar uma varivel se ela for definida, ou seja, tiver seu tipo de dado
definido.

Tpico avanado

Cada tipo de dado, em C#, definido por uma classe. A Tabela 2 mostra as classes existentes
no .NET Framework que implementam cada um dos tipos de dados, por exemplo, o tipo int
implementado por System.Int32. Isso significa que quando este tipo utilizado dentro de um
programa, este, ao ser executado, busca em System.Int32 as propriedades e mtodos que
definem seu funcionamento.

15
Captulo Trs

Tabela 2 - Classes de definio de tipos de dados em C#

Referncias

Deitel, H. M., Deitel, P. J., Listfield, J. A. Nieto, T., Yaeger, C., Zlatkina, M., C# - Como Programar,
Pearson Makron Books, So Paulo, 2003.

Visual C# Developer Center, http://msdn.microsoft.com/pt-br/vcsharp/default.aspx, acessado


em 17-fevereiro-2010.

MSDN Visual C# Developer Center, http://msdn.microsoft.com/en-


us/library/67ef8sbd(VS.80).aspx, acessado em 28-fevereiro-2010.

16
Captulo Quatro

Captulo Quatro

Neste captulo sero apresentados os comandos bsicos para entrada e sada de dados. Sero
utilizados exemplos de programa com estrutura simples, ou seja, programas divididos em
entrada de dados, processamento e sada ou apresentao de resultados. Estruturas
envolvendo deciso ou seleo e repetio sero vistas nos captulos seguintes.

Para mostrar expresses ou resultados de variveis ou ainda realizar processamentos e


apresentar seu resultado utilizado o comando: Console.WriteLine.

Na realidade WriteLine no um comando, mas sim um mtodo da classe Console que,


por sua vez faz parte da biblioteca ou namespace System. Namespaces sero tratados mais
adiante.

Exemplos com Console.WriteLine.

Exemplo 1: O comando abaixo escreve Aprendendo C# na tela do console.

Console.WriteLine(Aprendendo C#);

Exemplo 2: O comando abaixo escreve o resultado da operao aritmtica na tela do console.


A ordem de execuo (regras de precedncias) a mesma da matemtica, isto , resolver
primeiro o que est entre parnteses, depois multiplicao e diviso e, por fim, adio e
subtrao.

Console.WriteLine(9*(5+4));

Exemplo 3: Qual a sada do comando abaixo?

Console.WriteLine(9+9*(5+4));

17
Captulo Quatro

Exemplo 4: Formatando uma sada. O exemplo abaixo mostra como resultado a expresso 9 X
5 = 45. Observar que a expresso entre aspas possui trs parmetros indicados por {0}, {1} e
{2}. Aps a expresso de sada apresentada uma lista contendo trs valores separados por
vrgula: 9, 5 e a expresso 9*5. O primeiro valor, o nmero 9 est associado com o primeiro
parmetro, {0}. O segundo valor, 5, est relacionado com o segundo parmetro, {1}.
Finalmente o terceiro valor, resultado de 9*5, ser apresentado na posio indicada pelo
ltimo parmetro, {2}.

Console.WriteLine({0} X {1} = {2},9,5,9*5);

Exemplo 5: Formatando a sada de nmeros decimais. O resultado da expresso 1/3 (um


dividido por trs) a dzima peridica 0,333333...O comando abaixo mostra como mostrar
este resultado com apenas 3 casas decimais.

Console.WriteLine({0:f3},(1.0/3.0));

Exemplo 6: Formatando a sada utilizando unidade monetria. O comando abaixo mostra o


nmero 500 formatado como R$ 500,00. O smbolo monetrio utilizado, neste caso, R$, o
mesmo definido no Painel de Controle do sistema operacional.

Console.WriteLine({0:c},500);

Exemplo 7: Uma variao de Console.WriteLine Console.Write, sem o Line, no final,


indicando que a expresso sero escrita na tela do console e o cursor no avanar para a
prxima linha, como padro em Console.WriteLine. A sequncia abaixo mostrar no console
a frase Programao Linguagem C#.

Console.Write(Programao );
Console.Write(Linguagem );
Console.Write(C#);

18
Captulo Quatro

Para realizar a entrada de dados utilizado o comando: Console.ReadLine. Toda entrada de


dados realizada por Console.ReadLine do tipo texto, por isso, entradas que sero tratadas
como sendo do tipo de dado numrico precisam ser convertidas antes de serem utilizadas em
operaes aritmticas.

Exemplos com Console.ReadLine.

Exemplo 1: O programa solicita que o usurio informe dois nmeros e a seguir mostra sua
soma. Para converter a entrada de dados em um nmero inteiro utilizada a funo
Convert.ToInt32, que converte o dado entrado em um inteiro de 32 bits.

//declarao das variveis


int valA, valB;
//entrada de dados
Console.Write(Informe o primeiro nmero:);
valA = Convert.ToInt32(Console.ReadLine());
Console.Write(Informe o segundo nmero:);
valB = Convert.ToInt32(Console.ReadLine());
//apresenta o resultado
Console.WriteLine({0}+{1}={2},valA,valB,(valA+valB));

Exemplo 2: O comando solicita que o usurio informe o valor total da compra e a seguir
mostra calcula 5% deste valor e apresenta na tela e, por fim mostra o valor total subtrado do
desconto calculado. A funo Convert.ToDouble ser utilizada para converter o valor de
entrada para um nmero com casas decimais.

//declarao da varivel para o total da compra


double totalCompra;
//solicita o valor total
Console.Write(Total da compra:);
totalCompra = Convert.ToDouble(Console.ReadLine());
//apresenta o valor do desconto
Console.WriteLine(Desconto (5%)={0:c},totalCompra*0.05);
//apresenta o valor a pagar
Console.WriteLine(Total a pagar={0:c},totalCompra*0.95);

19
Captulo Quatro

Operadores Aritmticos

A linguagem C# suporta os seguintes operadores aritmticos binrios, ou seja, que necessitam


de dois operandos, conforme exibe a Tabela 3.

Tabela 3 - Operadores aritmticos binrios

Operador Descrio Exemplo Resultado


+ Adio 9+1 10
- Subtrao 9-1 8
* Multiplicao 9*3 27
/ Diviso 9/3 3
% Mdulo resto da diviso 9/2 1

O resultado de uma expresso ser definido pelos tipos de dados envolvidos, prevalecendo o
de maior tamanho, por exemplo, a diviso entre dois inteiros resultar em um nmero
inteiro; a diviso entre um nmero decimal, por exemplo, do tipo double, por um inteiro,
resultar em um double, que tem maior preciso que o inteiro.

Exemplo 3: Resultados de operaes aritmticas.

//diviso entre dois inteiros: mostra apenas a parte inteira do


//resultado, que, neste caso 0 (zero)
Console.WriteLine(1/3);
//diviso entre um double e um inteiro: mostra um double como
//resultado, neste caso 0,3333...
Console.WriteLine(1.0/3);

Operadores de Incremento Unrio

A linguagem C# suporta os seguintes operadores de incremento unrio, ou seja, que


necessitam de apenas um operando, conforme exibe a Tabela 4.

Tabela 4 - Operadores de incremento

Operador Descrio Exemplo Resultado


++ Ps-incremento x++ Utiliza o valor da varivel x em uma

20
Captulo Quatro

computao e depois o incrementa


++ Pr-incremento ++x Incrementa o valor da varivel x e depois o
utiliza em uma computao
-- Ps-decremento x-- Utiliza o valor da varivel x em uma
computao e depois o decrementa
-- Pr-decremento --x Decrementa o valor da varivel x e depois
o utiliza em uma computao

Exemplo 1: Resultados de operaes unrias.

//declara e inicializa a varivel x


int x=10;
//incrementa x e mostra seu valor
Console.WriteLine(++x);
//decrementa x e mostra seu valor
Console.WriteLine(--x);
//incrementa x
x++;
//decrementa x e mostra seu valor
Console.WriteLine(--x);

As sadas do programa acima sero:

11
10
10

Operadores de Atribuio

A linguagem C# suporta os seguintes operadores de atribuio, conforme exibe a Tabela 5.

21
Captulo Quatro

Tabela 5 - Operadores de incremento

Operador Descrio Exemplo Resultado


= Atribuio x=100 Atribui o valor 100 varivel x
+= Atribuio de x+=10 Considerando x=9, a operao x+=10
adio equivalente x=x+10, ou seja, o resultado
x=19
-= Atribuio de x-=10 Considerando x=9, a operao x-=10
subtrao equivalente x=x-10, ou seja, o resultado
x=-1
*= Atribuio de x*=10 Considerando x=9, a operao x*=10
multiplicao equivalente x=x*10, ou seja, o resultado
x=90
/= Atribuio de x/=3 Considerando x=9, a operao x/=3
diviso equivalente x=x/3, ou seja, o resultado x=3
%= Atribuio de x%=9 Considerando x=12, a operao x%=9
resto de diviso equivalente x=x%9, ou seja, o resultado
x=3

Exerccios

1. Desenvolver um programa que calcule e mostre a mdia aritmtica de 3 valores


informados pelo usurio. Os valores podem conter casas decimais.

2. Desenvolver um programa que calcule e mostre a mdia ponderada de 3 valores


informados pelo usurio. Os pesos para os valores so 30%, 30% e 40%.

3. Escreva um programa em C# que faa a converso de uma temperatura dada em graus


Celsius para Fahrenheit. Sabendo que F = (9/5)*C+32.

4. Faa um programa em C# que calcule a quantidade de latas de tinta necessrias e o


custo para pintar tanques cilndricos de combustvel, em que so fornecidos a altura
(H) e o raio (R) desse cilindro. Sabendo que:
a. A lata de tinta custa R$50,00
b. Cada lata contm 5 litros

22
Captulo Quatro

c. Cada litro de tinta pinta 3 metros quadrados


d. rea do cilindro = rea da base + rea lateral = (2R2)+(2RH).

Utilize a funo C# Math.Ceiling() para arredondar para cima

Utilize a funo C# Math.Floor()para arredondar para baixo

5. Faa um programa C# que mostre o resultado das variveis x,y e z depois da seqncia
de operaes:

x = 10, y = 10;
z = ++x;
x = -x;
y++;
x = x + y z--;

6. Calcule quantos azulejos so necessrios para azulejar uma parede. necessrio


conhecer a altura da parede (AP), a sua largura (LP), e a altura do azulejo (AA) e sua
largura (LA). Leia os dados atravs do teclado.

7. Faa um programa que, a partir das medidas dos lados de um retngulo, lidos via
teclado, calcule a rea e o permetro deste retngulo.

8. A condio fsica de uma pessoa pode ser medida com base no clculo do IMC, ndice
de Massa Corporal, o qual calculado dividindo-se a massa da pessoa (em kg) pela
altura da mesma (em m) elevada ao quadrado (IMC= m/(h*h)). Escreva um programa
que leia a massa e a altura de uma pessoa, calcule e mostre o IMC.

23
Captulo Cinco

Captulo Cinco

No captulo anterior foram apresentados exemplos de programas com estrutura simples, isto
, programas bsicos divididos em entrada de dados, processamento e sada ou apresentao
de resultados. No entanto este tipo de estrutura no suficiente para implementar programas
complexos, onde decises precisam ser tomadas sobre quais caminhos sero executados.
como se existissem, dentro de um nico programa, diversos programas de estrutura simples
que so executados apenas quando determinadas condies so satisfeitas, estes pequenos
programas so denominados blocos e o caminho tomado pelo programa principal
denominado ramo.

Por exemplo, dados dois nmeros, determinar qual o maior.

Um algoritmo para solucionar este problema poderia ser:

1) Ler os dois nmeros (x,y).


2) Determinar qual o maior.
3) Apresentar o resultado (maior).

Para determinar qual o maior necessrio comparar x com y, o resultado desta comparao
determinar qual o maior.

A comparao entre dois nmeros pode ser realizada atravs da condio x > y. Se ela for
verdadeira ento o maior ser x, seno, sero y. Ou seja, aps a verificao da condio,
existem apenas dois caminhos que podem ser tomados e que apenas um ser executado.

Esta condio denominada instruo de seleo de dois ramos porque a sua execuo
seleciona uma das duas alternativas: ou o ramo ento, ou o ramo seno.

A Figura 11 mostra a representao grfica de uma estrutura de seleo.

24
Captulo Cinco

Figura 11 - Diagrama de blocos representando uma estrutura de seleo

Para implementar uma estrutura de seleo na linguagem C# utiliza-se o comando if. Sua
sintaxe para um nico ramo :

if (condio)

<bloco de cdigo>

Quando existirem duas alternativas a sintaxe fica da seguinte forma:

if (condio)

<bloco de cdigo>

else

<bloco de cdigo>

Onde <bloco de cdigo> representa as linhas de comando que sero executadas e (condio)
representa uma expresso relacional que, ao ser avaliada, resulta em apenas uma entre duas
possibilidades: verdadeira ou falsa.

A Tabela 6 lista os operadores relacionais utilizados na linguagem C#. Um exemplo utilizado


para ilustrar os resultados de sua utilizao. Neste exemplo, o valor 500 foi atribudo
varivel salrio.

Tabela 6- Operadores relacionais

25
Captulo Cinco

Exemplo 1: O programa abaixo calcula o rendimento de um automvel. Ele solicita que o


usurio informe a quilometragem rodada e a quantidade de litros de combustvel que foi
utilizado para percorr-la. Ele apresenta o resultado em km/l (quilmetros por litro) e, caso o
desempenho seja menor ou igual a 5, o programa mostra uma mensagem sugerindo que o
automvel seja levado para uma reviso.

A estrutura de seleo utilizada para resolver este problema chamada de Seleo Simples,
utilizada em situaes quando uma alternativa depende de uma condio.

double km,litros,desempenho;
Console.Write("Informe o total percorrido (km) :");
km = Convert.ToDouble(Console.ReadLine());
Console.Write("Informe o volume de combustvel (l) :");
litros = Convert.ToDouble(Console.ReadLine());

desempenho = (km / litros);

Console.WriteLine("Desempenho :{0:f1}",desempenho);

if (desempenho <= 5)
Console.WriteLine("EST NA HORA DE UMA REVISO!");

Exemplo 2: Implementao do algoritmo para verificar qual o maior nmero entre dois
informados.

A estrutura de seleo utilizada para resolver este problema chamada de Seleo Composta,
utilizada em situaes quando duas alternativas dependem de uma nica condio.

int x, y, maior;
Console.Write("Informe um valor para x=");
x = Convert.ToInt16(Console.ReadLine());
Console.Write("Informe um valor para y=");
y = Convert.ToInt16(Console.ReadLine());
if (x > y)
maior = x;
else
maior = y;
Console.WriteLine("{0} o maior nmero.",maior);

Exemplo 3: Programa para calcular a mdia aritmtica entre duas notas bimestrais e
apresentar o resultado aprovado caso a mdia seja maior ou igual a 5,0, ou reprovado,
caso contrrio.

A estrutura de seleo utilizada para resolver este problema chamada de Seleo Composta,
utilizada em situaes quando duas alternativas dependem de uma nica condio.

26
Captulo Cinco

double nb1, nb2, media;


Console.Write("Informe a nota do primeiro bimestre:");
nb1 = Convert.ToDouble(Console.ReadLine());
Console.Write("Informe a nota do segundo bimestre:");
nb2 = Convert.ToDouble(Console.ReadLine());
media = (nb1 + nb2) / 2;
//Limpa a tela para apresentar os resultados
Console.Clear();
if (media >= 5)
{
//Formata a mdia com 2 casas decimais
Console.WriteLine("Nota 1: {0:f2}", nb1);
Console.WriteLine("Nota 2: {0:f2}", nb2);
Console.WriteLine("------------");
Console.WriteLine("Mdia : {0:f2}", media);
Console.WriteLine("Resultado : APROVADO", media);
}
else
{
//Formata a mdia com 2 casas decimais
Console.WriteLine("Nota 1: {0:f2}", nb1);
Console.WriteLine("Nota 2: {0:f2}", nb2);
Console.WriteLine("-----------");
Console.WriteLine("Mdia : {0:f2}", media);
Console.WriteLine("Resultado : REPROVADO", media);
}

Neste programa os blocos de cdigo da estrutura de deciso esto delimitados por chaves {},
isso porque cada bloco possui mais de uma linha de comando. No exemplo 1 as chaves no
aparecem porque o bloco de cdigo possui uma nica linha de comando.

O programa do exemplo 3 pode ser melhorado de forma que cada bloco de cdigo tambm
possua uma nica linha de comando. Como?

Exemplo 4: Uma loja oferece desconto de 10% para compras acima de R$1000,00, desconto de
5% para compras entre R$ 500,00 e R$1000,00 e 3% para abaixo de R$500,00. Faa um
programa que solicite o total da compra e mostre o valor do desconto e o total a ser pago pelo
cliente.

double totCompra, perDesc;


Console.Write("Informe o total da compra:");
totCompra = Convert.ToDouble(Console.ReadLine());

//Estrutura de seleo para pesquisar o percentual de desconto


if (totCompra > 1000)
perDesc = 0.1;
else if (totCompra>500)
perDesc=0.05;
else
perDesc=0.03;
Console.Clear();
Console.WriteLine("Total sem desconto: {0:c}", totCompra);
Console.WriteLine("Desconto: {0:c}",totCompra * perDesc);

27
Captulo Cinco

Console.WriteLine("Total com desconto: {0:c}", totCompra * (1 -


perDesc));

A estrutura de seleo utilizada para resolver o problema acima chamada de Seleo


Encadeada, utilizada em situaes em que a execuo de um bloco depende de vrias
possibilidades ou combinaes de situaes.

Os exemplos acima utilizam condies simples que foram construdas utilizando-se operadores
relacionais como: media > 5 ou x > y. Para testar vrias condies so utilizados if aninhados.

A linguagem C# dispe de operadores lgicos para formar condies complexas. A Tabela 7


mostra os operadores lgicos disponveis e seu significado.

Tabela 7- Operadores lgicos

Por exemplo, o bloco de cdigo da estrutura de seleo abaixo ser executado somente se as
duas condies simples forem verdadeiras.

if ((totalCompra>1000) && (formaPag=="Vista"))


Console.WriteLine("OK - desconto!");

No prximo exemplo, o bloco de cdigo da estrutura de seleo ser executado se qualquer


uma das condies simples for verdadeira.

if ((mediaSemestre>=7) || (notaExame>=7))
Console.WriteLine("Aprovado");

A seguir so apresentadas as Tabelas Verdade para os operadores lgicos && (And) e || (Or).

Exerccios

28
Captulo Cinco

1. Dados trs nmeros inteiros, desenvolver um programa que mostre qual o maior
entre eles utilizando estrutura de seleo aninhada com operadores lgicos e outro
com estrutura aninhada sem operadores lgicos.

2. Escreva um programa em C# (Console) que exiba ao usurio 2 opes: 1) Converte de


Fahrenheit para Celsius, 2) Converte de Celsius para Fahrenheit. Aps a seleo do tipo
de transformao desejada, o programa deve pedir o valor da temperatura a ser
convertido, realizar o clculo e exibir o resultado. Para as converses utilize F =
(9/5)*C+32; C = (5/9)*(F-32).

3. Uma empresa decidiu dar uma gratificao de Natal a seus funcionrios, baseada no
nmero de horas extras e no nmero de horas que o funcionrio faltou. O valor do
prmio obtido pela consulta tabela abaixo, onde H o nmero de horas extras
subtrado de dois teros do nmero de horas-faltas. Faa um programa que solicite o
total de horas extras, o total de horas de o funcionrio faltou e, no final, calcule e
mostre o prmio do funcionrio. Na tabela abaixo, leia o intervalo (0,10] como:
maior do que zero e menor ou igual a dez, maior do que dez e menor ou igual a vinte
e assim sucessivamente.

4. Faa um programa C# para ler um cdigo. Caso o cdigo = 1, ler dois nmeros inteiros.
Se o segundo nmero for diferente de zero, exibir o resto da diviso do primeiro pelo
segundo. Seno, exibir a diviso inteira do primeiro nmero lido por 3. Se cdigo = 2,
ler um nmero inteiro. Se for positivo, exibir a sua raiz quadrada (use Math.Sqrt())
para calcular a raiz quadrada, se for negativo, exibir o seu valor absoluto. Se zero,
exibir a mensagem ZERO. Se o cdigo = 3, ler um nmero inteiro e exibir o seu
quadrado. Se cdigo diferente dos acima especificados, exibir a mensagem CDIGO
INVLIDO.

29
Captulo Cinco

5. Escreva um programa em C# que, dada a idade de um nadador, classifique-o em uma


das seguintes categorias:

Idade Categoria
5a7 Infantil A
8 a 10 Infantil B
11 a 13 Juvenil A
14 a 17 Juvenil B
18 a 39 Adulto
>39 Master

6. Dados trs valores inteiros A, B e C, verificar se eles podem ser os comprimentos dos
lados de um tringulo, em caso afirmativo, verificar se compem um tringulo
eqiltero, issceles ou escaleno. Informar se no compuserem nenhum tringulo.
Informaes:

Tringulo: figura geomtrica fechada de trs lados, em que cada um menor do que a
soma dos outros dois.
Tringulo equiltero: possui os trs lados iguais.
Tringulo issceles: possui dois lados iguais.
Tringulo escaleno: possui todos os lados diferentes.

7. Faa um programa em C# (Console) que leia dois valores numricos e um smbolo.


Caso o smbolo seja um dos relacionados abaixo efetue a operao correspondente
com os valores.

+ operao de soma.
- operao de subtrao.
* operao de multiplicao.
/ operao de diviso (verificar se o divisor diferente de zero).

30
Captulo Seis

Captulo Seis

Neste captulo ser apresentado um novo tipo de estrutura de programa: estruturas de


repetio. As estruturas de repetio so utilizadas para executar repetidamente um
determinado bloco de cdigo. Para que o bloco de cdigo no seja executado infinitamente
ser sempre necessrio definir uma condio de repetio, ou seja, enquanto o resultado de
uma expresso lgica for verdadeiro, o bloco de cdigo ser executado, no momento em que a
condio no for mais verdadeira, o programa deixar de executar o bloco de cdigo e
continuar executando o restante do programa. O diagrama de blocos, Figura 12, ilustra a
representao de uma estrutura de repetio quando a avaliao da condio realizada no
incio do bloco de cdigo a ser executado repetidamente.

As estruturas de repetio tambm so conhecidas pelas palavras inglesas looping ou loop.


Ganharam este nome por lembrarem uma execuo finita em crculos que depois seguem seu
curso normal.

Figura 12 - Representao de uma estrutura de repetio

A linguagem C# disponibiliza quatro tipos de comandos que implementam estruturas de


repetio:

While
Do
For
Foreach

31
Captulo Seis

O loop While

A estrutura de repetio While verifica a condio de execuo do loop no incio da estrutura,


se ela for verdadeira o bloco de cdigo executado. Ao final do bloco de cdigo o fluxo do
programa retorna ao incio da estrutura de repetio e verifica se a condio continua
verdadeira. Enquanto a condio for avaliada como sendo verdadeira, o bloco de cdigo
associado estrutura ser executado. Quando a condio for falsa o fluxo de controle do
programa ignora todo o bloco de cdigo e continua executando o programa.

importante inicializar corretamente as variveis de controle do fluxo de repetio, tanto para


a entrada quanto para a sada do loop.

Exemplo 1: Um programa para mostrar a tabuada do nmero nove.

O programa abaixo inicializa a varivel t, que varivel de controle do fluxo de repetio do


looping. Enquanto t for menor que 10 o bloco de cdigo ser executado. Notar que aps a
exibio do produto do nmero nove por t, t incrementado de uma unidade. Se isso no
ocorresse o looping seria executado indefinidamente, caracterizando um looping infinito.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
int t = 1;
while (t <= 10)
{
Console.WriteLine(t * 9);
t = t + 1;
}
}
}
}

32
Captulo Seis

Exemplo 2: Uma nova verso para o programa da tabuada do nmero nove. Pergunta: onde
est sendo realizado o incremento da varivel de controle do looping?

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
int t = 1;
while (t <= 10)
{
Console.WriteLine("9 X {0}={1}",t,t++* 9);
}
}
}
}

Exemplo 3: O programa abaixo solicita o preo de dez produtos e no final exibe o preo mdio.
Observar o incremento da varivel de controle do loop (varivel c) na primeira linha do bloco
de cdigo do loop. Notar que a mdia calculada dividindo-se o contedo da varivel media,
que acumulou todos os preos digitados, por (c-1) e no por, pois a varivel sai do looping com
o valor 11.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
double preco = 0, media = 0;
int c = 1;
while (c <= 10)
{
Console.Write("Preo do produto {0}=",c++);
preco = Convert.ToDouble(Console.ReadLine());
media += preco;
}
Console.WriteLine("Preo mdio = {0}", (media / (c-1)));
}
}
}

33
Captulo Seis

O loop Do

O looping utilizando o comando Do realiza o teste no final da estrutura de repetio. Isso


significa que o bloco de cdigo associado ao looping executado pelo menos uma vez.

Exemplo 4: Suponha um programa que implementa um jogo onde um jogador informa um


nmero e o outro tem que adivinhar o nmero escolhido. Para ajudar, o programa orienta o
jogador dois informando se o chute dele foi maior ou menor que o nmero escolhido. O jogo
continua at que o nmero selecionado pelo jogador um seja encontrado.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
int numero, chute;
Console.Write("Escolha um nmero=");
numero = Convert.ToInt16(Console.ReadLine());
Console.Clear();

do
{
Console.Write("Tente adivinhar o nmero escolhido: ");
chute = Convert.ToInt16(Console.ReadLine());
if (chute == numero)
{
Console.WriteLine("Parabns! Acertou!");
}
else if (chute < numero)
{
Console.WriteLine("Chutou baixo!");
}
else
{
Console.WriteLine("Chutou alto!");
}
} while (chute != numero);
}
}
}

34
Captulo Seis

Exemplo 5: O programa a seguir mostra um menu com opes para o usurio selecionar. Aps
informada uma opo o programa verifica a opo selecionada e executa os comandos
associados em sistema real, seria chamada uma funo para executar o mdulo desejado. O
programa continua executando at que o usurio informe a opo para sair.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
string myChoice;
do
{
// Mostra o menu
Console.Clear();
Console.WriteLine("Cadernos de Endereos\n");

Console.WriteLine("N - Novo Endereo");


Console.WriteLine("A - Alterar Endereo");
Console.WriteLine("E - Excluir Endereo");
Console.WriteLine("C - Consultar Endereo");
Console.WriteLine("S - Sair\n");

Console.WriteLine("Selecione (N,A,E,C ou S)");

// Seleo do usurio
myChoice = Console.ReadLine();

// Deciso baseada na opo do usurio


switch (myChoice)
{
case "N":
case "n":
Console.WriteLine("Voc deseja incluir um novo
endereo.");
break;
case "A":
case "a":
Console.WriteLine("Voc deseja alterar um
endereo.");
break;
case "E":
case "e":
Console.WriteLine("Voc deseja excluir um
endereo.");
break;
case "C":
case "c":
Console.WriteLine("Voc deseja consultar um
endereo.");
break;
case "S":

35
Captulo Seis

case "s":
Console.WriteLine("Fim do programa.");
break;
default:
Console.WriteLine("{0} no uma opo
vlida", myChoice);
break;
}

// Pausa para que o usurio veja os resultados


Console.Write("Pressione qualquer tecla para
continuar...");
Console.ReadLine();

} while (myChoice != "S" && myChoice != "s"); // Continua


at que o usurio deseje sair
}
}
}

O loop For

Nas estruturas vistas at agora o nmero de vezes que o bloco de cdigo ser executado
determinado por condies que no esto sob o controle do programa. Os blocos de cdigo
sero executados enquanto uma condio for verdadeira. No entanto existem situaes em
que o nmero de execues pr-determinado, onde no h uma condio os limites so
fixos.

Exemplo 6: O programa da tabuada do nmero nove um exemplo onde no existe condio


para execuo do bloco de cdigo e os limites so previamente definidos.

Uma considerao importante que a varivel de controle incrementada aps a ltima linha
de comando do bloco de repetio ter sido executada. Neste exemplo, apesar do incremento
t++ estar definido na linha de comando do loop For, ele realizado apenas depois que a linha
do comando Console.WriteLine executada.

Observar que a condio, t <= 10, est sob controle do programa e no de um evento externo
a ele.

Como ltima observao, notar que a varivel t declarada dentro do comando For e,
portanto, ser visvel apenas dentro desta estrutura. Seu tempo de vida tambm est
associado ao tempo em que o bloco de cdigo da estrutura de repetio executado, ao seu
final ela ser liberada da memria.

36
Captulo Seis

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
for (int t = 1; t <= 10; t++)
Console.WriteLine("{0} X 9 = {1}", t, (t * 9));
}
}
}

Exemplo 7: Este exemplo mostra a utilizao de dois comandos: break e continue. O comando
break interrompe o fluxo de repetio e transfere o controle do programa para a prxima
linha de comando depois do bloco de cdigo de repetio. O comando continue interrompe o
fluxo de execuo, ignora os comandos restantes do bloco de cdigo, incrementa a varivel de
controle do looping e transfere o controle do fluxo para o comando for.

O exemplo abaixo interrompe a execuo do looping quando a varivel de controle atingir o


valor 10 if (i==10). Enquanto isso no ocorrer, o programa verificar se a varivel de controle
possui um nmero par if (i%2==0), se esta expresso for verdadeira o comando continue
executado, impedindo que o nmero seja mostrado pelo comando seguinte
Console.Write({0} ,i). Quando o nmero for mpar, ele mostrado.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
for (int i = 0; i < 20; i++)
{
if (i == 10)
break;
if (i % 2 == 0)
continue;
Console.Write("{0} ", i);
}
}
}
}

37
Captulo Seis

O loop Foreach

O foreach utilizado para percorrer itens em uma lista, como um vetor, como exemplo. Para
percorrer os itens de uma lista necessrio declarar uma varivel de controle, do mesmo tipo
que os itens da lista. Enquanto os itens da lista so percorridos ela possui apenas acesso de
leitura.

Exemplo 8: O programa abaixo utiliza o foreach para percorrer todos os itens de uma lista di
tipo string. Notar que na declarao do foreach a varivel de controle discpulo tambm do
tipo string.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
string[] nomes = { "Pedro", "Paulo", "Jos", "Andr" };

foreach (string discipulo in nomes)


{
Console.WriteLine("{0} ", discipulo);
}
}
}
}

Exerccios

1. Escreva um programa que leia uma seqncia de nmeros inteiros positivos e


negativos. O programa deve perguntar ao usurio a quantidade de nmeros a ser lida.
No final o programa deve exibir a mdia aritmtica dos nmeros positivos e dos
negativos.

2. Foi realizada uma pesquisa sobre as caractersticas de uma populao em uma regio,
a qual coletou os seguintes dados sobre a populao: Sexo (M-masculino, F-
feminino), Cor dos olhos (C-castanhos, V-verdes, A- azuis), Idade e Cor dos
cabelos (C-castanhos, L-louros, P-pretos). Faa um programa em C# (Console)
que determine: a) O habitante de maior idade, b) A percentagem dos habitantes do

38
Captulo Seis

sexo feminino, com idade entre 18 e 35 anos, com olhos verdes e cabelos louros. A
finalizao da pesquisa ocorrer quando for digitado -1 para a idade.

3. Escreva um programa em C# (Console) que exiba ao usurio 3 opes: 1) Converte de


Fahrenheit para Celsius, 2) Converte de Celsius para Fahrenheit, 3) Fim. O programa
encerra apenas quando o usurio escolher a opo 3 (Fim). Quando forem escolhidas
as opes 1 ou 2, o programa deve pedir o valor da temperatura a ser convertido,
exibir o resultado e voltar a apresentar o menu com as opes. Para as converses
utilize F = (9/5)*C+32; C = (5/9)*(F-32).

4. O Mtodo de Newton para encontrar a aproximao da raiz quadrada de um nmero a


descrito pelas seguintes equaes:

a
x0
2
1 a
xi 1 xi
2 xi

Onde i = 0, 1, 2, 3,...

Fazer um programa em C# (Console) para entrar via teclado com o valor de a e calcula
e exibir a dcima iterao (x10).

5. Uma empresa decidiu fazer um levantamento sobre o perfil dos candidatos que se
apresentarem para o preenchimento de vagas de seu quadro de funcionrios. Para
cada candidato ser solicitado o sexo, a idade e se tem ou no experincia no servio.
A entrada de dados ser encerrada quando for informado -1 para a idade. Escrever um
programa para ler os dados dos candidatos e, a seguir, calcular e imprimir as seguintes
informaes:

a) O nmero de candidatos do sexo feminino e masculino


b) A idade mdia das mulheres que j tm experincia no servio
c) A menor idade entre as mulheres que j tm experincia no servio
d) A porcentagem dos homens com mais de 45 anos, com relao ao total de homens
e) O nmero de homens com idade inferior a 30 anos sem experincia no servio.

39
Captulo Sete

Captulo Sete

Neste captulo sero apresentadas as estruturas de dados vetor e matriz e a forma de


trabalhar com elas na linguagem C#.

Vetor

Um vetor (ou array) uma estrutura unidimensional homognea. Unidimensional porque so


representados atravs de um nome indexado em uma nica dimenso e homognea porque
ao serem criados so de um nico tipo de dado. Um vetor, portanto, uma forma de criar uma
estrutura de dados, na memria, cujo contedo, em geral, possui alguma relao, por
exemplo, uma srie de dados que representa as temperaturas mdias da cidade de So Paulo
ao longo de 2009, Figura 13.

O vetor vetTempSP2009 possui 12 elementos, endereados ou indexados, de 0 (zero) a 11


(onze). Todo vetor em C# base zero, ou seja, seu primeiro elemento possui ndice zero.

Cada elemento de vetTempSP2009 possui um nmero real, que na linguagem C# declarado


atravs do tipo primitivo float.

A declarao de vetTempSP2009 pode ser feita da seguinte forma:

float[] vetTempSP2009 = new float[12];

Onde,

float[] indica ao compilador que ser criado um vetor cujos elementos sero do tipo
float.

new float[12] instancia (cria) na memria um vetor de floats com 12 elementos.

Figura 13 - Vetor temperatura mdia de So Paulo

Aps serem instanciados no h como redimensionar um vetor em C#, ou seja, vetores so


estticos na linguagem C#.

40
Captulo Sete

Uma forma de inicializar um elemento de um vetor atribuindo um valor diretamente a ele, o


valor deve ser do mesmo tipo que o vetor, caso contrrio um erro ocorrer. A atribuio pode
ser feita da seguinte forma:

vetTempSP2009[0]=30.1;
vetTempSP2009[1]=29.9;
vetTempSP2009[2]=27.9;
...
vetTempSP2009[11]=29.9;

A linguagem C# tambm permite que um vetor seja inicializado logo aps ter sido declarado,
como mostra o exemplo abaixo, que criar o vetor vetTempSP2009 e, em seguida, o inicializa:

float[] vetTempSP2009 = {30.1, 29.9, 27.9, 23.0, 22.5, 21.6, 20.7,


26.6, 29.8, 29.9, 27.3, 29.9};

A propriedade Length de um vetor contm sua quantidade de elementos e pode ser utilizada
na manipulao de um vetor sem que seja necessrio saber seu nmero total de elementos. O
looping for abaixo muito utilizado para percorrer todos os elementos de um vetor.

for(int c; c < vetTempSP2009.Length; c++)


Console.WriteLine(vetTempSP2009[c]);

Exemplo 1: O programa abaixo cria um vetor para registrar as temperaturas mensais de 2009
na cidade de So Paulo, depois o programa percorre a estrutura de dados para somar os
valores registrados e, por fim, calcula e mostra a mdia do ano.

float[] vetTempSP2009 = new float[12];


float totalTemp=0;

//carrega vetor com temperaturas mensais


for (int c=0; c<vetTempSP2009.Length; c++)
{
Console.WriteLine("Temperatura ms {0}:", (c + 1));
vetTempSP2009[c] = float.Parse(Console.ReadLine());
}

//soma todas as temperaturas armazenadas no vetor


for (int c = 0; c < vetTempSP2009.Length; c++)
{
totalTemp+=vetTempSP2009[c];
}

//calcula e mostra a mdia


Console.WriteLine("A temperatura mdia de 2009 em So Paulo foi
{0:f1}", (totalTemp / 12));

41
Captulo Sete

Exemplo 2: O programa abaixo mostra um exemplo que utiliza um vetor de chars (carateres)
e um looping que o percorre e conta as ocorrncias das letras A, B e C. A estrutura de
seleo Switch/Case utilizada para decidir sobre a letra armazenada no vetor.

char[] vetLetras = { 'A', 'C', 'B', 'A', 'C', 'C', 'A', 'B', 'A' };
int contaA = 0, contaB = 0, contaC = 0;
for (int j = 0; j < vetLetras.Length; j++)
{
switch (vetLetras[j])
{
case 'A':
contaA++;
break;
case 'B':
contaB++;
break;
case 'C':
contaC++;
break;
}
}
Console.WriteLine("Total de letra A = {0}", contaA);
Console.WriteLine("Total de letra B = {0}", contaB);
Console.WriteLine("Total de letra C = {0}", contaC);

Exemplo 3: O programa abaixo permite que o usurio carregue vetores com nomes e notas
bimestrais de alunos de uma turma. A quantidade de alunos na turma informada pelo
usurio, a seguir o programa instancia os vetores com a quantidade de elementos igual ao
tamanho da turma informado pelo usurio. Aps ler todos os dados, Figura 14, o programa
exibe uma listagem, Figura 15, contendo os nomes dos alunos, suas notas, mdia e resultado
final.

static void Main(string[] args)


{
string[] nome;
float[] nota1, nota2;
int aluno;
float media;
string resultado;

//pergunta a quantidade de alunos da classe


Console.Write("Tamanho da turma:");
aluno = int.Parse(Console.ReadLine());

//instancia vetor de nomes e notas com a quantidade


//de alunos informada pelo usurio
nome = new string[aluno];
nota1 = new float[aluno];
nota2 = new float[aluno];

42
Captulo Sete

//carrega os vetores com dados fornecidos pelo usurio


for (int c = 0; c < nome.Length; c++)
{
Console.Write("Nome do aluno {0}: ",c+1);
nome[c] = Console.ReadLine();
Console.Write("Nota do primeiro bimestre do aluno {0}: ", c+1);
nota1[c] = float.Parse(Console.ReadLine());
Console.Write("Nota do primeiro segundo do aluno {0}: ", c+1);
nota2[c] = float.Parse(Console.ReadLine());
}

//limpa a tela
Console.Clear();

//mostra a listagem contendo o


//nome, notas bimestrais e mdia
Console.WriteLine("Nome \t\tNota B1 \tNota B2 \tMdia
\t\tResultado");
for (int c = 0; c < nome.Length; c++)
{
media=(nota1[c]+nota2[c])/2;
if (media >= 7.0)
resultado = "Aprovado";
else
resultado = "Reprovado";
Console.WriteLine("{0} \t\t{1:f2} \t\t{2:f2} \t\t{3:f2} \t\t{4}",
nome[c],nota1[c],nota2[c],media,resultado);
}
}

Figura 14 - Leitura dos dados dos alunos

43
Captulo Sete

Figura 15 - Listagem da turma

Ordenando um vetor com o Bubble Sort

Existem diversas tcnicas que podem ser utilizadas para se ordenar os elementos de um vetor,
uma bastante conhecida devida a sua simplicidade de implementao o bubble sort ou
mtodo da bolha, ele tem este nome porque durante a aplicao do mtodo os valores
menores sobem em direo do primeiro elemento do vetor. No final, o menor valor est no
primeiro elemento e o maior no ltimo, resultado em um vetor ordenado.

O programa abaixo mostra como implementar o bubble sort em C#.

static void Main(string[] args)


{
int[] v = { 9, 4, 7, 3, 1, 6, 5, 2, 8 };
int aux;

for(int i=1; i < v.Length; i++)


{
for (int j = 0; j < (v.Length - 1); j++)
{
if (v[j] > v[i]) //troca
{
aux = v[j];
v[j] = v[i];
v[i] = aux;
}
}
}
//mostra vetor ordenado
for (int i = 0; i < v.Length; i++)
Console.WriteLine(v[i]);
}

44
Captulo Sete

Um dos problemas do bubble sorte o seu desempenho. Para vetores com muitos elementos
ele tende a ser lento, por isso, outros mtodos foram desenvolvidos, como o quick sort.

Ordenando um vetor com o mtodo Array.Sort()

O mtodo Array.Sort() um mtodo disponvel no .NET Framework para a ordenao de


vetores. Ele significativamente mais rpido que o bubble sort. O exemplo abaixo mostra
como utiliz-lo.

static void Main(string[] args)


{
int[] v = { 9, 4, 7, 3, 1, 6, 5, 2, 8 };
//mtodo da linguagem C# para ordenar vetores
//Array.Sort() tem desempenho melhor que o bubble sort
Array.Sort(v);
//mostra vetor ordenado
for (int i = 0; i < v.Length; i++)
Console.WriteLine(v[i]);
}

Diferena entre o Bubble Sort e o Array.Sort()

O programa abaixo mostra a diferena, em termos de tempo de processamento entre os


mtodos Bubble Sort e o Array.Sort().

utilizada classe Random, que possui o mtodo Next, que gera nmeros aleatrios inteiros
entre 1 e 2.147.483.647.

Para comparar os dois mtodos, so gerados 500.000 nmeros e armazenados em um vetor


(v1), em seguida ele ordenado utilizando o Bubble Sort. A seguir so gerados mais 500.000
nmeros e armazenados em outro vetor (v2), ento o mtodo Array.Sort() utilizado para
orden-lo.

Para comparar o tempo de processamento entre eles, antes da execuo de cada mtodo e
logo depois que o processamento concludo, exibida a hora (DateTime.Now).

O Buble Sort necessita de aproximadamente 9 minutos para classificar 500.000 elementos,


enquanto o Array.Sort() realiza o mesmo trabalho em menos de 1 segundo.

45
Captulo Sete

static void Main(string[] args)


{
int[] v1 = new int[500000];
int[] v2 = new int[500000];
int aux;

//Instancia classe para gerar nmeros aleatrios


Random intRnd = new Random();

//Gera 500000 nmeros aleatrios


for (int i = 0; i < 499999; i++)
v1[i] = intRnd.Next();

//Ordena utilizando bubble sort


Console.WriteLine(DateTime.Now);
for (int i = 1; i < v1.Length; i++)
{
for (int j = 0; j < (v1.Length - 1); j++)
{
if (v1[j] > v1[i]) //troca
{
aux = v1[j];
v1[j] = v1[i];
v1[i] = aux;
}
}
}
Console.WriteLine(DateTime.Now);

//Gera 500000 nmeros aleatrios


for (int i = 0; i < 499999; i++)
v2[i] = intRnd.Next();

//mtodo da linguagem C# para ordenar vetores


//Array.Sort() tem desempenho melhor que o bubble sort
Console.WriteLine(DateTime.Now);
Array.Sort(v2);
Console.WriteLine(DateTime.Now)
}

Pesquisando binria em vetores

A linguagem C# oferece um mtodo eficiente para realizar uma busca entre os elementos de
um vetor, o mtodo Array.BinarySearch(<vetor>,<valor>), pesquisa um determinado <valor>,
denominado chave de busca, dentro do <vetor> indicado. Array.BinarySearch() utiliza o
algoritmo de pesquisa binria, muito mais eficiente que realizar uma pesquisa seqencial ou
linear.

Para vetores ordenados, o algoritmo elimina metade dos elementos do vetor aps cada
comparao. O algoritmo procura o elemento do meio do vetor e compara com a chave, se
forem iguais ento a chave de busca foi encontrada e o algoritmo retorna a posio (ndice) do
valor dentro do vetor. Caso contrrio o problema reduzido pela metade, se o elemento do

46
Captulo Sete

meio for menor que a chave de busca ento a pesquisa continua na primeira metade do vetor,
caso contrrio, na segunda metade.

O programa abaixo declara e inicializa o vetor v1, cujos valores j esto ordenados. Para
situaes em que os valores esto desordenados, deve-se aplicar o mtodo Array.Sort() antes
de utilizar o mtodo de busca binria Array.Binary().

Quando Array.Binary() no encontra a chave de busca ele retorna um valor negativo, caso
contrrio retornar a posio ou ndice do elemento do vetor que possui a chave de busca.

static void Main(string[] args)


{
int[] v1 = {2,4,6,8,10,12,14,16,18,20,22,24,26,28,30};
int index;

index = Array.BinarySearch(v1, 18);


if (index < 0)
Console.WriteLine("Valor no encontrado");
else
Console.WriteLine("ndice do valor encontrado. Posio {0}",
index);
}

Matriz

Uma matriz uma estrutura de dados de duas dimenses. Se um elemento de um vetor de


refere a uma dimenso da informao, por exemplo, na seo anterior cada elemento referia-
se temperatura mdia de um determinado ms da cidade de So Paulo, em 2009. Imagine
que este mesmo elemento necessita de duas referncias para seu entendimento completo,
como o exemplo a seguir, cuja tabela exibe ndices pluviomtricos do primeiro semestre de
2009, para os estados da regio sudeste do Brasil, cada elemento ou ndice pluviomtrico
necessita de duas referncias ou dimenses, para sua compreenso: na linha temos a
dimenso dos estados e na coluna a dimenso dos meses.

Jan Fev Mar Abr Mai Jun


SP 100 110 120 100 110 130
RJ 120 120 122 119 115 114
MG 110 100 99 98 100 110
ES 100 99 98 100 102 103

47
Captulo Sete

O programa abaixo implementa a matriz de ndices pluviomtricos. Os dados so carregados


diretamente no cdigo fonte do programa, mas poderiam ter sido lidos via teclado atravs do
Console.ReadLine(), como feito exemplo dos vetores.

A seguir so criados dois loopings aninhados (um dentro do outro). O looping externo garante
que todas as linhas da matriz sero percorridas, o looping interno garante que todas as colunas
de uma linha sero percorridas.

Para determinar quantas linhas existem em uma matriz utilizado o mtodo GetLength(0).

Para determinar quantas colunas existem em uma matriz utilizado o mtodo GetLength(1).

No momento de calcular a mdia utilizado um recurso denominado casting, que fora uma
varivel de um tipo a atuar como sendo de outro tipo. No clculo da mdia utilizado

((float)soma/meses))

Ao invs de simplesmente:

(soma/meses))

No segundo caso, por envolver dois inteiros, a diviso retornar apenas a parte inteira do
quociente. Em C# se um dos operandos da diviso for um nmero decimal ento o resultado
tambm ser decimal. O recurso de casting indica ao compilador que determinada varivel ir
atuar como sendo do tipo indicado pelo casting e no o tipo que foi declarada no incio do
programa. O casting (float) na frente da varivel soma indica que soma participar da
operao como sendo um float e no como integer (seu tipo original).

static void Main(string[] args)


{
//declara e inicia a matriz de ndices pluviomtricos
//linhas representam estados (sp,rj,mg,es)
//colunas representam meses (jan,fev,mar,abr,mai,jun)
int[,] chuva =
{
{100, 110, 120, 100, 110, 130},
{120, 120, 122, 119, 115, 114},
{110, 100, 99 , 98 , 100, 110},
{100, 99 , 98 , 100, 102, 103}
};
int soma;
//o nmero de colunas indica a quantidade de meses
int meses=chuva.GetLength(1);
//percorre linhas (estados)
for(int i=0;i<chuva.GetLength(0);i++)
{
soma = 0;

48
Captulo Sete

//percorre colunas (meses)


for (int j = 0; j < chuva.GetLength(1); j++)
{
//acumula os ndices
soma += chuva[i, j];
}
switch (i)
{
//i=0 significa que os ndices so de SP
case 0:
Console.WriteLine("Mdia pluviomtrica de SP:
{0:f1}",((float)soma/meses));
break;
//i=1 significa que os ndices so do RJ
case 1:
Console.WriteLine("Mdia pluviomtrica do RJ:
{0:f1}",((float)soma/meses));
break;
//i=2 significa que os ndices so de MG
case 2:
Console.WriteLine("Mdia pluviomtrica de MG:
{0:f1}",((float)soma/meses));
break;
//i=3 significa que os ndices so do ES
case 3:
Console.WriteLine("Mdia pluviomtrica do ES:
{0:f1}",((float)soma/meses));
break;
}
}
}

Exerccios

1. Faa um programa que carregue um vetor de seis elementos numricos inteiros. A


seguir, calcule e mostre:
a) A quantidade de nmeros pares;
b) Quais os nmeros pares;
c) A quantidade de nmeros mpares;
d) Quais os nmeros mpares.

2. Faa um programa que carregue um vetor com dez nmeros reais gerados
aleatoriamente, calcule e mostre a quantidade de nmeros negativos e a soma dos
nmeros positivos desse vetor.

3. Faa um programa em que dada uma seqncia de n nmeros, imprimi-la na ordem


inversa da leitura.

49
Captulo Sete

4. Faa um programa que carregue um vetor com 15 posies, calcule e mostre:


a) O maior elemento do vetor e em que posio esse elemento se encontra;
b) O menor elemento do vetor e em que posio esse elemento se encontra.

5. Faa um programa que carregue um vetor, com um nmero de posies definidas pelo
usurio. Este vetor dever armazenar um conjunto de nomes em diferentes posies.
A seguir crie um mecanismo para alimentar elementos os vetor e pesquisar por um
valor existente. Exiba para o usurio um menu, como o exemplo abaixo, onde ele
possa escolher a funo que deseja executar.
==== ==============
1) Cadastrar nome
2) Pesquisar nome
3) Listar todos os nome
0) Sair do programa
==== ==============
Escolha uma opo:_

6. Faa um programa que receba uma matriz B[9][9] de reais e retorna a soma dos
elementos das linhas pares de B.

7. Faa uma funo que receba uma matriz A[12][12] e retorna um vetor com a soma de
cada uma das linhas de A.

8. Faa um programa que receba uma matriz A[12][12] e retorna a mdia aritmtica dos
elementos abaixo da diagonal principal.

50
Captulo Oito

Captulo Oito

Neste captulo sero revisados os conceitos de bloco de cdigo e o conceito de escopo de


varivel de memria. Tambm ser apresentado o conceito de procedimento e funo.

Bloco de Cdigo

Blocos de cdigo foram utilizados em todos os exemplos vistos at agora. Na linguagem C# os


delimitadores de um bloco de cdigo so as chaves, que marcam o incio, {, e o fim, }, de
uma seqncia de declaraes e comandos.

No exemplo abaixo temos dois blocos de cdigo:

1. O primeiro refere-se funo Main().


2. O segundo a estrutura de repetio while(), que est dentro do bloco de cdigo da
funo Main().

static void Main(string[] args)


{
int t = 1;
while (t <= 10)
{
Console.WriteLine(t * 9);
t = t + 1;
}
}

Quando um bloco comea a ser executado as variveis dentro dele so ativadas, isto , passam
a existir, e permanecem ativas at o trmino da execuo do bloco. Isto significa que as
variveis declaradas dentro de um bloco de cdigo existiro apenas dentro dele, ou seja, so
variveis locais.

A vantagem desta forma de processamento que permite que os desenvolvedores gerenciem


a utilizao de memria. Por exemplo, um vetor ou matriz que alocar bastante espao na
memria pode ser declarado e utilizado apenas dentro do bloco de cdigo onde ele
necessrio, ao encerrar o bloco o espao ocupado pelo vetor ou matriz deixar de existir,
liberando recursos de memria.

51
Captulo Oito

Escopo de Varivel de Memria

O escopo de uma varivel de memria diz respeito a sua abrangncia ou visibilidade. Variveis
locais possuem visibilidade, isto , podem ser acessadas dentro do bloco de cdigo onde foi
declarada. Se um bloco de cdigo possui blocos de cdigo dentro dele ento as variveis
declaradas no bloco de cdigo mais externos tambm so visveis nos blocos internos. Neste
caso diz-se que a varivel global para todos os blocos internos.

Uma estratgia eficiente de programao , portanto, declarar variveis locais ao mximo


possvel, pois o espao de memria alocado por elas ser liberado assim que o bloco de cdigo
que a declarou encerrado.

Mtodos

Em linguagens de programao orientadas a objetos, como o caso de C#, mtodos so


utilizados para executar pequenas partes dos programas. uma estratgia de
desenvolvimento, ou seja, ao invs de criar um programa inteiro como um nico bloco de
cdigo contendo diversos outros blocos dentro dele, o bloco pode ser dividido em pequenas
partes chamadas mtodos, que iro executar processos especficos do programa.

A vantagem em dividir partes do processamento em mtodos que eles isolaram


comportamentos especficos do programa, assim, quando uma alterao em determinado tipo
de comportamento for necessrio, basta alterar apenas o mtodo responsvel por tal
comportamento. A isolao do mtodo das outras partes do programa ajudar a evitar efeitos
colaterais, ou bugs, em outras partes do programa. Este um dos princpios da tcnica de
programao orientada a objetos. A linguagem C# uma linguagem que pertence classe das
linguagens ditas orientadas a objetos.

Mtodo que no retorna valor

Mtodos que no retornam valores so chamados de mtodos void. Void, em ingls, significa
oco ou vazio, neste caso, um mtodo void significa um mtodo cujo retorno vazio, ou seja,
nenhum valor de retorno. Nas linguagens estruturadas este tipo de mtodo chamado de
procedimento.

Um exemplo de mtodo void o mtodo Main() que foi utilizado at agora. Main() o mtodo
principal de uma aplicao C#, significa que a porta de entrada de uma aplicao. Quando

52
Captulo Oito

um programa C# executado, o compilador inicia a sua execuo a partir do mtodo Main().


Main() inicia e termina sem retornar nenhum valor.

O programa abaixo mostra um exemplo de utilizao de mtodos void. Os mtodos adicao(),


subtracao(), multiplicacao() e divisao() recebem os valores das variveis x e y em seus
parmetros a e b e, em seguida, realiza a operao matemtica correspondente. Os
parmetros so variveis locais ao mtodo.

O programa principal apenas realiza a chamada do mtodo, que executado e depois retorna
o controle do processamento para a linha seguinte a que foi chamado. O programa principal
fica mais limpo, mais fcil de entender.

Esta separao tem outro benefcio, alm do isolamento j comentado anteriormente. Caso
um outro programa tenha a necessidade de utilizao de um mtodo que realize uma
operao de multiplicao, mais fcil copiar os comandos referentes multiplicao quando
eles esto empacotados como mtodos do que retir-los do corpo do programa principal. Ao
copiar o mtodo estamos copiando tudo que necessrio para que ele funcione em outro
programa, pois ele, de certa forma, est isolado do resto do programa.

static void Main(string[] args)


{
string operador;
int x, y;
Console.WriteLine("Indique a operao {+,-,*,/}");
operador = Console.ReadLine();
Console.WriteLine("Digite um nmero inteiro");
x=Int16.Parse(Console.ReadLine());
Console.WriteLine("Digite outro nmero inteiro");
y=Int16.Parse(Console.ReadLine());
switch (operador)
{
case "+":
adicao(x, y);
break;
case "-":
subtracao(x, y);
break;
case "*":
multiplicacao(x, y);
break;
case "/":
divisao(x, y);
break;
default:
Console.WriteLine("Operador invlido!");
break;
}
}

53
Captulo Oito

static void adicao(int a, int b)


{
Console.WriteLine("{0}+{1}={2}",a,b,(a + b));
}

static void subtracao(int a, int b)


{
Console.WriteLine("{0}-{1}={2}", a, b, (a - b));
}

static void multiplicacao(int a, int b)


{
Console.WriteLine("{0}*{1}={2}", a, b, (a * b));
}

static void divisao(int a, int b)


{
Console.WriteLine("Soma de {0}/{1}={2}", a, b, (a / b));
}

Mtodo que retorna valor

Em casos onde o mtodo deve ser executado e retornar algum valor para o programa que o
chamou necessrio definir o tipo de dado que o mtodo retornar. Esta definio feita na
declarao do mtodo. Nas linguagens estruturadas este tipo de mtodo chamado de
funo.

Como exemplo o programa anterior ser alterado para utilizar mtodos que retornam valores.

static void Main(string[] args)


{
string operador;
int x, y;
Console.WriteLine("Indique a operao {+,-,*,/}");
operador = Console.ReadLine();
Console.WriteLine("Digite um nmero inteiro");
x=Int16.Parse(Console.ReadLine());
Console.WriteLine("Digite outro nmero inteiro");
y=Int16.Parse(Console.ReadLine());
switch (operador)
{
case "+":
Console.WriteLine("{0}+{1}={2}",x,y,adicao(x,y));
break;
case "-":
Console.WriteLine("{0}-{1}={2}",x,y,subtracao(x,y));
break;
case "*":
Console.WriteLine("{0}*{1}={2}",x,y,multiplicacao(x,y));
break;
case "/":
Console.WriteLine("{0}/{1}={2}",x,y,divisao(x,y));
break;
default:
Console.WriteLine("Operador invlido");

54
Captulo Oito

break;
}
}

static int adicao(int a, int b)


{
return(a + b);
}

static int subtracao(int a, int b)


{
return(a - b);
}

static int multiplicacao(int a, int b)


{
return(a * b);
}

static double divisao(int a, int b)


{
return((double) a / (double) b);
}

Passagem de parmetros

Na linguagem C# existem quatro formas de se passar parmetros para mtodos:

1. Por valor (utilizada nos exemplos anteriores).


2. Por referncia.
3. Sada.
4. Nmero varivel de parmetros.

Passagem de parmetros por valor

Alteraes realizadas nas variveis dos mtodos, correspondentes aos parmetros passados,
no afetam o valor das variveis utilizadas na chamada do mtodo.

No exemplo a seguir o valor original da varivel X no alterado pelo mtodo execMetodo


atravs do parmetro Z.

A passagem de parmetro por valor (value default da linguagem C#).

class Program
{
static void Main(string[] args)
{
int x = 0;
execMetodo(x);
Console.WriteLine(x);
}

55
Captulo Oito

static void execMetodo(int z)


{
z += 10;
Console.WriteLine(z);
}
}

Passagem de parmetros por referncia

Alteraes realizadas nas variveis dos mtodos, correspondentes aos parmetros passados,
afetam o valor das variveis utilizadas na chamada do mtodo.

No exemplo a seguir o valor original da varivel X alterado pelo mtodo execMetodo atravs
do parmetro Z.

class Program
{
static void Main(string[] args)
{
int x = 0;
execMetodo(ref x);
Console.WriteLine(x);
}

static void execMetodo(ref int z)


{
z += 10;
Console.WriteLine(z);
}
}

Parmetros de sada

Parmetros de sada so parmetros que recebem um valor dentro do mtodo chamado. O


compilador da C# gera um erro quando recebe parmetros no inicializados. Para resolver esta
questo utilizam-se parmetros de sada, que informam ao compilador que o parmetro ser
inicializado dentro do mtodo, evitando o erro do compilador.

No exemplo a seguir a varivel X declarada, mas no inicializada no mtodo Main(). A


chamada do mtodo execMetodo() com a declarao out precedendo a varivel, mesmo sem
ela ter sido declarada, evita que o compilador gere um erro ao compilar o programa. Ele
entende que a varivel ser declarada dentro do mtodo e sair dele com um valor definido.

static void Main(string[] args)


{
int x;
execMetodo(out x);
Console.WriteLine(x);
}

56
Captulo Oito

static void execMetodo(out int z)


{
z = 10;
Console.WriteLine(z);
}

Passagem de Nmero Varivel de Parmetros

Nesta forma de passagem de parmetros o mtodo define um vetor precedido pela palavra
reservada params, indicando que os parmetros passados sero atribudos aos elementos do
vetor. O exemplo a seguir realiza a soma de todos os elementos de um vetor.

Os valores passados devem ser do mesmo tipo de dado do vetor params do mtodo.

public static int soma(params int[] v)


{
int s = 0;
for (int i = 0; i < v.Length; i++) s += v[i];
return s;
}

public static void Main(string[] args)


{
int t = soma(33, 12, 22, 3, 30, 44, 12, -1);
Console.WriteLine("Soma: {0}", t);
}

57
Captulo Nove

Captulo Nove

Neste captulo sero apresentados os conceitos referentes ao desenvolvimento de aplicaes


C# utilizando Windows Forms ou Formulrios Windows ou simplesmente formulrios.

Formulrios Windows

Formulrios Windows so interfaces grficas, ou Graphical User Interfaces, que formam o


conhecido acrnimo, GUI, utilizadas para realizar a comunicao entre um programa e seus
usurios. O formulrio Windows define a rea de trabalho onde, sobre a qual, so criados
controles com funcionalidades especficas, como, por exemplo, controles para entrada de
dados (TextBox), controles para exibio de cones ou textos (Label), botes para disparar
eventos especficos (Button), controles para que o usurio indique um estado de seleo
(CheckBox), controles que exibiro uma lista de itens para o usurio selecionar uma opo
(ComboBox), controles que exibiro uma lista de itens que permitir a seleo de um nico
item ou mltiplos itens. Ao longo deste captulo veremos como utilizar estes controles, que
no so os nicos disponveis na ToolBox (Caixa de Ferramentas) do Visual Studio, mas so,
provavelmente, os mais utilizados.

Antes sero apresentadas algumas propriedades bsicas de um formulrio.

Ao criar um formulrio ele apresentado conforme exibido pela Figura 16.

Figura 16 Formulrio

58
Captulo Nove

Para manipular as propriedades do formulrio, e de qualquer controle, necessrio utilizar a


janela Properties, normalmente localizada no lado direito da rea de trabalho do Visual Studio.
A Figura 17 mostra a janela Properties.

Figura 17 - Janela Properties

Caso a janela Properties no esteja visvel, selecione a opo Properties Windows, no menu
View Figura 18.

Figura 18 - Menu para exibir a janela Properties Windows

59
Captulo Nove

Para alterar o ttulo do formulrio

Para alterar o ttulo do formulrio utiliza-se a propriedade Text. Na Figura 16, o ttulo do
formulrio Form1, para alter-lo para Sistema Gerencial, por exemplo, necessrio clicar
em qualquer lugar do formulrio, para torn-lo ativo e depois procurar a propriedade Text na
janela de propriedades. Na Figura 17 pode ser observado que o objeto selecionado um
formulrio e que sua propriedade Text contm a informao Form1. Para alter-la basta
clicar sobre a palavra Form1 e digitar Sistema Gerencial e depois pressionar ENTER. Note
que o ttulo alterado instantaneamente no formulrio Figura 19.

Figura 19 - Formulrio com novo ttulo

Para alterar o estilo das bordas do formulrio

O estilo padro de um formulrio Sizable, o que significa que o usurio pode alterar seu
tamanho quando o programa estiver em uso. Para alterar o estilo da borda para um que no
permita que o usurio altere as definies de tamanho do formulrio, definidas em tempo de
desenvolvimento, basta selecionar o formulrio, para torn-lo ativo e procurar a propriedade
FormBordeStyle e selecionar o item FixedSingle, onde o estilo da borda fixo.

Para configurar os botes de maximizar e minimizar o formulrio

Os botes para maximizar e minimizar o formulrio, que aparecem no canto superior direito
do formulrio podem ser configurados atravs das propriedades MaximizeBox e MinimizeBox.
Para ambas as propriedades, se o valor da mesma estiver definido como true (verdadeiro), o
boto correspondente ser visvel, caso contrrio, isto , false, o boto no ser apresentado.

60
Captulo Nove

Para configurar o estilo de abertura do formulrio

A propriedade WindowState define o estilo de abertura de um formulrio, quando ele for


executado, o padro Normal, ou seja, o tamanho do formulrio o mesmo daquele definido
em tempo de desenvolvimento. Os estilos Maximized e Minimized executam o formulrio no
estilo maximizado e minimizado, respectivamente.

Para definir o nome do formulrio

A propriedade Name define o nome pelo qual o objeto, neste caso, o formulrio, ser
referenciado no programa. Tem a mesma funo que o nome de uma varivel de memria.
Esta propriedade deve ser definida logo que o formulrio criado para evitar problemas de
referncia de nomes dentro do cdigo fonte.

Outras propriedades de formulrios Windows

Propriedade Valor Descrio


AcceptButton Nome do boto no Associa o boto tecla
formulrio ENTER. Executa o cdigo
associado ao boto quando
ENTER for pressionado.
CancelButton Nome do boto no Associa o boto tecla ESC.
formulrio Executa o cdigo associado
ao boto quando ESC for
pressionado.
IsMDIContainer True Define o formulrio como um
container para outros
formulrios.

ToolBox (Caixa de Ferramentas ou Caixa de Controles)

A ToolBox, Figura 20, por padro exibida do lado esquerdo na janela de projetos do C#. Caso
ela no esteja visvel possvel ativ-la atravs da opo ToolBox no menu View.

A ToolBox possui um conjunto de controles (s vezes tambm chamados de componentes) que


podem ser utilizados para implementar funcionalidades no formulrio. Cada controle possui
uma funo especfica que produzir um resultado para o formulrio.

Para utilizar adequadamente cada controle necessrio entender sua funo, suas
propriedades e seus eventos.

61
Captulo Nove

Existem os chamados componentes de terceiros que so controles fornecidos por outras


empresas de software que, depois de instalados e configurados, so disponibilizados na
ToolBox para os desenvolvedores.

Para utilizar um controle basta selecion-lo na ToolBox e arrast-lo e solt-lo sobre o


formulrio. Depois necessrio configurar suas propriedades e eventos para ele realize a
funo desejada.

Figura 20 - Janela ToolBox

Controles Label, TextBox e Button

O controle Label, do ingls rtulo, serve para rotular ou mostrar um texto em qualquer parte
do formulrio. O texto a ser exibido pode ser definido durante o projeto ou durante a
execuo do programa e deve ser atribudo propriedade Text.

O controle TextBox serve para entrada e exibio de dados. Equivale a um campo para entrada
de dados. O valor atribudo ao campo TextBox definido atravs da propriedade Text. Toda
informao armazenada em um controle TextBox tratada como sendo do tipo texto (String).

O controle Button, boto em ingls, utilizado para disparar eventos (aes) quando o boto
pressionado. O texto que aparece no boto definido na propriedade Text, os comandos
que sero executados quando se clicar no boto sero definidos no evento Click.

62
Captulo Nove

Eventos

Eventos so interaes que ocorrero com os controles dispostos em um formulrio e o


prprio formulrio. O controle destas interaes se d atravs da programao destes
eventos, por exemplo, quando o usurio clicar em um boto o evento Click, deste boto ser
disparado. possvel inserir cdigo (programar) tal evento de forma que o programa faa o
processamento que desejamos quando este evento ocorrer em um dado boto.

Cada boto ter seu evento Click distinto. Isto , o boto de nome Button1 possuir um evento
Click que poder ser programado conforme necessidades do programa, o boto Button2
possuir um evento Click que tambm poder ser programado independentemente do evento
Click do Button1. Para que no haja confuso importante nomear corretamente cada
controle do formulrio.

Exemplo 1: Formulrio com Button e TextBox. Ao disparar o evento Click do Button uma
mensagem atribuda TextBox. Repare no nome dos controles.

a. Carregue o Visual C# Express Edition.


b. No menu File selecione New Project.
c. Na tela New Project selecione o tipo de projeto que deseja criar, neste caso selecione
Windows Forms Application A Figura 21 exibe a interface disponvel na verso 2010
do Visual C# Express Edition, apesar de ser visualmente diferente da verso 2008, o
contedo praticamente o mesmo.
d. Informe, no campo Nome, o nome do projeto, neste caso Exemplo1.
e. Clique no boto OK. O projeto ser criado e a Figura 22 ser exibida, com um
formulrio vazio para ser trabalhado.

Figura 21 - Criao novo projeto

63
Captulo Nove

f. Na Toolbox (lado esquerdo da rea de trabalho) selecione o controle Button e arraste


at sobre o formulrio e solte.
g. Na Toolbox selecione o controle TextBox e arraste at sobre o formulrio e solte.
Dispondo-os (posio e tamanho) conforme a Figura 23.

Figura 22 - Ambiente para criao de projeto Windows Form

Figura 23 - Construindo um formulrio

64
Captulo Nove

h. Para alterar a propriedade Name do Button: clique sobre ele e procure a propriedade
Name na lista Properties (lado inferior direito da tela). Digite btnOK.
i. Para alterar a propriedade Name da TextBox: clique sobre ela e procure a propriedade
Name na lista Properties. Digite txtMensagem.
j. Para alterar a propriedade Text do Button: clique sobre ela e procure a propriedade
Text na lista Properties. Digite Clique aqui.
k. Para alterar a propriedade Text do Form: clique sobre uma rea vazia do formulrio e
procure a propriedade Text na lista Properties. Digite Exemplo 1. Note que a
mensagem Exemplo 1 aparecer na barra de ttulo do formulrio. Ver Figura 24.

Figura 24 - Exemplo 1 com algumas propriedades alteradas

l. Para programar o evento Click do boto btnOK d um duplo-clique sobre ele. A janela
para edio do evento ser exibida.
m. Na janela para edio do evento Click do boto btnOK digite o trecho de cdigo
conforme Figura 25. No exemplo a mensagem Alo mundo! ser sendo atribuda
propriedade Text da TextBox txtMensagem.
n. Execute o programa e veja o que acontece quando voc clicar no boto.

65
Captulo Nove

Figura 25 - Codificao evento Click de btnOK

Exemplo 2: Este exemplo mostra como trabalhar com informaes numricas em controles
TextBox. O formulrio abaixo implementa um programa bem simples, uma TextBox, cujo valor
inicial 1 (um), tem seu valor incrementado ou decrementado conforme os boto + e - so
pressionados.

Os eventos Clik de cada boto so apresentados abaixo. Note que necessrio realizar
converses de tipo de dados para manipular o valor da TextBox. A converso necessria
para realizar a operao aritmtica e depois para exibir o valor atualizado na TextBox.

66
Captulo Nove

Exerccios

1. Implemente uma calculadora conforme a figura abaixo. Tratar divises por zero para
no ocorrer falhas.

67
Captulo Nove

2. Uma eleio possui trs candidatos: Chico, Z e o Tonho, alm das opes Branco e
Nulo.

Faa um programa usando Windows Forms que represente a urna de votao.


Cada opo deve ser apresentada em um boto. O boto Encerrar finaliza a
votao exibindo o nome do candidato vencedor em uma caixa de texto.

Exiba tambm o percentual de pessoas que votaram no vencedor.

Controle ListBox

O controle ListBox, mostra uma lista de itens (opes) que podem ser selecionados pelo
usurio. A seguir so apresentados alguns mtodos relacionados ao controle ListBox.

Mtodo Descrio
SelectedIndex Retorna o ndice referente ao item selecionado (base Zero).
SelectedItem Retorna o item selecionado.
FindString Procura um item na lista que inicia com uma string. Retorna -1
se no encontrar.
Items.Add Adiciona itens na lista.
Items.RemoveAt Remove um item da lista.
Items.Clear Remove todos os itens da lista.

Exemplo 1: Este exemplo mostra uma lista simples de cidades. A cidade selecionada ser
exibida em uma TextBox, bem como seu ndice (posio) na lista, notar que o ListBox, assim
como os vetores, so indexados a partir do valor zero. Observar que os itens so carregados na
ListBox no evento Load do formulrio.

private void Form1_Load(object sender, EventArgs e)


{
lstCidades.Items.Add("Campinas");
lstCidades.Items.Add("Valinhos");
lstCidades.Items.Add("Vinhedo");
lstCidades.Items.Add("Hortolndia");
lstCidades.Items.Add("Jaguarina");
}

private void lstCidades_SelectedIndexChanged(object sender, EventArgs e)


{
txtCidade.Text = lstCidades.Text;
txtIndice.Text = (lstCidades.SelectedIndex).ToString();
}

68
Captulo Nove

Exemplo 2: Este exemplo exibe um formulrio e dois botes. No evento click do primeiro
boto so gerados mil nmeros aleatrios e carregados na ListBox. No evento click do segundo
boto todos os itens da ListBox so eliminados.

private void btnOK_Click(object sender, EventArgs e)


{
Random x = new Random();
for(int y=0;y<1000;y++)
{
lstNum.Items.Add(x.Next(0,1000));
}
}

private void btnLimpar_Click(object sender, EventArgs e)


{
lstNum.Items.Clear();
}

69
Captulo Nove

Exemplo 3: Este exemplo adiciona uma funcionalidade ao exemplo anterior: um boto que
ordena os itens de uma lista. Se a propriedade Sorted estiver ativada (Sorted = True) ento os
itens da lista sero ordenados de forma ascendente.

private void btnOK_Click(object sender, EventArgs e)


{
Random x = new Random();
for(int y=0;y<1000;y++)
{
lstNum.Items.Add(x.Next(0,1000));
}
}

private void btnLimpar_Click(object sender, EventArgs e)


{
lstNum.Items.Clear();
}

private void btnOrdenar_Click(object sender, EventArgs e)


{
lstNum.Sorted = true;

70
Captulo Nove

Exemplo 4: O prximo exemplo mostrar como adicionar um item a uma lista, a partir da
informao contida em uma TextBox.

private void btnAdd_Click(object sender, EventArgs e)


{
//Verifica se existe texto no campo cidade
//Para evitar adicionar espao em branco
if (txtCidade.Text.Length > 0)
{

lstCidade.Items.Add(txtCidade.Text);
}
//Limpa o campo cidade
txtCidade.Clear();
//Coloca o cursor no campo txtCidade
txtCidade.Focus();
}

private void btnDel_Click(object sender, EventArgs e)


{
//lstCidade.SelectedIndex resulta a posio do item selecionado
if (lstCidade.SelectedIndex >= 0)
{
lstCidade.Items.RemoveAt(lstCidade.SelectedIndex);
}
}

Observar, na Figura abaixo, que o boto Selecionar est selecionado. Isso ocorre porque ele
est definido como o boto que ser executado quando a tecla ENTER for pressionada. Para
definir esta propriedade necessrio indicar o nome do boto na propriedade AcceptedButton
do formulrio. Este recurso melhora bastante a produtividade do usurio da interface uma vez
que pode disparar um comando a partir do teclado, sem precisar utilizar o mouse.

71
Captulo Nove

Problemas com a verso anterior:

1. Aceita nomes de cidade repetidos.


2. Considera espaos em branco no final do nome da cidade.

Verifique os problemas citados!

Os dois problemas so resolvido no cdigo abaixo.

1. Para evitar adicionar um nome repetido utilizado o mtodo FindString. FindString


retorna o ndice da palavra procurada dentro da lista ou -1 caso no encontre nada.

2. Para evitar o problema dos espaos em branco, s vezes digitados pelos usurios,
utiliza-se o mtodo Trim, que remove os espaos em branco do incio e fim da string.

private void btnAdd_Click(object sender, EventArgs e)


{
//Verifica se existe texto no campo cidade
//Para evitar adicionar espao em branco
if (txtCidade.Text.Length > 0)
{
if (lstCidade.FindString(txtCidade.Text.Trim()) < 0)
{
lstCidade.Items.Add(txtCidade.Text.Trim());
}
}

//Limpa o campo cidade


txtCidade.Clear();
//Coloca o cursor no campo txtCidade
txtCidade.Focus();
}

private void btnDel_Click(object sender, EventArgs e)


{
//lstCidade.SelectedIndex resulta a posio do item selecionado
if (lstCidade.SelectedIndex >= 0)
{
lstCidade.Items.RemoveAt(lstCidade.SelectedIndex);
}
}

Acrescente um boto com o texto Remover todos os itens. No evento Click deste boto
digite o cdigo abaixo:

lstCidade.Items.Clear();

72
Captulo Nove

Exemplo 5: Algumas vezes necessrio verificar se o dado informado pelo usurio um


nmero, uma letra, um smbolo, se est em maisculo, se est em minsculo etc. O cdigo
abaixo apresenta vrias funes deste tipo na linguagem C#.

char chCaracter = Convert.ToChar(txtChar.Text);


if (txtChar.Text.Length > 0)
{
lstChar.Items.Clear();
lstChar.Items.Add(" nmero: " + char.IsDigit(chCaracter));
lstChar.Items.Add(" letra: " + char.IsLetter(chCaracter));
lstChar.Items.Add(" nmero ou letra: " + char.IsLetterOrDigit(chCaracter));
lstChar.Items.Add(" minscula: " + char.IsLower(chCaracter));
lstChar.Items.Add(" maiscula: " + char.IsUpper(chCaracter));
lstChar.Items.Add("Maiscula: " + char.ToUpper(chCaracter));
lstChar.Items.Add("Minscula: " + char.ToLower(chCaracter));
lstChar.Items.Add(" pontuao: " + char.IsPunctuation(chCaracter));
lstChar.Items.Add(" smbolo: " + char.IsSymbol(chCaracter));
txtChar.Focus();
}

73
Captulo Nove

Exerccio

1. Implementar cada um dos quatro botes do formulrio abaixo. > deve mover o item
selecionado para a lista da direita. >> deve mover todos os itens da lista da esquerda
para a lista da direita. < e << devem funcionar analogamente aos outros botes,
mas no caminho inverso.

Controle RadioButtom e CheckBox

RadioButton permite que o usurio selecione uma nica opo dentre um grupo de opes.
Quando o usurio seleciona uma opo, o outro RadioButton desmarcado
automaticamente.

Um grupo consiste de vrios RadioButton dentro de um determinado container. Para criar um


container utiliza-se o controle GroupBox.

RadioButton e CheckBox possuem funes similares: eles oferecem opes para o usurio
escolher. A diferena que mltiplas selees simultneas so permitidas pelo
CheckBox enquanto o RadioButton mutuamente exclusivo.

A seguir so apresentados alguns mtodos e propriedades relacionados aos controles


RadioButton e CheckBox.

Propriedades e Eventos Descrio


Checked Propriedade que define o status do controle. True, se
o controle estiver selecionado; false, caso contrrio.
CheckedChanged Evento disparado quando a propriedade Checked
alterada.

74
Captulo Nove

Exemplo 6: O formulrio abaixo implementa a idia de uma bomba de combustvel. Ao


carregar o programa a opo Gasolina j deve aparecer habilitada automaticamente. O
usurio pode alterar o tipo de combustvel desejado selecionado entre as dus opes
disponveis lcool ou Gasolina. No deve ser possvel selecionar as duas ao mesmo tempo.
Ao selecionar um determinado combustvel o preo do litro deve ser apresentado. O usurio
deve informar a quantidade de litros desejada e pressionar o boto Pagar. O total a ser pago
deve ser exibido.

75
Captulo Nove

Exemplo 7: O exemplo a seguir utiliza o controle CheckBox. Ao ser selecionada uma regio do
pas, uma lista carregada com as capitais dos estados da regio selecionada. O cdigo a
seguir (incompleto) mostra uma funo denominada PoeNaLista que recebe como parmetros
uma matriz, contendo os dados necessrios relacionados s regies e capitais, e uma string
que indica a regio selecionada.

a) Analise o funcionamento de PoeNaLista.


b) Complete o programa para as capitais que esto faltando.
c) Implemente a funo RemoveDaLista, que deve remover todas as capitais da regio
deselecionada.

namespace ExemploBotaoRadio
{
public partial class Form1 : Form
{
string[,] capital = new string[10,2];
public Form1()
{
InitializeComponent();
}

private void Form1_Load(object sender, EventArgs e)


{
capital[0, 0] = "N";
capital[0, 1] = "Belm";
capital[1, 0] = "N";
capital[1, 1] = "Rio Branco";
capital[2, 0] = "N";
capital[2, 1] = "Macap";
capital[3, 0] = "N";
capital[3, 1] = "Boa Vista";

76
Captulo Nove

capital[4, 0] = "N";
capital[4, 1] = "Porto Velho";
capital[5, 0] = "S";
capital[5, 1] = "Curitiba";
capital[6, 0] = "S";
capital[6, 1] = "Florianpolis";
capital[7, 0] = "S";
capital[7, 1] = "Porto Alegre";
}

void PoeNaLista(string[,] m, string regiao)


{
for (int i = 0; i < m.GetLength(0) ; i++)
{
if (m[i, 0] == regiao)
{
lstCapital.Items.Add(m[i, 1]);
}
}
}

void RemoveDaLista(string[,] m, string regiao)


{
//
}

private void checkBox1_CheckedChanged(object sender, EventArgs e)


{
if (checkBox1.Checked)
{
PoeNaLista(capital, "N");
}
else
{
RemoveDaLista(capital, "N");
}
}

private void checkBox5_CheckedChanged(object sender, EventArgs e)


{
if (checkBox5.Checked)
{
PoeNaLista(capital, "S");
}
else
{
RemoveDaLista(capital, "S");
}
}

}
}

77
Captulo Dez

Captulo Dez

Neste captulo sero apresentados o conceito de formulrio MDI (Multiple Document


Interface) e o uso do controle MenuStrip.

Formulrios MDI

Formulrios MDI so containers para outros formulrios. Vrios formulrios filhos podem ser
abertos dentro de um formulrio MDI (ou formulrio pai). Isso serve para organizar todos os
formulrios de uma aplicao dentro de um nico objeto, o formulrio MDI.

Um projeto pode ter um nico formulrio MDI.

Para definir um formulrio como MDI basta definir a propriedade IsMDIContainer como True.

Controle MenuStrip

O controle MenuStrip implementa a estrutura de menu em formulrios.

Exemplo 1: O exemplo a seguir implementa um projeto com um formulrio MDI com um


controle de menu que abre um formulrio filho. Execute cada passo a seguir.

1) Criar um projeto do tipo Windows Form. Nomear como SISTEMA.


2) Alterar a propriedade Text do formulrio para Sistema.
3) Alterar a propriedade Name do formulrio para principal.
4) Alterar a propriedade IsMDIContainer para True.
5) Alterar a propriedade WindowState para Maximized.
6) Executar (F5). Observar as alteraes realizadas.
7) Fechar o programa em execuo (voltar para o projeto).
8) Na ToolBar clicar no componente MenuStrip e arrastar sobre o formulrio. Solte o
componente sobre o formulrio e uma estrutura para criar um menu aparecer.

78
Captulo Dez

9) Digite Sistema onde est escrito Type Here.


10) Digite Sair logo abaixo do menu Sistema.

79
Captulo Dez

11) D um duplo-clique no menu Sair. Ser aberta a rea para codificao. Informe o
comando que ser executado ao ser selecionado a opo Sair.

12) Execute o programa e teste o menu criado.


13) Feche o programa e volte para o formulrio principal.
14) Clique no menu Sistema. Aparecero espaos para a criao de outras opes de
menu.
15) Crie uma estrutura de menu conforme a figura abaixo.

16) Adicione um formulrio ao projeto. Selecione Add Windows Form no menu


Project. Nomeie-o como somar.

80
Captulo Dez

17) Defina o layout de somar conforme a figura abaixo.

18) Implemente o cdigo do boto conforme abaixo.

19) Abra o formulrio principal (d um duplo clique no nome dela na janela Solution
Explorer ele aparece com o nome Form1.cs)
20) No menu, d um duplo-clique na opo Somar.
21) Digite o cdigo abaixo, responsvel por abrir o formulrio.

22) Execute o programa. Tente abrir mais de uma instncia do formulrio Somar. O que
acontece?
23) Altere o cdigo do menu Somar de acordo com o apresentado abaixo, para resolver o
problema observado.

81
Captulo Dez

24) Implemente o formulrio Multiplicar.

82
Captulo Onze

Captulo Onze

Neste captulo sero apresentadas as classes StreamReader e StreamWriter.

StreamReader

Classe que prov mecanismos para leitura de um arquivo texto.

StreamWriter

Classe que prov mecanismos para gravao de um arquivo texto.

Exemplo 1: O cdigo abaixo (btnCarregar_Click) pertence a um boto Carregar, de um


formulrio. Ao ser pressionado ele dispara o evento Click que carrega todos os dados de um
arquivo formato texto e exibe em uma ListBox neste caso est sendo demonstrado o uso de
StreamReader. Na sequencia exibido o cdigo referente ao boto que grava as informaes
da ListBox em um arquivo formato texto btnGravar.

private void btnCarregar_Click(object sender, EventArgs e)

try

//Inicializa o construtor StreamReader com o nome do arquivo e define que


//utilizar acentuao

StreamReader sr = new StreamReader("C:\\Cidade.txt", Encoding.UTF7);

//L a primeira linha do arquivo

string linha = sr.ReadLine();

//Continua lendo at o final do arquivo

while (linha != null)

83
Captulo Onze

//Adiciona o linha lida no ListBox

lstCidades.Items.Add(linha);

//L a prxima linha

linha = sr.ReadLine();

//Fecha o arquivo texto

sr.Close();

catch

MessageBox.Show("Falha ao tentar abrir o arquivo!", "Aviso");

private void btnGravar_Click(object sender, EventArgs e)

//Abre o arquivo para gravao

//Parmetros: nome do arquivo, no adicionar, usar acentuao

StreamWriter sw = new StreamWriter ("C:\\Cidade.txt",false,Encoding.UTF8);

//Percorre todos os itens da ListBox

for (int j = 0; j < lstCidades.Items.Count; j++)

84
Captulo Onze

//Seleciona um item da ListBox

lstCidades.SelectedIndex = j;

//Escreve (grava) o item selecionado no arquivo texto

sw.WriteLine(lstCidades.SelectedItem);

//Fecha o arquivo

sw.Close();

Exerccio

1. Implementar ...

85
Captulo Onze

86
Captulo Onze

87
Captulo Onze

88
Captulo Onze

89
Captulo Onze

private void carregadados()


{
StreamReader sr = new StreamReader("C:\\TEMP\\Pedido.txt",
Encoding.UTF7);
string linha = null;

pedido = new string[totalpedidos(),11];


posicao = 0;
while ((linha = sr.ReadLine()) != null)
{
string[] linhaSeparada = linha.Split(';');
pedido[posicao,0] = linhaSeparada[0];
pedido[posicao, 1] = linhaSeparada[1];
pedido[posicao, 2] = linhaSeparada[2];
pedido[posicao, 3] = linhaSeparada[3];
pedido[posicao, 4] = linhaSeparada[4];
pedido[posicao, 5] = linhaSeparada[5];
pedido[posicao, 6] = linhaSeparada[6];
pedido[posicao, 7] = linhaSeparada[7];
pedido[posicao, 8] = linhaSeparada[8];
pedido[posicao, 9] = linhaSeparada[9];
pedido[posicao, 10] = linhaSeparada[10];
posicao++;
totpedido++;
}

sr.Close();
}

90
Captulo Onze

private void mostrapedidoitem(string idpedido)


{
// Create an unbound DataGridView by declaring a column count.
dataGridView1.ColumnCount = 5;
dataGridView1.ColumnHeadersVisible = true;

// Set the column header style.


DataGridViewCellStyle columnHeaderStyle = new
DataGridViewCellStyle();
// Define o cabealho das colunas da grid
dataGridView1.Columns[0].Name = "Cdigo";
dataGridView1.Columns[1].Name = "Descrio";
dataGridView1.Columns[2].Name = "Qtdade";
dataGridView1.Columns[3].Name = "Unitrio";
dataGridView1.Columns[4].Name = "Total";

//Ordena valores pela direita


dataGridView1.Columns["Qtdade"].DefaultCellStyle.Alignment =
DataGridViewContentAlignment.MiddleRight;
dataGridView1.Columns["Unitrio"].DefaultCellStyle.Alignment =
DataGridViewContentAlignment.MiddleRight;
dataGridView1.Columns["Total"].DefaultCellStyle.Alignment =
DataGridViewContentAlignment.MiddleRight;

//Cria objeto para conjunto de linhas


DataGridViewRowCollection rows = this.dataGridView1.Rows;

for (int i = 0; i < pedido.GetLength(0); i++)


{
if (pedido[i, 0] == idpedido)
{

rows.Add(pedido[i,6],pedido[i,7],pedido[i,8],pedido[i,9],pedido[i,10]);
}

}
}

91
Captulo Onze

private void dataGridView1_CellClick(object sender,


DataGridViewCellEventArgs e)
{
textBox3.Text = dataGridView1.CurrentRow.Cells[0].Value.ToString();
textBox4.Text = dataGridView1.CurrentRow.Cells[1].Value.ToString();
textBox5.Text = dataGridView1.CurrentRow.Cells[2].Value.ToString();
textBox6.Text = String.Format("{0:c}",
Convert.ToDouble(dataGridView1.CurrentRow.Cells[3].Value));
textBox7.Text = String.Format("{0:c}",
Convert.ToDouble(dataGridView1.CurrentRow.Cells[4].Value));

92

Você também pode gostar