











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
Este documento aborda conceitos básicos de programação no pascal, como variáveis, parâmetros, sub-rotinas, arquivos e recursão. São apresentados exemplos de algoritmos e sintaxe para cada conceito, bem como a explicação de como eles funcionam e se diferenciam uns dos outros.
Tipologia: Notas de estudo
1 / 19
Esta página não é visível na pré-visualização
Não perca as partes importantes!












Setanome ESCREVA (Nome) mudança ESCREVA (Nome) FIM
Pascal PROGRAM Teste; VAR Nome : STRING; PROCEDURE Setanome; BEGIN READ(Nome); END; PROCEDURE Mudança; VAR Nome : STRING; BEGIN READ(Nome); END;
Setanome; WRITE(Nome); mudança; WRITE(Nome); END;
No Exemplo acima, a variável global “Nome” e a variável local “Nome” representam posições de memória totalmente diferentes, logo, qualquer mudança no conteúdo da variável local, não afetará o conteúdo da variável global.
1 - Faça uma “PROCEDURE” para calcular A elevado a um expoente B. 2 - Faça uma “PROCEDURE” para calcular o fatorial de um número X qualquer. 3 - Faça um algoritmo para calcular a seguinte expressão matemática:
Y
X X X X X nX
n
n
1 2
2
3
3
4
4
5
5
6 1
2 3 4 5 6 1
!!!!!
... ( )!
( )
4 - Faça uma PROCEDURE que informe se uma STRING qualquer é palíndrome. 5 - Faça um algoritmo que leia um vetor de números inteiros. Após, emita um relatório com cada número diferente, e o número de vezes que o mesmo apareceu repetido no vetor. 6 - Faça um algoritmo para: Ler as informações de n pessoas : Nome, Idade, sexo, altura, peso e endereço(Rua, Número, Bairro, Cidade, Estado), armazenando-as em um vetor. O valor n deverá ser lido. Alterar o vetor de tal forma que na parte superior, sejam colocados, em ordem crescente, as pessoas cujas idades sejam pares e na parte inferior, sejam colocadas, em ordem decrescente, as pessoas cujas idades sejam ímpares. Obs: O algoritmo deve prever a possibilidade de no vetor , não existirem números pares ou então, não existirem números ímpares.
5. Passagem de Parâmetros
Até agora vimos que para ativar uma sub-Rotina bastaria colocar o seu Nome em alguma parte do programa. Mas isto nem sempre significa que o trabalho de escrever o programa irá diminuir. Com o que vimos até agora , dependendo da tarefa a ser realizada pela sub-Rotina, o trabalho de um programador pode até ser bem complicado. Por Exemplo, como faríamos para ler 5 vetores, todos com tamanhos diferentes? Poderíamos , por Exemplo, criar 5 sub-Rotinas, uma para cada vetor a ser lido. Isto sem dúvida resolveria esta situação, mas, e se fossem 100 vetores?, ou 1000? Seria realmente uma tarefa muito trabalhosa ter de escrever 100, ou 1000 sub- Rotinas, isto só para ler os vetores, imagine se tivéssemos também que ordená-los, ou realizar outro processo qualquer. Com toda esta dificuldade, o uso das sub-Rotinas deveria ser considerado. Como já foi dito, as sub- Rotinas foram criadas para serem genéricas o bastante para se adaptarem a qualquer situação, visando justamente a possibilidade de reutilização do código. Para realizar esta “mágica”, foi criado o conceito de passagem de parâmetros, ou seja, passar informações para serem tratadas dentro da Sub-Rotina. Sintaxe : Algoritmo PROCEDURE
Pascal PROCEDURE
Obs: Variável do mesmo tipo são separadas por vírgulas (,). Variáveis de tipos diferentes, são separadas por ponto e vírgula (;). Exemplo :
Algoritmo ALGORITMO Teste VARIAVEIS Número : INTEIRO Funcionário : STRING
PROCEDURE EscreveNome(N : INTEGER; Nome : STRING) VARIAVEIS I : INTEIRO INICIO PARA i DE 1 ATE n FACA ESCREVA (Nome) FIM PARA FIM
LEIA (Número, Funcionário) EscreveNome (Número, Funcionário) FIM
Pascal PROGRAM Teste; VAR Número : INTEGER; Funcionário : STRING;
1 - Faça um algoritmo para calcular N! 2 - Faça um algoritmo para calcular Ab 3 - Faça um algoritmo para calcular a seguinte expressão até o n-ésimo:
2 3 4 5
a) Passagem de Parâmetros por Valor Qualquer alteração no conteúdo de um parâmetro, dentro de uma sub-Rotina, não será refletido no programa chamado.
Exemplo :
Algoritmo ALGORITMO Teste VARIAVEIS X : INTEIRO PROCEDURE PorValor(A : INTEIRO) INICIO A 5 FIM
PorValor (X) ESCREVA (X) FIM
Pascal PROGRAM Teste; VAR X : INTEGER; PROCEDURE PorValor(A : INTEGER); BEGIN A : = 5; END;
PorValor(X); WRITE(X); END.
No Exemplo acima, o conteúdo da variável “X” não será alterado após o retorno ao programa principal.
b) Passagem do Parâmetros por Referência Quando a alteração no conteúdo de um parâmetro, dentro de uma sub-Rotina, se reflete no programa chamador. Os parâmetros a serem passados por referência deverão ter, na definição da sub-Rotina, colocado na frente do Nome do parâmetro, a palavra “VAR”. Exemplo :
Algoritmo ALGORITMO Teste VARIAVEIS X : INTEIRO PROCEDURE PorReferência(VARIAVEL A: INTEIRO) INICIO A 5 FIM
PorReferência(X) ESCREVA (X) FIM
Pascal PROGRAM Teste; VAR X : INTEGER; PROCEDURE PorReferência(VAR A: INTEGER); BEGIN A : = 5; END;
PorReferência(X); WRITE(X); END.
No Exemplo acima , o conteúdo da variável “X” será alterado após o retorno ao programa principal
c) O problema dos tipos na definição de parâmetros O Pascal, a princípio, aceita somente que sejam definidos parâmetros com os seguintes tipos : INTEGER, REAL, BYTE, WORD, BOOLEAN, CHAR, STRING e os outros tipos ditos simples. Desta forma, tipos como ARRAY, RECORD e STRING com tamanho definido pelo usuário, não são aceitos. Acontece que existe uma forma de fazer o Pascal aceitar qualquer tipo de dados na definição de parâmetros, através da definição de tipos pelo usuário, ou seja, criar tipos através do comando TYPE. Exemplo :
Algoritmo ALGORITMO Teste CONSTANTE Máximo = 50 TIPO Vetor = VETOR[1..Máximo] DE INTEIRO Registro =RECORD descrição : STRING cor : STRING Quant : BYTE FIM VARIAVEL Vet : vetor Reg : registro
PROCEDURE LeInfo(VARIAVEL V: Vetor; VARIAVEL R : Registro) VARIAVEL i : INTEIRO INICIO ESCREVA (‘Digite os elementos DO vetor: ’) PARA i DE 1 ATE máximo FACA LEIA (v[i]) FIM PARA ESCREVA (‘Digite os elementos DO Registro’) LEIA (r.descrição, r.cor, r.quant) FIM
LeInfo(Vetor, Reg) FIM
6. Function
Sintaxe : Algoritmo FUNCTION
Pascal FUNCTION
Uma sub-Rotina do tipo “FUNCTION” possui as mesmas características de uma “PROCEDURE” no que se refere a passagem de parâmetros, variáveis globais e locais, mas possui uma importante diferença, que é o retorno de um valor ao término de sua execução, ou seja, uma FUNCTION sempre deverá retornar um valor ao chamador. Na definição de uma “FUNCTION” , deverá ser informado qual o tipo do valor retornado, sendo que poderá ser usado, nesta definição, tanto tipos pré-definidos da linguagem, como tipos definidos pelo usuário. Somente não poderão ser retornados tipos ARRAY e RECORD, justamente por serem tipos que definem variáveis que armazenam mais de um valor. Para informar qual o valor deve ser retornado deve ser colocado, em algum ponto do código da “FUNCTION” uma linha com a seguinte Sintaxe:
Algoritmo
Pascal
Exemplo :
Pascal ALGORITMO Teste VARIAVEL K : BYTE FUNCTION Soma(V1, V2 : BYTE) : BYTE INICIO Soma V1 + V FIM
INICIO K Soma(2,3) ESCREVA (K) FIM
Pascal PROGRAM Teste; VAR K : BYTE; FUNCTION Soma(V1, V2 : BYTE) : BYTE; BEGIN Soma : = V1 + V2;
K : = Soma(2,3); WRITE(K); END.
0
d) Calcular:
n
n
0
f) Retornar TRUE caso um número seja par, FALSE caso contrário g) Retornar TRUE caso um número seja ímpar, FALSE caso contrário
Segue abaixo uma representação das variáveis e seus conteúdos em cada uma das chamadas:
a Chamada A=80 Valor= 2
a Chamada A=40 Valor= 3
a Chamada A=20 Valor= 4
a Chamada A=10 Valor= 5
a Chamada A=5 Valor= 6
a Chamada A=2 Valor= 7
a Chamada A=1 Valor=
Explique qual será o resultado e o funcionamento dos seguintes programas:
a) PROGRAM Teste; FUNCTION XXX(A : WORD) : WORD; BEGIN IF a = 0 THEN BEGIN XXX : = 1; ELSE XXX : =A * XXX(A - 1); END; END; BEGIN WRITE(XXX(5)); END.
b) PROGRAM Teste; PROCEDURE Recursão(a : BYTE); BEGIN a : = a - 1; IF a > 0 THEN BEGIN Recursão(a); END; WRITE(a); END; BEGIN Recursão(5); END.
c) PROGRAM Teste; PROCEDURE Recursão(VAR a: BYTE); BEGIN a : = a - 1; IF a > 0 THEN BEGIN Recursão(a); END; WRITE(a); END; BEGIN Recursão(5); END.
Exemplo : Construir uma UNIT que contenha uma sub-Rotina para escrever uma STRING qualquer em uma determinada linha e coluna na tela do computador.
UNIT tela; INTERFACE PROCEDURE Escreve_Str( linha, coluna : BYTE; Texto : STRING); IMPLEMENTATION USES CRT; PROCEDURE Escreve_Str( linha, coluna : BYTE; texto : STRING); BEGIN GOTOXY(coluna, linha); WRITE(texto); END; END.
Como complementação do Exemplo vamos construir um pequeno programa que use a sub- Rotina definida acima:
PROGRAM Testa_Unit; USES Tela; BEGIN Escreve_Str(10, 10, ‘Teste de Unit’); END;
1 - Construi UNITs para: Definir constantes com os códigos das cores/tonalidades possíveis em uma tela tipo texto Definir constantes com os códigos das teclas especiais como PgUp, PgDn, Setas, Esc etc. Definir constantes com os códigos de programação dos caracteres de uma impressora Definir constantes com os caracteres da tabela ASCII necessários para criação de moldura
2 - Monte uma UNIT que contenha Rotinas para gerenciamento de tela tipo texto com montagens de molduras, efeitos de sombreamento de janelas, subRotinas que permitam salvar/restaurar a tela tipo texto, sub-Rotinas para pintar uma região da tela (X1, Y1, X2, Y2) com uma determinada cor/tonalidade etc.
3 - Monte uma UNIT que contenha sub-Rotinas para montagem de menus de barra horizontais, verticais e matriciais, sub-Rotinas que permitam realizar a edição de campos, podendo ser definido o tamanho do campo a ser editado, usando teclas tipo setas, Esc, Backspace, Insert/ OverWrite, sub-Rotinas que façam a centralização de STRING’s dentro de determinadas coordenadas(X1,X2,Y1,Y2) do vídeo etc.
9. 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: estas , ou são fornecidas pelo teclado, o que atualmente torna-se inviável, ou são fornecidos através de um arquivo.
O PASCAL, possui dois tipos de arquivos, os quais são:
Um arquivo do tipo FILE , também conhecido por arquivo randômico, ou de acesso aleatório, é o arquivo mais importante do Pascal, sendo desta forma também o mais utilizado. Um arquivo randômico é 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. Sintaxe : <Nome da variável> : FILE OF
Observação: Um arquivo FILE deve ser apenas um tipo de dado, ou seja : INTEGER, REAL, RECORD, STRING, BYTE, etc. Exemplo : Crie um programa que defina uma variável como sendo um arquivo FILE de STRING’s, crie também neste mesmo programa um tipo Arquivo de INTEGERs.
PROGRAM Exemplo ; TYPE Meu_tipo = FILE OF INTEGER; VAR Minha_Variável = FILE OF STRING; BEGIN END.
Estrutura Interna do Arquivo:
Quando um arquivo FILE é criado, o mesmo possui a seguinte estrutura:
Posição Física Informação 0 1 2 … N
A posição física corresponde a um número que é gerado automaticamente no instante que uma informação qualquer é incluída no arquivo. Este número, corresponde ao “Endereço” da informação no arquivo, sendo que é através deste Endereço que é possível recuperar qualquer informação, sem precisar percorrer todo o arquivo em busca da mesma, ao invés disto basta fornecer o número da posição física da informação no arquivo. Observação: Passaremos daqui por diante a chamar as informações armazenadas em um arquivo de “Registros”.
Sub-Rotinas para Tratamento de Arquivos FILES
Existem uma grande quantidade de sub-Rotinas construídas especialmente para manipular arquivos FILE. Iremos neste curso mostrar as principais.
Rotina : RESET() Função : Abre para E/S um arquivo que já exista. Caso o arquivo não exista ocorrerá um erro de execução e o programa será abortado. Sintaxe : RESET(Meu_Arquivo) Exemplo : PROGRAM Teste; TYPE Registro = RECORD Nome : STRING; Idade : BYTE; END; VAR Arquivo : FILE OF Registro; BEGIN ASSIGN (Arquivo, ’Dados.Dat’); RESET (Arquivo); END.
Rotina : CLOSE() Função : Fecha um arquivo que tenha sido aberto com RESET\REWRITE. Sintaxe : CLOSE(Meu_Arquivo) Exemplo : PROGRAM Teste; TYPE Registro = RECORD Nome : STRING; Idade : BYTE; END; VAR Arquivo : FILE OF Registro; BEGIN ASSIGN (Arquivo, ’Dados.Dat’); REWRITE (Arquivo); CLOSE (Arquivo); END.
Rotina : WRITE() Função : A Rotina WRITE tem a mesma Função de saída de informações como até agora já tínhamos trabalhado, somente que ao invés da informação ser apresentada no vídeo, a mesma será armazenada em um arquivo. Sintaxe : WRITE (Meu_Arquivo, Registro) Exemplo : PROGRAM Teste; TYPE Registro = RECORD Nome : STRING; Idade : BYTE; END; VAR Arquivo : FILE OF Registro; Reg : Registro; BEGIN ASSIGN (Arquivo, ‘Dados.Dat’); REWRITE (Arquivo); WRITE (‘Digite o Nome: ‘); READ (Reg.Nome); WRITE (‘Digite a Idade: ‘); READ (Reg.Idade); WRITE (Arquivo, Reg); CLOSE (Arquivo); END.
Rotina : READ() Função : A Rotina READ tem a mesma Função de entrada de informações como até agora já tínhamos trabalhado, somente que ao invés da leitura ser feita pelo teclado, a mesma será feita de um arquivo. Sintaxe : READ (Meu_Arquivo, Registro) Exemplo : PROGRAM Teste; TYPE Registro = RECORD Nome : STRING; Idade : BYTE; END; VAR Arquivo : FILE OF Registro; Reg : Registro; BEGIN ASSIGN (Arquivo, ‘Dados.Dat’); RESET (Arquivo); READ (Arquivo); WRITE (‘Nome = ‘, Reg.Nome); WRITE (‘Idade = ‘, Reg.Idade); CLOSE (Arquivo); END.
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.
Rotina : SEEK () Função : Posiciona o ponteiro do arquivo em um registro determinado, para que o mesmo possa ser processado. Sintaxe : SEEK(Meu_Arquivo, Endereço_Registro) Exemplo : PROGRAM Teste; TYPE Registro = RECORD Nome : STRING; Idade : BYTE; END; VAR Arquivo : FILE OF Registro; Reg : Registro; BEGIN ASSIGN (Arquivo, ‘Dados.Dat’); RESET (Arquivo); SEEK (Arquivo, 10); READ (Arquivo, Reg); WRITE (‘Nome = ‘, Reg.Nome); WRITE (‘Idade = ‘, Reg.Idade); CLOSE (Arquivo); END.
Rotina : EOF() Função : Retorna TRUE caso se alcance o final do arquivo, FALSE caso contrário. Sintaxe : Chegou_Final : = EOF (Meu_Arquivo) Exemplo :
PROGRAM Teste; TYPE Registro = RECORD Nome : STRING; Idade : BYTE; END; VAR Arquivo : FILE OF Registro; Reg : Registro; BEGIN ASSIGN (Arquivo, ‘Dados.Dat’); RESET (Arquivo); WHILE NOT EOF(Arquivo) DO BEGIN READ (Arquivo, Reg); WRITE (‘Nome = ‘, Reg.Nome); WRITE (‘Idade = ‘, Reg.Idade); END; CLOSE (Arquivo); END.