



















Estude fácil! Tem muito documento disponível na Docsity
Ganhe pontos ajudando outros esrudantes ou compre um plano Premium
Prepare-se para as provas
Estude fácil! Tem muito documento disponível na Docsity
Prepare-se para as provas com trabalhos de outros alunos como você, aqui na Docsity
Encontra documentos específicos para os exames da tua universidade
Prepare-se com as videoaulas e exercícios resolvidos criados a partir da grade da sua Universidade
Responda perguntas de provas passadas e avalie sua preparação.
Ganhe pontos para baixar
Ganhe pontos ajudando outros esrudantes ou compre um plano Premium
ALGORITMO
Tipologia: Notas de estudo
1 / 27
Esta página não é visível na pré-visualização
Não perca as partes importantes!




















1.1 Introdução
A iden�ficação de problemas mais complexos resultará no desenvolvimento de algoritmos também mais complexos para serem
resolvidos.
“ Divida as dificuldades que tenhas de examinar em tantas partes quantas for possível, para uma melhor solução ” René Descartes
Uma abordagem eficiente para este �po de problema é a divisão do problema mais complexo em problemas mais simples de serem
resolvidos.
Este método é conhecido como modularização , onde um grande problema é divido em problemas menores e a solução destes problemas
menores resultará na solução do problema maior (mais complexo). Estes programas menores são denominados sub-ro�nas,
subprogramas ou sub-algoritmos.
Um subprograma é um trecho de um algoritmo ( futuro programa ) maior ( mais complexo ) que realiza qualquer operação computacional estudada até agora ( entrada, processamento, saída ). Ele efetua parte de uma tarefa que um algoritmo maior deverá executar. O algoritmo que aciona um subprograma é chamado de algoritmo principal daquele subprograma.
Exemplo de um código fonte com procedimento.
onde: nome é o iden�ficador associado ao procedimento.
Sobre procedimentos:
Também podem ter suas próprias constantes e types.
Program CALCULA_MÉDIA; {sem procedimento} var nota1,nota2,media : real; begin write ('Digite a primeira nota: '); readln (nota1); write ('Digite a segunda nota: '); readln (nota2); media := (nota1 + nota2) / 2; {calcula a media} Writeln ('Media = ',media,4:1) end.
Mostraremos agora o mesmo programa, u�lizando um procedimento.
Program CALCULA_MÉDIA; {usando procedimento} var NOTA1,NOTA2,MEDIA : real;
{declaração do procedimento} PROCEDURE Ler_Notas; begin write ('Digite a primeira nota: '); readln (NOTA1); write ('Digite a segunda nota: '); readln (NOTA2); end;
{Programa Principal} begin
LER_NOTAS; { a�vação do procedimento LER_NOTAS} MEDIA := (NOTA1 + NOTA2) / 2; {calcula a media} Writeln ('Media = ',MEDIA,4:1) {escreve o resultado} end.
As funções, embora bastante semelhantes aos procedimentos, têm a caracterís�ca especial de retornar ao programa que as chamou um valor associado ao nome da função. Esta caracterís�ca permite uma analogia com o conceito de função da Matemá�ca.
FUNÇÕES PRÉ DEFINIDAS : funções que já estão prontas e já está no compilador da linguagem. Abs (-2.3) = 2. Frac (123.45) = 0. Sqr (5) = 25 Sqrt (25) = 5
Declaração:
FUNCTION nome : �po; Declaração dos objetos locais à função (var, const, types..) BEGIN Comandos da função .... END;
onde: nome é o iden�ficador associado à função. �po é o �po da função, ou seja, o �po do valor de retorno.
Assim como procedimentos, podemos criar funções, segundo uma estrutura similar.
Funções definidas pelo programador são semelhantes aos procedimentos nos seguintes aspectos:
Cons�tuem-se em um bloco de instruções com um nome que as iden�fica;
Podem possuir seção local de dados;
Podem receber parâmetros por valor ou por referência;
São executadas somente quando chamadas.
As diferenças:
Retornam um valor ou resultado, cujo �po deve ser especificado na declaração da função;
No bloco de código da função, devemos atribuir um valor a ser retornado;
Somente podem ser chamadas em expressões.
Mostraremos agora o mesmo programa, u�lizando um procedimento para ler os valores e uma função para efetuar o cálculo da média.
Program CALCULA_MÉDIA; {usando procedimento e função} var NOTA1,NOTA2 : real; { Não existe mais a variável média }
{declaração do procedimento} PROCEDURE Ler_Notas; begin write ('Digite a primeira nota: '); readln (NOTA1); write ('Digite a segunda nota: '); readln (NOTA2); end;
{declaração da função} FUNCTION Media :real ; Var X : real; begin X := (NOTA1 + NOTA2) / 2; sem a variable X { MEDIA := (NOTA1 + NOTA2) / 2; } MEDIA := X; end;
{Programa Principal} Begin {a�vação do procedimento LER_NOTAS} LER_NOTAS ; Writeln('Media = ',MEDIA :4:1) end.
Program Parametro;
Var a ,b : real;
Procedure SOMA ( x, y: real ); { Parâmetros Formais }
Var tot: real;
Begin Tot := x + y; Writeln (´O valor total é ´,Tot); End;
Begin a := 5; b := 6;
SOMA (a, b); { Parâmetros Real }.
Writeln (‘Valor de A = ‘,a:2:2, ‘ de B = ‘,b:2:2); End.
Os parâmetros são um canal de comunicação entre uma ro�na chamadora e uma chamada.
Dentre os modos de passagem de parâmetros, podemos destacar:
VALOR e REFERÊNCIA.
Na passagem de parâmetros por valor , as alterações feitas nos parâmetros formais, dentro do subprograma, não se refletem nos parâmetros reais. O valor do parâmetro real é copiado no parâmetro formal, na chamada do subprograma. Assim, quando a passagem é por valor, isto significa que o parâmetro é de entrada.
Na passagem de parâmetros por referência , a toda alteração feita num parâmetro formal corresponde a mesma alteração feita no seu parâmetro real associado. Assim, quando a passagem é por referência, isto significa que o parâmetro é de entrada-saída.
Na linguagem Pascal, a declaração dos procedimentos e funções com parâmetros se diferencia da forma já apresentada apenas pela inclusão da lista de parâmetros formais no cabeçalho. Esta deve vir entre parênteses e cada parâmetro deve ter o seu �po especificado. A forma geral é:
PROCEDURE nome ( lista de parâmetros formais )
FUNCTION nome ( lista de parâmetros formais ) : �po
A lista de parâmetros formais tem a seguinte forma:
Iden�ficador ( parâmetro1 : �po; parâmetro2 : �po; ...; parâmetro n : �po )
Exemplos da lista de parâmetros:
procedure PROC ( X,Y,Z :integer ; K : real )
func�on FUNC ( A,B: real; C: string ) : integer
Na forma apresentada, a passagem dos parâmetros será por valor. Para se u�lizar a passagem por referência , deve-se acrescentar a palavra VAR antes do nome do parâmetro.
Procedure PROC( A : integer ; var B , C : integer )
Na chamada de procedimentos ou funções u�lizando parâmetros, devemos acrescentar após o nome do procedimento ou função uma lista de parâmetros reais (de chamada), os quais devem ser do mesmo �po e quan�dade dos parâmetros formais declarados.
O exemplo a seguir demonstra a diferença entre a passagem de parâmetros por referência e a passagem de parâmetros por valor:
Program EXEMPLO_PASSAGEM_PARÂMETROS;
var
N1,N2 : integer;
Procedure PROC_Val_Ref ( N1 : integer ; VAR N2 : integer);
begin N1 := 2 * N1; N2 := 2 * N2; end;
begin N1:= 5 ; N2 := 5; PROC_Val_Ref ( N1 , N2 ); writeln(N1); {será exibido o valor 5} writeln(N2); (será exibido o valor 10} end.
Nem sempre os �pos de dado disponíveis na linguagem atendem perfeitamente às necessidades do programa. Uma caracterís�ca que dis�ngue o Pascal de outras linguagens é a possibilidade que o programador tem de declarar seus próprios �pos de dado. Uma vez que declarou o novo �po, pode declarar quantas variáveis quiser daquele �po.
Declaramos um �po de dado através da palavra reservada type , normalmente antes da seção var , embora possa vir também depois.
O Turbo Pascal não permite a declaração normal de um array como parâmetro formal em uma função ou procedimento. Porém, podemos u�lizar o recurso da criação de novos �pos de dados disponível na linguagem Pascal. Veja o exemplo a seguir:
type
Vetor = array [1..20] of integer;
Nome = string [30];
(* A par�r deste instante, além dos �pos de dados pré-definidos, podemos também u�lizar os novos �pos definidos vetor, nome*)
Após essas declarações, caso você necessite declarar uma variável do �po array com 20 elementos inteiros e uma string de 30 posições, basta fazer o seguinte:
var Vet_int : Vetor ; Nome 0 0 1 F _p : Nome
Desta forma, para u�lizar um array como parâmetro formal em uma função ou procedimento, você deve declará-lo na lista de parâmetros com o nome do �po criado na declaração type.
Exemplos:
Type
Cor = (azul, vermelho, branco, verde, amarelo); Dia_u�l = (segunda, terça, quarta, quinta, sexta); Linha = string[80]; Idade = 1..99;
Escrever um programa para ler um vetor de 50 elementos inteiros e determinar o valor médio dos seus elementos (u�lizando um procedimento para ler um vetor e uma função para calcular a soma dos elementos do vetor).
Program CALCULA_MÉDIA; type
Vetor = array[1..50] of integer;
var VET : Vetor ; MEDIA : integer;
Procedure LEIA_VETOR (var V:VETOR); var I : integer; begin for I:=1 to 50 do readln(V[I]); end;
Func�on SOMA_VETOR (V:VETOR) : integer; var I,S : integer; begin S := 0; for I:=1 to 50 do S := S + V[I]; SOMA_VETOR := S; end;
{ Programa principal}
Begin {leitura do vetor} LEIA_VETOR(VET); {cálculo da média} MEDIA := SOMA_VETOR(VET) div 50; {exibição do resultado} writeln(MEDIA); End.
Exercícios
1) Escreva um procedimento chamado SINAL que receba como parâmetro um valor N inteiro e escreva a palavra POSITIVO se N for um número maior que zero, NEGATIVO se N for menor que zero, ou ZERO se N for igual a zero. Escreva um programa que leia um número inteiro e, usando o procedimento SINAL, mostre se ele é maior, menor ou igual a zero.
2) Escreva uma função que receba um vetor V de 30 elementos inteiros, e retorne o maior elemento do vetor V. E um procedimento para carregar o vetor. Faça um programa que chame o procedimento e carregue o vetor e depois u�lize a função para achar o maior elemento, que deverá ser mostrado no programa principal.
3) Suponha que uma indústria produza quatro ar�gos diferentes. Para cada ar�go se tem as quan�dades produzidas em cada dia da semana conforme a tabela abaixo:
Semana
Ar�go
Segunda Terça Quarta Quinta Sexta Sábado
Chupeta 301 690 345 823 467 132
Fralda 503 540 920 470 555 645
Xampu 678 732 250 140 289 667
Talco 566 454 589 667 612 789
Faça um algoritmo que:
4) Faça um algoritmo que carregue uma matriz A4x4 (através de um procedimento ) e calcule e imprima:
5) Escreva uma função que receba um valor X do �po inteiro e um vetor V de 80 elementos inteiros, e retorne o número de ocorrências de X dentro do vetor V.
6) Escreva um procedimento chamado PAR_IMPAR que receba um vetor de 100 elementos inteiros e retorne a quan�dade de números pares e de números ímpares con�das no mesmo. Faça um programa que leia 100 valores inteiros (armazenando em um vetor) e, usando o procedimento PAR_IMPAR, determine e exiba a quan�dade de números pares e de números ímpares.
Begin clrscr; Writeln (' Digite os dados da pessoa (nome e idade) ' ); Readln (cadastro.nome); Readln (cadastro.idade);
Writeln('---------------');
Writeln (cadastro.nome); Writeln (cadastro.idade); Readln; End.
2) Program reg2; { exemplo de uso de registros }
Uses crt;
Var i : integer;
cadastro : record nome : string[30]; endereco : string[30]; cep : string[10]; bairro : string[20]; fone : string[20]; end;
Begin i:= 1; While i <= 5 do begin clrscr; Writeln('Digite o (nome): ' ); Readln(cadastro.nome); Writeln('Digite o (endereco): ' ); Readln(cadastro.endereco); Writeln('Digite o (cep): ' ); Readln(cadastro.cep); Writeln('Digite o (bairro): ' ); Readln(cadastro.bairro); Writeln('Digite o (fone): ' ); Readln(cadastro.fone); Writeln('-----------------------'); Writeln(cadastro.nome); Writeln(cadastro.endereco); Writeln(cadastro.cep); Writeln(cadastro.bairro); Writeln(cadastro.fone);
Writeln('-----------------------');
i:= i + 1; Readln;
end; End.
3.2 Tipos
Os “�pos” são �pos de dados criados pelo programador. Os �pos podem ser do �po registro e podem, ainda, serem u�lizados dentro de outros �pos. Para isso deve-se declarar e u�lizar hierarquicamente, fazendo menção aos mais externos. Por exemplo:
Tipo End = registro Rua : cadeia; Numero : inteiro; Bairro : cadeia; Cidade : cadeia; Cep : cadeia; fim;
FichaCadastral : registro
RG : cadeia;
Nome : cadeia;
Idade : inteiro;
Salario : real;
Endereco : End;
fim;
Var
Ficha : FichaCadastral; ...
As variáveis declaradas com �pos de dados registro são chamadas de variáveis compostas heterogênias.
Exemplo de Uso de Tipos Registro (Types):
Program Tipo; {exemplo de definicao e u�lizacao de �pos - registros }
Uses crt;
Type endereco = record rua : string[30]; num : integer; bairro: string[20]; cep : string[10]; end;
Var
i : integer; cadastro : record nome : string[30]; ender : endereco; fone : string[20]; end; Begin
i:= 1; While i <= 5 do begin clrscr; Writeln('Digite o (nome): ' ); Readln(cadastro.nome); Writeln('Digite a (rua): ' ); Readln(cadastro.ender.rua); Writeln('Digite o (numero): ' ); Readln(cadastro.ender.num); Writeln('Digite o (bairro): ' ); Readln(cadastro.ender.bairro); Writeln('Digite o (cep): ' ); Readln(cadastro.ender.cep); Writeln('Digite o (fone): ' ); Readln(cadastro.fone);
Writeln('-----------------------');
Writeln(cadastro.nome); Writeln(cadastro.ender.rua); Writeln(cadastro.ender.num); Writeln(cadastro.ender.bairro); Writeln(cadastro.ender.cep); Writeln(cadastro.fone);
Writeln('-----------------------');
i:= i + 1; Readln; end; End.
end;
Readln; End.
Exercícios
1) Dado um conjunto de 20 registros armazenados em um vetor, cada um contendo o nome e a idade de uma pessoa, faça um algoritmo que imprima o nome das pessoas que �verem idade maior que a idade média das pessoas.
2) Considerando o registro de uma mercadoria de uma loja contendo as seguintes informações: código, nome, preço e estoque, fazer um programa que, dado o registro de 50 mercadorias, leia um código exiba o nome, preço e estoque da respec�va mercadoria.
3) Escreva um programa que armazene um cadastro de 50 pessoas com os seguintes dados: nome, telefone e data de nascimento (dia, mês, ano) e realize consultas da seguinte forma:
Obs: Como uma pessoa pode possuir mais de um telefone, a sugestão é criar um vetor para o campo telefone.
4) Escrever um algoritmo para ler 10 profissionais (código, nome, data de nascimento (dia, mês e ano), idade e altura). Uma vez cadastrados, este algoritmo devera, encontrar e imprimir o profissional mais idoso e o mais novo, o mais alto e o mais baixo e a data de nascimento deles. Usar �pos. Usar técnicas de modularização.
5) Uma indústria faz a folha mensal de pagamentos dos seus 80 empregados baseada no seguinte:
Matrícula: Nome: Salário Bruto: Dedução INSS: Salário Liquido:
Até 1.040,22 8 De 1.040,23 até 1.733,70 9 De 1.733,71 até 3.467,40 11 Acima de 3.467,41 R$ 381,
7) Em certo município, vários proprietários de imóveis estão em atraso com o pagamento do IPTU. Escrever um programa que calcule e escreva o valor da multa a ser paga por estes proprietários, considerando que:
Arquivos são estruturas de dados armazenadas fora da memória principal do computador, geralmente em meios magné�cos como fitas, discos ou disquetes.
Os arquivos são usados principalmente em dois casos. Primeiro, quando as informações são muito numerosas para caber na memória principal do computador. Segundo, quando há necessidade de armazenamento permanente de informações, pois o conteúdo da memória principal do computador geralmente se perde, quando se executa outro programa ou quando se desliga o computador. Entende-se por arquivo uma coleção de dados , onde os mesmos possuem alguma relação entre si. Por exemplo, o conjunto de dados sobre os alunos do Curso de Análise. Dentre estes dados sobre os alunos, temos:
Cada conjunto de dados sobre um determinado aluno recebe o nome de registro. Note-se que um registro é composto por �pos de dados diferentes. Cada dado que compõe o registro (MATRÍCULA, NOME etc) é dito ser um campo.
A figura a seguir, ilustra a relação existente entre campo, registro e arquivo:
Arquivo
C 1 C 2 ... C (^) n
C 1 C 2 ... C (^) n
.
.
C 1 C 2 ... C (^) n
.
.
.
C 1 C 2 ... C (^) n
Um arquivo necessita de um meio de armazenamento que sirva de depósito (suporte) para seus dados. Os suportes mais comuns para os arquivos são os discos flexíveis, os discos rígidos (winchesters) e as fitas magné�cas. Esses arquivos podem ser de 3 �pos: seqüencial , indexado e rela�vo. Essa diferenciação em �pos, está associada a algumas restrições quanto ao acesso aos dados guardados nesses arquivos. Em nosso caso, trataremos apenas com arquivos de organização seqüencial. O arquivo seqüencial é aquele cujo acesso aos seus dados só pode ser feito de forma seqüencial, isto é, um registro de ordem N está localizado após um outro de ordem N-1 e antecede um de ordem N+1.
A linguagem Pascal permite usar dois �pos de arquivos:
4.1 Binário
Usam o sistema binário de numeração para armazenar tanto as informações numéricas quanto as informações literais (através de códigos numéricos dos seus caracteres.
Por exemplo, 65 é armazenado como o byte 01000001. Esta mesma representação pode ser u�lizada tanto para o valor numérico 65 como para o caractere 'A', cujo código ASCII é 65.
Um arquivo binário é formado por uma seqüência de registros , todos do mesmo �po, que por sua vez são formados por campos.
4.2 Texto
Armazenam todas as informações, numéricas ou literais, através de códigos de seus caracteres (ASCII).
Por exemplo, o valor numérico 65 é armazenado através dos caracteres '6' e '5', cujos códigos ASCII são 54 e 53., representados com os bytes 00110110 e 00110101.
Os caracteres de um arquivo �po texto são agrupados em linhas , que por sua vez são agrupadas em páginas. O caractere de código 13 indica o fim de linha, o de código 12 o fim da página e o de código 26 o fim de arquivo.
A organização dos arquivos do �po texto é sempre seqüencial , isto é, os caracteres são colocados um após o outro.
CLOSE - Este procedimento permite que se feche um arquivo anteriormente aberto, só sendo permi�do o fechamento de um arquivo por vez. Sua sintaxe:
CLOSE (VAR arquivo : FILE);
Exemplo:
Escreva um programa crie um novo arquivo chamado ARQ_ALUNOS.DAT contendo os campos Nome e Idade, e grave no mesmo 5 registros lidos pelo teclado.
Program Grava_registro;
uses crt;
type registro_alunos = record nome :string[10]; idade :integer; end; var arq_alunos : file of registro_alunos; { arquivo �sico } alunos :registro_alunos; { registro de alunos } i:integer;
begin assign (arq_alunos,'c:\binha\alunos.dat'); rewrite (arq_alunos); { cria um arquivo novo } clrscr; for i := 1 to 5 do begin write (' Digite o nome do aluno '); readln(alunos.nome); write (' Digite o idade do aluno '); readln(alunos.idade); write (arq_alunos,alunos); { grava registro} end; close (arq_alunos); end.
Nos comandos apresentados, vemos uma deficiência: enquanto o RESET apenas nos permite a abertura de arquivos já existentes, o REWRITE apenas abre arquivos novos ou destrói um possível conteúdo anterior. Como poderemos então resolver essa situação? Bem, existe um modo rela�vamente simples, que consiste no uso de uma dire�va de compilação para checagem de erros de entrada e/ou saída, {$I}. Esta dire�va retorna um código de erro em uma função do Turbo chamada IORESULT. Vejamos um exemplo prá�co da u�lização da dire�va $I:
Program TESTA_ABERTURA;
Uses crt;
Type REG = record COD : string[6]; DESC : string[20]; end; Var ARQ : file of REG; NOMEARQ : string;
Begin clrscr; write('Entre com o nome do arquivo'); readln(NOMEARQ); assign(ARQ,NOMEARQ); {$I-} reset(ARQ); {$I+} if ioresult = 0 then
writeln('Arquivo aberto sem problemas') else begin rewrite(ARQ); writeln('Arquivo inexistente. Novo arquivo criado'); end; close(ARQ); writeln('Arquivo fechado'); readkey; End.
Porém, para manipularmos um arquivo não basta apenas abri-lo e fechá-lo. Temos, na maioria das vezes, que ler uma informação con�da nele, outras vezes registrar informações novas, ou ainda fazer alterações nas informações já existentes. Vejamos então os comandos que nos permitem tais tarefas:
WRITE - Este procedimento, além de ser usado para exibir dados no vídeo, pode ser usado para gravar informações em um arquivo. Após a execução deste procedimento, o ponteiro de registros do arquivo será deslocado um registro para a frente. Sua sintaxe:
WRITE (arquivo : FILE; registro : RECORD);
Exemplo:
EOF - Esta função nos retorna o valor TRUE quando for encontrada a marca de fim de arquivo. Sua sintaxe:
EOF (VAR arquivo : FILE) : boolean;
Exemplo:
READ - Como já vimos anteriormente, este procedimento permite que atribuamos a uma variável um valor ob�do por um disposi�vo de entrada. Esse disposi�vo pode ser também um arquivo. Após a execução deste procedimento, o ponteiro de registros do arquivo será deslocado um registro para a frente. Sua sintaxe:
READ (arquivo : FILE; registro : RECORD);
Exemplo: