Академический Документы
Профессиональный Документы
Культура Документы
PROGRAMAO I
INTRODUO ALGORITMIA E ESTRUTURAS DE DADOS
Programao I
ndice
1.
ALGORITMOS E A RESOLUO DE PROBLEMAS ......................................... 3 1.1. 1.2. 1.3. 1.4. RESOLUO DE PROBLEMAS ................................................................................... 3 APROXIMAO DESCENDENTE (TOP-DOWN APPROACH) ........................................... 4 NOO FORMAL DE ALGORITMO.............................................................................. 6 CARACTERSTICAS DE UM ALGORITMO ................................................................... 6
2.
ESTRUTURAS DE DADOS........................................................................................ 7 2.1. ESTRUTURAS DE DADOS PRIMITIVAS........................................................................ 8 2.1.1. Tipo de dados booleano.................................................................................. 8 2.1.2. Tipo de dados numrico ................................................................................. 8 2.1.3. Tipo de dados alfanumrico ........................................................................... 9 2.1.4. Representao dos dados ............................................................................... 9 2.2. ESTRUTURAS DE DADOS NO PRIMITIVAS .............................................................. 12 2.2.1. Vectores ........................................................................................................ 12 2.2.2. Matrizes .............................................................................................................. 13
3. NOTAO ALGORTMICA....................................................................................... 14 3.1. PSEUDOCDIGO ..................................................................................................... 14 3.1.1. Instruo de atribuio ................................................................................ 15 3.1.2. Leitura e escrita de dados ............................................................................ 16 3.1.3. Estrutura condicional................................................................................... 17 3.1.4. Instrues de repetio................................................................................. 18 3.1.5. Operaes e Expresses Aritmticas............................................................ 21 3.1.6. Operadores e operaes relacionais............................................................ 21 3.1.7. Operadores e operaes lgicas .................................................................. 22 3.2. ALGORITMOS PROPOSTOS ...................................................................................... 23 3.3. DIAGRAMAS DE FLUXO (FLUXOGRAMAS).............................................................. 30 3.3.1. Notao grfica ............................................................................................ 30 3.3.2. Fluxogramas vs. Estruturas de controlo ...................................................... 30 3.3.3. Algoritmo em pseudocdigo / Fluxograma .................................................. 33 4. PROVA E TESTE DE ALGORITMOS................................................................... 34
Programao I
Programao I
Definio mais precisa para o passo 1.1 Seleccione uma lmpada candidata substituio Se a lmpada no da mesma potncia da antiga, ento repita at encontrar uma correcta: Pouse a lmpada seleccionada Seleccione uma nova lmpada
Programao I
Por exemplo, para os passos 2.2, 2.3, 3.2 e 3.3 poderiam tambm derivadas
algoritmo. Exemplo 2: Encontrar o nmero de telefone que corresponde a um dado nome numa lista telefnica.
Algoritmo Lista-Telefnica
Passo 1 2 Descrio Encontre a pgina da lista que contm o ltimo apelido do nome Encontre na pgina determinada no passo 1, o nome procurado
Aumentando o detalhe, obtemos instrues elementares no ambguas: 1.1 1.2 1.3 1.4 Coloque o marcador D (dedo) ao acaso na lista Abra a lista ltimo apelido est contido numa das pginas (esquerda ou direita)? Se sim, siga para o passo 2 ltimo apelido precede a pgina esquerda? Se sim, coloque o marcador atrs da pgina esquerda; se no, coloque o marcador frente da pgina direita. V para 1.2 (retome a sequncia de instrues no passo 1.2)
1.5
Eliminando formulaes mal definidas (ex.: coloque o marcador atrs): 1.1.1 1.1.2 1.1.3 1.2 1.3 1.4 1.5 Torne A igual ao apelido do nome a seleccionar (atribuio varivel A) Escolha uma posio n ao acaso no intervalo [1,N] (n representa o nmero de pginas til da lista) Torne D igual a n (atribua varivel D o valor n) Abra a lista no local seleccionado pelo marcador D A est contido numa das pginas (esquerda ou direita)? Se sim, siga para o passo 2. A precede o primeiro apelido da pgina esquerda? Se sim, faa n igual a (n+1)/2 (actualizao do valor de n); se no, faa n igual a (N+n)/2. V para 1.2 (retome a sequncia de instrues no passo 1.2)
Programao I
Programao I
2. Estruturas de Dados
A resoluo de problemas atravs de algoritmos requer a representao de entidades e objectos reais em itens de dados. As diferentes formas nas quais os itens de dados so logicamente relacionados definem diferentes estruturas de dados (figura 2). Esta seco apresenta um conjunto de estruturas de dados classificadas como primitivas e no primitivas. Estruturas de dados primitivas so directamente manipuladas em linguagem mquina (binria), enquanto que estruturas de dados no primitivas (ou complexas) representam estruturas de informao em conjuntos (formados por estruturas de dados primitivas) logicamente relacionados.
Primitivas
Caracteres alfanumricos
Inteiros Reais
Estruturas de Dados
Comprimento fixo (variveis indexadas)
No Primitivas (Complexas)
{ { { {{ {
Vector Matriz Lineares
Pilhas Filas Listas rvores No lineares Grafos Sequenciais Sequenciais indexados Directos
A representao de uma particular estrutura de dados na memria do computador designado por estrutura de armazenamento. fundamental saber distinguir estes dois conceitos: estrutura de dados vs. estrutura de armazenamento. Existem diferentes configuraes de armazenamento correspondentes a uma particular estrutura de dados. A preocupao desta disciplina centra-se na forma como representamos entidades e objectos reais atravs de estruturas de dados e no na forma como os armazenamos fisicamente na memria (primria ou secundria) do computador.
Programao I
A definio das estruturas de dados a utilizar por um algoritmo tem tambm subjacente as operaes a executar nos dados representados. Diferentes operaes podem ser executadas, tais como operaes para criar e eliminar estruturas de dados, operaes para inserir, alterar e eliminar elementos da estruturas de dados, e operaes para aceder a elementos da estrutura de dados. Em sntese, uma eficiente manipulao das estruturas de dados associadas resoluo de um problema e consequente construo de um algoritmo envolve uma anlise das seguintes questes: a) Compreender a relao entre os dados b) Decidir operaes a executar nos dados logicamente relacionados c) Representar os elementos dos dados de modo a: i. Manter as relaes lgicas entre os dados ii. Executar de forma eficiente as operaes nos dados d) Construir o algoritmo e escolher a linguagem de programao mais apropriada que permita de modo natural e expressivo representar as operaes a executar nos dados.
Programao I
Representao Simblica Smbolos Letras Dgitos Decimais Sinais de Operao Sinais de Pontuao Smbolos Especiais (a a z, A a Z) (0 a 9) +-*/ ,.;:?! #&%$|
Os smbolos so codificados em binrio com um cdigo de comprimento n. Os cdigos usuais tm 8 bits (n=8, 256 smbolos representveis), por exemplo o ASCII ou EBCDIC. Representao Numrica Os dados representam quantidades numricas no sistema de numerao binrio (ou num outro sistema codificado em binrio). 0101 1011 = = 0*27 + 1*26 + 0*25 + 1*24 + 1*23 + 0*22+ 1*21 + 1*20 = 64+16+8+2+1 = 91
9
Programao I
Informao Contextual Contedo informativo (significado) de um dado, depende do contexto. Por exemplo, o dado 0100 0001, pode representar: 65 41 A MOV A,B Numa operao utilizando binrio Numa operao utilizando BCD (Binary Coded Decimal) Smbolo (letra) ASCII Instruo do microprocessador INTEL 8080
O contexto pode depender do uso no problema particular, da posio numa sequncia de dados ou da posio fsica no sistema de computao. Tipo de dados vs. Variveis vs. Constantes A compreenso dos conceitos anteriores de fundamental importncia para a eficiente construo de algoritmos. Os seguintes exemplos descrevem a diferena entre estes conceitos e o relacionamento lgico entre eles. Exemplo 3 X 47 Esta expresso algortmica simples significa que varivel X foi atribudo o valor (ou constante) 47. Esta operao de atribuio tem por pressuposto (em termos algortmicos) o facto que X uma varivel do tipo inteiro. Exemplo 4 CAR G Esta expresso algortmica simples significa que varivel CAR foi atribudo o valor (ou constante) G. Esta operao de atribuio tem por pressuposto (em termos algortmicos) o facto que CAR uma varivel do tipo alfanumrico. Por conveno os valores alfanumricas so apresentadas entre plicas (ex.: CAR1 7 ou CAR2 J).
10
Programao I
Nomes de variveis Uma varivel uma entidade que representa um determinado valor e o seu nome escolhido de forma a reflectir o valor que representa (ex.: a varivel MAX pode representar o valor mximo de um conjunto de valores numricos). Por conveno, um nome de uma varivel no deve conter espaos, no deve iniciar por nmeros e no deve conter determinados caracteres especiais, tais como * , = ? , / * ; : . , } [ ] {, etc. O nome de uma varivel deve iniciar sempre por uma letra, seguido de um conjunto de caracteres incluindo letras, nmeros e alguns caracteres especiais, como o caso do caracter _ que pode ser utilizado para separar palavras que constituem o nome da varivel (ex.: NUM_ALUNO). As prximas variveis so consideradas vlidas: NUM N_ALUNO NOMEALUNO NOME_ALUNO X1 Y2 As prximas variveis so consideradas invlidas: 7NUM Y-Z T/4 U*VAR DUAS-PAL DUAS PALAVRAS
11
Programao I
2.2.1. Vectores
Elementos de um vector (array) so representados atravs de conjuntos de variveis de um determinado tipo de dados. Um vector contem um nome ao qual est associado um tipo de dados em funo dos dados a manipular pelo vector, um ndice do tipo inteiro, e uma dimenso do tipo inteiro. Um vector apresentado atravs de um nome e de um ndice entre parntesis rectos. A figura seguinte ilustra a representao e a manipulao dos elementos de um vector.
I = 1 .. 8
1 2 3 4 5 6 7
N=8
8
VNUM [I]
34
121
78
90
15
O vector VNUM [I] representado na figura anterior um vector do tipo numrico (inteiro) com uma dimenso de 8 (varivel N) elementos. O acesso a elementos (valores) do vector so efectuados atravs da utilizao de um ndice (no exemplo anterior representado na varivel I). Por exemplo, o valor associado posio 6 do vector VNUM igual a 90.
12
Programao I
2.2.2. Matrizes
Uma matriz pode ser interpretada como um vector (array) bidimensional (com dimenso 2). A prxima figura ilustra como representar e manipular elementos de uma matriz. Uma matriz representada atravs de um nome e dois ndices que permitem indexar e aceder os elementos que constam na matriz.
J
1 2 3 4 5
M=6
6
I
ndice representativo das linhas da matriz
1 2 3 4 5 6
55 121 34 56 34 76 43
12 67 4 12 21 32 221
72 17 71 12 15 78 321
8 78 7 7 8 78 77
15 12 54 56 0 56 45
99 123 212 33 79 7 7
MAT [ I , J ]
N=7
A matriz MAT[I,J] ilustrada na figura anterior contem 7 linhas e 6 colunas. O ndice I representa as linhas e o ndice J as colunas da referida matriz. A insero, acesso e a actualizao dos elementos da matriz efectua-se atravs da referncia da linha e da coluna. Por exemplo, MAT[3,6] = 212. Este tipo de estruturas de dados (vectores e matrizes) aplicado com notas explicativas em diversos exerccios e exemplos propostos nas seces do prximo captulo.
13
Programao I
3. Notao algortmica
Esta seco apresenta a notao algortmica a utilizar na construo de algoritmos para a resoluo de problemas (exerccios propostos). Na fase de desenvolvimento de um algoritmo podemos utilizar:
Linguagem auxiliar (pseudo-cdigo) linguagem de representao de alto nvel que pode ser traduzida em qualquer linguagem de programao. Diagrama de Fluxo (fluxograma) - notao grfica. Linguagens de Programao (ex.: C, C++, Java, Pascal, Basic, Fortran, ADA, etc.).
3.1. Pseudocdigo
O pseudocdigo uma notao algortmica muito prxima da linguagem natural. Um algoritmo identificado por um nome que dever ser elucidativo do problema em causa. Por conveno, o nome do algoritmo seguido por uma breve descrio (comentrio introdutrio) das tarefas executadas pelo algoritmo. Esta descrio poder tambm conter os nomes e tipos das variveis utilizadas no algoritmo. Um algoritmo construdo atravs de uma sequncia de passos numerados (exemplo 5). Cada um destes passos dever conter um comentrio explicativo da tarefa a executar no contexto global do algoritmo. O prximo exemplo apresenta um algoritmo que permite calcular o factorial de um nmero inteiro. Este algoritmo utiliza uma notao que ser utilizada nos restantes exemplos: 1. Nome do algoritmo em letras maisculas. 2. Breve comentrio das tarefas a desenvolver pelo algoritmo. 3. Conjunto de passos numerados e comentados. 4. Estruturas de dados, funes e subrotinas em letra maiscula. 5. Estruturas de controlo: primeira letra em maiscula. 6. O algoritmo termina com a instruo Exit (fim lgico). O smbolo representa o fim fsico do algoritmo. As prximas subseces apresentam instrues, estruturas de controlo, operaes e operadores (notao algortmica) que podem ser utilizadas na construo de algoritmos.
14
Programao I
Exemplo 5 Algoritmo FACTORIAL. Este algoritmo calcula o factorial de um nmero inteiro. 1. [Leitura do nmero] Read (N) 2. [Caso particular de N = ou N = 1] If N=0 Or N=1 Then FACT 1 3. [Outros nmeros] Else FACT N NUM N 1 Do For I = NUM To 1 Step 1 FACT FACT * I 4. [Impresso do resultado (N!)] Print (O Factorial de ,N, igual a ,FACT) 5. [Termina] Exit
15
Programao I
16
Programao I
17
Programao I
A declarao (If ... Then ... Else) pode conter um conjunto de instrues devidamente indentadas (exemplo 9) de modo a definir um conjunto mais extenso de estruturas condicionais. Exemplo 13 Read (X,Y) Then X (X + 15) / 2 If X > Y Then Print (X - Y) Else Print (Y - X) Else X X * 5 If X > Y/2 Then Print (X) Print (X/Y) Else Print (X*Y)
18
Programao I
Exemplo 14 Read (Z) X 15 Do While Z >= 135 XX5 Z (X *4) / 3 Print (X,Z) Repeat Until (Repetir at ) A instruo Repeat Until utilizada quando necessrio repetir um conjunto de passos em funo de uma determinada expresso lgica. Os referidos passos so repetidos at a expresso lgica se tornar verdadeira, ou seja, o ciclo de processamento termina quando a condio se tornar verdadeira. Sintaxe: Repeat Until <logical condition> ___________ ___________ Exemplo 15 1 [Inicializaes] K1 2. [Repetir at atingir o aluno 75] Repeat Until K > 75 Write (NOME_ALUNO [ K ]) KK+1
19
Programao I
Do For (Fazer para ) A instruo Do For utilizada quando necessrio repetir um conjunto de passos um determinado nmero de vezes. Sintaxe: Do For INDEX = N1 to N2 Step P ___________ ___________ INDEX indica o ndice que incrementado em cada ciclo de processamento. N1 e N2 referem dois nmeros inteiros representativos do intervalo inferior e superior da sequncia de nmeros a executar. A clausula Step determina o incremento na sequncia numrica. Por defeito, o Step tem valor 1. Exemplo 16 X 10 Do For I = 1 to 70 XX+5 Print (X) Exemplo 17 Read (Y) Do For J = 10 to 100 Step 10 Y Y + 25 Print (Y)
20
Programao I
21
Programao I
O resultado da avaliao de uma expresso lgica pode ter um de dois valores possiveis: verdadeiro (true) ou falso (false). Exemplo 20 A 20 ( a varivel A tem atribudo o valor numrico 20) 1. A <= 10 / 3 + 5 2. A <> A + 10 A relao 1 tem valor falso e a relao 2 tem valor verdadeiro.
Notao
not and or
Os operadores lgicos so utilizados em conjunto com os operadores relacionais e aritmticos. Deste modo, considerada a seguinte ordem de precedncia entre operadores.
Precedncia
1 2 3 4
Operador
Parntesis Aritmtico Relacional Lgico
Considere o seguinte exemplo assumindo que a varivel NUM tem o valor 1. 1. (NUM < 2) and (NUM < 0) 2. (NUM < 2) or (NUM < 0) 3. not(NUM < 2) As expresses 1,2,3 tm valores falso, verdadeiro, e falso respectivamente. A prxima seco prope um conjunto de algoritmos e respectiva resoluo.
22
Programao I
Algoritmo MAX_DIVISOR_COMUM Este algoritmo permite calcular o mximo divisor comum mdc(m,n) entre dois nmeros inteiros. 1. [Leitura dos valores (conjunto de valores vlidos: inteiros, 0)]
Read (M,N) If M < N Then MIN M Else MIN N
2. [Inicializaes]
MDC MIN FLAG Do While FLAG = R1 mod(M,MDC) R2 mod(N,MDC) If R1 = and R2 = Then FLAG 1 Else MDC MDC - 1
4. [Termina]
Exit
23
Programao I
Algoritmo MAIOR_VALOR_VECTOR
Este algoritmo determina o maior valor de um conjunto de valores referenciados no vector A. O vector A contem N elementos. O resultado a colocado na varivel MAX. 1. [Verificar se o vector contem elementos] If N < 1 Then Write(Vector vazio) Exit 2. [Inicializaes: assumir inicialmente A[1] como o maior elemento do vector] MAX A[1] I2 3. [Verificar todos os elementos do vector] Do While I <= N If MAX < A[I] Then MAX A[I] II+1 3. [Imprimir o maior elemento do vector A] Write(O maior elemento do vector ,MAX) 4. [Termina] Exit
Algoritmo SOMA_MDIA
Este algoritmo determina o somatrio e a mdia de um conjunto de valores referenciados no vector A. O vector A contem N elementos. 1. [Verificar se o vector contem elementos] If N < 1 Then Write(Vector vazio) Exit 2. [Inicializaes] ACUM 0 MED 0 3. [Verificar todos os elementos do vector] Do For I = 1 to N ACUM = ACUM + A[I] 4. [Determina a mdia de valores do vector] MED ACUM / N 4. [Imprime os resultados] Write(O somatrio igual a ,ACUM, e a mdia igual a ,MED) 5. [Termina] Exit
24
Programao I
1. [Leitura da matriz quadrada] Read (N) Do For I = 1 to N Do For J = 1 to N Read (M[I,J]) 2. [Inicializaes] SOMA MIN M[1,1] MAX M[1,1] 3. [Tratar os elementos da primeira diagonal da matriz] Do For I = 1 to N [determina o somatrio] SOMA SOMA + M[I,I] [determina o valor minimo] If M[I,I] < MIN Then MIN M[I,I] [determina o valor maximo] If M[I,I] > MAX Then MAX M[I,I] 3. [Imprimir os resultados] Write(O somatrio dos elementos da primeira diagonal da matriz igual a ,SOMA) Write(O menor elemento da primeira diagonal da matriz igual a ,MIN) Write(O maior elemento da primeira diagonal da matriz igual a ,MAX) 4. [Termina] Exit
25
Programao I
Pesquisa e ordenao de vectores a) Ordenao por seleco Algoritmo ORDENAO VECTOR Dado um vector K com N elementos, este algoritmo ordena o vector por ordem crescente.
1. [Seleco sucessiva dos valores at ao ndice N-1] Do For PASS = 1 To N - 1 MIN PASS 2. [Obter o ndice do valor mnimo] Do For I = PASS + 1 To N If K[I] < K[MIN] Then MIN I 3. [Trocar os valores] If MIN <> PASS Then TEMP K[PASS] K[PASS] K[MIN] K[MIN] TEMP 4. [Termina] Exit
A prxima figura ilustra a forma como um determinado vector ordenado atravs da seleco e troca sucessiva de valores. Considere o seguinte vector K[ ] de nmeros inteiros e as respectivas passagens at obter a ordenao dos seus elementos.
1 2 3 4 5
K[ ]
5 1 1 1 1
3 3 2 2 2
7 7 7 3 3
2 2 3 7 5
1 5
1 Passagem
2 Passagem
5
3 Passagem
5 7
4 Passagem (vector ordenado)
26
Programao I
b) Pesquisa linear Os prximos trs algoritmos representam trs verses para a resoluo do mesmo problema: pesquisar a existncia de um dado elemento num determinado vector. Pesquisa linear de elementos de um vector (verso 1.0) Algoritmo PESQUISA_LINEAR_V1.0 Dado um vector K com N elementos (N 1), este algoritmo permite verificar a existncia de um dado elemento (valor) representado pela varivel X. 1. [Iniciar a bandeira]
FLAG
4. [Termina]
Exit
NOTA: esta verso pouco eficiente, na medida em que necessrio efectuar N testes at encontrar um determinado elemento do vector. Os prximos algoritmos (verso 1.1. e 1.2.) apresentam uma forma mais eficiente de resolver este problema.
27
Programao I
4. [Termina]
Exit
4. [Termina]
Exit
28
Programao I
Algoritmo VECTORES_ALUNOS_INFO Este algoritmo processa a informao relativa a um conjunto de alunos de um determinado estabelecimento de ensino. Este algoritmo efectua os seguintes procedimentos:
a) Leitura dos vectores representativos do nmero, nome, curso e turma de N alunos. b) Ordenao dos alunos e respectivos vectores por ordem alfabtica (crescente) do nome do aluno. c) Verificar a existncia de um determinado aluno. A pesquisa efectuada pelo nmero do aluno.
1. [Leitura de valores] Read (N) Do For I = 1 To N Read(NUM[I], NOME[I], CURSO[I], TURMA[I]) 2. [Ordenao dos alunos por nome] Do For PASS = 1 To N - 1 MIN PASS Do For I = PASS + 1 To N If NOME[I] < NOME[MIN] Then MIN I If MIN <> PASS Then TEMP NOME[PASS] NOME[PASS] NOME[MIN] NOME[MIN] TEMP [trocar os outros elementos dos restantes vectores] TEMP NUM[PASS] NUM[PASS] NUM[MIN] NUM[MIN] TEMP TEMP CURSO[PASS] CURSO[PASS] CURSO[MIN] CURSO[MIN] TEMP TEMP TURMA[PASS] TURMA[PASS] TURMA[MIN] TURMA[MIN] TEMP 2. [Pesquisa por nmero de aluno] Read(NALUNO) I1 Do While I <= N AND NUM[I] <> NALUNO I=I+1 If NUM[I] = NALUNO Then Write(O aluno existe) Else Write(O aluno no existe) 2. [Termina] Exit
29
Programao I
Smbolo
Instrues de atribuio
Estrutura condicional
30
Programao I
False C
True
False C
True
ESTRUTURA Do While
WHILE C DO A
False C
True A
31
Programao I
True C
False
IX
False
True A
II+P
32
Programao I
Algoritmo SOMA_VALORES Este algoritmo determina o somatrio de um determinado nmero de valores numricos a introduzir pelo utilizador.
Pseudocdigo
1. [Leitura de dados (nmero de valores)] Read (N de valores a somar: , N) 2. [Inicializao] SOMA 2. [Ciclo para efectuar o somatrio] Do For I = 1 To N Read (Introduza o N:, NUM) SOMA SOMA + NUM 3. [Imprimir o resultado] Write (O somatrio igual a , SOMA) 4. [Termina] Exit
Fluxograma
Inicio
SOMA 0
I1
False I <= N
True
NUM
SOMA
Fim
33
Programao I
M 8
N 20
MIN
mdc
R1
R2
FLAG=
R1=R2
Entrada/Sada Leia(8,20)
8 8 0 4 7 1 6 6 2 2 5 3 0 4 0 0 F V Escreve(4) V F V F V F V F
O seguimento (ou traagem) de algoritmos pode detectar a presena de erros mas no pode comprovar a sua ausncia (exceptuando em casos simples).
34