Professional Documents
Culture Documents
Introdução à Informática
e Algoritmia
1995-2006
ÍNDICE
1. CONCEITOS GERAIS.............................................................................................................................................. 1
4. EXERCÍCIOS............................................................................................................................................................. 4
6. ALGORITMOS .......................................................................................................................................................... 7
11. EXERCÍCIOS........................................................................................................................................................... 21
13. FUNÇÕES................................................................................................................................................................. 23
I
15.2 PESQUISA .......................................................................................................................................................... 30
15.3 ELIMINAÇÃO ................................................................................................................................................ 30
15.4 EXERCÍCIOS ...................................................................................................................................................... 31
16. ORDENAÇÃO E PESQUISA ................................................................................................................................. 31
16.1 ORDENAÇÃO POR TROCA DIRECTA ................................................................................................................... 31
16.2 ORDENAÇÃO POR SELECÇÃO ............................................................................................................................ 31
16.3 ORDENAÇÃO POR INSERÇÃO ............................................................................................................................. 32
16.4 PESQUISA SEQUENCIAL ..................................................................................................................................... 32
17. EXERCÍCIOS........................................................................................................................................................... 33
II
I INTRODUÇÃO À INFORMÁTICA
1. CONCEITOS GERAIS
• Dados: Informação automatizável. Diz-se automatizável, se pode ser sujeita a um conjunto de
operações repetitivas.
A informação ou é útil ou não interessa: Para a informação ser útil, é essencial que os
dados recolhidos nos conduzam a resultados utilizáveis.
OPERAÇÕES
DADOS SOBRE RESULTADOS
DADOS
• Definição de Informática: A informática (Informação Automática) é a ciência do tratamento
racional, nomeadamente por processos automáticos, da informação, considerada como suporte
do conhecimento humano e da comunicação nos diferentes domínios da actividade humana.
• Ciclo de informação
Recolha Classif. Saída Utilização
Processa-
de e de de
mento
Dados Entrada resultados Resultados
3. REPRESENTAÇÃO DA INFORMAÇÃO
A representação da informação no computador está de acordo com o modo de funcionamento dos
computadores. Um programa é executado a partir da memória pricipal do computador. Sendo esta
um dispositivo digital de dois estados, ligado e desligado, então o sistema de numeração que
2
Erro! Estilo não definido.. Erro! Estilo não definido.
Também é possível realizar a conversão de valores de um sistema para o outro. Comecemos por
ver um exemplo.
Número a converter: 8910 (sistema de numeração decimal).
89 2
1 44 2
0 22 2
0 11 2
1 5 2
1 2 2
0 1 2
1 0
O número binário contrói-se com os restos obtidos, do último para o primeiro. Assim o
correspondente de 8910 em binário é 10110012.
A conversão de binário para decimal do valor obtido deve resultar em 89.
1 0 1 1 0 0 1
+ + + + + + 1*20 = 1
0*21 = 0
0*22 = 0
1*23 = 8
1*24 = 16
0*25 = 0
1*26 = 64
89
3
Erro! Estilo não definido.. Erro! Estilo não definido.
4. EXERCÍCIOS
4
II INTRODUÇÃO À
PROGRAMAÇÃO
1. Analisar o problema
a) Conhecer o problema: ouvir o problema, entendê-lo, perceber qual o objectivo.
b) Descrever o problema: subdividir o problema (esquematizar), detalhar.
c) Especificar os dados do problema.
3. Implementar: esta fase acontece apenas após o problema estar resolvido e consiste em
implementar o algoritmo numa linguagem de programação.
1 Para um estudo mais detalhado ver: “Ciência dos Computadores” de Tremblay e Bunt, McGraw-Hill.
Erro! Estilo não definido.. Erro! Estilo não definido.
Problema
(enunciado claro Programa
e preciso) Difícil ou
Impossível
Linguagem de
Programação
Exemplo 1.1 Elabore um algoritmo que permita a um robot efectuar a mudança do pneu furado de uma
viatura.
1ºTopDown (graficamente):
Substituição do
pneu furado
Colocar macaco
Ir buscar macaco Retirar pneu Guardar
em posição
+pneu furado e substituí- macaco+pneu
correta e elevar o
bom+chave lo furado+chave
carro
Para se resolver o problema seria necessário saber quais as operações elementares que o robot é
capaz de executar.
Definir as operações elementares:
dar passos
abrir ou fechar
pegar ou largar
rodar
6
Erro! Estilo não definido.. Erro! Estilo não definido.
Este problema e outro são apresentados em detalhe no Apêndice A. O tipo de problemas que
iremos encontrar são, no entanto, para implementação em computador. A implementação em
computador é feita usando linguagens que possuem um conjunto de operações elementares pré-
definidas, e uma sintaxe definida claramente.
Muitos dos problemas que se pretendem resolver são demasiado simples para valer a pena a sua
decomposição. No entanto, o passo 1.a) deverá ser sempre realizado. Esse passo consiste na
especificação dos dados do problema em Português antecedidos da expressão “Dados:”. Ter em
atenção que operações não são dados. Por exemplo, a soma enquanto resultado é um dado, mas a
operação soma não é. Os dados podem ter uma natureza distinta. Quanto à sua natureza vamos
considerar quatro tipos: entrada; saída; cálculo intermédio; e constantes.
Dados de entrada são dados fornecidos a partir do exterior da solução. Dados de saída são
fornecidos pela solução. Normalmente constituem o resultado da solução. Os dados intemédios
são dados que é necessário obter, para se chegar ao resultado, ou a outros dados intermédios, que
por sua vez permitirão obter o resultado. Os dados intermédios surgem frequentemente quando já
se está na resolução do problema. Constantes são valores fixos, como por exemplo pi. Os dados
de entrada sinalizam-se com uma seta virada para dentro ou com a letra E entre parêntesis. Os de
saída com uma seta virada para fora ou com a letra S entre parêntesis. As constantes com a letra C
entre parêntesis. Finalmente, os intermédios a sublinhado.
Supor o seguinte problema: Determinar a média das alturas de dois alunos da turma. Neste
problema os dados são as duas alturas e a média dessas alturas. Ou seja, existem três dados. A
especificação seria.
Poder-se-ia acrescentar a soma (resultados da soma) como quarto dado. Assim viria:
Em seguida passa-se à solução. Se for detectada a necessidade de mais dados então estes devem
ser incluídos na especificação, como aconteceu no exemplo da média das alturas.
6. ALGORITMOS
Os computadores apenas fazem aquilo que mandamos, pelo que não deve existir qualquer
ambiguidade nas instruções que damos ao computador. Assim, um algoritmo pode ser definido
como uma sequência ordenada, e sem ambiguidade, de passos que constituem a solução de um
dado problema. Por exemplo, as indicações dadas para se chegar a uma dada rua constituem um
algoritmo para se encontrar a rua. Então, algoritmo ´é sinónimo de solução de um problema.
7
Erro! Estilo não definido.. Erro! Estilo não definido.
Data
Document a leitura e escrita respectivamente2.
No caso dos fluxogramas, a ligação entre os símbolos faz-se através de setas, indicando qual a
ordem de execução das instruções, também chamado, o fluxo de controlo.
Em muitos dos problemas os dados possuirão uma estrutura simples, e, como tal, não haverá
necessidade de especificar as estruturas de dados.
2 Por vezes usaremos apenas o primeiro para ambas as operações, mas com a indicação de qual a operação.
8
Erro! Estilo não definido.. Erro! Estilo não definido.
Geralmente é necessário guardar os dados manipulados pelo algoritmo (ou programa), durante a
sua execução. Para o efeito são utilizadas variáveis. Estas caracterizam-se por um nome, que se
inicia sempre por uma letra e deve ser o mais sugestivo possível. No computador, a cada variável
corresponde um determinado espaço da memória do computador. As variáveis devem ser
definidas antes de poderem ser utilizadas. A definição de uma variável corresponde à criação
dessa variável. Para definir, uma variável ir-se-á utilizar a palavra reservada Def, do seguinte
modo, ou, por outras palavras, a sua sintaxe é a seguinte.
Def nome {,nome...} : tipo
Atribuição
Os dados podem ser guardados nas variáveis, através da operação de atribuição (representada pelo
operador =), ou introduzidos directamente pelo utilizador (aquele que executa ou usa o algoritmo
ou programa que o programador desenvolveu) através de uma instrução de leitura (representada
pelo instrução LER). A atribuição faz-se da direita para a esquerda, isto é, o valor do lado direito
da atribuição é atribuído à variável que se encontra do lado esquerdo.
Media = 5 [coloca o valor 5 na variável media]
Num algoritmo, o texto entre parêntesis rectos é comentário, ou seja, não é executado, o que
significa que tem apenas interesse para quem escreve o algoritmo.
Na leitura, a variável indicada recebe o dado introduzido pelo utilizador; é uma forma de o
utilizador poder interagir com o programa.
Ler(idade) [guarda na variável idade o valor introduzido pelo utilizador]
Estas duas expressões são destrutivas, ou seja, o valor anterior na variável é substituído pelo
actual.
Num algoritmo não basta ler valores do mundo exterior, é também necessário fornece-los. Para tal
é utilizada a instrução ESCREVER.
Exemplo: Neste exemplo são adicionadas duas idades introduzidas pelo utilizador e visualizado o
resultado.
Escrever(“Introduza duas idades:”) [pede para o utilizador introduzir duas idades]
Ler(idade1, idade2) [assim que o utilizador introduzir as idades, estas são
guardadas em idade1 e idade2]
Soma=idade1+idade2 [adiciona as idades e atribui o resultado à variável soma]
[Comunica o resultado]
Escrever(“A soma das idades:”, idade1, “e “, idade2, “é igual a”, soma)
9
Erro! Estilo não definido.. Erro! Estilo não definido.
A primeira vez que uma variável for utilizada deverá ser para receber um valor.
Operadores e Operações
Listam-se em seguida os vários operadores a utilizar, agrupados por tipo de operação:
Operador Descrição
Operador Atribuição
= atribui o valor à direita à variável à esquerda
Operadores Aritméticos:
+ adição
- subtracção
* multiplicação
/ divisão
% ou MOD módulo; resto da divisão de dois inteiros
Operadores Relacionais:
=, = = igualdade
<= menor que
>= maior que
<>, != desigualdade
Operadores Lógicos:
NEGAR negação
E conjunção
OU disjunção
Nas expressões aritméticas a avaliação faz-se dos operadores com maior precedência para os de
menor. A ordem de precedência dos operadores anteriores é a seguinte:
1. ^
2. * /
3. MOD
4. + -
5. = < > <= >=
6. NEGAR E OU
7. =
A utilização de parêntesis permite alterar a ordem de avaliação das expressões, dando prioridade
às que se encontram entre parêntesis.
No exemplo das idades foi utilizado o operador soma.
Soma=idade1+idade2 [adiciona as idades e atribui o resultado à variável soma]
Para além destes operadores existem também funções embutidas, isto é, que fazem parte da
linguagem, como por exemplo a função raiz quadrada, SQRT(valor).
z=SQRT(4) [calcula a raiz quadrada de 4 e atribui o resultado a z]
escrever(z) [mostra o valor em z]
10
Erro! Estilo não definido.. Erro! Estilo não definido.
8.1 SEQUÊNCIA
Execução sequencial significa que as instruções de um programa são executadas umas a seguir às
outras pela ordem em que se encontram no programa. A notação necessária para a elaboração de
algoritmos sequenciais é a seguinte:
Pseudo código:
A apresentada até agora.
Fluxograma:
Processamento
representa processamento
Isto quer dizer que o algoritmo para o problema da soma das idades deveria ser escrito da seguinte
maneira:
INICIO
Def idade1, idade2 : inteiro
Escrever(“Introduza duas idades:”) [pede duas idades ao utilizador]
Ler(idade1, idade2) [guarda-as em idade1 e idade2]
Soma=idade1+idade2 [adiciona-as e atribui o resultado a soma]
Escrever(“A soma das idades:”, idade1, “e “, idade2, “é igual a”, soma)
FIM
E em fluxograma:
INÌCIO
"Introduza duas
idades:"
idade1,
idade2
Soma=idade1+i
dade2
FIM
Exemplo 1.2 Um artista da nossa praça produz cubos de 2cm de aresta, que depois pinta com uma tinta
que adquire ao preço de 10€ por lata de 1,5dl. Com um dl de tinta o artista consegue pintar 5cm2 da
superfície de um cubo. Calcule quanto custa pintar um cubo inteiro (seja sistemático). Nota: área
do cubo = aresta*aresta*6
11
Erro! Estilo não definido.. Erro! Estilo não definido.
Exemplo 1.3 Proceda às alterações ao algoritmo anterior, que entender necessárias para que todos os
dados possam ser indicados em cada execução do algoritmo (i.e., sem ter de refazer os cálculos).
Resolução - Consiste em substituir os valores (constantes) pelas variáveis. Assim, de cada vez que
o pintor quer calcular o custo, torna-se necessário perguntar quais os valores em causa. As
variáveis para os valores de entrada poderiam ser:
aresta - aresta do cubo
preço - preço da lata
tinta_lata - quantidade de tinta da lata
capacidade - capacidade de pintura por dl
O algoritmo resultante:
INÍCIO [Custo de pintar um cubo(dados variáveis)]
Def aresta, preco, tinta_lata, capacidade, tinta_necessaria, numero_de_latas,
custo: real
escrever(“Qual a aresta?)
ler(aresta)
escrever(“qual o preço de cada lata?”)
ler(preço)
escrever(“Qual a quantidade de tinta da lata?”)
ler(tinta_lata)
escrever(“Qual a capacidade de pintura, em cm2, por cada dl?”)
ler(capacidade)
área=aresta^2*6
tinta_necessária=área/capacidade
número_latas=tinta_necessária/tinta_lata
custo= número_latas*preço
escrever(“O custo de pintar o cubo é de: “, custo)
FIM
Relembrar que o texto entre parêntesis rectos é comentário, ou seja, não é executado, o que
significa que apenas interessa a quem escreve o algoritmo.
Exemplo 1.4 Elabore um algoritmo que leia um número inteiro representando segundos, e imprima o
seu correspondente em horas, minutos e segundos.
Exemplo: 3662s → 1h 1m 2s
8.2 DECISÕES
Por vezes e necessário tomar decisões que dependem de determinadas condições. Por exemplo,
imprimir os nomes dos clientes de um banco com um saldo superior a um certo valor. As decisões
são representadas em português estruturado e fluxograma das seguintes formas:
12
Erro! Estilo não definido.. Erro! Estilo não definido.
SE condição
Então
Bloco de instruções1 F Condição V
Senão
Bloco de instruções2
Fse
Bloco de Bloco de
instruções 2 instruções 1
Exemplo 1.5 Considere agora, que o nosso artista também passou a produzir e pintar cilindros.
Reescreva o algoritmo desenvolvido anteriormente para permitir calcular o custo do cubo ou do
cilindro, conforme se pretender. Nota: área_da_base=(π*diâmetro^2)/4
,área_da_superfície=π*diâmetro*altura, área total=2*área_da_base+ área_da_superfície.
Resolução: Começar por determinar as estruturas de dados envolvidas (de entrada/saída) vai-nos
ajudar a resolver o problema. Para além dos dados anteriores, há a considerar o tipo de objecto,
cubo ou cilindro. A indicação do tipo de objecto é da responsabilidade do utilizador, pelo que a
resolução do problema passa por perguntar ao utilizador qual o tipo de objecto para que quer
calcular o custo de pintura. Consoante o objecto variam os dados a pedir ao utilizador e a forma
de cálculo da área. Isto é, após o utilizador introduzir o tipo de objecto é necessário optar por uma
das fórmulas de cálculo da área.
INÍCIO [Custo de pintar um cubo(dados variáveis)]
Def obj: inteiro; d, h, area_da_base, pi, preco, lata, capacidade,
tinta_necessaria, custo : real
Escrever(“Qual o objecto?”)
Escrever(“Introduza: 1 para cubo, 2 para cilindro”)
Ler(obj)
Se obj=1 [se utilizador escolheu cubo]
Então escrever(“Qual a aresta?)
ler(aresta)
área=aresta^2*6
Senão Escrever(“Diâmetro e altura?”)
Ler(d, h)
Pi=3,14
area_da_base =(pi*diâmetro^2)/4
area_da_superfície=pi*diâmetro*altura
área= area_da_base+ area_da_superfície
Fse
escrever(“qual o preço de cada lata?”)
ler(preço)
escrever(“Qual a quantidade de tinta da lata?”)
ler(tinta_lata)
escrever(“Qual a capacidade de pintura, em cm2, por cada dl?”)
ler(capacidade)
tinta_necessária=área/capacidade
número_latas=tinta_necessária/tinta_lata
custo= número_latas*preço
13
Erro! Estilo não definido.. Erro! Estilo não definido.
Exercício 1.1 Este algoritmo pode ser melhorado no sentido de garantir que o custo apenas é
calculado nos casos de o utilizador introduzir o valor 1, ou o valor 2 para o tipo de objecto. Outra
melhoria poderia ser feita na mensagem com o custo, identificando o objecto para o qual se
calculou o custo. Realize as alterações necessárias ao algoritmo para introdução das melhoria
sugeridas.
Exemplo 1.6 Elabore um algoritmo (pseudo código e fluxograma) que, dados 3 números, todos
diferentes, determine e imprima o maior dos três.
Resolução: Determinar os dados envolvidos. Neste caso os 3 números e o maior dos três. Em
seguida elaborar o algoritmo.
INÍCIO
Início [Maior de 3 números]
Def A, B, C, maior : inteiro
escrever(“Introduza 3 números distintos:”)
ler(A,B,C) "Introduza três
Se A>B números:"
Então
Se A>C
Então maior=A
Senão maior=C A, B, C
Fse
Senão
Se B>C
Então maior=B
Senão maior=C
F A>B V
Fse
Fse
escrever(“O maior valor entre:”, A, “,”
, B,” e “, C, “é o “, maior) F B>C A>C V
FIM V F
FIM
Exemplo 1.7 Elabore um algoritmo (pseudo código e fluxograma) que, dados 3 números, todos
diferentes, determine e imprima o maior e o menor deles. Deve procurar determinar o menor
enquanto determina o maior.
Resolução: Determinar os dados envolvidos. Neste caso os 3 números, o maior e o menor dos três.
Em seguida elaborar o algoritmo.
Início [Maior e menor de 3 números]
escrever(“Introduza 3 números distintos:”)
ler(A,B,C)
Se A>B
14
Erro! Estilo não definido.. Erro! Estilo não definido.
Então
Se A>C
Então maior=A
Se B<C
Então menor=B
Senão menor=C
Fse
Senão maior=C
menor=B
Fse
Senão
Se B>C
Então maior=B
Se A<C
Então menor=A
Senão menor=C
Fse
Senão maior=C
menor=A
Fse
Fse
escrever(“O maior entre:”, A, “,”, B,” e “, C, “é o “, maior, “ O menor é o “,
menor)
FIM
Exercício 1.1 Desenvolva um algoritmo (pseudo código e fluxograma) que, dados 4 números,
calcule e imprima a diferença entre a soma dos dois maiores e a dos dois menores.
Exemplo 1.8 Elabore um algoritmo (pseudo código e fluxograma) que permita determinar se um
triângulo, dados os seus lados, é ou não rectângulo. Nota: Lembre-se do teorema de Pitágoras.
Resolução: Para um triângulo ser rectângulo é necessário que se verifique a igualdade do teorema
de Pitágoras, o que nos obriga a saber qual dos três lados é a hipotenusa e quais são os catetos.
Podemos então subdividir o problema em dois:
P1. Determinar a hipotenusa e os catetos
P2. Aplicar o teorema de Pitágoras
Como a hipotenusa será o maior dos três lados, então a resolução do primeiro subproblema passa
por determinar o maior dos 3 lados. Os catetos serão os dois lados restantes.
Os dados envolvidos são então: os 3 lados, a hipotenusa e os dois catetos.
Início [Triângulo rectângulo]
escrever(“Introduza os comprimentos dos 3 lados de 1 triângulo:”)
ler(A,B,C)
[P1. Determinar a hipotenusa(o maior) e os catetos(os restantes)]
Se A>B
Então
Se A>C
Então HIP=A
C1=B
C2=C
Senão hip=C
C1=A
C2=B
Fse
Senão
Se B>C
Então hip=B
C1=A
C2=C
Senão hip=C
C1=A
C2=B
Fse
Fse
[P2. Aplicar o teorema de Pitágoras]
15
Erro! Estilo não definido.. Erro! Estilo não definido.
8.3 REPETIÇÕES
Para além das decisões também é muito frequente surgir a necessidade de repetir instruções. Por
exemplo, ler as notas dos alunos da turma. As repetições podem assumir diferentes formas, aqui
consideraremos duas:
REPETIR ENQUANTO condição
Bloco de instruções
FENQ
O Bloco de instruções representa uma ou mais instruções.
A condição condição pode ser simples ou composta (dijunções e/ou conjunções). As disjunções
representam-se por OU e as conjunções por E.
A condição controla a execução do ciclo, ou seja, as instruções no interior do ciclo vão sendo
executadas repetidamente enquanto a condição for verdadeira. Quando a condição for falsa a
execução passa para a instrução imediatamente a seguir ao ciclo, isto é, após FENQ.
O controlo do número de execuções do ciclo é feito habitualmente de uma de duas formas:
- variável contadora, cujo valor vai aumentando/diminuindo até atingir um valor limite (ex: i<4).
Para isso é necessário colocar a instrução de incremento/decremento da variável como uma das
instruções do ciclo.
- bandeira, valor particular que quando ocorre torna a condição falsa (ex: a=0), aqui também é
necessário garantir que a variável poderá mudar de valor.
É necessário ter cuidado para que a condição não seja sempre verdadeira, pois tornaria o ciclo
infinito.
REPETIR PARA contador=início ATÉ fim PASSO valor
Bloco de instruções
FPARA
A segunda forma utiliza-se quando se pretende repetir uma ou mais instruções um número
determinado de vezes. Nesta construção a variável contadora, contador, é incrementada
implicitamente. O PARA é sempre convertível num ENQUANTO, o inverso nem sempre é
verdade.
A repetição representa-se em fluxograma utilizando o símbolo da decisão, como se segue.
Condição
F
V
Bloco de
instruções
Exemplo 1.9 Escreva um algoritmo (pseudo código e fluxograma) que permita calcular a média das
notas da turma na disciplina de Introdução à Computação.
16
Erro! Estilo não definido.. Erro! Estilo não definido.
17
Erro! Estilo não definido.. Erro! Estilo não definido.
ler(nota)
soma=soma+nota [soma e depois atribui]
i=i+1
Fenq
media=soma/nalunos
escrever(“A média das notas dos”, nalunos, “é de: “, media)
FIM
No algoritmo anterior o ciclo foi controlado através de uma variável (contadora). Se o número de
repetições não fosse conhecido, poder-se-ia controlar o ciclo através do surgimento de um valor
especial (bandeira), como se ilustra em seguida.
Exemplo 1.10 O algoritmo do exemplo anterior, sem ser conhecido o número de alunos. Neste caso
convencionou-se que o valor -1 significava o fim das notas.
Início [Média das notas]
Def nalunos, i: inteiro; nota, soma, media: real
nalunos=0
soma=0
escrever(“Nota do 1º aluno (-1 para terminar): “)
ler(nota)
Repetir enquanto nota<>-1
soma=soma+nota [soma e depois atribui]
nalunos=nalunos+1
escrever(“Nota do “, i, “º aluno (-1 para terminar): “)
ler(nota)
Fenq
media=soma/nalunos
escrever(“A média das notas dos”, nalunos, “é de: “, media)
FIM
Exemplo 1.11 Desenvolva o algoritmo (pseudo código e fluxograma) que permita calcular a potência
inteira de um número.
Resolução: Notar que este problema, com execepção da soma e do elemento neutro,é em tudo
igual ao anterior, tratando-se agora da acumulação de produtos, o que obriga a iniciá-lo a 1
(elementro neutro da multiplicação).
Início [Potência de um número]
Def base: real; exo: inteiro
escrever(“Qual a Base e o Expoente?”)
ler(base, exp)
pot=1
i=1
Repetir enquanto i<=exp
pot=pot*base [multiplica e depois atribui]
i=i+1
Fenq
escrever(base, “^”, exp, “ = “, pot)
FIM
18
Erro! Estilo não definido.. Erro! Estilo não definido.
INÍCIO
"Qual a base e o
expoente?"
base, exp
pot=1
i=1
i<=exp
F V
pot=pot*base
i=i+1
FIM
Exemplo 1.12 Desenvolva o algoritmo (pseudo código e fluxograma) que permita calcular o factorial de
um dado número.
Exemplo 1.13 Elabore um algoritmo que dado número, crie um segundo que seja o primeiro invertido.
Inicio
Def n, inv, t Inteiro
Inv=0
Ler("Insira um numero: ", n)
t = n
Repetir Enquanto (t <> 0)
inv = inv*10 + t MOD10;
t = t/10;
}
escrever(inv)
Fim
Exemplo 1.14 Elabore um algoritmo (pseudo código e fluxograma) para determinar se um dado número é
ou não primo.
Resolução – Um número é primo se apenas for divisível por ele e pela unidade. Assim para se
determinar se um dado número é primo há que verificar se existe outro pelo qual ele seja divisível.
Isto implica exprimentar dividi-lo por todos os números entre 2 e o número menos 1. Na realidade
basta experimentar entre 2 e a raíz quadrada do número: [ 2 ; N ]
Início [Se número é primo]
Def num, D, Q, resto : inteiro
escrever(“Qual o número?”)
ler(num)
D=2 [divisor (1ºvalor do intervalo)]
Resto=1 [serve qualquer valor diferente de 0]
Repetir enquanto D<=SQRT(num) E resto<>0
Q=num/D
Resto=num-Q*D
D=D+1
19
Erro! Estilo não definido.. Erro! Estilo não definido.
Fenq
Se resto=0
Então escrever(“O número”, num, “ NÃO é Primo“)
Senão escrever(“O número”, num, “ É Primo“)
FSe
FIM
9. TRAÇAGEM
A traçagem consiste em testar um algoritmo para certos valores de entrada, observando o
comportamento interno do algoritmo para esses valores e ao longo dos vários passos que
compôem o algoritmo. Assim, a primeira etapa consiste em numerar os passos do algoritmo. Em
seguida constrói-se uma tabela colocando na primeira linha as entidades que queremos estudar ao
longo dos passos do algoritmo. Variáveis e condições, são as entidades que podem variar, e por
isso aquelas que devemos estudar. Depois é só executar os passos do algoritmo.
Exemplifiquemos para o algoritmo que permite determinar se um dado número é, ou não, primo,
começando por numerar os seus passos.
Início [Se número é primo]
Def num, D, Q, resto : inteiro
P1. escrever(“Qual o número?”)
P2. ler(num)
P3. D=2 [divisor (1ºvalor do intervalo)]
P4. Resto=1 [serve qualquer valor diferente de 0]
P5. Repetir enquanto D<=SQRT(num) E resto<>0
P6. Q=num/D
P7. Resto=num-Q*D
P8. D=D+1
Fenq
P9. Se resto=0
P10. Então escrever(“O número”, num, “ NÃO é Primo“)
P11. Senão escrever(“O número”, num, “ É Primo“)
FSe
FIM
20
Erro! Estilo não definido.. Erro! Estilo não definido.
11. EXERCÍCIOS
Exercício 1.2 Desenvolva um algoritmo, para contar o número de vezes que surge o algarismo zero
num qualquer número inteiro introduzido pelo utilizador.
Exercício 1.3 Elabore um algoritmo que permita determinar, e imprima, o maior número e o menor
número de uma lista de n números introduzidos pelo utilizador.
Exercício 1.4 Desenvolva o algoritmo que permita calcular o valor do somatório com n introduzido
pelo utilizador.
Exercício 1.5 Escreva um programa que imprima o algarismo que se encontra numa dada posição de
um número inteiro. O número inteiro e a posição são introduzidos pelo utilizador.
Exercício 1.6 Em data remota, cerca de 3 séculos a.C., Euclides desenvolveu um método para ?, o
qual é utilizado no algoritmo seguinte:
INÍCIO
Def n1, n2, r : inteiro
Escrever (“Introduzir dois números: “)
Ler(n1, n2)
r = n1 % n2 [ % é o operador que permite obter o resto da divisão entre dois
inteiros]
Repetir enquanto r<>0
n1 = n2
n2 = r
r = n1 % n2
FENQ
Escrever(n2)
FIM
Exercício 1.7 [Frequência 17 de Fevereiro de 1997] Escreva um algoritmo que após ler um número
inteiro, troque os dígitos dos extremos do número (1º com o último).
21
Erro! Estilo não definido.. Erro! Estilo não definido.
Resolução:
Inicio [Troca dígitos extremos de um número inteiro]
Def N, MUL, TEMP, TROCADO Int
Ler(Enúmero?”, N)
Se N > 9 [Só troca se tiver mais de um algarismo]
Entao [Obtem o alg. da direita (o resto)]
DIGDIR = N MOD 10
TEMP = N
MUL = 1
[Reduz o numero (colocado em TEMP) a 2 algarismos]
Repetir Enquanto TEMP > 99
TEMP = TEMP \ 10
MUL = MUL * 10 '
FEnq
[Obtem o alg. da esquerda]
DIGESQ = TEMP \ 10
[Obtem o numero entre os algarismos extremos.Ex: N=2345 ->Meio=34]
MEIO = (N \ 10) MOD MUL
TROCADO = DIGDIR * MUL + MEIO
TROCADO = TROCADO * 10 + DIGESQ
Senao
TROCADO = N
FSe
Escrever("O número"; N; "trocado ="; TROCADO)
Fim
22
III SUBROTINAS
12. INTRODUÇÃO
Os algoritmos que vimos até agora eram constituídos apenas por um módulo, a que se chama
rotina principal, ou simplesmente rotina. No entanto, é possível criar rotinas que podem ser
chamadas dentro de outras rotinas. A essas rotinas que podem ser chamadas a partir de outras,
chama-se sub rotinas.
Vamos estudar dois tipos de sub rotinas, funções e procedimentos. A utilização de sub rotinas
permite modularizar os programas e encapsular processamento o que resulta em programas mais
simples de desenvolver e ler. Quanto mais independentes os módulos (sub rotinas) mais
atentamente nos podemos concentrar sobre cada uma ignorando os restantes.
Com a chamada de uma subrotina é transferido o controlo para essa sub rotina. A diferença entre
funções e procedimentos consiste no facto de as primeiras retornarem um valor, e as segundas
não.
As sub rotinas executam operações sobre dados que lhes são passados, pelo que as sub rotinas
possuem normalmente parâmetros. Por exemplo, a função embutida SQRT(valor) tem definido
um parâmetro, o do valor para o qual se pretende calcular a raiz quadrada. Quando se define na
sub rotina os dados que recebe, chama-se a esses dados parâmetros formais, ou simplesmente
parâmetros. Quando se fala desses dados na chamada (utilização) da sub rotina, chama-se
argumentos a esses dados.
As variáveis definidas nas sub rotinas são criadas no momento em que se inicia a execução da sub
rotina e destruídas no momento em que a sub rotina termina a sua execução.
13. FUNÇÕES
FUNCÃO nome_da_função ([lista_parâmetros]) : tipo
[bloco_instruções [nome = expressão]]
FIM [tb poderia ser utilizado FFUNC]
Nome_da_função O nome da funcão.
Erro! Estilo não definido.. Erro! Estilo não definido.
lista_parâmetros (Opcional) Uma ou mais variáveis que especificam os parâmetros a ser passados à
função quando esta é chamada. Caso não tenha parâmetros, os parêntesis surgem
vazios.
tipo O tipo de dado do valor a retor pela função.
expressão O valor a retornar pela função.
Bloco_instruções (Opcional) O conjunto das instruções contidas na sub rotina que permitem que esta
realize a operação para a qual foi concebida. Uma dessas instruções seria a atribuição à
função do valor a retornar (nome_da_função = expressão).
Quando uma função termina, “deixa ficar” no programa que a chamou o último valor atribuído ao
nome da função.
Exemplo 1.15 Desenvolva uma função que permita calcular o cubo de um número dado como argumento.
Em seguida escreva um programa que use essa função.
Resolução: O parâmetro da função será o número e a função retornará ao programa que a invoque
o cubo desse número.
FUNÇÃO cubo( num )
cubo=num*num*num
FFUNÇÃO
14. PROCEDIMENTOS
PROCEDIMENTO nome_do_procedimento([lista_parâmetros])
[bloco_instruções]
FIM [tb poderia ser utilizado FPROC]
nome O nome da procedimento.
lista_parâmetros (Opcional) Uma ou mais variáveis que especificam os parâmetros a ser passados ao
procedimento quando este é chamado. Caso não tenha parâmetros, os parêntesis surgem
vazios.
Bloco_instruções (Opcional) O conjunto das instruções contidas na sub rotina que permitem que esta
realize a operação para a qual foi concebida.
Exemplo 1.16 Escreva um procedimento que imprima um número inteiro pela ordem inversa.
Resolução:
24
Erro! Estilo não definido.. Erro! Estilo não definido.
14.1 FLUXOGRAMA
Para rotinas principais, foram vistos anteriormente quais os símbolos a utilizar. No caso de sub
rotinas, existem alguns símbolos específicos.
Símbolos Significado
INÍCIO Nome
Início. Utilizar preferencial/e o segundo
ou
FIM
Fim
Nome
Chamada da sub rotina na rotina principal
Uma variável definida no interior de uma rotina diz-se local a essa rotina. Uma variável definida
fora da rotina, será global. Uma variável local apenas é reconhecida na rotina aonde foi
definida,enquanto uma variável global, é reconhecida em todas as rotinas do algoritmo.
14.3 EXERCÍCIOS
Exercício 1.1 Pretende-se calcular o mínimo múltiplo comum de dois números inteiros quaisquer.
a) Escreva uma sub rotina que determine e devolva o mínimo múltiplo comum de dois números
dados como argumentos.
b) Desenvolva um programa que, utilizando o sub algoritmo que desenvolveu na alínea anterior,
calcule o mínimo múltiplo comum de dois números inteiros introduzidos pelo utilizador.
25
IV VECTORES
15. INTRODUÇÃO
Suponha, que se pretendia desenvolver um programa que dadas as notas dos cerca de 4000 alunos
do ISEP, calculasse o desvio de cada uma relativamente à média das notas.
Para o cálculo dos desvios é necessário o cálculo prévio da média, o que implica manter as notas
após o cálculo da média, ou seja, guardar as notas em variáveis. Vamos começar por decompor o
problema, em sub problemas, como se segue:
Problema
Uma solução para guardar cada uma das notas, seria definir 4000 variáveis, por exemplo:
nota_1, nota_2, nota_3, nota_4, nota_5, nota_6, nota_7, nota_8, nota_9, . . . , nota_4000.
Assim, as instruções para a leitura das notas seriam:
Escrever((“Introduza a média do aluno nº 1: “)
Ler(nota_1)
...
4000 vezes, o que se revela completamente impraticável. Seria preferível a possibilidade de
definir as 4000 variáveis de uma só vez, por exemplo da seguinte forma:
nota(1 até 4000)
em que nota(1) guardaria a nota do aluno 1, nota(2) a do aluno 2, e assim sucessivamente
fazendo variar o valor do índice até 4000. Mas utilizar constantes como índice continua a obrigar
Erro! Estilo não definido.. Erro! Estilo não definido.
a repetir as 4000 instruções. Então é necessário definir uma variável inteira para índice, por
exemplo:
num
Deste modo, para a leitura das 4000 notas, poder-se-ia utilizar um ciclo, como a seguir se ilustra:
REPETIR PARA num=1 Até 4000 Passo 1
Escrever(“Introduza a nota do aluno nº “, num)
Ler(nota(num))
FPara
15.1 DEFINIÇÃO
A solução anterior representa uma melhoria extraordinária relativamente à primeira solução. A
generalidade das linguagens de programação fornece este tipo de dados, chamado vector3.
Vector pode-se então definir como um conjunto de tamanho fixo de elementos do mesmo tipo
ocupando posições contíguas. Antes de se utilizar um vector, deve-se proceder à sua declaração,
cuja sintaxe é:
Def nome_vector( {fim | inicio ATÉ fim] )
Em que:
nome_vector é o nome do vector (escolhido pelo programador)
inicio é o valor início do índice
fim é o valor máximo do índice
Ao índice da primeira posição de um vector chama-se base do vector, que no caso de não ter sido
explicitado é zero.
O número de posições do vector é igual a fim menos início mais um, não sendo obrigatório
preencher todas as posições com valores.
O número de posições ocupadas pode ser feito de uma das seguintes formas:
− através de uma variável contendo este número,
− de uma flag (bandeira) na posição imediatamente a seguir à última ocupada, significando o
"fim" do vector.
Alguns exemplos de declaração de vectores:
Def notas(1 até 20)
Define um vector unidimensional chamado notas com 20 posições numeradas de 1 a 20.
Def notas(19)
Define um vector unidimensional chamado notas com 20 posições numeradas de 0 a 19.
Outro exemplo, mas de um vector bidimensional,
Def ecra(1 até 5, 1 até 10)
Define um vector bidimensional chamado ecra com 5 posições para primeira dimensão e 10
posições para cada uma das 5 posições da primeira dimensão. Vectores bidimensionais são usados
frequentemente para representar matrizes matemáticas. Visualizando:
1 2 3 4 5 6 7 8 9 10
1
2
3
4
5
28
Erro! Estilo não definido.. Erro! Estilo não definido.
Um vector pode ter as dimensões que se pretenderem, fazendo-se a sua separação por vírgulas.
Exemplo 1.17 Os engenheiros químicos de um laboratório pretendem saber se existe diferença entre as
médias dos valores diurno e nocturno do PH de uma determinada solução. Para isso, durante o mês
de Janeiro, mediram, duas vezes por dia (uma medição de dia e outra à noite), o PH dessa solução.
Elabore um algoritmo que após ler os valores dos PH para dois vectores, permita responder à
dúvida dos engenheiros do laboratório.
Resolução:
Inicio
Def dia(31) Real, noite(31) Real, mdia Real, mnoite Real
Exemplo 1.18 Considere que se pretende colocar uma moldura de zeros à volta dos valores de uma
matriz. Para isso elabore uma sub-rotina que copie uma dada matriz para uma segunda que deverá
incluir a moldura pretendida, como ilustrado na figura seguinte.
0 1 2 3 4 0 1 2 3 4 5 6
0 31 46 2 19 19 0 0 0 0 0 0 0 0
1 12 15 37 14 34 → 1 0 31 46 2 19 19 0
2 9 8 16 4 24 2 0 12 15 37 14 34 0
3 19 100 18 24 24 3 0 9 8 16 4 24 0
4 0 19 100 18 24 24 0
5 0 0 0 0 0 0 0
Nota: Assuma que a matriz destino possui o espaço necessário para a moldura, pelo que não deverá preocupar-se com
isso durante o desenvolvimento da sub-rotina.
Resolução: Resolução concebida a partir da saída (matriz destino), isto é o ciclo está pensado
para percorrer as posições da matriz destino aonde vai ficar a matriz origem.
Proc moldura(M1(,) Int, l Int, c Int, M2(,) Int)
Def l2 Int, c2 Int
l2=l1+2
c2=c1+2
Repetir para i=1 to l2-2 [1 á a segunda linha]
Repetir para j=1 to c2-2 [1 á a segunda coluna. Logo começa na 1,1]
M2(i,j)=M1(i-1,j-1)
Fpara
FPara
Fim Proc
29
Erro! Estilo não definido.. Erro! Estilo não definido.
15.2 PESQUISA
Vamos ver como pesquisar um certo valor num vector, através de um exemplo.
Exemplo 1.19 Elabore um programa que após determinar se um dado valor existe, ou não, num vector
escreva a respectiva mensagem.
Resolução: As estruturas de dados são o vector e o valor a procurar. Em primeiro lugar lêem-se
valores para o vector, em seguida faz-se a pesquisa. A pesquisa consiste em percorrer o vector até
encontrar o valor, se ele existir, ou até se chegar ao fim do vector. Como só faz sentido perguntar
se o valor foi encontrado no caso de ainda não se ter chegado ao final do vector, a ordem das
condições deverá ser trocada. A condição do ciclo que permite percorrer o vector será então:
não se chegou ao fim do vector E elemento do vector <> valor procurado
Quando uma destas condições for falsa, o ciclo terminará.
INÍCIO
Def val( 1 to 100)
Escrever(“Quantos valores?”)
Ler(n)
[Leitura de valores para o vector val]
Repetir Para i=1 até n
Escrever(“Valor?”)
Ler(val(i))
FPara
Escrever(“Qual o valor que pretende procurar?”)
Ler(procurado)
[Pesquisa de procurado]
i=1
Repetir Enquanto i<=n E val(i)<>procurado
i=i+1
FEnq
Se i<=n
Então Escrever(procurado, “ existe!”)
Senão Escrever(procurado, “ Não existe!”)
FSe
FIM
15.3 ELIMINAÇÃO
A eliminação de um elemento de um vector pode ser feita de duas formas distintas.
- Uma primeira consiste em colocar na posição do elemento a eliminar um valor impossível de
ocorrer.
- A segunda consiste em deslocar cada um dos elementos seguintes, ao que se pretende
eliminar, uma posição para baixo e actualizar o número de elementos do vector.
Exemplo 1.20 Do seguinte vector com n elementos pretende-se eliminar o elemento da posição índice 2:
31 5 46 19 47 12 ...
0 1 2 3 4 5
Após eliminação, resulta um vector de n-1 elementos:
31 5 19 47 12 ...
0 1 2 3 4
Para o primeiro método é necessário o vector, o elemento a eliminar e o número, Desenvolva o
algoritmo, em pseudo código, de uma sub rotina que dado um vector de notas de alunos, o seu
número de elementos e a posição do elemento a eliminar proceda à respectiva eliminação pelo
primeiro método.
30
Erro! Estilo não definido.. Erro! Estilo não definido.
15.4 EXERCÍCIOS
Exercício 1.1 Desenvolva o algoritmo, em pseudo código, de uma sub rotina que dado um vector de
notas de alunos, o seu número de elementos e a posição do elemento a eliminar proceda à
respectiva eliminação pelo segundo método.
Exercício 1.2 Elabore um algoritmo que permita eliminar o menor elemento de um vector
introduzido pelo utilizador. Pode utilizar rotinas que já tenha desenvolvido.
31
Erro! Estilo não definido.. Erro! Estilo não definido.
32
17. EXERCÍCIOS
Exercício 1.3 Escreva um programa que permita determinar o maior valor (máximo) existente num
vector.
Exercício 1.4 Como sabe, podemos calcular a massa atómica (peso atómico) de um elemento, MAe,
a partir da massa atómica e abundância relativa de cada um dos seus isótopos, usando a seguinte
expressão:
∑ (MAi * Pi )
n
MAe – massa atómica do elemento e
MAi – massa atómica de cada isótopo
MA e = i =1 100
Pi – abundância relativa de cada isótopo (1-100)
Em que i varia entre 1 e o número de isótopos, n.
a) Desenvolva o algoritmo duma sub rotina que realize o somatório do numerador e devolva o
resultado. O algoritmo terá como parâmetros: dois vectores (um contendo os MAi e o outro os
Pi) e o seu número de elementos (isótopos), n.
b) Escreva um algorimto que calcule o peso atómico de um elemento, MAe. Para tal, utilize o sub
algoritmo que desenvolveu na alínea anterior.
Exercício 1.5 Numa matriz, um mínimo local é o valor que tem à sua volta apenas valores superiores
a si próprio. Elabore uma sub-rotina que dada uma matriz de números reais maiores ou iguais a
zero, determine os seus mínimos locais colocando-os num vector, e no final devolva o número de
mínimos encontrados. Tanto a matriz como o vector deverão ser parâmetros da sub-rotina a
desenvolver. Para simplificação considere que a matriz possui uma orla a zeros, que, obviamente,
não devem ser considerados como possíveis mínimos.
Exemplo: Matriz de 6 linhas por 7 colunas.
0 1 2 3 4 5 6 0 1 2
0 0 0 0 0 0 0 0 → 8 2 4
1 0 31 46 2 19 19 0
2 0 12 15 37 14 34 0
3 0 9 8 16 4 24 0
4 0 19 100 18 24 24 0
5 0 0 0 0 0 0 0
Resolução: A sub rotina deverá ser uma função porque se pretende que retorne um valor (o número de
mínimos). A função tem como parâmetros a matriz, os números de linhas e colunas da matriz e ainda o
vector que irá conter os mínimos. A solução seguinte, pode ser considerada, uma solução do tipo “força
bruta”, no entanto, é bastante clara.
Função Mininos(x(,) Real, l int, c int, Min() Real) Int
Def p Int [variável para índice do vector que guardará mínimos]
p=0
[Os dois ciclos que permitem “percorrer” a matriz, ignorando a orla]
Repetir para i=1 to l-2
Repetir para j=1 to c-2
[Procura mínimo: na 1ª linha compara posição actual com posições da linha
acima, depois compara com posições da linha abaixo, e finalmente compara
com as duas posições da sua própria linha]
Erro! Estilo não definido.. Erro! Estilo não definido.
Exercício 1.6 Suponha que as notas dos alunos de duas turmas são lidas para dois vectores, um para
cada turma. Considere que as notas foram inseridas em ambos os vectores ordenadamente, da
menor para a maior. Escreva um programa que “funda” ordenadamente os dois vectores de notas
num terceiro.
Exercício 1.7 Uma área abaixo de uma dada curva pode ser aproximada a partir de n pontos (x1,y1),
(x2,y2), ..., (x2,y2), definindo-se pequenos rectângulos e calculando-se a área destes rectângulos.
Supondo que os valores de x estão igualmente espaçados e que o número de pontos é ímpar a área
pode ser aproximada através da regra de Simpson, cuja equação é a seguinte:
Area = ( y1 + 4 y 2 +2 y3 + 4 y4 + 2 y5 + ... + yn )d / 3
em que d é a distância entre dois valores sucessivos de x. Elabore um algoritmo que calcule a
área aproximada sob a curva y = e x , para x a variar entre 0 e 1 (e = 2.718281828).
V PROGRAMAÇÃO ORIENTADA
POR OBJECTOS
34
Erro! Estilo não definido.. Erro! Estilo não definido.
Resumindo, um objecto:
• Possui propriedades e métodos.
• Para se usar um objecto, este deve ser previamente identificado.
• Existe um conjunto de eventos que o objecto reconhece.
Cada objecto é definido como um caso particular (uma instância) de uma dada classe de objectos.
Por outras palavras, um objecto é como uma variável de um dado tipo (classe). Assim, para
criarmos os nossos proprios objectos, há que definir em primeiro lugar a respective classe.
Propriedade, é um atributo do objecto (o valor das propriedades definem o estado do objecto).
Ex: altura, largura. Para alterar uma propriedade atribui-se um novo valor a essa propriedade.
Método, é uma operação que um objecto pode realizar.
Para se aceder a uma propriedade ou método:
Objecto.{propriedade | método}
Exemplo 1.21 Mudar a côr de um objecto Carro1, do tipo carro para azul. Assumir que a classe de
objectos carro possui uma propriedade cor que contéma côr do carro. Mudar a côr de um carro
chamado carro1, consistirá em atribuir o valor pretendido da côr à sua propriedade cor.
Carro1.cor= Azul
Exemplo 1.22 Sub-rotina definida pelo utilizador que move o botão command1 para a posição x,y. dada
como argumento.
Procedimento MoveBotao(x,y)
Command1.Move x, y
FProc
Pode-se obter o valor de uma propriedade. O exemplo seguinte permite visualizar o valor da
propriedade caption de um etiqueta chamada Label1.
Escrever(Label1.Caption)
Algumas propriedades não podem ser alteradas, são apenas de leitura (“read only”).
Evento (ou acontecimento), é uma acção que um objecto pode reconhecer, e que ocorre em
consequência da acção do utilizador, desencadeada pelo sistema, ou por acção do programa.. Ex:
Premir o botão do “rato” sobre um botão. Em resposta ao evento podem-se desencadear acções.
Estas acções correspondem a sub-rotinas.
Vamos convencionar o seguinte: para fazer com que um objecto reaja a um evento, escreve-se
uma sub-rotina cujo nome é formado pela associação do nome do objecto, o carácter “_” e o nome
do evento.
Exemplo: Clicar um botao chamdo botao1, existente numa janela,
Procedimento botao1_clicar()
35
Erro! Estilo não definido.. Erro! Estilo não definido.
FProc
36
APÊNDICE A. EXEMPLOS DO
PNEU FURADO E DA LÂMPADA
FUNDIDA
Exemplo 1.23 Elabore um algoritmo que permita a um robot efectuar a mudança do pneu furado de uma
viatura.
1ºTopDown (graficamente):
Substituição do
pneu furado
Colocar macaco
Ir buscar macaco Retirar pneu Guardar
em posição
+pneu furado e substituí- macaco+pneu
correta e elevar o
bom+chave lo furado+chave
carro
Exemplo 1.24 Elabore um algoritmo que permita a um robot efectuar a mudança de uma lâmpada
fundida.
38
Erro! Estilo não definido.. Erro! Estilo não definido.
39