Sintaxe:
<identificador_variável>:= <expressão>;
Exemplos:
idade:=20;
nome:='João';
Sintaxe:
write <ou> writeln ('<string>', <variável>);
Exemplos:
write ('Bom dia');
write ('Data');
O que será impresso na tela:
writeln ('Bom dia');
writeln ('Data');
O que será impesso na tela:
Sintaxe:
read <ou> readln (<variáveis>);
Exemplos:
read (nota1,nota2,nota3);
Exercícios
Tente fazer os exercícios, depois veja uma das soluções mais abaixo na página.
1) Faça um programa para calcular a média de cinco alunos.
2) Faça um programa que dados os valores de A, B, C calcule as duas raízes de uma equação genérica: Ax2 + Bx + C.
2) Faça um programa que dados os valores de A, B, C calcule as duas raízes de uma equação genérica: Ax2 + Bx + C.
Resolução
1)
PROGRAM Media_Alunos;
Var
n1,n2,n3,n4,n5,media: real;
Begin
writeln('Digite as 5 notas dos alunos');
read(n1,n2,n3,n4,n5);
media:=(n1+n2+n3+n4+n5)/5;
writeln('Sua media eh=',media);
End.
PROGRAM Media_Alunos;
Var
n1,n2,n3,n4,n5,media: real;
Begin
writeln('Digite as 5 notas dos alunos');
read(n1,n2,n3,n4,n5);
media:=(n1+n2+n3+n4+n5)/5;
writeln('Sua media eh=',media);
End.
2)
PROGRAM Raizes;
PROGRAM Raizes;
Var
a,b,c,x1,x2:real;
Begin
writeln('Digite os respectivos A,B e C:');
read(a,b,c);
x1:=(-b+sqrt(sqr(b)-4*a*c))/2*a;
x2:=(-b-sqrt(sqr(b)-4*a*c))/2*a;
writeln('As duas raízes sao:',x1,'e ',x2);
End.
a,b,c,x1,x2:real;
Begin
writeln('Digite os respectivos A,B e C:');
read(a,b,c);
x1:=(-b+sqrt(sqr(b)-4*a*c))/2*a;
x2:=(-b-sqrt(sqr(b)-4*a*c))/2*a;
writeln('As duas raízes sao:',x1,'e ',x2);
End.
Regra de Precedência de Operadores
Para o desenvolvimento de programas em Pascal é importante
saber quais são as regras de precedência de operadores,
ou seja, qual operação será executada primeiro.
Veja a tabela abaixo:
1º precedência | <><> ><>>NOT (operador lógico) | <><> ><>>
2º precedência | <><> ><>>*,/,DIV,MOD (operações) AND (operador lógico) | <><> ><>>
3º precedência | <><> ><>>+,- (operações) OR (operador lógico) | <><> ><>>
4º precedência | <><> ><>>>,>=,<,<=,= (operadores relacionais) | <><> ><>>
Sintaxe:
if <condição>
then begin
<comando ou bloco>
end
else begin
<comando ou bloco>;
end;
Exemplos:
readln(idade);
if idade>=18
then writeln ('A pessoa é maior de idade')
else writeln ('A pessoa é considerada menor');
CASE
Este comando consiste de uma expressão (o seletor) e uma lista de comandos. Ou seja, caso o valor de uma variável for igual ao que uma lista de alternativas testa, então o comando desta variável será executado. Depois da execução o controle vai para o próximo comando após o CASE. Se não existir nenhum rótulo que satisfaça essa condição, o efeito do comando fica indefinido. O seletor deve ser de tipo escalar (integer ou char, exceto real).
Sintaxe:
case <expressão> of
<lista de rótulos do case> : <comandos>;
end;
Exemplo:
case codigo of
0: a:=0;
1: a:=succ(a);
2: begin
a:=ln(a);
writeln('Foi feito o logaritmo natural');
end;
3: a:= exp(a);
else a:=1;
Este comando consiste de uma expressão (o seletor) e uma lista de comandos. Ou seja, caso o valor de uma variável for igual ao que uma lista de alternativas testa, então o comando desta variável será executado. Depois da execução o controle vai para o próximo comando após o CASE. Se não existir nenhum rótulo que satisfaça essa condição, o efeito do comando fica indefinido. O seletor deve ser de tipo escalar (integer ou char, exceto real).
Sintaxe:
case <expressão> of
<lista de rótulos do case> : <comandos>;
end;
Exemplo:
case codigo of
0: a:=0;
1: a:=succ(a);
2: begin
a:=ln(a);
writeln('Foi feito o logaritmo natural');
end;
3: a:= exp(a);
else a:=1;
Exercícios
Tente fazer os exercícios, depois veja uma das soluções mais abaixo na página.
1) Tendo como dados de entrada a altura e o sexo de uma pessoa, construa um programa que calcule o seu peso ideal. Utilize a seguinte convenção:
Homens correspondem ao número 1,
Mulheres correspondem ao número 2.
Peso ideal para homens é dado por: 72,7 *altura-58,
Peso ideal para mulheres é dado por: 62,1*altura-44,7.
2) Elabore um programa que recebe a idade de um nadador. O programa deve classificar o nadador em uma das categorias abaixo:
Infantil A= de 5 a 7 anos,
Infantil B= de 8 a 10 anos,
Juvenil A= de 11 a 13 anos,
Juvenil B= de 14 a 17 anos,
Senior= maiores de 18 anos.
3) Fazer um programa que imprime na tela a situação do aluano após a sua nota ser digitada. Usar o comando CASE. Baseie-se na tabela abaixo:
Homens correspondem ao número 1,
Mulheres correspondem ao número 2.
Peso ideal para homens é dado por: 72,7 *altura-58,
Peso ideal para mulheres é dado por: 62,1*altura-44,7.
2) Elabore um programa que recebe a idade de um nadador. O programa deve classificar o nadador em uma das categorias abaixo:
Infantil A= de 5 a 7 anos,
Infantil B= de 8 a 10 anos,
Juvenil A= de 11 a 13 anos,
Juvenil B= de 14 a 17 anos,
Senior= maiores de 18 anos.
3) Fazer um programa que imprime na tela a situação do aluano após a sua nota ser digitada. Usar o comando CASE. Baseie-se na tabela abaixo:
Nota | <><> ><>>Situação | <><> ><>>
de 1 a 2 | <><> ><>>Nota péssima | <><> ><>>
de 3 a 4 | <><> ><>>Nota ruim | <><> ><>>
de 5 a 6 | <><> ><>>Nota pouco ruim | <><> ><>>
7 | <><> ><>>Nota boa | <><> ><>>
8 a 9 | <><> ><>>Nota muito boa | <><> ><>>
10 | <><> ><>>Nota excelente | <><> ><>>
4) DESAFIO I: Construa um programa capaz de concluir qual dentre os animais seguintes foi escolhido, através de perguntas e respostas. Animais possíveis: leão, cavalo, homem, macaco, morcego, baleia, avestruz, pinguim, águia, tartaruga, crocodilo e cobra. obs.: nesta página não contém resolução deste exercício, qualquer dúvida procure o professor ou monitor da disciplina.
Exemplo:
É mamífero? Sim.
É quadrupede? Sim.
É carnívoro? Não.
É herbívoro? Sim.
Então o animal escolhido foi o cavalo.
Exemplo:
É mamífero? Sim.
É quadrupede? Sim.
É carnívoro? Não.
É herbívoro? Sim.
Então o animal escolhido foi o cavalo.
Utilize a seguinte classificação:
5) DESAFIO II: Faça o mesmo programa do exercício anterior ultilizando o comando CASE! Dê cógios para cada tipo! Por exemplo: Mamífero (código 01), Aves (código 02), Quadrúpede (código 04) .... Lembre-se que esta pesquisa tem que partir do mais genérico e chegar ao mais expecífico (o animal). Você terá que fazer mais de um teste no CASE !! obs.: nesta página não contém resolução deste exercício, qualquer dúvida procure o professor ou monitor da disciplina.
Resolução
1)
PROGRAM Peso_Ideal;
Var
peso,altura:real;
sexo:integer;
Begin
writeln('Digite 1 se você é homem, digite 2 se você é mulher');
read(sexo);
writeln('Qual a sua altura em metros?');
read(altura);
if sexo=1
then peso:=72.7*altura-58
else peso:=62.1*altura-44.7;
writeln('Seu peso ideal eh:',peso);
End.
2)
PROGRAM Nadador;
Var
idade:integer;
Begin
writeln('Digite a sua idade');
read(idade);
if idade<18
then begin
if idade>13
then writeln('Sua categoria eh Juvenil B')
else begin
if idade>10
then writeln('Sua categoria eh Juvenil A')
else begin
if idade>7
then writeln('Sua categoria eh Infantil B')
else begin
if (idade>=5) or (idade<8)
then writeln ('Infantil A')
else writeln ('Sem categoria');
end
end
end
end
else writeln('Categoria Senior');
End.
3)
Program Nota;
Var
nota: integer;
Begin
writeln('Digite sua nota:');
readln(nota);
Case nota of
0..2: writeln('Nota péssima');
3..4: writeln('Nota ruim');
5..6: writeln('Nota pouco ruim');
7: writeln('Nota boa');
8..9: writeln('Nota muito boa');
10: writeln('Nota excelente!!');
else writeln ('Nota inválida');
end;
end.
PROGRAM Peso_Ideal;
Var
peso,altura:real;
sexo:integer;
Begin
writeln('Digite 1 se você é homem, digite 2 se você é mulher');
read(sexo);
writeln('Qual a sua altura em metros?');
read(altura);
if sexo=1
then peso:=72.7*altura-58
else peso:=62.1*altura-44.7;
writeln('Seu peso ideal eh:',peso);
End.
2)
PROGRAM Nadador;
Var
idade:integer;
Begin
writeln('Digite a sua idade');
read(idade);
if idade<18
then begin
if idade>13
then writeln('Sua categoria eh Juvenil B')
else begin
if idade>10
then writeln('Sua categoria eh Juvenil A')
else begin
if idade>7
then writeln('Sua categoria eh Infantil B')
else begin
if (idade>=5) or (idade<8)
then writeln ('Infantil A')
else writeln ('Sem categoria');
end
end
end
end
else writeln('Categoria Senior');
End.
3)
Program Nota;
Var
nota: integer;
Begin
writeln('Digite sua nota:');
readln(nota);
Case nota of
0..2: writeln('Nota péssima');
3..4: writeln('Nota ruim');
5..6: writeln('Nota pouco ruim');
7: writeln('Nota boa');
8..9: writeln('Nota muito boa');
10: writeln('Nota excelente!!');
else writeln ('Nota inválida');
end;
end.
WHILE
Sintaxe:
while (<condição>) do
begin
<comandos>;
end
REPEAT
Sintaxe:
repeat
<comandos>;
until (<condição>);
FOR
Sintaxe:
for(<variável>:=<valor_inicial> to <valor_final>) do
begin
<comandos>;
end
OBS.: "TO" incrementa(+1) um-a-um e "DOWNTO" decrementa(-1) um-a-um.
Exercícios
Tente fazer os exercícios, depois veja uma das soluções mais abaixo na página.
1) Construir um programa em Pascal que calcule a média de vários valores inteiros positivos, lidos externamente. O final da leitura acontecerá quando for lido um valor negativo.
2) Escrever um programa que leia uma quantidade desconhecida de números e conte quantos deles estão nos seguintes intervalos: (0 a 25), (26 a 50), (51 a 75), (76 a 100). A entrada de dados deve terminar quando for lido um número negativo.
3) Escrever um programa que leia um número N que indica quantos valores devem ser lidos a seguir. Para cada número lido mostre, como resultado, o valor lido e o fatorial deste valor.
4) Escreva um programa que lê dois números N1 e N2. Como resultado, calcule quantos números ímpares existem entre N1 e N2. Supor que N1 e N2 não entram no cálculo.
5) Fulano tem 1,50 metros e cresce 2 cm por ano, enquanto Ciclano tem 1,10 metros e cresce 3 cm por ano. Construa um programa que calcule e imprima quantos anos serão necessários para que Ciclano seja maior que Fulano.
2) Escrever um programa que leia uma quantidade desconhecida de números e conte quantos deles estão nos seguintes intervalos: (0 a 25), (26 a 50), (51 a 75), (76 a 100). A entrada de dados deve terminar quando for lido um número negativo.
3) Escrever um programa que leia um número N que indica quantos valores devem ser lidos a seguir. Para cada número lido mostre, como resultado, o valor lido e o fatorial deste valor.
4) Escreva um programa que lê dois números N1 e N2. Como resultado, calcule quantos números ímpares existem entre N1 e N2. Supor que N1 e N2 não entram no cálculo.
5) Fulano tem 1,50 metros e cresce 2 cm por ano, enquanto Ciclano tem 1,10 metros e cresce 3 cm por ano. Construa um programa que calcule e imprima quantos anos serão necessários para que Ciclano seja maior que Fulano.
Resolução
1)
PROGRAM MEDIA;
Var
valor,cont:integer;
soma:real;
Begin
soma:=0;
cont:=0;
writeln('Digite um valor positivo(negativo pra terminar)');
read(valor);
while(valor>=0)do
begin
soma:=soma+valor;
cont:=cont+1;
writeln('Digite um valor positivo(neg.para terminar)');
read(valor);
end;
if cont>0
then writeln('Media=',soma/cont)
else writeln('Nenhum valor positivo foi digitado');
End.
2)
PROGRAM INTERVALOS;
Var
valor,interv1,interv2,interv3,interv4:integer;
Begin
interv1:=0;
interv2:=0;
interv3:=0;
interv4:=0;
writeln('Digite um valor positivo(neg. para terminar)');
read(valor);
while(valor>=0)do
begin
if valor<=25
then interv1:=interv1+1
else begin
if valor<=50
then interv2:=interv2+1
else begin
if valor<=75
then interv3:=interv3+1
else begin
if valor<=100
then interv4:=interv4+1;
end
end
end;
writeln('Digite um valor positivo(neg. para terminar)');
read(valor);
end;
writeln('(0-25):',interv1,',(26-50):',interv2,',(51-75):',interv3,',(76-100):',interv4);
End.
3)
PROGRAM FATORIAL;
Var
n,valor,cont,cont2,fatorial:integer;
Begin
writeln('Quantos numeros devem ser lidos?');
read(n);
for cont:=1 to n do
begin
writeln('Digite o número');
read(valor);
while(valor<0) do
begin
writeln('Nao exite fatorial de nr. negativo');
writeln('Digite o número');
read(valor);
end;
fatorial:=1;
if valor>1
then begin
for cont2:=valor downto 1 do
begin
fatorial:=fatorial*cont2;
end;
end;
writeln(fatorial);
end;
End.
4)versão otimizada
PROGRAM IMPAR;
Var
n1,n2,cont,qto_imp,aux:integer;
Begin
qto_imp:=0;
writeln('Digite os nrs.');
read(n1,n2);
if n1>n2
then begin
aux:=n1;
n1:=n2;
n2:=aux;
end;
if (n1 mod 2)=1
then n1:=n1+2
else n1:=n1+1;
cont:=n1;
while(cont<n2) do
begin
cont:=cont+2;
qto_imp:=qto_imp+1;
end;
writeln('Quantidade de impares:',qto_imp);
End.
5)
PROGRAM ALTURA;
Var
anos,altful,altci:integer;
Begin
altful:=150;
altci:=110;
anos:=0;
while(altful>=altci)do
begin
altful:=altful+2;
altci:=altci+3;
anos:=anos+1;
end;
writeln('Anos necessarios:',anos);
End.
PROGRAM MEDIA;
Var
valor,cont:integer;
soma:real;
Begin
soma:=0;
cont:=0;
writeln('Digite um valor positivo(negativo pra terminar)');
read(valor);
while(valor>=0)do
begin
soma:=soma+valor;
cont:=cont+1;
writeln('Digite um valor positivo(neg.para terminar)');
read(valor);
end;
if cont>0
then writeln('Media=',soma/cont)
else writeln('Nenhum valor positivo foi digitado');
End.
2)
PROGRAM INTERVALOS;
Var
valor,interv1,interv2,interv3,interv4:integer;
Begin
interv1:=0;
interv2:=0;
interv3:=0;
interv4:=0;
writeln('Digite um valor positivo(neg. para terminar)');
read(valor);
while(valor>=0)do
begin
if valor<=25
then interv1:=interv1+1
else begin
if valor<=50
then interv2:=interv2+1
else begin
if valor<=75
then interv3:=interv3+1
else begin
if valor<=100
then interv4:=interv4+1;
end
end
end;
writeln('Digite um valor positivo(neg. para terminar)');
read(valor);
end;
writeln('(0-25):',interv1,',(26-50):',interv2,',(51-75):',interv3,',(76-100):',interv4);
End.
3)
PROGRAM FATORIAL;
Var
n,valor,cont,cont2,fatorial:integer;
Begin
writeln('Quantos numeros devem ser lidos?');
read(n);
for cont:=1 to n do
begin
writeln('Digite o número');
read(valor);
while(valor<0) do
begin
writeln('Nao exite fatorial de nr. negativo');
writeln('Digite o número');
read(valor);
end;
fatorial:=1;
if valor>1
then begin
for cont2:=valor downto 1 do
begin
fatorial:=fatorial*cont2;
end;
end;
writeln(fatorial);
end;
End.
4)versão otimizada
PROGRAM IMPAR;
Var
n1,n2,cont,qto_imp,aux:integer;
Begin
qto_imp:=0;
writeln('Digite os nrs.');
read(n1,n2);
if n1>n2
then begin
aux:=n1;
n1:=n2;
n2:=aux;
end;
if (n1 mod 2)=1
then n1:=n1+2
else n1:=n1+1;
cont:=n1;
while(cont<n2) do
begin
cont:=cont+2;
qto_imp:=qto_imp+1;
end;
writeln('Quantidade de impares:',qto_imp);
End.
5)
PROGRAM ALTURA;
Var
anos,altful,altci:integer;
Begin
altful:=150;
altci:=110;
anos:=0;
while(altful>=altci)do
begin
altful:=altful+2;
altci:=altci+3;
anos:=anos+1;
end;
writeln('Anos necessarios:',anos);
End.
Como fazer consistência de dados?
Sempre quando programamos devemos estar seguros de que
os dados introduzidos em nosso software satisfaçam uma
determinada condição. Logo, consitência de dados nada
mais é do que "obrigar" o usuário a digitar, inserir
valores corretos para que atinjam um determinado
fim na execução do programa.
Por exemplo:(vamos pegar uma parte de um programa)
...
writeln(`Digite o numerador`);
readln(num);
repeat
writeln(`Digite o denominador`);
readln(deno);
until (deno<>0);
resultado:=num/deno;
...
Assim nos asseguramos de que o valor de "deno" nunca será "0".
Poderíamos usar outra maneira...
Por exemplo:
...
writeln(`Digite o numerador`);
readln(num);
deno:=0; {fizemos isto para o valor de "deno" entrar no "while", mas depois ele será mudado}
while(deno=0) do
begin
writeln(`Digite o denominador`);
readln(deno);
end;
resultado:=num/deno;
...
...
writeln(`Digite o numerador`);
readln(num);
repeat
writeln(`Digite o denominador`);
readln(deno);
until (deno<>0);
resultado:=num/deno;
...
Assim nos asseguramos de que o valor de "deno" nunca será "0".
Poderíamos usar outra maneira...
Por exemplo:
...
writeln(`Digite o numerador`);
readln(num);
deno:=0; {fizemos isto para o valor de "deno" entrar no "while", mas depois ele será mudado}
while(deno=0) do
begin
writeln(`Digite o denominador`);
readln(deno);
end;
resultado:=num/deno;
...
Exercício
Tente fazer o exercício, depois veja uma das soluções mais abaixo na página.
1) Escrever um programa que imprime "Acertou" na tela se depois de dois valores digitados pelo usuário, o primeiro deve ser igual a 5 ou o segundo deve ser igual a 10.
Resolução
1)
Program Consistencia;
Var
x,y:integer;
Begin
repeat
writeln('Digite o primeiro numero');
readln(x);
writeln('Digite o segundo número');
readln(y);
until(x<>5)or(y<>10);
writeln('Acertou!!');
end.
Program Consistencia;
Var
x,y:integer;
Begin
repeat
writeln('Digite o primeiro numero');
readln(x);
writeln('Digite o segundo número');
readln(y);
until(x<>5)or(y<>10);
writeln('Acertou!!');
end.
Funções e Prodedimentos
Subprogramas
Em PASCAL podemos definir blocos de execução internos a um programa, chamados subprogramas. Cada bloco executa uma tarefa deternimada. Isto favorece a legibilidade e manutenção do programa, além de auxiliar no domínio da complexidade quando definimos o programa, já que podemos tratar partes do problema de forma isolada. Subprogramas têm parâmetros que podem ser de entrada, saída, ou ambos.
Há dois tipos de subprogramas em Pascal: os procedimentos (PROCEDURES) e as funções (FUNCTIONS).
Há dois tipos de subprogramas em Pascal: os procedimentos (PROCEDURES) e as funções (FUNCTIONS).
Diferenças entre Funções e Procedimentos
1. As funções são avaliadas e retornam um valor ao programa que as chama, além dos possíveis parâmetros de saída.
2. Um procedimento não retorna valor nenhum, a função obrigatoriamente retorna um valor a uma determinada variável.
3. Uma função é ativada quando é avaliada uma expressão que a contém, isto é, as funções são utilizadas da mesma forma que as funções predefinidas, como SQR, ORD, LN etc.
4. Um procedimento é ativado através de um comando de chamada do procedimento.
2. Um procedimento não retorna valor nenhum, a função obrigatoriamente retorna um valor a uma determinada variável.
3. Uma função é ativada quando é avaliada uma expressão que a contém, isto é, as funções são utilizadas da mesma forma que as funções predefinidas, como SQR, ORD, LN etc.
4. Um procedimento é ativado através de um comando de chamada do procedimento.
Escopo
- Variáveis Globais: São as variáveis declaradas no programa que são conhecidas em todo programa e inclusive nos subprogramas contidos nele.
- Variáveis Locais: São as variáveis declaradas em um subprograma, que são conhecidas em todo o subprograma, mas não no programa que contém o subprograma. Caso um subprograma contenha a definição de um outro subprograma (chamemos de "subsubprograma), as variáveis declaradas no programa e no subprobrama serão visïveis no subsubprograma, mas o contrário não é verdadeiro. No escopo do programa nao podemos chamar o subsubprograma, assim como não podemos acessar as variáveis do subprograma.
- Uso de mesmos nomes: se um subprograma definir nomes de variáveis iguais ao do programa principal, ao referenciar uma variável vale a do escopo local.
Parâmetros
No cabeçalho de um subprograma (Funções ou procedimentos) definimos que tipo de dados que serão passados como parâmetros. Há duas formas de passagem de parâmetros de um programa para um subprograma: passagem por valor ou passagem por referência.
- Passagem por valor: o parâmetro formal comporta-se como uma variável local do subprograma, de maneira que as alterações feitas nessa variável dentro do subprograma não tenham efeito sobre o parâmetro real, que pertence ao programa que fez a chamada. Assim, o subprograma só utiliza o valor da variável para um determindao fim, tendo o poder de alterá-la só dentro do subprograma, depois da execução desse subprograma, a variável volta a ter o valor que tinha antes da execução do subprograma.
- Passagem por referência: o parâmetro formal comporta-se como se fosse uma variável global, e todas as alterações feitas nesta variável são feitas efetivamente no parâmetro real. Assim, a variável pode ser alterada pelo subprograma e continuar com o valor alterado.
Sintaxe:
Na lista de parâmetros podemos usar as seguintes formas para passagem por valor:
<nome da funcao ou procedimento> ( i,j,k: integer; y: real; z: boolean);
<nome da funcao ou procedimento> ( i: integer; j: integer; k: integer; y: real; z: boolean);
Para parâmetros por referência deve-se utilizar "var" no cabeçalho. Por exemplo para passagem de j.k e z por referência:
<nome da funcao ou procedimento> ( i:integer; VAR j,k: integer; y: real; VAR z: boolean);
<nome da funcao ou procedimento> ( i: integer; VAR j: integer; VAR k: integer; y: real; VAR z: boolean);
- Passagem por valor: o parâmetro formal comporta-se como uma variável local do subprograma, de maneira que as alterações feitas nessa variável dentro do subprograma não tenham efeito sobre o parâmetro real, que pertence ao programa que fez a chamada. Assim, o subprograma só utiliza o valor da variável para um determindao fim, tendo o poder de alterá-la só dentro do subprograma, depois da execução desse subprograma, a variável volta a ter o valor que tinha antes da execução do subprograma.
- Passagem por referência: o parâmetro formal comporta-se como se fosse uma variável global, e todas as alterações feitas nesta variável são feitas efetivamente no parâmetro real. Assim, a variável pode ser alterada pelo subprograma e continuar com o valor alterado.
Sintaxe:
Na lista de parâmetros podemos usar as seguintes formas para passagem por valor:
<nome da funcao ou procedimento> ( i,j,k: integer; y: real; z: boolean);
<nome da funcao ou procedimento> ( i: integer; j: integer; k: integer; y: real; z: boolean);
Para parâmetros por referência deve-se utilizar "var" no cabeçalho. Por exemplo para passagem de j.k e z por referência:
<nome da funcao ou procedimento> ( i:integer; VAR j,k: integer; y: real; VAR z: boolean);
<nome da funcao ou procedimento> ( i: integer; VAR j: integer; VAR k: integer; y: real; VAR z: boolean);
FUNCTIONS
Cabeçalho:
FUNCTION <nome da função> (<lista de parâmetros>): <tipo da função>;
Exemplo:
FUNCTION Maximo(a,b:integer):integer;
"a" e "b" são parâmetros que serao passados "por valor" à função Maximo. Após o término de da função e os valores destes parâmetros não estarão alterados.
Máximo é o identificador da função e da variável que deve conter o valor fornecido pela função. Máximo também é do tipo inteiro.
Essa função é ativada através de uma expressão. Por exemplo:
K:=Maximo(P1,P2) + Maximo (P3,P4);
onde P1, P2, P3, P4 são variáveis globais do tipo inteiro. E "K" é uma variável do tipo inteiro que recebe a soma das duas funções.
FUNCTION <nome da função> (<lista de parâmetros>): <tipo da função>;
Exemplo:
FUNCTION Maximo(a,b:integer):integer;
"a" e "b" são parâmetros que serao passados "por valor" à função Maximo. Após o término de da função e os valores destes parâmetros não estarão alterados.
Máximo é o identificador da função e da variável que deve conter o valor fornecido pela função. Máximo também é do tipo inteiro.
Essa função é ativada através de uma expressão. Por exemplo:
K:=Maximo(P1,P2) + Maximo (P3,P4);
onde P1, P2, P3, P4 são variáveis globais do tipo inteiro. E "K" é uma variável do tipo inteiro que recebe a soma das duas funções.
PROCEDURES
Cabeçalho:
PROCEDURE <nome do procedimento>(<lista de parâmetros>);
Exemplo:
PROCEDURE Estatistica (VAR media: real; VAR s,m: real; ka: integer);
Os parâmetros formais são media, s, m e ka. O parâmetro media e as variáveis s e m são do tipo real, e ka é do tipo inteiro. O parâmetro ka é o único parâmetro com passagem por valor.
Esse procedimento pode ser chamados por comandos como:
Estatistica(lista,desvio,sol,n); ou
Estatistica(aula,numero1,numero2,denominador);
PROCEDURE <nome do procedimento>(<lista de parâmetros>);
Exemplo:
PROCEDURE Estatistica (VAR media: real; VAR s,m: real; ka: integer);
Os parâmetros formais são media, s, m e ka. O parâmetro media e as variáveis s e m são do tipo real, e ka é do tipo inteiro. O parâmetro ka é o único parâmetro com passagem por valor.
Esse procedimento pode ser chamados por comandos como:
Estatistica(lista,desvio,sol,n); ou
Estatistica(aula,numero1,numero2,denominador);
Exercícios
Tente fazer os exercícios, depois veja uma das soluções mais abaixo na página.
1) Faça um subprograma para verificar se um ano é bissexto ou não. Utilize a regra: Um ano bissexto é divisível por 4, mas não por 100, ou então se é divisível por 400.
Exemplo: 1988 é bissexto pois é divisível por 4 e não é por 100; 2000 é bissexto porque é divisível por 400.
2) Faça uma função que recebe um número inteiro por parâmetro e retorna verdadeiro se ele for par e falso se for ímpar.
3) Faça um programa que tem duas variáveis globais inicializadas com 0: número e seu precentual (21% do valor do número). Faça um programa que lê este número, envia como parâmetros o número e seu percentual, e através de um procedimento calcula este novo percentual, e retorna alterado este percentual ao programa principal para depois imprimí-lo.
Exemplo: 1988 é bissexto pois é divisível por 4 e não é por 100; 2000 é bissexto porque é divisível por 400.
2) Faça uma função que recebe um número inteiro por parâmetro e retorna verdadeiro se ele for par e falso se for ímpar.
3) Faça um programa que tem duas variáveis globais inicializadas com 0: número e seu precentual (21% do valor do número). Faça um programa que lê este número, envia como parâmetros o número e seu percentual, e através de um procedimento calcula este novo percentual, e retorna alterado este percentual ao programa principal para depois imprimí-lo.
Resolução
1)
FUNCTION bissexto (a:integer) : boolean;
Begin
if ((a mod 4 = 0) and (a mod 100<>0)) or (a mod 400 = 0)
then bissexto:= TRUE
else bissexto:= FALSE;
End;
2)
FUNCTION par (numero:integer):boolean;
Begin
if (numero mod 2)=0
then par:= TRUE
else par:= FALSE;
End;
3)
PROGRAM TERCEIRO;
Var
numero,percentual:real;
PROCEDURE calcula_percentual (n1:real; VAR per1:real);
Begin
per1:=n1*(21/100);
end;
Begin
numero:=0;
percentual:=0;
writeln('Digite o número');
readln(numero);
calcula_percentual(numero,percentual);
writeln(percentual);
end.
FUNCTION bissexto (a:integer) : boolean;
Begin
if ((a mod 4 = 0) and (a mod 100<>0)) or (a mod 400 = 0)
then bissexto:= TRUE
else bissexto:= FALSE;
End;
2)
FUNCTION par (numero:integer):boolean;
Begin
if (numero mod 2)=0
then par:= TRUE
else par:= FALSE;
End;
3)
PROGRAM TERCEIRO;
Var
numero,percentual:real;
PROCEDURE calcula_percentual (n1:real; VAR per1:real);
Begin
per1:=n1*(21/100);
end;
Begin
numero:=0;
percentual:=0;
writeln('Digite o número');
readln(numero);
calcula_percentual(numero,percentual);
writeln(percentual);
end.
Recursividade
Um subprograma é recursivo quando se chama a si mesmo.
Veja no subprograma como é definida a função Fi:
Function Fi(t:integer):integer; Begin If t<=2 then Fi:=1 else Fi := Fi(t-2)+Fi(t-1); end; | <><> ><>>
Se o valor do parâmetro inteiro t for maior que 2, a função Fi é chamada, durante a própria execução, com outros valores. A função definida serve para determinar o n-ésimo termo da sequência de Fibonacci (1,1,2,3,5,8..). Por exemplo, se t inicialmente vale 10, a função Fi deve retornar o valor 55, que é o décimo termo da sequência.
O processo recursivo é baseado na recorrência válida para essa sequência: todo termo é igaul à soma dos dois termos anteriores. É importante que um programa recursivo deve ter obrigatoriamente uma condição que controla sua execução ou término, sob pena de produzir uma computação interminável. No exemplo, o término da execução da função ocorre quando o parâmetro t é menor ou igual a 2, como cada chamada de Fi diminui o valor de t, o término está garantido.
Um programa recursivo é mais elegante e menor que a sua versão iterativa, além de exibir com maior clareza o processo utilizado, desde que o problema ou dados sejam naturalmente definidos através da recorrência. Por outro lado, um programa recursivo exige mais espaço de memória e é mais lento do que a versão iterativa.
O processo recursivo é baseado na recorrência válida para essa sequência: todo termo é igaul à soma dos dois termos anteriores. É importante que um programa recursivo deve ter obrigatoriamente uma condição que controla sua execução ou término, sob pena de produzir uma computação interminável. No exemplo, o término da execução da função ocorre quando o parâmetro t é menor ou igual a 2, como cada chamada de Fi diminui o valor de t, o término está garantido.
Um programa recursivo é mais elegante e menor que a sua versão iterativa, além de exibir com maior clareza o processo utilizado, desde que o problema ou dados sejam naturalmente definidos através da recorrência. Por outro lado, um programa recursivo exige mais espaço de memória e é mais lento do que a versão iterativa.
Lista de Exercícios sobre Recursividade
Prof. Fernando Luís Dotti
1. Dada a definição de fatorial:
x! = x * (x-1)!
0! = 1
Faça uma função recursiva para o calculo do fatorial de números inteiros positivos.
Prof. Fernando Luís Dotti
1. Dada a definição de fatorial:
x! = x * (x-1)!
0! = 1
Faça uma função recursiva para o calculo do fatorial de números inteiros positivos.
2. Sendo
x ^ n = x * x ^ (n-1)
onde "^" significa elevar um número a uma potência,
faça uma função recursiva para o c lculo da potência. Assuma potência inteira positiva, e em uma
segunda versão considere também potências negativas.
x ^ n = x * x ^ (n-1)
onde "^" significa elevar um número a uma potência,
faça uma função recursiva para o c lculo da potência. Assuma potência inteira positiva, e em uma
segunda versão considere também potências negativas.
3. Dada a função X:
function X(n,m: integer): integer;
begin
if (n=m) or (m=0)
then x:=1;
else x:= x(n-1,m)+x(n-1,m+1)
end;
a) qual o valor de x(5,3) ?
b) quantas chamadas serao feitas na avaliação acima ?
function X(n,m: integer): integer;
begin
if (n=m) or (m=0)
then x:=1;
else x:= x(n-1,m)+x(n-1,m+1)
end;
a) qual o valor de x(5,3) ?
b) quantas chamadas serao feitas na avaliação acima ?
4. Dada a função abaixo:
function X(N:integer): integer;
begin
if (n >= 0) and (n <= 2) then x:=n
else x := x(n-1)+x(n-2)+x(n-3)
end;
a) quantas chamadas serao executadas para avaliar x(6) ?
b) indique a sequencia temporal destas chamadas.
function X(N:integer): integer;
begin
if (n >= 0) and (n <= 2) then x:=n
else x := x(n-1)+x(n-2)+x(n-3)
end;
a) quantas chamadas serao executadas para avaliar x(6) ?
b) indique a sequencia temporal destas chamadas.
5) Escreva uma função não recursiva para as seguintes funções:
a) Function f (i: integer) : integer;
begin
if i > 1
then f := i + f(i-1)
else f := 1
end;
b) Function f ( i: integer) : integer;
begin
if i=0
then f := 0
else if i=1
then i:=1
else f := f(i-1)+f(i-2)
end;
a) Function f (i: integer) : integer;
begin
if i > 1
then f := i + f(i-1)
else f := 1
end;
b) Function f ( i: integer) : integer;
begin
if i=0
then f := 0
else if i=1
then i:=1
else f := f(i-1)+f(i-2)
end;
OBS.: Alguns exercícios foram retirados do Livro: PASCAL e Técnicas de Programação, de Eber Assis Schmitz e Antônio Anibal de Souza Teles
Vetores e Matrizes
Conjuntos Homogênios
- Unidimensionais: Vetores
- Bidimensionais: Matrizes
VETOR
Sintaxe:
Sintaxe:
<nome array>: array [dimensão] of <tipo>;
Declaração e exemplo:
Var
vet:array[1..6] of integer;
Begin
vet[2]:=90;
vet[4]:=45;
vet[5]:=30;
end.
vet:array[1..6] of integer;
Begin
vet[2]:=90;
vet[4]:=45;
vet[5]:=30;
end.
Representação:
90 | <><> ><>>45 | <><> ><>>30 | <><> ><>><><> ><>> |
Exemplo 2:
Inclusão de 5 valores inteiros em um vetor, e depois disto emitir a soma dos mesmos.
program vet_soma; var v: array [1..5] of integer; soma,cont:integer; Begin soma:=0; writeln('digite os 5 valores'); for cont:=1 to 5 do readln(v[cont]); for cont:=1 to 5 do soma:=soma + v[cont]; writeln('Soma=',soma); end. | <><> ><>>
MATRIZ
Sintaxe:
Sintaxe:
<nome array>: array [dimensões] of <tipo>;
Declaração e exemplo:
Var
mat:array[1..5,1..3] of integer; {matriz 19x3}
Begin
mat[1,2]:=10;
mat[3,1]:=11;
mat[5,3]:=12;
mat[2,2]:=78;
end.
mat:array[1..5,1..3] of integer; {matriz 19x3}
Begin
mat[1,2]:=10;
mat[3,1]:=11;
mat[5,3]:=12;
mat[2,2]:=78;
end.
Representação:
mat[linha,coluna]
10 | <><> ><>>||
78 | <><> ><>>||
11 | <><> ><>>||
12 | <><> ><>>
Exemplo:
Ler 6 valores em uma matriz de 2 linhas e 3 colunas e depois disto emitir a soma dos valores.
program matriz; var m:array[1..2,1..3] of integer; soma,contl,contc:integer; Begin writeln('Digite os 6 valores'); soma:=0; for contl:=1 to 2 do for contc:=1 to 3 do readln(m[contl,contc]); for contl:=1 to 2 do for contc:=1 to 3 do soma:=soma + m[contl,contc]; writeln('Soma=',soma); end. | <><> ><>>
Exercícios
Tente fazer os exercícios, depois veja uma das soluções mais abaixo na página.
1) Fazer um programa que tem dois vetores do mesmo tamanho (6). O usuário fornecerá os dados do primeiro, e depois deverá ser armazenado e exibido o valor do segundo vetor que é o valor do primeiro vetor vezes a posição do elemento. Por exemplo:
vet1:
vet1:
80 | <><> ><>>28 | <><> ><>>35 | <><> ><>>44 | <><> ><>>35 | <><> ><>>16 | <><> ><>>
vet2:
80x1 | <><> ><>>28x2 | <><> ><>>35x3 | <><> ><>>44x4 | <><> ><>>35x5 | <><> ><>>16x6 | <><> ><>>
2) Leia 4 números, coloque-os em um vetor e mostre-os na ordem inversa de sua leitura.
3) Fazer um programa que lê 16 valores e armazene numa matriz. O programa deve mostrar esses números em ordem, levando primeiro em consideraçã a coluna e depois a linha. Logo, deve-se mostrar primeiro toda a primeira coluna e depois a segunda coluna. O programa não deve exibir os números que estão na diagonal principal da matriz.
DESAFIO I: Leia 20 números, deposite-os em um vetor e mostre os números pares lidos, e após, os números que estão nas posições pares.
DESAFIO II: Faça um programa que execute a leitura de números inteiros para completar uma matriz qualquer, sendo que o número de linhas e o número de colunas da mesma, serão parâmetros por valor, enquanto que a matriz será um parâmetro por referência.
DESAFIO II: Faça um programa que execute a leitura de números inteiros para completar uma matriz qualquer, sendo que o número de linhas e o número de colunas da mesma, serão parâmetros por valor, enquanto que a matriz será um parâmetro por referência.
Resolução
1)
program ex1;
var
vet,newvet:array[1..6] of integer;
pos:integer;
Begin
writeln('Digite os valores');
for pos:=1 to 6 do
readln(vet[pos]);
for pos:=1 to 6 do
begin
newvet[pos]:=vet[pos]*pos;
writeln('Na posicao ',pos,'teremos ',newvet[pos]);
end;
end.
2)
program ex2;
var
vet:array[1..4] of integer;
pos:integer;
Begin
writeln('Digite os valores');
for pos:=1 to 4 do
readln(vet[pos]);
writeln('Ordem inversa:');
for pos:=4 downto 1 do
writeln(vet[pos]);
end.
3)
program ex3;
var
vet:array[1..4,1..4] of integer;
posl,posc:integer;
Begin
writeln('Digite os valores');
for posl:=1 to 4 do
for posc:=1 to 4 do
readln(vet[posl,posc]);
for posc:=1 to 4 do
for posl:=1 to 4 do
if posl<>posc
then writeln(vet[posl,posc]);
end.
program ex1;
var
vet,newvet:array[1..6] of integer;
pos:integer;
Begin
writeln('Digite os valores');
for pos:=1 to 6 do
readln(vet[pos]);
for pos:=1 to 6 do
begin
newvet[pos]:=vet[pos]*pos;
writeln('Na posicao ',pos,'teremos ',newvet[pos]);
end;
end.
2)
program ex2;
var
vet:array[1..4] of integer;
pos:integer;
Begin
writeln('Digite os valores');
for pos:=1 to 4 do
readln(vet[pos]);
writeln('Ordem inversa:');
for pos:=4 downto 1 do
writeln(vet[pos]);
end.
3)
program ex3;
var
vet:array[1..4,1..4] of integer;
posl,posc:integer;
Begin
writeln('Digite os valores');
for posl:=1 to 4 do
for posc:=1 to 4 do
readln(vet[posl,posc]);
for posc:=1 to 4 do
for posl:=1 to 4 do
if posl<>posc
then writeln(vet[posl,posc]);
end.