Escolar Documentos
Profissional Documentos
Cultura Documentos
___________________________________________________________
ÍNDICE ANALÍTICO
1
Introdução à Lógica de Programação
___________________________________________________________
Ao completar o curso o aluno não terá conhecido todas as possibilidades oferecidas pela lógica.
O curso pretende transmitir aos alunos os conhecimentos básicos necessários para o desempenho das
funções de análise e programação.
Lógica
Seqüência Lógica
Estes pensamentos podem ser descritos como uma seqüência de instruções, que devem ser
seguidas para se cumprir uma determinada tarefa.
Instruções
Na linguagem comum, entende-se por instruções "um conjunto de regras ou normas definidas
para a realização ou emprego de algo".
Convém ressaltar que uma ordem isolada não permite realizar o processo completo, para isso é
necessário um conjunto de instruções colocadas em ordem seqüencial lógica.
Por exemplo, se quisermos fazer uma omelete de batatas, precisaremos colocar em prática uma
série de instruções: descascar as batatas, bater os ovos, fritar as batatas, etc...
É evidente que essas instruções têm que ser executadas em uma ordem adequada - não se
podem descascar as batatas depois de fritá-las.
Dessa maneira, uma instrução tomada em separado não tem muito sentido; para obtermos o
resultado, precisamos colocar em prática o conjunto de todas as instruções, na ordem correta.
2
Introdução à Lógica de Programação
___________________________________________________________
Algoritmo
Um algoritmo é formalmente uma seqüência finita de passos que levam a execução de uma
tarefa. Podemos pensar em algoritmo como uma receita, uma seqüência de instruções que dão cabo de
uma meta específica. Estas tarefas não podem ser redundantes nem subjetivas na sua definição, devem
ser claras e precisas.
Como exemplos de algoritmos podemos citar os algoritmos das operações básicas (adição,
multiplicação, divisão e subtração) de números reais decimais. Outros exemplos seriam os manuais de
aparelhos eletrônicos, como um videocassete, que explicam passo-a-passo como, por exemplo, gravar
um evento.
Até mesmo as coisas mais simples, podem ser descritas por seqüências lógicas.
Por exemplo:
+ =
Programas
Os programas de computadores nada mais são do que algoritmos escritos numa linguagem de
computador (Pascal, C, Cobol, Fortran, Visual Basic entre outras) e que são interpretados e executados
por uma máquina, no caso um computador. Notem que dada esta interpretação rigorosa, um programa
é, por natureza, muito específico e rígido em relação aos algoritmos da vida real.
2. DESENVOLVIMENTO DE ALGORITMOS
Fases
No capítulo anterior vimos que ALGORITMO é uma seqüência lógica de instruções que podem
ser executadas.
É importante ressaltar que qualquer tarefa que siga determinado padrão pode ser descrita por
um algoritmo, como por exemplo:
ou então
3
Introdução à Lógica de Programação
___________________________________________________________
Entretanto ao montar um algoritmo, precisamos primeiro dividir o problema apresentado em três
fases fundamentais.
Onde temos:
Exemplo de Algoritmo
Imagine o seguinte problema: Calcular a média final dos alunos da 3ª Série. Os alunos
realizarão quatro provas: P1, P2, P3 e P4.
Onde:
Média final = P1 + P2 + P3 + P4
4
Algoritmo:
Receba a nota da prova 1
Receba a nota da prova 2
Receba a nota da prova 3
Receba a nota da prova 4
Some todas as notas e divida o resultado por 4
Mostre o resultado da divisão
Decomposição
4
Introdução à Lógica de Programação
___________________________________________________________
O algoritmo parece resolver o problema da troca da lâmpada. Porém, necessitamos de
orientações mais detalhadas para que seja possível executar a tarefa com exatidão. A este
detalhamento chamamos de decomposição ou refinamento sucessivo.
Podemos considerar, em primeiro lugar, que é necessário selecionar uma lâmpada nova da
mesma potência, digamos 60 Watts.
Agora, vamos admitir que o soquete esteja pendurado no teto e que usaremos uma escada para
alcançá-lo. Suponhamos também que a instrução é dada a uma pessoa que nunca trocou uma
lâmpada. Devemos orientá-la como retirar a lâmpada queimada e colocar uma nova.
Assim, o primeiro passo do fluxo anterior será dividido agora, em cinco partes:
Selecione uma nova lâmpada da mesma potência da queimada
Desligue o interruptor, se estiver ligado
Posicione a escada
Suba na escada até alcançar o soquete
Gire a lâmpada no sentido anti-horário até que se solte
Estruturas de controle
Notemos que cada passo do algoritmo deverá ser executado uma única vez e
incondicionalmente. A cada passo de um algoritmo com as características descritas acima
denominamos PROCEDIMENTO SEQÜÊNCIAL.
Mas ainda não atingimos uma especificação precisa para cumprir a tarefa. Diversos passos
necessitam operações mais elaboradas. Por exemplo, no segundo passo "Desligue o interruptor", não
consideramos a possibilidade deste já estar desligado. Poderíamos condicionar a execução dessa ação
ao estado "ligado" do interruptor. Assim, substituiríamos o procedimento seqüencial anterior pelo
seguinte PROCEDIMENTO CONDICIONAL, também chamado de SELEÇÃO ou DECISÃO:
Se o interruptor estiver ligado, desligue-o
Vimos até aqui dois tipos fundamentais de procedimentos: a seqüência e a seleção. Existe
ainda um terceiro tipo de procedimento que pode ajudar na elaboração de algoritmos precisos e claros -
a REPETIÇÃO ou PROCEDIMENTO REPETITIVO.
O primeiro passo de nosso algoritmo "Pegue uma nova lâmpada de 60 Watts" oculta
procedimentos que podem ser executados repetidas vezes até que se alcance o objetivo pretendido
(uma lâmpada de 60 Watts).
5
Introdução à Lógica de Programação
___________________________________________________________
Por conseguinte, esse procedimento seqüencial pode ser detalhado através de dois
procedimentos: um seqüencial e outro de repetição, como a seguir:
Pegue a lâmpada
SE a potência não for de 60 Watts, REPITA os seguintes passos até encontrar uma lâmpada de
60 Watts
Descarte essa lâmpada
Pegue outra lâmpada
A partir destes novos conceitos, podemos evoluir nosso algoritmo da seguinte forma:
Pegue uma lâmpada
SE a potência não for de 60 Watts, REPITA os seguintes passos até encontrar uma lâmpada de
60 Watts
Descarte essa lâmpada
Pegue outra lâmpada
SE o interruptor estiver ligado:
desligue o interruptor
Posicione a escada
REPITA o seguinte passo até alcançar o soquete
suba um degrau da escada
REPITA o seguinte passo até que a lâmpada fique livre do soquete
gire a lâmpada no sentido anti-horário
Posicione a lâmpada nova no soquete
REPITA o seguinte passo até que a lâmpada fique fixa no soquete
gire a lâmpada no sentido horário
Desça da escada
Esse algoritmo pode ser ainda mais detalhado, entretanto, o objetivo deste capítulo foi apenas
introduzir o conceito de estruturas de controle.
Símbolos Geométricos
Para eliminar tais inconvenientes, é comum substituir a descrição literal dos algoritmos por um
DIAGRAMA DE BLOCOS que é a "representação gráfica do encadeamento das operações de um
programa do computador ou das rotinas que o integram. Sinônimo: Fluxograma."
6
Introdução à Lógica de Programação
___________________________________________________________
Entre os símbolos que aparecem nos fluxogramas, destacam-se, pelo seu uso mais freqüente,
os seguintes:
TERMINAL
assinala o início ou fim de um diagrama, ou representa parada de
execução;
PROCESSAMENTO
simboliza um processamento interno. É uma ordem para que a
máquina execute as operações descritas no interior do símbolo;
ENTRADA/SAÍDA
simboliza uma operação de leitura ou gravação, onde a linha
tracejada significa a condição de fim de arquivo, erro de leitura ou de
gravação;
DECISÃO
utilizado para inserir perguntas dentro do diagrama com duas
alternativas de respostas (sim ou não);
ROTINA FECHADA
significa que as operações a executar neste passo estão descritas em
um fluxograma à parte, identificado pelo nome que aparece no
interior do símbolo;
SUB-ROTINA
rotina predefinida que se encontra em biblioteca para ser utilizada em
diversos programas;
EXIBIÇÃO
indica uma mensagem a ser enviada a um terminal de vídeo;
CLASSIFICAÇÃO
utilizado para ordenação de arquivos;
7
CONECTOR DE PÁGINA
utilizado quando continuamos a descrição do fluxograma em outra
página;
Introdução à Lógica de Programação
___________________________________________________________
CONECTOR
utilizado para ligar pontos distintos do diagrama em uma mesma
página;
LINHAS DIRETIVAS
utilizadas para apontar o sentido do fluxo de execução
Construção de diagramas
8
Introdução à Lógica de Programação
___________________________________________________________
Início 1
Pegue uma
lâmpada Suba
um
degrau
Alcançou
o
soquete N
Pegue outra S
lâmpada
Gire a lâmpada
Descarte essa
no sentido
lâmpada
anti-horário
N Lâmpada
Potência
livre do
igual a 60
soquete N
Watts
S
S
Posicione a
S N lâmpada nova
Interruptor
no soquete
ligado
Desligue o
interruptor
Gire a lâmpada
no sentido
horário
Lâmpada
fixa no
soquete N
S
Posicione
a Desça
escada da
escada
1
Fim
Nunca é demais acentuar que um diagrama deve ser inteligível. Cada fase, embora possa ser
codificada diretamente como instrução única, deve ser anotada, não como código de operações da
instrução ou ainda como uma interpretação direta do código, mas como uma nota esclarecendo a
finalidade lógica da fase.
Teste de Mesa
Após desenvolver um algoritmo ele deverá sempre ser testado. Este teste é chamado de TESTE
DE MESA, que significa seguir as instruções do algoritmo de maneira precisa para verificar se o
procedimento utilizado está correto ou não.
9
Introdução à Lógica de Programação
___________________________________________________________
3. VARIÁVEIS E CONSTANTES
Um dado pode ser tanto uma constante quanto um valor de uma variável. As diferenças entre
variáveis e constantes e suas formas de utilização vão ser apresentadas a seguir.
Conceitos
Variável - em processamento de dados, podemos dizer que variável é uma parte da memória do
computador reservada para conter dados durante o processamento de um programa.
Constante - em oposição à variável, podemos conceituar constante como "um dado cujo valor
não está sujeito a mudanças". Geralmente constantes são apresentadas em um algoritmo pelo seu
valor, e não pelo seu significado.
O ato de se atribuir um valor a uma variável não deve ser confundido com o conceito de
igualdade utilizado pela álgebra. Nesta, a expressão "ALTURA = ALTURA + 20" constitui uma falsidade,
pois ALTURA jamais poderá representar mais de um valor na mesma expressão. Por isso, utilizamos a
notação abaixo, onde não existe o sinal "=":
ALTURA ALTURA + 20
Nesse caso, o computador soma 20 ao valor da variável ALTURA (do lado esquerdo da seta) e
atualiza o conteúdo da variável com o resultado da soma..
10
Introdução à Lógica de Programação
___________________________________________________________
INÍCIO 1
POSICIONE
VOLTAS-HORA A
ESCADA
0
ALTURA
ALTURA
0
ALTURA + 20
VOLTAS-
ANTIHORA SUBA
UM
0 DEGRAU
N
ALTURA
PEGUE =
UMA 300
LÂMPADA
S
VOLTAS-ANTI-
PEGUE HORA
OUTRA
LÂMPADA VOLTAS-ANTI-
HORA + 1
GIRE A
DESCARTE LÂMPADA NO
ESSA SENTIDO
N LÂMPADA ANTI-
HORÁRIO
POTÊNCIA N UMA VOLTA
= VOLTAS-
60 ANTI-HORA
S =5
S
S N POSICIONE A
INTER-
RUPTOR LÂMPADA
LIGADO NOVA NO
SOQUETE
DESLIGUE O
INTERRUPTOR
VOLTAS-HORA
VOLTAS-HORA
+1
1 GIRE A
LÂMPADA NO
SENTIDO
N HORÁRIO
UMA VOLTA
VOLTAS-
HORA = 5
DESÇA DA
ESCADA
FIM
11
Introdução à Lógica de Programação
___________________________________________________________
4. OPERADORES
Operadores Aritméticos
Os operadores a seguir são utilizados em algoritmos e podem ser diferentes entre algumas
linguagens de programação.
Operadores Relacionais
Estes operadores sempre retornam valores lógicos (verdadeiro ou falso/ True ou False). Para
estabelecer prioridades no que diz respeito a qual operação executar primeiro, utilize os parênteses. Os
operadores relacionais são:
Operador Operação
= Igual a
<> ou # Diferente de
> Maior que
< Menor que
>= Maior ou igual a
<= Menor ou igual a
Exemplo:
Tendo duas variáveis A = 5 e B = 3, os resultados das expressões seria:
A=B Falso
A <> B Verdadeiro
A>B Verdadeiro
A<B Falso
A >= B Verdadeiro
A <= B Falso
12
Introdução à Lógica de Programação
___________________________________________________________
Símbolo utilizado para comparação entre expressões:
CAMPO COM CAMPO CAMPO COM CONSTANTE CAMPO COM CONSTANTE
NUMÉRICA ALFANUMÉRICA
Operadores Lógicos
E AND
OU OR
NÃO NOT
E / AND Uma expressão AND (E) é verdadeira se todas as condições forem verdadeiras
OR / OU Uma expressão OR (OU) é verdadeira se pelo menos uma condição for verdadeira
NOT Uma expressão NOT (NÃO) inverte o valor da expressão ou condição, se verdadeira
inverte para falsa e vice-versa.
A tabela abaixo mostra os valores possíveis criados pelos três operadores lógicos ( AND, OR e
NOT).
Exemplos:
13
Introdução à Lógica de Programação
___________________________________________________________
A<B AND B>C - Verdadeiro
A >= B OR B=C - Falso
A <= B NOT - Falso
14
Introdução à Lógica de Programação
___________________________________________________________
5. COMANDOS DE ENTRADA E SAÍDA
Arquivos de dados
Conceitos básicos
Campo na memória?
NOME
Exemplo: O arquivo de Clientes da Empresa, onde são armazenados os dados de todos os clientes da
empresa.
Registro 1
Registro 2
Registro 3
Abertura de arquivos
Toda vez que for necessário trabalhar com arquivo, primeiramente precisamos abrir o arquivo.
Abrir o arquivo significa alocar o periférico (disco, disquete) em que o arquivo se encontra, e deixá-lo
disponível para leitura/gravação.
15
Introdução à Lógica de Programação
___________________________________________________________
O símbolo para abertura de arquivo é:
ABRIR ARQUIVO
Fechamento de arquivos
Da mesma maneira que precisamos abrir um arquivo antes do processamento, também se faz
necessário o fechamento do mesmo, para que suas informações não possam ser violadas ou
danificadas,
FECHAR ARQUIVO
Leitura de arquivos
Após abrir um arquivo é necessário ler os dados que estão em disco e transferi-los para
memória. Essa transferência é feita por registro. Esse procedimento é gerenciado pelo próprio sistema
operacional.
O símbolo para leitura de arquivo é:
LER
ARQUIVO
Toda vez que abrimos um arquivo o ponteiro é posicionado no primeiro registro, ou seja, no
início do arquivo. Para que possamos trabalhar com os dados se torna necessário sabermos onde está
o ponteiro do registro. Isso poderemos fazer testando se o ponteiro está no final do arquivo. Esse é
sempre executado após a leitura do registro (mudança da posição do ponteiro).
16
Introdução à Lógica de Programação
___________________________________________________________
Simbolicamente podemos representar esse passo da seguinte maneira:
LER INÍCIO
ARQUIVO
S ABRIR
FIM DE ARQUIVO
ARQUIVO
N
NREG = 0
LER
ARQUIVO
S
FIM DE FECHAR
NREG FIM
ARQUIVO ARQUIVO
NREG =
NREG + 1
17
Introdução à Lógica de Programação
___________________________________________________________
Movimentação de registros
Como dito no item anterior, quando um arquivo é aberto o ponteiro está no primeiro registro. A
cada leitura do arquivo o ponteiro se movimenta para o próximo registro e assim por diante. Como
mostra a figura abaixo:
Gravação de Arquivos
INÍCIO DO
ARQUIVO
FINAL DE
ARQUIVO
Da mesma maneira que os registros são lidos de um arquivo, também podemos gravar registros
em um arquivo. A gravação consiste na transferência de um registro da memória, para um periférico
(disco, disquete etc.).
GRAVAR
REGISTRO
6. ESTRUTURAÇÃO DE PROGRAMAS
18
Introdução à Lógica de Programação
___________________________________________________________
Na programação estruturada, as diferentes fases desse processo de concepção de um
programa são fixadas explicitamente por escrito, e não somente - como é uso comum - o produto final (o
programa na forma em que será submetido à máquina). Obtemos no final não somente um programa,
mas também a documentação de todo o processo de solução do problema.
Cada nova fase de desenvolvimento "de cima para baixo" (top-down) é obtida por "refinamento"
da fase anterior, até chegar a um nível de detalhamento que permita implementar o algoritmo
diretamente na linguagem de programação.
O candidato é considerado aprovado ao obter média aritmética das quatro provas maior que 7.
Utilizaremos as seguintes variáveis para resolver o problema:
SOMA: soma das quatro notas de um aluno;
MÉDIA: média de um aluno;
CNT-CANDIDATOS: número de candidatos lidos no arquivo de entrada;
ACM-MÉDIA: soma das médias de todos os alunos lidos no arquivo de entrada;
MÉDIA-GERAL: média geral do concurso.
Cada uma dessas variáveis deverá ser inicializada com zero, ou seja, atribuído zero como valor
inicial.
19
Introdução à Lógica de Programação
___________________________________________________________
INÍCIO
NOME501E
NOTA1501E
SOMA, MÉDIA, REG501E NOTA2501E
ACM-MÉDIA, NOTA3501E
MÉDIA-GERAL, NOTA4501E
CNT-CANDIDATOS
0
LER NOME701S
ABC501E REG701S MÉDIA701S
SOMA
NOTA1501E +
NOTA2501E +
NOTA3501E +
NOTA4501E
MÉDIA
SOMA / 4
CNT-
CANDIDATOS
CNT-
CANDIDATOS
+ 1
ACM-MÉDIA
MÉDIA +
ACM-MEDIA
N S
MÉDIA > 7
NOME701S
NOME501E
MÉDIA701S
MÉDIA
IMPRIMIR
REG701S
Temos até aqui um fluxograma parcialmente resolvido, porém precisamos finalizá-lo. A linha
tracejada ao lado do símbolo de leitura indica qual procedimento deverá ser adotado caso seja
encontrado o fim do arquivo.
Neste caso, deveremos imprimir a média geral:
O fluxograma está pronto, resolve o problema, mas não está estruturado. A partir de uma visão
macro, evidenciamos as seguintes funções básicas no fluxograma:
1. leitura de arquivo;
2. cálculo da média de um candidato;
20
Introdução à Lógica de Programação
___________________________________________________________
3. impressão de dados de um candidato aprovado;
4. cálculo da média geral do concurso;
5. impressão da média geral do concurso.
INÍCIO
SOMA, MÉDIA,
ACM-MÉDIA,
MÉDIA-GERAL,
CNT-CANDIDATOS
0
FIM
LER
1 ABC501E
SOMA
N
2 NOTA1501E + "ARQUIVO
NOTA2501E + CNT-
ABC501E PARAR
CANDIDATOS
NOTA3501E + <> 0 VAZIO"
NOTA4501E
S
MÉDIA
MÉDIA-GERAL
SOMA / 4 4
ACM-MEDIA /
CNT-
CNT- CANDIDATOS
CANDIDATOS
NOME701S
CNT-
CANDIDATOS
"MÉDIA
+ 1
GERAL"
ACM-MÉDIA
MÉDIA701S
MÉDIA +
ACM-MEDIA MÉDIA-GERAL 5
N S
MÉDIA > 7 IMPRIMIR
REG701S
NOME701S
NOME501E
FIM
MÉDIA701S
MÉDIA
3
IMPRIMIR
REG701S
Determinadas as funções básicas, vamos estruturar o programa. Podemos notar que certas
instruções são executadas reiteradas vezes com o desvio incondicional do fluxo para o primeiro
conector do diagrama. Na programação estruturada, repetições podem ser representadas de duas
formas:
21
Introdução à Lógica de Programação
___________________________________________________________
a)
ROTINA
X
S
CONDIÇÃO
A
b)
ROTINA
X
S
CONDIÇÃO
A
No caso "a", rotina "Rotina X" é executada antes de ser testada a "Condição A". No caso "b", a
rotina será executada se a condição for atendida.
22
Introdução à Lógica de Programação
___________________________________________________________
INÍCIO
SOMA, MÉDIA,
MÉDIA-GERAL,
CNT-CANDIDATOS
ACM-MÉDIA, IND-
FIM
0
LEITURA
ABC501E
TRATA
CANDIDATO
N
IND-FIM = 1
MÉDIA-GERAL
ACM-MÉDIA /
CNT-
CANDIDATOS
NOME701S
"MÉDIA
GERAL"
MÉDIA701S
MÉDIA-GERAL
IMPRIMIR
REG701S
FIM
Note que o fluxograma ficou mais claro. Contudo, temos ainda que detalhar as rotinas fechadas
(LEITURA e TRATA CANDIDATO). O fluxo determina a execução da rotina TRATA CANDIDATO
repetidas vezes, estabelecendo um laço (loop) que só termina quando o conteúdo da variável IND-FIM
for igual à 1. Chamaremos esse diagrama de ROTINA PRINCIPAL.
A criação ou não de uma rotina dependerá do número de vezes que esta ocorre no programa,
da quantidade de instruções, da probabilidade de alterações freqüentes e, principalmente, da coesão
entre suas instruções. Coesão diz respeito à força de ligação entre as instruções da rotina. Assim
23
Introdução à Lógica de Programação
___________________________________________________________
devemos ter alta coesão entre as instruções de uma rotina, ou seja, todas elas devem conduzir à
consecução de um mesmo objetivo. Por exemplo, leitura de arquivo, cálculo da média de um candidato,
etc..
Na rotina principal, optamos por não criar novas rotinas para as funções 4 e 5, pois cada uma
delas tem baixa probabilidade de alteração, além de só ocorrerem em um local do programa. Também
não criamos uma nova rotina para a função 2, embora isso pudesse ter sido feito.
Observe o detalhamento da rotina TRATA CANDIDATO:
TRATA
CANDIDATO
SOMA
NOTA1501E +
NOTA2501E +
NOTA3501E +
NOTA4501E
MÉDIA
SOMA / 4
CNT-
CANDIDATOS
CNT-
CANDIDATOS
+ 1
ACM-MÉDIA
MÉDIA +
ACM-MEDIA
N S
MÉDIA > 7
IMPRESSÃO
ABC701S
LEITURA
ABC501E
SAÍDA
Na rotina principal, apenas representamos a rotina TRATA CANDIDATO. Seu detalhamento foi
feito à parte.
24
Introdução à Lógica de Programação
___________________________________________________________
execução passa a executar cada uma das instruções da rotina e, somente após executar todas as suas
instruções, retorna à próxima instrução.
LEITURA IMPRESSÃO
ABC501E ABC701S
MÉDIA701S
MÉDIA
SAÍDA
IMPRIME
REG701S
SAÍDA
25
Introdução à Lógica de Programação
___________________________________________________________
7. TABELA
AGÊNCIAS
AGÊNCIAS
1) Três Arranjos - Neste caso, basta utilizarmos um arranjo para cada campo da tabela.
Prefixo [1:4]
Nome [1:4]
Estado [1:4]
Para acessarmos um valor basta utilizar um subscritor (usado para informar a posição de um
valor na tabela - poderá ser uma constante inteira, quanto uma variável do tipo inteiro) indicando sua
posição no arranjo. Por exemplo, Prefixo [3] refere-se ao valor armazenado na terceira posição do
arranjo "Prefixo", ou seja, 2314-0.
Esta solução, no entanto, não nos permite acessar uma ocorrência inteira. Assim, se
quiséssemos obter a primeira ocorrência da tabela, teríamos que fazê-lo campo a campo, ou seja,
indexando cada um dos arranjos: Prefixo[1], Nome[1] e Estado [1].
2) Uma Estrutura de Arranjos - Estruturas são coleções de uma ou mais variáveis. Cada
variável de uma estrutura é chamada membro. Podemos ter como membros, arranjos, estruturas, etc.
26
Introdução à Lógica de Programação
___________________________________________________________
Vamos criar uma estrutura denominada Agência contendo como membros as variáveis Prefixo,
Nome e Estado.
PREFIXO [1:4]
AGÊNCIA NOME [1:4]
ESTADO [1:4]
Agência.Prefixo [3]
como:
PREFIXO
AGÊNCIA[1:4] NOME
ESTADO
Para acessarmos a primeira ocorrência da tabela, ou seja, os três valores: 0472-3, Angra dos
Reis e RJ simultaneamente, basta fazermos:
Agência [1].
Além das três soluções propostas, tabelas podem ser representadas utilizando-se outras
estruturas como, por exemplo, listas e árvores. A escolha de alguma dependerá de diversos fatores
conforme mencionado anteriormente. Não devemos, pois, tomar uma única estrutura como sendo a
melhor forma de representar tabelas. É preciso analisar o contexto antes de decidirmos pela solução
mais adequada.
Alertamos os treinandos de que a sintaxe aqui empregada não diz respeito a nenhuma
linguagem específica. Cada linguagem apresenta particularidades que deverão ser consideradas na
declaração de estruturas de dados.
27
Introdução à Lógica de Programação
___________________________________________________________
Por exemplo, em COBOL, poderíamos acessar a primeira ocorrência da tabela em questão
fazendo: AGÊNCIA (1) e os valores dos campos dessa ocorrência fazendo PREFIXO (1), NOME (1) e
ESTADO (1).
Devemos considerar ainda que determinadas estruturas de tabela podem trabalhar com mais de
um subscritor. Por exemplo, desejamos imprimir um relatório em duas colunas, onde a continuação do
texto de uma coluna está na coluna seguinte; como em jornais. Teremos, pois, uma tabela
bidimensional formada por "n" linhas e duas colunas.
Coluna 1 Coluna 2
L
I
N
H
A
S
Página [ 3 , 1]
subscritor de linha
subscritor de coluna
Tabelas podem ser montadas por um ou mais campos, ou mesmo sem obedecer qualquer
ordenação. Podemos, por exemplo, montar uma tabela com os meses do ano em ordem seqüencial,
utilizando um arranjo, conforme visto anteriormente. Neste caso, teríamos "janeiro" na primeira
ocorrência "fevereiro" na segunda e assim sucessivamente.
Esta tabela pode ser inicializada com o nome dos meses, evitando-se, assim, a montagem em
tempo de execução.
O fluxograma a seguir preenche nossa tabela com o prefixo (número e dígito verificador) e o
NUM
AG [1:10] DV
28 NOME
Introdução à Lógica de Programação
___________________________________________________________
nome de 10 agências de um banco, lidos em um arquivo.
MONTA
ATUALIZA
TABELA AGNUM502E
TABELA CONTR502E
AGDV502E
REG502E
AGNOME502E
SBS
SBS
0
SBS + 1
S
LEITURA "ESTOURO
SBS
ABC502E DE PARAR
> 10
TABELA"
AG[SBS].NUM
AGNUM502E
ATUALIZA
TABELA
AG[SBS].DV
N AGDV502E
CONTR502E
= 9's
AG[SBS].NOME
S
AGNOME502E
SAÍDA
LEITURA
ABC502E
SAÍDA
Legenda
• CTE-LIMTAB - Limite superior da tabela (posição da última ocorrência)
• SBS – Subscritor
• AGNUM502E - Número do prefixo da agência lida no arquivo
• AGDV502E - DV do prefixo da agência lida no arquivo
• AGNOME502E - Nome da agência lida no arquivo
• AG[SBS].NUM - Número do prefixo da SBS-ésima agência da tabela
• AG[SBS].DV - DV do prefixo da SBS-ésima agência da tabela
• AG[SBS].NOME - Nome da SBS-ésima agência da tabela
29
Introdução à Lógica de Programação
___________________________________________________________
Pesquisa em tabela
PREFIXO
NOME
NÚMERO DV
CONSULTA 1 2022 2 CUNHA
CONSULTA 2 3712 5 CARMO
CONSULTA 3 1281 5 CANAPI
CONSULTA 4 0085 X SOBRAL
CONSULTA 5 3742 7 MATA
CONSULTA 6 3408 8 UCHÔA
CONSULTA 7 0270 4 UBÁ
CONSULTA 8 2466 X POÁ
CONSULTA 9 0894 X ARCOS
CONSULTA 10 0993 8 TURVO
30
Introdução à Lógica de Programação
___________________________________________________________
PESQUISA
PROCURA
SEQÜENCIAL
VALOR
SBS
S AG[SBS]. N
1 NUM =
AG-PESQ
INFORMA
IND-FIMPESQ ONDE SBS
LOCALIZOU
0 SBS + 1
IND-FIMPESQ
S N
SBS
1 > CTE-
LIMTAB
PROCURA
VALOR INFORMA QUE
NÃO
N LOCALIZOU
IND-
FIMPESQ
>0
S IND-FIMPESQ
SAÍDA
SAÍDA
Legenda
• CTE-LIMTAB - Limite superior da tabela (posição da última ocorrência)
• SBS - Subscritor
• AG-PESQ - Número do prefixo da agência pesquisada
• IND-FIMPESQ - Indicador da continuidade ou encerramento da
pesquisa
31
Introdução à Lógica de Programação
___________________________________________________________
NÚMERO DV NOME
Uma forma mais eficiente de procurar valores em tabelas ordenadas é a pesquisa binária. Esta
técnica consiste em dividir, sucessivamente, a tabela ao meio até localizar ou verificar a inexistência do
valor procurado. Podemos resumir a pesquisa binária em 5 passos:
2) Verificar se o valor procurado sucede a última ocorrência. Se suceder, sabemos que não se
encontra na tabela;
5) Se LI > LS, o valor procurado não se encontra na tabela, senão repetir os passos 3, 4 e 5.
32
Introdução à Lógica de Programação
___________________________________________________________
Devemos ter em mente que a pesquisa binária só faz sentido em estruturas do tipo "arranjo",
onde podemos acessar diretamente um valor através de subscritores. Existem ainda outras técnicas de
pesquisa em tabelas como, por exemplo, a pesquisa randômica. No entanto, a apresentação das
demais técnicas foge ao propósito deste curso.
PESQUISA
PESQUISA
BINÁRIA
LIMITES
LI 1
S AG-PESQ N
PM 0
<
AG[LI].NUM
INFORMA
LS QUE NÃO
LOCALIZOU
CTE-LIMTAB
IND-FIMPESQ
IND-FIMPESQ S N
AG-PESO
1 >
0 AG[LS].NUM
INFORMA QUE
NÃO
PESQUISA LOCALIZOU
LIMITES
IND-FIMPESQ
PROCURA
VALOR
IND-
FIMPESQ
>0
S
SAÍDA
SAÍDA
33
Introdução à Lógica de Programação
___________________________________________________________
PROCURA
VALOR
PM
(LI + LS) / 2
S AG[PM].
N
NUM
= AG-
PESQ
INFORMA
QUE
LOCALIZOU
IND-FIMPESQ
S AG[PM].NUM N
1 <
AG-PESQ
LI LS
( PM + 1 ) ( PM - 1 )
S LI N
>
LS
INFORMA
QUE NÃO
LOCALIZOU
IND-FIMPESQ
SAÍDA
34
Introdução à Lógica de Programação
___________________________________________________________
Legenda
LI - Limite inferior do intervalo LS - Limite superior do intervalo
PM - Ponto médio entre LI e LS
CTE-LIMTAB - Limite superior da tabela
IND-FIMPESQ - Indicador da continuidade ou término da pesquisa
8. ROTINA DE QUEBRA
Conceito de nível
O título 31995 possui subtítulos 01 e 02. O subtítulo 01 possui os desdobramentos 01, 03, 05 e
09 e o subtítulo 02, os desdobramentos 61 e 63.
Podemos notar que, se nos referimos ao desdobramento, este só terá significado se o título e o
subtítulo forem especificados. O mesmo acontece com o subtítulo em relação ao título. A esses graus
de hierarquização denominamos níveis.
No exemplo, o nível mais alto seria o título (nível 3) e o mais baixo, o desdobramento (nível 1)
SUBTÍTULO 01 02 NÍVEL 2
DESDOBRAMENTO 01 03 05 09 61 63 NÍVEL 1
Para entendermos rotina de quebra, vamos produzir um arquivo (relatório CRS700) cujas
informações serão obtidas do arquivo CRS500, onde:
a) cada registro contém a agência, a conta-corrente e o saldo do cliente;
b) o arquivo não possui mais de um registro para a mesma agência/conta-corrente;
c) o arquivo está classificado por agência/conta-corrente (controle).
35
Introdução à Lógica de Programação
___________________________________________________________
O relatório CRS700 deverá apresentar a quantidade de clientes e o saldo total da agência, em
depósitos em contas-corrente, conforme layout abaixo.
O algoritmo necessário para a emissão do relatório consistirá, em resumo, nos seguintes passos:
a) fazer as verificações de consistência do arquivo de entrada (CRS500) e,
b) verificar se houve mudança de agência. Em caso afirmativo, gravar o total de clientes e o saldo
em depósitos da agencia no relatório CRS700.
Muitos outros passos devem ser inseridos no algoritmo para que atinjamos a finalidade do
problema. Vamos considerar o layout do arquivo CRS500, conforme descrito abaixo:
Header
0 0
Detalhe
agência conta-corrente saldo
Trailer
9’s 9's
36
Introdução à Lógica de Programação
___________________________________________________________
INICIO
PROC
INICIAIS
SBVERSAO
CNT-CLI,
ACM-SLD-AG,
GD-PREFAG
<----
0
PROC
INICIAIS
ABRIR
CRS500,
CRS700
TRATA
HEADE
R
CRS500 SAIDA
LER
CRS500
TRATA HEADER
CRS500
LE
CRS500
PREFAG
NAO TRATA
=
AG
9999
SIM SIM
CRS500
EOF PARAR
VAZIO
PROC NAO
FINAIS
SIM
'999 - FIM'
SAIDA
FIM
37
Introdução à Lógica de Programação
___________________________________________________________
LE TRATA
CRS500 AG
CNT-CLI,
GD-CONTROLE
ACM-SLD-AG
<---
<----
CRS500-CONTR
0
GD-PREFAG
LE
<---
CRS500
CRS500-PREFAG
SIM
CRS500
EOF SEM PARAR
TRAILER
CRS500- SIM ACUMU
NAO PREFAG
LA
=
TOTAG
GD-PREFAG
500-CONTR NAO CRS500
> FORA NAO
PARAR
GD- DE
CONTROLE SEQUENCIA
FAZ
SIM REL
CRS700
SAIDA ACUMULA
TOTAG
SAIDA
CNT-CLI
<---
CNT-CLI + 1
ACM-SDOAG
<---
ACM-SDOAG
+ CRS500-SDO
LE
CRS500
SAIDA
38
Introdução à Lógica de Programação
___________________________________________________________
FAZ REL PROC
CRS700 1
FINAIS
LINCAB2-AG CRS700-REG
<--- FAZ
<---
GD-PREFAG REL
LINHIFENS
CRS700
LINDET1-QTD-CLI GRAVA
<--- CRS700- FECHA
CNT-CLI REG CRS500,
CRS700
LINDET2-SDOAG CRS700-REG
<--- <--- SAIDA
ACM-SLD-AG LINDET1
GRAVA
CRS700-REG
CRS700-
<---
REG
LINCAB1
GRAVA CRS700-REG
CRS700- <---
REG LINDET2
CRS700-REG GRAVA
<--- CRS700-
LINCAB2 REG
SAIDA
GRAVA
CRS700-
REG
39
Introdução à Lógica de Programação
___________________________________________________________
Conforme podemos observar no exemplo, a rotina TRATA AG será executada enquanto a
condição estabelecida assim o determinar. Ao fim do ciclo de repetições dessa rotina denominamos
‘quebra’ e, o algoritmo desenvolvido que trata essa quebra chamamos de ‘rotina de quebra’.
Cabe ressaltar que no exemplo apresentado, apenas de um nível de quebra é tratado e que as
rotinas de quebra podem ter vários níveis.
40
Introdução à Lógica de Programação
___________________________________________________________
9. BALANCED-LINE
EXISTÊNCIA ATUALIZADA - contém os dados atualizados obtidos a partir dos dois arquivos
anteriores.
EXISTÊNCIA MOVIMENTO
ATUALIZAÇÃO
OCORRÊNCIAS
EXISTÊNCIA
ATUALIZADA
41
Introdução à Lógica de Programação
___________________________________________________________
As operações são processadas após a comparação de um ou mais campos nos dois arquivos.
Para que possamos realizar o balanced-line é necessário que os arquivos estejam igualmente
ordenados pelos campos a serem comparados.
Header
0 CRS600 DATA
Detalhe
CÓDIGO CLIENTE NOME TELEFONE
Trailer
9's QTD.REGS
Header
0 CRS501 DATA
Detalhe
CÓDIGO CLIENTE COMANDO NOME TELEFONE
Trailer
9's QTD.REGS
__________________________________________________________________________
O arquivo CRS600 está classificado por código de cliente e o CRS501 por código de cliente e
comando (1-inclusão, 2-alteração 3-exclusão). Consideraremos que não pode haver dois registros no
CRS501 para um mesmo cliente e que os comandos já foram depurados, ou seja, não haverá comando
diferente de 1, 2 ou 3. Em resumo, a atualização do arquivo CRS600 consistirá na comparação dos
registros lidos nos arquivos de entrada.
42
Introdução à Lógica de Programação
___________________________________________________________
INÍCIO
"000-INÍCIO"
CNT-REG600E,
CNT-REG600S,
CNT-REG501E,
CNT-FOLHA, ATUALIZ A
GDA-CNTR501E, CRS600
GDA-COD600E
0
COD600E = 9'S N
E
CNT-LIN CNTR501E = 9'S
99
S
ABRIR
TRATA
CRS600E, CRS501E,
TRAILERS
CRS600S, CRS701S,
FECHAR
TRATA CRS600E, CRS501E,
HEADERS CRS600S, CRS701S,
"999-FIM"
LEITURA
CRS600E
FIM
LEITURA
CRS501E
43
Introdução à Lógica de Programação
___________________________________________________________
1
TRATA
HEADERS
CAB3DATA
FIM "ARQUIVO
LER HDR-DATA501E
CRS600E PARAR
CRS600E
VAZIO"
HDR-DATA600S
HDR-DATA501E
N "ARQUIVO
HDR-CONT600E
CRS600E PARAR
=
SEM HEADER"
0
S
GRAVAR
HDR600S
CNT-REG600E
CNT-REG600E + 1
CNT-REG600S
N CNT-REG600S + 1
"ARQUIVO
HDR-NOME600E
LIDO NÃO É PARAR
=
CRS600E"
"CRS600"
SAÍDA
S
HDR600S
HDR600E
FIM "ARQUIVO
LER
CRS501 PARAR
CRS501E
VAZIO"
N "ARQUIVO
HDR-CONT501E
CRS501 PARAR
=
SEM HEADER"
0
CNT-REG501E
CNT-REG501E + 1
N
"ARQUIVO
HDR-NOME501E
LIDO NÃO É PARAR
=
CRS501E"
"CRS501"
44
Introdução à Lógica de Programação
___________________________________________________________
LEITURA
CRS600E
GDA-COD600E
COD600E
FIM "ARQUIVO
LER
CRS600E PARAR
CRS600E
SEM TRAILER"
CNT-REG600E
CNT-REG600E + 1
N "ARQUIVO
GDA-COD600E CRS600E
PARAR
< FORA DE
COD600E SEQÜENCIA
SAÍDA
45
Introdução à Lógica de Programação
___________________________________________________________
LEITURA
CRS501E
GDA-CONTR501E
CONTR501E
FIM "ARQUIVO
LER
CRS501E PARAR
CRS501E
SEM TRAILER"
CNT-REG501E
CNT-REG501E + 1
N "ARQUIVO
GDA-CONTR501E CRS501E
PARAR
< FORA DE
CONTR501E SEQÜENCIA
SAÍDA
46
Introdução à Lógica de Programação
___________________________________________________________
ATUALIZ
A
CRS600S
CONTR600
S N
E
<
CONTR501
E
S CONTR600 N
E
=
CONTR501
E
S CMD501E N S N
= CMD501E
2 =
1
S N
CMD501E
=
PROCESS 3
GRAVA A
ALTERAÇÃ
EXIST O
DETOCR
"EXCLUSÃ
DETOCR O
PROCESSADA DETOCR DETOCR
"
LEITURA GRAVA
CRS600E "ALTERAÇÃ "INCLUSÃ MOV "ALT/
O
PROCESSADA O
INVÁLIDA EXCL
INVÁLIDA
" " "
IMPRRIM
E
CRS701S
DETOCR
IMPRRIM IMPRRIM
E E
CRS701S CRS701S "INCLUSÃ
O
PROCESSADA
LEITURA "
CRS600E
LEITURA
CRS600E
IMPRRIM
E
CRS701S
LEITURA
CRS501E
LEITURA
CRS501E
SAÍDA
47
Introdução à Lógica de Programação
___________________________________________________________
GRAVA GRAVA
CABEC
MOV EXIST
NOME600S CAB2FOLHA
GRAVAR
NOME501E REG600S CNT-FOLHA
TEL600S
GRAVAR
TEL501E CNT-REG600S LINCAB1
CNT-REG600S + 1
GRAVAR
REG600S SAÍDA
GRAVAR
LINCAB2
CNT-REG600S
CNT-REG600S + 1
GRAVAR
LINCAB3
SAÍDA
GRAVAR
LINCAB4
GRAVAR
LINCAB1
CNT-LIN
SAÍDA
48
Introdução à Lógica de Programação
___________________________________________________________
PROCESSA
ALTERAÇÃO
REG600S
REG600E
S
NOME501E =b's "ALTERAÇÃO
PARAR
e INVÁLIDA"
TEL501E = 0
S NOME501E N
=
b's
NOME600S
NOME501E
S TEL501E N
=
0
TEL600S
TEL501E
GRAVAR
REG600S
CNT-REG600S
CNT-REG600S + 1
SAÍDA
49
Introdução à Lógica de Programação
___________________________________________________________
IMPRIME
CRS701S
DETCOD
COD501E
DETCMD
CMD501E
DETNOME
NOME501E
DETTEL
TEL501E
N CNT-LIN S
>
54
CABEC
GRAVAR
LINDET
CNT-LIN
CNT-LIN + 1
SAÍDA
50
Introdução à Lógica de Programação
___________________________________________________________
TRATA
TRAILERS
N "QTD.REGS
TLR-QTREG600E
CRS600E NÃO PARAR
=
CONFERE"
CNT-REG600E
N
"QTD.REGS
TLR-QTREG501E
CRS501E NÃO PARAR
=
CONFERE"
CNT-REG501E
CNT-REG600S
CNT-REG600S + 1
TRL600S
TRL600E
TLR-QTREG600S
CNT-REG600S
GRAVAR
TLR600S
SAÍDA
51