Você está na página 1de 21

editorial

ndice
3

notcias/links

snippets

10
14
18

tema de capa

-Introduo Programao
para Android

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

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

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.

Existe para todos vocs. Mas s


existir se houver quem faa a
revista.

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.

1647-0710

Fernando Martins

<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

LUA - Linguagem de
Programao - Parte 2

Simbolo

Significado

=
<>
>
<
>=
<=

igual a
diferente de
maior que
menor que
maior ou igual que
menor ou igual que

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:

Decises e Condies

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.

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.

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.

A relao lgica entre esses elementos ocorre sob dois


aspectos:

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:

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>

-- 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
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

Desvio Condicional Sequencial

Para se utilizar a tomada de deciso com desvio condicional


composto necessrio utilizar a instruo:

Para se fazer uso de tomada de deciso com desvio


condicional sequencial necessrio utilizar a instruo:

if (condio) then [bloco1] else [bloco2] end,


que possui a sintaxe:

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 (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

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.

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))

-- 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")

-- fim do programa COND2

<11>

a programar
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.

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

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

-- fim do programa COND3

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.

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 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:

Condio 1

Condio 2

Resultado

Falsa
Verdadeira
Falsa
Verdadeira

Falsa
Falsa
Verdadeira
Verdadeira

Falso
Falso
Falso
Verdadeiro

Condio 1

Condio 2

Resultado

Falsa
Verdadeira
Falsa
Verdadeira

Falsa
Falsa
Verdadeira
Verdadeira

Falso
Verdadeiro
Verdadeiro
Verdadeiro

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..

<12>

a programar
O operador not faz com o resultado lgico de uma
determinada deciso seja invertido.

-- 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

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 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

Resultado

Falsa
Verdadeira

No Falso
No Verdadeiro

-- fim do programa COND6

Concluso

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:

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.

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:

LUA - Linguagem de
Programao - Parte 3

while (condio) do [bloco] end.

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.

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

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).

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

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

-- fim do programa LACO 1

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

<14>

a programar
contexto de aplicao do lao interactivo:

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 2


RESP = 1
while (RESP == 1) do
io.write("Entre um valor numerico:

-- inicio do programa LACO 3


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

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.

-- fim do programa LACO 2

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:

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.

-- inicio do programa LACO 4

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

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

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:
")

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:

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

for (contador) do [bloco] end.

-- fim do programa LACO 5

Lao com Varivel de Controlo

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:

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

for <varivel> := <inicio>, <fim>,


<incremento> do
instrues executadas
dentro do lao
end
instrues executadas
aps concluso do lao

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.

Como exemplo de uso, considere o desenvolvimento de um


programa que apresente como resultado a tabuada de um
nmero qualquer.

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):

Programao funcional
em Python

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).

2 Bloco

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.

Um outro exemplo:

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.

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"

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.

iguais(54, 55)#isto tambm retorna "Nao"

Sintaxe: lambda <argumentos separados por vrgulas> : <o


que a funo deve retornar>

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,

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]).

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])

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.

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].

Exemplo: map(lambda x, y: [x**2, str(y)], [1, 2, 3, 4, 5], [3.5,


7, 5.1, 8, a])

Situaes onde possvel usar o filter, e as


respectivas alternativas

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]].

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)

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.

(O 1 no terceiro argumento opcional)

Exemplo: zip([1, 2], [a, b, c], [A, B, C, D])

Usando uma funo recursiva:

Neste exemplo, o zip retorna [(1, a, A), (2, b, B)].

def fact(x):
if x > 1:
return x*fact(x-1)
else:
return x

Uma alternativa ao zip


Aqui fica uma funo que replica o comportamento do zip
que recebe uma lista com todos os objectos a iterar:

fact(9)

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]

Usando um ciclo for:


y = 1
for x in range(1, 10):
y *= x

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

revistaprogramar

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

Equipa PROGRAMAR
Um projecto Portugal-a-Programar.org

<21>

Você também pode gostar