Variáveis compostas heterogêneas
Os dados combinados em um determinado registro levam o nome de variáveis heterogêneas (dados derivados) por se tratar de uma coleção de dados de diferentes tipos primitivos (real, inteiro, caractere, cadeia e lógico), reunidos em uma mesma estrutura.
Exemplo 01:
Pretende-se combinar os elementos (dados) encontrados em um cadastro de clientes, que correspondem a:
NOME: deve conter dados do tipo cadeia
ENDEREÇO: deve conter dados do tipo cadeia
CÓDIGO POSTAL: deve conter dados do tipo cadeia
CLIENTE PESSOA FISICA OU JURÍDICA: deve conter dados do tipo caractere COMPRAS DO 1° MÊS: deve conter dados do tipo real COMPRAS DO 2° MÊS: deve conter dados do tipo real COMPRAS DO 3° MÊS: deve conter dados do tipo real
Note que existem três grandes tipos de dados relacionados a um mesmo cliente: (cadeia, caractere, e real), a combinação dos diferentes tipos de dados em um único registro corresponde a um conjunto de dados heterogêneo.
Atribuição de registro (variável heterogênea)
Sua atribuição deve ser feita antes da atribuição das variáveis a serem manipuladas pelo sistema, usando a sintaxe:
Exemplo 02:
tipo
<CAD_CLIENTES> = registro NOME: cadeia ENDEREÇO: cadeia CÓDIGO POSTAL: cadeia FISICO/JURÍCIO: caractere COMP01: real
COMP02: real COMP03: real fim_regitro var
CREDITO: cad_clientes tipo
<identificador> = registro
<lista dos campos e seus tipos>
fim_registro var
<variáveis> : <identificador>
Leitura e escrita de um registro
Tanto a leitura quanto a escrita de um registro podem ser realizadas de duas maneiras a 1ª. campo a campo, sendo indicado o nome da variável do tipo de registro e seu campo separados por um caractere “.” ponto. A 2ª indicando apenas o nome do registro antecedido pelos comandos “leia” ou “escreva”, neste caso todos os campos serão manipulados pelo comando.
Exemplo 03
programa CREDITO_DE_ CLIENTES tipo
<CAD_CLIENTES> = registro NOME: cadeia ENDEREÇO: cadeia CÓDIGO POSTAL: cadeia FISICO/JURÍCIO: caractere COMP01: real
COMP02: real COMP03: real fim_registro var
CREDITO: cad_clientes início
leia CREDITO. NOME leia CREDITO.ENDEREÇO leia CREDITO.CÓDIGO_POSTAL leia CREDITO.FISICO/JURÍCIO leia CREDITO.COMP01
leia CREDITO. COMP02 leia CREDITO. COMP03 escreva CREDITO. NOME escreva CREDITO.ENDEREÇO escreva CREDITO.CÓDIGO_POSTAL escreva CREDITO.FISICO/JURÍCIO escreva CREDITO.COMP01
escreva CREDITO.COMP02 escreva CREDITO.COMP03 fim
Exemplo 04
início
leia CREDITO escreva CREDITO fim
Observe que com este procedimento algum campo que
não seja necessário pode ser suprimido ou utilizado em outro momento, assim a referência de
cada um dos campos individualmente possibilita maior
liberdade ao desenvolvedor da solução tecnológica.
Trecho de código do registro todo não discriminando os dados.
Adote a entrada de dados como sendo a mesma do exemplo anterior.
Estrutura de registro matriz
Uma maneira conveniente é combinar os elementos de registro com matrizes do tipo vetor, reduzindo drasticamente o trabalho de elaboração do código.
Exemplo
Em um registro bancário, contendo os dados abaixo.
Codificação
tipo
CAD_CLIENTE = registro
NOME, ENDEREÇO, CPF : cadeia CLIENTE_ESPECIAL : lógico
MOV_FINANC : conjunto [1..6] de real fim_registro
var
CLIENTE : cad_cliente I : inteiro
início
leia CLIENTE.NOME leia CLIENTE.ENDEREÇO leia CLIENTE.CPF
para I de 1 até 6 passo 1 faça leia CLIENTE.MOV_FINANC[I]
fim_para
{bloco de execuções}
escreva CLIENTE.NOME escreva CLIENTE.ENDEREÇO escreva CLIENTE.CPF
para I de 1 até 6 passo 1 faça
escreva CLIENTE.MOV_FINANC[I]
fim_para fim
NOME:
CLIENTE ESPECIAL: SIM NÃO
ENDEREÇO:
CPF:
NOVIMENTAÇÃO FINANCEIRA
JAN FEV MAR ABR MAI JUN
TIPOS DE DADOS cadeia
lógico cadeia cadeia real
Exemplo:
Desenvolver um programa que leia uma tabela de cargos e salários. Em seguida, o programa deve solicitar que seja fornecido o código de um determinado cargo. Esse código deve estar entre 1 e 17. O operador do programa pode fazer quantas consultas desejar. Sendo o código válido, o programa deve apresentar o cargo e o salário associado ao cargo selecionado. Caso seja inválido, deve avisar o operador dessa ocorrência. Para inserir dados no sistema dos códigos de cargo/salários, observe a tabela seguinte:
TABELA DE CARGOS E SALÁRIOS
Cód. Cargo Salário h.
01 Anal. de cargos e salários 9,00 02 Auxiliar contábil 6,25 03 Chefe de cobrança 8,04 04 Chefe de expedição 8,58
05 Contador 15,60
06 Gerente regional 22,90
07 Escriturário 5,00
08 Faxineiro 3,20
09 Gerente administrativo 10,30 10 Gerente comercial 10,40 11 Gerente de pessoal 10,29 12 Gerente de treinamento 10,68 13 Gerente financeiro 10,54
14 Contínuo 2,46
15 Operador de computador 6,05
16 Programador 9,10
17 Secretária 7,31
(fonte: Manzano, Algoritmos, pag 205 – 23 ed.)
programa TABELA_DE_SALÁRIOS tipo
REG_DADOS = registro
CÓDIGO : inteiro CARGO : cadeia SALÁRIO : real fim_registro
var
TABELA: conjunto [1..17] de reg_dados I, CODPESQ : inteiro
RESP: caractere ACHA: lógico início
para I de 1 até 17 passo 1 faça TABELA [I].CÓDIGO ← I
escreva “Código ...:”, TABELA[I].CÓDIGO escreva “Cargo ...:”, leia TABELA[I].CARGO escreva “Salário...:”, leia TABELA[I].SALÁRIO fim_para
RESP← “SIM”
enquanto (RESP = “SIM”) faça escreva “Qual código – 1 a 17”
leia CODPESQ I ← 1
ACHA ←.Falso.
enquanto (I =< 17) .e. (ACHA = .Falso.) faça se (CODPESQ = TABELA[I].CÓDIGO) então
ACHA ← .Verdadeiro.
senão I ← I + 1 fim_se fim_enquanto
se (ACHA = .Verdadeiro.) então
escreva “Código:...”, TABELA[I].CÓDIGO escreva “Cargo: ...”, TABELA[I].CARGO escreva “Salário: ...”, TABELA[I].SALÁRIO senão
escreva “Cargo Inexistente”
fim_se
escreva “Deseja continuar pesquisa? – Responda [S]im ou [N]ão:”
leia RESP fim_enquanto fim
Procedimentos
Um módulo de procedimentos ou sub-rotina corresponde a um bloco de programa que se referencia por um rótulo permitindo que um programa principal chame suas funções nos processos a serem realizados, permitindo ao idealizador de solução tecnológica modulada em rotinas e sub-rotinas. Sua diagramação em português estruturado e seu diagrama de blocos obedecem às seguintes sintaxes.
Obs: O código da sub-rotina deve ser escrito antes de sua chamada no trecho de chamada da sub-rotina, assim, a chamada da sub-rotina deve ser representada em português estruturado de forma sublinhada, estando esta forma associado à ação indicada do símbolo processo predefinido.
Funções
Uma função corresponde a um bloco de programa semelhante o procedimento (sub- rotina), contendo inicio, fim e identificada por um rótulo que permite o programa principal chamar suas execuções. A diferença entre procedimento e função é que a função corresponde a uma estrutura de abstração que sua principal característica operacional na capacidade de sempre retornar um conteúdo de resposta, ou seja, a função retorna um “valor” que retorna no próprio rótulo da função podendo ocorrer em operações de processamento (lógico ou matemático) e de saída, enquanto os procedimentos não retornam conteúdos, a não ser com o uso de procedimentos de passagem de parâmetro por valor ou por referência.
CODIFICAÇÃO
programa <rótulo do programa>
procedimento <sub-rotina>
var
<variáveis>
início
<instruções>
fim início
<sub_rotina>
fim
CÓDIGO programa CALC_FAT_V3
função FATORIAL (N : inteiro) : inteiro var
I, FAT : inteiro início
FAT ← 1
para I de 1 até N passo 1 faça FAT ← FAT * I
fim_para
FATORIAL ← FAT fim
var
LIMITE : inteiro início
escreva “Qual fatorial:”
leia LIMITE
escreva FATORIAL(LIMITE) fim
Obs.: Por se tratar de uma estrutura que retorna um valor é fundamental que seja indicado o tipo de dado da função.
Passagens de parâmetros
O processo de passagem de parâmetros permite estabelecer uma linha de comunicação entre os conteúdos dos trechos de sub-rotinas (parâmetros/funções), e dos trechos de programa que chamam essas sub-rotinas. Tal comunicação que ocorre entre o trecho de programa chamador e o trecho de programa chamado, podendo o parâmetro ser considerado real (quando declarado no trecho do programa que chama a sub-rotina) ou formal (quando é declarado no trecho da sub-rotina). Tais processos de passagem de parâmetros chamam-se:
• Passagem de parâmetro real ← quando o trecho de programa chama uma sub-rotina, ao fazer a operação de passagem, realiza uma abstração.
• Passagem de parâmetro formal ← quando a sub-rotina chamada recebe a passagem de parâmetro, este formaliza a operação de abstração a ela transferida.
Passagem de parâmetro por valor
Dizemos que ocorreu uma passagem de parâmetro por valor quando o parâmetro formal da sub-rotina recebe o parâmetro real do trecho de programa chamador um determinado conteúdo, assumindo o papel de variável local da sub-rotina. Assim qualquer modificação no conteúdo do parâmetro formal não altera o valor do conteúdo do parâmetro real, ou seja, o processamento é realizado e armazenado na própria sub-rotina.
Passagem de parâmetro por referência
Dizemos que ocorreu uma passagem de parâmetro por referência quando o parâmetro real do programa chamador recebe o conteúdo do parâmetro formal da sub-rotina, portanto dado certo processamento dentro da sub-rotina, o parâmetro formal reflete a alteração de seu conteúdo no parâmetro real. Assim qualquer modificação no conteúdo do parâmetro formal implicará em alteração imediata do conteúdo do parâmetro real correspondente.
CODIFICAÇÃO
programa CALC_FAT_V1
procedimento FATORIAL (N : inteiro) var
I, FAT: inteiro início
FAT ← 1
para I de 1 até N passo 1 faça FAT ← FAT * I
fim_para escreva FAT fim
var
LIMITE : inteiro início
escreva “Qual fatorial:” leia LIMITE FATORIAL (LIMITE)
fim
CODIFICAÇÃO
programa CALC_FAT_V2
procedimento FATORIAL (N : inteiro; var FAT: inteiro) var
I: inteiro início
para I de 1 até N passo 1 faça FAT ← FAT * I
fim_para fim
var
LIMITE, RESP : inteiro início
RESP←1
escreva “Qual fatorial:”
leia LIMITE
FATORIAL (LIMITE, RESP) escreva RESP
fim