Escolar Documentos
Profissional Documentos
Cultura Documentos
Algoritmo
Novembro de 1998
Para iniciar este capítulo vamos falar de culinária. Algo que, aparentemente, não terá nada a
ver com programação.
Vamos, então, analisar uma receita culinária.
Para iniciar, verificamos que é composta de duas partes: uma que descreve os ingredientes e a
outra (preparação) que explica como confeccionar os scones.
A preparação consiste na descrição sequencial dos passos da confecção. Observemos que a
descrição dos passos da preparação é ordenada, isto é, tem de ser feita na ordem apresentada.
Ninguém amassa tudo e só depois peneira a farinha.
Este tipo de descrição pode ser aplicada a muitas outras situações do dia-a-dia. Por exemplo, na
montagem de um kit seja de
mobiliário, seja de modelismo;
Receita de Scones
trazem sempre instruções de
montagem que mostram a ordem ingredientes:
•farinha de trigo - 12 colheres de sopa
das peças a montar. •açúcar 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
mudança da fita, do cartucho de •1 ovo inteiro
•uma pitada grande de sal
tinta ou do toner conforme o tipo
de impressora que se trata. Preparação:
A este tipo de apresentação dá- Peneira-se a farinha com o fermento para um alguidar.
Põe-se em cima todas as outras coisas e amassa-se
se o nome de algoritmo. Assim, a muito ligeiramente, só para ligar tudo, sem bater nem
receita de scones apresentada é o cansar a massa.
Fazem-se bolinhas e colocam-se num tabuleiro forrado
algoritmo da sua confecção. As de alumínio.
instruções de montagem de um kit Depois de cozidos, abrem-se de lado e mete-se-lhes um
bocado de manteiga.
são o algoritmo da montagem
desse kit.
Se analisarmos os diversos algoritmos, verificamos que contêm características comuns. São elas:
- descrição sequencial (ordenada), cada passo corresponde a uma acção elementar
clara, não devendo ocasionar ambiguidade na sua interpretação;
- tem um número finito de passos.
Do que foi dito anteriormente, conclui-se que para fazer um programa devemos ter claro o
algoritmo do nosso problema. Portanto, primeiro há que estudar o problema e elaborar o seu
algoritmo.
Uma vez estabelecido o seu algoritmo podemos, então, passar para a sua implementação numa
linguagem de programação e assim testar
o programa no computador.
Concluindo, a construção de um
programa comporta duas fases (ver
figura):
- fase de resolução do problema -
consiste na formulação do algoritmo
eficaz para a resolução do problema posto;
- fase de implementação - consiste na
tradução do algoritmo para a linguagem
de programação escolhida.
Exercícios
Linguagem algorítmica
Pseudolinguagem
A pseudolinguagem pode ser visto como a tentativa de fundir a expressividade da linguagem
natural e o rigor lógico de esquemas como o fluxograma.
A pseudolinguagem permite a descrição do algoritmo de uma forma linear, fácil de ler e fácil 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 começa e acaba. Assim, aparecem as instruções Início e Fim.
Atribuição
Esta operação tem por objectivo atribuir um valor a uma variável. A variável funciona como
um recipiente em que vão ser colocados dados.
Temos de criar tantas variáveis (recipientes) quantas as forem necessárias para o correcto
funcionamento do algoritmo.
A operação de atribuição coloca o dado na variável.
Exemplo: x ← -b/a (na variável x é colocado o valor de -b/a)
A instrução Entrar é utilizada para introduzir dados no computador através do operador. Estes
dados são afectados a variáveis.
Exemplo: Entrar a, b
Algoritmo circunferência
[Este algoritmo dá as características de uma circunferência]
inteiro raio
real área, perímetro
PI ← 3,14159
Início
Entrar raio
área ← PI x raio2
perímetro ← 2 x PI x raio
Sair área, perímetro
Fim
Cabeçalho
O cabeçalho é a secção onde é dado o nome ao algoritmo. Começa com a palavra "Algoritmo".
Declarações
Nesta, é apresentada a descrição das variáveis usadas.
Corpo
Esta secção contém a sequência dos passos (acções) do algoritmo. Inicia-se com a palavra "Início"
e termina com "Fim".
Existe um tipo de objecto de grande importância na clarificação de um algoritmo. São os
comentários que ajudam muito à sua compreensão.
Comentários
Cada passo do algoritmo pode iniciar com um comentário entre dois parênteses rectos. Estes
comentários dão uma breve descrição do passo ou dum grupo de passos seguintes.
Os comentários são uma parte importante do algoritmo. Eles servem para tornar a leitura, do
algoritmo, mais fácil e clara.
Fluxogramas
Esta técnica surge para representar, graficamente, o desenvolvimento de algoritmos. O
fluxograma mostra a lógica do algoritmo dando uma apresentação global das interligações entre
os diversos passos.
Actualmente, a utilização do fluxograma restringe-se a um apoio complementar na
documentação do algoritmo, valendo pela vantagem gráfica da apresentação das interligações.
Limites do algoritmo
Processamento
Isto é um comentário
Ligação entre partes do fluxograma raio
num fluxograma
perímetro ← 2xPIxraio
perimetro
area
Fim
Exercícios
Aproveitando os exercícios anteriores, apresente os algoritmos em pseudolinguagem e faça os
respectivos fluxogramas.
Estrutura de decisão I
Até agora temos estado a lidar com algoritmos puramente sequênciais, isto é, as instruções são
cumpridas uma após outra até chegar ao fim do algoritmo. No entanto existem estruturas que
permitem a tomada de decisões em função de condições estabelecidas e assim, o algoritmo apresenta
acções alternativas. Estas condições podem ser verdadeiras ou falsas; conforme esse valor o
algoritmo segue uma acção ou segue outra em alternativa.
Estas estruturas não são mais que instruções complexas, geralmente, compostas por várias
palavras, mas formando um todo.
A primeira que vamos usar é de decisão simples e tem o formato
Se condição então
acção1
senão
acção2
fim se
acção1 acção2
Exercícios
B
x=−
A
Temos de analisar esta expressão em função de A ser igual a zero ou não. Caso seja não se pode determinar. Então,
temos:
2. Se A=0
0
Se B=0 - Sair no ecrã: "Equação indeterminada" ( x = − 0 )
B
Se B<>0 - Sair no ecrã: "Equação impossível" ( x = − )
0
Se A<>0
B
Calcular o valor de x ( x = − )
A
Sair no ecrã: x
Início
Entrar val1
Entrar val2
Se val1>val2 Então
maior ← val1
Senão
maior ← val2
Fim se
Sair maior
Fim
Tipos de dados
O leitor já sabe que as variáveis usadas num programa têm que ser definidas num determinado
tipo de dado. Ora, as linguagens apresentam um número pré-definido de tipos de dados. São
estes tipos que passaremos a apresentar.
As diferentes linguagens apresentam diferentes tipos de instruções para definirem esses tipos
de dados.
Inteiros
Estes correspondem a todos os números inteiros quer positivos, quer negativos.
Ex.: 16, 7, -5
Reais
Estes correspondem aos números com decimais.
Ex.: 23,8; -56,321; 0,35
Neste caso, também, aparecem diversos tipos de reais conforme a precisão que se pretende.
Os dados numéricos (reais ou inteiros) quando muito compridos são, normalmente,
representados no que se chama vírgula flutuante, isto é, a vírgula decimal é sempre colocada
imediatamente antes do primeiro algarismo significativo.
Exemplo:
número vírgula flutuante
386 321 457 0,386 321 x 109
0,000 000 326 72 0,327 x 10-6
Assim, quando são muito compridos decide-se quantos algarismos significativos exactos
escolhemos (precisão), arredonda-se o último e utiliza-se uma potência de dez necessária (ver
exemplos acima).
Lógicos / Booleanos
Os dados lógicos consistem nos valores verdadeiro e falso (1 e 0). Estes valores são usados para
fazer operações lógicas.
Estes dados são, também, conhecidos como booleanos em homenagem a um matemático chamado
Boole.
Caracteres (alfanuméricos)
Estes dados são cadeias de caracteres alfanuméricos (character string). Estes caracteres podem
ser quaisquer caracteres reconhecidos pelo computador.
Uma cadeia de caracteres é representada nos programas como uma colecção destes caracteres
começando e acabando por um carácter especial - aspas () - para que saibamos onde a cadeia
começa e onde acaba. Estas aspas são designadas como delimitadores da cadeia de caracteres.
Exemplos: Rua Almirante; 333+444 dá 777.
Estratégia Top-Down
Nos problemas anteriores, temos vindo a aplicar uma estratégia para a construção do algoritmo
que consiste em fazer um primeiro desenvolvimento genérico do algoritmo e só depois, desenvolver
os passos mais complexos. Esta estratégia é conhecida pelo nome Top-Down.
O seu princípio baseia-se na divisão de um problema complexo em problemas menores para
os quais é mais fácil encontrar a solução. Deste modo parte-se da construção de um algoritmo
genérico com um número mínimo de passos genéricos. Vai-se, sucessivamente, construindo
algoritmos mais detalhados (refinação do genérico).
É uma estratégia a aplicar à resolução de problemas em geral e, não só, informáticos.
Como exemplo vamos desenvolver um algoritmo da pesagem de 1kg de arroz para uma tigela.
Definimos um algoritmo genérico que corresponda à solução que pretendemos:
1. Trazer os materiais
2. Pesar a arroz
3. Guardar os materiais
Operações elementares
Adição e subtracção
A adição e a subtracção são representados da forma habitual.
Ex: 3+5; a+25.
Potenciação (x^y)
A potenciação é representada por uma simbologia diferente. Deste modo, utiliza-se 3^2 em
vez de 32.
Operadores lógicos
Definições
a e b são proposições
0 - valor falso
1 - valor verdadeiro
Exemplos:
a = O Sol é uma estrela
b = O gato é um mamífero
Negação
A negação da proposição a representa-se por:
A negação de a lê-se: O Sol não é uma estrela
Conjunção
A conjunção de a e b representa-se por:
a = O Sol é uma estrela
b = O Sol emite energia
A conjunção de a com b lê-se: a e b, ou seja: O Sol é uma
estrela e o Sol emite energia
Disjunção inclusiva
A disjunção inclusiva de a e b representa-se por:
a = António é médico
b = António é professor
A disjunção inclusiva de a com b lê-se: a e/ou b, ou seja:
António é médico e/ou António é professor
Disjunção exclusiva
A disjunção exclusiva de a e b representa-se por:
a = António é médico; b = António é professor
A disjunção exclusiva de a com b lê-se: ou a ou b, ou seja: ou
António é médico ou António é professor
Leis de De Morgan
Estas leis dão-nos as seguintes transformações:
~ (a ∧ b ) =~ a ∨ ~ b
~ (a ∨ b ) =~ a ∧ ~ b
A ← 3+6*13
Que valor atribuir à variável A? O valor desta variável dependerá da ordem utilizada na
realização das operações. Assim, da esquerda para a direita será A=117; da direita para a esquerda
será A=81.
Para se evitarem estas ambiguidades temos que respeitar a prioridade das operações, pois ela
vai garantir a correcção do resultado.
-3 * 7 + 2^3 div 4 - 6
Estrutura de decisão II
Há casos em que se tem de optar entre várias opções que uma variável pode dispor, pelo que se
terá de recorrer a várias estruturas SE encadeadas. O encadeamento das estruturas SE traz
dificuldade na interpretação do algoritmo. Neste caso, temos uma estrutura de decisão composta
ou decisão múltipla que vai tornar a leitura do algoritmo mais fácil.
Essa estrutura é conhecida pela estrutura CASO.
Em pseudocódigo, apresentará a seguinte forma:
Caso variável
opção1:
acção1
A
opção2:
acção2
...
Fim caso Decisão
Algoritmo Selecção
[caracterização de algumas letras do alfabeto]
Carácter letra, frase
Início
Entrar letra
Caso letra
“a”,”b”:
frase ← “Primeiras letras”
“k”,”w”,”y”:
frase ← “Alfabeto inglês”
“z”:
frase ← “Última letra”
Senão
frase ← “Outras letras do alfabeto”
Fim caso
Sair frase
Fim
Exercício
Algoritmo números
Inteiro número
Caracter frase
Início
Entrar número
Se número > 10 então
frase ← “É maior de 10”
Senão
Se número < 10 então
frase ← “É menor de 10”
Senão
frase ← “É igual a 10”
Fim se
Fim se
Sair frase
Fim
-binómio discriminante = 0
Tem solução dada por −b
x=
2a
Estruturas de Repetição
Os computadores são particularmente bem adaptados a aplicações nas quais uma dada operação
- ou uma série de operações - é repetida muitas vezes, ou seja, a produção de ciclos. As estruturas
de repetição são construções fundamentais e podem ocorrer numa variedade de formas.
Repetir
acção
até condição
Acção
Algoritmo múltiplos
inteiro Número, Limite, Múltiplo
A estrutura REPETIR ... ATÉ pode ser realizada utilizando a estrutura ENQUANTO ... REPETIR.
Basta mudar de REPETIR ... ATÉ condição, para ENQUANTO ~condição ... REPETIR.
Assim, temos:
Condição Não
Sim
Acção
PARA... SEGUINTE
Por último, temos uma estrutura de repetição por contagem:
A variável 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 utilização opcional. Se não for declarado é, por defeito, de uma unidade.
Vamos ver o algoritmo para verificar se um número é ou não primo.
Início
primo ← verdadeiro
Entrar numero
Seguinte
Se primo então
frase ← “É número primo”
senão
frase ← “Não é primo”
Fim se A
Sair frase
Fim
variável
v_inicial até v_final
acção
Aqui é apresentada uma aplicação desta estrutura. A variável contagem é utilizada como contador.
A não indicação 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:
Repetir
Se primo então
Sair “É número primo”
senão
Sair “Não é primo”
Fim se
Fim
variavel ← v_inicial
Sim
Não
Acção
variavel ← variavel + 1
Número primo
número
contagem ← 2
contagem
=<número-1
Sim
número mod
Sim Não
contagem=0
Não
primo← falso
contagem ← contagem+1
Fim
Exercícios
acção
Seguinte
Seguinte
Na realidade estamos a verificar se o número não é primo. Para indicar se o número é ou não primo usamos uma
variável booleana que toma um de dois valores: ou verdadeiro ou falso. A variável está identificada com o nome primo.
Por isso usamos
Se primo então
frase ← “É número primo” Se for primo (primo terá o valor verdadeiro) é apresentado
senão no ecrã “É número primo”; se não for será apresentada a
frase ← “Não é primo” frase “Não é primo”.
Fim se
Erros
A construção de algoritmos traz consigo a produção de erros. Estes são tanto mais prováveis
quanto mais complexo for o algoritmo.
Neste caso, temos de utilizar técnicas que nos permitam detectar o erro de modo a poder
corrigi-lo.
Uma técnica usada é a construção de quadros de taçagem (trace table), permite uma análise do
funcionamento do algoritmo levando à detecção do erro e, assim, permitir a sua correcção.
Para exemplificar esta técnica vamos usar o algoritmo do número primo apresentado
anteriormente.
Início
primo ← verdadeiro
Entrar numero
1.1 Seguinte
3. Se primo então
frase ← “É número primo”
3.1. senão
frase ← “Não é primo”
Fim se
Sair frase
Fim
Cria-se uma série de referências, por exemplo a numeração como se apresenta no algoritmo
acima.
Em seguida constroi-se uma tabela na qual colocamos os valores das variáveis e das condições
a testar.
a = contagem ← 2 até número-1
b = (numero mod contagem = 0)
1 3 2 V - V -
2 3 2 V F V -
1.1 3 3 - - V -
1 3 3 F - V -
3 3 3 - - V Primo
1 4 2 V - V -
2 4 2 V V F -
1.1 4 3 - - F -
1 4 3 V - F -
2 4 3 - F F -
1.1 4 4 - - F -
1 4 4 F - F -
3.1 4 4 - - F N ão primo
Aos erros produzidos na construção de um algoritmo dá-se o nome de erros lógicos ou erros
semânticos.
São erros, em geral, difíceis de detectar porque reflectem uma incorrecta elaboração do algoritmo.
Estes resultam do facto de o programador não ter expressado correctamente a sequência de acções
a ser executada (o programador queria dizer uma coisa mas disse outra).
Ao processo de detecção e correcção de erros dá-se o nome de depuração. Em inglês, este
processo é denominado debugging e aos erros dá-se o nome de bugs.
Exercícios
Repetir
Use a técnica de trace table para analisar o funcionamento do algoritmo
2. Construa um algoritmo para, de entre dois números inteiros, verificar qual deles é o
maior
Para a construção do algoritmo pedido basta usar uma estrutura SE.
3. Construa um algoritmo para verificar de entre três números inteiros, qual o maior
Será aconselhável basear-se no algoritmo do exercício anterior.
Início
primo ← verdadeiro
número ← 0
Enquanto número < 2 fazer
Entrar número
Repetir
.......
Acrescentamos a estrutura ENQUANTO para verificar o valor que o utilizador introduz na variável número, obrigando
o utilizador a repetir novo valor caso tenha introduzido um valor não apropriado.
Há a inicialização da variável número (número ← 0) para obrigar ao pedido da introdução do número a verificar. Caso
não se faça a inicialização referida, não sabemos o que poderá acontecer uma vez que não sabemos que valor a
variável número contém no momento do teste da condição da estrutura ENQUANTO.
Seguinte
.......
Vimos nos operadores lógicos que na conjunção basta uma proposição ser falsa para que a condição seja falsa.
Assim, basta encontrar um valor que divida o número para acabar a estrutura PARA. Esta, também acaba se a
contagem chegar ao fim.
Vejamos a tabela de verdade para as condições postas.
Tomemos a = contagem ← 2 até número-1
b = numero mod contagem=0
a b ~b a ∧ ~b
1 1 0 0 A estrutura PARA continua
1 0 1 1
0 1 0 0
0 0 1 0
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 média das notas de uma turma a uma disciplina e classificar
os alunos em relação a essa média]
Inteiro nota1,nota2,...,nota20 [Suponhamos que a turma tem 20 alunos]
Inteiro SNotas
Caracter comentario
Real media
Início
[Inicialização das variável para a soma das notas da turma]
SNotas ← 0
[Introdução 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
[Cálculo da média]
media ← SNotas / 20
Sair “A média é”,media
Analisando o algoritmo vêmos que é criada uma variável para cada nota, sendo a turma de
vinte alunos logo temos de criar vinte varáveis para as notas. Na apreciação qualitativa em relação
à média, deparamos com uma sequência idêntica de estruturas SE, mas sempre semelhantes para
cada nota existente. Isto perfaz vinte estruturas semelhantes.
A escrita de um programa com estas características é muito fastidioso, isto é, se não pensarmos
em fazer um programa para um curso que teria cento e cinquenta alunos. Não seria nada prático.
De qualquer modo, poderíamos ultrapassar o problema usando a mesma variável 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 média das notas de uma turma a uma disciplina e classificar
os alunos em relação a essa média]
Inteiro contador,NAlunos,nota,SNotas,numero
Real media
Caracter comentario
Início
[Inicialização das variáveis]
nota ← 0
NAlunos ← 0
SNotas ← 0
[Cálculo da média]
media ← SNotas/NAlunos
Sair “A média é”,media
Para ultrapassar este problema temos uma estrudura de dados conhecida como quadro ou array
que não é mais que uma matriz e que podemos usar na resolução de questões deste tipo, ou
outros, tornando a produção mais fácil de algoritmos mais eficientes.
Na realidade, é um grupo de dados com o mesmo identificador (nome do array) mas cada dado
está associado a um endereço diferente. Assim, à semelhança 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 dimensões ou com menos
(unidimensional). Os dados guardados num quadro podem ser inteiros, reais, caracter ou outro.
Algoritmo Notas
[Programa para determinar a média das notas de uma turma a uma disciplina e classificar
os alunos em relação a essa média]
Inteiro NAlunos,SNotas,numero
Real media
[Definição de quadro para o máximo de 30 alunos]
Quadro Inteiro nota[30]
Início
[Inicialização das variáveis]
SNotas ← 0
[Cálculo da média]
media ← SNotas / NAlunos
Sair “A média é”,media
Analisando o algoritmo apresentado, começamos por verificar que usa um vector (quadro
unidimensional) de inteiros com trinta posições: Quadro Inteiro nota[30].
A estrutura REPETIR... ATÉ serve para garantir que o utilizador introduza um número de 1 até
30 que é o número máximo 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 posição do vector é referenciada por nota[numero] dado que nota é o identificador do quadro
e o contador numero vai incrementando a posição no vector conforme vai incrementando na
estrutura PARA.
É claro que não corre o quadro todo, mas só a quantidade de posições que NAlunos contém.
A seguir aparece uma outra estrutura PARA para correr o vector e fazer a comparação, de cada
valor armazenado, com a média realizando a apreciação de cada aluno.
Da análise, 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 posição para cada célula do quadro.
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 instrução Entrar, o utilizador introduz um inteiro no quadro na posição
referenciada no momento pelos contadores linha e coluna.
Ordenação
Quando se preenche um quadro com dados, estes ficam arrumados em função da ordem de
entrada que o utilizador usou. Assim, os dados ficam sem uma ordem convencional. Por questão
de lógica de procura ou de leitura, pode haver interesse em que os dados estejam ordenados.
Por esta razão, vamos estudar um algoritmo simples que permitirá proceder à ordenação dos
dados de um quadro.
Vejamos o vector definido por
Este algoritmo tem uma operação especial a que chamámos Troca que vai realizar a troca pretendida.
Uma análise mais atenta, mostra-nos que este algoritmo não chega. Vejamos, no quadro seguinte, o
que se passa a cada incremento da variável coluna na estrutura PARA.
vector original
45 27 33 40 35
1 27 45
coluna ←1 até 4 2 27 33 45
3 27 33 40 45
4 27 33 40 35 45
O quadro mostra-nos que a ordenação não ficou completa. É necessário fazer correr, mais uma
vez, a estrutura PARA. Portanto, o algoritmo só deve acabar quando a estrutura PARA correr o vector
e não acontecer alguma troca de valores.
Repetir
trocas ← falso
Para coluna ← 1 até 4 fazer
Se Idade[coluna] > Idade[coluna+1] então
Troca (Idade[coluna],Idade[coluna+1])
trocas ← verdadeiro
Fim se
Seguinte
Até ~trocas [Até não haver trocas]
temporario ← Idade[coluna]
Idade[coluna] ← Idade[coluna+1]
Idade[coluna+1] ← temporario
Exercícios
Pre ço
M ode los
(contos )
modA 2500
modB 3000
modC 2500
modD 3500
modE 2500
modF 3000
modG 4000
O quadro terá de ser do tipo caracter, pois terá que conter a designação do modelo. Será de sete linhas e duas
colunas como se pode ver na tabela acima apresentada.
Trata-se de uma outra estrutura de dados à qual já fizemos referência no capítulo Tipos de dados.
A esta estrutura está associada uma série de operações básicas que iremos apresentar
seguidamente e que permitem um manuseamento destes dados de uma forma diferente dos dados
numéricos.
Como já vimos anteriormente, o computador trata frases como uma cadeia de caracteres
alinhados e passíveis de serem ordenados. Como exemplo temos A unidade 1 esta a acabar, se
ordenado seria cinco espaços1Aaaaaaabcddeeinrstu.
O computador pode ordenar os caracteres. Estes são codificados em código binário porque é a
linguagem que a máquina conhece, assim pode estabelecer uma ordem aos caracteres que usa.
É claro que a codificação é convencional e existe, entre outras, um standard muito usado na
microinformática conhecido pelo código ASCII (American Standard Code for Information
Interchange). Na página seguinte é apresentada uma tabela dos caracteres standard desse código.
Os números são o código do carácter que está ao lado - é claro que o número está em base dez por
conversão do código binário.
Para acedermos ao carácter temos de premir a telca Alt mais o número no teclado numérico,
por exemplo o carácter # será Alt + 35.
Este código só tem 128 (de 0 a 127) caracteres, por ser necessário, apareceram extensões ao
código que vão do 128 até ao 255. Estas variam porque incluem caracteres específicos para
compatibilizar com as diversas línguas.
ASCII Standard
Os primeiros 32 characters (0-31) são códigos de control.
0 NUL Null 33 ! 65 A 97 a
1 SOH Start of heading 34 “ 66 B 98 b
2 STX Start of text 35 # 67 C 99 c
3 ETX End of text 36 $ 68 D 100 d
4 EOT End of transmit 37 % 69 E 101 e
5 ENQ Enquiry 38 & 70 F 102 f
6 ACK Acknowledge 39 ‘ 71 G 103 g
7 BEL Audible bell 40 ( 72 H 104 h
8 BS Backspace 41 ) 73 I 105 i
9 HT Horizontal tab 42 * 74 J 106 j
10 LF Line feed 43 + 75 K 107 k
11 VT Vertical tab 44 , 76 L 108 l
12 FF Form feed 45 - 77 M 109 m
13 CR Carriage return 46 . 78 N 110 n
14 SO Shift out 47 / 79 O 111 o
15 SI Shift in 48 0 80 P 112 p
16 DLE Data link escape 49 1 81 Q 113 q
17 DC1 Device control 1 50 2 82 R 114 r
18 DC2 Device control 2 51 3 83 S 115 s
19 DC3 Device control 3 52 4 84 T 116 t
20 DC4 Device control 4 53 5 85 U 117 u
21 NAK Neg. acknowledge 54 6 86 V 118 v
22 SYN Synchronous idle 55 7 87 W 119 w
23 ETB End trans. block 56 8 88 X 120 x
24 CAN Cancel 57 9 89 Y 121 y
25 EM End of medium 58 : 90 Z 122 z
26 SUB Substitution 59 ; 91 [ 123 {
27 ESC Escape 60 < 92 \ 124 |
28 FS Figures shift 61 = 93 ] 125 }
29 GS Group separator 62 > 94 ^ 126 ~
30 RS Record separator 63 ? 95 _ 127 •
31 US Unit separator 64 @ 96 ‘
32 SP Blank Space (Space Bar)
Concatenação
Uma operação fundamental no tratamento de cadeias é a concatenação. Consiste na aglutinação
de várias cadeias de caracteres.
Suponhamos que
operação ← “13+7”
igual ← “=”
resultado ← “20”
Foi obtida uma nova cadeia que está atribuída à variável tudo.
Se as cadeias tivessem sido concatenadas numa outra ordem teríamos obtido uma outra cadeia,
assim
tudo ← operação + resultado + igual
tudo = “13+720=”
Cadeia nula
Já vimos que uma cadeia de caracteres é formada por vários caracteres, mas, também, por um
só carácter, por exemplo
“?”
Deste modo temos uma cadeia de caracteres com um elemento.
Do que foi apresentado, pudemos estabelecer a existência de uma cadeia sem caracteres, ou
seja, uma cadeia nula (null string), isto é
“”
Uma característica desta cadeia nula é de elemento neutro, isto é,
tudo ← “13+7=20” + “”
então
tudo = “13+7=20”
Comparação
Podem-se comparar cadeias de caracteres, uma vez que aos caracteres foi estabelecida uma
relação de ordem (ver tabela ASCII). Pode-se dizer qual está antes ou depois de um determinado
carácter.
A condição de igualdade entre duas cadeias é verdadeira se forem cumpridas duas condições:
- o número de caracteres das duas cadeias é igual;
- para a mesma posição de ordem de cada uma das cadeias está o mesmo carácter.
Exemplo:
nome1 ← “A2eda”
nome2 ← “A2eda”
nome3 ← “Ae2da”
Comprimento
Uma outra operação com cadeias é a determinação do seu comprimento, ou seja, o número de
caracteres que a cadeia comporta. Vamos designar esta operação por comp.
Exemplo:
t ← comp(nome1)
então, t ficará com o valor 5, uma vez que a cadeia em nome1 tem cinco caracteres.
Subcadeia
Esta operação permite extrair uma subcadeia a partir de uma outra cadeia maior. Vamos
designá-la por sub e comporta três argumentos conforme se apresenta seguidamente:
Exemplos:
sub(nome3, 2, 2) = “e2”
sub(“A2eda”, 3, 2) = “ed”
Há que tomar atenção de que a contagem dos caracteres na cadeia é feita da esquerda para a
direita.
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 espaço entre os nomes, isto é, nunca
aparecem espaços no início nem no fim.
Início
Entrar nome
tamanho ← comp(nome)
[Verifica em todo o comprimento da cadeia
a posição do último espaço]
Para comprimento ← 1 até tamanho fazer
[Se encontra um espaço, assinala a sua posição na cadeia]
Se sub(nome, comprimento, 1) = “ “ então
posição ← comprimento
Fim se
Seguinte
posição ← posição + 1 [adiciona 1 porque o espaço não interessa]
apelido ← sub(nome, posição) [retira a subcadeia desde posição até ao fim]
Sair apelido
Fim
Exercícios
1. Produza um algoritmo para a determinação da frequência com que cada letra aparece
numa cadeia de caracteres dada.
Como temos que comparar com o alfabeto em maiúsculas e minúsculas partimos de um quadro com três colunas:
uma contém o alfabeto em minúsculas, outra o alfabeto em maiúsculas e a terceira coluna vai receber a quantidade de
ocurrências da respectiva letra.
Algoritmo Letras
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 variável texto.
As estruturas REPETIR...ATÉ servem para percorrer todo o quadro à procura da letra correspondente e adicionar
cada ocorrência na terceira coluna do quadro na respectiva linha da letra.
Pretende-se, também, que quando encontre a letra no quadro para a pesquisa e passe ao carácter seguinte na
cadeia texto. Por isso, aparece condição
(alfabeto[linha,coluna] = sub(texto,posição,1))
3. No estudo das cadeias de caracteres indicámos que uma das operações seria
comp(cadeia) que devolvia o número de caracteres da cadeia. Suponha que essa
operação não está disponível. Crie um algoritmo que faça a operação referida.
Linguagens de programação