Você está na página 1de 21

editorial

ndice
3 4 7 notcias/links snippets tema de capa
-Introduo Programao para Android

Que futuro?
Quero comear por pedir desculpa aos nossos leitores, e em nome de toda a equipa, pelo atraso no lanamento desta edio da Revista Programar. Infelizmente, tal como aconteceu no lanamento da ltima edio da revista, no nos foi possvel cumprir a data prevista. As razes so vrias e as desculpas, se fossem importantes, certamente seriam ainda em maior nmero. A verdade que a Revista Programar est a passar por um momento difcil e crtico da sua existncia. O nmero de lanamento j vai longe. J se passaram vrios anos e este projecto amadureceu, expandiu-se e tornou-se cada vez mais exigente. Os vrios elementos da equipa, quer passada quer actual, sempre responderam da melhor forma que souberam aos vrios desafios que nos foram sendo postos. Mas, actualmente, enfrentamos o maior desafio de todos at data. A Revista Programar nasceu de forma espontnea como um projecto colaborativo dos participantes na comunidade P@P dentro do frum, herdou o mesmo foco, o mesmo pblico e o mesmo esprito: a partilha de conhecimentos sobre programao entre falantes da lngua de Cames. Foi com este esprito, de quem tem algo para dar sem esperar receber nada em troca, que a revista foi evoluindo e coleccionando vrios sucessos. Nmero aps nmero o feedback que nos ia chegando era cada vez melhor e mais positivo. Foram aparecendo pedidos sobre artigos, passmos alm fronteiras, melhormos o visual, tornmo-nos mais exigentes dentro da prpria equipa e trabalhmos sempre com A Revista Programar vossa. afinco em cada edio. Como sempre, o sucesso trouxe responsabilidades acrescidas. Se o nmero de leitores cresceu significativamente, o mesmo no aconteceu com o nmero de colaboradores, com enfoque particular no nmero de autores. O nmero de artigos propostos e entregues estagnou, ou diminuiu mesmo em algumas edies, e em alguns casos a qualidade dos mesmos levou sua rejeio. No necessrio dizer o bvio: sem autores no h artigos e sem artigos com qualidade no h revista. neste contexto que assumo a responsabilidade de colaborador da Revista Programar a partir deste nmero, acumulando assim este papel com o de revisor que j exercia. E neste contexto que assumo, com toda a equipa da revista, este desafio. E neste contexto que venho fazer um apelo de ajuda comunidade P@P. Necessitamos de contedo com qualidade para as prximas edies, sob pena de no haver prximas edies. Apelo assim a todos quantos tm artigos escritos que os partilhem connosco. Todos quantos querem ajudar mas no tm tema, contactem-nos, temos pedidos de artigos mas no temos quem os escreva. Creio no estar errado quando afirmo que no existe nenhuma revista centrada na programao e orientada para a comunidade de lngua Portuguesa que tenha um esprito to altrusta como a Revista Programar. A Revista Programar vossa. Existe para todos vocs. Mas s existir se houver quem faa a revista. Vem ajudar-nos a fazer a tua revista de programao favorita. Fernando Martins

10 14
18

a programar

- LUA - Linguagem de Programao - Parte II - LUA - Linguagem de Programao - Parte III - Programao funcional em Python

equipa PROGRAMAR coordenadores


Joel Ramos Pedro Abreu Fernando Martins

editor capa

Antnio Silva

Srgio Alves

redaco

Augusto Manzano David Ferreira Diogo Jnior Jorge Paulino

Existe para todos vocs. Mas s existir se houver quem faa a revista.

equipa de reviso
Bruno Oliveira Fernando Martins Miguel Rentes

equipa de divulgao
David Ferreira

contacto

revistaprogramar @portugal-a-programar.org

website issn

www.revista-programar.info

1647-0710

<2>

notcias/links
Windows Phone Series 7
http://www.windowsphone7series.com/ A MIcrosoft apresentou no Mobile World Congress o novo Windows Phone Series 7, e prev a a sua estreia para o final de 2010. Concorrentes como o Android, esperam para ver se este ser um salto nos sistemas operativos da Microsoft para smartphones capaz concorrer qualitativamente com eles.

Google Buzz
http://www.google.com/buzz A Google lanou o Google Buzz, um servio que permite partilhar actualizaes de estado, fotos, links entre outras, utilizando parte da interface do Gmail. Apesar de tudo j se ouviram vrias vozes contra este servio, e que levaram a prpria Google a fazer alteraes ao Buzz, e permitir que o mesmo fosse configurado e desactivado de maneira mais fcil, devido a questes de privacidade.

Firefox comea a chegar aos telemveis

http://www.mozilla.com/en-US/mobile/ Apesar de ainda estar disponivel para um nmero limitado de plataformas, o Firefox Mobile j pode ser descarregado no site da Mozilla.

Google Chrome 4 lanado

http://www.google.com/chrome Foi lanada a verso 4 do browser da Google para a plataforma Windows que inclui entre outras funcionalidades a capacidade de sincronizar marcadores, apesar da Google afirmar ter mais de 1500 novas funcionalidades, ns no o pudemos comprovar.

Microsoft TechDays 2010


J pblico o prximo grande evento tcnico da Microsoft. destinado a todos os profissionais que trabalham em tecnologias de informao, sejam ligados administrao de sistemas, desenvolvimento de software, gesto de projecto ou de departamentos de sistemas de informao. Este ano ir decorrer nos dias 20,21 e 22 de Abril, com mais de 40 oradores e sobre diversas tecnologias como Visual Studio, Silverlight, WPF, Exchange, SQL Server, Windows 7, Sharepoint, etc. At dia 5 de Maro, Early Bird, o preo da inscrio de 150, sendo 225 aps essa data. Um evento a no perder! http://www.techdays2010.com

A Revista PROGRAMAR errou: Devido a um erro de edio o artigo Lua - 2 Parte da edio anterior no foi correctamente colocado, e como tal vem nesta edio a sua verso corrigida. A todos os intervenientes as nossas desculpas.

<3>

snippets - vb.net

VS2010: Auto-Implemented Properties


As Auto-Implemented Properties so uma forma simples e rpida de definir uma propriedade, sem a utilizao do Get e Set. Esta opo j estava disponvel no C# 3.0 e passou agora a fazer parte do VB10.

Public Property myProp As String 'Em vez de(expanded property): Private _myPror As String Public Property myPror() As String Get Return _myPror End Get Set(ByVal value As String) _myPror = value End Set End Property

No entanto pode-se sempre usar o mtodo normal(expanded property), caso seja necessrio adicionar cdigo nos mtodos Get e Set, caso seja uma propriedade WriteOnly ou ReadOnly, etc. Quando definida uma auto-implemented property, criado internamente (no visvel) um backing field, ou seja, se a propriedade for designada como myProp, ser criada uma varivel _myProp. Isto quer dizer, que se tentarmos criar uma varivel com o mesmo nome, iremos ter o seguinte erro: property myProp implicitly defines _myProp, which conflicts with a member of the same name in class Form1' Podemos ainda inicializar a propriedade por mais complexa que seja a expresso:

Public Public Public Public

Property Property Property Property

myProp1 As String = "programar" myProp2 As Integer = 123 myProp3 As List(Of Integer) = Enumerable.Range(0, 20).ToList myProp4() As String = New String({"a", "b", "c"})

<4>

snippets - vb.net

VS2010 : Implicit Line Continuation


Quando uma linha de cdigo demasiado extensa, necessrio muitas vezes saltar de linha, de modo a que o cdigo fique todo visvel e seja mais simples de interpretar. Para o fazer usado um _ (underscore):

MessageBox.Show("Isto um teste", _ My.Application.Info.Title, _ MessageBoxButtons.OK, _ MessageBoxIcon.Warning) Ora isto algo que no Visual Studio 2010 deixou de ser necessrio, podendo agora ser utilizado:

MessageBox.Show("Isto um teste", My.Application.Info.Title, MessageBoxButtons.OK, MessageBoxIcon.Warning) Obviamente que isto no pode ser efectuado em todas as situaes, pois o compilador precisa de saber identificar se estamos a saltar de linha ou a iniciar uma nova instruo. Estas so algumas das situaes onde possvel o fazer: Aps uma virgula , Aps um parntese aberto ( ou antes de um fechado ) Aps uma chaveta recta { ou antes de uma chaveta recta } Aps uma concatenao & Aps uma atribuio =, &=, :=, +=, -=, *=, /=, \=, =, <<=, >>= Aps um operador binrio +, -, /, *, Mod, <>, <, >, <=, >=, , >>, <<, And, AndAlso, Or, OrElse, Like, Xor Aps um operador Is ou IsNot Entre muitas outras situaes, como LINQ, XML Literals, etc.

<5>

a tua pgina

No te esqueas, esta pgina pode ser tua! http://www.revista-programar.info/front/yourpage

<6>

tema de capa
Ferramentas usadas para desenvolver aplicaes

Introduo Programao para Android

O que o Android?
O Android um sistema operativo para dispositivos mveis desenvolvido por um consrcio de 50 empresas denominado Open Handset Alliance. Deste consrcio fazem parte empresas como a Google, HTC, Motorola, Intel, Samsung, LG, entre outras, unidas com o objectivo principal de desenvolver novas normas abertas para dispositivos mveis. O primeiro projecto opensource a ser criado por este consrcio foi efectivamente o Android. A apresentao ao pblico do Android ocorreu em 5 de Novembro de 2007 e o cdigo foi distribudo com uma licena Apache 2.0 e GPLv2. Para ser possvel aos programadores desenvolverem aplicaes que utilizam as capacidades do Android, disponibilizado um SDK que permite a criao de aplicaes utilizando a linguagem de programao Java. As aplicaes escritas em Java so executadas pela Dalvik Virtual Machine que uma implementao de uma Virtual Machine desenhada e optimizada para dispositivos mveis. As aplicaes podem utilizar vrias funcionalidades disponibilizadas pela API existentes na plataforma Android. Algumas dessas funcionalidades so dependentes do hardware.

Para desenvolver aplicaes necessrio fazer download do SDK do site do Android (http://android.com), e de preferncia ter o IDE Eclipse (http://www.eclipse.org/) instalado e configurado para desenvolver aplicaes em Java. Para este IDE existe um plugin que permite uma maior rapidez e eficcia no desenvolvimento de aplicaes. O plugin que d pelo nome de Android Development Tools (ADT) tambm precisa de ser descarregado do site do Android e pode ser instalado atravs do gestor de software do eclipse. Caso existam dificuldades na instalao, no link seguinte esto detalhados todos os passos que devem ser seguidos para a instalao e configurao do SDK e IDE: http://developer.android.com/sdk/index.html

Criar uma aplicao para Android


O primeiro passo para a criao de uma aplicao a criao de um novo projecto Android no eclipse atravs do wizard. Depois de se indicar o nome do projecto, nome da aplicao e o package da mesma, criado um projecto com uma aplicao Hello World que serve de base para a criao da aplicao que se pretende desenvolver. Nesta base criada pelo wizard, est presente todo o esqueleto de directorias e ficheiros que so necessrios para a aplicao.

Funcionalidades:
Framework de aplicaes - permite a reutilizao e substituio de componentes Dalvik virtual machine - mquina virtual optimizada para dispositivos mveis Browser Integrado - baseado no motor de cdigo aberto WebKit Grficos Optimizados - suportado por uma biblioteca grfica 2D e de grficos 3D (OpenGL ES 1.0) SQLite - para armazenamento de dados estruturados Suporte Media - suporte comum para udio, vdeo e imagem GSM - (dependente do hardware) Bluetooth, EDGE, 3G, e WiFi - (dependente do hardware) Camera, GPS, bssola e acelermetro (dependente do hardware)

Fig.1- Directorias e ficheiros de uma aplicao Dentro da directoria src esto presentes os ficheiros com o cdigo Java da aplicao. Estes ficheiros encontram-se organizados e distribudos segundo a estrutura dos packages de Java que a aplicao possui.

<7>

tema de capa
J na directoria res podem ser encontradas trs novas directorias. A directoria drawable onde so colocados todos os recursos que estejam relacionados com imagem. nesta directoria que devem ser adicionadas todas as imagens que se pretende usar na aplicao, como por exemplo: fundos, cones, etc.. Na directoria layout so guardados todos os layouts que a aplicao pode utilizar. Um layout um simples ficheiro xml que contm a estrutura e os elementos que vo ser mostrados pela aplicao. Nestes ficheiros possvel definir os elementos disponibilizados pela plataforma Android (como TextViews, EditText, etc) que se pretende incorporar na aplicao assim como as propriedades de cada um desses elementos com vista a criar o design que se pretende obter na aplicao. relevncia a lngua utilizada no dispositivo, mas sim a orientao em que o dispositivo se encontra. Como normalmente os ecrs dos dispositivos no so quadrados, isto obriga a que sejam criados layouts diferentes e a utilizao de imagens diferentes para a execuo da aplicao em landscape ou portrait. Para isso apenas precisamos separar os diferentes layouts e imagens especficas para cada uma das orientaes nas directorias layout, layout-land, drawable-port e drawable-land. A ltima directoria que necessita de ser referenciada a directoria gen, onde est disponvel o ficheiro R.java que contm uma referncia para todos os recursos existentes na aplicao assim como todos os recursos criados. Este ficheiro criado automaticamente cada vez que a aplicao compilada. De salientar tambm que este ficheiro que permite agilizar o processo de referncia, integrao e utilizao de todos os recursos existentes nas directorias mencionadas previamente, na aplicao. O nico ficheiro comum destas directorias um ficheiro xml com o nome AndroidManifest. Neste ficheiro onde so indicadas todas as caractersticas da aplicao. Desde a verso, nome e icon da aplicao, at s permisses que a aplicao precisa para utilizar os recursos do dispositivo.

Fig. 2 Exemplo do contedo do layout da aplicao Hello World Dentro da directoria values devem ser guardados todos os valores constantes que a aplicao vai utilizar. Um exemplo desses valores, so todas as strings usadas na aplicao. Assim, possvel guardar todas as strings usadas na aplicao dentro do ficheiro strings.xml e usa-las na aplicao simplesmente usando uma referncia. Com esta organizao torna-se fcil para o programador fazer uma internacionalizao/localizao de uma aplicao. Deste modo tambm possvel que o sistema operativo defina a lngua a utilizar na aplicao que mais se adequa ao idioma do utilizador. Esta funcionalidade conseguida atravs da indicao de especificaes nas directorias. Basicamente se o programador tiver a aplicao disponvel em duas lnguas, como por exemplo Ingls e Portugus, apenas necessita de criar duas pastas: values-en e values-pt, e quando a aplicao estiver em execuo num dispositivo configurado com lngua Portuguesa, a aplicao ir ser executada usando as strings contidas no ficheiro strings.xml dentro da directoria values-pt. O mesmo efeito pode ser conseguido com os layouts e imagens a usar na aplicao. Neste caso no tem tanta

Fig. 3 Exemplo do contedo do ficheiro AndroidManifest.xml

Onde tudo comea!


Quando uma aplicao entra em execuo, o primeiro mtodo a ser chamado o mtodo onCreate disponibilizado pela classe Activity. Uma aplicao tem de ser constituida pelo menos por uma activity. No fundo uma activity pode ser associada visualmente, ao ecr que se visualiza quando essa activity est em execuo. A criao de mais que uma activity permite que uma aplicao seja dividida em mdulos(normalmente esto associadas aos casos de

<8>

tema de capa
utilizao), e sejam criadas vrias activities que compem a aplicao e que podem inclusive permitir a reutilizao destas por aplicaes externas. emulador que permite ao programador verificar e testar a aplicao.

Fig. 4 Cdigo da classe que implementa a Activity Para criar uma activity necessrio criar uma classe que estende da classe Activity dentro do package criado pelo wizard e com o nome que pretendemos. Nesta classe extremamente importante a criao e indicao de dois mtodos: A implementao do mtodo onCreate que deve fazer Override ao j implementado pela classe Activity. E a chamada do mtodo setContentView, dentro do mtodo onCreate, indicando qual o layout definido na pasta layout que a activity vai mostrar no ecr. A partir daqui, depois de ser chamado o mtodo setContentView, o programador deve tomar conta da aplicao e implementar a lgica de negcio / ou requisitos que pretender. Existem muitos outros mtodos que a classe activity implementa que permitem aceder a um conjunto vasto de funcionalidades da plataforma Android e que podem ser utilizados pelo programador. Para o programador testar a aplicao, o SDK disponibiliza um Fig. 5 Emulador a correr a aplicao

Procurar Ajuda
Numa fase inicial os programadores de aplicaes Android tm bastantes recursos onde encontrar ajuda. A melhor referncia que os programadores podem seguir quando esto a desenvolver, a pgina que disponibilizada pelo Android (http://developer.android.com/) onde podem ser encontrados guias, documentao da API e exemplos. Para alm disso, pode ser encontrada ajuda no google-groups de programadores de Android (http://developer.android.com/resources/communityg r o u p s . h t m l ), no stackoverflow (http://stackoverflow.com/questions/tagged/android), no IRC (canal #android e #android-dev no host irc.freenode.net) e tambm no twitter (http://twitter.com/androiddev). Em portugal tambm existe uma comunidade portugesa de Android onde se pode encontrar ajuda e alguma documentao e bastantes e bons artigos sobre Android(http://androidpt.com/).

O Diogo estuda actualmente na Faculdade de Engenharia da Universidade do Porto, e est no seu 5 ano. Desde Junho de 2008 que tem tambm trabalhado como programador no Instituto de Investigao Fraunhofer Portugal, onde tem criado, para alm de outras coisas, vrias aplicaes para o Android. um entusiasta das tecnologias abertas e adora o Linux. diogo.junior@portugal-a-programar.org

Diogo Jnior
<9>

a programar
Simbolo = <> > < >= <= Significado igual a diferente de maior que menor que maior ou igual que menor ou igual que

LUA - Linguagem de Programao - Parte 2

Os operadores relacionais possuem a mesma prioridade. Assim sendo, no h necessidade de se preocupar em alterar a sua prioridade quando a utilizar numa expresso lgica. No primeiro artigo desta srie foram apresentadas informaes sobre o uso inicial da linguagem de programao Lua. Foram ento abordados pontos relacionados com o desenvolvimento da linguagem, sua aquisio e exemplos de programao sequencial. Neste artigo ser enfatizada a programao com tomada de deciso.

Desvio Condicional Simples


Para se fazer uso de tomada de deciso com desvio condicional simples necessrio fazer uso de instruo: if (condio) then [bloco] end que possui a sintaxe: if (condio) then bloco de aco end instrues executadas aps condio ser falsa ou aps a execuo do bloco de aco quando a condio for verdadeira. Se condio for verdadeira, ento sero executadas todas as instrues definidas na rea de bloco de aco que estiver entre if (condio) then e end. Se condio for falsa o bloco de aco no ser executado transferindo a execuo do programa para aps end. No sentido de exemplificar este tipo de aco, o programa seguinte efectua a leitura de dois valores inteiros, e apresenta os valores por ordem crescente. Considere ento o seguinte cdigo: -- inicio do programa COND1 io.write("Entre 1o. valor: ") A = io.read("*number") io.write("Entre 2o. valor: ") B = io.read("*number") if (A > B) then A, B = B, A end io.write("Os valores sao: "); print(A .. " e " .. B); -- fim do programa COND1

Decises e Condies
Na sua forma mais ampla, deciso o acto ou efeito de decidir, de deliberar, de julgar, de tomar uma deciso. Para uma deciso ser tomada esta necessita estar calcada sobre uma proposio, que na esfera da rea da computao tratada como sendo uma condio. A condio por sua natureza prpria o estado ou a situao de algo. Dentro da esfera computacional pode-se dizer que condio a relao lgica entre os elementos que formam a proposio para a tomada de uma deciso e que a resposta da tomada de uma deciso poder ser verdadeira ou falsa. A relao lgica entre esses elementos ocorre sob dois aspectos: Varivel versus varivel; Varivel versus constante. A forma para se estabelecer uma relao lgica permitida conseguida com o uso de operadores relacionais.

Operadores Relacionais
Os operadores relacionais so ferramentas responsveis por permitir a definio da relao entre elementos que formam uma condio, qual ser utilizada para a execuo do processo de tomada de uma deciso. A tabela seguinte apresenta os operadores relacionais que podem ser utilizados com a linguagem Lua.

<10>

a programar
Pode escrever o cdigo do programa anterior num editor de texto da sua preferncia, grave-o com o nome condicao01.lua e execute-o atravs da linha de comandos: lua 5.1 condicao01.lua. Em seguida escreva o cdigo de programa anterior num editor de texto de sua preferncia, gravando-o com o nome condicao02.lua. Posteriormente execute-o com a linha de comando lua 5.1 condicao02.lua.

Desvio Condicional Composto


Para se utilizar a tomada de deciso com desvio condicional composto necessrio utilizar a instruo: if (condio) then [bloco1] else [bloco2] end, que possui a sintaxe: if (condio) then bloco de aco 1 else bloco de aco 2 end instrues executadas aps condio ser verdadeira ou condio ser falsa Se a condio for verdadeira, ento sero executadas todas as instrues definidas na rea de bloco de aco que estiver entre if (condio) then e else, ou seja, as instrues definidas no bloco de aco 1. Caso a condio seja falsa sero executas todas as instrues que estejam definidas na rea de bloco de aco que esteja contida entre else e end, ou seja, as instrues que estejam definidas no bloco de aco 2. Aps a execuo de um desvio condicional composto a execuo do programa continua aps end. No sentido de exemplificar este tipo de aco o programa seguinte efectua a leitura de duas notas escolares, calcula a mdia aritmtica das notas e apresenta a mensagem Aprovado caso a condio seja maior ou igual a 5. Se a condio for menor que 5 apresenta a mensagem Reprovado. Junto de cada mensagem ser apresentado o valor da mdia. -- inicio do programa COND2 io.write("Entre 1a. nota: ") N1 = io.read("*number") io.write("Entre 2a. nota: ") N2 = io.read("*number") MD = (N1 + N2) / 2 if (MD >= 5) then io.write("Aprovado, ") else io.write("Reprovado, ") end print(string.format("%5.2f", MD)) -- fim do programa COND2

Desvio Condicional Sequencial


Para se fazer uso de tomada de deciso com desvio condicional sequencial necessrio utilizar a instruo: if (condio1) then [bloco1] e lse if (condio2) then [bloco2] ... e lse if (condioN) then [blocoN] e lse [blocoN+1] end, que possui a sintaxe: if (condio1) then bloco de aco 1 elseif (condio2) then bloco de aco 2 (...) elseif (condioN) then bloco de aco N else bloco de aco N + 1 end instrues executadas aps condio sequencial ser executada Se condio1 for verdadeira, ento sero executadas as instrues que estejam posicionadas na rea de bloco de aco entre if (condio1) then e elseif (condio2) then, ou seja, as instrues definidas no bloco de aco 1. Se condio2 for falsa, ento sero executadas as instrues que estejam posicionadas na rea de bloco de aco entre if (condio2) then e elseif (condioN) then e assim sucessivamente. No sendo as condies verdadeiras, sero executadas as instrues existentes entre else e end definidas como bloco de aco N+1. No sentido de exemplificar este tipo de aco o programa seguinte efectua a leitura de um valor numrico entre 1 e 12, correspondente ao nome do ms do ano de um calendrio.

-- inicio do programa COND3 io.write("Entre valor: ") N = io.read("*number") if (N == 1) then print("Janeiro") elseif (N == 2) then print("Fevereiro") elseif (N == 3) then print("Marco") elseif (N == 4) then print("Abril")

<11>

a programar
elseif (N == 5) then print("Maio") elseif (N == 6) then print("Junho") elseif (N == 7) then print("Julho") elseif (N == 8) then print("Agosto") elseif (N == 9) then print("Setembro") elseif (N == 10) then print("Outubro") elseif (N == 11) then print("Novembro") elseif (N == 12) then print("Dezembro") else print("Mes invalido") end -- fim do programa COND3 O operador and faz com que o resultado lgico seja verdadeiro quando todas as condies envolvidas na deciso forem tambm verdadeiras, gerando assim um resultado lgico verdadeiro. No sentido de exemplificar este tipo de aco o programa seguinte efectua a leitura de um valor numrico entre 1 e 9 e apresenta a mensagem informando se o valor est no -- inicio do programa COND4 io.write("Entre numero: ") N = io.read("*number") if (N >= 1) and (N <= 9) then print("Valor na faixa de 1 a 9") else print("Valor fora da faixa") end -- fim do programa COND4 intervalo 1 a 9 ou se est fora dessa faixa de valores. O exemplo anterior mostra, a utilizao do operador de conjuno and, que somente permitir a apresentao da mensagem: Valor na faixa de 1 a 9, caso o valor fornecido para a varivel N esteja entre 1 e 9. Qualquer valor fornecido fora da faixa definida apresentar a mensagem: Valor fora da faixa. O operador lgico de disjuno or utilizado quando pelo menos um dos relacionamentos lgicos de uma deciso necessita de ser verdadeiro para se obter um resultado lgico verdadeiro; caso contrrio, o valor do resultado lgico retornado ser falso. A tabela-verdade para o operador lgico or, considerando o uso de duas condies, pode retornar um dos seguintes resultados lgicos: Condio 1 Falsa Verdadeira Falsa Verdadeira Condio 2 Falsa Falsa Verdadeira Verdadeira Resultado Falso Verdadeiro Verdadeiro Verdadeiro

Operadores Lgicos
Existem ocasies em que necessrio trabalhar com o relacionamento de duas ou mais condies ao mesmo tempo para a tomada de uma nica deciso. Para esses casos necessrio proceder utilizao dos operadores lgicos. Os operadores lgicos utilizados com a linguagem Lua so trs: and (operador lgico de conjuno), or (operador lgico de disjuno) e not (operador lgico de negao). Em alguns casos, o uso de operadores lgicos evita a utilizao de muitas condies if...then encadeados. O nvel de prioridade entre operadores lgicos obedece a seguinte ordem: or, and e not. O operador lgico de conjuno and utilizado quando dois relacionamentos lgicos de uma deciso necessitam ser verdadeiros para obter um resultado lgico verdadeiro; caso contrrio, o resultado do valor lgico retornado ser falso. A tabela-verdade para o operador lgico and, considerando o uso de duas condies, pode retornar um dos seguintes resultados lgicos:

O operador or faz com que o resultado lgico seja verdadeiro quando pelo menos uma das condies envolvidas na deciso for verdadeira, fornecendo um resultado lgico verdadeiro. No sentido de exemplificar este tipo de aco o programa seguinte efectua a leitura do sexo biolgico de um ser humano e apresenta uma mensagem informando se o sexo fornecido ou no vlido..

Condio 1 Falsa Verdadeira Falsa Verdadeira

Condio 2 Falsa Falsa Verdadeira Verdadeira

Resultado Falso Falso Falso Verdadeiro

<12>

a programar
-- inicio do programa COND5 io.write("Entre seu sexo: ") S = io.read() if (S == "m") or (S == "f") then print("Sexo valido") else print("Sexo invalido") end -- fim do programa COND 5 O exemplo acima demonstra a utilizao do operador lgico or, que somente permite a apresentao da mensagem Sexo vlido, caso o valor fornecido para a varivel S seja m ou f. Qualquer outro valor fornecido apresentar a mensagem Sexo invalido. Condio Falsa Verdadeira Resultado No Falso No Verdadeiro O operador not faz com o resultado lgico de uma determinada deciso seja invertido. No sentido de exemplificar este tipo de aco o programa seguinte efectua a leitura de um valor numrico e apresenta o valor, informado caso este valor no seja menor que 3. -- inicio do programa COND6 io.write("Entre um numero: ") NUMERO = io.read("*number") if not (NUMERO <= 3) then print( NUMERO) end -- fim do programa COND6

Concluso
Neste artigo foi dado nfase nas aces de processamento lgico baseado em tomada de deciso por meio de desvio condicional simples, composto e sequencial, alm do uso dos operadores relacionais e lgicos. No prximo artigo ser tratado as questes relacionadas ao uso dos laos de repetio.

O operador lgico not utilizado quando se necessita de estabelecer a inverso do valor de um determinado resultado lgico de uma deciso. possvel obter valores: no verdadeiro e no falso. O operador lgico not inverte o resultado lgico de uma condio. A tabela-verdade para o operador lgico not, que utilizado posteriormente a uma condio, pode retornar um dos seguintes resultados lgicos:

Natural da Cidade de So Paulo, Augusto Manzano tem experincia em ensino e desenvolvimento de programao de software desde 1986. professor da rede federal de ensino no Brasil, no Instituto Federal de Educao, Cincia e Tecnologia. tambm autor, possuindo na sua carreira vrias obras publicadas na rea da computao. augusto.manzano@portugal-a-programar.org

Augusto Manzano

<13>

a programar
permitido executar o trecho de instrues subordinado condio em uso. A utilizao do teste lgico no incio do lao conseguida na linguagem LUA por meio da instruo: while (condio) do [bloco] end. Esta estrutura pode executar um certo conjunto de instrues, enquanto a condio permanecer verdadeira. No momento em que essa condio se torna falsa, o processamento da rotina desviado para fora do lao. Sendo a condio falsa logo no incio do lao, as instrues contidas dentro do lao so ignoradas. Esta instruo deve ser escrita: while (condio) do instrues executadas enquanto a condio for verdadeira end instrues executadas aps o trmino do lao Como exemplo de uso de lao com condio do tipo prteste simulando um lao do tipo iterativo, considere o desenvolvimento de um programa que apresente como resultado a tabuada de um nmero qualquer. -- inicio do programa LACO 1 io.write("Entre um valor numerico: ") N = io.read("*number") I = 1 while (I <= 10) do R = N * I io.write(string.format("%2d", N)) io.write(" X ") io.write(string.format("%2d", I)) io.write(" = ") io.write(string.format("%3d", R), "\n") I = I + 1 end -- fim do programa LACO 1

LUA - Linguagem de Programao - Parte 3

No segundo artigo desta srie foram apresentadas informaes sobre o uso do mecanismo de tomadas de deciso. Foi abordado o tema sobre a questo deciso e condio, sobre o uso dos operadores lgicos/relacionais, alm da apresentao sobre desvios simples e compostos. Neste artigo ser a vez do tema relacionado ao uso de laos de repetio.

Laos de Repetio
A tcnica de uso lao de repetio tema importante em qualquer das linguagens de programao existentes, pois torna-se necessrio efectivar a aco contnua e controlada de um determinado trecho de cdigo de programa. conhecido que os laos de repetio em algumas linguagens de programao podem efectuar basicamente trs tipos de operaes de repetio (h outras linguagens que possuem at mais de trs formas). Os laos de repetio podem ser efectivados de duas maneiras: forma interactiva ou forma iterativa. Laos de repetio interactivos caracterizam-se por serem controlados por condies, podendo possuir a interferncia de um utilizador; j laos iterativos so controlados por definio e uso de varivel de controlo. A linguagem de programao LUA faz uso de trs laos de repetio, sendo interactivos os laos construdos com os comandos while e repeat; laos iterativos so criados por meio do comando for. Os laos interactivos so classificados em duas categorias, sendo laos do tipo pr-teste (quando a condio de controlo definida no incio do lao) e ps-teste (quando a condio de controlo definida no fim do lao).

Em seguida escreva o cdigo do programa anterior num editor de texto de sua preferncia, gravando-o com o nome laco01.lua e execute-o com a linha de comando lua 5.1 laco01.lua. Imagine outra situao, em que o utilizador deseja executar o programa de tabuada vrias vezes, mas no sabe, ao certo, quantas vezes deve repetir o trecho de programa. Neste caso, observe o exemplo seguinte, no qual se faz uso do

Lao Pr-Teste
A estrutura de lao pr-teste realiza o teste lgico no incio do lao, antes de executar alguma aco verificando se

<14>

a programar
contexto de aplicao do lao interactivo: -- inicio do programa LACO 2 RESP = 1 while (RESP == 1) do io.write("Entre um valor numerico: ") N = io.read("*number") I = 1 while (I <= 10) do R = N * I io.write(string.format("%2d", N)) io.write(" X ") io.write(string.format("%2d", I)) io.write(" = ") io.write(string.format("%3d", R), "\n") I = I + 1 end io.write("Nova tabuada? [1] - Sim ou [2] - Nao: ") RESP = io.read("*number") end -- fim do programa LACO 2 desenvolvimento de um programa que tambm apresente como resultado a tabuada de um nmero qualquer. Em seguida escreva o cdigo do programa anterior num -- inicio do programa LACO 3 io.write("Entre um valor numerico: ") N = io.read("*number") I = 1 repeat R = N * I io.write(string.format("%2d", N)) io.write(" X ") io.write(string.format("%2d", I)) io.write(" = ") io.write(string.format("%3d", R), "\n") I = I + 1 until (I > 10) -- fim do programa LACO 3

editor de texto de sua preferncia, gravando-o com o nome laco03.lua e execute-o com a linha de comando lua 5.1 laco03.lua. Imagine outra situao, em que o utilizador deseja executar o programa de tabuada vrias vezes, mas no sabe, ao certo, quantas vezes deve repetir o trecho de programa. Neste caso, observe o exemplo seguinte: -- inicio do programa LACO 4 repeat io.write("Entre um valor numerico: ") N = io.read("*number") I = 1 repeat R = N * I io.write(string.format("%2d", N)) io.write(" X ") io.write(string.format("%2d", I)) io.write(" = ") io.write(string.format("%3d", R), "\n") I = I + 1 until (I > 10) io.write("Nova tabuada? [1] - Sim ou [2] - Nao: ") RESP = io.read("*number") until (RESP = 1) -- fim do programa LACO 4

Em seguida escreva o cdigo de programa anterior num editor de texto de sua preferncia, gravando-o com o nome laco02.lua e execute-o com a linha de comando lua 5.1 laco02.lua.

Lao Ps-Teste
A estrutura de lao ps-teste realiza o teste lgico no final do lao, executando o trecho de instrues at que a condio do lao se torne verdadeira. A utilizao de teste lgico no final do lao conseguida com a instruo: repeat [bloco] until (condio). A estrutura repeat...until controlada por deciso, porm esse tipo de lao utiliza um conjunto de instrues pelo menos uma vez antes de verificar a validade da condio estabelecida. A instruo repeat...until deve ser escrita: repeat instrues executadas at que a condio seja verdadeira until (condio) instrues executadas aps o trmino do lao Como exemplo de uso deste tipo de lao, considere o

<15>

a programar
Em seguida escreva o cdigo de programa anterior num editor de texto de sua preferncia, gravando-o com o nome laco04.lua e execute-o com a linha de comando lua 5.1 laco04.lua. -- inicio do programa LACO 5 io.write("Entre um valor numerico: ") N = io.read("*number") for I = 1, 10, 1 do R = N * I io.write(string.format("%2d", N)) io.write(" X ") io.write(string.format("%2d", I)) io.write(" = ") io.write(string.format("%3d", R), "\n") end -- fim do programa LACO 5 Em seguida escreva o cdigo de programa anterior num editor de texto de sua preferncia, gravando-o com o nome laco05.lua e execute-o com a linha de comando lua 5.1 laco05.lua.

Lao com Varivel de Controlo


Foram apresentadas duas formas de se definir e usar laos condicionais, uma usando o lao while...do...end e a outra usando o lao repeat...until. Esses dois tipos de lao permitem elaborar programas que venham a executar um trecho do programa um determinado nmero de vezes. No entanto, existe na linguagem de programao LUA uma terceira maneira de se representar laos. Trata-se do lao: for (contador) do [bloco] end. Os laos de repetio que possurem um nmero finito de execues, caracterizando-se em laos iterativos podem ser efectivados pelo uso da instruo: for...do...end, que controlado por uma varivel de controlo do tipo contador, podendo ser crescente ou decrescente, tendo como sintaxe para lao crescente: for <varivel> := <inicio>, <fim>, <incremento> do instrues executadas dentro do lao end instrues executadas aps concluso do lao Como exemplo de uso, considere o desenvolvimento de um programa que apresente como resultado a tabuada de um nmero qualquer.

Concluso
Neste artigo foi dado ateno as aces de processamento baseadas no uso dos laos de repetio interactivos e iterativos. No prximo artigo sero tratadas as questes relacionadas com o uso de variveis indexadas.

Natural da Cidade de So Paulo, Augusto Manzano tem experincia em ensino e desenvolvimento de programao de software desde 1986. professor da rede federal de ensino no Brasil, no Instituto Federal de Educao, Cincia e Tecnologia. tambm autor, possuindo na sua carreira vrias obras publicadas na rea da computao. augusto.manzano@portugal-a-programar.org

Augusto Manzano

<16>

<17>

a programar
so abstractas, e podem ser usadas em qualquer lado. Para as funes descritas a seguir, vou usar funes annimas, mas poderia usar igualmente funes normais. Se no conhece as funes annimas em Python, os seguintes blocos de cdigo so equivalentes (o primeiro usa funes annimas, o segundo as funes ditas normais): 1 Bloco transformar = lambda x, y: x**y transformar(3, 4) #isto retorna 81 O paradigma funcional um paradigma que trata a computao como uma sequncia de funes e no como uma sequncia de aces que mudam o estado do programa. Neste paradigma no h dados mutveis, tudo constante: se x definido como sendo 3, x nunca vai poder ser 4, 5 ou 6. As variveis so apenas nomes para valores (vulgo dados), e no uma caixa para o que l quisermos colocar dentro, seja uma bola azul ou amarela. Esta abordagem o que diferencia o paradigma funcional do imperativo: no paradigma funcional transforma-se valores, aplicam-se em novas situaes, no paradigma imperativo alteram-se estados (o contedo das variveis por exemplo). O Python uma linguagem que, no meu ponto de vista, extremamente flexvel, adaptando-se facilmente s nossas necessidades, e que suporta 3 paradigmas: o funcional, o imperativo e o orientado a objectos. dada uma grande nfase programao orientada a objectos (uma vez que tudo em Python so objectos e a prpria linguagem obriga a perceber a lgica da programao orientada a objectos), mas no d tanta programao funcional. Neste artigo pretendo apenas elucidar o leitor sobre alguns dos recursos disponibilizados pela linguagem para a programao no paradigma funcional e o seu funcionamento, estando a explicao/anlise da programao funcional em si fora do objectivo deste artigo. Caso esteja interessado em ler sobre a programao funcional em si, devo referir que o artigo da Wikipedia em ingls (http://en.wikipedia.org/wiki/Functional_programming) est bastante completo e um bom ponto de partida. 2 Bloco def transformar(x, y): return x**y transformar(3, 4)#isto tambm retorna 81 A vantagem do primeiro bloco de cdigo sobre o segundo o facto da funo no estar presa quele nome, ou seja, de a poder destruir quando quiser ou deixar de precisar dela, enquanto que com a definio tradicional no o consegue fazer.

Programao funcional em Python

Um outro exemplo:
1 Bloco iguais = lambda x, y: "Sim" if x == y else "Nao" iguais(54, 55) #isto retorna "Nao" 2 Bloco def iguais(x, y): if x == y: return "Sim" else: return "Nao" iguais(54, 55)#isto tambm retorna "Nao"

Funes annimas (lambda)


No Python, semelhana de outras linguagens, existem funes annimas. A vantagem das funes annimas sobre as funes normais (as definidas com o def statement) em Python (e em todas as outras linguagens que suportam funes annimas) a possibilidade de definir rotinas sem as prender a um nome, so rotinas que no tm identidade,

Sintaxe: lambda <argumentos separados por vrgulas> : <o que a funo deve retornar>

Map
O map() uma funo que recebe um ou mais objectos iterveis, e itera os objectos aplicando-lhe uma funo

<18>

a programar
definida pelo programador, retornando uma lista com os elementos modificados. Exemplo: map(lambda x: x**2, [1, 2, 3, 4, 5]) O map neste caso vai retornar uma lista com todos os elementos da lista inicial elevados ao quadrado ([1, 4, 9, 16, 25]). Podemos passar mais do que um objecto itervel, no entanto, a funo que passada ao map tem de receber tantos argumentos tantos os objectos iterveis passados ao map. Exemplo: map(lambda x, y: [x**2, str(y)], [1, 2, 3, 4, 5], [3.5, 7, 5.1, 8, a]) Neste caso, o map retornaria [[1, 3.5'], [4, 7'], [9, 5.1'], [16, 8'], [25, a]]. Uma situao que por vezes acontece passarmos objectos iterveis com um nmero diferente de elementos. Quando o map tenta aceder ao quinto elemento de 2 objectos, e um desses objectos no o possui, passado funo de controlo (a funo que passamos ao map) um None. Exemplo: map(lambda x, y, z: [x**2, str(y), z], [1, 2, 3, 4, 5], [3.5, 7, 5.1, 8, a], [True, False]) O retorno do map neste caso seria [[1, 3.5', True], [4, 7', False], [9, 5.1', None], [16, 8', None], [25, a, None]].

Filter
O filter() uma funo que faz exactamente o que o seu nome d a entender: filtra um objecto, sendo-lhe passada uma funo de controlo e o objecto a filtrar. Consoante o retorno da funo de controlo seja True ou False, o elemento do objecto ou no includo no objecto a ser retornado. Exemplo: filter(lambda x: x%2==0, [1, 2, 3, 4, 5, 6, 7]) O filter neste caso verifica se o mdulo da diviso de cada um dos elementos da lista por 2 d resto zero (ou seja, se par ou no), e se der, retorna o elemento em questo. Neste caso, o retorno seria [2, 4, 6].

Situaes onde possvel usar o filter, e as respectivas alternativas


Quando necessitamos de tirar todos os nmeros pares de uma lista filter(lambda x: x%2, lista) #sendo lista uma lista de inteiros -> [1, 2, 3] Mais uma vez, uma boa alternativa seria o uso de listas por compreenso: [x for x in lista if x%2] Ou ento um ciclo for: novaLista = [] for x in lista: if x%2: novaLista.append(x)

Situaes onde possvel usar o map, e as respectivas alternativas


Quando necessitamos de converter vrias strings numricas para inteiros: map(lambda x: int(x), lista) #sendo lista uma lista de strings numricas > ['1', '3'] Uma alternativa seria o uso de listas por compreenso: [int(x) for x in lista] Ou ento o uso do ciclo for: novaLista = [] for x in lista: novaLista.append(int(x))

Reduce
O reduce() uma funo que recebe uma funo de controlo e o objecto itervel a reduzir. A funo de controlo recebe dois argumentos: o que retornou na iterao anterior e o elemento actual do objecto. Opcionalmente, pode receber um terceiro argumento que vai ser passado funo de controlo na primeira iterao como o retorno da iterao anterior. No caso do terceiro argumento no ser passado, utilizado o primeiro elemento do objecto itervel. Exemplo: reduce(lambda x, y: x+y, [1, 2, 3, 4, 5, 6, 7, 8], 0) Isto equivalente a fazer 0+1+2+3+4+5+7+8 (o zero poderia ser outro valor, se tivesse passado o terceiro argumento), ou seja, a soma de todos os nmeros at 8. O reduce neste exemplo ir retornar 36.

<19>

a programar
Situaes onde possvel usar o reduce, e as respectivas alternativas
Calcular um factorial (neste caso, 9!) reduce(lambda x, y: x*y, range(1, 10),1) (O 1 no terceiro argumento opcional) Usando uma funo recursiva: def fact(x): if x > 1: return x*fact(x-1) else: return x fact(9) Usando um ciclo for: y = 1 for x in range(1, 10): y *= x

Zip
O zip() uma funo que recebe n objectos iterveis e gera uma lista de tuplas. Cada tupla composta pelos elementos de cada um dos objectos daquela iterao. A lista contem x tuplas de n elementos, sendo x = min(len(objecto1), len(objecto2), , len(objecton)) e n o nmero de objectos iterveis passados ao zip. Exemplo: zip([1, 2], [a, b, c], [A, B, C, D]) Neste exemplo, o zip retorna [(1, a, A), (2, b, B)].

Uma alternativa ao zip


Aqui fica uma funo que replica o comportamento do zip que recebe uma lista com todos os objectos a iterar: def zipper(x): returns = [] size = min([len(y) for y in x]) while size > 0: returns.append(tuple([y[size1] for y in x])) size -= 1 return returns[::-1]

David Ferreira um jovem apaixonado pelo mundo da informtica. Deu os seus primeiros passos na programao aos 12 anos atravs da linguagem PHP, tendo hoje conhecimentos de XHTML, JavaScript, Python, redes, e outros. um entusiasmado pelo mundo do hardware e software open-source, que o levou a explorar os sistemas GNU/Linux, com a distribuio Kurumin e depois Ubuntu. david.ferreira@portugal-a-programar.org

David Ferreira

<20>

Queres participar na Revista PROGRAMAR? Queres integrar este projecto, escrever artigos e ajudar a tornar esta revista num marco da programao nacional? Vai a

www.revista-programar.info
para mais informaes em como participar, ou ento contacta-nos por

@portugal-a-programar.org
Precisamos do apoio de todos para tornar este projecto ainda maior... contamos com a tua ajuda!

revistaprogramar

Equipa PROGRAMAR
Um projecto Portugal-a-Programar.org

<21>

Você também pode gostar