A maior rede de estudos do Brasil

Grátis
146 pág.
Programando com PASCAL - Jaime Evaristo

Pré-visualização | Página 37 de 50

este algoritmo. 
{Funcao para determinacao do digito verificador de uma conta}
function DigitoVerificador( s : string) : integer;
type TVetor = array[1..20] of byte;
var i, Comp, Soma, Dv : integer;
Digitos : TVetor;
{Procedimento para armazenar os digitos da conta}
procedure ArmazenaDigitos(var s : string; var d : TVetor; t : integer);
var j, r : integer;
begin
for j := 1 to t do
Val(s[j], d[j], r);
end;
{Funcao DigitoVerificador}
begin
Comp := Length(s);
ArmazenaDigitos(s, Digitos, Comp);
Soma := 0;
for i := Comp downto 1 do
Soma := Soma + Digitos[i]*(Comp - i + 2);
Dv := 11 - Soma mod 11;
if (Dv = 10) or (Dv = 11)
then
Dv := 0;
DigitoVerificador := Dv;
end;
7.5 Exercícios propostos
1. Uma palavra é palíndromo se ela não se altera quando lida da direita para esquerda. Por exemplo, 
raiar é palíndromo. Escreva um programa que verifique se uma palavra dada é palíndromo.
2. Um dos recursos disponibilizados pelos editores de texto mais modernos é a determinação do número 
de palavras de um texto. Escreva um programa que determine o número de palavras de uma frase dada.
3. O exercício 16 da seção 6.9 solicitava um programa que convertesse um número dado no sistema 
decimal para o sistema binário. Pela limitação do sistema em tratar números inteiros, uma solução que 
tratasse a conversão como sendo do tipo longint seria limitada. Escreva uma função para a conversão citada, 
tratando o valor em binário como uma cadeia de caracteres.
4. Escreva um programa que converta um número do sistema binário, dado como uma cadeia de zeros e 
uns, para o sistema decimal de numeração.
5. Reescreva a função apresentada no exemplo 7 da seção 7.4 de tal modo que ele possa, além de gerar 
dígitos verificadores, verificar se uma conta dada (incluindo o dígito verificador) foi digitada incorretamente, 
incorreção detectada pelo tal dígito verificador.
6. Um algoritmo para a determinação de códigos de barra de produtos é o seguinte:
1. Determina-se a soma dos algarismos das posições ímpares, da esquerda para direita.
2. Calcula-se o triplo da soma dos algarismos das posícões pares, da esquerda para direita.
3. Determina-se a soma dos resultados obttdos em 1 e 2.
4. Determina-se o número que deve ser somado ao resultado obtido em 3 para se obter um múltiplo 
de dez.
Escreva uma função que implemente o algoritmo acima.
7. As companhias de transportes aéreos costumam representar os nomes dos passageiros no formato 
último sobrenome/nome. Por exemplo, o passageiro Carlos Drumond de Andrade seria indicado por 
Andrade/Carlos. Escreva um programa que receba um nome e o escreva no formato acima.
8. As normas para a exibição da bibliografia de um artigo científico, de uma monografia, de um livro 
texto etc., exigem que o nome do autor seja escrito no formato último sobrenome, seqüência das primeiras 
letras do nome e dos demais sobrenomes, seguidas de ponto final. Por exemplo, Antônio Carlos Jobim seria 
referido por Jobim, A. C.. Escreva um programa que receba um nome e o escreva no formato de bibliografia.
9. É comum que AVISOS, DECLARAÇÕES, CERTIDÕES, etc., tenham seus títulos escritos com as 
letras separadas por um espaço em branco. Escreva um procedimento que receba uma palavra e a retorne 
com suas letras separadas por um espaço em branco.
Observação
Para receber as respostas dos exercícios propostos, encaminhe mensagem para jaime@ccen.ufal.br, 
assunto RESPOSTAS EXERCÍCIOS PASCAL, contendo NOME, INSTITUIÇÃO (se for o caso), 
CIDADE/ESTADO e CATEGORIA (docente, estudante ou auto-didata).
Capítulo 8 Registros e Arquivos
8.1 Registros (Records)
Um vetor é capaz de armazenar diversos valores, com a restrição de que todos sejam de um mesmo tipo 
de dado. Um programa que gerencie os recursos humanos de uma empresa manipula dados relativos a cada 
um dos funcionários que são de tipos diferentes. Por exemplo, para cada funcionário deve-se ter sua 
matrícula, seu nome, seu endereço, o cargo que ele ocupa, o número de seus dependentes, o seu salário, a 
data de admissão etc. Observe que nome, matrícula, endereço, data de admissão e cargo que ele ocupa 
podem ser tratados como string. Porém, como, eventualmente, haverá necessidade de se efetuarem operações 
aritméticas com eles, o número de dependentes deve ser tratado como do tipo integer e valor do salário, do 
tipo real.
A utilização de uma variável simples para cada um destes elementos, implicaria, como são vários 
funcionários, a necessidade de vários vetores, o que poderia atrapalhar a legibilidade e a manutenabilidade 
do programa, alem de dificultar a possibilidade de armazenamento dos dados em disco, conforme veremos 
numa seção posterior.
Um registro é um conjunto de variáveis, denominadas campos, que podem ser de tipos diferentes. Isto é, 
um registro é um tipo estruturado heterogêneo. A cada campo de um registro são associados um 
identificador e um tipo de dado, o que é feito através da seguinte sintaxe:
type Identificador = record
Identificador do campo 1 : tipo de dado;
Identificador do campo 2 : tipo de dado;
. . .
Identificador do campo n : tipo de dado;
end;
onde tipo de dado pode ser qualquer tipo, simples ou estruturado (inclusive um outro registro).
No programa do comentário feito acima, deveria haver uma definição do seguinte tipo:
type TFuncionario = record
Matr : string[8];
Nome : string[30];
Ender : record
Rua : string[40];
Num : string[6]
Bairro : string[20]
CEP : string[8]
end;
Cargo : string[20];
NumDepend : integer;
Salario : real
DataAdm : string[8];
end;
O acesso a um campo de um registro é feito através dos identificadores do registro e do campo separados 
por um ponto. Desta forma, se no programa citado acima declarássemos uma variável Func do tipo 
TFuncionario, poderíamos ter as seguintes atribuições:
Func.Matr := '1119310'
Func.Nome := 'Vinicius de Moraes';
Func.Ender.Rua := 'Rua Garota de Ipanema';
Func.NumDepend := 8;
e comandos do tipo:
readln(Func.Matr);
while Func.Matr <> '0' do
begin
readln(Func.Nome);
readln(Func.Ender.Rua);
. . .
end;
O comando with permite que o identificador do registro seja omitido da referência a um dos seus 
campos, simplificando sobremaneira esta referência. Sua sintaxe é a seguinte :
with Identificador do registro do
sequencia de comandos
Nos comandos vinculados ao with, a referência a um campo do registro é feita apenas com a utilização 
do identificador daquele campo. Como ocorre em outras situações, se a lista de comandos possuir mais de 
um comando é necessário se utilizarem os delimitadores begin e end.
Os comandos de atribuição apresentados acima poderiam ter a seguinte forma:
with Func do
begin
Matr := '1119310'
Nome := 'Vinicius de Moraes';
Ender.Rua := 'Rua Garota de Ipanema';
NumDepend := 8;
end;
Para exemplificar registros, o programa abaixo recebe as matrículas, os nomes e as notas das avaliações 
bimestrais de uma relação de alunos e emite um relatório incluindo as matrículas, os nomes e as médias 
anuais, calculadas como médias aritméticas das avaliações bimestrais. Observe que um dos campos do 
registro é um vetor, o qual será utilizado para armazenar as notas das avaliações bimestrais de cada aluno. 
Observe também que toda relação é armazenada num vetor cujas componentes são registros.
program ProcessaNotas;
type TVetor1 = array[1..4] of real;
 TRegistro = record
Mat : string[9];
Nome : string[30];
Notas : TVetor1;
Media : real;
 end;
 TVetor2 = array[1..60] of TRegistro;
var Aluno : TRegistro;
 Mapa : TVetor2;
 i, j : integer;
 Soma : real;
begin
i := 1;
writeln('Digite a matrícula, o nome e as notas (0 (zero) para encerrar)');
readln(Mapa[i].Mat);
while Mapa[i].Mat <> '0'