Você está na página 1de 51

Introdução à Lógica de Programação

___________________________________________________________
ÍNDICE ANALÍTICO

1. INTRODUÇÃO À LÓGICA DE PROGRAMAÇÃO ............................................................................................... 2


LÓGICA .......................................................................................................................................................................... 2
SEQÜÊNCIA LÓGICA ...................................................................................................................................................... 2
INSTRUÇÕES ................................................................................................................................................................... 2
ALGORITMO ................................................................................................................................................................... 3
PROGRAMAS................................................................................................................................................................... 3
2. DESENVOLVIMENTO DE ALGORITMOS ........................................................................................................... 3
FASES ............................................................................................................................................................................. 3
EXEMPLO DE ALGORITMO ............................................................................................................................................ 4
DECOMPOSIÇÃO............................................................................................................................................................. 4
ESTRUTURAS DE CONTROLE .......................................................................................................................................... 5
SÍMBOLOS GEOMÉTRICOS............................................................................................................................................. 6
CONSTRUÇÃO DE DIAGRAMAS ....................................................................................................................................... 8
3. VARIÁVEIS E CONSTANTES ................................................................................................................................ 10
CONCEITOS .................................................................................................................................................................. 10
4. OPERADORES .......................................................................................................................................................... 12
OPERADORES ARITMÉTICOS ....................................................................................................................................... 12
OPERADORES RELACIONAIS ....................................................................................................................................... 12
SÍMBOLO UTILIZADO PARA COMPARAÇÃO ENTRE EXPRESSÕES: ............................................................................... 13
OPERADORES LÓGICOS ............................................................................................................................................... 13
5. COMANDOS DE ENTRADA E SAÍDA .................................................................................................................. 15
ARQUIVOS DE DADOS ................................................................................................................................................... 15
CONCEITOS BÁSICOS ................................................................................................................................................... 15
ABERTURA DE ARQUIVOS ............................................................................................................................................ 15
FECHAMENTO DE ARQUIVOS ....................................................................................................................................... 16
LEITURA DE ARQUIVOS ................................................................................................................................................ 16
MOVIMENTAÇÃO DE REGISTROS ................................................................................................................................. 18
GRAVAÇÃO DE ARQUIVOS ........................................................................................................................................... 18
6. ESTRUTURAÇÃO DE PROGRAMAS ................................................................................................................... 18
PROGRAMAÇÃO ESTRUTURADA - DESENVOLVIMENTO TOP-DOWN .......................................................................... 18
7. TABELA ..................................................................................................................................................................... 26
CARREGAMENTO DE UMA TABELA .............................................................................................................................. 28
PESQUISA EM TABELA .................................................................................................................................................. 30
8. ROTINA DE QUEBRA ............................................................................................................................................. 35
CONCEITO DE NÍVEL .................................................................................................................................................... 35
APLICAÇÃO DE ROTINA DE QUEBRA ............................................................................................................................ 35
9. BALANCED-LINE .................................................................................................................................................... 41

1
Introdução à Lógica de Programação
___________________________________________________________

1. INTRODUÇÃO À LÓGICA DE PROGRAMAÇÃO

O objetivo deste curso é habilitar profissionais e futuros profissionais na área de processamento


de dados, a desenvolver algoritmos para a solução de problemas de programação comercial, em
mainframes, com ênfase em arquivos seqüenciais.

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

A lógica de programação é necessária para pessoas que desejam trabalhar com


desenvolvimento de sistemas e programas, ela permite definir a seqüência lógica para o
desenvolvimento.

Então o que é lógica?

Lógica de programação é a técnica de encadear pensamentos para atingir determinado


objetivo.

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.

Seqüência Lógica são passos executados até atingir um objetivo ou solução de um


problema.

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".

Em informática, porém instrução é a informação que indica a um computador uma ação


elementar a executar.

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.

Instruções são um conjunto de regras ou normas definidas para a realização ou emprego


de algo. Em informática, é o que indica a um computador uma ação elementar a executar.

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:

"Chupar uma bala".


• Pegar a bala
• Retirar o papel
• Chupar a bala
• Jogar o papel no lixo

"Somar dois números quaisquer”.


• Escreva o primeiro número no retângulo A
• Escreva o segundo número no retângulo B
• Some o número do retângulo A com o número do retângulo B e coloque o resultado no
retângulo C

Retângulo A Retângulo B Resultado

+ =

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:

COMO FAZER ARROZ DOCE

ou então

CALCULAR O SALDO FINANCEIRO DE UM ESTOQUE

3
Introdução à Lógica de Programação
___________________________________________________________
Entretanto ao montar um algoritmo, precisamos primeiro dividir o problema apresentado em três
fases fundamentais.

Entrada  Processamento  Saída

Onde temos:

ENTRADA: São os dados de entrada do algoritmo


PROCESSAMENTO: São os procedimentos utilizados para chegar ao resultado final
SAÍDA: São os dados já processados

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

Para montar o algoritmo proposto, faremos três perguntas:

a) Quais são os dados de entrada?


Resposta: Os dados de entrada são P1, P2, P3 e P4

b) Qual será o processamento a ser utilizado?


Resposta: O processamento será somar todos os dados de entrada e dividi-los por 4 (quatro)
P1 + P2 + P3 + P4
4

c ) Quais serão os dados de saída?


Resposta: O dado de saída será a média final

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

Vejamos agora, como exemplo, um algoritmo da troca de uma lâmpada:


Remova a lâmpada queimada
Coloque a nova lâmpada

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

Por sua vez, o passo subseqüente decompõe-se em três outros passos:


Posicione a nova lâmpada no soquete
Gire-a no sentido horário até que se firme
Desça da escada

Estruturas de controle

Vamos reescrever de forma simplificada nosso algoritmo semi-detalhado da troca de uma


lâmpada, como a seguir:
Pegue uma nova lâmpada de 60 Watts
Desligue o interruptor
Posicione a escada
Suba na escada
Retire a lâmpada queimada
Coloque a lâmpada nova
Desça da escada

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.

Regras para construção do algoritmo

Para escrever um algoritmo precisamos descrever a seqüência de instruções, de maneira


simples e objetiva. Para isso utilizaremos algumas técnicas:
• Usar somente um verbo por frase;
• Imaginar que você está desenvolvendo um algoritmo para pessoas que não trabalham com
informática;
• Usar frases curtas e simples;
• Ser objetivo;
• Procurar usar palavras que não tenham sentido dúbio.

Símbolos Geométricos

A descrição literal de um algoritmo é, normalmente, uma operação bastante trabalhosa. Em


função das próprias características de nossa língua, a redação das frase que traduzem ações
seqüenciais é quase sempre, longa e pouco precisa. Isso dificulta a compreensão e gera inúmeras
dúvidas.

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

Um diagrama é preparado para mostrar a relação lógica entre as fases sucessivas de um


programa ou até mesmo um sistemas ou parte dele (embora existam outros métodos para sistemas).

As fases representadas em um diagrama podem variar em nível de detalhe: da linha geral


(mostrando a correspondência unívoca com cada construção particular de um programa), às seções de
programa que exigem um grande número de instruções.

A partir da simbologia apresentada, podemos começar a confeccionar um diagrama de blocos.


Convencionaremos que o sentido do fluxo de execução deve ser de cima para baixo e da esquerda para
a direita. As setas deverão ser utilizadas sempre que o fluxo não obedecer ao sentido convencional.

A partir de agora, representaremos a forma descritiva do algoritmo através do diagrama de


blocos. A seguir, o exemplo da troca da lâmpada:

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.

Os diagramas formam parte essencial da documentação de um programa.

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

O objetivo principal de qualquer computador é a manipulação de informações ou dados. Estes


dados podem ser valores de vendas semanais de uma loja, nomes e endereços de uma lista telefônica,
notas finais de um aluno e assim por diante.

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.

Para exemplificarmos variáveis e constantes, utilizaremos o diagrama da troca de uma lâmpada,


já visto no capítulo anterior.

Para facilitar o entendimento, consideraremos que:


- a potência da lâmpada a ser trocada seja de 60 Watts;
- a altura de cada degrau da escada seja igual a 20 cm;
- a altura para alcançar a lâmpada seja de 300cm;
- a lâmpada estará livre do soquete após girá-la 5 vezes no sentido anti-horário;
- a lâmpada estará fixa no soquete após girá-la 5 vezes no sentido horário.

Assim, no exemplo, os termos POTÊNCIA, ALTURA, VOLTAS-ANTIHORA e VOLTAS-HORA


são variáveis que assumem diferentes valores durante o processamento, enquanto 60, 300, 20, e 5 são
as constantes nele utilizadas.

A instrução "ALTURA  ALTURA + 20" significa atribuir o valor do resultado da adição da


constante 20 com o conteúdo da variável ALTURA. Ao se atribuir novo valor à variável, substitui-se o
valor anterior, o qual não poderá mais ser recuperado.

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

Variáveis e constantes, operandos do tipo numérico, poderão ser utilizados na elaboração de


cálculos matemáticos, ou seja, na elaboração de expressões aritméticas; para que isso ocorra, é
necessária a utilização de operadores aritméticos.

Os operadores a seguir são utilizados em algoritmos e podem ser diferentes entre algumas
linguagens de programação.

Operador Operação Prioridade Matemática


√ Radiciação 1
** Exponenciação 1
/ Divisão 2
* Multiplicação 2
+ Adição 3
- Subtração 3

As expressões aritméticas ou fórmulas matemáticas são definidas pelo relacionamento existente


entre variáveis e constantes numéricas, por intermédio da utilização dos operadores matemáticos.

Operadores Relacionais

Os operadores relacionais são utilizados para comparar String de caracteres e números. Os


valores a serem comparados podem ser caracteres ou variáveis.

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

codigo = SIM codigo > SIM nome = SIM


codant 1000 'JOSE'

NÃO NÃO NÃO

Operadores Lógicos

Os operadores lógicos servem para combinar resultados de expressões, retornando se o


resultado final é verdadeiro ou falso.

Os operadores lógicos são:

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).

1º Valor Operador 2º Valor Resultado Onde:


T AND T T T = True (verdadeiro)
T AND F F F = False (falso)
F AND T F
F AND F F
T OR T T
T OR F T
F OR T T
F OR F F
T NOT F
F NOT T

Exemplos:

Suponha que temos três variáveis A = 5, B = 8 e C = 1. Os resultados das expressões seriam:

A=B AND B>C - Falso


A <> B OR B<C - Verdadeiro
A>B NOT - Verdadeiro

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

Os dados manipulados até o momento, estavam em memória, ou seja, após a execução do


diagrama os dados se perdiam. Para resolver esse problema começaremos a trabalhar com arquivos,
onde poderemos guardar os dados e também manipula-los. Para isso necessitamos conhecer alguns
conceitos como: campos, registros e arquivos.

Conceitos básicos

CAMPO é um espaço reservado em memória para receber informações (dados).

Exemplo: Campo Nome, Campo Endereço

Campo na memória?

NOME

MARIA DAS GRAÇAS

REGISTRO é um conjunto de campos

Exemplo: Registro de Clientes

COD-CLI NOME ENDEREÇO FONE


10001 MARIA DAS GRAÇAS RUA DAS DORES, 1400 8883-9876

ARQUIVO é um conjunto de registros

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 um arquivo significa liberar o periférico que estava sendo utilizado.


O símbolo para fechamento de arquivo é:

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

COD-CLI NOME ENDEREÇO FONE


REGISTRO 1
10001 JOSE DA SILVA RUA DAS CAMELIAS 788-3000

10002 MARIA DAS GRAÇAS RUA DAS DORES 788-2001 REGISTRO 2


10003 ANTONIO RUA DAS HORTENCIAS 788-2002

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.).

O símbolo para gravação de arquivos é:

GRAVAR
REGISTRO

6. ESTRUTURAÇÃO DE PROGRAMAS

Programação Estruturada - Desenvolvimento top-down

A programação estruturada é uma técnica que auxilia o programador a construir programas


mais confiáveis, mais legíveis, de uma maneira organizada e racional.
Esta técnica ajuda o programador a "pensar" por partes, ou seja, resolver pausadamente um
dado problema. Procedendo-se dessa forma o processo de desenvolvimento e manutenção de
programas torna-se mais fácil.

Antes de poder escrever um programa, é necessário um processo de raciocínio, que leva de


uma análise do problema dado, passando para um algoritmo em termos gerais, até um algoritmo
detalhado (processo de refinamentos sucessivos), que consiste em uma seqüência de passos simples
que podem ser diretamente expressados em termos de comandos numa linguagem de programação
qualquer.

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.

Em síntese, a programação estruturada consiste na decomposição do programa em módulos


independentes e na utilização adequada dos procedimentos de seqüência, seleção e repetição.

Tomemos como exemplo a emissão de um relatório CRS701contendo o nome e a média de


cada candidato aprovado em uma seleção, bem como a média geral do concurso. No arquivo de
entrada CRS501, cada registro é composto pelo nome do candidato e pelas notas obtidas em quatro
provas, conforme ilustrado a seguir:

NOME NOTA1 NOTA2 NOTA3 NOTA4

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.

Em nosso exemplo, a condição de interrupção das repetições será o fim do arquivo.


Utilizaremos como recurso uma variável (IND-FIM) para indicar o fim de arquivo. Iniciaremos tal variável
com zero e, ao encontrarmos o fim do arquivo, atribuiremos "1" à mesma. Assim, o fluxograma anterior
pode ser redesenhado como a seguir:

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.

É oportuno esclarecer que, durante a execução de um programa, quando o processamento


encontra uma chamada de rotina (abstração que se faz a um conjunto de instruções, em vez de
codificarmos as instruções que constituem a rotina, referenciamo-la através de seu nome) o fluxo de

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.

As rotinas de LEITURA e IMPRESSÃO são bastante simples por se tratar de um exemplo


didático. Em um processamento real estas rotinas poderiam necessitar de vários outros procedimentos.

LEITURA IMPRESSÃO
ABC501E ABC701S

FIM IND-FIM NOME701S


LER
ABC501E
1 NOME501E

MÉDIA701S

MÉDIA

SAÍDA

IMPRIME
REG701S

SAÍDA

25
Introdução à Lógica de Programação
___________________________________________________________
7. TABELA

A definição de tabela encontrada em dicionários de informática, diz: "Tabela é um conjunto de


dados em que cada item ou unidade é identificado, de maneira exclusiva e característica, por um
símbolo ou etiqueta, por sua posição em relação a outros itens, ou por outro meio".

AGÊNCIAS

PREFIXO NOME ESTADO


0472-3 Angra dos Reis RJ
0945-8 Manga MG
2314-0 Zé Doca MA
3703-6 Baião PA

Na tabela de agências de um banco, ilustrada acima, para fins de programação, chamaremos as


colunas de campos e as linhas de ocorrências. Os campos determinam quais informações serão
armazenadas. As ocorrências representam conjuntos de valores assumidos pelos campos.

Campo 1 Campo 2 Campo 3

AGÊNCIAS

PREFIXO NOME ESTADO


Ocorrência 1 0472-3 Angra dos Reis RJ
Ocorrência 2 0945-8 Manga MG
Ocorrência 3 2314-0 Zé Doca MA
Ocorrência 4 3703-6 Baião PA

A tabela em questão pode ser representada através de diferentes estruturas de dados. A


escolha de uma delas dependerá dos recursos da linguagem utilizada, de legibilidade desejável, da
forma de preenchimento, da velocidade de acesso, entre outros fatores julgados relevantes.
Consideremos as três soluções a seguir:

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]

Para fazermos referência a um valor, utilizaremos um ponto separando o nome da estrutura do


nome do membro. Assim, o valor armazenado na terceira posição do arranjo "Prefixo" será referenciado

nome da estrutura nome do membro

Agência.Prefixo [3]
como:

A solução proposta melhora a legibilidade do programa quando comparada com a anterior. No


entanto, ainda assim não é possível acessar uma ocorrência inteira da tabela.

3) Um Arranjo de Estruturas - As estruturas anteriores só nos permitem acessar


separadamente valores de campos. Ou acessamos prefixos ou nomes ou estados. Mas, como faríamos
para acessar uma ocorrência inteira da tabela? O arranjo de estrutura a seguir resolve o problema.

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].

Para acessarmos os valores dos campos, separadamente, podemos fazer:


Agência[1].Prefixo, para acessarmos o prefixo 0472-3;
Agência[1].Nome, para acessarmos o nome Angra dos Reis;
Agência[1].Estado, para acessarmos o estado RJ.

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

Como a impressora não possui dispositivo de retorno de folhas já impressas, resolveremos o


problema implementando uma tabela de linhas e colunas. O acesso a uma coluna é feito por dois
subscritores, enquanto que para uma linha necessitamos apenas de um. Utilizando nossa sintaxe,
declaramos a tabela como:

Página [1:n, 1:2]

Acessamos a terceira linhada primeira coluna fazendo:

Página [ 3 , 1]

subscritor de linha
subscritor de coluna

Carregamento de uma tabela

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.

Podemos também, a partir da leitura de um arquivo (por exemplo ABC502), em tempo de


execução, montar a seguinte tabela:

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

Vimos anteriormente que diferentes estruturas de dados podem ser empregadas na


implementação de tabelas. Vimos também que, conhecendo a localização de um valor, podemos
acessá-lo diretamente através de um subscritor ou percorrendo a cadeia de valores; conforme o tipo de
estrutura utilizado.

Consideremos a tabela montada no item 7.2, ilustrada a seguir:

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

Pesquisando a tabela por número de prefixo através do fluxograma da figura anterior,


encontramos a agência procurada na oitava ocorrência. Tivemos, pois, que consultar 8 ocorrências.
Para tabelas de poucas ocorrências, como a do exemplo, o tempo de pesquisa é desprezível. No
entanto, imaginemos se tivéssemos uma tabela com 3500 agências. Neste caso, o tempo de pesquisa
pode ser crítico. Para contornar tal problema, poderíamos rearranjar as ocorrências de nossa tabela em
ordem crescente de número de prefixo e utilizar um algoritmo mais eficiente.

31
Introdução à Lógica de Programação
___________________________________________________________

Pesquisa Seqüencial PREFIXO Pesquisa Binária

NÚMERO DV NOME

CONSULTA 1 0085 X SOBRAL


CONSULTA 2 0270 4 UBÁ
CONSULTA 3 0894 X ARCOS
CONSULTA 4 0993 8 TURVO
CONSULTA 5 1281 5 CANAPI CONSULTA 1
CONSULTA 6 2022 2 CUNHA CONSULTA 3
CONSULTA 7 2466 X POÁ CONSULTA 4
3408 8 UCHÔA CONSULTA 2
3712 5 CARMO
3742 7 MATA

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:

1) Verificar se o valor procurado antecede a primeira ocorrência. Se anteceder, sabemos que


não se encontra na tabela;

2) Verificar se o valor procurado sucede a última ocorrência. Se suceder, sabemos que não se
encontra na tabela;

3) Calcular o ponto médio do intervalo considerado aplicando a fórmula:


PM = (LI + LS) / 2
Onde,
PM : localização do ponto médio do intervalo;
LI : limite inferior (inicialmente corresponde a posição da primeira ocorrência);
LS : limite superior (inicialmente corresponde a posição da última ocorrência).

4) Se o valor procurado estiver no ponto médio do intervalo, então localizamos a agência


pretendida. Caso Contrário:
- se o valor procurado for maior que o valor do ponto médio, então:
- LI = PM + 1;
- se o valor procurado for menor que o valor do ponto médio, então:
- LS = PM - 1;

5) Se LI > LS, o valor procurado não se encontra na tabela, senão repetir os passos 3, 4 e 5.

Utilizando-se a pesquisa seqüencial na tabela ordenada, localizaremos a agência Poá após


consultarmos 7 ocorrências. No entanto, utilizando a pesquisa binária, precisaremos apenas de 4
consultas.

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

Antes de apresentarmos o que é uma rotina de quebra é necessário aprendermos o significado


de nível, em programação.

Nível é o grau de subordinação em uma hierarquia. Para esclarecermos o conceito, tomemos o


exemplo de uma conta de um Planto Geral de Contas:

31995.00-00-7 Depósitos a prazo, com certificado


01-00-3 Com rendimento prefixado
01-1 Mensal
03-8 Trimestral
05-4 Semestral
09-7 No final do prazo
02-00-X Com correção monetária pós-fixada
61-1 Judiciais
63-8 Voluntários

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)

TÍTULO 31995 NÍVEL 3

SUBTÍTULO 01 02 NÍVEL 2

DESDOBRAMENTO 01 03 05 09 61 63 NÍVEL 1

Aplicação de rotina de quebra

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.

BANCO ALFA S/A CRS700


AGÊNCIA: 9999-X
------------------------------------------------------------------------------------------------------------------------------
QUANTIDADE DE CLIENTES: 99.999
SALDO EM DEPÓSITOS: ZZ.ZZZ.999,99

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

Vejamos, agora, como seria o diagrama de blocos para o problema apresentado:

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

CRS500- NAO CRS500


PREFAG SEM PARAR
=0 HEADER

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

Um problema muito comum em sistemas de processamento de dados é a atualização de um


arquivo de organização e acesso seqüencial a partir de outro de mesma característica. Uma das
técnicas que pode ser utilizada para este fim é o balanced-line.

A técnica de atualização de arquivos por balanced-line requer, no mínimo, 3 arquivos, sendo


que cada um deles tem denominação específica, conforme a seguir.

EXISTÊNCIA (CADASTRO) - contém os dados que serão atualizados;

MOVIMENTO - contém os dados de atualização. Tais dados podem determinar a alteração ou


exclusão de registros da existência, bem como a inclusão de novos registros;

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

Na ilustração, está representada a emissão de um relatório que deverá conter as ocorrências da


atualização como, por exemplo, as inclusões, exclusões, alterações e comandos inválidos, entre outras.

É importante observar que, em um próximo processamento, a EXISTÊNCIA ATUALIZADA


tornar-se-á a EXISTÊNCIA, ou seja, o arquivo cujos dados deverão ser atualizados.

As operações de atualização da EXISTÊNCIA são as seguintes:


1) Inclusão - inserção de um novo registro;
2) Alteração - substituição do conteúdo de alguns campos de um registro;
3) Exclusão - eliminação de um registro.

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.

Para melhor entendimento, apresentaremos um problema que utiliza os conceitos vistos. A


finalidade do problema é atualizar o arquivo existência CRS600 a partir do arquivo movimento CRS501,
gerando os arquivos CRS600S (existência atualizada) e CRS701 (relatório de ocorrências da
atualização).

Layout dos registros do arquivo CRS600:

Header
0 CRS600 DATA
Detalhe
CÓDIGO CLIENTE NOME TELEFONE

Trailer
9's QTD.REGS

Layout dos registros do arquivo CRS501:

Header
0 CRS501 DATA
Detalhe
CÓDIGO CLIENTE COMANDO NOME TELEFONE

Trailer
9's QTD.REGS

Layout do relatório CRS701:

__________________________________________________________________________

BANCO ALFA S.A. FL.99


OCORRÊNCIAS DA ATUALIZAÇÃO 99/99/9999 CRS701
CÓDIGO CMDO NOMES TELEFONE OCORRÊNCIA
__________________________________________________________________________

9-----9 9 X-----------X 9------9 X---------X

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.

Vejamos, a seguir, uma solução para o problema apresentado:

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

COD600S REG600S CNT-FOLHA

COD501E REG600E CNT-FOLHA + 1

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

Você também pode gostar