Você está na página 1de 29

Algoritmos

Metodologia de desenvolvimento

Versão: Fevereiro de 2008


(Primeira Versão: Fevereiro de 2004)

Prof. Camilo de Lélis M. Pereira *

* Prof. Camilo de Lélis M. Pereira


Trabalha com Informática e Educação desde o início dos anos 90. Tendo atuado como
Desenvolvedor, Consultor, Professor e Coordenador em diversas Instituições e Universidades
da região. Atualmente é Professor Titular do IFET SE MG.
Mestre em Engenharia de Produção pela UFSC; Especialista em Docência Superior;
Graduado em Informática e Licenciado em Matemática.
Material disponível no site do autor: www.clmp.web44.net
2

ALGORITMOS
Metodologia de desenvolvimento

1. Metodologia de desenvolvimento de algoritmos


1.1. Introdução à Ciência da Computação
1.2. O conceito de algoritmos
1.3. Programação Estruturada
1.4. Linguagens de programação
1.5. Portugol
1.5.1. Constantes e Variáveis
1.5.2. Cálculos
1.5.3. Entrada e saída
1.5.4. Estruturas básicas de controle: seqüencial, condicional e repetição
1.6. Metodologia de desenvolvimento de algoritmos
1.7. Regras práticas para a construção de algoritmos legíveis
1.8. Exercícios
1.9. Máximas de programação

2. Programação em uma linguagem de alto nível


2.1. Introdução à linguagem de programação Pascal
2.2. O ambiente de desenvolvimento
2.3. Tabela de conversão de comandos
2.4. Exercícios

3. Tipos estruturados
3.1. Agregados homogêneos: vetores e matrizes
3.2. Agregados heterogêneos: registros
3.3. Aplicações e exercícios

4. Noções de modularização
4.1. Introdução aos módulos
4.2. Procedimentos
4.3. Funções
4.4. Passagem de parâmetros
4.5. Recursividade
4.6. Exercícios

5. Noções de arquivo
5.1. Organização e armazenamento de dados em memória secundária
5.2. Instruções utilizadas
5.3. Aplicação exemplo

6. Bibliografia
3

1. Metodologia de Desenvolvimento de Algoritmos

Introdução à Ciência da Computação


Evolução tecnológica dos computadores
O Computador
A estrutura de um computador digital / Memória / UCP / Periféricos

Conceituação de algoritmo
O conceito central da programação e da ciência da computação é o algoritmo.
Programar é basicamente construir algoritmos. Wirth apresenta a programação
estruturada como “a arte ou técnica de construir e formular algoritmos de uma forma
sistemática”. Programas são – segundo Wirth – “formulações concretas de algoritmos
abstratos, baseados em representações e estruturas específicas de dados”.
Nesta definição aparece o outro aspecto fundamental da construção de
programa: as estruturas de dados usadas no algoritmo para representar as informações
do problema a ser resolvido. De fato, no processo de construção de programas, a
formulação do algoritmo e a definição das estruturas de dados a serem usadas estão
intimamente ligadas.
Um algoritmo é a descrição de um padrão de comportamento, expressado em
termos de um repertório bem definido e finito de ações “primitivas”, das quais damos
por certo que elas podem ser executadas

Programação Estruturada
Basicamente, a Programação Estruturada consiste numa metodologia de projeto
de programas visando:
− Facilitar a escrita dos programas;
− Facilitar a leitura (o entendimento) dos programas;
− Permitir a verificação a priori dos programas;
− Facilitar a manutenção e modificação dos programas.

Para Dijkstra, o indiscutível iniciador da programação estruturada, “a arte de


programar consiste na arte de organizar e dominar a complexidade”.
A idéia básica da Programação Estruturada, que vai ao encontro da mencionada
tarefa do programador, é reduzir a complexidade, em três níveis:

a) Desenvolvimento do programa em diferentes fases por refinamento sucessivo


(desenvolvimento top-down);
b) Decomposição do programa total em módulos funcionais, organizados de
preferência num sistema hierárquico;
c) Usando dentro de cada módulo só um número muito limitado de estruturas
básicas de fluxo de controle.

Linguagens de programação
Conceito / Exemplos / Compilador / Linguagem de máquina
4

Portugol

O Portugol é uma pseudolinguagem de programação (simbiose do Português


com o ALGOL e PASCAL). A idéia é permitir que com um conjunto básico de
primitivas seja possível ao projetista pensar no problema e não na máquina que vai
executar o algoritmo e, por outro lado, não fique muito distante da mesma máquina. Em
outra perspectiva, que o projetista possa pensar na solução do problema e que esta
solução seja facilmente implementada no computador.

Constantes
Uma constante é um determinado valor fixo que não se modifica ao longo do
tempo, durante a execução de um programa.
Uma constante pode ser numérica, lógica ou literal.

Variáveis
Sabe-se da Matemática que uma variável é a representação simbólica dos
elementos de um certo conjunto.
Nos algoritmos, destinados a resolver um problema no computador, a cada
variável corresponde uma posição de memória, cujo conteúdo pode variar ao longo do
tempo durante a execução de um programa. Embora uma variável possa assumir
diferentes valores, ela só pode armazenar um valor a cada instante.
Toda Variável é identificada por um nome ou identificador.

• Declaração de variáveis – Tipos Básicos


− Inteiro
− Real
− Caracter
− Lógico

• Operadores Lógicos
e (conjunção)
ou (disjunção não exclusiva)
não (negação)

• Operadores relacionais
=, <>, >, >=, <, <=
5

Exercícios – Variáveis e expressões lógicas

1. Variáveis - Assinale os tipos de dados abaixo, da seguinte maneira: (I) inteiro, (R) real, (C) caracter e
(L) lógico.
( ) -678
( ) ‘0,87’
( ) ‘-9,12’
( ) Verdadeiro
( ) –456
( ) –99,8
( ) ‘Cinco’
( ) 45,8976
( ) Falso
( ) –1.56

2. Nome de variável
O nome de uma variável é utilizado para sua identificação e posterior uso dentro de um programa, sendo
assim, é necessário estabelecer algumas regras de utilização das mesmas:
1. Nomes de variáveis poderão ser atribuídos com um ou mais caracteres;
2. O primeiro caracter do nome de uma variável não poderá ser em hipótese alguma, um número,
sempre deverá ser uma letra;
3. O nome de uma variável não poderá possuir espaços em branco;
4. Não poderá ser nome de uma variável, uma palavra reservada a uma instrução de programa
constante da linguagem em uso;
5. Não podem ser utilizados outros caracteres a não ser letras (sem acento) e números, com exceção
do símbolo underline.

Assinale com um X os nomes válidos para uma variável.


( ) ENDEREÇO
( ) 21BRASIL
( ) FONE$COM
( ) NOMEUSUÁRIO
( ) NOME_USUARIO
( ) NOME*USUÁRIO
( ) END*A-6
( ) CIDADE3
( ) #CABEC

– Determine o resultado lógico das expressões abaixo, assinalando se


3. Expressões lógicas
são verdadeiras ou falsas. Considere para as respostas os seguintes valores: X=1, A=3,
B=5, C=8 e D=7.
Verdadeiro Falso
a) não (X>3)
b) (X<1) e não (B>D)
c) não (D<0) e (C>5)
d) não (X>3) ou (C<7)
e) (A>B) ou (C>B)
f) (X>=2)
g) (X<1) e (B>=D)
h) (D<0) ou (C>5)
i) não (D>3) ou não (B<7)
j) (A>B) ou não (C>B)
6

Entrada e Saída

Entrada / Saída

leia (v1, v2, v3, .., vn);

imprima (v1, v2, .., vn);

imprima (“O valor é :”, valor);

Exemplos:
1. Elaborar um algoritmo que leia um nome e o imprima na tela.
2. Leia nome e sobrenome e os imprima juntos.
3. Leia dois números inteiros.
4. Leia três números reais e os imprima na tela

Cálculos

• Comando de atribuição ( )
Soma  a + b;

• Operadores Aritméticos
+  adição
-  subtração
*  multiplicação
/  divisão
raiz(x)  raiz

• Funções Matemáticas: sen(x), cos(x), tg(x), arctg(x), abs(x), int(x), ...

A m mod i (A recebe o resto da divisão inteira de m por i )


A m div i ( A recebe o quociente da divisão inteira de m por i)

Exemplos:
1. Elaborar um algoritmo que leia dois nºs e imprima a sua soma.
2. Leia três números, calcule e imprima a sua média aritmética.
3. Leia dois nºs e imprima a sua soma, diferença, produto e quociente.
4. Calcule a área de um triângulo.
7

Estruturas de Controle

Deve-se usar, tanto quanto possível, somente algumas estruturas básicas de fluxo
de controle: a seqüência simples, a alternativa e a repetição, que correspondem a
formas de raciocínio intuitivamente óbvias.

Seqüência simples

C1;
C2;
...
Cn;

Alternativa (simples) Alternativa (composta)

se (<condição>) se (<condição>)
então então
C1; C1;
C2; C2;
... ...
Cn; Cn;
fim-se; senão
C1;
C2;
...
Cn;
fim-se;

Repetição

enquanto (<condição>) faça


C1;
C2;
...
Cn;
fim-enquanto;

Exemplos:
1. Elaborar um algoritmo que leia dois nºs e informe o maior.
2. Leia três nºs e informe o maior.
3. Leia a nota de um aluno e informe aprovado (nota>=60) ou reprovado
(nota<60).
4. Leia um número inteiro de 1 a 12 e informe o mês correspondente.
5. Leia um número e informe se é par ou ímpar.
6. Imprima na tela os números de 1 a 100.
7. Leia a nota de diversos alunos (até nota = -1) e informe aprovado ou reprovado.
8

Metodologia de desenvolvimento de algoritmos

Passo 1: Leia cuidadosamente a especificação do problema até o final.


(fazer anotações)

Passo 2: Repetir o passo 1 até entender completamente a especificação.

Passo 3: Levantar e analisar todas as saídas.

Passo 4: Levantar e analisar todas as entradas.

Passo 5: Verificar se é preciso gerar valores internamente ao algoritmo e levantar as


variáveis necessárias e os valores iniciais de cada uma.

Passo 6: Levantar e analisar todas as transformações necessárias para, dadas as entradas


e valores gerados internamente, produzir as saídas especificadas.

Passo 7: Testar cada passo do algoritmo, verificando se as transformações


intermediárias executadas estão conduzindo aos objetivos desejados. Utilizar, sempre
que possível, valores de teste que permitam prever os resultados a priori.

Passo 8: Fazer uma reavaliação geral, elaborando o algoritmo através da integração das
partes.

Regras práticas para a construção de algoritmos legíveis

1. Procure incorporar comentários no algoritmo. Em Portugol comentários podem


ocorrer em qualquer parte do algoritmo, encerrados entre {...} ou entre (*...*).
Mínimo: objetivo, autor, data e local.
2. Escolha nomes de variáveis que sejam significativos, isto é, que traduzam o tipo
de informação a ser armazenada na variável.
3. Grife todas as palavras-chave (escritas com letras minúsculas) do algoritmo,
destacando as estruturas de controle.
4. Procure alinhar os comandos de acordo com o nível a que pertençam, isto é,
destaque a estrutura na qual estão contidos.
9

Exercícios – Diversos

1. Elaborar um algoritmo que calcule a área de um trapézio, suas dimensões são


fornecidas pelo teclado.

2. Construir um algoritmo para calcular e imprimir a média aritmética de diversos


valores naturais fornecidos pelo teclado, o flag é -1.

3. Elaborar um algoritmo para contar quantas vezes é possível subtrair 3 de 1000


(considere os números naturais).

4. Um determinado material radioativo perde metade de sua massa a cada 50 segundos.


Dada a massa inicial em gramas (através do teclado), pede-se elaborar um algoritmo que
determine o tempo necessário para que essa massa se torne menor que 0,5 gramas.
Deverão ser impressas a massa inicial, a massa final e o tempo calculado em horas,
minutos e segundos.

5. Elaborar um algoritmo que determine o maior e o menor número de uma série de


números inteiros positivos fornecidos pelo teclado. Considere que existe pelo menos um
número e -1 o flag.

6. Construir um algoritmo para calcular as raízes de uma equação do 2º grau, sendo que
os coeficientes a,b e c são fornecidos pelo teclado.

7. Escrever um algoritmo para calcular o fatorial de um número N, cujo valor é


fornecido pelo teclado.

8. Supondo que a população de um país A seja da ordem de 90 milhões de habitantes


com uma taxa anual de crescimento de 3% e que a população de um país B seja
aproximadamente de 200 milhões de habitantes com uma taxa anual de crescimento de
1,5%, elaborar um algoritmo que calcule e imprima o número de anos necessários para
que a população do país A ultrapasse ou se iguale a população do país B. (mantidas
essas taxas de crescimento)

9. Elaborar um algoritmo que leia o nome e o sexo de uma pessoa, informando o nome
seguido da palavra homem (sexo = ‘masculino’) ou mulher (sexo = ‘feminino’).
1

Exercícios – Alternativas e decisão

1. Dia da semana - Elaborar um algoritmo que lê um número de 1 a 7 e informa o dia da semana


correspondente, sendo domingo o dia de número 1. Se o número não corresponder a um dia da semana, é
mostrada uma mensagem de erro.

2. Triângulo - Em um triângulo, cada lado é menor do que a soma dos outros dois. Escreva um programa
que lê três valores e informa se estes não podem constituir um triângulo ou, caso contrário, se o triângulo
formado é equilátero (três lados iguais), isósceles (dois lados iguais) ou escaleno (lados diferentes).

3. Faixa etária - Fazer um algoritmo que leia nome e idade de uma pessoa e determine se esta pessoa é
criança (até 12 anos), adolescente (de 12 até 21 anos), adulto (de 21 até 60 anos) e idoso (acima de 60
anos).

4. Menu Principal - Faça um programa de menu que mostra na tela, sob o título de "Menu Principal",
três opções: "1 - Fim", "2 - Cadastro" e "3 - Consulta", lê do teclado a opção desejada pelo usuário e
mostra uma mensagem confirmando a opção escolhida ou uma mensagem de erro, se a opção for
inválida.

5. Múltipla Escolha - Elaborar uma questão de múltipla escolha, de uma disciplina que esteja cursando
ou um tema de interesse, com um enunciado e cinco alternativas, sendo uma correta ou incorreta.
Escrever um programa que mostra a questão na tela, pede a resposta correta e informa ao usuário se este
acertou ou errou.

6. Senha - Elabore um programa que lê uma senha de até 8 caracteres, verifica se a senha está correta ou
não, comparando-a com uma senha predefinida, e informa "Acesso autorizado" ou "Acesso negado",
conforme o caso.

7. Desconto - Uma loja de departamentos possui a seguinte política de descontos para com seus clientes:
5 % de desconto no preço total para compras com valores inferiores ou iguais a R$ 50,00
10 % de desconto no preço total para compras com valores entre R$ 50,00 e R$ 100,00
15 % de desconto no preço total para compras com valores superiores ou iguais a R$
100,00
Elaborar um algoritmo para automatizar a situação.

8. Geometria - Para facilitar a tarefa dos alunos de uma escola, um professor de matemática necessita de
um programa para calcular a área de certas figuras planas. O usuário deve escolher qual figura que se
deseja calcular a área (quadrado, retângulo, triângulo e circunferência). Devem ser fornecidos os valores
para cálculo da área. Ao final o programa deve imprimir o nome da figura escolhida, bem como sua área.

9. Salário - Elaborar um algoritmo que efetue o cálculo do reajuste de salário de um funcionário.


Considere que o funcionário deverá receber um reajuste de salário de 15% caso seu salário seja menor
que 500. Se o salário for maior ou igual a 500 e menor ou igual a 1000, seu reajuste será de 10%; e caso
maior que 1000, o reajuste deverá ser de 5%.
1

Exercícios – Repetição

1. Egocentrismo – Elaborar um algoritmo que mostra seu nome na tela dez vezes.

2. Ímpares - Apresentar todos os números ímpares situados na faixa de 0 a 50.

3. Pares - Apresentar todos os números pares situados na faixa de 0 a 50.

4. Soma dos cem – Calcular e apresentar a soma dos números inteiros de 1 a 100 (1+2+3+...
+98+99+100).

5. Divisibilidade por 5 – Elaborar um algoritmo que forneça como saída os números divisíveis por 5,
situados na faixa de 1 a 100.

6. Temperatura - A conversão de graus Farenheit para Celsius é obtida por C = 5/9*(F – 32). Faça um
algoritmo que calcule e escreva uma tabela de centígrados em função de graus Farenheit, cujos graus
variam de 50 a 150 de 1 em 1.

7. Aplicação - Faça um programa que receba o salário de um funcionário chamado José. Sabe-se que o
funcionário Manoel tem um salário equivalente a um terço do salário de José. José aplicará seu salário
integralmente na caderneta de poupança, que está rendendo 1% ao mês e Manoel aplicará seu salário
integralmente no fundo de renda fixa, que está rendendo 3% ao mês. Calcule e mostre a quantidade de
meses necessários para que o valor pertencente a Manoel iguale ou ultrapasse o valor pertencente a José.

8. Valores - Faça um programa que leia um conjunto não determinado de valores, um de cada vez, e
escreva uma tabela com cabeçalho, que deve ser repetido a cada 20 linhas. A tabela deverá conter o valor
lido, seu quadrado, seu cubo e sua raiz quadrada. Finalizar a entrada de dados com um valor negativo ou
zero.

9. Fibonacci - Construir um algoritmo para escrever os termos da seqüência de Fibonacci (1, 1, 2, 3, 5, 8,


13, 21, ...) inferiores a um valor L.

10. Tabuada - Elaborar um algoritmo que leia um número inteiro de 1 a 9, e forneça como saída a sua
tabuada de multiplicação.

11. Asteriscos - Elaborar um algoritmo que receba a nota de 10 alunos e a cada nota recebida imprima
um gráfico da seguinte maneira:
nota = 4,
Aluno 1 ****
nota = 7,
Aluno 2
*******
...

12. Cidades - Uma turma de Sistemas de Informação, possui alunos oriundos de diversas cidades. Sendo
as principais: Juiz de Fora, Leopoldina, Rio Pomba e Cataguases. Elaborar um algoritmo que leia o nome
e a respectiva cidade de origem de seus 50 alunos. Ao final imprima o total de alunos por cidade.
1

Máximas de programação

1. Algoritmos devem ser feitos para serem lidos por seres humanos.
2. Escreva comentários no momento em que estiver escrevendo o algoritmo.
3. Os comentários devem, acrescentar alguma coisa.
4. Use comentários no prólogo (cabeçalho: o que algoritmo faz e instruções para o
seu uso).
5. Utilize espaços em branco para melhorar a legibilidade.
6. Escolha nomes representativos para suas variáveis.
7. Um comando por linha é sufuciente.
8. Em expressões matemáticas utilize parênteses para aumentar a legibilidade e
prevenir-se contra erros.
9. Utilize “identação” para mostrar a estrutura lógica do algoritmo.
10. Lembre-se: toda vez que for feita uma modificação no algoritmo, os comentários
associados devem ser alterados, e não apenas os comandos. Antes não comentar
do que deixar algum comentário errado.

Exercício: A telemar está interessada em saber qual foi o maior nº de impulsos no mês e
quantos assinantes atingiram este valor. Sabe-se que os valores dos pulsos serão
fornecidos pelo teclado, sendo uma entrada por assinante. A última entrada contém o
valor –1 e não deve ser considerada. Os resultados devem fornecer o maior nº de
impulsos do mês e o nº de assinantes que atingiram este valor.
1

2. Programação em uma linguagem de alto nível

Linguagem Pascal

A primeira implementação da linguagem foi desenvolvida por Niklaus Wirth no


Instituto de Informática da ETH em Zurique na Suíça, onde era professor.
O professor Wirth, especificou e sistematizou a linguagem como uma evolução
do Algol (Algoritmic Language) e o nome Pascal foi uma homenagem ao matemático e
filósofo francês Blaise Pascal (1623-1662), criador da primeira calculadora mecânica.
A primeira especificação foi definida em 1968 e sofreu modificações no início
da década de 70.
A linguagem Pascal é uma linguagem com características voltadas à
programação estruturada.
É uma linguagem extremamente simples e poderosa e, não sendo voltada para
nenhuma aplicação específica, permite a sua implementação em atividades comerciais,
científicas, domésticas e principalmente em atividades educacionais, pois vários
educadores defendem a linguagem para promover o primeiro contato entre alunos que
tenham interesse na programação.

O ambiente de desenvolvimento

Para trabalhar com a linguagem Pascal você vai precisar de um compilador, um


linkeditor e um editor de textos.
Para facilitar o processo de programação foram criados os ambientes de
desenvolvimento, que unem estas características, além de oferecer outros recursos.
Em nossas aulas utilizaremos o ambiente de desenvolvimento Pascal Zim,
disponível para download em http://pascalzim.tripod.com/index.html. Que une algumas
vantagens, entre elas: possuir interface gráfica e não apresentar custo.

Exemplos
Realizar a conversão utilizando a tabela e o ambiente de desenvolvimento.

Exercícios
Praticar a conversão dos algoritmos construídos anteriormente.
1

Tabela de conversão
Portugol Pascal Java
Estrutura
início program nome; public class Ex1 {
var … public static void main(String[ ] args) {
begin
}
fim. end. }
Variáveis var x, y, z : integer;
inteiro: x,y,z; inteiro = int ou short
inteiro = integer real = double ou float
real = real lógico = boolean
lógico = Boolean (true, false) caracter = String
caracter = string char
char = string de apenas uma posição byte
byte = nº inteiros de 0 até 255
Operadores Aritméticos + , - , * , /, div, mod +, -, *, (double) /, /, %
Operadores Lógicos >, <, >=, <=, = , <> (diferente) >, <, >=, <=, ==, != (diferente)
e  and e  &&
ou  or ou  ||
não  not não  !
Expressões de Atribuição
A5; A:= 5; A = 5;
Comentários
{teste} {teste} // ...
(*teste*) /* ... */
Entrada e Saída import javax.swing.JOptionPane;
leia (x); read (x); String e = JOptionPane.showInputDialog(“entrada =
readln (x); “);
imprima ("nome:”, nome); {ln – mudança de linha} int x = Integer.parseInt(e);
JOoptionPane.showMessageDialog(null, “Saída
write ('nome:' , nome); ”+x);
writeln ('nome:' , nome); System.exit(0);
ou System.out.println(“Saída “+x);
Repetição (1)
enquanto (X > 0) faça while (X > 0) do while (x>0)
begin { ...
fim-enquanto;
end; }
Condição (1)
se (valor >10) if (Valor >0) if (Valor>0)
então XX+1; then begin { X=X+1;
MaiorValor; X : = X+1; Maior=Valor; }
senão XX-1; Maior := Valor; else
MenorValor; end { X=X-1;
fim-se; else begin Menor=Valor; }
X : = X-1;
Menor := Valor;
end;
Condição (2) swicth (valor)
Escolha (valor) case (valor) of { case 1 : mes=”Jan”; break;
caso 1 : mes’Jan’; 1 : mes:=’Jan’; case 2 : mes=”Fev”; break;
caso 2 : mes’Fev’; 2 : mes:=’Fev’; case 3 : mes=”Mar”; break;
caso 3 : mes’Mar’;; 3 : mes:=’Mar’; default mes=”Inválido”;
senão mês’inválido’; else mes:=’Inválido’; }
fim-escolha; end;
Repetição (2)
para X de 1 até 5 faça for X : =1 to 5 do for (int I=0; I<=10; I++)
begin {…
fim-para;
end; }
Repetição (3)
repita repeat do
{ …
até (X > 0); until (X > 0);
} while (x<=0);
1

3. Tipos estruturados
3.1. Agregados homogêneos: vetores e matrizes
3.2. Agregados heterogêneos: registros
3.3. Aplicações e exercícios

Agregados homogêneos: vetores e matrizes (Arrays)


Vetores (uma dimensão)
Matrizes (duas ou mais dimensões)

Comandos Extras
repita para v de i até f faça (passo p)
C1; C1;
C2; C2;
... ...
até (Condição); fim-para;

Definição de novos tipos


tipo V = array [Li1..Lsl, Li2 .. Ls2, ... ] tipo básico;
V: VETOR;

Exemplo (Vetor)
tipo V = array [1..80] real;
V : NOTAS;

1 2 3 ... 80
5.0 3.0 6.5 ... 9.8

Número de elementos
O número de elementos de um vetor será dado por: Ls - Li + 1.

Percorrendo o vetor
tipo V = array [1 .. 80] real;
V: NOTAS;
inteiro: I;

para I de 1 até 80 faça


leia(NOTAS[I]);
fim-para;
1

Exercícios - Vetores e Matrizes

***VETORES

1. Um professor tem uma turma de 80 alunos e deseja calcular e imprimir a nota de


cada aluno seguida da média da turma. As notas serão fornecidas pelo teclado.
Elaborar um algoritmo para automatizar a situação.

2. Elaborar um algoritmo que defina e leia dois vetores A e B com 20 elementos


inteiros cada, calcule e imprima o vetor SOMA.

3. Fornecer o número de elementos de cada uma das estruturas abaixo:


a) VET [-5 .. +5]
b) NOME [0 .. 10]
c) OC [1..10]
d) ARR [O .. N]

4. Dado o vetor VET, definido por:


tipo V = array [1 .. 100] inteiro;
V: VET;
a) preenchê-lo com o valor inteiro 30;
b) preenchê-lo com o números inteiros 1, 2, 3, ..., 100;
c) preencher VET[i] com 1, se i é quadrado perfeito, e com O, nos demais casos.

5. Escreva um algoritmo que:


a) Leia um conjunto A de 100 elementos reais;
b) construa e imprima um outro conjunto B formado da seguinte maneira:
i) os elementos de ordem par são os correspondentes de A divididos por 2.
ii) os elementos de ordem ímpar são os correspondentes de A multiplicados por
3.

6. Elaborar um algoritmo para calcular e imprimir o número de alunos que tiraram nota
acima da nota média da turma. Preencher o vetor com valores aleatórios (função
RANDOM), a turma tem 40 alunos.

***MATRIZES

7. (EXEMPLO) Escreva um algoritmo que leia duas matrizes reais de dimensão 3x5,
calcule e imprima a soma das matrizes.

8. Dada uma matriz M de 5x3 elementos literais (fornecida pelo teclado), faça um
algoritmo para:
a) Percorrer a matriz linha por linha (fixe a linha, varie a coluna).
b) Percorrer a matriz coluna por coluna (fixe a coluna, varie a linha).

9. Dada uma matriz MAT de 4x5 elementos (fornecida pelo teclado), faça um
algoritmo para somar os elementos de cada linha gerando o vetor SOMALINHA.
Em seguida, somar os elementos do vetor SOMALINHA na variável TOTAL que
deve ser impressa ao final.
1

***EXTRAS

10. (MÉTODO DA BOLHA) Elaborar um algoritmo que leia um vetor A de 20


elementos inteiros e o classifique em ordem crescente.

11. (BUSCA SEQÜENCIAL E BUSCA BINÁRIA) Dado um vetor A de 128 elementos


inteiros, verificar se existe um elemento igual K (chave) no vetor. Se existir,
imprimir a posição onde foi encontrada a chave; se não, imprimir: 'chave K não
encontrada'. O vetor A e a chave K são fornecidos pelo teclado.

*PESQUISA: Exercícios 10 e 11
Referência: GUIMARÃES, Lajes. Algoritmos e Estruturas de Dados. LTC Editora.

12. (PROJETO) Codificar um programa capaz de verificar em um vetor de 1000


elementos inteiros qual é o maior e menor número, a média aritmética dos números
e a quantidade de números pares e impares. O programa deverá inicialmente
preencher o vetor com números aleatórios entre 0 e 1000, para isso sugiro a
utilização da função random.

13. (MEGASENA) Elaborar um aplicativo capaz de sortear palpites para a Megasena. O


programa deve receber como entrada o número de cartões e o número de palpites
por cartão, fornecendo como saída os palpites sorteados.
1

Agregados heterogêneos: registros


O registro é uma estrutura de dados agregada, assim com o vetor, mas difere no fato de
cada componente poder ser de um tipo diferente.
O registro é a abstração de uma estrutura real muito conhecida, a ficha de cadastro.

Observe:
Ficha cadastral
Nome (caracter)
Salário
(real)Idade
(inteiro)
Sexo (lógico)

Assim definimos um registro como um conjunto de campos, que podem ser de tipos
diferentes.

Definição do computador:

tipo R = registro
carac
ter[30]: NOME;
real:
SALARIO;
inteir
o: IDADE;
lógic
o: SEXO;
fim-registro;
R: REG;

Memória:
REG
NOME
SALARIO
IDADE
SEXO

Acesso e atribuição de valores


A atribuição de valores às variáveis que compõem um registro pode ser qualificada da
seguinte maneira:
REG.NOME’Fulano de Tal’;
REG.SALARIO800,00;
REG.IDADE30;
REG.SEXOverdadeiro;
Nome ______(1)
Salário________
Idade__ Sexo__

Arquivo
1

Um registro sozinho não faz muito sentido, daí surge o conceito de arquivo. Um arquivo é
um conjunto de registros. O que também é uma abstração da realidade.

Exemplo:
Elaborar um algoritmo que receba: nome, nota e situação(aprov. ou reprov.) dos 15
alunos de uma turma. Armazene os dados em um arquivo(vetor de registros). Ao final
imprima a lista completa.

inicio
{Definições}
tipo reg=registro
caracter: nome; Reg Turma
real: nota;
lógico: situacao;
fim-registro; 1
Nome 2
tipo vet=vetor[1..15] reg;
vet: turma; ... ...
inteiro: i; Nota
15
{Entrada} Situacao
para i de 1 até 15 faça
leia(turma[i].nome);
leia(turma[i].nota);
se (turma[i].nota>=60)
então turma[i].situacaoverdadeiro
senão turma[i].situacaofalso
fim-se;
fim-para;

{Saída}
para i de 1 até 15 faça
imprima(turma[i].nome);
imprima(turma[i].nota);
se (turma[i].situação=verdadeiro)
então imprima(‘Aprovado’)
senão imprima(‘Reprovado’)
fim-se;
fim-para;
fim.

Exercícios – Registros

1. Defina o registro para cada uma das situações abaixo:


a) Coleção de livros.
b) Coleção de CD’s.
c) Clientes de uma empresa.
d) Setores de uma empresa.

2. Elaborar um algoritmo que permita o cadastro do nome, idade, sexo e cidade dos
alunos de sua turma. Ao final imprima a lista completa dos alunos cuja cidade é Juiz
de Fora.

3. (PROJETO) Elaborar um algoritmo que permita o controle dos dados de seus


amigos(máximo 100), através de um arquivo (vetor de registros). Implemente as
operações de cadastro, consulta e alteração.
2

4. Noções de modularização
4.1. Introdução aos módulos
4.2. Procedimentos
4.3. Funções
4.4. Passagem de parâmetros
4.5. Recursividade
4.6. Exercícios

Introdução aos módulos


Modularizar um programa é dividi-lo em pequenos módulos (sub-rotinas, rotinas,
blocos) cuja característica principal é a de que cada módulo deve possuir uma função
específica.
Vantagens: eliminação de trechos de um ou mais programas com funções
redundantes, facilita a codificação e a manutenção.
Os módulos são representados pelos PROCEDIMENTOS (PROCEDURES) ou
FUNÇÕES (FUNCTION).

Procedimentos
Procedure <nome> (parâmetros);
var <variáveis locais>;
begin
<comandos>;
End;

Funções
A única diferença real entre funções e procedures é que as funções tem um valor
de retorno, enquanto os procedimentos não retornam um valor, por isso no cabeçalho da
função temos que definir o tipo do resultado da função. Isto é feito ao se adicionar dois
pontos e um tipo ao cabeçalho.

function <nome> (parâmetros) : <valor de retorno>;


var <variáveis locais>;
begin
<comandos>;
End;
2

Exemplo
Program SubP1; Program SubP2;
// Variáveis Globais // Variáveis Globais
var N: Integer; var N: Integer;

// Módulos // Módulos
procedure Fatorial(X: Integer); function Fatorial(X: Integer) :
// Variáveis Locais integer;
var I, F: Integer; // Variáveis Locais
begin var I, F: Integer;
F := 1; begin
for I := 1 to X do F := 1;
begin for I := 1 to X do
F := F * I; begin
end; F := F * I;
writeln(F); end;
end; Fatorial:=F;
end;
// Programa Principal
begin // Programa Principal
readln(N); begin
Fatorial(N); readln(N);
End. writeln(Fatorial(N));
end.

Escopo de variáveis de um programa


O escopo de uma variável define a parte do programa em que a variável é
acessível. O importante é saber que uma variável é significativa somente dentro de seu
escopo, ou seja, somente dentro do bloco em que ela é declarada. Você não pode usar uma
variável fora do seu escopo.
Diz-se que um bloco é externo a outro, quando o segundo faz parte do primeiro.
Nesse sentido, uma variável declarada em um bloco é global para todos os blocos internos
e local para o próprio bloco.
• Variáveis Globais: São declaradas no âmbito (escopo) do programa principal,
valendo, portanto, para todo o programa.
• Variáveis locais: Existem somente enquanto a sub-rotina está sendo executada.
Ao terminar a sub-rotina, a mesma é retirada da memória, levando consigo suas
variáveis locais, deixando seus valores perdidos.

Passagem de Parâmetros
Tanto os procedimentos (procedures) como as funções (functions) podem receber
valores ou variáveis quando da ativação das mesmas. Estes elementos são chamados de
parâmetros.
Os parâmetros são declarados no cabeçalho da procedure através de uma lista de
parâmetros. Os parâmetros usados na codificação da procedure devem coincidir em
número, ordem e tipo com os descritos na chamada da procedure. Podemos ter passagem
de parâmetros por valor ou por referência.
Passagem de Parâmetros por Valor: Quando a passagem é feita por valor, o
procedimento ou função trabalha com uma cópia local dos parâmetros passados, qualquer
alteração do seu valor no interior do procedimento ou função não pode ser devolvido à
referida fonte.

* Resolver exercício no. 1


2

Passagem de Parâmetros por Referência: A passagem de parâmetros por


referência indica ao procedimento ou função o endereço da variável e, por consequência,
todas as alterações efetuadas no interior do procedimento ou função serão devolvidadas à
referida fonte. Os parâmetros a serem passados por referência deverão ter na definição da
sub-rotina na frente do nome do parâmetro a palavra “VAR”.

Exemplo
//Passagem de parâmetros por valor

Program SubP3;
var N: Integer;

procedure Fatorial(X: Integer);


var I, F: Integer;
begin
F := 1;
for I := 1 to X do
begin
F := F * I;
end;
writeln(F);
end;

begin
readln(N);
Fatorial(N);
end.

//Passagem de parâmetros por referência

Program SubP4;
var N, FAT: Integer;

procedure Fatorial2(X: Integer; var F: integer);


var I: Integer;
begin
F := 1;
for I := 1 to X do
begin
F := F * I;
end;
end;

begin
readln(N);
Fatorial2(N, FAT);
writeln(FAT);
end.
2

Recursividade
Diz-se que uma FUNCTION ou uma PROCEDURE é recursiva, quando ela
chama a si própria. Esta característica pode, a princípio parecer estranha, ou até mesmo
desnecessária devido ao nível de programas o qual estamos trabalhando, mas o uso da
recursividade muitas vezes, é a única forma de resolver problemas complexos. No nível
que será dado este curso, bastará saber o conceito e o funcionamento de uma sub-rotina
recursiva.

Exemplo
// Recursividade

Program SubP5;
var N: Integer;

function Fatorial(X : integer) : integer;


begin
if (X<=1) then Fatorial:=1
else Fatorial:=X*Fatorial(X-1);
end;

begin
readln(N);
writeln(Fatorial(N));
end.

Exercícios
1. Criar um módulo para cada uma das atividades abaixo:
a. Imprimir a palavra “sorte” cem vezes;
b. Imprimir a palavra “SI” n vezes;
c. Efetue o cálculo do quadrado de um número;
d. Efetue o cálculo do cubo de um número;
e. Informe se um número é par ou ímpar;
f. Imprimir a frase “FLAMENGÃO campeão dos campeões” dez mil
vezes.
2. (EXEMPLO) Elaborar um aplicativo que gerencie os módulos desenvolvidos na
questão anterior através do uso de um menu.
3. Elaborar um aplicativo que implemente o cálculo da distância entre dois pontos
do plano, através do uso de funções.
4. (PROJETO) Elaborar um aplicativo chamado Análise Combinatória, que
implemente através de funções o cálculo de permutação, arranjo e combinação.
5. Elaborar um aplicativo chamado Calculadora, que leia dois números, a operação
a ser realizada e ao final apresente o resultado. Contemplar as operações: +, -, *
e /.
6. Implementar o exercício anterior através de funções.
7. Elaborar um aplicativo chamado Números Complexos, que implemente através
de módulos as operações de Adição, subtração, multiplicação e divisão de
complexos.
8. Progressões (PA, PG).
9. (PROJETO) Fibonacci (Usando recursividade).
10. Implementar o exercício 5, usando passagem de parâmetros por referência.
2

5. Noções de arquivo
5.1. Organização e armazenamento de dados em memória secundária
5.2. Instruções utilizadas
5.3. Aplicação exemplo

ARQUIVOS

Um arquivo é de suma importância nos programas computacionais, desde o


tempo em que o primeiro computador surgiu, pois, para que um programa faça algum
tipo de operação, o mesmo precisa ser alimentado com informações fornecidas pelo
teclado, o que em muitos casos torna-se inviável, ou são fornecidos através de um
arquivo.

O PASCAL, possui dois tipos de arquivos, os quais são:

⇒ Arquivos FILE
⇒ Arquivos TEXTFILE
ARQUIVO FILE

Um arquivo do tipo FILE, também conhecido por arquivo randômico, ou de


acesso aleatório, é caracterizado pelo fato de ser possível buscar uma determinada
informação em qualquer posição que a mesma se encontre, sem haver a necessidade de
se percorrer todo o arquivo até se alcançar a informação desejada. O acesso a
informação é direto.

A sintaxe geral para definir uma variável com esse tipo de estrutura é:

Type
Arquivo = File of <Tipo>;
Var
a : Arquivo;

Para tanto, existem diversos comandos para executar tais operações e que passaremos a
examinar agora.

⇒ AssignFile: Este comando tem a finalidade de atribuir um nome lógico ao arquivo


físico, ou seja, ao nome do arquivo em disco.

Sintaxe: Assign( Variável_tipo_file, Nome_arquivo);

Type
Arquivo = File Of Integer;
Var
Arq : Arquivo;
Begin
Assign(Arq,'A:EXEMPLO.DTA');
2

A partir desse instante, todas as operaçöes de escrita ou leitura que forem


realizadas com a variável Arq, será automaticamente feitas no arquivo EXEMPLO.DTA
no drive A.

⇒ Rewrite: Cria e abre para Entrada\Saída um arquivo. Caso o arquivo não exista, o
mesmo será criado. Caso o arquivo já exista, todos os dados existentes nele serão
apagados.

Após estas declaraçöes,


Type teremos um novo arquivo no drive A
Arquivo = File Of Integer; com o nome EXEMPLO.DTA, aberto
Var e pronto para as operações de entrada
Arq : Arquivo; e saída.
Begin
Assign(Arq,'A:EXEMPLO.DTA');
Rewrite(Arq);

⇒ Reset: Este comando abre o arquivo em disco associado à variável Arq para leitura
ou escrita. Esta procedure parte do princípio que o arquivo exista em disco, caso ele
nåo exista, haverá erro.

Type Após estas declaraçöes, o


Arquivo = File Of Integer; arquivo no drive A com o nome
Var 'EXEMPLO.DTA' está aberto e pronto
Arq : Arquivo; para as operações de entrada e saída.
Begin
Assign(Arq,'A:EXEMPLO.DTA');
Reset(Arq);

⇒ Write: Este comando é utilizado para escrever dados em um arquivo. Os dados säo
gravados sequencialmente no arquivo, ou seja, um após o outro. Para tanto a linguagem
Pascal mantém um apontador de registro de arquivo que aponta sempre para o número
do registro, onde será gravado ou lido um dado.

Type Grava no arquivo


Arquivo = File Of Integer; A:EXEMPLO.DTA os números de 1 a
Var 100.
Arq : Arquivo;
I: Integer;
Begin
Assign(Arq,'A:EXEMPLO.DTA');
Rewrite(Arq);
For I:=1 to 100 do Write(Arq,I);

⇒ Seek: Como já dissemos anteriormente, a linguagem Pascal mantém um apontador


de registro que indica o próximo registro que será lido ou escrito, e toda vez que
fazemos uma leitura ou escrita num registro, o apontador é incrementado de um, isto é
2

automático. No entanto, dispomos de um comando que nos permite alterar o valor desse
apontador e portanto, nos permite acessar qualquer registro que quisermos. Esse
comando chama-se Seek. A proprósito, o número do primeiro registro é zero. A sintaxe
deste comando é:

Seek(Arq,número_do_registro);

⇒ Read: Comando para ler dados do arquivo, cuja sintaxe é Read(Arq,variável).


Type
Arquivo = File Of Integer;
Var
Arq: Arquivo;
I: Integer;
Begin
Assign(Arq,'A:EXEMPLO.DTA');
Rewrite(Arq);
For I:=1 to 100 do Write(Arq,I);

Seek(Arq,0); (posiciona o apontador de registro no registro número 0)

Read(Arq,I); (a variável I fica igual ao conteúdo do registro número 0 que no


presente exemplo valeria 1,a proprósito, o apontador de
registro já está valendo 1)

Read(Arq,I); (I agora está valendo 2)

⇒ Observação: Após cada operação READ/WRITE no arquivo, o endereço do


registro corrente no arquivo é incrementado em uma unidade. Assim por Exemplo, se o
endereço do registro corrente é igual a 10, após uma operação de READ/WRITE, o
registro corrente passará a ser o número 11.

⇒ Close: Fecha um arquivo que tenha sido aberto com RESET\REWRITE, cuja
sintaxe é Close(Arq).

⇒ Eof: Função que retorna o valor TRUE quando for encontrado o fim do arquivo.
While not eof(arquivo) do
begin
x:=x+1;
Seek (arquivo,x);
end;

⇒ FilePos: Função que retorna o número do registro corrente. Lembramos


novamente, que o primeiro registro recebe o número zero. Sintaxe: FilePos(Arquivo).

⇒ FileSize: Função que retorna o número de registros de um determinado arquivo.


Retorna zero se o arquivo estiver vazio. Esta funçäo em conjunto com o comando Seek,
2

nos permite colocar o apontador de registros para o final do arquivo. Isto é muito útil
quando desejamos adicionar mais registros num arquivo. Para tanto, basta declarar a
seguinte instruçäo: Seek(Arquivo,FileSize(Arquivo));

⇒ Erase: Elimina o arquivo do disco. É importante notar que o arquivo a ser


eliminado não pode estar aberto.

⇒ Rename: Renomeia um arquivo. Sintaxe: Rename( Arq : File , Novo_Nome)


Exercício
Codificar um programa para manipular informações de um arquivo de registros, onde
cada registro possui dois campos: nome e nota. O programa permitirá somente duas
operações: Inclusão e Consulta. A Consulta deverá mostrar todos os registros.

ARQUIVO TEXTFILE

Um arquivo do tipo TEXTFILE, também conhecido por arquivo seqüencial, é


um tipo especial de arquivo que, ao contrário do arquivo FILE, pode ser editado
normalmente através de um editor de textos qualquer. Ele é dito seqüencial porque a
leitura tem que ser feita seqüencialmente do início ao fim do arquivo, não podendo
desta forma, como é feito no arquivo FILE através do comando SEEK, posicionar de
forma direta, o ponteiro de arquivo em um registro em particular.

Nos arquivos do tipo TEXTFILE, todas as informações lá armazenadas são texto


(String's), mesmo assim, é possível escrever no arquivo informações de qualquer tipo de
dado simples (INTEGER, REAL, STRING, BYTE, etc) as quais , ao serem fisicamente
armazenadas no arquivo, serão automaticamente convertidas do seu tipo original para
o tipo STRING. A leitura se processa de forma inversa, ou seja, quando é lida uma
informação em um arquivo TEXT, a mesma será automaticamente convertida para o
tipo da variável que irá armazenar a informação, isto é , do tipo STRING para o tipo da
variável receptora da informação lida.

Existem uma grande quantidades de comandos especialmente para manipular


arquivos TEXTFILE, alguns dos quais já foram vistos (Assign, Rewrite, Reset, Close,
Write, Writeln, Read, Readln, etc). Portanto veremos a seguir outros comandos:

⇒ Append: Abre um arquivo para inclusão de novas informações do tipo Write-Only (


somente para escrita). Caso o arquivo não exista ocorrerá um erro de execução e o
programa será abortado. É importante notar que as inclusões se processam sempre no
final do arquivo.

⇒ Write ou Writeln: Ao ser usado o comando WRITE, todas as informações serão


escritas no arquivo na mesma linha. Ao ser usado o comando WRITELN, todas as
informações serão colocadas uma em cada linha

⇒ Read ou ReadLn: Ao ser usado o comando READ, a leitura será feita sempre na
mesma linha , como acontece quando se usa este comando para ler informações pelo
2

teclado. Por outro lado, ao ser usado o comando READLN, as leituras serão feitas linha
a linha, como acontece quando se usa este comando para leitura pelo teclado.

Exercícios

1. Codificar um programa capaz de solicitar ao usuário a digitação de uma frase. Cada


frase digitada pelo usuário deverá ser gravada em uma linha de um arquivo.

2. Codificar um programa capaz fazer o inverso do projeto anterior. Cada linha do


arquivo deverá ser lida e mostrada para o usuário.
2

6. Bibliografia
GUIMARÃES, Lajes. Algoritmos e Estruturas de Dados. LTC Editora.
FARRER, Harry et al. Algoritmos Estruturados. Ed. Guanabara.
AVILLANO, I. C. Algoritmos e Pascal. Ciência Moderna.
MANZANO, José Augusto N. G.; MENDES, Sandro S. Vicca. Estudo Dirigido, Delphi.
São Paulo: Ed. Érica, 2001.