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

1

Apostila de Lgica de Programao em C#

Professor Ms. Eduardo Rosalm Marcelino


eduardormbr@gmail.com

(2009 - 2010)
Bibliografias utilizadas:
MANZANO, J. A. N. G & OLIVEIRA, J. F. Algoritmos: Lgica para Desenvolvimento de Programao de Computadores. 14 ed. So Paulo:rica, 2002. FORBELLONE, A. L. V. & EBERSPACHER, H. F. Lgica de Programao. 2 ed. So Paulo: Makron Books, 2002. ROBINSON, Simon, Professional C# Programando De programador para programador, So Paulo: Pearson Education, 2004. DAGHLIAN, Jacob, Lgica e lgebra de Boole, Ed.Atlas, 4 Ed. - SP, 1995 Apostila Tcnicas de Programao I cedida pela Profa. Dra. Elisamara de Oliveira LIMA, EDWIN, C# e .Net para desenvolvedores / Edwin Lima, Eugnio Reis. Rio de Janeiro: Campus, 2002 Curso de C# - Mdulo I Introduo ao .NET com C# - Carlos Vamberto http://www.juliobattisti.com.br/tutoriais/default.asp

ESCLARECIMENTOS Parte desta apostila foi criada utilizando-se como referncia livros e apostilas cedidas por outros professores. Qualquer problema, por favor, entre em contato. Esta apostila foi elaborada com o propsito de servir de apoio ao curso e no pretende ser uma referncia completa sobre o assunto. Para aprofundar conhecimentos, sugerimos consultar livros da rea.

ndice lgebra Booleana ............................................................................................................................ 4 Lgica digital .............................................................................................................................. 4 lgebra booleana ........................................................................................................................ 4 Proposies ................................................................................................................................. 5 Operao AND (conjuno) ....................................................................................................... 5 Operao OR (disjuno inclusiva)............................................................................................. 5 Operao NOT (negao) ............................................................................................................ 6 Operaes XOR, NAND e NOR ................................................................................................. 6 O Conceito de Algoritmo ................................................................................................................ 8 O que um algoritmo? ................................................................................................................ 8 Conceitos Bsicos da Programao de Computadores.................................................................. 9 Linguagens Compiladas, Linguagens Interpretadas e Modelo Hbrido ....................................... 12 Interpretadas .......................................................................................................................... 12 Compiladas ........................................................................................................................... 12 Hbridas................................................................................................................................. 13 O Conceito de Programao Estruturada.................................................................................... 14 Resposta dos Exerccios ............................................................................................................ 15 Expresso de Algoritmos ............................................................................................................... 16 Expresso de Algoritmos atravs de Diagramas e Fluxogramas ................................................. 16 Exemplo de um Fluxograma .................................................................................................. 17 Alguns smbolos utilizados em diagramas de bloco e fluxogramas:........................................ 18 Expresso de Algoritmos atravs de Linguagem de Programao .............................................. 19 Programao em C# ...................................................................................................................... 22 O que .NET ............................................................................................................................ 22 A Arquitetura .NET ................................................................................................................... 22 CLR (Commom Language Runtime) ..................................................................................... 22 CTS (Common Type System) ................................................................................................ 22 CLS (Common Language Specification)................................................................................ 22 BCL (Base Classe Library) .................................................................................................... 23 Compilando programas .NET: introduzindo a linguagem intermediria MSIL (Microsoft Intermediate Language) ......................................................................................................... 24 Compilao JIT (Just In Time) ........................................................................................... 24 VES (Virtual Execution System) ........................................................................................... 25 Gerenciamento da memria: introduzindo o GC (Garbage Collector) .................................... 25 Linguagens que suportam .NET ............................................................................................. 26 Principais vantagens da linguagem C#: .................................................................................. 26 Quando usar a .NET?............................................................................................................. 26 Estrutura bsica de um programa em C# .................................................................................... 27 Interagindo com o console ......................................................................................................... 29 Recebendo parmetros na linha de comando .............................................................................. 30 Principais Operadores................................................................................................................ 31 Variveis ................................................................................................................................... 33 Conveno PascalCasing ....................................................................................................... 33 Conveno camelCasing ........................................................................................................ 33 Palavras reservadas:............................................................................................................... 33 Declarando variveis ............................................................................................................. 34 Atribuindo valor a variveis................................................................................................... 34 Tipos de variveis .................................................................................................................. 35 Adicionando valor a uma varivel.......................................................................................... 36 Manipulando Strings ............................................................................................................. 38

3 Constantes ................................................................................................................................. 39 Saindo explicitamente da aplicao: .......................................................................................... 39 Estrutura de Deciso (IF) ........................................................................................................... 40 Estrutura de Repetio FOR ...................................................................................................... 42 Laos for infinitos ................................................................................................................. 43 Laos for aninhados............................................................................................................... 43 Laos for em decremento ....................................................................................................... 44 Estrutura de Repetio DO WHILE ........................................................................................... 44 Estrutura de Repetio WHILE ................................................................................................. 45 Vetores e Matrizes..................................................................................................................... 46 Estrutura de repetio foreach/in ............................................................................................... 48 Controle de Exceo - Bsico .................................................................................................... 49 Estruturas de dados heterogneas............................................................................................... 52 Mtodos .................................................................................................................................... 54 Declarando Mtodos .............................................................................................................. 54 Passando Parmetros para Mtodos ....................................................................................... 55 A Palavra-Chave out.............................................................................................................. 57 Escopo das variveis ................................................................................................................. 58

lgebra Booleana
Fonte adicional: http://www.forumpcs.com.br/coluna.php?b=120830

Lgica digital
Todo o raciocnio lgico baseado na tomada de uma deciso a partir do cumprimento de determinadas condies. Inicialmente tem-se os dados de entrada e uma condio (ou uma combinao de condies). Aplica-se a condio aos dados de entrada para decidir quais so os dados de sada. A lgica digital no diferente. Mas apresenta uma peculiaridade: trabalha apenas com variveis cujos valores alternam exclusivamente entre dois estados e no admitem valores intermedirios. Estes estados podem ser representados por um e zero, sim e no, verdadeiro e falso ou quaisquer outras grandezas cujo valor possa assumir apenas um dentre dois estados possveis. Portanto, a lgica digital a ferramenta ideal para trabalhar com grandezas cujos valores so expressos no sistema binrio. Em um computador, todas as operaes so feitas a partir de tomadas de decises que, por mais complexas que sejam, nada mais so que combinaes das operaes lgicas que veremos a seguir. Para tomadas de decises mais complexas, tudo o que preciso combinar estas operaes. E para isto necessrio um conjunto de ferramentas capaz de manejar variveis lgicas. Esse conjunto de ferramentas a chamada lgebra Booleana.

lgebra booleana
A lgebra booleana recebeu seu nome em homenagem ao matemtico ingls George Boole, que a concebeu e publicou suas bases em 1854, em um trabalho intitulado An Investigation of the Laws of Thought on Which to Found the Mathematical Theories of Logic and Probabilities. O trabalho, evidentemente, nada tinha a ver com computadores digitais, j que foi publicado quase um sculo antes que eles fossem inventados. Era meramente uma tratado sobre lgica, um dos muitos exemplos em que os matemticos se adiantam ao tempo e criam com dcadas de avano as bases abstratas para uma tecnologia de ponta que s vai ser descoberta muitos anos depois. De fato, foi somente em 1938 que Claude Shannon, um pesquisador do MIT, se deu conta que a lgica booleana era a ferramenta ideal para analisar circuitos eltricos baseados em rels, os antecessores imediatos dos computadores eletrnicos digitais vlvula que por sua vez originaram os modernos computadores que empregam a eletrnica do estado slido. No cabe aqui um estudo aprofundado da lgebra booleana. Por isso abordaremos apenas os conceitos fundamentais que nos permitiro mais tarde entender como eles sero utilizados internamente nos computadores. Mas para quem quiser se aprofundar no assunto, h farto material disponvel tanto na literatura tcnica especializada quanto na Internet. Aqui, repito, ficaremos apenas nos conceitos mais gerais. A lgebra booleana semelhante lgebra convencional que conhecemos no curso secundrio, o ramo da matemtica que estuda as relaes entre grandezas examinando as leis que regulam as operaes e processos formais independentemente dos valores das grandezas, representadas por letras ou smbolos abstratos. A particularidade da lgebra booleana que ela estuda relaes entre variveis lgicas que podem assumir apenas um dentre dois estados opostos, verdadeiro ou falso, no admitindo nenhum valor intermedirio. Da mesma forma que a lgebra convencional, a lgebra booleana utiliza operaes que so executadas com suas variveis. A diferena que estas operaes somente podem agir sobre variveis lgicas, portanto so operaes lgicas. As razes pelas quais a lgebra booleana a ferramenta ideal para analisar problemas de lgica digital tornam-se evidentes assim que se tomam conhecimento de suas operaes. Da mesma forma que h apenas quatro operaes fundamentais na aritmtica, h apenas trs operaes fundamentais na lgebra booleana. Estas operaes so AND, OR e NOT.

Proposies
uma sentena declarativa, afirmativa e que deve exprimir um pensamento de sentido completo, podendo ser escrita na forma simblica ou na linguagem usual. Ex: a) 5 > 7 b) O Mxico fica na Amrica do Norte. Dizemos que o valor lgico de uma proposio verdade se a proposio verdadeira; e falsidade se a proposio falsa. As proposies podem ser simples ou compostas. Proposio simples a que no contm nenhuma outra proposio como parte integrante de si mesma. Geralmente so indicadas por letras minsculas. Ex: a: Carlos careca. b: Corinthians o melhor time do planeta. A proposio composta formada por duas ou mais proposies relacionadas pelos conectivos E, OU, XOR, etc.., e geralmente so indicadas por letras maisculas. a: O Brasil lindo b: O Brasil o pas do futebol Ex: P = a E b ou O Brasil lindo E O Brasil o pas do futebol.

Em algumas partes desta apostila, as proposies podero tambm ser tratadas como variveis.

Operao AND (conjuno)


Operao AND pode ser aplicada a duas ou mais variveis (ou proposies) que podem assumir apenas os valores verdadeiro ou falso. A operao AND resulta verdadeiro se e apenas se os valores de ambas as variveis (ex A e B) assumirem o valor verdadeiro. Tabela Verdade AND (tambm conhecido por ^ E .) A B A AND B V V V V F F F V F F F F Onde V=verdadeiro e F=Falso e A e B so duas variveis.

Ex: Se houver sol e se for feriado eu vou praia. Na frase acima, existem 2 variveis, que so se houver sol e se for feriado. Para que o sujeito v praia, as duas situaes devem ocorrer, ou seja, devem ser verdadeiras (V). Observe que na frase h o operador AND (ou E). Varivel Se houver sol (A) V V F F Varivel Se for feriado (B) V F V F Resultado vou praia (A AND B) V F F F

Operao OR (disjuno inclusiva)


Operao OR tambm pode ser aplicada a duas ou mais variveis (que podem assumir apenas os valores

6
verdadeiro ou falso). A operao OR resulta verdadeiro se o valor de qualquer uma das variveis A ou B assumir o valor verdadeiro.

Tabela Verdade OR (tambm conhecido por v OU +) A B A OR B V V V V F V F V V F F F Onde V=verdadeiro e F=Falso e A e B so duas variveis.

Ex: Se houver sol ou se for feriado eu vou praia. Na frase acima, existem 2 variveis, que so se houver sol e se for feriado. Para que o sujeito v praia, pelo menos uma das duas situaes deve ocorrer, ou seja, deve ser verdadeira (V). Observe que na frase h o operador OR ( OU ).

Operao NOT (negao)


A operao NOT unria, ou seja, aplicvel a uma nica varivel. A operao NOT inverte o valor da varivel. Ela resulta verdadeiro se a varivel assume o valor falso e resulta falso se a varivel assume o valor verdadeiro. Pode ser representado tambm por ~. Ex: seja uma varivel A = Vou praia. NOT A = No vou praia. Se A = Verdadeiro, ento NOT A = Falso.

Operaes XOR, NAND e NOR


Destas trs operaes fundamentais podem ser derivadas mais trs operaes adicionais, as operaes NAND, NOR e XOR (ou OR exclusivo).

XOR (disjuno exclusiva) A operao, XOR ou OR exclusivo um caso particular da funo OR. Ela expressa por: A XOR B. A operao XOR resulta verdadeiro se e apenas se exclusivamente uma das variveis A ou B assumir o valor verdadeiro (uma outra forma, talvez mais simples, de exprimir a mesma idia : a operao XOR resulta verdadeiro quando os valores da variveis A e B forem diferentes entre si e resulta falso quando forem iguais). Tabela Verdade XOR A B A XOR B V V F V F V F V V F F F Onde V=verdadeiro e F=Falso e A e B so duas variveis.

Ex: Para voc chegar sada, voc deve escolher entre o caminho direita ou o caminho esquerda.

7
Na frase acima, existem 2 variveis, que so caminho direita e caminho esquerda. Para chegar sada, apenas uma das variveis deve ser verdadeira. Se ambas forem verdadeiras ou se ambas forem falsas, o resultado final ser falso. NAND A operao NAND obtida a partir da combinao das operaes NOT e AND usando a relao: A NAND B = NOT (A AND B). A operao NAND resulta falso se e apenas se os valores de ambas as variveis A e B assumirem o valor verdadeiro. NOR A operao NOR obtida a partir da combinao das operaes NOT e OR usando a relao: A NOR B = NOT (A OR B). A operao NOR resulta verdadeiro se e apenas se os valores de ambas as variveis A e B assumirem o valor falso.

Expresses Algbricas As regras bsicas da lgebra booleana so simples. As operaes so apenas seis (NOT, AND, OR, NAND, NOR E XOR). Os valores possveis, tanto para as variveis quanto para as expresses, so apenas dois (V ou F). No entanto, expresses obtidas combinando operaes que envolvem um grande nmero de variveis podem atingir um grau de complexidade notvel. No obstante, sua avaliao sempre feita decompondose a expresso em operaes elementares respeitando-se a ordem de precedncia indicada pelos parnteses, avaliando as operaes elementares e combinando-se seu resultado. A avaliao pode ser trabalhosa, mas no difcil. Ex: Sendo A e B duas variveis que possuem respectivamente os valores V e F, calcule as expresses abaixo: Lembrando que: A^B V^F F ^= E v = OU (A ^ B ) v B ( V ^ F) v F F v F F ~ = NOT ~( (B v A) ^ A) ~( (F v V) ^ V) ~( V ^ V) ~V F

Exerccios: Sejam P e Q e R variveis cujos valores so respectivamente V, V e F, calcule as expresses abaixo:

a) b) c) d) e) f)

(P ^ Q) ^ ~R ~(Q ^ Q) v ~(P v R) P ^ ~( ( Q v ~P) ^ (R XOR ~P) ) (Q XOR R ) ^ ~( R v Q) (R v ~R) ^ ~( ~(R XOR P) ^ ~Q) ~(P ^Q) v (~P XOR Q) ^ (R v ~Q)

O Conceito de Algoritmo
Em nosso dia-a-dia executamos mecanicamente uma srie de aes que so seguidas seqencialmente e que provocam o acontecimento de algo. Por exemplo, temos um trajeto freqente ao sairmos diariamente de casa em direo ao nosso trabalho ou nossa universidade que, sempre que seguido, nos leva ao nosso destino. Isso um algoritmo. Em outras palavras, um algoritmo descreve eventos com durao finita, que envolvem um conjunto de objetos cujas caractersticas podem ser alteradas, atravs de aes que ocorrem seqencialmente.

O que um algoritmo?
"Programar construir algoritmos" "Programa = Algoritmo + Estruturas de Dados" "No processo de construo de programas a formulao do algoritmo e a definio das estruturas de dados esto intimamente ligadas" Num algoritmo podem-se observar os seguintes aspectos: Ao: evento que ocorre num perodo de tempo finito Estado: propriedades de um objeto numa dada situao Processo: seqncia temporal de aes Padro de comportamento: toda vez que seguido, um evento ocorre

Exemplo de um algoritmo: Algoritmo para fazer " batatas fritas para o jantar "
"Traga a cesta com batatas da despensa" ; "Traga a panela do armrio"; Coloque leo na panela; Se "a roupa clara ento "coloque o avental"; Enquanto "n de batatas insuficiente para o nmero de pessoas" "descasque as batatas"; Pique as batatas; Esquente o leo da panela; "Frite as batatas na panela"; Escorra o excesso de leo das batatas fritas; "Coloque as batatas fritas numa vasilha com papel absorvente". faa

Apesar de muito simples, algumas observaes importantes podem ser notadas neste algoritmo: tempo verbal est na forma imperativa (faa, traga, frite, etc); H um seqenciamento das aes, que esto separadas por um ponto-e-vrgula ;; avental no usado toda vez: existe um motivo para coloc-lo, ou seja, h uma condio para que o avental seja colocado; nmero de batatas descascadas varia; a ao de descascar uma batata repete-se at que a condio de parada (ser suficiente para alimentar as pessoas que iro jantar) seja alcanada;

A ordem das aes importante: primeiro descasca-se a batata, pica-se a batata, para depois fritla...

Exemplos de algoritmos conhecidos:

- Qual o algoritmo que voc descreve para vir estudar? - Qual o algoritmo para se fazer uma feijoada?
Apesar de receitas culinrias e trajetos rotineiramente percorridos encaixarem-se perfeitamente no conceito inicial de algoritmo, no nosso curso estamos interessados num tipo de algoritmo especial, que seja capaz de ser executado por um computador. Para tanto, necessrio que identifiquemos problemas do mundo real que possam ser traduzidos em aes primitivas finitas e dos quais se possa extrair um

padro

de comportamento.
Qual o padro de comportamento utilizado para gerar as seqncias?

1, 5, 9, 13, 17, 21, 25 ... 1, 1, 2, 3, 5, 8, 13, 21, 34 ...


Os dois exemplos anteriores so problemas do mundo real que, por serem finitos (ou para os quais se possa determinar uma condio de parada) e por possurem um padro de comportamento, podem ser resolvidos atravs de um programa de computador. No entanto, antes de se chegar ao programa de computador, o 1 passo fazer um Definio de algoritmo:

algoritmo que seja capaz de solucionar o problema em questo....

Um algoritmo a descrio de um padro de comportamento, expresso em termos de um repertrio bem definido e finito de aes primitivas que podem ser executadas
Num algoritmo distinguem-se claramente dois aspectos:

Aspecto esttico: texto - Aspecto dinmico: sua execuo

(a partir de valores iniciais)

O curso de Algoritmos , na realidade, um curso de Programao de Computadores para alunos que iniciam cursos superiores na rea de Informtica. Para comearmos a construir algoritmos e fazermos nossos primeiros programas de computador, necessrio que o aluno domine uma srie de conceitos bsicos, que so apresentados a seguir, a comear pelo prprio computador!

Conceitos Bsicos da Programao de Computadores Computador: uma mquina capaz de seguir uma espcie de
algoritmo chamado programa que est escrito em linguagem de mquina.

Linguagem de mquina: internamente o computador executa uma srie de instrues que ficam armazenadas em sua memria principal em cdigo binrio, ou seja, em linguagem de mquina (zeros (0) e uns (1) que so os dgitos binrios ou bits).
Linguagem de alto nvel: para escrever os programas de computador, os programadores utilizam linguagens que esto mais prximas da linguagem humana, que so chamadas de linguagens de alto nvel ou simplesmente linguagens de programao. Exemplos de linguagens de alto nvel so Pascal, C, C++, Basic, Fortran, dentre muitas outras.

10 Linguagem de montagem: h programas de computador que precisam interferir diretamente no


hardware da mquina para permitir a execuo de funes especficas como as oferecidas por sistemas
operacionais, por exemplo. Neste caso, os programadores utilizam as linguagens de montagem ou linguagens assembly, que esto muito prximas da linguagem de mquina e mais distantes das linguagens de programao, sendo por isso chamadas de linguagem de baixo nvel. A figura abaixo mostra a relao entre as linguagens discutidas anteriormente. Numa ponta est a linguagem de mquina e no outro extremo esto as linguagens humanas. Quanto mais prxima da linguagem de mquina, mais de baixo nvel a linguagem; em contrapartida, quanto mais prxima das linguagens humanas, mais alto nvel. As linguagens de programao fazem uma espcie de ponte entre a linguagem binria ou linguagem que o computador entende e a linguagem que ns humanos utilizamos.

Relao entre linguagens de baixo e de alto nvel Compilador: permite que os programadores utilizem linguagens de alto nvel para escrever os programas de computador, pois se encarrega de traduzi-los para linguagem de mquina. O compilador um programa que traduz uma determinada linguagem de programao para linguagem de mquina. Desta forma, existem diversos compiladores especficos para cada uma das linguagens de programao e especficos para cada sistema operacional, conforme ilustra a figura abaixo. Um compilador C para o sistema Windows 98 (compilador X) diferente de um compilador C para o sistema Unix (compilador Y), embora a linguagem de programao seja a mesma (linguagem de alto nvel). O compilador de linguagem de montagem chamado de assembler.

Programa escrito em linguagem de alto nvel

Compilador X

Compilador Y

Compilador Z

Programa em Linguagem de Mquina para o Computador X

Programa em Linguagem de Mquina para o Computador Y

Programa em Linguagem de Mquina para o Computador Z

Os compiladores so especficos para cada linguagem e para cada sistema operacional

11
O ciclo completo da elaborao do algoritmo execuo de um programa de computador pode ser visto na figura abaixo. Cada um dos componentes deste ciclo explicado a seguir.

algoritmo

editor

cdigo fonte

compilador

cdigo objeto

arquivos de biblioteca

linker

executvel

Do algoritmo execuo de um programa de computador Algoritmo: estrutura do programa; instrues que descrevem a lgica do programa Editor de texto: permite que o cdigo fonte do programa seja editado em um arquivo-fonte. Alguns
compiladores tm editores com ambiente de programao integrados, como o caso do Turbo Pascal e do Turbo C.

Cdigo fonte: conjunto de comandos escritos na linguagem de programao escolhida (como Pascal ou C). O cdigo fonte fica armazenado no arquivo-fonte em formato ASCII. (O arquivo-fonte possui a extenso
relativa linguagem de programao usada, por exemplo,

.pas (Pascal), .c (C), .cpp (C++)).

Compilador: l o cdigo fonte do programa e cria um outro arquivo em linguagem binria ou de


mquina.

Cdigo objeto: arquivo com o programa em linguagem de mquina (o arquivo-objeto possui a extenso

.obj para a maioria das linguagens de programao).


Arquivos de biblioteca: contm funes j compiladas que podem ser utilizadas no programa. Linker: cria um programa executvel a partir de arquivos-objeto e dos arquivos de biblioteca. Cdigo executvel: programa que pode ser executado no computador (o arquivo-executvel possui a
extenso

.exe).

12

Linguagens Compiladas, Linguagens Interpretadas e Modelo Hbrido


Fonte: http://rcs.comp.googlepages.com/POO-Capitulo02-ParadigmasdeProgramao.pdf

Linguagens de programao so comumente divididas em linguagens interpretadas e compiladas. J existem algumas de nova gerao com conceito hbrido.

Interpretadas
Como o prprio nome diz, so interpretadas linha a linha em tempo de execuo. Nessa categoria normalmente o cdigo armazenado como texto puro sendo transformado em instrues apenas quando so executados, dessa forma, os cdigos so expostos a possveis indivduos mal-intencionados. Tm-se como exemplos de linguagens interpretadas: Perl, ASP (Active ServerPages), JavaScript, PHP e Basic.

Esquema da execuo de um cdigo fonte PHP. O cdigo passa pelo interpretador e enviado aos browsers escritos para os dois Sistemas Operacionais (Windows e Linux)

Compiladas
O compilador traduz o programa fonte apenas uma vez para linguagem compilada (executvel) no importando quantas vezes o programa ir ser executado. No processo de compilao, o cdigo fonte submetido anlise sinttica, lxica e semntica. Caso algum erro seja encontrado, o arquivo executvel no gerado, e os erros so apontados pelo compilador. Muitos erros so eliminados durante o processo de compilao como, por exemplo, os seguintes erros sintticos: Caracteres invlidos; Nomes de variveis, mtodos e classes invlidas; Seqncia de comandos invlidos. Alm de erros semnticos, incluindo: Tipos e quantidade de parmetros, retorno de funes etc; Atribuio de um valor alfanumrico para uma varivel inteira. Por outro lado, erros lgicos no so capturados no processo de compilao, gerando algum tipo de erro apenas ao ser executado, como por exemplo: Diviso por zero, operadores logicamente errados, etc; Como exemplos dessa categoria de linguagens tm-se o Pascal e C/C++.

13

Esquema de criao de um programa em C++. O mesmo cdigo-fonte passa por dois compiladores (um para Windows e outro para Linux) e d origem a dois tipos de executveis um para cada Sistema Operacional

Hbridas
As plataformas que implantam o conceito hbrido tm como objetivo a segurana das verificaes existentes em um processo de compilao e a portabilidade dos ambientes interpretados. O processo adotado para implementao do modelo hbrido baseia-se na utilizao de uma representao intermediria denominada bytecode, que gerada pelo compilador e interpretada no momento da execuo. A plataforma Java utiliza essa abordagem, contendo os seguintes passos em seu processo de desenvolvimento. Arquivos com os cdigos-fonte so armazenados como texto simples (.java); Aps a compilao dos fontes (.java), so gerados os bytecodes (.c1ass); Os bytecodes (.class) so utilizados para executar a aplicao, sendo interpretados pela Mquina Virtual Java (JVM). Outros ambientes tambm adotam essa codificao intermediria por meio de bytecodes, como o caso do Microsoft.NET.

14
Esquema de criao de um programa escrito em Java. O Cdigo-Fonte passa pelo compilador e d origem a um nico Byte Code. Este Byte Code interpretado pelas Mquinas Virtuais Java (VMs) instaladas em cada um dos trs tipos de Sistema Operacional Windows, Linux e Celular. Cada VM foi escrita exclusivamente para aquele Sistema Operacional em particular.

O Conceito de Programao Estruturada


Para conseguirmos construir programas de computador, necessrio cumprir as 5 etapas bsicas da programao, das quais a confeco do algoritmo extremamente importante. As 5 etapas da programao de computadores so: 1. Identificao de um problema do mundo real 2. Confeco do algoritmo 3. Teste do algoritmo 4. Confeco do programa de computador 5. Execuo do programa no computador Para realizarmos este ciclo de etapas com sucesso, quer dizer, para conseguirmos fazer programas de computador com qualidade e confiveis, muito importante a utilizao de tcnicas programao como a programao estruturada. A programao estruturada uma metodologia de projeto e desenvolvimento, que pretende: - facilitar a escrita; - facilitar o entendimento; - permitir a verificao; - facilitar a alterao e a manuteno dos programas de computador O principal objetivo da metodologia de programao estruturada reduzir a complexidade dos problemas.

"A arte de programar consiste na arte de organizar e dominar a complexidade. A metodologia de programao estruturada, quando utilizada, induz o programador a produzir programas:
confiveis de fcil manutenibilidade flexveis documentados legveis

Exemplo de Programa Estruturado Programa 1 (no estruturado) read idade Programa 2 (estruturado) leia(IDADE); se IDADE > 17 //pessoa tem mais de 17 anos ento imprima (Voc um adulto) seno se IDADE > 12 //pessoa tem entre 13 e 17 anos ento imprima (Voc um adolescente) seno se IDADE > 8 //pessoa entre 9 e 12 an ento imprima (Voc pr-adolescente)

if (idade > 17) goto 3


if (idade > 12) goto 2 if (idade > 8) goto 1 print Voc uma criana goto 4 print Voc pr-adolescente

1 2 3 4

goto 4
print Voc um adolescente goto 4 print Voc um adulto continue

seno imprima (Voc uma criana);

- Os dois programas fazem a mesma coisa. Tente entender o que eles fazem. Qual dos dois programas o ajudou mais a entender a sua lgica?

15
- Com certeza o programa 2 facilitou muito mais o seu entendimento... E o motivo principal que o programa 2 um programa estruturado e o programa 1 no estruturado. Veja as principais diferenas entre eles: Programa no estruturado - uso excessivo de gotos Programa estruturado - no usa gotos

(goto um comando de desvio incondicional, e seu uso muito indesejvel pois quebra o fluxo de execuo seqencial das instrues do programa)
difcil de entender ilegvel difcil de testar fluxo de controle no seqencial no usa comentrios fcil de entender legvel de fcil teste fluxo de controle seqencial usa comentrios

(faa alguns testes com idades diferentes e veja qual dos dois programas mais fcil de ser testado...)

(os comentrios no fazem parte do cdigo, mas facilitam o seu entendimento e contribuem para a documentao do cdigo implementado)

Resposta dos Exerccios


Qual o padro de comportamento utilizado para gerar as seqncias? 1, 5, 9, 13, 17, 21, 25 ... A srie de nmeros comea com 1 (primeiro termo) Para se gerar o segundo termo soma-se 4 ao primeiro nmero Para se gerar qualquer um dos outros termos da srie, basta somar 4 ao nmero imediatamente anterior Esta uma srie infinita. Seu fim deve ser determinado por uma condio do tipo gerar os 10 primeiros termos da srie ou gerar todos os termos da srie menores que 100

1, 1, 2, 3, 5, 8, 13, 21, 34 ...

A srie de nmeros comea com 1 (primeiro termo) O segundo termo tambm 1 Para se gerar qualquer um dos outros termos da srie, basta somar os dois termos imediatamente anteriores Exemplos: 1 (primeiro termo) + 1 (segundo termo) =2 (terceiro termo) 1 (segundo termo) + 2 (terceiro termo) = 3 (quarto termo) 2 (terceiro termo) + 3 (quarto termo) = 5 (quinto termo) Esta uma srie infinita, conhecida como srie de Fibonacci. Seu fim deve ser determinado por uma condio do tipo gerar os 10 primeiros termos da srie ou gerar todos os termos da srie menores que 100.

16

Expresso de Algoritmos o
Os algoritmos podem ser expressos atravs de diagramas, atravs de pseudo-linguagens ou atravs da prpria linguagem de programao. Vamos examinar cada uma destas trs opes e, no final deste captulo, vamos optar por uma delas para que possamos comear a fazer nossos primeiros algoritmos!

Expresso de Algoritmos atravs de Diagramas e Fluxogramas


A utilizao de diagramas para a expresso de algoritmos foi bastante utilizada at a dcada de 1980. Diagramas de Chapin e fluxogramas foram os principais mtodos utilizados, ento. Nos mtodos baseados em diagramas, uma grande variedade de formas geomtricas como quadrados, retngulos, hexgonos, pentgonos, etc., so utilizadas para representar as instrues de leitura e impresso de dados, assim como os comandos condicionais, de repetio, etc. Alm disso, uma srie de regras para a disposio dessas formas e/ou setas para representar o seqenciamento das instrues fazem parte desses mtodos. Apesar de terem sido utilizados largamente pelas primeiras geraes de programadores, estes mtodos apresentam uma srie de inconvenincias como: O programador tem que memorizar todas as formas geomtricas e conhecer as regras de interrelacionamento entre elas; O programador perde um tempo considervel para fazer e refazer desenhos, tendo que possuir diversas rguas com os smbolos dos diagramas; Para algoritmos muito grandes, os desenhos comeam a ocupar muitas pginas, tornando impraticvel a visualizao de toda a soluo; A memorizao de regras de expresso desvia a ateno do programador que no tem apenas de se concentrar na lgica do problema, como seria desejvel, mas tem as preocupaes adicionais de elaborar desenhos e consultar regras e regras... Alm de todos os inconvenientes citados, que de longe esgotam os seus problemas, os mtodos baseados em diagramas se distanciam muito do alvo da programao que a expresso da lgica algortmica na prpria linguagem de programao! Alm disso, esses mtodos no so nem um pouco intuitivos... veja a figura abaixo e tente descobrir o que o programa faz... sem muito esforo, se for possvel:

Algoritmo expresso atravs de um diagrama de Chapin (desenvolvido por Nassi Shneiderman e ampliado por Ned Chapin) tambm conhecido como diagrama N-S.

17 Exemplo de um Fluxograma A figura abaixo mostra um exemplo de um algoritmo expresso atravs de um fluxograma. Observe a existncia de diferentes formas geomtricas para as diferentes instrues e o uso de setas para representar o fluxo dos dados. Voc seria capaz de dizer o que este algoritmo faz? Quais as variveis que ele utiliza e de que tipo bsico elas so? (Dica: este algoritmo faz a mesma coisa que o expresso pelo diagrama de Chapin mostrado na figura anterior).

Menor

Algoritmo expresso atravs de um Fluxograma

18 Alguns smbolos utilizados em diagramas de bloco e fluxogramas:

Terminal: Indica o incio e o fim do diagrama. Terminal: idem acima.

Seta: Indica o sentido do fluxo.

Processamento: Indica algum tipo de clculo/processamento.

Teclado: utilizado para informar dados ao computador.

Teclado: idem acima.

Vdeo: utilizado para exibir algo no vdeo.

Vdeo: idem acima.

Deciso: utilizado para indicar uma deciso a ser tomada, indicando os desvios.

Conector: utilizado quando preciso particionar o diagrama. Quando ocorrer mais de uma partio, colocada uma letra ou nmero para dentro do smbolo de conexo para identificar os pares de ligao.

Conector: especfico para indicar conexo do fluxo em outra pgina.

Expresso de Algoritmos atravs de Pseudo-linguagem


Uma pseudo-linguagem uma notao para expresso de algoritmos para ser utilizada nas 3 primeiras etapas da programao: identificao de um problema do mundo real, confeco e teste do algoritmo. apresentada na forma de portugus estruturado. Embora seja uma pseudo-linguagem, possui estrutura, sintaxe e semntica semelhantes s de uma linguagem de programao. A principal diferena entre a pseudo-linguagem e a linguagem de programao que a primeira no possui um compilador. Isso significa que possvel expressar o raciocnio algortmico utilizando-se uma pseudo-linguagem, mas o programa no pode ser executado no computador.

19
So muitas as vantagens de se utilizar uma pseudo-linguagem para escrever algoritmos: uma linguagem independente de mquina; o programador pensa somente no problema a ser resolvido sem se preocupar com possveis restries do compilador ou do hardware (computador); O programador tem que conhecer a sintaxe, a semntica e a estrutura da pseudo-linguagem, mas tem total liberdade para criar novos comandos ou usar instrues em alto nvel (ou em forma de frases): por um lado ele vai se acostumando com a rigidez da sintaxe das linguagens de programao, mas por outro lado, tem a liberdade de expressar seu raciocnio sem esbarrar em limitaes de contexto; Uma vez estando pronto o algoritmo na pseudo-linguagem, a sua implementao no computador (etapas 4 e 5 da programao: confeco e execuo do programa) fica muito facilitada, pois toda a lgica j foi desenvolvida e testada e somente uma traduo para a linguagem de programao-alvo se faz necessria. Veja o exemplo de um algoritmo escrito na pseudo-linguagem PortuC:

/* Este programa seleciona o menor nmero em uma seqncia de nmeros inteiros */ int valor, menor;

principal( ) { imprima (Fornea um nmero inteiro: ); leia (%i, &valor); menor = valor; enquanto (valor != -1) { se (valor < menor) menor = valor; imprima (Fornea um nmero inteiro(1 para terminar): leia (%i, &valor); } imprima(O menor valor lido foi: %i , menor); }

);

Algoritmo expresso na pseudo-linguagem de PortuC


A acima mostra um algoritmo expresso na pseudo-linguagem PortuC. Observe a estrutura do algoritmo: comea com um comentrio dizendo o que o algoritmo faz, tem a declarao das variveis e depois vem a seo principal ( ) em que so apresentadas as instrues contidas entre o { (incio) e } (fim) do algoritmo. Voc seria capaz de dizer o que este algoritmo faz? Quais as variveis que ele utiliza e de que tipo bsico elas so? (Dica: este algoritmo faz a mesma coisa que o expresso nas figuras anteriores). Um exerccio interessante para voc fazer agora, seria visitar os exemplos deste algoritmo escritos no diagrama de Chapin e no fluxograma e compar-los com o PortuC... Diga-me qual deles mais fcil de entender? Qual dessas formas de expresso de algoritmos voc escolheria?

Expresso de Algoritmos atravs de Linguagem de Programao


Expressar um algoritmo atravs de uma linguagem de programao o objetivo, a meta do programador, com certeza. Uma linguagem de programao permite, alm da expresso do raciocnio algortmico, a sua execuo no computador (por causa do compilador, com j aprendemos). Existem diversas linguagens de programao. Cada uma pode ser mais adequada resoluo de problemas especficos, e recebem alguns rtulos por isso, como linguagens para aplicaes cientficas, linguagens para desenvolvimento de software bsico, linguagens para utilizao intensiva de recursos grficos, para manipulao de bancos de dados, programao para

20 Internet, etc, etc. H tambm as linguagens para o ensino de programao! Veja a figura a seguir. um cdigo escrito em Pascal.
PROGRAM MenorValor; {Este programa seleciona o menor nmero em uma seqncia de nmeros inteiros} VAR BEGIN WRITE(Fornea um nmero inteiro: ); READLN(Valor); Menor := Valor; WHILE Valor <> -1 DO BEGIN IF Valor < Menor THEN Menor := Valor; WRITE(Fornea um nmero inteiro (flag=-1): ); READLN(Valor); END; {while} WRITELN(O menor valor lido foi: , Menor); END. Valor, Menor: INTEGER;

Algoritmo expresso na Linguagem de Programao Pascal A figura acima mostra um algoritmo expresso na linguagem de programao Pascal, ou seja, j um programa de computador. Observe a estrutura do programa: comea com PROGRAM, depois tem a seo VAR na qual as variveis so declaradas e depois vm as instrues contidas entre o BEGIN (incio) e o END. (fim.). Voc seria capaz de dizer o que este algoritmo faz? Quais as variveis que ele utiliza e de que tipo bsico elas so? (Dica: este programa faz a mesma coisa que os exemplos anteriores). Agora observe o exemplo de um programa escrito na linguagem de programao C.

/* Este programa seleciona o menor nmero em uma seqncia de nmeros inteiros */ #include <stdio.h> int valor, menor;

void main (void) { printf (\n Fornea um nmero inteiro: ); scanf (%i, &valor); menor = valor; while (valor != -1) { if (valor < menor) menor = valor; printf(\nFornea um nmero inteiro (1 para terminar): scanf (%i, &valor); } printf (O menor valor lido foi: %i , menor); }

);

Algoritmo expresso na Linguagem de Programao C

21
A figura acima mostra um algoritmo expresso na linguagem de programao C, ou seja, tambm um programa de computador. Observe a estrutura do programa: comea com um comentrio, depois tem a incluso de uma biblioteca de funes, depois a declarao das variveis e em seguida vem a seo main na qual as instrues do programa esto contidas entre o { (incio) e o } (fim). Voc seria capaz de dizer o que este algoritmo faz? Quais as variveis que ele utiliza e de que tipo bsico elas so? (Dica: este programa faz a mesma coisa que o expresso pelo diagrama de Chapin, pelo fluxograma e pelo programa Pascal mostrados anteriormente). O programa traz um comentrio dizendo explicitamente o que ele faz. Portanto, garanto que voc conseguiu responder primeira pergunta. Com relao s variveis que o programa utiliza e seu tipo bsico, observe a declarao int valor, menor; no programa. H duas variveis ali declaradas: valor e menor... o tipo bsico int ... um pouquinho de imaginao e int = inteiro! Que tal voc comparar o cdigo C com o cdigo Pascal? Semelhanas? Qual dos dois lhe pareceu mais fcil de entender? Bem, se sua resposta foi o cdigo Pascal, digo-lhe que o Pascal tem o "rtulo" de linguagem mais adequada ao ensino de programao... Se sua resposta foi o cdigo C, saiba que uma linguagem que foi criada para ser utilizada por programadores experientes... Mas... se voc teve dificuldade de entender ambos os cdigos, no se preocupe! O curso est apenas comeando e h muito que se aprender de lgica de programao! Garanto que no final do curso este programa vai parecer muito, muito fcil para voc! Apesar do Pascal ter se consagrado como uma linguagem adequada para o ensino da programao aos estudantes que a iniciam, ou seja, como primeira linguagem de programao, a linguagem C, antes restrita comunidade cientfica, ganhou uma popularidade inquestionvel na dcada de 1990, que se estende aos dias atuais, pois a base de novas linguagens e paradigmas. Em funo disto, a linguagem C passou a ser alvo do interesse dos estudantes. A resistncia em utiliz-la como primeira linguagem de programao pelos professores se deveu, em parte, ao fato de seus criadores, Dennis Ritchie e Brian Kernighan, terem afirmado que C retm a filosofia bsica de que os programadores sabem o que esto fazendo1. Bem, se considerarmos que programadores iniciantes no tm condies de saber com segurana o que esto fazendo, exatamente pelo fato de serem inexperientes, a adoo da linguagem seria realmente questionvel. No entanto, a utilizao da Informtica evoluiu de tal forma que j no ensino mdio, em muitas escolas brasileiras, so ensinadas aos estudantes noes bsicas de programao. Alm disso, a adoo de um mtodo adequado e coerente para o ensino da programao de computadores pode atuar como um facilitador do processo de aprendizagem, permitindo que uma linguagem mais complexa, como o C, possa ser ensinada sem oferecer obstculos aprendizagem.

22

Programao em C#
O que .NET
.NET uma plataforma de software que conecta informaes, sistemas, pessoas e dispositivos. A plataforma .NET conecta uma grande variedade de tecnologias de uso pessoal,de negcios, de telefonia celular a servidores corporativos, permitindo assim, o acesso rpido a informaes importantes onde elas forem necessrias e imprescindveis. Desenvolvido sobre os padres de Web Services XML, o .NET possibilita que sistemas e aplicativos, novos ou j existentes, conectem seus dados e transaes independente do sistema operacional(SO) instalado, do tipo de computador ou dispositivo mvel que seja utilizado e da linguagem de programao que tenha sido utilizada na sua criao. O .NET um "ingrediente" sempre presente em toda a linha de produtos da Microsoft, oferecendo a capacidade de desenvolver, implementar, gerenciar e usar solues conectadas atravs de Web Services XML, de maneira rpida, barata e segura. Essas solues permitem uma integrao mais gil entre os negcios e o acesso rpido a informaes a qualquer hora, em qualquer lugar e em qualquer dispositivo.

A Arquitetura .NET
Vamos falar um pouco da arquitetura de .NET e os seus principais componentes.

CLR (Commom Language Runtime)


O CLR, ou tempo de execuo compartilhado, o ambiente de execuo das aplicaes .NET. Como o leitor j deve ter atentado, as aplicaes .NET no so aplicaes Win32 propriamente ditas (apesar de executarem no ambiente Windows), razo pela qual o runtime Win32 no sabe como execut-las. O Win32, ao identificar uma aplicao .NET, dispara o runtime .NET que, a partir desse momento, assume o controle da aplicao no sentido mais amplo da palavra, porque, dentre outras coisas, ele quem vai cuidar do gerenciamento da memria via um mecanismo de gerenciamento de memria chamado Garbage Collector (GC) ou coletor de lixo, acerca do qual falaremos mais tarde. Esse gerenciamento da memria torna os programas menos susceptveis a erros. Mais ainda, o CLR como seu prprio nome o diz, compartilhado e, portanto, no temos um runtime para VB.NET, outro para C# etc. o mesmo para todo mundo.

CTS (Common Type System)


OCTS, ou Sistema Comum de Tipos, que tambm faz parte do CLR, define os tipos suportados por .NET e as suas caractersticas. Cada linguagem que suporta .NET tem de, necessariamente, suportar esses tipos. Apesar de que a especificao no demanda que todos os tipos definidos no CTS sejam suportados pela linguagem, esses tipos podem ser um subconjunto do CTS, ou ainda um superconjunto. Um conjunto de classes bsicas que define todos os tipos implementado na CTS. Por exemplo: um tipo Enum deve derivar da classe System.Enum e todas as linguagens devem implementar o tipo Enum dessa forma. Todo tipo deriva da classe Object, porque em .NET tudo um objeto e, portanto, todos os tipos devem ter como raiz essa classe. E dessa forma que os diversos tipos nas diversas linguagens so implementados, obedecendo s regras definidas no CTS. Na .NET, e em C# conseqentemente, todos os tipos derivam de uma raiz comum: a classe Object, o que equivale a dizer que todos os tipos so objetos, por definio.

CLS (Common Language Specification)


O CLS, ou Especificao Comum da Linguagem, um subconjunto do CTS, e define um conjunto de regras que qualquer linguagem que implemente a .NET deve seguir a fim de que o cdigo gerado resultante da compilao de qualquer pea de software escrita na referida linguagem seja perfeitamente entendido pelo

23
runtime .NET. Seguir essas regras um imperativo porque, caso contrrio, um dos grandes ganhos do .NET, que a independncia da linguagem de programao e a sua interoperabilidade, fica comprometido. A grosso modo, dizer que uma linguagem compatvel com o CLS significa dizer que mesmo quando esta sintaticamente diferente de qualquer outra que implemente .NET, semanticamente ela igual, porque na hora da compilao ser gerado um cdigo intermedirio (e no cdigo assembly dependente da arquitetura do processador) equivalente para duas peas de cdigo iguais, porm escritas em linguagens diferentes. importante entender esse conceito para no pensar que o cdigo desenvolvido em C# no pode interagir com cdigo desenvolvido em VB ou outras linguagens, porque mesmo estas sendo diferentes, todas so compatveis com o CLS.

BCL (Base Classe Library)


Como era de se esperar, uma plataforma que promete facilitar o desenvolvimento de sistemas precisa ter uma biblioteca de classes bsica que alavanque a simplicidade e a rapidez no desenvolvimento de sistemas. este o objetivo da BCL (Biblioteca de Classes Base), oferecer ao desenvolvedor uma biblioteca consistente de componentes de software reutilizveis que no apenas facilitem, mas tambm que acelerem o desenvolvimento de sistemas. Na BCL encontramos classes que contemplam desde um novo sistema de janelas a bibliotecas de entrada/sada, grficos, sockets, gerenciamento da memria etc. Esta biblioteca de classes organizada hierarquicamente em uma estrutura conhecida como namespace. Ao desenvolver um componente de software reusvel, este precisa ser estruturado em um namespace para que possa ser usado a partir de um outro programa externo. A seguir mostramos uma tabela com alguns dos principais namespaces que fazem parte da BCL:

24

Tabela com alguns dos principais namespaces que fazem parte da BCL.

Compilando programas .NET: introduzindo a linguagem intermediria MSIL (Microsoft Intermediate Language)
A MSIL ou simplesmente IL a linguagem intermediria para qual interpretado qualquer programa .NET, independente da linguagem em que este for escrito. Essa traduo feita para cdigo intermedirio (como em JAVA com os byte codes) sintaticamente expresso na IL. Por sua vez, qualquer linguagem .NET compatvel, na hora da compilao, gerar cdigo IL e no cdigo assembly especfico da arquitetura do processador onde a compilao do programa efetuada, conforme aconteceria em C++ ou Delphi, por exemplo. E por que isso? Isso acontece para garantir duas coisas: a independncia da linguagem e a independncia da plataforma (arquitetura do processador). A MSIL a linguagem intermediria para qual interpretado qualquer programa .NET na hora da compilao, independente da linguagem em que este for escrito. Pelo dito acima, podemos afirmar que .NET, apesar de inicialmente estar sendo desenhada para a plataforma Microsoft, uma arquitetura portvel tanto em termos de linguagem de programao quanto no nvel da arquitetura do processador, dado que o cdigo gerado pode ser interpretado para a linguagem assembly da plataforma host na hora da execuo, sem necessidade de recompilao de cdigo-fonte.

Compilao JIT (Just In Time)


Um compilador JIT, tambm conhecido como JITTER, converte instrues IL para instrues especficas da arquitetura do processador onde a aplicao .NET est sendo executada. Na plataforma .NET existem trs diferentes tipos de JITTER: Pr-JIT: Compila de uma s vez todo o cdigo da aplicao .NET que est sendo executada e o armazena no cache para uso posterior. Econo-JIT: Este tipo de compilador usado em dispositivos como handhelds onde a memria um recurso precioso. Sendo assim, o cdigo compilado sob demanda, e a memria alocada que no est em uso liberada quando o dispositivo assim o requer. Normal-JIT: O Normal-JIT compila o cdigo sob demanda e coloca o cdigo resultante no cache, de forma que esse cdigo no precise ser recompilado quando houver uma nova invocao do mesmo mtodo.

25 VES (Virtual Execution System)


O processo de compilao acontece num ambiente chamado de Sistema de Execuo Virtual (VES), e aqui onde o JITTER ativado quando uma aplicao .NET chamada. O JITTER ativado a partir do runtime do Win32, passando o controle para o runtime .NET; aps isso, a compilao do PE efetuada e s ento o cdigo assembly prprio da arquitetura do processador gerado para que a aplicao possa ser executada. O diagrama a seguir ilustra todo o processo de execuo de uma aplicao, desde a gerao das instrues IL em tempo de compilao, at a gerao do cdigo assembly especfico da plataforma de execuo.

Processo de execuo de uma aplicao.

Gerenciamento da memria: introduzindo o GC (Garbage Collector)


O gerenciamento da memria efetuado pelo runtime, permitindo que o desenvolvedor se concentre na resoluo do seu problema especfico. O que diz respeito ao sistema operacional, como o gerenciamento da memria, feito pelo runtime. Como isso efetuado? medida que uma rea de memria necessria para alocar um objeto, o GC ou coletor de lixo (Garbage Collector) realizar essa tarefa, assim como a liberao de espaos de memria que no estiverem mais em uso. Para os que no trabalham com linguagens de programao como C ou C++, que permitem o acesso direto memria heap via ponteiros, essa uma das maiores dores de cabea que os programadores sofrem, ora por fazer referncia a espaos de memria que no foram alocados, ora porque estes espaos j foram

26
liberados anteriormente; exatamente esse tipo de erro que o coletor de lixo nos ajuda a evitar. O gerenciamento da memria, quando efetuado diretamente pelo programador, torna os programas mais eficientes em termos de desempenho, mas ao mesmo tempo o penaliza, obrigando-o a alocar e desalocar memria quando assim requerido. A .NET permite que o programador faa esse gerenciamento tambm, o que chamado de unsafe code (cdigo inseguro); entretanto, por default, o GC o encarregado dessa tarefa, e o contrrio no recomendado.

Linguagens que suportam .NET


Dentre as linguagens que suportam .NET podemos citar: C# ( claro!) C++ Visual Basic Jscript Cobol Small Talk Perl Pascal Phyton Oberon APL Haskell Mercury Scheme CAML OZ

Conforme descrito acima, todas essas linguagens tm de aderir s especificaes CLS e CTS para poderem ser compatveis com .NET.

Principais vantagens da linguagem C#:


Clareza, simplicidade e facilidade: C# clara, simples, fcil de aprender, mas nem por isso menos poderosa. Completamente orientada a objetos: C#, diferentemente de muitas linguagens existentes no mercado, completamente orientada a objetos. Em C#, tudo um objeto. No requer ponteiros para gerenciar a memria: C# no requer ponteiros para alocar/desalocar memria heap. Esse gerenciamento, como dissemos acima, feito pelo GC (Garbage Collector). Suporta interfaces, sobrecarga, herana, polimorfismo, atributos, propriedades, colees, dentre outras caractersticas essenciais numa linguagem que se diz orientada a objetos. Cdigo 100% reutilizvel: Todo programa desenvolvido emC# passvel 16 de reutilizao a partir de qualquer outra linguagem de programao. A proposta de C# adiciona babel das linguagens de programao o que de melhor encontramos em tcnicas de desenvolvimento nas principais linguagens de hoje.

Quando usar a .NET?


Como conseqncia do que foi dito acima, a .NET se adapta perfeitamente ao desenvolvimento do seguinte tipo de aplicaes: Aplicaes clientes de front end Aplicaes de middleware: Web services, aplicaes do lado servidor (ASP.NET, SOAP, Web Services e XML) Aplicaes para internet: a .NET fornece bibliotecas especializadas para o desenvolvimento de aplicaes para Internet suportando os protocolos mais comuns: FTP, SMTP, HTTP, SOAP etc. Aplicaes grficas: via a biblioteca GDI+, a .NET d suporte completo a esse tipo de aplicaes.

27
Acesso a bancos de dados via ADO.NET: ADO.NET uma evoluo da tecnologia ADO usada amplamente no desenvolvimento de sistemas para bancos de dados. Entretanto, novas caractersticas so encontradas nessa nova biblioteca, como manipulao de dados na aplicao cliente, como se esta estivesse sendo manipulada no servidor. Isso implica em aplicaes connectionless (sem conexo) com vistas a no degradar o desempenho do servidor de banco de dados, quando este est servindo milhares de conexes simultaneamente. Aplicaes multitarefa: a biblioteca System.Thread d suporte ao desenvolvimento de aplicaes multitarefa.

Estrutura bsica de um programa em C#


O pequeno trecho de cdigo a seguir implementa o clssico programa Ol mundo:
using System; class AppPontoNet { static void Main( ) { // escrevendo no console Console.WriteLine("Ol mundo em C#"); Console.ReadLine( ); } }

O Cabealho do programa A primeira linha do nosso programa, que escreve no console Ol mundo em C#, contm a informao do namespace System, que contm as classes primitivas necessrias para ter acesso ao console do ambiente .NET. Para incluir um namespace em C#, utilizamos a clusula using seguida do nome do namespace. A declarao de uma classe O C# requer que toda a lgica do programa esteja contida em classes. Aps a declarao da classe usando a palavra reservada class, temos o seu respectivo identificador. Para quem no est familiarizado com o conceito de classe, apenas adiantamos que uma classe um tipo abstrato de dados que no paradigma de programao orientada a objetos usado para representar objetos do mundo real. No exemplo acima, temos uma classe que contm apenas o mtodo Main( ) e no recebe nenhum parmetro. O Mtodo Main( ) Todo programa C# deve ter uma classe que defina o mtodo Main( ), que deve ser declarado como esttico usando o modificador static, que diz ao runtime que o mtodo pode ser chamado sem que a classe seja instanciada. atravs desse modificador que o runtime sabe qual ser o ponto de entrada do programa no ambiente Win32, para poder passar o controle ao runtime .NET. OM mausculo do mtodo Main obrigatrio, e seu valor de retorno void significa que o mtodo no retorna nenhum valor quando chamado. Algumas variantes do mtodo Main( ): // Main recebe parmetros na linha de comando via o array args static void Main(string[ ] args) { //corpo do mtodo } // Main tem como valor de retorno um tipo int static int Main( ) { // corpo do mtodo } A forma do mtodo Main( ) a ser usada vai depender dos seguintes fatores:

28
O programa vai receber parmetros na linha de comando? Ento esses parmetros sero armazenados no array args. Quando o programa finalizado, necessrio retornar algum valor ao sistema? Ento o valor de retorno ser do tipo int.

Um programa escrito em C# pode ter mais de uma classe que implementa o mtodo Main( ). Nesse caso, dever ser especificado em tempo de compilao em qual classe se encontra o mtodo Main( ), que dever ser chamado pelo runtime quando a aplicao for executada.

Exemplo: using System; class class1 { static void Main( ) { Console.WriteLine("Mtodo Main( ) da classe 1"); } } class class2 { static void Main( ) { Console.WriteLine("Mtodo Main( ) da classe 2"); } } O resultado da compilao deste programa :

Class1.cs(6): Program 'C:\My Documents\Visual Studio Projects\twoMainMet\obj\Debug\twoMainMet.exe' has more than one entry point defined: 'class1.Main( )' Class1.cs(15): Program 'C:\My Documents\Visual Studio Projects\twoMainMet\obj\Debug\twoMainMet.exe' has more than one entry point defined: 'class2.Main( )'

Dentro do ambiente de desenvolvimento VS.NET proceda da seguinte forma para resolver esse problema: 1. Clique no menu Project e selecione a opo Properties. 2. Clique na pasta Application. 3. Modifique a propriedade Startup Object, selecionando a classe que contm o mtodo Main( ) que voc deseja que seja chamado pelo Runtime quando a aplicao for executada. 5. Clique em Ok e compile a aplicao de novo. Alguns ltimos detalhes adicionais Blocos de cdigo so agrupados entre chaves { }. Cada linha de cdigo separada por ponto-e-vrgula. Os comentrios de linha simples comeam com duas barras //. Comentrios em bloco so feitos usando os terminadores /* (de incio) e */ (de fim). /* Este um comentrio de bloco Segue o mesmo estilo de C/C++ */ O C# sensvel ao contexto, portanto int e INT so duas coisas diferentes. uma boa prtica sempre declarar uma classe onde todos os aspectos inerentes inicializao da aplicao sero implementados, e obviamente, que conter o mtodo Main( ) tambm.

29

Interagindo com o console


Praticamente toda linguagem de programao oferece meios de interagir com o console, para ler ou escrever na entrada (geralmente o teclado) e sada padro (normalmente o vdeo em modo texto). Em C#, temos uma classe chamada Console no namespace System, a qual oferece uma srie de mtodos para interagir com a entrada e sada padro. Vejamos alguns exemplos:

namespace FilaEstatica { public class LeNome { static void Main() { char c; string nome; // Escreve no console sem retorno de carro Console.Write("Digite seu nome: "); // L uma string do console. <Enter> para concluir nome = Console.ReadLine(); // Escreve uma linha em branco Console.WriteLine(); // Escreve uma string no console Console.WriteLine("Seu nome : {0} \nPressione Enter " + "para finalizar.", nome); // aguarda o usurio pressionar enter p/ sair do programa Console.ReadLine(); } } }

Como voc pode ver no exemplo acima, para escrever no console usamos os mtodos: Console.Write( ), para escrever uma string sem retorno de carro; Console.WriteLine( ), para escrever uma string com retorno de carro. Essa string pode ser parametrizada, o que significa que o contedo de variveis pode ser mostrado no console. As variveis a serem mostradas comeam a partir do segundo parmetro e so separadas por vrgula. Na string do primeiro parmetro elas so representadas por nmeros inteiros, a comear por zero, encerrados entre terminadores de incio { e de fim }.

Exemplo: Console.WriteLine("var1: {0}, var2: {1}, var3: {2}", var1, var2, var3); Para ler dados da entrada padro, usamos os seguintes mtodos: Read( ), para ler um caractere simples; ReadLine( ) para ler uma linha completa, conforme mostrado no exemplo acima. Formatando a sada padro A formatao da sada padro feita usando os chamados caracteres de escape (veja a tabela abaixo). Vejamos um exemplo: \t = TAB \n = quebra de linha e retorno de carro (CR LF) Console.WriteLine( "var1: {0} \t var2: {1}\t var3: {2}\n", var1, var2, var3);

30
Caractere de Escape - Significado \n \t \a \b \r \0 Insere uma nova linha TAB Dispara o som de um alarme sonoro simples Apaga o caractere anterior da string que est sendo escrita no console (backspace) Insere um retorno de carro Caractere NULL (nulo)

Recebendo parmetros na linha de comando


Para receber parmetros na linha de comando, ou seja, na chamada de um programa quando digitamos o nome do executvel no prompt da linha de comando do DOS(como ScanDisk /All /AutoFix, por exemplo), o mtodo Main( ) precisa ser declarado da seguinte forma:

// no retorna nenhum valor ao sistema static void Main(string[ ] args) ou // retorna um valor do tipo int ao sistema static int Main(string[ ] args)

O parmetro args um array de strings que recebe os parmetros passados quando a aplicao chamada na linha de comando. A seguir mostramos uma das formas da varrer os parmetros recebidos:

foreach (string cmd in args) { int i = 0; Console.WriteLine("Par {0}: {1}", i, cmd); i++; } Para saber o nmero de argumentos que foram passados, usamos o mtodo Length( ) do array args da seguinte forma: numArgs = args.Length( ); Quando na linha de comando so recebidos parmetros numricos, estes devem ser convertidos de string para o tipo numrico respectivo usando a classe Convert. Exemplo: Varint = Convert.ToInt32(varString);

31

Principais Operadores

32

Operador lgico XOR usado para comparar expresses booleanas

33

Variveis
Nomeando uma varivel: A documentao do Microsoft .Net Framework da as seguintes recomendaes para a nomeao das variveis: Evite usar underline; No crie variveis que apenas se diferenciem apenas pela sua forma. Exemplo: minhaVariavel e outra chamada MinhaVariavel; Procure iniciar o nome com uma letra minscula; Evite usar todas as letras maisculas; Quando o nome tiver mais que uma palavra, a primeira letra de cada palavra aps a primeira deve ser maiscula (conhecido como notao camelCase);

Conveno PascalCasing
Para usar a conveno PascalCasing para nomear suas variveis, capitalize o primeiro caractere de cada palavra. Exemplo: void InitializeData(); A microsoft recomenda usar o PascalCasing quando estiver nomeando classes, mtodos, propriedades, enumeradores, interfaces, constantes, campos somente leitura e namespaces.

Conveno camelCasing
Para usar esse tipo de conveno, capitalize a primeira letra de cada palavra menos da primeira. Como o exemplo: int loopCountMax; A Microsoft recomenda usar essa conveno na nomeao de variveis que definem campos e parmetros. Para maiores informaes sobre conveno de nomes pesquise Naming Guidelines, na documentao do Visual Studio.

Palavras reservadas:
A linguagem C# reserva setenta e cinco palavras para seu prprio uso. Estas palavras so chamadas de palavras reservadas e cada uma tem um uso particular. Palavras reservadas tambm no so permitidas como nome de variveis. Segue uma lista que identifica todas estas palavras:

abstract break char continue do event finally foreach in is new out

as byte checked decimal double explicit fixed goto int lock null override

base case class default else extern float if interface long object params

Bool Catch Const Delegate Enum false for implicit internal namespace operator private

34 protected return sizeof struct public sbyte stackalloc switch readonly sealed static this ref short string throw

Lista de palavras reservadas No painel de cdigo do Visual Studio .NET as palavras reservadas so identificadas pela cor de letra azul.

Declarando variveis
Antes de usar uma varivel necessrio declar-la. Neste momento alocamos espao para esta varivel na memria e dizemos que tipo de dado pode ser armazenado nela. O tipo de dado indica qual o tamanho do espao vai ser reservado para a varivel. O C# pode armazenar diferentes tipos de dados: como inteiros, nmeros de ponto flutuante, textos e caracteres. Assim que declaramos uma varivel precisamos identificar que tipo de dado ela armazenar. Declaramos especificando o tipo de dado seguido do nome da varivel como no exemplo:

int contador;
Esse exemplo declara uma varivel chamada contador do tipo integer. Ou seja ela dever armazenar nmeros inteiros, mais a frente estudaremos melhor o que armazenar em cada tipo de dado. Podemos tambm declarar mltiplas variveis de uma vez, fazemos isso da seguinte maneira:

int contador, numeroCarro;


Estamos declarando nesse exemplo duas variveis do tipo int, uma chamada contador e a outra numeroCarro.

Atribuindo valor a variveis


Depois de declarar sua varivel voc precisa atribuir um valor a ela. No C# voc no pode usar uma varivel antes de colocar um valor nela, isso gera um erro de compilao. Exemplo de como atribuir um valor a uma varivel:

int numeroFuncionario; numeroFuncionario = 23;

Primeiro nos declaramos nossa varivel do tipo integer. Depois atribumos o valor 23 a ela. Entendemos pelo sinal de igual como recebe. Assim numeroFuncionario recebe 23. Podemos tambm atribuir um valor a varivel quando a declaramos, dessa forma:

int numeroFuncionario = 23;

35
Isso faz a mesma coisa que o exemplo anterior, s que tudo em uma linha. Mais um exemplo:

char letraInicial = M;

Tipos de variveis
A seguinte tabela mostra os tipos do C# com sua referencia no Framework. Os tipos da tabela abaixo so conhecidos como tipos internos ou Built-in. C# Type bool byte sbyte char decimal double float int uint long ulong object short ushort string .NET Framework type System.Boolean System.Byte System.SByte System.Char System.Decimal System.Double System.Single System.Int32 System.UInt32 System.Int64 System.UInt64 System.Object System.Int16 System.UInt16 System.String

Cada tipo no C# um atalho para o tipo do Framework. Isso quer dizer que se declararmos a varivel desta forma:

string nome;
ou dessa forma

System.String nome;

teremos o mesmo resultado. O atalho serve apenas para facilitar na hora de desenvolver a aplicao. A seguinte tabela mostra os tipos de variveis e os valores possveis de se armazenar em cada uma delas. C# Type bool byte sbyte char Valores possveis de se armazenar Verdadeiro ou Falso (Valores booleandos) 0 a 255 (8 bits) -128 a 127 (8 bits) Um caractere (16 bits)

36
decimal double float int uint long ulong object short ushort string 1.0 1028 a 7.9 1028 (128 bits) 5.0 10324 a 1.7 10308 (64 bits) 1.5 1045 a 3.4 1038 (32 bits) -2,147,483,648 a 2,147,483,647 (32 bits) 0 a 4,294,967,295 (32 bits) 9,223,372,036,854,775,808 a 9,223,372,036,854,775,807 (64 bits) 0 a 18,446,744,073,709,551,615 (64 bits) Qualquer tipo. -32,768 a 32,767 (16 bits) 0 a 65,535 (16 bits) Seqncia de caracteres (16 bits por caractere)

Todos os tipos na tabela com exceo dos tipos object e string so conhecidos como tipos simples. Para retornar o tipo de qualquer varivel do C# voc pode usar o mtodo GetType(); Como no exemplo:

Console.WriteLine(minhaVariavel.GetType());
Isso retornaria o tipo da varivel minhaVariavel. Para maiores informaes sobre tipos de variveis consulte a documentao do Visual Studio por data types.

Adicionando valor a uma varivel


muito comum precisarmos adicionar ou subtrair valores de uma varivel usando no calculo o valor que j esta armazenado na mesma. O cdigo seguinte declara uma varivel do tipo integer chamada contador e armazena o valor 2 nesta varivel, depois incrementa o valor 40:

int contador; contador = 2; contador = contador + 40;


No final do cdigo acima a varivel contador tem qual valor? A resposta 42, claro, criamos a varivel, adicionamos o valor 2 nela e aps, pegamos o valor dela (que era 2) e adicionamos 40, e armazenamos o valor na mesma. Preste ateno na seguinte linha de cdigo:

contador = contador + 40; Perceba que para somar o valor a varivel precisamos repetir o nome da varivel.
Podemos fazer da seguinte forma tambm em C#:

contador += 40;

37
Isso teria o mesmo resultado e uma maneira mais elegante. Voc pode subtrair tambm valores, como o exemplo:

contador -= 23;
Isso subtrairia 23 do valor da varivel. Na verdade voc pode fazer isso com todos os operadores aritmticos, como multiplicao e diviso tambm.

38 Manipulando Strings
using using using using System; System.Collections.Generic; System.Linq; System.Text;

public class StringApp { static void Main() { string nome; char letra; Console.Write("Por favor, informe seu nome completo: "); nome = Console.ReadLine(); Console.WriteLine("Seu nome tem {0} letras ", nome.Length); Console.WriteLine("Ele inicia com a letra [ {0} ] e termina com [ {1} ]", nome[0], nome[nome.Length - 1]); Console.WriteLine("Nome todo em maisculo: {0} ", nome.ToUpper()); Console.WriteLine("Nome todo em minsculo: {0} ", nome.ToLower()); Console.WriteLine("Apenas as 3 primeiras letras do nome: {0}", nome.Substring(0, 3)); // replace: substitui uma letra por outra // a partir de agora, o nome foi alterado!!!! nome = nome.Replace(' ', '_'); Console.WriteLine("Veja como ficou seu nome depois de aplicar o replace: {0}", nome); Console.Write("Digite uma letra para pequisar em seu nome: "); letra = Console.ReadLine()[0]; // indexof pesquisa a primeira ocorrnciade um caractere dentro de uma string. // se no encontrar, retorna -1 Console.WriteLine("A primeira ocorrncia da letra [{0}] est na posio: {1} ", letra, nome.IndexOf(letra)); Console.WriteLine("\n\nPressione ENTER para terminar."); Console.ReadLine(); } }

39

Constantes
Ao antepor a palavra-chave const durante a declarao e inicializao de unia varivel, ela se torna uma constante. Como insinua o nome, um constante uma varivel cujo valor no pode ser alterado ao longo de sua existncia: const int a = 100; // Este valor no pode ser alterado As constantes tm as seguintes caractersticas: Elas devem ser inicializadas quando declaradas e, depois que um valor lhes for atribudo, no poder mais ser alterado. O valor de unia constante deve ser computvel em tempo de compilao. Ento, ns no podemos inicializar uma constante com um valor proveniente de uma varivel. Se voc precisar fazer isso, use um campo somente leitura. As constantes so sempre estticas. Note, porm, que no temos (e, na realidade, no permitido) incluir o modificador static na declarao de constante. H trs vantagens pelo menos no uso de constantes (ou variveis somente leitura) em seus programas: As constantes tornam seus programas mais fceis de ler, substituindo nmeros mgicos e strings mgicas por nomes legveis cujos valores so fceis de entender. As constantes tornam seus programas mais fceis de modificar. (Por exemplo, voc tem uma constante Impostovenda em um de seus programas C# e a essa constante atribudo o valor de 6%. Se a taxa de imposto de Impostovenda mudar tempos depois, voc pode modificar o comportamento de todos os clculos de imposto simplesmente atribuindo um valor novo constante; voc no tem de procurar em todo o seu cdigo o valor 0.06 e modificar cada um, supondo que tivesse encontrado todos.) Com as constantes mais fcil evitar erro sem seus programas. Se voc tentar atribuir outro valor a uma constante em algum lugar em seu programa, depois que j tiver atribudo um valor, o compilador sinalizar o erro.

Saindo explicitamente da aplicao:


A instruo abaixo faz com que o programa termine e retorne ao sistema operacional o cdigo de erro informado entre parnteses. Environment.Exit(0); Exemplo: static void Main(string[] args) { Console.Write("O comando Environment.Exit(0) fecha o programa imediatamente"); Console.ReadLine(); Environment.Exit(0); Console.WriteLine("Esta linha nunca ser exibida"); }

40

Estrutura de Deciso (IF)


O if avalia uma expresso lgica booleana e qualquer outro tipo ser acusado como erro pelo compilador. Se o resultado for verdadeiro, o bloco de cdigo dentro do if ser executado; caso contrrio, o controle passado para a prxima declarao aps o if. Os projetistas de C# optaram por aceitar unicamente expresses boolenas no if para evitar escrever cdigo com semntica obscura e propensa a resultados inesperados. A declarao if tem trs formas bsicas: 1.
if (expresso booleana) { Declarao }

2.
if (expresso booleana) { Declarao } else { Declarao }

3.
if (expresso booleana) { Declarao } else if (expresso booleana) { Declarao } else If (expresso booleana) { Declarao } else { Declarao }

Vejamos alguns exemplos:


static void Main(string[] args) { int a = 0; int b = 0; if (a < b) { Console.WriteLine("B maior"); } else { Console.WriteLine("A maior"); } } O exemplo anterior sintaticamente correto, mas o que aconteceria se a=b? O nosso cdigo passaria a dar a resposta incorreta, porque ele no avalia a condio a=b, o que torna o nosso cdigo inconsistente. Vamos reescrev-lo de forma que a condio de igualdade seja avaliada:

41
static void Main(string[] args) { int a = 0; int b = 0; if (a < b) { Console.WriteLine("B } else if (a > b) { Console.WriteLine("A } else // e finalmente a condio { Console.WriteLine("A } }

maior");

maior"); de igualdade deveria ser satisfeita igual a B");

O uso de chaves {} opcional e est condicionado a execuo de mais de uma instruo. No exemplo abaixo, poderemos retiras as chaves, pois caso a condio do if seja verdadeira, apenas uma instruo dever ser executada. O mesmo acontece com o else. static void Main(string[] args) { int a = 0; int b = 0; if (a < b) Console.WriteLine("B maior"); else Console.WriteLine("A maior"); }

42

Estrutura de Repetio FOR


O lao for segue o mesmo estilo das linguagens C/C++, e a sua sintaxe tem as seguintes caractersticas: Uma varivel de inicializao pode ser declarada dentro do for. Uma condio avalia uma expresso para abandonar o for ou execut-lo de novo. Uma expresso incrementa o valor da varivel de inicializao.

Exemplo: static void Main(string[] args) { for (int i = 0; i < 5; i++) { Console.WriteLine("Iterao nmero {0}", i); } Console.ReadLine(); } Para abandonar o lao antes que a condio for seja falsa, usa-se a palavra reservada break. Exemplo: static void Main(string[] args) { for (int i = 0; i < 5; i++) { Console.WriteLine("Iterao nmero {0}", i); if (i == 3) break; } Console.ReadLine(); } A palavra reservada continue permite que o fluxo de execuo da iterao corrente seja abandonado, mas no o lao, e a iterao seguinte d incio no topo do lao, uma vez que a condio do for seja satisfeita. Exemplo: static void Main(string[] args) { for (double i = 0; i < 5; i++) { if (i == 3) continue; // a linha abaixo no ser impressa quando i = 3 Console.WriteLine("Iterao nmero {0}", i); } Console.ReadLine(); }

43 Laos for infinitos


Veja no exemplo a seguir uma forma de usar laos for para implementar iteraes infinitas: static void Main(string[] args) { string texto ; Console.WriteLine("Digite mltiplas linhas separadas por enter. " + "Para sair digite \"sair\" "); for (; ; ) { texto = Console.ReadLine(); if ((texto.ToUpper() == "SAIR")) break; } }

Observe que o uso de break necessrio para poder abandonar o lao; caso contrrio, o seu programa entrar num loop infinito.

Laos for aninhados


Laos aninhados so laos dentro de laos. Nestes casos, no podemos usar a mesma varivel de controle para ambos os FOR. Exemplo: static void Main(string[] args) { for (int i = 0; i <= 10; i++) { for (int x = 0; x <= 20; x++) { Console.WriteLine("{0}, {1}", i, x); } } Console.ReadLine(); } Se uma declarao break estiver no lao interno, este ser abandonado e o controle ser passado para o lao externo; mas se estiver no lao externo, os dois laos sero abandonados e o controle passar para a prxima declarao aps o lao. Tanto a expresso de inicializao de variveis quanto a de incremento podem conter mais de uma expresso e estas devero estar separadas por vrgula. Exemplo: static void Main(string[] args) { int i, j; for (i = 0, j = 1; j < 5; j++, i++) { Console.WriteLine("i={0} j={1}", i , j); } Console.ReadLine(); }

44 Laos for em decremento


Tambm podemos implementar laos cuja varivel de controle decrementa em lugar de incrementar. Exemplo: static void Main(string[] args) { for (int i = 10; i >= 0; i--) { Console.WriteLine(i); } Console.ReadLine(); }

Estrutura de Repetio DO WHILE


O lao do while usado quando no sabemos o nmero de vezes que devemos executar um bloco de cdigo, mas apenas a condio que deve ser satisfeita para executar o bloco dentro do do while. Essa condio uma expresso booleana que dever ser verdadeira para garantir a execuo do bloco. Este tipo de lao usado quando queremos que um bloco de cdigo seja executado pelo menos uma vez, dado que a condio para sua repetio testada aps a execuo do bloco.

Ex: Vamos simular uma estrutura de repetio for utilizando o do while:

static void Main(string[] args) { int contador =0; do { Console.WriteLine(contador); contador++; } while (contador <= 10); Console.ReadLine(); }

No exemplo a seguir, o usurio deve digitar -1 para sair da estrutura de repetio: static void Main(string[] args) { int numero; do { Console.WriteLine("Digite qualquer nmero ou -1 para sair"); numero = Convert.ToInt32( Console.ReadLine() ); } while (numero != -1 ); Console.WriteLine("Tchau!"); Console.ReadLine(); }

45
Conforme mostramos no lao for, o uso das declaraes break e continue tambm permitido dentro do do while atendendo mesma funcionalidade.

Estrutura de Repetio WHILE


Assim como no lao do while, o lao do while usado quando no sabemos o nmero de vezes que devemos executar um bloco de cdigo, mas apenas a condio que deve ser satisfeita para executar o bloco dentro do do while. Essa condio uma expresso booleana que dever ser verdadeira para garantir a execuo do bloco. Diferentemente do do while, se a condio no for satisfeita o bloco de cdigo no ser executado nenhuma vez, visto que a condio j testada logo de incio. Exemplo: simulando uma estrutura de repetio for: static void Main(string[] args) { int contador = 0; while (contador <= 10) { Console.WriteLine(contador); contador++; // no esquea desta linha,!!!! } Console.ReadLine(); }

Observe que para ambos os laos, while e do while, caso utilizemos um contador, devemos tomar o cuidado de increment-lo porque se assim no o fizssemos, a nossa aplicao entraria num loop infinito. Tambm as declaraes break e continue podem ser usadas da mesma forma que no lao for.

46

Vetores e Matrizes
Arrays, ou simplesmente vetores, so elementos dimensionais de um determinado tipo de dados, sendo eles tipo referncia ou tipo valor, onde so agrupados num nmero fixo de elementos. Em C# os vetores so acessados atravs de um ndice (valor numrico) onde o primeiro ndice sempre ser zero (0). Um vetor pode ser criado na forma unidimensional ou multidimensional. Um vetor um tipo referncia. Ele indica que a varivel, a qual representa o vetor, aponta para os elementos em memria, bem como quando passada atravs de mtodos, seus elementos podem ser alterados. Os vetores de tamanho fixo so baseados na classe System.Array do .NET Framework. Exemplo: Vetor ana 0

Dado ndice

maria 1

cludia 2

beatriz 3

daniela 4

Para criar o vetor acima, que seja capaz de armazenar valores do tipo string, o comando :
Tipo de Dado O [] aps o tipo indica que ser um vetor

Nome do vetor

Reserva memria para o vetor

Novamente, o tipo de dado

Quantidade de posies do vetor

String[] vetor = new string[5];

Para preencher o vetor com os nomes, poderamos utilizar: vetor[0] vetor[1] vetor[2] vetor[3] vetor[4] = = = = = "ana"; "maria"; "cludia"; "beatriz"; "daniela";

Para varrer os dados do vetor, ou seja, para acessar suas informaes, a forma mais simples utilizando estruturas de repetio. Ex: Vamos imprimir todos os nomes do vetor acima:
Length: Retorna a quantidade de posies vetor

for (int i = 0; i < vetor.Length; i++) { Console.WriteLine(vetor[i]); }

Se quisermos solicitar ao usurio que informe os 5 nomes, a instruo seria:

for (int i = 0; i < vetor.Length; i++) { vetor[i] = Console.ReadLine(); }

47
O conceito de vetores pode ser entendido para vetores multidimensionais. Em vez de pensarmos em algo linear, com um ndice, podemos pensar em estruturas com mais de um ndice. Um exemplo simples a caso das matrizes, que podem ser pensadas como vetores de duas dimenses. Vejamos como declaramos uma matriz (vetor de duas dimenses) :
static void Main(string[] args) { // cria uma matriz de duas dimenses: 3 por 3 int[,] matriz = new int[3,3]; /* representao da matriz: 0 1 2 0[ | | ] 1[ | | ] 2[ | | ] */ // inserindo dados na matriz, sem interveno do usurio. matriz[0,0] = 1; matriz[0,1] = 2; matriz[0,2] = 3; matriz[1,0] = 4; matriz[1,1] = 5; matriz[1,2] = 6; matriz[2,0] = 7; matriz[2,1] = 8; matriz[2,2] = 9; // impresso dos dados da matriz: // observe que no podemos utilizar o matriz.Length pois agora // a matriz possui 2 dimenses e a propriedade Length ir retornar 9 e no 3. for (int linha=0; linha<=2; linha++) { for (int coluna=0; coluna<=2; coluna++) { Console.Write("{0} ", matriz[linha, coluna]); } Console.WriteLine(); } /* o resultado em vdeo ser: 0 0[ 1 1[ 4 2[ 7 1 | 2 | 5 | 8 2 | 3 | 6 | 9 ] ] ]

(3 linhas e 3 colunas)

*/ Console.ReadLine(); }

48

Estrutura de repetio foreach/in


Este tipo de lao usado para varrer arrays ou colees. As suas vantagens em relao ao lao for so as seguintes: No precisamos nos preocupar com a avaliao da uma condio booleana para garantir a sua execuo; Nem com a inicializao de variveis com o seu incremento/decremento; Nem com a forma de extrao do contedo do array ou coleo, j que ambos possuem formas diferentes de extrao dos seus valores; Quando todos os elementos do array/coleo tiverem sido varridos, o lao foreach/in ser abandonado. Usando um lao for, uma vez que uma das condies acima falhar, a tentativa de extrair os elementos do array/coleo ser malsucedida. Vejamos um exemplo: string[] vetor = new string[5]; // preenchendo os valores do vetor: vetor[0] = "ana"; vetor[1] = "maria"; vetor[2] = "cludia"; vetor[3] = "beatriz"; vetor[4] = "daniela"; // exibindo os valores do vetor: foreach (string valor in vetor) { Console.WriteLine(valor); } Como voc pode perceber, o array de strings foi varrido sem termos de nos preocupar com os limites inferior e superior de cada dimenso, nem muito menos com o incremento dos mesmos ou com a sua correta inicializao.

A cada iterao do foreach, um elemento do vetor atribudo varivel valor.

49

Controle de Exceo - Bsico


Trs tipos de erros podem ser encontrados em seus programas, so eles: erros de sintaxe, erros de Runtime e erros lgicos, vamos entender cada um deles. Erros de sintaxe ou erro de compilao: Acontece quando voc digita de forma errada uma palavra reservada ou comando do C#. Voc no consegue executar seu programa quando tem esse tipo de erro no seu cdigo. Erros de Runtime: Acontecem quando o programa para de executar der repente durante sua execuo, chamamos essa parada de exceo. Erros de runtime acontecem quando alguma coisa interfere na correta execuo do seu cdigo, por exemplo, quando seu cdigo precisa ler um disquete que no esta no drive, ao no encontrar o disquete ele gera uma exceo e para bruscamente a execuo, esse tipo de erro pode e deve ser tratado.

Erros lgicos: Esse o tipo de erro mais difcil de ser tratado. um erro humano. O cdigo funciona perfeitamente, mas o resultado errado. Exemplo, uma funo que deve retornar um valor, s que o valor retornado esta errado, o erro neste caso se encontra na lgica da funo que esta processando o clculo. A grosso modo como se o seu programa precise fazer um calculo de 2 + 2 em que o resultado certo 4 mas ele retorna 3. Quando uma conta simples fcil de identificar mas e se o calculo for complexo.

O tratamento de exceo um mecanismo capaz de dar robustez a uma aplicao, permitindo que os erros sejam manipulados de uma maneira consistente e fazendo com que a aplicao possa se recuperar de erros, se possvel, ou finalizar a execuo quando necessrio, sem perda de dados ou recursos. Para que uma aplicao seja segura, seu cdigo necessita reconhecer uma exceo quando ela ocorrer e responder adequadamente a esta. Se no houver tratamento consistente para uma exceo, ser exibida uma mensagem padro descrevendo o erro e todos os processamentos pendentes no sero executados. Uma exceo deve ser respondida sempre que houver perigo de perda de dados ou de recursos do sistema. O exemplo abaixo ilustra uma exceo que ocorreu em um programa que esperava uma entrada de um valor inteiro, mas foi digitada uma letra:

50
O ideal seria o tratamento destes erros, evitando a perda de dados ou a necessidade de encerrar a aplicao. Alm de tratar o erro, a rotina de tratamento de erros poderia enviar ao usurio uma mensagem em portugus, mais significativa. A forma mais simples para responder a uma exceo garantir que algum cdigo limpo executado. Este tipo de resposta no corrige o erro, mas garante que sua aplicao no termine de forma instvel. Normalmente, usa-se este tipo de resposta para garantir a liberao de recursos alocados, mesmo que ocorra um erro. O tratamento mais simples seria uma simples mensagem ao usurio com a proposta para ele tentar efetuar novamente a operao que tenha causado o erro, conforme podemos ver no exemplo abaixo:

BLOCOS PROTEGIDOS
Bloco protegido uma rea em seu cdigo que est protegido de excees. Se o cdigo no gerar nenhuma exceo, ele prossegue com o programa. Caso ocorra uma exceo, ento ele cria uma resposta a este insucesso. Quando se define um bloco protegido, especifica-se respostas a excees que podem ocorrer dentro deste bloco. Se a exceo ocorrer, o fluxo do programa pula para a resposta definida, e aps execut-la, abandona o bloco. Um bloco protegido um grupo de comandos com uma seo de tratamento de excees. O exemplo abaixo verifica se foi digitado apenas nmeros. Caso seja digitado qualquer outro caractere, uma mensagem exibida:

try { Console.Write("\n\nDigite um nmero inteiro: "); numero = Convert.ToInt32(Console.ReadLine()); correto = true; } catch { correto = false; Console.Write("Digite apenas nmeros inteiros!"); }

O comando Try{ bloco protegido.

} define o

Se alguma exceo ocorrer ali, o fluxo de execuo transferido para o bloco catch { } O fluxo de execuo s ser transferido para o catch se ocorrer uma exceo no bloco try.

51
O exemplo abaixo verifica se o usurio digitou um nmero inteiro vlido e, caso no o tenha feito, o programa ficar solicitando o nmero at que o usurio o informe corretamente.

static void Main(string[] args) { int numero; bool correto; do { try {

Caso o usurio digite uma letra, a linha


correto = true;

no ser executada pois a exceo far o fluxo ser direcionado para o bloco catch.
Console.Write("\n\nDigite um nmero inteiro: "); numero = Convert.ToInt32(Console.ReadLine()); correto = true;

} catch { correto = false; Console.Write("*** Digite apenas nmeros inteiros! *** "); } } while (correto == false); }

52

Estruturas de dados heterogneas


Os tipos de variveis que apresentamos at agora (ex: int, float, Double, string, etc.) permitem armazenar apenas 1 tipo de dado. Um a estrutura de dados heterognea um tipo de dado criado pelo usurio. Este novo tipo de dado pode ser utilizado para armazenar, em uma nica varivel, tipos de dados diferentes. Em C#, o tipo struct utilizado para criar um novo tipo de dado, definido pelo usurio. Um tipo struct um tipo de valor normalmente usado para encapsular pequenos grupos de variveis relacionadas, como as coordenadas de um retngulo ou as caractersticas de um item em um inventrio. O exemplo abaixo cria um tipo de dado chamado registro. Este novo tipo de dado composto por 2 campos. Um campo chamado codigo do tipo inteiro e um campo chamado nome do tipo string.
namespace Estrut_heterogeneas_1 { class Estruturas_heterogeneas { // Estrura para armazenar dados heterogneos no vetor. public struct registro A declarao do novo tipo deve ser { fora do mtodo main. public int codigo; public string nome; }; Public indica a visibilidade da static void Main(string[] args) { registro Dado; Dado.codigo = 5; Dado.nome = "Daniela da Silva"; Console.WriteLine("{0} Console.ReadLine(); } } } - {1}", Dado.codigo, Dado.nome);

estrutura dentro do progama

Os campos de uma estrutura so acessados aps o .. Ex: dado codigo = 5

Observe no programa acima que foi criado um novo tipo de dado, o tipo registro. As variveis criadas a partir deste tipo iro possuir 2 campos (codigo e nome).

Esse novo tipo de dado pode ser utilizado tambm para criar vetores. Sendo assim, possvel guardar mais de uma informao em cada clula de um vetor. Ex:

53
namespace Estrut_heterogeneas_1 { class Estruturas_heterogeneas { // Estrura para armazenar dados heterogneos no vetor. public struct registro { public int codigo; public string nome; }; static void Main(string[] args) { registro[] Vetor = new registro[5]; // leitura dos dados do vetor for (int i = 0; i < Vetor.Length; i++) { do // validao do cdigo { Console.WriteLine("Informe um cdigo maior que zero."); Vetor[i].codigo =Convert.ToInt16( Console.ReadLine()); } while (Vetor[i].codigo <= 0); do // validao do nome { Console.WriteLine("Agora informe o nome"); Vetor[i].nome = Console.ReadLine(); } while (Vetor[i].nome.Trim().Length == 0); } // impresso em vdeo dos dados lidos Console.WriteLine("\n\nDADOS CADASTRADOS:\n"); for (int i = 0; i < Vetor.Length; i++) { Console.WriteLine("Cd.: {0} - Nome: {1}", Vetor[i].codigo, Vetor[i].nome); } Console.ReadLine(); } } }

No vetor, as informaes sero armazenadas da seguinte maneira:

0 1 2 3 4

Cdigo: Nome: Cdigo: Nome: Cdigo: Nome: Cdigo: Nome: Cdigo: Nome:

1 Ana 2 Daniela 3 Cludia 4 Bruna 5 Paula

Observe que cada clula possui 2 campos.

54

Mtodos
Os mtodos em C# so conceitualmente similares a procedimentos e funes em outras linguagens de alto nvel. Normalmente correspondem a trechos de cdigo que podem ser chamados em um objeto especfico (de alguma classe). Os mtodos podem admitir parmetros como argumentos, e seu comportamento depende do objeto ao qual pertencem e dos valores passados por qualquer parmetro. Todo mtodo em C# especificado no corpo de uma classe. A definio de um mtodo compreende duas partes: a assinatura, que define o nome e os parmetros do mtodo, e o corpo, que define o que o mtodo realmente faz.

Declarando Mtodos
Em C#, a definio de um mtodo formada por nico modificador de mtodo (como a acessibilidade do mtodo), pelo tipo do valor de retorno seguido do nome do mtodo, seguido de uma lista de argumentos de entrada includa entre parnteses, seguida do corpo cio mtodo includo entre chaves. [modificadores] tipo_retorno { Corpo do mtodo } NomeMetodo( [parmetros])

Cada parmetro consiste no nome do tipo do parmetro e no nome pelo qual ele mencionado no corpo do mtodo. Alm disso, se o mtodo retornar um valor, um comando return dever ser usado com o valor de retorno para indicar o ponto de sada. Por exemplo:

Tipo do retorno

Nome do mtodo

Tipo e nome Parmetro

static bool Positivo(double numero) { if (numero < 0) return false; else return true; }

Mtodo que retorna true se um nmero informado via parmetro for positivo, ou retorna false se o nmero for negativo. Obs: O cdigo do mtodo poderia ser substitudo por: return numero >=0;

static void Main(string[] args) {

Programa principal, onde h a chamada do mtodo acima.

if (Positivo(7) == true) Console.WriteLine("O nmero 7 um nmero positivo!"); else Console.WriteLine("O nmero 7 NO um nmero positivo!"); Console.ReadLine(); }
Exemplo de um mtodo que retorna um dado booleano.

Se o mtodo no retornar nada, ns especificamos o tipo de retorno como void, pois no podemos omitir o tipo de retorno. Se no houver nenhum argumento, precisamos tambm incluir um conjunto vazio de parnteses depois do nome do mtodo. Nesse caso, a incluso de um comando return opcional - o mtodo retornar automaticamente quando a chave de fechamento for alcanada. Voc deve observar que um mtodo poder conter quantos comandos return forem necessrios. Assim que o return for executado, o mtodo terminado.

55
static void ExibeTextoVermelho(string texto) { ConsoleColor cor = Console.ForegroundColor; // guarda a cor agual na varivel cor Console.ForegroundColor = ConsoleColor.Red; // altera a cor atual para vermelho Console.WriteLine( texto ); // escreve o texto em vermelho Console.ForegroundColor = cor; // restaura a cor que estava antes de executar o mtodo. } static void Main(string[] args) { ExibeTextoVermelho("Este texto est sendo exibido em vermelho"); Console.WriteLine("Pressione enter para terminar."); Console.ReadLine(); }

Exemplo de um mtodo que no retorna nada.

static void limpaTela() { Console.Clear(); Console.WriteLine("Tela limpinha!!!!"); } static void Main(string[] args) { ExibeTextoVermelho("xxxxxxxxxxxxxxxxx"); Console.WriteLine("yyyyyyyyyyyyyyyyyy"); Console.WriteLine("Pressione enter para limpar a tela!"); Console.ReadLine(); limpaTela(); Console.ReadLine(); }
Exemplo de um mtodo que no retorna nada e no tem parmetros.

Sobre a palavra reservada Static, no se preocupe neste momento, pois este um assunto que ser visto mais adiante, em orientao a objetos. Um mtodo (ou campo) esttico est associado definio de classe como um todo, no com alguma instncia em particular daquela classe. Isso significa que eles sero chamados pela especificao do nome da classe e no do nome da varivel.

Passando Parmetros para Mtodos


Geralmente, os argumentos (as informaes entre parnteses na declarao do mtodo) podem ser passados aos mtodos por referncia ou por valor. Uma varivel passada por referncia a um mtodo ser afetada por quaisquer alteraes que o mtodo chamado fizer nela. Uma varivel passada por valor para um mtodo no ser alterada pelas alteraes que ocorrerem no corpo do mtodo. Isso ocorre porque o mtodo se refere s variveis originais quando elas so passadas por referncia, mas apenas s cpias das variveis quando elas so passadas por valor.

Para tipos de dado mais complexos, a passagem por referncia mais eficiente em decorrncia da grande quantidade de dados que devem ser copiados quando se passa por valor. No C#, todos os parmetros so passados por valor, a menos que solicitemos especificamente que isso no seja feito. No entanto, o tipo de dado do parmetro tambm determinar o efetivo comportamento de quaisquer parmetros que sejam passados a um mtodo. Como os tipos referncia contm apenas uma

56
referncia ao objeto, eles ainda passaro apenas essa referncia para o mtodo. Os tipos valor, ao contrrio, contm realmente o dado, de forma que uma cpia do prprio dado ser passada para o mtodo. Um int, por exemplo, passado por valor para uma mtodo, e quaisquer alteraes que esse mtodo fizer no valor desse int no alterar o valor do objeto int original. Inversamente, se um array ou qualquer tipo referncia, como uma classe, for passado para um mtodo e o mtodo alterar um valor naquele array, o novo valor ser refletido no objeto array original. static void teste(int variavel) { variavel = variavel * 2; } static void Main(string[] args) { int numero = 8; teste(numero); Console.WriteLine(numero); Console.ReadLine(); }
Exemplo de uma passagem de parmetros por valor. O valor exibido ser 8 j que seu contedo ser copiado no mtodo teste.

Esse comportamento padro. Porm, ns podemos fazer com que parmetros de valor sejam passados por referncia. Para fazer isso, usamos a palavra-chave ref. Se um parmetro for passado a um mtodo e o argumento de entrada para aquele mtodo for anteposto com a palavra-chave ref, qualquer alterao que o mtodo faa na varivel afetar o valor do objeto original: static void teste(ref int variavel) { variavel = variavel * 2; } static void Main(string[] args) { int numero = 8; teste(ref numero); Console.WriteLine(numero); Console.ReadLine(); }
Exemplo de uma passagem de parmetros por referncia. O valor exibido ser 16 j que no mtodo passado o endereo da varivel numero, e no o seu valor.

necessrio utilizar a palavra reservada ref na assinatura do mtodo e tambm quando ele for chamado.

Obs: Se for utilizada a passagem por referncia, a chamada do mtodo no poder ser feita com literais ou constantes. Ex: teste( 9 ); O cdigo acima est incorreto pois a declarao do mtodo usa a palavra ref, que EXIGE a passagem de um valor por referncia, ou seja, um endereo de uma varivel. A linguagem C# torna o comportamento mais explcito (evitando assim, supe-se, os bugs) ao requerer o uso da palavra-chave ref quando um mtodo invocado. Obs: Qualquer varivel dever ser inicializada antes de ser passada para um mtodo, quer ela seja passada por valor ou por referncia.

57 A Palavra-Chave out
Em linguagens C#, comum as funes poderem retornar mais de um valor em uma simples rotina. Isso obtido por meio dos parmetros de sada pela atribuio de valores de sada a variveis que foram passadas ao mtodo por referncia. Muitas vezes, os valores iniciais das vaiveis passadas por referncia no tm importncia. Esses valores sero sobrescritos pela funo, que pode at nunca chegar a examinlos. Seria conveniente se pudssemos usar a mesma conveno em C#, mas, como voc deve se lembrar, o C# requer que as variveis sejam inicializadas com algum valor antes se serem referenciadas. Embora pudssemos inicializar nossas variveis de entrada com valores insignificantes antes de sua passagem dentro da funo, o que dar a elas o valor real, essa prtica parece desnecessria, e pior, confusa. Contudo, h um meio de acabar com a insistncia dos compiladores c# sobre os valores iniciais dos argumentos de entrada. por meio da palavra chave out. Quando o argumento de entrada de um mtodo anteposto com a palavra chave out, esse mtodo pode receber uma varivel que no foi inicializada de forma alguma. A varivel passada por referncia, assim qualquer mudana que o mtodo faz na varivel persistir quando o controle retornar ao mtodo chamado.
static void MaiorMenor(int[] vetor, out int maior, out int menor) { int i; maior = vetor[0]; menor = vetor[0]; for (i = 1; i < vetor.Length; i++) { if (vetor[i] > maior) { maior = vetor[i]; } else if (vetor[i] < menor) { menor = vetor[i]; } } } static void Main(string[] args) { int[] vetor = new int[3]; int maior, menor; vetor[0] = 7; vetor[1] = 3; vetor[2] = 5; MaiorMenor(vetor, out maior, out menor); Console.WriteLine("Maior valor: {0} \nMenor valor: {1}", maior, menor) ; Console.ReadLine(); }

Exemplo de um mtodo que retorna dados nos parmetros maior e menor.

58

Escopo das variveis


O escopo de uma varivel a regio de cdigo na qual a varivel pode ser acessada. De forma geral, o escopo determinado pelas seguintes regras: 1. Um campo (tambm conhecido como varivel membro) de uma classe permanecer no escopo pelo mesmo tempo em que a classe na qual est contido permanecer no escopo. 2. Uma varivel local permanecer no escopo at que uma chave indique o fim de uma instruo de bloco ou do mtodo no qual ela foi declarada. 3. Uma varivel local declarada em uma instruo for, while e ou outra semelhante permanecer no escopo no corpo daquele lao. 4. Variveis com o mesmo nome no podero ser declaradas duas vezes no mesmo escopo. class Program { static int x = 10; static void Main(string[] args) { int y = 7; Console.WriteLine(x + y); Console.ReadLine(); } }
A varivel x tem uma visibilidade global dentro da classe Program, ou seja, ela visvel em todos os mtodos criados dentro desta classe. Novamente, no se preocupe com a declarao static.

A varivel y tem uma visibilidade local e s pode ser utilizada dentro do mtodo Main (onde ela foi criada)

..... if (x == 5) { string nome = "cosmo"; Console.WriteLine(nome); } nome = "wanda"; //vai dar erro de compilao, pois esta varivel no existem mais! Como explicado no item 2, a varivel nome s ter visibilidade dentro do if onde ela foi criada.

Вам также может понравиться