Beruflich Dokumente
Kultur Dokumente
Jorge Santos
Aviso de licena de utilizao: Este documento pode ser utilizado livremente para ns no comerciais, permitido aos seus utilizadores, copiar, distribuir e exibir publicamente os seus contedos, desde que sejam ressalvados os direitos de autor do mesmo, nomeadamente, dever ser sempre includa esta pgina em todas as cpias. Jorge Santos, 2006
ndice
1 Algoritmia e Programao 1.1 Conceitos bsicos . . . . . . . . . . . . . . . . . . . . . . . . . . . 1.1.1 Introduo . . . . . . . . . . . . . . . . . . . . . . . . . . . 1.1.2 Programao estruturada . . . . . . . . . . . . . . . . . . 1.1.3 Notao utilizada . . . . . . . . . . . . . . . . . . . . . . . 1.1.4 Operadores utilizados nos algoritmos . . . . . . . . . . . 1.2 Instrues sequenciais . . . . . . . . . . . . . . . . . . . . . . . . 1.2.1 Sada de dados . . . . . . . . . . . . . . . . . . . . . . . . 1.2.2 Entrada de dados . . . . . . . . . . . . . . . . . . . . . . . 1.2.3 Atribuio . . . . . . . . . . . . . . . . . . . . . . . . . . . 1.2.4 Exerccios Resolvidos . . . . . . . . . . . . . . . . . . . . 1.2.4.1 Cambiar moedas . . . . . . . . . . . . . . . . . . 1.2.4.2 Distncia euclidiana entre dois pontos . . . . . 1.2.4.3 Determinar permetro e rea de circunferncia . 1.2.5 Exerccios Propostos . . . . . . . . . . . . . . . . . . . . . 1.2.5.1 Calcular ndice de massa corprea (IMC) . . . . 1.2.5.2 Converter horas, minutos e segundos . . . . . . 1.2.5.3 Teorema de Pitgoras . . . . . . . . . . . . . . . 1.2.5.4 Converter temperaturas . . . . . . . . . . . . . . 1.3 Instrues de Deciso . . . . . . . . . . . . . . . . . . . . . . . . . 1.3.1 Deciso binria . . . . . . . . . . . . . . . . . . . . . . . . 1.3.2 Deciso mltipla . . . . . . . . . . . . . . . . . . . . . . . 1.3.3 Exerccios Resolvidos . . . . . . . . . . . . . . . . . . . . 1.3.3.1 Distncia euclidiana entre dois pontos . . . . . 1.3.3.2 Classicar em funo da mdia . . . . . . . . . 1.3.3.3 Determinar o mximo de 3 valores . . . . . . . 1.3.3.4 Determinar tringulo vlido . . . . . . . . . . . 1.3.4 Exerccios Propostos . . . . . . . . . . . . . . . . . . . . . 1.3.4.1 Classicar tringulo . . . . . . . . . . . . . . . . 1.3.4.2 Diviso . . . . . . . . . . . . . . . . . . . . . . . 1.3.4.3 Resolver equao da forma ax2 + bx + c = 0 . . 1.3.4.4 Converter entre escalas de temperaturas . . . . 1.3.4.5 Calcular ndice de massa corprea (IMC) . . . . 1 1 1 3 5 6 7 7 8 9 10 11 11 12 12 12 12 13 13 13 13 15 17 17 17 18 20 21 21 21 22 22 22
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
iii
1.4
1.5 1.6
1.7
1.3.4.6 Determinar ano bissexto . . . . . . . . . . . . . . . . . 1.3.4.7 Parque de estacionamento . . . . . . . . . . . . . . . . Instrues de Repetio (Ciclos) . . . . . . . . . . . . . . . . . . . . . . . 1.4.1 Ciclo condicional: repetir-at . . . . . . . . . . . . . . . . . . . . 1.4.2 Ciclo condicional: enquanto-fazer . . . . . . . . . . . . . . . . . 1.4.3 Ciclo determinstico: para-fazer . . . . . . . . . . . . . . . . . . . 1.4.4 Exerccios Resolvidos . . . . . . . . . . . . . . . . . . . . . . . . 1.4.4.1 Calcular somatrio entre dois limites . . . . . . . . . . 1.4.4.2 Calcular factorial de um nmero . . . . . . . . . . . . 1.4.4.3 Determinar se um nmero primo . . . . . . . . . . . 1.4.4.4 Determinar nome e idade da pessoa mais nova de um grupo . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1.4.4.5 Determinar o aluno melhor classicado e a mdia das notas de uma turma . . . . . . . . . . . . . . . . . . . . 1.4.5 Exerccios Propostos . . . . . . . . . . . . . . . . . . . . . . . . . 1.4.5.1 Diviso atravs de subtraces sucessivas . . . . . . . 1.4.5.2 Determinar o mximo e mnimo de uma srie . . . . . 1.4.5.3 Determinar quantidade de nmeros primos . . . . . . 1.4.5.4 Determinar se um nmero perfeito . . . . . . . . . . 1.4.5.5 Calcular potncia por multiplicaes sucessivas . . . . 1.4.5.6 Maior nmero mpar de uma sequncia de valores . . 1.4.5.7 Algarismos de um nmero . . . . . . . . . . . . . . . . 1.4.5.8 Apresentao grca de temperaturas . . . . . . . . . 1.4.5.9 Soma dos algarismo de um nmero . . . . . . . . . . . 1.4.5.10 Jogo de adivinhar o nmero . . . . . . . . . . . . . . . 1.4.5.11 Capicua de um nmero . . . . . . . . . . . . . . . . . . 1.4.5.12 Converso de base numrica . . . . . . . . . . . . . . . Traagens e Teste . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Programao modular . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1.6.1 Sub-rotinas, parmetros e variveis locais . . . . . . . . . . . . . 1.6.1.1 Funes . . . . . . . . . . . . . . . . . . . . . . . . . . . 1.6.1.2 Procedimentos . . . . . . . . . . . . . . . . . . . . . . . 1.6.2 Exerccios resolvidos . . . . . . . . . . . . . . . . . . . . . . . . . 1.6.2.1 Funo que devolve o maior algarismo de um nmero 1.6.2.2 Funo que indica se um nmero perfeito . . . . . . 1.6.3 Exerccios propostos . . . . . . . . . . . . . . . . . . . . . . . . . 1.6.3.1 Funo mdia de dois nmeros . . . . . . . . . . . . . 1.6.3.2 Funo lei de Ohm . . . . . . . . . . . . . . . . . . . . . 1.6.3.3 Funo somatrio . . . . . . . . . . . . . . . . . . . . . 1.6.3.4 Funes para codicar e descodicar nmeros . . . . 1.6.3.5 Nmeros primos . . . . . . . . . . . . . . . . . . . . . . Recursividade . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1.7.1 Exerccios Resolvidos . . . . . . . . . . . . . . . . . . . . . . . . 1.7.2 Exerccios Propostos . . . . . . . . . . . . . . . . . . . . . . . . .
23 23 23 24 24 25 27 27 28 29 30 31 32 32 33 33 33 33 33 33 34 34 34 34 34 35 36 37 37 39 39 39 40 41 41 41 41 41 42 42 42 43
iv
Estruturas de dados 2.1 Vectores . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2.1.1 Exerccios resolvidos . . . . . . . . . . . . . . . . . 2.1.1.1 Funes manipulando vectores . . . . . 2.1.2 Exerccios propostos . . . . . . . . . . . . . . . . . 2.1.2.1 Determinar desvio padro de uma srie 2.1.2.2 Prova de atletismo . . . . . . . . . . . . . 2.2 Ordenao e pesquisa de vectores . . . . . . . . . . . . . . 2.2.1 Ordenao por seleco . . . . . . . . . . . . . . . 2.2.2 Pesquisa Sequencial . . . . . . . . . . . . . . . . . 2.2.3 Exercicios resolvidos . . . . . . . . . . . . . . . . . 2.2.3.1 Inverter um vector . . . . . . . . . . . . . 2.2.4 Exerccios propostos . . . . . . . . . . . . . . . . . 2.2.4.1 Juno ordenada de vectores . . . . . . . 2.2.4.2 Mtodo de ordenao por troca directa . 2.2.4.3 Filtro grco . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . .
. . . . . . . . . . . . . . .
. . . . . . . . . . . . . . .
. . . . . . . . . . . . . . .
. . . . . . . . . . . . . . .
. . . . . . . . . . . . . . .
. . . . . . . . . . . . . . .
. . . . . . . . . . . . . . .
45 45 48 48 50 50 50 51 51 52 53 53 54 54 54 54
vi
Lista de Figuras
1.1 1.2 1.3 1.4 1.5 1.6 1.7 1.8 1.9 1.10 1.11 1.12 1.13 1.14 1.15 1.16 1.17 2.1 2.2 2.3 2.4 Estrutura de um computador . . . . . . . . . . . . . . . . . . . . . . . Notao dos Fluxogramas . . . . . . . . . . . . . . . . . . . . . . . . . Fluxograma e sintaxe - Instrues sequenciais . . . . . . . . . . . . . . Fluxograma e sintaxe - Sada de dados . . . . . . . . . . . . . . . . . . Fluxograma e sintaxe - Entrada de dados . . . . . . . . . . . . . . . . Fluxograma e sintaxe - Atribuio . . . . . . . . . . . . . . . . . . . . Fluxograma e sintaxe - Instruo deciso se-ento . . . . . . . . . . . Fluxograma e sintaxe - Instruo deciso se-ento-seno . . . . . . . Fluxograma e sintaxe - Instruo deciso mltipla seleccione-caso Fluxograma da determinao do mximo de 3 valores . . . . . . . . . Fluxograma e sintaxe - Instruo ciclo repetir-at . . . . . . . . . . Fluxograma e sintaxe - Instruo ciclo enquanto-fazer . . . . . . . . Fluxograma e sintaxe - Instruo ciclo para-fazer . . . . . . . . . . . Diviso inteira atravs de subtraces sucessivas . . . . . . . . . . . . Fluxograma e sintaxe - Funo . . . . . . . . . . . . . . . . . . . . . . Fluxograma e sintaxe - Procedimento . . . . . . . . . . . . . . . . . . . Ilustrao da lei de Ohm . . . . . . . . . . . . . . . . . . . . . . . . . . Vector unidimensional: notas . . . . . . Vector bidimensional (matriz): imagem Imagem vdeo - original . . . . . . . . . Imagem vdeo - em tratamento . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2 5 8 8 9 9 13 14 15 19 24 25 26 35 38 39 41 47 47 55 55
vii
viii
Lista de Tabelas
1.1 1.2 1.3 1.4 1.5 1.6 1.7 1.8 Operadores relacionais . . . . Operadores aritmticos . . . . Operadores lgicos . . . . . . Tabela de verdade - conjuno Tabela de verdade - disjuno Tabela de verdade - negao . ndice de massa corprea . . Traagem do algoritmo 1.14 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6 6 7 7 7 7 22 36
Lista de Algoritmos
1.1 1.2 1.3 1.4 1.5 1.6 1.7 1.8 1.9 1.10 1.11 1.12 1.13 1.14 1.15 1.16 1.17 1.18 1.19 2.1 2.2 Cambiar euro para dlar . . . . . . . . . . . . . . . . . . . . . . . . . . . . Calcular distncia euclidiana entre pontos . . . . . . . . . . . . . . . . . Determinar permetro e rea de circunferncia . . . . . . . . . . . . . . . Mquina de furao - deciso mltipla . . . . . . . . . . . . . . . . . . . Mquina de furao - deciso binria . . . . . . . . . . . . . . . . . . . . Calcular distncia euclidiana entre pontos . . . . . . . . . . . . . . . . . Classicar em funo da mdia . . . . . . . . . . . . . . . . . . . . . . . . Calcular mximo de 3 nmeros . . . . . . . . . . . . . . . . . . . . . . . . Calcular mximo de 3 nmeros . . . . . . . . . . . . . . . . . . . . . . . . Validar tringulo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Calcular somatrio entre dois limites . . . . . . . . . . . . . . . . . . . . Calcular factorial de um nmero . . . . . . . . . . . . . . . . . . . . . . . Determinar se um nmero primo . . . . . . . . . . . . . . . . . . . . . . Determinar se um nmero primo . . . . . . . . . . . . . . . . . . . . . . Determinar nome/idade da pessoa mais nova . . . . . . . . . . . . . . . Determinar o aluno melhor classicado e a mdia das notas de uma turma Diviso inteira atravs de subtraces sucessivas (numerado) . . . . . . Funo maior(n) que devolve o maior algarismo de um nmero . . . . Funo perfeito(N) que indica se um nmero perfeito . . . . . . . . . . Manipulao de Vectores (leitura, diferena entre mximo e mnimo e nmero de pares e mpares) . . . . . . . . . . . . . . . . . . . . . . . . . . Utilizar a pesquisa sequencial) . . . . . . . . . . . . . . . . . . . . . . . . 11 11 12 16 16 17 18 19 20 21 28 29 29 30 31 32 35 40 40 50 53
ix
Resumo
Estes apontamentos tm como objectivo principal apoiar os leitores que pretendam aprender programao de computadores Os contedos propostos tm como objectivo fornecer bases slidas de metodologias de programao que auxiliem a compreenso de programas computacionais simples, a sua adaptao e desenvolvimento de novas aplicaes, e estimular a capacidade dos leitores para: analisar e resolver problemas de programao. A estrutura destes apontamentos foi denida de acordo com a abordagem de aprender-por-exemplo, pelo que, os conceitos so apenas introduzidos de acordo com a necessidade de explicar a resoluo de um determinado algoritmo. Neste manual introduzem-se as bases da algoritmia de acordo com o paradigma da programao estruturada. Em cada seco apresentada um pequena introduo terica sobre o tpico em destaque, apresentados problemas e propostas solues para os mesmos, adicionalmente so propostos exerccios para resoluo. Na codicao/apresentao das solues geralmente Pseudo-Cdigo e/ou Fluxogramas. Este documento compila exerccios de vrios anos de ensino de muitos docentes do departamento nos quais me incluo. Ao longo do manual podero ser encontrados exemplos e exerccios propostos pelos docentes nas disciplinas de Algoritmia e Programao, Linguagens de Programao I do curso de Engenharia Informtica do Departamento de Engenharia Informtica (DEI), bem como de Programao I e Programao II do curso Engenharia Electrotcnica do Departamento de Engenharia Electrotcnica (DEE), ambos do ISEP.
xi
xii
Agradecimentos
Gostaria de agradecer aos colegas que permitiram a utilizao do seu material pedaggico, em particular, Alberto Sampaio, Ana Almeida Figueiredo, Ana Madureira, Carlos Vaz de Carvalho, Conceio Neves, Isabel Sampaio e Jos Avelino. Estou igualmente grato a todos aqueles que reviram o manual e deram inmeras sugestes para o seu melhoramento, nomeadamente Berta Baptista, Paulo Ferreira e Nuno Silva. Pese embora a inmeras sugestes/correes propostas pelos referidos colegas, quaisquer erros e gralhas que subsistam no documento so, naturalmente, da minha inteira responsabilidade. Porto, Fevereiro de 2006 Jorge Santos
xiii
1.1.1 Introduo
Informtica a cincia que estuda a informao, em particular, preocupa-se com a estrutura, criao, gesto, armazenamento, pesquisa, disseminao e transferncia de informao. Para alm disso, a informtica estuda a aplicao da informao nas organizaes. A palavra informtica resultado da contraco das palavras: informao automtica. A matria prima da informtica a informao, na sua forma mais simples, dados e a ferramenta bsica o computador. O computador est para a informtica assim como o telescpio para astronomia. Um computador um conjunto de circuitos elctricos e electrnicos capaz de realizar de modo autnomo uma determinada tarefa, por obedincia a um programa armazenado internamente. Assim, um computador pode ser visto como um sistema de computao que compreende hardware e software (ver gura 1.1). Hardware - esta a componente material/fsica do computador, que fornece a capacidade de:
COMPUTADOR Software
Aplicaes Ferramentas de desenvolvimento Sistema Operativo
Mmoria
CPU
Perifricos
Hardware
Figura 1.1: Estrutura de um computador
executar um determinado tipo de instrues a uma determinada velocidade; armazenar um conjunto de bytes; comunicar com um conjunto de perifricos. Estas componentes fsicas tm que receber ordens do que fazer e como se articular. Esta a funo do software. Software - esta a componente lgica do computador, que consiste num conjunto de programas que dirigem o funcionamento do computador. Para uma melhor sistematizao do software e as respectivas funes, este pode ser organizado nas seguintes categorias: Software de Sistema Operativo - conjunto de programas que comunica directamente com o hardware e responsvel pela gesto de recursos e perifricos. Neste conjunto incluem-se o sistema operativo e os programas de controle do funcionamento do hardware, tais como programas de parametrizao, drivers e ans. Ferramentas de desenvolvimento - conjunto de aplicaes utilizadas no desenvolvimento de aplicaes. Neste conjunto incluem-se as linguagens de programao (compiladores e interpretadores) e os sistemas de gesto de bases de dados.
Incio/Fim
Processamento
Entrada de dados
Deciso
Incio de sub-rotina
Sada de dados
Figura 1.2: Notao dos Fluxogramas Na escrita dos programas em pseudo-cdigo sero considerados as seguintes opes: Os algoritmos so delimitados pelas etiquetas incio e fim; As etiquetas Entrada: e Sada: so utilizadas na explicitao das entradas e sadas de dados, respectivamente, mais relevantes para o funcionamento do algoritmo; Os comentrios so precedidos do caracter # e so meramente documentais, como tal, no so executados; As aces so descritas atravs de verbos no innitivo; Foram utilizadas diferentes formataes para os conceitos a seguir explicitados, com o objectivo de tornar a leitura dos algoritmos mais simples: varivel;
Tabela 1.1: Operadores relacionais Smbolo < > = = Nome menor que maior que maior ou igual que menor ou igual que igual a diferente de Exemplo a<b a>b ab ab a=b a=b Resultado falso verdadeiro verdadeiro falso falso verdadeiro
Na tabela 1.2 so apresentados os operadores aritmticos considerados e respectiva semntica. Na explicitao dos operadores considerem-se as variveis a e b apresentado os valores 13 e 5, respectivamente.
Tabela 1.2: Operadores aritmticos Smbolo + * / div % Nome soma subtraco multiplicao diviso diviso inteira resto da diviso inteira Exemplo a+b ab ab a/b a div b a%b Resultado 18 8 65 2.6 2 3
Na tabela 1.3 so apresentados os operadores lgicos considerados, a conjuno, disjuno e negao. Na avaliao das expresso lgicas utilizada a lgica Boole de acordo com as tabelas de verdade de cada operao, conjuno (tabela 1.4), disjuno (1.5) e negao (1.6).
Tabela 1.3: Operadores lgicos Smbolo e, ou , no, Nome conjuno disjuno negao
Tabela 1.4: Tabela de verdade - conjuno a falso falso verdadeiro verdadeiro b falso verdadeiro falso verdadeiro ab falso falso falso verdadeiro
Tabela 1.5: Tabela de verdade - disjuno a falso falso verdadeiro verdadeiro b falso verdadeiro falso verdadeiro ab falso verdadeiro verdadeiro verdadeiro
a verdadeiro falso
Figura 1.3: Fluxograma e sintaxe - Instrues sequenciais inicio ... escrever <lista-de-variaveis/textos>; ... fim
escrever
incio
escrever x;
# Escrever o contedo das variveis nome e idade;
ler
incio
# ler a varivel x;
ler x;
# ler as variveis nome e idade;
ler nome,idade; m
1.2.3 Atribuio
A instruo designada por atribuio permite atribuir o valor de uma expresso a uma varivel. A varivel que aparece no lado esquerdo da instruo vai assim receber o valor da expresso que aparece no lado direito da mesma instruo. Do lado direito da atribuio podemos ter: um nmero, um texto, o resultado de um clculo ou o contedo de uma outra qualquer varivel. Na gura 1.6 apresentada a sintaxe proposta para a atribuio.
var expr
x 5;
# Atribuir o resultado da operao 5*5-2=23 varivel resultado;
resultado 5*5-2;
# Atribuir o valor da varivel n varivel maximo;
maximo n;
# Atribuir o texto "Ol Mundo" varivel txt;
txt "Ol mundo"; m No exemplo seguinte so realizados dois incrementos consecutivos da varivel contador. De incio atribudo o valor 1 a contador e posteriormente esta tomar o valor 2 e 3. incio
# Inicializao da varivel contador;
contador 1;
# Incremento da varivel contador;
contador contador+1;
# O resultado desta instruo 2;
escrever contador;
# Incremento da varivel contador;
contador contador+1;
# O resultado desta instruo 3;
escrever contador; m As linguagens de programao mais divulgadas utilizam o smbolo = para representar a atribuio. A razo de ser dessa opo de ordem prtica: resulta da inexistncia do smbolo nos teclados dos computadores. Note-se que caso fosse utilizado smbolo = o aspecto da instruo seria: contador=contador+1, o que constitui uma impossibilidade em termos estritamente matemticos. Chama-se a ateno para o facto de as linguagens estudadas normalmente pelos principiantes em informtica serem linguagens imperativas. Isto , o que o programador escreve no programa no so expresses matemticas mas ordens (da o imperativo) para o computador cumprir. O computador vai ver a atribuio no como uma igualdade matemtica (seja ela escrita com ou com = ), mas como uma ordem para primeiro calcular o valor da expresso direita e depois guardar esse valor na varivel indicada esquerda.
10
O algoritmo 1.1 permite cambiar euros em dlares considerando a taxa de converso 1,17. Entrada: taxa, valorEuro Sada: valorDolar incio taxa 1,17; # Ler valor em euros; escrever "Introduza valor em euros="; ler valorEuro; # Calcular valor em dlar; valorDolar valorEuro*taxa; # Mostrar resultado; escrever "Valor em dolar=", valorDolar; m Algoritmo 1.1: Cambiar euro para dlar Sugesto: Escreva uma variao deste algoritmo que permita cmbios entre quaisquer moedas. 1.2.4.2 Distncia euclidiana entre dois pontos
O algoritmo 1.2 permite realizar o clculo da distncia euclidiana entre dois pontos, sendo que cada ponto denido pelas coordenadas (x,y). A distncia pode ser calculada de acordo com a frmula 1.2.1. distncia = Entrada: x1, y1, x2, y2 Sada: distancia incio
( x2 x1 )2 + ( y2 y1 )2
(1.2.1)
escrever "Coordenadas ponto1 (x/y):"; ler x1,y1; # Ler coordenadas do ponto 2; escrever "Coordenadas ponto2 (x/y):"; ler x2,y2; # Calcular distncia; distancia (x2 x1)2 + (y2 y1)2 ; # Mostrar resultado; escrever "Distncia=", distancia; m Algoritmo 1.2: Calcular distncia euclidiana entre pontos
11
O algoritmo 1.3 permite determinar o permetro e rea de uma circunferncia, a partir do valor do raio. Entrada: raio Sada: perimetro, area incio pi 3,1415; # Ler o valor do raio; escrever "Introduza valor do raio:"; ler raio; # Calcular permetro e rea; area pi raio2 ; perimetro 2 pi raio; # Apresentar resultados; escrever "rea=", area; escrever "Permetro=", perimetro; m Algoritmo 1.3: Determinar permetro e rea de circunferncia
O ndice de massa corprea (IMC) de um indivduo obtido dividindo-se o seu peso (em Kg) por sua altura (em m) ao quadrado. Assim, por exemplo, uma pessoa de 1,67m e pesando 55kg tem IMC igual a 20,14, j que: I MC = peso 55kg = 20, 14 = 2 1, 67m 1, 67m altura
Escreva um programa que solicite ao utilizador o fornecimento do seu peso em kg e de sua altura em m e a partir deles calcule o ndice de massa corprea do utilizador. 1.2.5.2 Converter horas, minutos e segundos
Descreva um algoritmo que a partir de um determinado nmero de segundos calcula o nmero de horas, minutos e segundos correspondentes. Conforme o seguinte exemplo: 8053s = 2h + 14m + 13s
12
Descreva um algoritmo para determinar a hipotenusa de um tringulo rectngulo, dados os catetos. 1.2.5.4 Converter temperaturas
Descreva um algoritmo que a partir de uma temperatura expressa em graus Fahrenheit (tempF), calcule a temperatura expressa em graus Celsius (tempC). A converso pode ser realizada de acordo com a frmula 1.2.2. tempF = 32 + 9 tempC 5 (1.2.2)
Considere-se o seguinte exemplo utilizando a forma se-ento, no qual um aluno aprovado se tem nota maior ou igual a 9,5:
13
se ento seno
bloco de instrues 1
bloco de instrues 2
Figura 1.8: Fluxograma e sintaxe - Instruo deciso se-ento-seno Considere-se o seguinte exemplo utilizando a forma se-ento-seno. Entrada: lado1, lado2 Sada: area incio
escrever "Introduza medidas dos lados:"; ler lado1, lado2; # Calcular rea; area lado1*lado2; se lado1 = lado2 ento escrever "rea do quadrado=", area; seno escrever "rea do rectngulo=", area; m-se m
14
A instruo de de deciso mltipla um caso particular de instrues encadeadas do tipo se-ento-seno. Normalmente utilizada no teste de mltiplos valores de uma varivel. A sintaxe proposta para a deciso mltipla encontra-se descrita na gura 1.9.
seleccionar
caso 1
bloco de instrues 1
caso 2
bloco de instrues 2
caso 3
bloco de instrues 3
caso n
bloco de instrues n
...
inicio ... seleccionar <varivel> caso <valor1> <bloco-instrues1> caso <valor2> <bloco-instrues2> caso <valor3> <bloco-instrues3> ... seno <bloco-instruesN> fim-seleccionar ... fim
Considere uma mquina que permite apenas trs operaes, ligar, desligar e furar. O algoritmo 1.4 permite modelar o funcionamento da respectiva mquina. Sendo que aquando da digitao das letras: L, D e F, so apresentadas, respectivamente, as mensagens: Ligar, Desligar e Furar. No caso da letra digitada ser outra apresentada uma mensagem de erro.
15
seleccionar letra caso L escrever "Ligar"; caso D escrever "Desligar"; caso F escrever "Furar"; seno escrever "Operao invlida"; m-seleccionar m-seleccionar m Algoritmo 1.4: Mquina de furao - deciso mltipla Note-se que tal como acontece no caso da instruo se-ento a componente seno opcional. O algoritmo 1.5 tem um funcionamento idntico ao 1.4 mas implementado atravs da instruo se-ento-seno. Entrada: letra incio # Ler letra; escrever "Introduza letra (L/D/F):"; ler letra;
# Testar casos e escrever mensagem respectiva;
se letra=L ento escrever "Ligar"; seno se letra=D ento escrever "Desligar"; seno se letra=F ento escrever "Furar"; seno escrever "Operao invlida"; m-se m-se m-se m Algoritmo 1.5: Mquina de furao - deciso binria
16
1.3.3.1
O algoritmo 1.6 permite realizar o clculo da distncia euclidiana entre dois pontos, sendo que cada ponto denido pelas coordenadas (x,y). no clculo da distncia pode ser utilizada a frmula 1.3.1. distncia =
( x2 x1 )2 + ( y2 y1 )2
(1.3.1)
Caso os pontos sejam coincidentes mostra mensagem "Pontos Coincidentes". Entrada: x1, y1, x2, y2 Sada: distancia incio
escrever "Coordenadas ponto1 (x/y):"; ler x1, y1; # Ler coordenadas do ponto 2; escrever "Coordenadas ponto2 (x/y):"; ler x2, y2; # Calcular distncia e mostrar resultado; distancia (x2 x1)2 + (y2 y1)2 ; se distancia=0 ento escrever "Os pontos so coincidentes"; seno escrever "Distncia=", distancia; m-se m Algoritmo 1.6: Calcular distncia euclidiana entre pontos
1.3.3.2
O algoritmo 1.7 permite ler as notas de um aluno s disciplinas de Matemtica, Portugus, Ingls e Geograa e calcular a mdia. Em funo da mdia mostra uma mensagem com o contedo "Aprovado" ou "Reprovado". Consideram-se notas positivas as notas iguais ou superiores a 9,5.
17
1.3.3.3
Considere-se o problema de ler trs nmeros e calcular o maior deles. O uxograma 1.10 permite capturar com grande facilidade a noo de uxo e passos alternativos. Na resoluo do problema foi adoptada uma estratgia de isolamento dos vrios casos, primeiro testado o nmero A, depois o nmero B e caso nenhum dos dois seja o mximo, por excluso de partes, se conclu que o nmero C o maior de todos. Note-se que a utilizao de uxogramas est regra geral limitada representao de pequenos programas ou processos com elevado grau de abstraco porque caso contrrio o uxograma estender-se-ia por inmeras pginas tornando a sua interpretao muito difcil. No algoritmo 1.8 foi codicado em pseudo-cdigo a soluo anteriormente delineada no uxograma da gura 1.10.
18
Incio
ler A,B,C
ento
A>B
seno
B>C seno
Maior A
Maior B
Maior C
escrever Maior
Fim
Entrada: A, B, C Sada: maximo incio # Ler nmeros; escrever "Introduza nmero1, nmero2 e nmero3:"; ler A, B, C; se A B ento se A C ento maximo A; m-se seno se B C ento maximo B; seno maximo C; m-se m-se escrever "O nmero maior :", maximo; m Algoritmo 1.8: Calcular mximo de 3 nmeros 19
O algoritmo 1.9 apresenta uma soluo alternativa para o mesmo problema. Entrada: num1, num2, num3 Sada: maximo incio # Ler nmeros; escrever "Introduza nmero1, nmero2 e nmero3:"; ler num1, num2, num3; # At prova em contrrio o primeiro dos nmeros o maior; maximo num1; se num2 maximo ento maximo num2; m-se se num3 maximo ento maximo num3; m-se escrever "O nmero maior :", maximo; m Algoritmo 1.9: Calcular mximo de 3 nmeros Sugesto: Baseando-se nas solues propostas escreva um algoritmo que permita a determinao do mximo entre 5 nmeros. Qual a soluo mais elegante?
1.3.3.4
O algoritmo 1.10 permite ler trs pontos geomtricos e determinar se estes formam um tringulo. Pode ser utilizada a frmula da distncia entre dois pontos para calcular as medidas dos lados do tringulo. Note-se que um tringulo s vlido se a medida de cada um dos seus lados menor que a soma dos lados restantes.
20
escrever "Os pontos no formam um tringulo"; m-se m Algoritmo 1.10: Validar tringulo
Classicar um tringulo quanto aos lados, sendo que um tringulo com todos lados iguais designado Equiltero, com todos os lados diferentes entre si designado Escaleno e caso tenha apenas dois lados iguais entre si, designa-se Issceles. 1.3.4.2 Diviso
Descreva um algoritmo que dados dois valores, divide o primeiro pelo segundo. Note que no possvel fazer a diviso por zero, neste caso deve ser apresentada a mensagem adequada.
21
Calcular as razes de uma equao na forma ax2 + bx + c = 0. Note que os valores a, b e c podem ser zero, podendo dar origem a equaes sem soluo ou equaes de primeiro grau. Considere as frmulas 1.3.2 e 1.3.3 na resoluo do problema. binmio = b2 4ac b binmio x = 2a 1.3.4.4 Converter entre escalas de temperaturas (1.3.2) (1.3.3)
Escrever um programa que faa converses entre as trs escalas de temperaturas, Kelvin, Celsius e Fahrenheit, com base em trs valores de entrada: a temperatura e escala actual e escala pretendida. Conforme o seguinte exemplo: As entradas 38, C e K, signicam que o utilizador pretende converter a temperatura 38 Celsius para Kelvin. Considere as frmulas 1.3.4 e 1.3.5 na resoluo do programa. 9 tempC 5 tempC = tempK + 273 tempF = 32 +
(1.3.4) (1.3.5)
Sugesto: Tentar a resoluo com as estruturas se-ento-seno e alternativamente utilizar a estrutura de mltipla deciso. 1.3.4.5 Calcular ndice de massa corprea (IMC)
O ndice de massa corprea (IMC) de um indivduo obtido dividindo-se o seu peso (em Kg) por sua altura (em m) ao quadrado. Assim, por exemplo, uma pessoa de 1,67 m e pesando 55 Kg tem IMC igual a 20,14, j que: I MC = peso 55kg = 20, 14 = 1, 67m 1, 67m altura2 Interpretao Abaixo do peso normal Peso normal Acima do peso normal Obesidade
22
Um ano bissexto se divisvel por 4, excepto se, alm de ser divisvel por 4, for tambm divisvel por 100. Ento ele s bissexto se tambm for divisvel por 400. Escrever um algoritmo que leia o valor de um ano e escreva se o ano ou no bissexto. 1.3.4.7 Parque de estacionamento
Considere um parque de estacionamento que pratica os preos seguintes: 1a hora: 2 e 2a hora: 1,5 e a partir da 2a hora: 1 e/hora O tempo de permanncia no parque contabilizado em horas e minutos. Por exemplo, se uma viatura permanecer 2 horas e 30 minutos no parque, pagar 2 e (1a hora) + 1,5 e (2a hora) + 0,5 e (30 minutos a 1 e/hora) = 4 e. Elabore um algoritmo que, lido o tempo que determinada viatura permaneceu estacionada no parque, diga a quantia que deve ser paga.
23
repita
bloco de instrues
falso
at condio
verdade
Considere-se o seguinte exemplo em que a utilizao da estrutura repetir-at permite garantir que o valor da nota introduzida est situado entre 0 e 20. Entrada: nota incio repetir escrever "Introduzir nota entre 0-20:"; ler nota; at nota 0 e nota 20; m
24
enquanto condio
escrever "Introduza nmero:"; ler numero; i 1; enquanto i 10 fazer resultado numero*i; escrever numero, "*", i, "=", resultado;
# Incrementar a varivel i
i i+1; m-enquanto m
25
condio
fim para-faa
Considere-se o seguinte exemplo em que a utilizao da estrutura para-fazer permite calcular a soma os 100 primeiros nmeros inteiros. Sada: soma incio soma 0; para i 1; i<100; i i+1 fazer soma soma + i; m-para escrever soma; m Neste exemplo introduzido um conceito importante para a programao, o conceito de acumulador. A varivel soma em cada iterao adicionada do valor da varivel i, permitindo que no nal:
Por outro lado, a instruo i i+1 faz com que a varivel i tome todos os valores inteiros de 1 a 100. Considere-se a resoluo do problema de calcular a soma os 100 primeiros nmeros inteiros utilizando para tal a o ciclo enquanto-fazer.
26
Nesta seco so apresentados alguns problemas e respectivas solues com o objectivo de ilustrar a utilizao de instrues cclicas. Nas solues so exploradas situaes com utilizao simples dos ciclos e/ou imbricados.
1.4.4.1
O algoritmo 1.11 permite calcular a somatrio dos nmeros existentes num intervalo denido por limites inferior e superior. Note que o utilizador pode introduzir os limites na ordem que entender, desta forma os intervalos [5-10] e [10-5] so igualmente vlidos.
27
se limite1>limite2 ento maximo limite1; minimo limite2; seno maximo limite2; minimo limite1; m-se
# Calcular soma propriamente dita;
soma 0; para i minimo; imaximo; i i+1 fazer soma soma + i; m-para # Mostrar resultado; escrever soma; m Algoritmo 1.11: Calcular somatrio entre dois limites
1.4.4.2
factorial(n) =
n=0 1 n 1 n factorial(n 1)
Exemplo: factorial(5)=5*4*3*2*1=120
28
escrever "Introduza nmero:"; ler numero; # Efectuar o clculo; factorial 1; para i 1; inumero; i i+1 fazer factorial factorial * i; m-para # Apresentar resultado; escrever factorial; m Algoritmo 1.12: Calcular factorial de um nmero 1.4.4.3 Determinar se um nmero primo
Um nmero primo se for apenas divisvel por si prprio e pela unidade, por exemplo: 11 nmero primo (visto que apenas divisvel por 11 e por 1), enquanto que 21 no primo, pois tem os seguintes divisores: 1,3,7 e 21. Entrada: numero incio escrever "Introduza nmero:"; ler numero;
# A varivel ndiv ser utilizada na contagem do nmero de divisores de um nmero;
ndiv 0; para i 2; i<numero; i i+1 fazer se numero%i=0 ento ndiv ndiv+1; m-se m-para
se ndiv>0 ento escrever "O nmero ", numero, "no primo"; seno escrever "O nmero ", numero, " primo"; m-se m Algoritmo 1.13: Determinar se um nmero primo O algoritmo 1.13 permite determinar se um nmero primo atravs da contagem de divisores diferentes da unidade e do prprio nmero. Esta soluo necessita de
29
primo verdadeiro; i 2; enquanto primo=verdadeiro e inumero/2 fazer # Determinar se i divisor do nmero; se numero%i=0 ento primo falso; m-se i i+1; m-enquanto # Testar se foi um encontrado algum divisor; se primo=falso ento escrever "O nmero ", numero, "no primo"; seno escrever "O nmero ", numero, " primo"; m-se m Algoritmo 1.14: Determinar se um nmero primo
1.4.4.4
O algoritmo 1.15 permite ler o nome e a idade de uma srie de pessoas. Este programa deve terminar quando for introduzido o nome da pessoa = "STOP". No nal deve ser mostrado o nome e idade da pessoa mais nova. Neste programa utilizada uma varivel com a funo de servir de sentinela, a varivel primeiro pode assumir os valores verdadeiro ou falso em funo das necessidades. Uma sentinela regra geral uma varivel do tipo booleano (i.e., pode apresentar os valores verdadeiro ou falso) e utilizada com o to de controlar a execuo de uma determinada seco do programa, este conceito muito til em programao.
30
primeiro verdadeiro; repetir escrever "Introduza nome:"; ler nome; se nome = "STOP" ento escrever "Introduza idade:"; ler idade; se primeiro = verdadeiro ento idadeMin idade;
# Aps a primeira leitura a sentinela alterada para falso primeiro falso;
seno
# Se a idade acabada de ler for menor que o mnimo existente ento actualiza o mnimo e guarda o nome da pessoa;
se idade < idadeMin ento idadeMin idade; nomeMin nome; m-se m-se m-se at nome="STOP"; escrever "Nome e idade da pessoa mais nova:", nomeMin, idadeMin; m Algoritmo 1.15: Determinar nome/idade da pessoa mais nova
1.4.4.5
O algoritmo 1.16 permite ler as notas de portugus obtidas pelos elementos de uma turma. Este programa termina quando for introduzido o nome do aluno "STOP". No nal deve ser mostrado o nome do aluno melhor classicado e a mdia de notas de turma. Neste programa so utilizados ciclos encadeados. Note-se que este algoritmo l pelo menos um nome, nem que o primeiro nome seja "STOP"graas utilizao do ciclo repetir-at. No caso de o nome introduzo ser vlido (i.e., diferente de "STOP") ento so lidas notas do aluno.
31
O resultado da diviso inteira de um nmero inteiro por outro nmero inteiro pode sempre ser obtido utilizando-se apenas o operador de subtraco. Assim, se quisermos calcular 7/2, basta subtrair o dividendo (2) ao divisor (7), sucessivamente, at
32
Ler 100 valores e determinar os valores mximo e mnimo da srie. 1.4.5.3 Determinar quantidade de nmeros primos
Determinar quantos so os nmeros primos existentes entre os valores 1 e 1000 (excluindo os limites do intervalo). 1.4.5.4 Determinar se um nmero perfeito
Um nmero n perfeito se a soma dos divisores inteiros de n (excepto o prprio n) igual ao valor de n. Por exemplo, o nmero 28 tem os seguintes divisores: 1, 2, 4, 7, 14, cuja soma exactamente 28. (Os seguintes nmeros so perfeitos: 6, 28, 496, 8128.) Escreva um algoritmo que verique se um nmero perfeito. 1.4.5.5 Calcular potncia por multiplicaes sucessivas
Escrever um programa que permita calcular uma potncia do tipo baseexpoente atravs de multiplicaes sucessivas. Por exemplo: 24 = 2 2 2 2. Considere as diferentes situaes relacionadas com os valores da base e/ou expoente iguais a zero. 1.4.5.6 Maior nmero mpar de uma sequncia de valores
Descreva um algoritmo que l uma sequncia de nmeros inteiros terminada pelo nmero zero e calcule o maior mpar e a sua posio na sequncia de valores. 1.4.5.7 Algarismos de um nmero
Escreva um programa para extrair os algarismos que compem um nmero e os visualize individualmente.
33
Escreva um algoritmo que l a temperatura de N cidades portuguesas e que represente a temperatura de cada uma delas com uma barra de asteriscos (*), em que cada asterisco representa um intervalo de 2 C. De acordo com os exemplos seguintes: Porto 11 ***** Lisboa 16 ******** Faro 20 ********** Chaves 8 ****
1.4.5.9
Escreva um programa que calcule a soma dos algarismos que compem um nmero. Por exemplo: 7258 = 7+2+5+8 = 22 1.4.5.10 Jogo de adivinhar o nmero
Escrever um programa para o o jogo de adivinhar um nmero. Este jogo consiste no seguinte: o programa sorteia um nmero e o jogador deve tentar adivinhar o nmero sorteado. Para isso o programa deve indicar se o palpite do jogador foi maior, menor ou se acertou no nmero sorteado. Caso o jogador acerte deve visualizado no cran o nmero de tentativas utilizadas. 1.4.5.11 Capicua de um nmero
Escreva um programa que leia um nmero inteiro positivo e verique se se trata de uma capicua, isto , uma sequncia de dgitos cuja leitura a mesma nos dois sentidos (exemplo:32523). Sugesto: Inverter a ordem dos dgitos e vericar se o nmero obtido coincide com o original. Por exemplo, 327 invertido ((7*10)+2)*10+3=723. 1.4.5.12 Converso de base numrica
Elaborar um programa para converter um nmero escrito em binrio para o correspondente na base decimal. A converso faz-se de acordo com o exemplo seguinte: 10110011(2) =
= 1 27 + 0 26 + 1 25 + 1 24 + 0 23 + 0 22 + 1 21 + 1 20 = 128 + 0 + 32 + 0 + 16 + 0 + 0 + 2 + 1 = 179(10)
Note que os expoentes das potncias na frmula de converso correspondem, respectivamente, posio ocupada por cada algarismo no nmero em binrio. Sendo que o algarismo mais direita corresponde posio zero.
34
33 7 5 4 12 - 7 5
33 - 7 26
26 - 7 19
19 - 7 12
Figura 1.14: Diviso inteira atravs de subtraces sucessivas Note-se que o quociente corresponde ao nmero de vezes para o qual possvel subtrair o divisor ao dividendo, no exemplo possvel subtrair 4 vezes o nmero 7 do 33, sendo que 5 ser o resto inteiro. Entrada: dividendo, divisor incio # Ler dividendo e divisor; P1 escrever "Introduza o dividendo e divisor"; P2 ler dividendo,divisor; P3 quociente 0; # Subtrair sucessivamente o divisor ao dividendo; P4 enquanto dividendo divisor fazer P5 dividendo dividendo - divisor; P6 quociente quociente+1; m-enquanto P7 resto dividendo; m Algoritmo 1.17: Diviso inteira atravs de subtraces sucessivas (numerado) Na tabela 1.8 so representados os passos nos quais as condies e/ou variveis
35
verdade verdade verdade verdade verdade verdade verdade verdade verdade verdade verdade verdade falso 5
36
As variveis denidas no mbito das sub-rotinas so criadas no momento em que se inicia a execuo da sub-rotina e destrudas no momento em que a sub-rotina termina a sua execuo, isto , so variveis locais (dentro do contexto da sub-rotina) por oposio s variveis do programa que se designam por variveis globais. Este conceito muito importante e implica que: a forma correcta de se passar valores para dentro de uma sub-rotina atravs dos parmetros (e no recorrendo a uma varivel com o mesmo nome fora e dentro da sub-rotina); a forma correcta de se obter valores de uma sub-rotina recorrer a uma funo (e no a um procedimento) que tem a possibilidade de devolver valores. 1.6.1.1 Funes
A sintaxe e o uxograma propostos para a denio de uma funo so apresentados na gura 1.15. A funo identicada por um nome (nomeFuncao ), sendo a listaParmetros constituda por zero ou mais variveis passadas funo. A expresso representa o valor a retornar pela funo.
37
Execuo funo
Considere-se no seguinte exemplo a denio e utilizao da funo potencia1 na construo de um programa modular. Funo potencia(base,expoente) incio # A varivel resultado local; resultado 1;
# Calcular a potncia atravs de multiplicaes sucessivas;
escrever "Introduza base="; ler base; escrever "Introduza expoente="; ler expoente; # Apresentar resultado; escrever base," ",expoente,"=",potencia(base,expoente); m Executando o programa por exemplo para os valor 3 e 2, seria visualizado num monitor o seguinte texto: Introduza base=3 Introduza expoente=2 3^2=8
uma questo de simplicidade so considerados apenas expoentes inteiros e positivos no clculo da potncia.
1 Por
38
Execuo procedimento
Considere-se no seguinte exemplo a denio e utilizao do procedimento prtNumeroInvertido que permite imprimir um nmero inteiro invertido. Comentrio: Explicar a razo de subtrair algarismo!! Procedimento prtNumeroInvertido(numero) incio enquanto numero>0 fazer algarismo numero % 10; escrever algarismo;
# Truncar o algarismo direita;
# O algarismo mais direita do nmero calculado atravs; # da diviso inteira do nmero por 10;
1.6.2.1
Considere uma funo que receba um nmero inteiro e devolva o maior algarismo contido nesse nmero.
39
# max vai conter o maior algarismo; # alg vai conter os algarismos do nmero, partindo das; # unidades para as dezenas, centenas, etc;
max N%10; enquanto N =0 fazer alg N%10; N (N - alg)/10; se alg>max ento max alg; m-se m-enquanto maior max; m-funo Funo maior(n) que devolve o maior algarismo de um nmero
1.6.2.2
Um nmero n perfeito se a soma dos divisores inteiros de n (excepto o prprio n) igual ao valor de n. Por exemplo, o nmero 28 tem os seguintes divisores: 1, 2, 4, 7, 14, cuja soma exactamente 28. (Os seguintes nmeros so perfeitos: 6, 28, 496, 8128.). Consider a funo que recebe um nmero inteiro e devolve os valores booleanos verdadeiro ou falso se o nmero ou no perfeito, respectivamente. Funo perfeito(N) incio soma 0; para x 1; x(N/2); x x+1 fazer se (N%x)=0 ento soma soma+x; m-se m-para se soma=N ento perfeito verdadeiro; seno perfeito falso; m-se m-funo Funo perfeito(N) que indica se um nmero perfeito
40
Escreva uma funo que, dados dois nmeros reais, retorna a mdia deles arredondada para um inteiro, e devolve os nmeros por ordem crescente. Faa um programa que permita testar a funo anterior. 1.6.3.2 Funo lei de Ohm
A lei de Ohm uma relao entre a corrente (I), a tenso (V) e a resistncia (R), de acordo com o circuito elctrico representado na gura 1.17.
I
Lei de Ohm:
V R
I = V/R
a) Escreva uma funo que recebe os valores de V e R como parmetros, e calcule a corrente I . b) Escreva um programa que permita testar a funo anterior. 1.6.3.3 Funo somatrio
n
Calcular o somatrio
2i i i =1 Sugesto: crie uma funo para determinar cada termo i da srie. Funes para codicar e descodicar nmeros
1.6.3.4
Uma empresa pretende enviar cifrada uma sequncia de inteiros decimais de 4 dgitos (DigDigDigDig). A cifra consiste em: substituir cada dgito Dig por (Dig+8)%10 (i.e., adiciona 8 e calcula o resto da diviso do resultado por 10); depois troca o terceiro dgito com o primeiro e troca o quarto dgito com o segundo.
41
Escreva um procedimento que imprima os nmeros primos existentes entre dois nmeros. Na resoluo deste problema deve ser utilizada uma funo que determina se um nmero primo.
1.7 Recursividade
Recursividade uma caracterstica comum a todas denies que necessitam de recorrer a si prprias para se denirem. A recursividade largamente utilizada na matemtica e nas cincias de computao. No contexto da computao a recursividade muito utilizada na resoluo de uma gama variada de problemas e muito particularmente na manipulao de estruturas de dados recursivas (e.g., e listas, rvores e grafos). Considerem-se o exemplo da funo factorial denido atravs da formula 1.7.1. Normalmente uma denio recursiva compreende casos particulares e casos gerais, neste caso, n = 1 o caso particular e n > 1 o caso geral. Note-se que no caso geral, a denio da funo factorial conseguida atravs da prpria funo factorial. factorial(n) = n=0 1 n > 1 factorial(n 1) n (1.7.1)
No dia-a-dia tambm se encontram inmeras denies recursivas, por exemplo, o caso dos ascendentes familiares. Caso particular os ascendentes de determinada pessoa so os seus pais; Caso geral os ascendentes de uma pessoa so os ascendentes dos seus ascendentes;
42
43
44
Calcular a mdia;
Uma soluo para guardar cada uma das notas (desaconselhvel!!), seria denir 4000 variveis, por exemplo: nota1, nota2, nota3, nota4, nota5, nota6, . . . , nota4000 Assim, as instrues para a leitura das notas seriam repetir 4000 vezes algo de semelhante a:
45
46
20
Valor 12
17 15
11
A sintaxe utilizada no acesso a cada posio do vector a seguinte forma: nome-do-vector[ndice] Como por exemplo: incio
# Declarao do vector;
notas[3] 5;
# Escrever no cran o valor da posio 1 do vector ;
escrever notas[1]; m Um vector pode ter as dimenses que se pretenderem1 , fazendo-se a sua separao por vrgulas. Considere-se ainda um outro exemplo, um vector bidimensional que permite representar uma imagem, as duas dimenses da matriz denem o tamanho da imagem (largura e altura) e o valor guardado em cada posio, a cor do pixel. Na gura 2.2 apresentada uma representao grca possvel para esta matriz.
1 1 2
...
...
800
4 12
...
56 8
...
11 1
...
...
6 5
...
640
83
vector tambm designado matriz quando apresenta mais do que uma dimenso.
47
imagem[2][3] 5;
# Escrever no cran o valor da posio denida pela coluna 1 e linha 4 da matriz;
escrever notas[1][4]; m Para alm da utilizao descrita nesta seco, os vectores so muito utilizados de forma combinada com outras estruturas de dados (e.g., registos) por forma a denir estruturas mais complexas como por exemplo: las, pilhas e rvores. Existem alguns aspectos a que necessrio prestar ateno quando se manipula vectores em programao, nomeadamente: Os vectores tm dimenso xa. O nmero de elementos indicado na declarao e no pode ser alterado durante a execuo do programa. Os vectores no se podem manipular como um todo, mas sim elemento a elemento. Isto signica que no se podem somar dois vectores directamente, mas sim os elementos de cada vector individualizados. Muitas linguagens de programao no avisam (isto no d erro) se o limite da dimenso de um vector for excedido. Neste caso os resultados da execuo do programa podem ser imprevisveis.
48
49
escrever "Diferena mxima=", maiorDiferenca(vector,10); # Contar os nmeros pares e mpares; nPares maiorDiferenca(vector,10) escrever "Nmeros pares=", nPares; escrever "Nmeros mpares=", 10-nPares; m Algoritmo 2.1: Manipulao de Vectores (leitura, diferena entre mximo e mnimo e nmero de pares e mpares)
Escreva um programa modular que permita determinar o desvio padro de um srie de nmeros de acordo com a formula 2.1.2. Considere a denio de funes e procedimento para os diversos sub-problemas.
desvioPadrao =
i =1
(xi media)
n1 (2.1.2)
2.1.2.2
Prova de atletismo
Faa a leitura das pontuaes que 5 juzes de uma determinada prova atriburam a um atleta (valores compreendidos entre 0 e 9 inclusive). Determine e apresente com formato adequado, os seguintes valores: mdia obtida pelo atleta; a pior e a melhor pontuao; a percentagem de pontuaes iguais ou superiores a 8 valores; supondo que a 1 nota foi atribuda pelo juiz n1 e assim sucessivamente determine os nmeros dos juzes que atriburam a melhor nota do atleta.
50
51
A B; B A; m No extracto seguinte adoptado o procedimento adequado, conforme descrito anteriormente, a utilizao de uma varivel auxiliar. No nal, as variveis A e B contero os valores 5 e 10, respectivamente. incio A 10; B 5;
# Fazer a troca dos contedos - CORRECTO!!!;
temp A; A B; B temp; m
A pesquisa sequencial o mtodo mais simples de implementar na procura de um elemento num vector. Este mtodo consiste em pesquisar sequencial e exaustivamente um vector na procura de um dado valor. A pesquisa termina quando for encontrado o valor a procurar ou quando tenha chegado ao m do vector. Este mtodo funciona em vectores ordenados e/ou desordenados. No exemplo seguinte considerado um vector notas com 100 elementos em que se pretende procurar um valor usando o mtodo de pesquisa sequencial descrita.
52
enquanto encontrou=falso e idim fazer se valor = vector[i] ento encontrou verdade; seno i i+1; m-se m-enquanto se encontrou = verdade ento # Caso encontre o valor retorna a posio; pequisarValor i; seno # Caso no encontre o valor retorna -1; pequisarValor -1; m-se m-funo
53
Neste mtodo compara-se cada posio do vector com todas as outras sucessivamente e troca sempre que encontrar um valor menor numa posio frente. Escreva um algoritmo que implemente este mtodo. 2.2.4.3 Filtro grco
Uma unidade industrial na rea da metalomecnica utiliza sistemas de vdeo para o reconhecimento automtico de componentes que passam num tapete rolante. Aps a captura de cada imagem, esta tem que ser tratada com ltros de software que permitem eliminar erros menores e suavizar a imagem. Construa um programa que implementa um ltro que substitui cada pixel pela mdia dos valores das oito clulas que o rodeiam. Na imagem 2.3 est representada a imagem conforme foi capturada em que cada clula representa o tom de cinzento de um pixel. Exemplo de clculo das clulas: clula B2 = A1 + A2 + A3 + B1 + B3 + C1 + C2 + C3 = 108 clula C2 = B1 + B2 + B3 + C1 + C3 + D1 + D2 + D3 = 114 Note-se que as clulas dos limites da imagem (assinalados a cinzento) no podem ser calculados pois no tm o nmero suciente de vizinhos.
54
A 1 29 2 214
B 28 84
C 70 18
D 47
E 65
175 118
3 214 150 141 198 158 4 129 130 5 ... ... 31 ... 51 ... 36 ...
Na imagem 2.4 so apresentados os valores da clulas B2 e C2 aps serem calculadas enquanto que as restantes clulas ainda no foram calculadas.
A 1 29
B 28
C 70
D 47
E 65
2 214 108 114 175 118 3 214 150 141 198 158 4 129 130 5 ... ... 31 ... 51 ... 36 ...
55
56
Bibliograa
[CCT, 2001] CCT. C Programming -Foundation Level, Training Manual & Exercises. Cheltenham Computer Training, Gloucester/UK, 2001. [Kernighan e Ritchie, 1988] Brian W. Kernighan e Dennis M. Ritchie. The C Programming Language, Second Edition. Prentice Hall, Inc., 1988. [Mosich, 1988] D. Mosich. Advanced Turbo C Programmers Guide. John Wiley & Sons, 1988. [Sampaio e Sampaio, 1998] Isabel Sampaio e Alberto Sampaio. Fundamental da Programao em C. FCA- Editora Informtica, 1998.
57