Escolar Documentos
Profissional Documentos
Cultura Documentos
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.
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.
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.
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.
<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.
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
<4>
snippets - vb.net
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
<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.
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)
<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.
<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.
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/).
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
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.
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.
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.
<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
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.
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
<12>
a programar
O operador not faz com o resultado lgico de uma
determinada deciso seja invertido.
Resultado
Falsa
Verdadeira
No Falso
No Verdadeiro
Concluso
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
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.
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:
")
")
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
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
<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.
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
Concluso
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
2 Bloco
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"
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])
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]].
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.
def fact(x):
if x > 1:
return x*fact(x-1)
else:
return x
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]
David Ferreira
<20>
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>