{ Conceitos Base de Programação e Algoritmia}
{ Introdução à Programação }
{ Agenda }
# Conceitos Base de Programação e Algoritmia
Início
Estruturas de Controlo
Estruturas de Decisão
Estruturas de Repetição (ciclos ou loops)
iteração
contador
acumulador
Funções e Procedimentos
Computação Paralela (Paralelismo)
Debug (Testes e Correção de Erros)
Fim
{ Estruturas de Controlo}
# Estruturas de Controlo
{ Em programação as estruturas de controlo têm como
objetivo avaliar e controlar a execução de instruções ou
blocos de instruções }
{ As estruturas de controlo podem ser, tipicamente, de dois
tipos: }
“ Estruturas de Decisão ou Seleção “
“ Estruturas de Repetição ou Ciclos ou Loops “
{ Estruturas de Controlo}
# Estruturas de Decisão ou Seleção
{ As estruturas de decisão ou seleção permitem escolher
uma opção, de entre as disponíveis, executando
sequências alternativas mediante a verificação de
determinada condição ou condições }
{ As estruturas de Decisão ou Seleção dividem-se em: }
“ Decisão ou Seleção Simples “
“ Decisão ou Seleção Composta “
“ Decisão ou Seleção Encadeada”
“ Decisão ou Seleção Múltipla “
{ Estruturas de Controlo}
# Estrutura de Decisão ou Seleção Simples
{ As estruturas de decisão ou seleção simples apenas
executam uma determinada ação mediante a satisfação
verdadeira de uma determinada condição. Caso a condição
seja falsa o programa continua a executar instruções fora
da condição ou termina}
Ler (peso)
Peso <70
dif 70-peso
Escrever (”
Faltam ”, dif , “ Kg
para os 70”
True
False
Ler(peso);
Se peso <70 Então
Início
dif  70 – Peso;
Escrever (“ Faltam “, dif, “Kg para os 70”);
Fim;
FimSe;
# Fluxograma # Pseudocódigo # Python
{ Estruturas de Controlo}
# Estrutura de Decisão ou Seleção Composta
{ Através da utilização de uma estrutura de decisão ou
seleção composta, podem existir duas opções possíveis
para a execução de um conjunto de instruções que são
selecionadas mediante o resultado lógico ( true, false) de
uma determinada expressão ou condição }
Ler (peso)
peso <70
dif 70-peso
Escrever (”
Faltam”, dif , “ Kg
para os 70”)
True
False
Ler(peso);
Se peso <70 Então
Início
dif  70 – Peso;
Escrever (“ Faltam “, dif, “Kg para os 70”;
Fim;
Senão
Escrever (“ O seu peso é maior ou igual a 70kg”);
FimSe;
# Fluxograma
# Pseudocódigo
# Python
Escrever (” O seu
peso é maior ou
igual a 70 Kg”)
{ Estruturas de Controlo}
# Estrutura de Decisão ou Seleção Encadeada
{ Numa estrutura de seleção ou decisão encadeada podem existir
várias opções encadeadas para a execução das instruções do
programa. Cada uma das opções é selecionada mediante o valor
lógico da sua condição ou expressão }
Ler (peso)
peso < 70
dif 70-peso
Escrever (”
Faltam”, dif , “ Kg
para os 70”)
True
False
Ler(peso);
Se peso <70 Então
Início
dif  70 – Peso;
Escrever (“ Faltam “, dif, “Kg para os 70”;
Fim;
Senão Se peso > 70 Então
inicio
dif= peso-70;
Escrever (“ Seu peso está “, dif, “acima dos 70kg”;
Senão
Escrever (“ Pesa 70Kg”;
FimSe;
FimSe;
# Fluxograma
# Pseudocódigo
peso >70
dif peso - 70
Escrever (” O seu
peso está”, dif , “
Kg acima dos 70”)
Escrever (”
Pesa 70 Kg”)
False
True
{ Estruturas de Controlo}
# Estrutura de Decisão ou Seleção Encadeada
{ Numa estrutura de seleção ou decisão encadeada podem existir
várias opções encadeadas para a execução as instruções do
programa. Cada uma das opções é selecionada mediante o valor
lógico da sua condição ou expressão }
Ler (peso)
peso < 70
dif 70-peso
Escrever (”
Faltam”, dif , “ Kg
para os 70”)
True
False
# Fluxograma
# Python
peso >70
dif peso - 70
Escrever (” O seu
peso está”, dif , “
Kg acima dos 70”)
Escrever (”
Pesa 70 Kg”)
False
True
{ Estruturas de Controlo}
# Estrutura de Decisão ou Seleção Múltipla
{ Em algumas linguagens de programação existe uma quarta
estrutura de decisão – Estrutura de decisão múltipla (C, C++, Java).
Noutras linguagens esta estrutura não existe nativamente (Python,
…)}
{ Este tipo de estrutura de decisão conhecida como ‘case’ ou
‘switch’ permite a seleção de uma opção, de entre um conjunto de
opções, mediante a satisfação de uma condição baseada numa
variável. }
Escolha (Variável)
Inicio
Caso (Valor1):
Instruções;
Caso (Valor2):
Instruções;
Caso (ValorN):
Instruções;
Fim;
switch (variável)
{
case constante1:
Instruções;
break;
case constante2:
Instruções;
break;
default
Instruções;
}
# C# Pseudocódigo
{ Estruturas de Controlo}
# Estruturas de Decisão e Seleção em ambientes por blocos
# Estrutura de Decisão Simples
# Estrutura de Decisão Composta
# Estrutura de Decisão Encadeada
{ Estruturas de Controlo}
# Estruturas de Repetição ou Ciclos ou Loops
{ As estruturas de repetição ou ciclos permitem repetir um conjunto
de instruções de um programa, sendo controladas pelo resultado
lógico (true ou false) da avaliação de uma condição ou expressão.
O exemplo da figura representa o desenho de um quadro usando o
Scratch. Repetindo 4 vezes o desenho de cada um dos lados do
quadrado. }
{ Existem três tipos de ciclos: a) Ciclo For (para); b) Ciclo While
(Enquanto); e c) Repetir Até (Repeat) }
{ Estruturas de Controlo}
# Estruturas de Repetição – Ciclo For
{ O ciclo For é um tipo de estrutura de repetição em que
inicialmente se define (é conhecido) o número de vezes que o bloco
de instruções será repetido. }
{ Para tal, o ciclo usa uma variável contador que será incrementada
(to) ou decrementada (DownTo) a cada iteração (repetição) das
instruções e será responsável por terminar o ciclo. }
Para <variávelcontador=valorinical> até <valorfinal>
fazer
< bloco de instruções >
FimPara
# Sintaxe Básica do Ciclo For
{ Estruturas de Controlo}
# Estruturas de Repetição – Ciclo For
soma  0;
Media  0;
Para contador 1 até 10 fazer
Escrever (“ Indique um número inteiro”);
Ler (num);
soma  soma + num;
contador  contador + 1;
FimPara
; Media soma/10
Escrever (“ A média dos números é ”, media);
# Fluxograma
soma 0
contador 1
contador
< 10
contador contador + 1
soma soma+ num
Escrever (“ Indique um
número inteiro!”)
Ler (num)
True
False
fim
# Pseudocódigo
media soma / 3
Escrever (“ A média dos
números indicados é:”, media)
# Python
{ Estruturas de Controlo}
# Estruturas de Repetição – CicloWhile
{ O ciclo while é um tipo de estrutura de repetição em que o numero
de iterações (repetições) é controlado por uma condição ou
expressão lógica inicial. Enquanto resultado da avaliação lógica da
condição for verdadeiro as instruções são executadas. }
{ Se na primeira avaliação da condição o resultado for falso o bloco
de instruções não será executado nenhuma vez. }
Enquanto <expressão> até <valorfinal> fazer
< bloco de instruções >
FimEnquanto
# Sintaxe Básica do Ciclo While
{ Estruturas de Controlo}
# Estruturas de Repetição – CicloWhile
conta 0;
Escrever (“ Escreva um nome”);
Ler (nome);
Enquanto nome <>”fim” fazer
Escrever (“ Escreva um nome”);
Ler (nome);
conta conta+1
FimEnquanto
Escrever (“ Foram digitados “, conta, “ nomes”);
# Fluxograma
nome < >
”Fim”
Conta  conta+ 1
Escrever (“ Indique um
nome
Ler (nome)
True
False
fim
# Pseudocódigo
Escrever (“ Foram digitados “,
conta, “nomes”)
# Python
Escrever (“ Digite um nome!”)
Conta  0
Ler (nome)
{ Estruturas de Controlo}
# Estruturas de Repetição – repeat until ou do while)
{ O ciclo ‘repeat until’ ou ‘do while’ é um tipo de estrutura de
repetição, que existem em algumas linguagens de programação,
em que o numero de iterações (repetições) é controlado por uma
condição ou expressão lógica no final do ciclo. Enquanto resultado
da avaliação lógica da condição for verdadeiro as instruções são
executadas. }
{ Dado que a condição só é avaliada no final o ciclo faz sempre uma
iteração, mesmo que a condição seja falsa. Em Python este tipo de
estrutura não existe nativamente }
Repetir
< bloco de instruções >
Até que < expressão>
# Sintaxe Básica do Ciclo
do
< bloco de instruções >
While < expressão>
{ Estruturas de Controlo }
# Estruturas de Repetição em ambientes por blocos
# Ciclo Infinito
# Ciclo For
# Ciclo While
{ Funções e Procedimentos}
# Subrotinas
{ As subrotinas representam conjuntos de instruções agregadas,
com um identificador, que podem ser executadas as vezes que
forem necessárias. }
{ Por exemplo, se temos um programa que necessita de efetuar o
mesmo cálculo várias vezes, podemos criar uma subrotina que
efetua o cálculo e posteriormente chamar essa subrotina sempre
que necessitarmos de efetuar o mesmo cálculo. }
{ As subrotinas podem ser de dois tipos: Funções ou
Procedimentos. }
{ Funções e Procedimentos}
# Funções
{ As funções são subrotinas que, após a sua execução, devolvem
obrigatoriamente um resultado através do seu Nome para o local
onde foram chamadas. Deste modo, o resultado tem um
determinado tipo de dados previamente definido na função.A
função pode ainda ter parâmetros associados a esse tipos de
dados. }
def soma(x, y):
return x + y
def quadrado(x):
return x*x
# Criar funções em Python
# Chamar funções em Python
soma(2, 2)
quadrado(3)
# Criar funções em Scratch
# Chamar funções Scratch
{ Funções e Procedimentos}
# Procedimentos
{ Os procedimentos são subrotinas que, quando chamados, e ao
contrário das funções, não devolvem um resultado através do seu
nome. Deste modo, os procedimentos não estão associados a
nenhum tipo de dados. }
{ No entanto, podem ter parâmetros associados a tipos de dados. }
{ Debug –Teste e Correção de Erros}
#Teste, deteção e correção de erros
{ O teste e controlo de erros num algoritmo permite verificar se
este resolve o problema pretendido. Este processo é designado por
tracing e permite acompanhar passo a passo a execução de um
algoritmo, eliminando a possibilidade de ocorrência de erros. }
{ O tracing consiste em testar um algoritmo com a atribuição de
valores e dados de entrada, observando a execução das várias
instruções até ao resultado final. }
{ Alguns ambientes de programação e IDE’s permite a execução
passo a passo de um programa possibilitando deste modo a
deteção de erros e falhas. }
{ Debug –Teste e Correção de Erros}
#Teste, deteção e correção de erros
n1 = input(‘Digite o primeiro numero: ‘)
n2 = input(‘Digite o segundo numero: ‘)
r = n1 + n2
print “resultado e: ”, r
# Veja o seguinte programa em Python que soma dois números
A b R=n1+n2 Saída
1º passo 5
2º passo 5 5
3º passo 5 5 10
4º passo 5 5 10 10
#Tracing do Programa
{ Paralelismo ou Processamento Paralelo }
{ O processamento em paralelo permite a execução em simultâneo
de vários instruções independentes que são acionadas ao mesmo
tempo. As imagens seguintes exemplificam a execução de tarefas
diferentes que são acionadas quando alguém clica na bandeira
verde. }
{ Referências}
{ Costa, E. (2015). Programação em Python – Fundamentos e
Resolução de Problemas. Lisboa, - FCA Editora }
{ Jesus, C.,Vasconcelos, J, B., & Lima, R. (2016). Scratch e Kodu –
Iniciação à Programação no Ensino Básico. Lisboa: FCA Editora. }
{Vasconcelos, J, B. (2015). Python – Algoritmia e ProgramaçãoWeb.
Lisboa, - FCA Editora }
{Wainewright, M. (2016).Vamos Programar,Guia para Pais e
Educadores. Booksmile. }
{Wainewright, M. (2016). Vamos Programar,Cria os teus Próprios
Jogos e Programas de Computador. Booksmile. }

Conceitos base de programação - parte 2

  • 1.
    { Conceitos Basede Programação e Algoritmia} { Introdução à Programação }
  • 2.
    { Agenda } #Conceitos Base de Programação e Algoritmia Início Estruturas de Controlo Estruturas de Decisão Estruturas de Repetição (ciclos ou loops) iteração contador acumulador Funções e Procedimentos Computação Paralela (Paralelismo) Debug (Testes e Correção de Erros) Fim
  • 3.
    { Estruturas deControlo} # Estruturas de Controlo { Em programação as estruturas de controlo têm como objetivo avaliar e controlar a execução de instruções ou blocos de instruções } { As estruturas de controlo podem ser, tipicamente, de dois tipos: } “ Estruturas de Decisão ou Seleção “ “ Estruturas de Repetição ou Ciclos ou Loops “
  • 4.
    { Estruturas deControlo} # Estruturas de Decisão ou Seleção { As estruturas de decisão ou seleção permitem escolher uma opção, de entre as disponíveis, executando sequências alternativas mediante a verificação de determinada condição ou condições } { As estruturas de Decisão ou Seleção dividem-se em: } “ Decisão ou Seleção Simples “ “ Decisão ou Seleção Composta “ “ Decisão ou Seleção Encadeada” “ Decisão ou Seleção Múltipla “
  • 5.
    { Estruturas deControlo} # Estrutura de Decisão ou Seleção Simples { As estruturas de decisão ou seleção simples apenas executam uma determinada ação mediante a satisfação verdadeira de uma determinada condição. Caso a condição seja falsa o programa continua a executar instruções fora da condição ou termina} Ler (peso) Peso <70 dif 70-peso Escrever (” Faltam ”, dif , “ Kg para os 70” True False Ler(peso); Se peso <70 Então Início dif  70 – Peso; Escrever (“ Faltam “, dif, “Kg para os 70”); Fim; FimSe; # Fluxograma # Pseudocódigo # Python
  • 6.
    { Estruturas deControlo} # Estrutura de Decisão ou Seleção Composta { Através da utilização de uma estrutura de decisão ou seleção composta, podem existir duas opções possíveis para a execução de um conjunto de instruções que são selecionadas mediante o resultado lógico ( true, false) de uma determinada expressão ou condição } Ler (peso) peso <70 dif 70-peso Escrever (” Faltam”, dif , “ Kg para os 70”) True False Ler(peso); Se peso <70 Então Início dif  70 – Peso; Escrever (“ Faltam “, dif, “Kg para os 70”; Fim; Senão Escrever (“ O seu peso é maior ou igual a 70kg”); FimSe; # Fluxograma # Pseudocódigo # Python Escrever (” O seu peso é maior ou igual a 70 Kg”)
  • 7.
    { Estruturas deControlo} # Estrutura de Decisão ou Seleção Encadeada { Numa estrutura de seleção ou decisão encadeada podem existir várias opções encadeadas para a execução das instruções do programa. Cada uma das opções é selecionada mediante o valor lógico da sua condição ou expressão } Ler (peso) peso < 70 dif 70-peso Escrever (” Faltam”, dif , “ Kg para os 70”) True False Ler(peso); Se peso <70 Então Início dif  70 – Peso; Escrever (“ Faltam “, dif, “Kg para os 70”; Fim; Senão Se peso > 70 Então inicio dif= peso-70; Escrever (“ Seu peso está “, dif, “acima dos 70kg”; Senão Escrever (“ Pesa 70Kg”; FimSe; FimSe; # Fluxograma # Pseudocódigo peso >70 dif peso - 70 Escrever (” O seu peso está”, dif , “ Kg acima dos 70”) Escrever (” Pesa 70 Kg”) False True
  • 8.
    { Estruturas deControlo} # Estrutura de Decisão ou Seleção Encadeada { Numa estrutura de seleção ou decisão encadeada podem existir várias opções encadeadas para a execução as instruções do programa. Cada uma das opções é selecionada mediante o valor lógico da sua condição ou expressão } Ler (peso) peso < 70 dif 70-peso Escrever (” Faltam”, dif , “ Kg para os 70”) True False # Fluxograma # Python peso >70 dif peso - 70 Escrever (” O seu peso está”, dif , “ Kg acima dos 70”) Escrever (” Pesa 70 Kg”) False True
  • 9.
    { Estruturas deControlo} # Estrutura de Decisão ou Seleção Múltipla { Em algumas linguagens de programação existe uma quarta estrutura de decisão – Estrutura de decisão múltipla (C, C++, Java). Noutras linguagens esta estrutura não existe nativamente (Python, …)} { Este tipo de estrutura de decisão conhecida como ‘case’ ou ‘switch’ permite a seleção de uma opção, de entre um conjunto de opções, mediante a satisfação de uma condição baseada numa variável. } Escolha (Variável) Inicio Caso (Valor1): Instruções; Caso (Valor2): Instruções; Caso (ValorN): Instruções; Fim; switch (variável) { case constante1: Instruções; break; case constante2: Instruções; break; default Instruções; } # C# Pseudocódigo
  • 10.
    { Estruturas deControlo} # Estruturas de Decisão e Seleção em ambientes por blocos # Estrutura de Decisão Simples # Estrutura de Decisão Composta # Estrutura de Decisão Encadeada
  • 11.
    { Estruturas deControlo} # Estruturas de Repetição ou Ciclos ou Loops { As estruturas de repetição ou ciclos permitem repetir um conjunto de instruções de um programa, sendo controladas pelo resultado lógico (true ou false) da avaliação de uma condição ou expressão. O exemplo da figura representa o desenho de um quadro usando o Scratch. Repetindo 4 vezes o desenho de cada um dos lados do quadrado. } { Existem três tipos de ciclos: a) Ciclo For (para); b) Ciclo While (Enquanto); e c) Repetir Até (Repeat) }
  • 12.
    { Estruturas deControlo} # Estruturas de Repetição – Ciclo For { O ciclo For é um tipo de estrutura de repetição em que inicialmente se define (é conhecido) o número de vezes que o bloco de instruções será repetido. } { Para tal, o ciclo usa uma variável contador que será incrementada (to) ou decrementada (DownTo) a cada iteração (repetição) das instruções e será responsável por terminar o ciclo. } Para <variávelcontador=valorinical> até <valorfinal> fazer < bloco de instruções > FimPara # Sintaxe Básica do Ciclo For
  • 13.
    { Estruturas deControlo} # Estruturas de Repetição – Ciclo For soma  0; Media  0; Para contador 1 até 10 fazer Escrever (“ Indique um número inteiro”); Ler (num); soma  soma + num; contador  contador + 1; FimPara ; Media soma/10 Escrever (“ A média dos números é ”, media); # Fluxograma soma 0 contador 1 contador < 10 contador contador + 1 soma soma+ num Escrever (“ Indique um número inteiro!”) Ler (num) True False fim # Pseudocódigo media soma / 3 Escrever (“ A média dos números indicados é:”, media) # Python
  • 14.
    { Estruturas deControlo} # Estruturas de Repetição – CicloWhile { O ciclo while é um tipo de estrutura de repetição em que o numero de iterações (repetições) é controlado por uma condição ou expressão lógica inicial. Enquanto resultado da avaliação lógica da condição for verdadeiro as instruções são executadas. } { Se na primeira avaliação da condição o resultado for falso o bloco de instruções não será executado nenhuma vez. } Enquanto <expressão> até <valorfinal> fazer < bloco de instruções > FimEnquanto # Sintaxe Básica do Ciclo While
  • 15.
    { Estruturas deControlo} # Estruturas de Repetição – CicloWhile conta 0; Escrever (“ Escreva um nome”); Ler (nome); Enquanto nome <>”fim” fazer Escrever (“ Escreva um nome”); Ler (nome); conta conta+1 FimEnquanto Escrever (“ Foram digitados “, conta, “ nomes”); # Fluxograma nome < > ”Fim” Conta  conta+ 1 Escrever (“ Indique um nome Ler (nome) True False fim # Pseudocódigo Escrever (“ Foram digitados “, conta, “nomes”) # Python Escrever (“ Digite um nome!”) Conta  0 Ler (nome)
  • 16.
    { Estruturas deControlo} # Estruturas de Repetição – repeat until ou do while) { O ciclo ‘repeat until’ ou ‘do while’ é um tipo de estrutura de repetição, que existem em algumas linguagens de programação, em que o numero de iterações (repetições) é controlado por uma condição ou expressão lógica no final do ciclo. Enquanto resultado da avaliação lógica da condição for verdadeiro as instruções são executadas. } { Dado que a condição só é avaliada no final o ciclo faz sempre uma iteração, mesmo que a condição seja falsa. Em Python este tipo de estrutura não existe nativamente } Repetir < bloco de instruções > Até que < expressão> # Sintaxe Básica do Ciclo do < bloco de instruções > While < expressão>
  • 17.
    { Estruturas deControlo } # Estruturas de Repetição em ambientes por blocos # Ciclo Infinito # Ciclo For # Ciclo While
  • 18.
    { Funções eProcedimentos} # Subrotinas { As subrotinas representam conjuntos de instruções agregadas, com um identificador, que podem ser executadas as vezes que forem necessárias. } { Por exemplo, se temos um programa que necessita de efetuar o mesmo cálculo várias vezes, podemos criar uma subrotina que efetua o cálculo e posteriormente chamar essa subrotina sempre que necessitarmos de efetuar o mesmo cálculo. } { As subrotinas podem ser de dois tipos: Funções ou Procedimentos. }
  • 19.
    { Funções eProcedimentos} # Funções { As funções são subrotinas que, após a sua execução, devolvem obrigatoriamente um resultado através do seu Nome para o local onde foram chamadas. Deste modo, o resultado tem um determinado tipo de dados previamente definido na função.A função pode ainda ter parâmetros associados a esse tipos de dados. } def soma(x, y): return x + y def quadrado(x): return x*x # Criar funções em Python # Chamar funções em Python soma(2, 2) quadrado(3) # Criar funções em Scratch # Chamar funções Scratch
  • 20.
    { Funções eProcedimentos} # Procedimentos { Os procedimentos são subrotinas que, quando chamados, e ao contrário das funções, não devolvem um resultado através do seu nome. Deste modo, os procedimentos não estão associados a nenhum tipo de dados. } { No entanto, podem ter parâmetros associados a tipos de dados. }
  • 21.
    { Debug –Testee Correção de Erros} #Teste, deteção e correção de erros { O teste e controlo de erros num algoritmo permite verificar se este resolve o problema pretendido. Este processo é designado por tracing e permite acompanhar passo a passo a execução de um algoritmo, eliminando a possibilidade de ocorrência de erros. } { O tracing consiste em testar um algoritmo com a atribuição de valores e dados de entrada, observando a execução das várias instruções até ao resultado final. } { Alguns ambientes de programação e IDE’s permite a execução passo a passo de um programa possibilitando deste modo a deteção de erros e falhas. }
  • 22.
    { Debug –Testee Correção de Erros} #Teste, deteção e correção de erros n1 = input(‘Digite o primeiro numero: ‘) n2 = input(‘Digite o segundo numero: ‘) r = n1 + n2 print “resultado e: ”, r # Veja o seguinte programa em Python que soma dois números A b R=n1+n2 Saída 1º passo 5 2º passo 5 5 3º passo 5 5 10 4º passo 5 5 10 10 #Tracing do Programa
  • 23.
    { Paralelismo ouProcessamento Paralelo } { O processamento em paralelo permite a execução em simultâneo de vários instruções independentes que são acionadas ao mesmo tempo. As imagens seguintes exemplificam a execução de tarefas diferentes que são acionadas quando alguém clica na bandeira verde. }
  • 24.
    { Referências} { Costa,E. (2015). Programação em Python – Fundamentos e Resolução de Problemas. Lisboa, - FCA Editora } { Jesus, C.,Vasconcelos, J, B., & Lima, R. (2016). Scratch e Kodu – Iniciação à Programação no Ensino Básico. Lisboa: FCA Editora. } {Vasconcelos, J, B. (2015). Python – Algoritmia e ProgramaçãoWeb. Lisboa, - FCA Editora } {Wainewright, M. (2016).Vamos Programar,Guia para Pais e Educadores. Booksmile. } {Wainewright, M. (2016). Vamos Programar,Cria os teus Próprios Jogos e Programas de Computador. Booksmile. }