Algoritmo
Para iniciar este captulo vamos falar de culinria. Algo que, aparentemente, no ter nada a ver com programao. Vamos, ento, analisar uma receita culinria. Para iniciar, verificamos que composta de duas partes: uma que descreve os ingredientes e a outra (preparao) que explica como confeccionar os scones. A preparao consiste na descrio sequencial dos passos da confeco. Observemos que a descrio dos passos da preparao ordenada, isto , tem de ser feita na ordem apresentada. Ningum amassa tudo e s depois peneira a farinha. Este tipo de descrio pode ser aplicada a muitas outras situaes do dia-a-dia. Por exemplo, na montagem de um kit seja de mobilirio, seja de modelismo; Receita de Scones trazem sempre instrues de montagem que mostram a ordem ingredientes: farinha de trigo - 12 colheres de sopa das peas a montar. acar refinado - 3 colheres de sopa Encontra, ainda, no manual da leite - 6 colheres de sopa manteiga - 1 colher de sopa sua impressora quando explica a fermento em p - 1 colher de sopa mudana da fita, do cartucho de 1 ovo inteiro uma pitada grande de sal tinta ou do toner conforme o tipo Preparao: de impressora que se trata. a farinha com o fermento para um alguidar. A este tipo de apresentao d- Peneira-secima todas as outras coisas e amassa-se Pe-se em se o nome de algoritmo. Assim, a muito ligeiramente, s para ligar tudo, sem bater nem receita de scones apresentada o cansar a massa. e colocam-se num tabuleiro forrado Fazem-se bolinhas algoritmo da sua confeco. As de alumnio. instrues de montagem de um kit Depois de cozidos, abrem-se de lado e mete-se-lhes um bocado de manteiga. so o algoritmo da montagem desse kit. Se analisarmos os diversos algoritmos, verificamos que contm caractersticas comuns. So elas: - descrio sequencial (ordenada), cada passo corresponde a uma aco elementar clara, no devendo ocasionar ambiguidade na sua interpretao; - tem um nmero finito de passos. apresentado, seguidamente, o algoritmo do clculo do mltiplo de um nmero.
Algoritmo do clculo dos mltiplos de um nmero: 1. Anotar o limite dos mltiplos (limite) 2. Anotar o nmero do qual se quer saber os mltiplos (nmero) 3. O primeiro mltiplo o prprio nmero (mltiplo = nmero) 4. Enquanto o mltiplo for menor que o limite indicado fazer: 4.1. Anotar o mltiplo 4.2. O novo mltiplo ser igual ao mltiplo anterior mais o nmero (mltiplo = mltiplo + nmero) 5. Fim do algoritmo.
Alexandre Alcobia
Unidade 1 - Algoritmia
Algoritmo do clculo dos mltiplos de um nmero num computador: 1. Entrar pelo teclado o limite dos mltiplos (limite) 2. Entrar pelo teclado o nmero do qual se quer saber os mltiplos (nmero) 3. O primeiro mltiplo o prprio nmero (mltiplo = nmero) 4. Enquanto o mltiplo for menor que o limite indicado fazer: 4.1. Apresentar no ecr o mltiplo 4.2. O novo mltiplo ser igual ao mltiplo anterior mais o nmero (mltiplo = mltiplo + nmero) 5. Fim do algoritmo. program Multiplos (input,output); {Este programa est escrito num dialcto do PASCAL}; uses Crt; var Limite : integer; Numero : integer; Multiplo : integer; begin clrscr; write (Qual o valor de que se quer achar os mltiplos ); readln (Numero); write (Qual o limite da sequncia? ); readln (Limite); writeln ( Os mltiplos de ,Numero:3:2, so: ); Multiplo := Numero; while Multiplo < Limite do begin writeln (Multiplo:3:2); Multiplo := Multiplo + Numero; end; end.
Unidade 1 - Algoritmia
Alexandre Alcobia
Exerccios
1. Construa o algoritmo para calcular a rea de um rectngulo.
Algoritmo rea do rectngulo 1. Entrar pelo teclado o valor do lado1 2. Entrar pelo teclado o valor do lado2 3. Calcular a rea A = lado1 x lado2 4. Apresentar no ecr o valor da rea
3. Algoritmo da transformao dos valores da temperatura de graus Fahrenheit para graus Clsius.
Tente o leitor resolver este problema, sabendo que a frmula a aplicar ser:
celsius =
5 ( fahr 32) 9
Alexandre Alcobia
Unidade 1 - Algoritmia
Linguagem algortmica
Temos vindo a usar a linguagem comum como a linguagem de desenvolvimento de algoritmos. A linguagem algortmica deve ser formal, isto , a descrio tem de obedecer a regras de lgica precisas e sem ambiguidades. Mas por outro lado, no se torna necessrio que o cdigo seja muito rgido como acontece na linguagem do computador podendo, por exemplo, as frases serem escritas em letras maisculas ou minsculas e as expresses matemticas escritas na forma vulgar. Assim, vamos estabelecer algumas regras e criar uma linguagem algoritmica que conhecida por pseudolinguagem ou pseudocdigo. A par da pseudolinguagem existe uma outra forma, esta grfica, de representao de algoritmos. Esta baseia-se na utilizao de determinados smbolos para fazer uma descrio grfica do algoritmo.
Pseudolinguagem
A pseudolinguagem pode ser visto como a tentativa de fundir a expressividade da linguagem natural e o rigor lgico de esquemas como o fluxograma. A pseudolinguagem permite a descrio do algoritmo de uma forma linear, fcil de ler e fcil de compreender. Vamos aplicar esta linguagem algoritmica, reformulando um algoritmo anteriormente tratado. O algoritmo deve estar enquadrado entre dois indicadores que possibilitem determinar onde o algoritmo comea e acaba. Assim, aparecem as instrues Incio e Fim.
Atribuio
Esta operao tem por objectivo atribuir um valor a uma varivel. A varivel funciona como um recipiente em que vo ser colocados dados. Temos de criar tantas variveis (recipientes) quantas as forem necessrias para o correcto funcionamento do algoritmo. A operao de atribuio coloca o dado na varivel. Exemplo: x -b/a (na varivel x colocado o valor de -b/a)
Unidade 1 - Algoritmia
Alexandre Alcobia
Cabealho
O cabealho a seco onde dado o nome ao algoritmo. Comea com a palavra "Algoritmo".
Declaraes
Nesta, apresentada a descrio das variveis usadas.
Corpo
Esta seco contm a sequncia dos passos (aces) do algoritmo. Inicia-se com a palavra "Incio" e termina com "Fim". Existe um tipo de objecto de grande importncia na clarificao de um algoritmo. So os comentrios que ajudam muito sua compreenso.
Comentrios
Cada passo do algoritmo pode iniciar com um comentrio entre dois parnteses rectos. Estes comentrios do uma breve descrio do passo ou dum grupo de passos seguintes. Os comentrios so uma parte importante do algoritmo. Eles servem para tornar a leitura, do algoritmo, mais fcil e clara.
Alexandre Alcobia
Unidade 1 - Algoritmia
Fluxogramas
Esta tcnica surge para representar, graficamente, o desenvolvimento de algoritmos. O fluxograma mostra a lgica do algoritmo dando uma apresentao global das interligaes entre os diversos passos. Actualmente, a utilizao do fluxograma restringe-se a um apoio complementar na documentao do algoritmo, valendo pela vantagem grfica da apresentao das interligaes.
Alguns smbolos usados na construo de fluxogramas
Limites do algoritmo
Processamento
raio
Deciso
rea PIxraio2
permetro 2xPIxraio
perimetro area
Fim
Exerccios
Aproveitando os exerccios anteriores, apresente os algoritmos em pseudolinguagem e faa os respectivos fluxogramas.
Unidade 1 - Algoritmia
Alexandre Alcobia
Estrutura de deciso I
At agora temos estado a lidar com algoritmos puramente sequnciais, isto , as instrues so cumpridas uma aps outra at chegar ao fim do algoritmo. No entanto existem estruturas que permitem a tomada de decises em funo de condies estabelecidas e assim, o algoritmo apresenta aces alternativas. Estas condies podem ser verdadeiras ou falsas; conforme esse valor o algoritmo segue uma aco ou segue outra em alternativa. Estas estruturas no so mais que instrues complexas, geralmente, compostas por vrias palavras, mas formando um todo. A primeira que vamos usar de deciso simples e tem o formato Se condio ento aco1 seno aco2 fim se Esta ser a sua forma em pseudolinguagem.
Sim
condio
No
aco1
aco2
Alexandre Alcobia
Unidade 1 - Algoritmia
Exerccios
1. Faa a discusso da equao do 1 grau
A equao do primeiro grau do tipo Ax+B=0. Sabe-se, tambm, que a sua soluo dada pela expresso
x=
B A
Temos de analisar esta expresso em funo de A ser igual a zero ou no. Caso seja no se pode determinar. Ento, temos:
1. 2. 3. 4.
Entrar pelo teclado o valor A e B Verificar para A=0 ou para A<>0 Sair para o ecr o resultado Fim do algoritmo
B ) 0
Unidade 1 - Algoritmia
Alexandre Alcobia
Alexandre Alcobia
Unidade 1 - Algoritmia
Tipos de dados
O leitor j sabe que as variveis usadas num programa tm que ser definidas num determinado tipo de dado. Ora, as linguagens apresentam um nmero pr-definido de tipos de dados. So estes tipos que passaremos a apresentar. As diferentes linguagens apresentam diferentes tipos de instrues para definirem esses tipos de dados.
Inteiros
Estes correspondem a todos os nmeros inteiros quer positivos, quer negativos. Ex.: 16, 7, -5
Reais
Estes correspondem aos nmeros com decimais. Ex.: 23,8; -56,321; 0,35 Neste caso, tambm, aparecem diversos tipos de reais conforme a preciso que se pretende. Os dados numricos (reais ou inteiros) quando muito compridos so, normalmente, representados no que se chama vrgula flutuante, isto , a vrgula decimal sempre colocada imediatamente antes do primeiro algarismo significativo. Exemplo: nmero vrgula flutuante 386 321 457 0,386 321 x 109 0,000 000 326 72 0,327 x 10-6 Assim, quando so muito compridos decide-se quantos algarismos significativos exactos escolhemos (preciso), arredonda-se o ltimo e utiliza-se uma potncia de dez necessria (ver exemplos acima).
Lgicos / Booleanos
Os dados lgicos consistem nos valores verdadeiro e falso (1 e 0). Estes valores so usados para fazer operaes lgicas. Estes dados so, tambm, conhecidos como booleanos em homenagem a um matemtico chamado Boole.
10
Unidade 1 - Algoritmia
Alexandre Alcobia
Caracteres (alfanumricos)
Estes dados so cadeias de caracteres alfanumricos (character string). Estes caracteres podem ser quaisquer caracteres reconhecidos pelo computador. Uma cadeia de caracteres representada nos programas como uma coleco destes caracteres comeando e acabando por um carcter especial - aspas () - para que saibamos onde a cadeia comea e onde acaba. Estas aspas so designadas como delimitadores da cadeia de caracteres. Exemplos: Rua Almirante; 333+444 d 777.
Alexandre Alcobia
Unidade 1 - Algoritmia
11
Estratgia Top-Down
Nos problemas anteriores, temos vindo a aplicar uma estratgia para a construo do algoritmo que consiste em fazer um primeiro desenvolvimento genrico do algoritmo e s depois, desenvolver os passos mais complexos. Esta estratgia conhecida pelo nome Top-Down. O seu princpio baseia-se na diviso de um problema complexo em problemas menores para os quais mais fcil encontrar a soluo. Deste modo parte-se da construo de um algoritmo genrico com um nmero mnimo de passos genricos. Vai-se, sucessivamente, construindo algoritmos mais detalhados (refinao do genrico). uma estratgia a aplicar resoluo de problemas em geral e, no s, informticos. Como exemplo vamos desenvolver um algoritmo da pesagem de 1kg de arroz para uma tigela. Definimos um algoritmo genrico que corresponda soluo que pretendemos:
1. Trazer os materiais 2. Pesar a arroz 3. Guardar os materiais
Existe a estratgia Bottom-Up em contrapartida com a Top-Down. Consiste em partir do particular para o genrico. uma estratgia usada na resoluo de erros.
12
Unidade 1 - Algoritmia
Alexandre Alcobia
Operaes elementares
Embora no algoritmo possamos apresentar as operaes da forma habitual, nas linguagens de programao essas notaes so, geralmente, diferentes. Assim, apresentamos seguidamente as notaes habituais nas linguagens de programao, alm de outras operaes tpicas.
Adio e subtraco
A adio e a subtraco so representados da forma habitual. Ex: 3+5; a+25.
Potenciao (x^y)
A potenciao representada por uma simbologia diferente. Deste modo, utiliza-se 3^2 em vez de 32.
Alexandre Alcobia
Unidade 1 - Algoritmia
13
Operadores lgicos
Definies
a e b so proposies 0 - valor falso 1 - valor verdadeiro Exemplos: a = O Sol uma estrela b = O gato um mamfero Vamos analisar as operaes lgicas fundamentais
Negao
A negao da proposio a representa-se por: A negao de a l-se: O Sol no uma estrela
Conjuno
A conjuno de a e b representa-se por: a = O Sol uma estrela b = O Sol emite energia A conjuno de a com b l-se: a e b, ou seja: O Sol uma estrela e o Sol emite energia
Disjuno inclusiva
A disjuno inclusiva de a e b representa-se por: a = Antnio mdico b = Antnio professor A disjuno inclusiva de a com b l-se: a e/ou b, ou seja: Antnio mdico e/ou Antnio professor
Disjuno exclusiva
A disjuno exclusiva de a e b representa-se por: a = Antnio mdico; b = Antnio professor A disjuno exclusiva de a com b l-se: ou a ou b, ou seja: ou Antnio mdico ou Antnio professor
Leis de De Morgan
Estas leis do-nos as seguintes transformaes:
~ (a b ) =~ a ~ b ~ (a b ) =~ a ~ b
14
Unidade 1 - Algoritmia
Alexandre Alcobia
A multiplicao tem prioridade em relao adio Como se pode verificar, o valor correcto 81. Pode-se alterar a prioridade das operaes, utilizando parnteses:
A primeira prioridade vai para as operaes includas entre parnteses. Dum modo global temos: mais alta prioridade para a potenciao; segue-se em igualdade a multiplicao e a diviso; finalmente, temos a adio e subtraco. Consideremos a seguinte expresso: -3 * 7 + 2^3 div 4 - 6 As operaes devero ser realizadas como se mostra a seguir:
Alexandre Alcobia
Unidade 1 - Algoritmia
15
Estrutura de deciso II
H casos em que se tem de optar entre vrias opes que uma varivel pode dispor, pelo que se ter de recorrer a vrias estruturas SE encadeadas. O encadeamento das estruturas SE traz dificuldade na interpretao do algoritmo. Neste caso, temos uma estrutura de deciso composta ou deciso mltipla que vai tornar a leitura do algoritmo mais fcil. Essa estrutura conhecida pela estrutura CASO. Em pseudocdigo, apresentar a seguinte forma: Caso varivel opo1: aco1 opo2: aco2 ... Fim caso
Deciso
opo1
opo2
opo3
aco1
aco2
aco3
16
Unidade 1 - Algoritmia
Alexandre Alcobia
Exerccio
1. Descreva o que faz o seguinte algoritmo.
Algoritmo nmeros Inteiro nmero Caracter frase Incio Entrar nmero Se nmero > 10 ento frase maior de 10 Seno Se nmero < 10 ento frase menor de 10 Seno frase igual a 10 Fim se Fim se Sair frase Fim
x=
- binmio discriminante < 0 No tem soluo nos reais. -binmio discriminante = 0 Tem soluo dada por
b b 2 4ac 2a
x=
b 2a
3. Construa um algoritmo que disponha do clculo do valor da rea de trs figuras geomtricas. O utilizador escolher uma das trs figuras disponveis a tratar e o algoritmo produzir o valor da rea.
A partir de um menu em que so apresentadas as figuras geomtricas disponveis, o utilizador escolher a pretendida. De seguida, ser-lhe-o pedidos os dados referentes figura e produzir-se- o clculo do valor da rea que ser apresentado no ecr.
Alexandre Alcobia
Unidade 1 - Algoritmia
17
Estruturas de Repetio
Os computadores so particularmente bem adaptados a aplicaes nas quais uma dada operao - ou uma srie de operaes - repetida muitas vezes, ou seja, a produo de ciclos. As estruturas de repetio so construes fundamentais e podem ocorrer numa variedade de formas.
REPETIR ... AT
Apresentar o seguinte formato: Repetir aco at condio
Aco
A aco ser repetida at que a condio seja verdadeira. A condio ser testada depois de realizada a aco. Portanto, a aco realizar-se- pelo menos uma vez.
No Condio Sim
Apresentamos um exemplo. Trata-se de um algoritmo para o clculo dos mltiplos de um nmero at um determinado valor definido por Limite
Incio Entrar Nmero, Limite Mltiplo Nmero Repetir SAIR Mltiplo Mltiplo Mltiplo + Nmero at Mltiplo >= Limite Fim
18
Unidade 1 - Algoritmia
Alexandre Alcobia
A estrutura REPETIR ... AT pode ser realizada utilizando a estrutura ENQUANTO ... REPETIR. Basta mudar de REPETIR ... AT condio, para ENQUANTO ~condio ... REPETIR. Assim, temos:
Mltiplo Valor Repetir Sair Mltiplo Mltiplo Mltiplo + Valor at Mltiplo >= Nmero
Mltiplo Valor Enquanto ~(Mltiplo >= Nmero) fazer Sair Mltiplo Mltiplo Mltiplo + Valor repetir
Condio
No
Sim
Aco
Alexandre Alcobia
Unidade 1 - Algoritmia
19
PARA... SEGUINTE
Por ltimo, temos uma estrutura de repetio por contagem: Para varivel valor inicial at valor final passo n fazer aco seguinte A varivel toma um valor inicial que vai incrementando (ou decrementando) at um valor final. O valor do incremento (ou decremento) dado pelo valor positivo (ou negativo) de n. O passo de utilizao opcional. Se no for declarado , por defeito, de uma unidade. Vamos ver o algoritmo para verificar se um nmero ou no primo.
Algoritmo Nmeros Primos [Vamos verificar se primo] inteiro nmero, contagem carcter frase booleano primo Incio primo verdadeiro Entrar numero [Para no ser primo tem de ser divisvel por qualquer entre 1 e ele prprio, isto , de 2 at nmero-1] Para contagem 2 at nmero-1 fazer [Se for divisvel no primo] Se (numero mod contagem = 0) ento primo falso Fim se Seguinte Se primo ento frase nmero primo seno frase No primo Fim se Sair frase Fim
No est estabelecida qualquer representao grfica para a estrutura PARA, mas podemos adoptar a seguinte.
aco
20
Unidade 1 - Algoritmia
Alexandre Alcobia
Aqui apresentada uma aplicao desta estrutura. A varivel contagem utilizada como contador. A no indicao do passo leva a que o valor seguinte de contagem ser o valor anterior mais um. Esta estrutura PARA ... pode-se considerar uma variante da estrutura ENQUANTO... Vejamos:
Algoritmo Nmeros Primos [Vamos verificar se primo] inteiro nmero, contagem booleano primo Incio primo verdadeiro Entrar numero [Para no ser primo tem de ser divisvel por qualquer entre 1 e ele prprio, isto , de 2 at nmero-1] contagem 2 [Para iniciar a contagem] Enquanto contagem =< nmero-1 fazer [Se for divisvel no primo] Se (numero mod contagem = 0) ento primo falso Fim se contagem contagem + 1 [Incrementa de uma unidade] Repetir Se primo ento Sair nmero primo seno Sair No primo Fim se Fim
Neste caso necessria a inicializao da varivel contador antes da estrutura ENQUANTO. Dentro do ciclo, necessrio proceder ao incremento da varivel contador para que alcance o valor final pretendido.
variavel v_inicial
Sim Aco
No
variavel variavel + 1
B
Alexandre Alcobia Unidade 1 - Algoritmia
21
Nmero primo
nmero
contagem 2
contagem =<nmero-1
Sim
Sim
No
primo falso
contagem contagem+1
No
primo
Sim
"No n primo"
" n primo"
Fim
22
Unidade 1 - Algoritmia
Alexandre Alcobia
Exerccios
1. Anlise do algoritmo do nmero primo.
Um nmero primo aquele que divisvel, s e somente, pela unidade e por ele prprio. Sendo divisvel por qualquer outro, no nmero primo. Como todos os nmeros so divisveis por um e por si prprios no necessitamos de verificar a divisibilidade. Assim, temos de verificar todos os outros nmeros desde 2 at ao nmero anterior ao que queremos verificar (nmero - 1). Por isso aparece a estrutura
Para contagem 2 at nmero-1 fazer
aco
Seguinte
A aco a verificao da divisibilidade. Se um nmero a for divisvel por outro b ento o resto da diviso ser zero. Temos uma operao que nos d o resto da diviso de inteiros. o mod. Neste caso temos que se nmero mod contagem = 0 ento o nmero no ser primo. Da que surge
Para contagem 2 at nmero-1 fazer Se (numero mod contagem = 0) ento primo falso Fim se Seguinte
Na realidade estamos a verificar se o nmero no primo. Para indicar se o nmero ou no primo usamos uma varivel booleana que toma um de dois valores: ou verdadeiro ou falso. A varivel est identificada com o nome primo. Por isso usamos
Se (numero mod contagem = 0) ento primo falso Fim se.
Para mandar a indicao para o ecr, a frase ser a conveniente, isto , se o nmero primo ou no. Usamos o valor da varivel booleana para fazer a diferenciao.
Se primo ento frase nmero primo seno frase No primo Fim se
Se for primo (primo ter o valor verdadeiro) apresentado no ecr nmero primo; se no for ser apresentada a frase No primo.
Alexandre Alcobia
Unidade 1 - Algoritmia
23
3. Construa o algoritmo do factorial de um nmero, isto , o produto de todos os inteiros desde 1 at ao nmero escolhido
Por exemplo, o factorial de 3 1x2x3 = 6, mas o factorial de zero 1. Use a estrutura PARA, mas no se esquea de ter em ateno do pormenor de o factorial de zero ser 1.
4. Implemente o algoritmo do nmero primo para apresentar todos os nmeros primos at um nmero N indicado pelo utilizador.
Ter de usar mais uma estrutura PARA que a usada no algoritmo apresentado.
24
Unidade 1 - Algoritmia
Alexandre Alcobia
Erros
A construo de algoritmos traz consigo a produo de erros. Estes so tanto mais provveis quanto mais complexo for o algoritmo. Neste caso, temos de utilizar tcnicas que nos permitam detectar o erro de modo a poder corrigi-lo. Uma tcnica usada a construo de quadros de taagem (trace table), permite uma anlise do funcionamento do algoritmo levando deteco do erro e, assim, permitir a sua correco. Para exemplificar esta tcnica vamos usar o algoritmo do nmero primo apresentado anteriormente.
Algoritmo Nmeros Primos inteiro nmero, contagem carcter frase booleano primo Incio primo verdadeiro Entrar numero 1. Para contagem 2 at nmero-1 fazer 2. Se (numero mod contagem = 0) ento primo falso Fim se 1.1 Seguinte 3. Se primo ento frase nmero primo 3.1. seno frase No primo Fim se Sair frase Fim
Cria-se uma srie de referncias, por exemplo a numerao como se apresenta no algoritmo acima. Em seguida constroi-se uma tabela na qual colocamos os valores das variveis e das condies a testar.
a = contagem 2 at nmero-1 b = (numero mod contagem = 0)
a V V F -
b F -
primo V V V V V
frase Primo
Unidade 1 - Algoritmia
3 3 3 3 3
2 2 3 3 3
25
A tabela apresentada, mostra o funcionamento do algoritmo e os valores que vai produzindo para um nmero escolhido que o trs que sabemos ser primo. Pelo quadro, sabemos que o algoritmo produz a resposta certa. Um teste completo, do algoritmo, tem de comportar os casos particulares do problema posto. A tabela seguinte mostra o teste para um outro nmero escolhido por ns, agora o quatro que sabemos no ser primo e o algoritmo produz o resultado esperado.
contagem 2 2 3 3 3 4 4 4
a V V V F -
b V F -
primo V F F F F F F F
frase N o primo
Aos erros produzidos na construo de um algoritmo d-se o nome de erros lgicos ou erros semnticos. So erros, em geral, difceis de detectar porque reflectem uma incorrecta elaborao do algoritmo. Estes resultam do facto de o programador no ter expressado correctamente a sequncia de aces a ser executada (o programador queria dizer uma coisa mas disse outra). Ao processo de deteco e correco de erros d-se o nome de depurao. Em ingls, este processo denominado debugging e aos erros d-se o nome de bugs.
26
Unidade 1 - Algoritmia
Alexandre Alcobia
Exerccios
1. O algoritmo apresentado seguidamente produz um ciclo infinito. Corrija-o.
contagem 1 Enquanto contagem <= 10 fazer Sair No acabou Repetir
2. Construa um algoritmo para, de entre dois nmeros inteiros, verificar qual deles o maior
Para a construo do algoritmo pedido basta usar uma estrutura SE.
Algoritmo valor mais elevado inteiro val1, val2, maior Incio Entrar val1, val2 Se val1>val2 ento maior val1 seno maior val2 Fim se Sair maior Fim
3. Construa um algoritmo para verificar de entre trs nmeros inteiros, qual o maior
Ser aconselhvel basear-se no algoritmo do exerccio anterior.
Acrescentamos a estrutura ENQUANTO para verificar o valor que o utilizador introduz na varivel nmero, obrigando o utilizador a repetir novo valor caso tenha introduzido um valor no apropriado. H a inicializao da varivel nmero (nmero 0) para obrigar ao pedido da introduo do nmero a verificar. Caso no se faa a inicializao referida, no sabemos o que poder acontecer uma vez que no sabemos que valor a varivel nmero contm no momento do teste da condio da estrutura ENQUANTO.
Alexandre Alcobia
Unidade 1 - Algoritmia
27
Para (contagem 2 at nmero-1) ~(numero mod contagem=0) fazer Se (numero mod contagem = 0) ento primo falso Fim se Seguinte .......
Vimos nos operadores lgicos que na conjuno basta uma proposio ser falsa para que a condio seja falsa. Assim, basta encontrar um valor que divida o nmero para acabar a estrutura PARA. Esta, tambm acaba se a contagem chegar ao fim. Vejamos a tabela de verdade para as condies postas. Tomemos a = contagem 2 at nmero-1 b = numero mod contagem=0
a
1 1 0 0
b
1 0 1 0
~b
0 1 0 1
a ~b
0 1 0 0
A estrutura PARA continua
5. Como exerccio, transforme a estrutura PARA, do algoritmo anterior, numa estrutura ENQUANTO. Valide a sua escolha com a verificao numa trace table.
28
Unidade 1 - Algoritmia
Alexandre Alcobia
Quadros e vectores
Suponhamos que queremos analizar as notas, dos alunos de uma turma, numa disciplina. Para tal, construimos o seguinte algoritmo.
Algoritmo Notas [Programa para determinar a mdia das notas de uma turma a uma disciplina e classificar os alunos em relao a essa mdia] Inteiro nota1,nota2,...,nota20 [Suponhamos que a turma tem 20 alunos] Inteiro SNotas Caracter comentario Real media Incio [Inicializao das varivel para a soma das notas da turma] SNotas 0 [Introduo das notas dos 20 alunos] Entrar Introduza a nota, nota1 SNotas SNotas + nota1 Entrar Introduza a nota, nota2 SNotas SNotas + nota2 ...... Entrar Introduza a nota, nota20 SNotas SNotas + nota20 [Clculo da mdia] media SNotas / 20 Sair A mdia ,media [Apreciao da situiao de cada aluno em relao mdia] Se nota1 = media ento [Apreciao para o aluno 1] comentario O aluno 1 est na mdia. seno Se nota1 > media ento comentario O aluno 1 est acima da mdia seno comentario O aluno 1 est abaixo da mdia fim se fim se Sair comentario Se nota2 = media ento [Apreciao para o aluno 2] comentario O aluno 2 est na mdia. seno Se nota2 > media ento comentario O aluno 2 est acima da mdia seno comentario O aluno 2 est abaixo da mdia fim se fim se Sair comentario .......... ....... Se nota20 = media ento [Apreciao para o aluno 20] comentario O aluno 20 est na mdia. seno Se nota20 > media ento comentario O aluno 20 est acima da mdia seno comentario O aluno 20 est abaixo da mdia fim se fim se Sair comentario Fim
Alexandre Alcobia
Unidade 1 - Algoritmia
29
Analisando o algoritmo vmos que criada uma varivel para cada nota, sendo a turma de vinte alunos logo temos de criar vinte varveis para as notas. Na apreciao qualitativa em relao mdia, deparamos com uma sequncia idntica de estruturas SE, mas sempre semelhantes para cada nota existente. Isto perfaz vinte estruturas semelhantes. A escrita de um programa com estas caractersticas muito fastidioso, isto , se no pensarmos em fazer um programa para um curso que teria cento e cinquenta alunos. No seria nada prtico. De qualquer modo, poderamos ultrapassar o problema usando a mesma varivel para as notas dos alunos e usando a estrutura PARA, mas ter-se-a de intorduzir duas vezes as notas dos alunos.
Algoritmo Notas [Programa para determinar a mdia das notas de uma turma a uma disciplina e classificar os alunos em relao a essa mdia] Inteiro contador,NAlunos,nota,SNotas,numero Real media Caracter comentario Incio [Inicializao das variveis] nota 0 NAlunos 0 SNotas 0 [Introduo do nmero de alunos da turma] Entrar Indique o nmero de alunos da turma., NAlunos [Introduo das notas dos alunos] Para contador 1 at NAlunos fazer Entrar Introduza a nota, nota SNotas SNotas + nota Seguinte [Clculo da mdia] media SNotas/NAlunos Sair A mdia ,media [Apreciao da situiao do aluno em relao mdia] Para contador 1 at NAlunos fazer Entrar Indique o nmero do aluno, numero Entrar Introduza a nota do aluno, nota Se nota = media ento comentario Este aluno est na mdia. seno Se nota > media ento comentario Este aluno est acima da mdia seno comentario Este aluno est abaixo da mdia fim se fim se Sair comentario Seguinte Fim
Para ultrapassar este problema temos uma estrudura de dados conhecida como quadro ou array que no mais que uma matriz e que podemos usar na resoluo de questes deste tipo, ou outros, tornando a produo mais fcil de algoritmos mais eficientes.
30
Unidade 1 - Algoritmia
Alexandre Alcobia
Na realidade, um grupo de dados com o mesmo identificador (nome do array) mas cada dado est associado a um endereo diferente. Assim, semelhana de uma matriz, temos
Cada dado do array tabela identificado pelo par [linha, coluna]. Deste modo, temos tabela [2,3] = 17. Este quadro bidimensional, mas pode haver com mais dimenses ou com menos (unidimensional). Os dados guardados num quadro podem ser inteiros, reais, caracter ou outro.
Este quadro unidimensional. Tem uma coluna e quatro linhas. Assim, uni[2] = e, uni[4] = ou.
Este quadro representa duas tabelas de trs linhas e trs colunas. Assim, temos que tri[1,2,3] = 9 e tri[2,1,1] = 10.
Como vimos, podemos usar quadros unidimensionais, bidimensionais ou outros conforme o necessrio, mas, normalmente, no vai alm dos tridimensionais. Os quadros unidimensionais tambm so chamados vectores. Utilizando esta estrutura de dados, torna-se mais prtica a elaborao do referido algoritmo como podemos verificar seguidamente.
Alexandre Alcobia
Unidade 1 - Algoritmia
31
Algoritmo Notas [Programa para determinar a mdia das notas de uma turma a uma disciplina e classificar os alunos em relao a essa mdia] Inteiro NAlunos,SNotas,numero Real media [Definio de quadro para o mximo de 30 alunos] Quadro Inteiro nota[30] Incio [Inicializao das variveis] SNotas 0 [Introduo do nmero de alunos da turma] Repetir NAlunos 0 Sair Indique at ao mximo de 30 alunos Entrar Indique o nmero de alunos da turma.,NAlunos At NAlunos => 1 NAlunos =< 30 [Introduo das notas dos alunos] Para numero 1 at NAlunos Sair numero Sair Introduza a nota do aluno Entrar nota[numero] SNotas SNotas + nota[numero] Seguinte [Clculo da mdia] media SNotas / NAlunos Sair A mdia ,media [Apreciao da situao do aluno em relao mdia] Para numero 1 at NAlunos Se nota[numero] = media ento Sair numero Sair O aluno est na mdia. seno Se nota[numero] > media ento Sair numero Sair O aluno est acima da mdia seno Sair numero Sair O aluno est abaixo da mdia fim se fim se Seguinte Fim
Analisando o algoritmo apresentado, comeamos por verificar que usa um vector (quadro unidimensional) de inteiros com trinta posies: Quadro Inteiro nota[30]. A estrutura REPETIR... AT serve para garantir que o utilizador introduza um nmero de 1 at 30 que o nmero mximo de alunos que o quadro pode suportar. A estrutura PARA que aparece a seguir, serve para encher o vector com as notas dos alunos. Cada posio do vector referenciada por nota[numero] dado que nota o identificador do quadro e o contador numero vai incrementando a posio no vector conforme vai incrementando na estrutura PARA.
contador
claro que no corre o quadro todo, mas s a quantidade de posies que NAlunos contm.
32
Unidade 1 - Algoritmia
Alexandre Alcobia
A seguir aparece uma outra estrutura PARA para correr o vector e fazer a comparao, de cada valor armazenado, com a mdia realizando a apreciao de cada aluno. Da anlise, conclui-se que a estrutura PARA muito til no trabalho de quadros de um modo geral. Se usarmos quadros bidimensionais usam-se duas estruturas PARA para correr o quadro porque passam a existir dois indicadores de posio para cada clula do quadro.
Quadro Inteiro QuadBid [5,10] ... Para linha 1 at 5 fazer Para coluna 1 at 10 fazer ... Entrar QuadBid[linha,coluna] ... Seguinte Seguinte
Como vemos no exemplo acima apresentado, existe o quadro QuadBid de 5 linhas por 10 colunas que referenciado com a ajuda de duas estruturas PARA. A primeira estrutura corre as linhas do quadro e a segunda corre, em cada linha, as colunas. Cada vez que realiza a instruo Entrar, o utilizador introduz um inteiro no quadro na posio referenciada no momento pelos contadores linha e coluna.
Ordenao
Quando se preenche um quadro com dados, estes ficam arrumados em funo da ordem de entrada que o utilizador usou. Assim, os dados ficam sem uma ordem convencional. Por questo de lgica de procura ou de leitura, pode haver interesse em que os dados estejam ordenados. Por esta razo, vamos estudar um algoritmo simples que permitir proceder ordenao dos dados de um quadro. Vejamos o vector definido por
Quadro Inteiro Idades [5]
que contm as idades de cinco pessoas: 45 27 33 40 35 Os dados do vector Idades no se encontra ordenado. Seria legtimo pretender-se que as idades estivessem ordenadas por ordem crescente. Para tal, teremos de correr o vector comparando os valores sucessivos e, caso necessrio, fazer a troca conveniente. Vejamos, a posio Idade[1] 45 e a posio Idade[2] 27, logo tero de ser trocados os valores de modo que a posio Idade[1] fosse 27 e Idade[2] fosse 45. Depois verificamos Idade[2] e Idade[3] e tm de ser trocados. Todo este procedimento corre o vector at ao fim. Esquematizando, temos:
Para coluna 1 at 4 fazer Se Idade[coluna] > Idade[coluna+1] ento Troca (Idade[coluna],Idade[coluna+1]) Fim se Seguinte
Alexandre Alcobia
Unidade 1 - Algoritmia
33
Este algoritmo tem uma operao especial a que chammos Troca que vai realizar a troca pretendida. Uma anlise mais atenta, mostra-nos que este algoritmo no chega. Vejamos, no quadro seguinte, o que se passa a cada incremento da varivel coluna na estrutura PARA.
vector original
45
coluna 1 at 4
27 33 40
35
1 2 3 4
27 45 27 33 45 27 33 40 45 27 33 40 35 45
O quadro mostra-nos que a ordenao no ficou completa. necessrio fazer correr, mais uma vez, a estrutura PARA. Portanto, o algoritmo s deve acabar quando a estrutura PARA correr o vector e no acontecer alguma troca de valores.
Repetir trocas falso Para coluna 1 at 4 fazer Se Idade[coluna] > Idade[coluna+1] ento Troca (Idade[coluna],Idade[coluna+1]) trocas verdadeiro Fim se Seguinte At ~trocas [At no haver trocas]
34
Unidade 1 - Algoritmia
Alexandre Alcobia
Exerccios
1. Um stand de venda de automveis, concessionrio de uma marca, vende sete modelos dessa marca. Crie um algoritmo que introduza num quadro bidimensional os modelos e respectivo preo para posterior consulta.
O quadro ter de ser do tipo caracter, pois ter que conter a designao do modelo. Ser de sete linhas e duas colunas como se pode ver na tabela acima apresentada.
2. Faa um algoritmo para mostrar os dados contidos no quadro preenchido no exerccio anterior.
Partindo do algoritmo do exerccio anterior ser fcil construir este.
3. Construa um algoritmo para ordenao dos dados do quadro do exerccio 1, por ordem crescente do preo.
Neste caso, o quadro bidimensional havendo necessidade de ordenar as duas colunas. De qualquer modo, a primeira coluna s ser ordenada em funo da ordenao da segunda, isto , quando houver uma alterao da ordem de preos ter-se- de fazer a alterao na ordem dos modelos respectivos.
Alexandre Alcobia
Unidade 1 - Algoritmia
35
Diz-se cdigo binrio porque baseado na utilizao de dois smbolos (0 e 1). Na mquina ser: h energia / no h energia. Deste modo podemos representar nmeros ou smbolos como, por exemplo: binrio - carcter 0000 0 0001 1 0010 2 0011 3 0100 4 0101 5 0110 6 0111 7 1000 8 1001 9 1010 10 etc.
36
Unidade 1 - Algoritmia
Alexandre Alcobia
Alexandre Alcobia
Unidade 1 - Algoritmia
37
Aqui apresentamos dois cdigos ASCII extendidos. Um designado por 850 Multilingue e outro por 860 Portugal. com este tipo de cdigos que se compatibiliza a mquina com os caracteres prprios de cada lngua.
38
Unidade 1 - Algoritmia
Alexandre Alcobia
Concatenao
Uma operao fundamental no tratamento de cadeias a concatenao. Consiste na aglutinao de vrias cadeias de caracteres. Suponhamos que
operao 13+7 igual = resultado 20
Foi obtida uma nova cadeia que est atribuda varivel tudo. Se as cadeias tivessem sido concatenadas numa outra ordem teramos obtido uma outra cadeia, assim
tudo operao + resultado + igual tudo = 13+720=
Cadeia nula
J vimos que uma cadeia de caracteres formada por vrios caracteres, mas, tambm, por um s carcter, por exemplo
?
Deste modo temos uma cadeia de caracteres com um elemento. Do que foi apresentado, pudemos estabelecer a existncia de uma cadeia sem caracteres, ou seja, uma cadeia nula (null string), isto
ento
tudo = 13+7=20
Alexandre Alcobia
Unidade 1 - Algoritmia
39
Comparao
Podem-se comparar cadeias de caracteres, uma vez que aos caracteres foi estabelecida uma relao de ordem (ver tabela ASCII). Pode-se dizer qual est antes ou depois de um determinado carcter. A condio de igualdade entre duas cadeias verdadeira se forem cumpridas duas condies: - o nmero de caracteres das duas cadeias igual; - para a mesma posio de ordem de cada uma das cadeias est o mesmo carcter. Exemplo:
nome1 A2eda nome2 A2eda nome3 Ae2da
logo nome1 = nome2, mas nome3 nome1. Tambm se podem estabelecer outras relaes de ordem como maior (posterior) e menor (anterior) da mesma forma como se encontram ordenadas num dicionrio ou lista telefnica.
Comprimento
Uma outra operao com cadeias a determinao do seu comprimento, ou seja, o nmero de caracteres que a cadeia comporta. Vamos designar esta operao por comp. Exemplo:
t comp(nome1)
ento, t ficar com o valor 5, uma vez que a cadeia em nome1 tem cinco caracteres.
Subcadeia
Esta operao permite extrair uma subcadeia a partir de uma outra cadeia maior. Vamos design-la por sub e comporta trs argumentos conforme se apresenta seguidamente:
sub(arg1, arg2, arg3) arg1 - a cadeia da qual pretendemos a subcadeia; arg2 - a posio na cadeia em que inicia a subcadeia; arg3 - comprimento da subcadeia.
Exemplos:
sub(nome3, 2, 2) = e2 sub(A2eda, 3, 2) = ed
H que tomar ateno de que a contagem dos caracteres na cadeia feita da esquerda para a direita.
40
Unidade 1 - Algoritmia
Alexandre Alcobia
A seguir vamos apresentar um algoritmo que extrai o primeiro nome a partir do nome dado de uma pessoa. Vamos supor que o nome introduzido, somente, com um espao entre os nomes, isto , nunca aparecem espaos no incio nem no fim.
Algoritmo Tirar apelido caracter nome, apelido inteiro comprimento, posio, tamanho Incio Entrar nome tamanho comp(nome) [Verifica em todo o comprimento da cadeia a posio do ltimo espao] Para comprimento 1 at tamanho fazer [Se encontra um espao, assinala a sua posio na cadeia] Se sub(nome, comprimento, 1) = ento posio comprimento Fim se Seguinte posio posio + 1 [adiciona 1 porque o espao no interessa] apelido sub(nome, posio) [retira a subcadeia desde posio at ao fim] Sair apelido Fim
Exerccios
1. Produza um algoritmo para a determinao da frequncia com que cada letra aparece numa cadeia de caracteres dada.
Como temos que comparar com o alfabeto em maisculas e minsculas partimos de um quadro com trs colunas: uma contm o alfabeto em minsculas, outra o alfabeto em maisculas e a terceira coluna vai receber a quantidade de ocurrncias da respectiva letra.
Algoritmo Letras Quadro caracter alfabeto [26,3] caracter texto inteiro linha, coluna, tamanho, posio
A a 0 B b 0 C c 0 D d 0 . . . . . . . . . Z z 0
Este quadro tem 3 colunas e nmero de linhas igual ao nmero de letras Incio Entrar texto do alfabeto. tamanho comp(texto) As duas primeiras colunas tm o [Inicializar a coluna 3 do quadro] alfabeto maisculo e minsculo e a Para linha 1 at 26 fazer terceira o nmero de ocurrncias que alfabeto[linha,3] 0 ter de ter valor inicial de zero. Seguinte [Percorrer toda a cadeia texto] Para posio 1 at tamanho fazer coluna 1 Repetir [Para cada coluna...] linha 1 Repetir [... verifica todas as linhas at encontrar] Se afabeto[linha,coluna] = sub(texto,posio,1) ento alfabeto[linha,3] alfabeto[linha,3] + 1 Fim se linha linha + 1 At (linha > 26) (alfabeto[linha,coluna] = sub(texto,posio,1)) coluna coluna + 1 At (coluna > 2) (alfabeto[linha,coluna] = sub(texto,posio,1)) Seguinte
Para linha 1 at 26 fazer alfabeto[linha,3] alfabeto[linha,3]/tamanho Sair alfabeto[linha,2] Sair alfabeto[linha,3] Seguinte Fim
Alexandre Alcobia
Unidade 1 - Algoritmia
41
A primeira estrutura PARA serve para inicializar a terceira coluna do quadro para garantir que est tudo a zeros. A segunda estrutura PARA para percorrer toda a cadeia de caracteres que est na varivel texto. As estruturas REPETIR...AT servem para percorrer todo o quadro procura da letra correspondente e adicionar cada ocorrncia na terceira coluna do quadro na respectiva linha da letra. Pretende-se, tambm, que quando encontre a letra no quadro para a pesquisa e passe ao carcter seguinte na cadeia texto. Por isso, aparece condio
(alfabeto[linha,coluna] = sub(texto,posio,1))
nas estruturas REPETIR...AT. A ltima estrutura PARA para calcular a frequncia relativa da ocorrncia de cada letra e apresentar o carcter e o valor da sua frequncia no ecr.
2. Construa um algoritmo que, a partir do nome de pessoas, d somente o primeiro e ltimo nome.
Sugerimos a anlise do algoritmo Tirar apelido.
3. No estudo das cadeias de caracteres indicmos que uma das operaes seria comp(cadeia) que devolvia o nmero de caracteres da cadeia. Suponha que essa operao no est disponvel. Crie um algoritmo que faa a operao referida.
42
Unidade 1 - Algoritmia
Alexandre Alcobia
Linguagens de programao
Os computadores comunicam em cdigo binrio, isto , os programas e os dados tm de ser em cdigo binrio para que a mquina os possa entender. A esta linguagem d-se o nome de linguagem mquina. Esta foi a linguagem usada nos primeiros computadores e s especialistas poderiam programar essas mquinas. Para facilitar o trabalho de programao, foram desenvolvidos programas tradutores que transformavam um cdigo feito numa linguagem mais compreensvel por humanos, em linguagem mquina. Esses programas eram conhecidos como assembladores (do ingls assembler) que traduziam uma linguagem mais prxima da humana para a linguagem mquina. Posteriormente, surgiram programas que usavam linguagens mais desenvolvidas e mais prximas da linguagem falada (em geral ingls) e independentes da estrutura da mquina. Estas linguagens so conhecidas como linguagens de alto nvel, pois permitem que o programador no necessite de ter algum conhecimento sobre o funcinamento interno do computador. De uma forma genrica, podemos dizer que h duas maneiras destes programas fazerem atraduo para a linguagem mquina: temos os compiladores que produzem um programa em linguagem mquina e que, depois, pode ser usado; por outro lado, temos os interpretadores que vo traduzindo o texto escrito na linguagem de alto nvel enquanto este executado. A construo de um programa compilado implica a criao de um programa fonte que o texto na linguagem de alto nvel. Depois, este compilado produzindo um programa em linguagem mquina chamado programa objecto. Este programa objecto no legvel para o programador, pelo que ter de recorrer sempre ao programa fonte, este sim, texto legvel pelo programador. Para exemplo, temos o QuickBASIC, ao qual o leitor ter fcil acesso atravs do conhecido MS-DOS, trata-se de uma linguagem de alto nvel interpretada. No entanto, o TurboPascal compilado. No incio da unidade vimos que a criao de um programa passa pela construo do algoritmo do problema em estudo e, depois, tendo em conta o tipo de problema tratado, escolhe-se a linguagem conveniente e procede-se fase de implementao para que possa realmenter ser usado num computador.
Exemplos de linguagens de alto nvel: FORTRAN - Formula Translation ALGOL - Algorithmic Language BASIC - Beginners All-pourpouse Simbolic Instruction Code COBOL - Common Busyness Oriented Language Pascal C++
Alexandre Alcobia
Unidade 1 - Algoritmia
43