Você está na página 1de 21

<2>

editorial
ndice
3
4
7
10
14

18

notcias/links
snippets
tema de capa
-Introduo Programao
para Android
a programar
- LUA - Li nguagem de
Programao - Parte II
- LUA - Li nguagem de
Programao - Parte III
- Programao funcional em
Python
equipa PROGRAMAR
coordenadores
Joel Ramos
Pedro Abreu
Fernando Martins
editor
Antnio Silva
capa
Srgio Alves
redaco
Augusto Manzano
David Ferreira
Diogo Jnior
Jorge Paulino
equipa de reviso
Bruno Oliveira
Fernando Martins
Miguel Rentes
equipa de divulgao
David Ferreira
contacto
revistaprogramar
@portugal-a-programar.org
website
www.revista-programar.info
issn
1647-0710
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
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
A Revista Programar vossa.
Existe para todos vocs. Mas s
existir se houver quem faa a
revista.
<3>
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
s al t o nos s i s t emas
operativos da Microsoft
para smartphones capaz
concorrer qualitativamente
com eles.
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 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.
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.
<4>
VS2010: Auto-Implemented
Properties
snippets - vb.net
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.
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 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
Public Property myProp1 As String = "programar"
Public Property myProp2 As Integer = 123
Public Property myProp3 As List(Of Integer) = Enumerable.Range(0, 20).ToList
Public Property myProp4() As String = New String({"a", "b", "c"})
<5>
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):
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.
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)
MessageBox.Show("Isto um teste", _
My.Application.Info.Title, _
MessageBoxButtons.OK, _
MessageBoxIcon.Warning)
<6>
a tua pgina
No te esqueas, esta pgina pode ser tua!
http://www.revista-programar.info/front/yourpage
<7>
tema de capa
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.

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)
Ferramentas usadas para desenvolver
aplicaes

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.
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.
Introduo Programao
para Android
<8>
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.
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
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. 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
tema de capa
<9>
utilizao), e sejam criadas vrias activities que compem a
aplicao e que podem inclusive permitir a reutilizao
destas por aplicaes externas.
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
emulador que permite ao programador verificar e testar a
aplicao.
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
p r o g r a m a d o r e s d e A n d r o i d
(http://developer.android.com/resources/community-
g r o u p s . h t ml ) , n o s t a c k o v e r f l o w
(http://stackoverflow.com/questions/tagged/android), no
I RC ( canal #androi d e #androi d-dev no host
i r c . f r eenode. net ) e t ambm no t wi t t er
(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/).
tema de capa
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
<10>
LUA - Linguagem de
Programao - Parte 2
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.
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.
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.
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:
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:
Significado Simbolo
= igual a
diferente de <>
> maior que
< menor que
>= maior ou igual que
<= menor ou igual que
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.
-- 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
a programar
<11>
Pode escrever o cdigo do programa anterior num editor de
texto da sua prefernci a, grave-o com o nome
condicao01.lua e execute-o atravs da linha de comandos:
lua 5.1 condicao01.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:
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.
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 Sequencial
Para se fazer uso de tomada de deciso com desvio
condicional sequencial necessrio utilizar a instruo:
if (condio1) then [bloco1] elseif (condio2) then
[bloco2] ... elseif (condioN) then [blocoN] else
[blocoN+1] end,
que possui a sintaxe:
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.
if (condio) then
bloco de aco 1
else
bloco de aco 2
end
instrues executadas aps
condio ser verdadeira ou
condio ser falsa
-- 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
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
-- 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")
a programar
<12>
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 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
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:
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..
Verdadeira
Verdadeira
Falsa
Condio 2
Falsa Falso Falsa
Resultado Condio 1
Verdadeira Falso
Falso Falsa
Verdadeira Verdadeiro
Verdadeira
Verdadeira
Falsa
Condio 2
Falsa Falso Falsa
Resultado Condio 1
Verdadeira Verdadeiro
Verdadeiro Falsa
Verdadeira Verdadeiro
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
-- 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
a programar
<13>
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.
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:
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.
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.
No Falso Falsa
Resultado Condio
Verdadeira No Verdadeiro
-- 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
-- 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
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
a programar
<14>
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).
Lao Pr-Teste
A estrutura de lao pr-teste realiza o teste lgico no incio
do lao, antes de executar alguma aco verificando se
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:
Como exemplo de uso de lao com condio do tipo pr-
teste simulando um lao do tipo iterativo, considere o
desenvolvimento de um programa que apresente como
resultado a tabuada de um nmero qualquer.
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
-- 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
while (condio) do
instrues executadas
enquanto a condio for verdadeira
end
instrues executadas
aps o trmino do lao
a programar
<15>
contexto de aplicao do lao interactivo:
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:
Como exemplo de uso deste tipo de lao, considere o
a programar
desenvolvimento de um programa que tambm apresente
como resultado a tabuada de um nmero qualquer.
Em seguida escreva o cdigo do programa anterior num
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 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
repeat
instrues executadas at que
a condio seja verdadeira
until (condio)
instrues executadas
aps o trmino do lao
-- 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
-- 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
<16>
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.
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:
Como exemplo de uso, considere o desenvolvimento de um
programa que apresente como resultado a tabuada de um
nmero qualquer.
a programar
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.
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.
for <varivel> := <inicio>, <fim>,
<incremento> do
instrues executadas
dentro do lao
end
instrues executadas
aps concluso do lao
-- 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
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
<17>
<18>
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.
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,
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
2 Bloco
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.
Um outro exemplo:
1 Bloco
2 Bloco
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
a programar
Programao funcional
em Python
transformar = lambda x, y: x**y
transformar(3, 4) #isto retorna 81
def transformar(x, y):
return x**y
transformar(3, 4)#isto tambm retorna 81
iguais = lambda x, y: "Sim" if x == y
else "Nao"
iguais(54, 55) #isto retorna "Nao"
def iguais(x, y):
if x == y:
return "Sim"
else:
return "Nao"
iguais(54, 55)#isto tambm retorna "Nao"
<19>
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]].
Situaes onde possvel usar o map, e as
respectivas alternativas
Quando necessitamos de converter vrias strings numricas
para inteiros:
Uma alternativa seria o uso de listas por compreenso:
Ou ento o uso do ciclo for:
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
Mais uma vez, uma boa alternativa seria o uso de listas por
compreenso:
Ou ento um ciclo for:
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.
map(lambda x: int(x), lista) #sendo
lista uma lista de strings numricas -
> ['1', '3']
[int(x) for x in lista]
novaLista = []
for x in lista:
novaLista.append(int(x))
filter(lambda x: x%2, lista) #sendo
lista uma lista de inteiros -> [1, 2,
3]
[x for x in lista if x%2]
novaLista = []
for x in lista:
if x%2:
novaLista.append(x)
<20>
a programar
Situaes onde possvel usar o reduce, e as
respectivas alternativas
Calcular um factorial (neste caso, 9!)
(O 1 no terceiro argumento opcional)
Usando uma funo recursiva:
Usando um ciclo for:
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:
reduce(lambda x, y: x*y, range(1, 10),1)
def fact(x):
if x > 1:
return x*fact(x-1)
else:
return x
fact(9)
y = 1
for x in range(1, 10):
y *= x
def zipper(x):
returns = []
size = min([len(y) for y in x])
while size > 0:
returns.append(tuple([y[size-
1] 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
<21>
Equipa PROGRAMAR
Um projecto Portugal-a-Programar.org
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
revistaprogramar
@portugal-a-programar.org
Precisamos do apoio de todos para
tornar este projecto ainda maior...
contamos com a tua ajuda!