Aula IX
1
Centro de Educação Profissional Diomício Freitas Curso: Técnico em Informática – Hab. em Programação Disciplina: Algoritmo e Lógica de Programação Professor: Oscar Pedro Neves Júnior 1.
PROCEDURE
São blocos de programa, definidas pelo usuário, com o intuito de melhor organizar o código, evitar repetições desnecessárias e facilitar no processo de manutenção. É um bloco de programa que NÃO RETORNA valor após sua execução. PROCEDURE nome (parâmetros); Begin <Comando1>; : <ComandoN>; End; Os parâmetros são opcionais. Exemplo: Faça um programa em pascal para ler o ano de nascimento de N pessoas e informar a idade de cada pessoa. Inicialmente o computador irá criar as variáveis globais (as que estão declaradas logo abaixo do program), depois se desloca para o begin principal. Todo o programa inicia do Begin Principal.
Program Idade; var ano, id : Word; resp : char;
No begin principal, inicia a estrutura de repetição Repeat e chama a procedure Ler_dados Após retornar da procedure Ler_dados, pergunta ao usuário se ele deseja fazer novo calculo; Se a resposta for diferente de “n” ele retorna ao inicio da estrutura de repetição e repete o processo, senão termina o programa.
Procedure calcula_idade; begin id := 2005 – ano; end;
Procedure Ler_dados; begin write(‘Digite ano de nascimento’); readln(ano); calcula_idade; writeln(‘Idade correspondente = ‘, id); end;
Quando a procedure Ler_dados é chamada, ela pede ao usuário para que digite o ano de nascimento, após chama a procedure calcula_idade; Ao retornar da procedure calcula_idade, mostra a idade correspondente ao ano digitado e retorna para o local onde foi chamada, neste caso, volta para o begin principal. A procedure calcula_idade, ao ser chamada, calcula a idade da pessoa, baseado no ano de nascimento e retorna para o local que chamou esta procedure, neste exemplo, volta para a procedure Ler_dados.
Begin {Principal} Repeat Ler_dados; Write(‘Deseja fazer novo calculo? ‘); Obs.: uma procedure só pode ser chamada se estiver Readln(resp); programada acima do local onde está sendo chamada. Until (resp = ‘n’) or (resp = ‘N’); End.
Algoritmo e Lógica em Computação Oscar Neves Júnior
Material 10 2.
2
VARIÁVEIS GLOBAIS E LOCAIS
Existem várias formas de declaramos variáveis. Cada forma tem um objetivo, um modo de trabalho e uma abrangência. As duas formas mais comuns de declaração são global e local. Variável global é uma variável declarada no inicio do programa, normalmente logo abaixo do program. Esta variável é criada na memória assim que a execução do programa inicia e pode ser utilizada em qualquer lugar dentro do programa, do ponto em que está declarada para baixo, ou seja, pode ser usada no begin principal, nas procedures e nas functions que estejam programadas abaixo da declaração. Variável local é uma variável declarada dentro da procedure ou function. Esta variável só é criada na memória no momento em que a procedure ou function for executada, e desalocada assim que termina a execução da procedure ou function. A vantagem da variável global é que seu valor pode ser utilizado e alterado em qualquer lugar dentro do programa. Sua desvantagem é que todas as variáveis serão criadas, ocuparão espaço em memória, e estarão disponíveis do inicio ao fim do programa, sendo utilizadas ou NÃO. Outra desvantagem ocorre quando dividimos o trabalho da programação em partes, sendo que cada parte um programador diferente deve ser responsável em desenvolver. O problema aqui é que se um programador criar uma variável com objetivo de armazenar um valor e o outro programador criar uma variável com o mesmo nome, mas com outro objetivo, poderá dar conflito e gerar erros de lógica na programação. A vantagem da variável local é que esta só será criada no momento em que a procedure ou function for chamada. Assim, só ocupará espaço na memória do computador no momento da execução da procedure ou function. Só as variáveis que serão utilizadas serão criadas. A grande desvantagem é que esta variável está limitada ao local onde está declarada e que seu valor é perdido assim que o procedure ou function termina a execução. Exemplo: Faça um programa em pascal para ler o ano de nascimento de N pessoas e informar a idade de cada pessoa. Neste programa apenas a variável id poderá ser local.
Program Idade; var ano : Word; resp : char;
A variável ano está sendo usada em mais de um local, e como em ambos locais deve ter o mesmo valor não pode ser considerada local.
Procedure calcula_idade; Var Id : Word; begin id := 2005 – ano; writeln(‘Idade correspondente = ‘, id); end;
A variável resp é uma variável que está sendo usada no begin principal, e por definição todas as variáveis usadas no begin principais devem ser globais. O ideal é evitar variável global. Seguindo a programação deste exemplo, a única variável que poderá ser transformada em local é a variável ano, mas para isto deveremos usar o conceito de parâmetros.
Procedure Ler_dados; begin write(‘Digite ano de nascimento’); readln(ano); calcula_idade; end; Begin {Principal} Repeat Ler_dados; Write(‘Deseja fazer novo calculo? ‘); Readln(resp); Until (resp = ‘n’) or (resp = ‘N’); End.
Algoritmo e Lógica em Computação Adriana S. Zanini x Wagner Rocha
Material 10
3
3. PARÂMETROS Parâmetros seguem o conceito de variáveis locais, com a vantagem de permitir ao usuário inicializar a variável com qualquer valor correspondente ao tipo declarado, no momento de sua criação. Existem dois tipos de parâmetros: Parâmetro por Valor: Onde a variável do tipo parâmetro simplesmente recebe um valor ao ser criada. Parâmetro por Referencia: Onde a variável do tipo parâmetro recebe um valor ao ser criada e devolve um valor antes de ser desalocada. As variáveis tipo parâmetro por valor são declaradas ao lado do nome da procedure ou function. Sendo que se for parâmetro por valor deve-se apenas declarar as variáveis, separando por virgula quando possuem o mesmo tipo e por ponto e virgula quando possuem tipo diferente. Se for do tipo parâmetro por referencia devemos colocar a palavra var antes da declaração das variáveis. Sintaxe: Por valor: procedure nome (variavel1, variável2, .... : tipo1 ; variavel3 : tipo2); Por referencia procedure nome( var variável4, ... : tipo1 ; var variável5, variável6 : tipo2); Em uma mesma declaração você poderá ter parâmetro por valor e por referencia. Também é possível ter em uma mesma procedure ou function a declaração de parâmetros e variáveis locais. Se uma procedure ou function for criada com a declaração de parâmetros, devemos obrigatoriamente enviar valores para os parâmetros declarados no momento em que as chamamos. Exemplo: Faça um programa em pascal para ler o ano de nascimento de N pessoas e informar a idade de cada pessoa. Program Idade; var resp : char; Procedure calcula_idade (ano : word); Var Id : Word; begin id := 2005 – ano; writeln(‘Idade correspondente = ‘, id); end; Procedure Ler_dados; Var Ano : word; begin write(‘Digite ano de nascimento’); readln(ano); calcula_idade (ano); end;
Neste programa temos a variável local ano, que foi declarada dentro da procedure Ler_dados, e o parâmetro por valor ano declarado na procedure calcula_idade. A procedure Ler_dados está enviando o valor do ano para procedure calcula_idade no momento de sua chamada, através da linha calcula_idade(ano);
Begin {Principal} Repeat Ler_dados; Write(‘Deseja fazer novo calculo? ‘); Readln(resp); Until (resp = ‘n’) or (resp = ‘N’); End.
Algoritmo e Lógica em Computação Adriana S. Zanini x Wagner Rocha
Material 10 Exemplo2: Foi feita uma pesquisa no bar Pica Pau envolvendo diversos alunos, onde se perguntou a cada aluno quantos lanches ele faz por mês no bar. Deseja-se saber: • o número de alunos que fazem menos que 10 lanches por mês; • o número de alunos que fazem de 10 a 15 lanches por mês; • o número de alunos que fazem mais de 15 lanches por mês; Program Lista6_exe7; Procedure Mostra_Resultados (menos, entre, mais : byte); Begin Writeln(‘número de alunos que fazem menos de 10 lanches por mês = ’, menos); Writeln(‘número de alunos que fazem de 10 a 15 lanches por mês = ’, entre); Writeln(‘numero de alunos que fazem mais de 15 lanches por mês = ’, mais); End; Procedure Calcula_Lanches(var menos, entre, mais : byte; num_lanche : Word); Begin If num_lanche < 10 then Neste exemplo o begin principal está chamando a menos := menos + 1 procedure Entrada, o qual no momento em que inicia sua Else execução cria as variáveis locais menos, entre, mais, If (num_lanche >=10) and (num_lanche <=15) then num_lanche e resp. Após inicializa as variáveis de contagem com zero e entre := entre + 1 inicializa a estrutura de repetição. Else Dentro da estrutura de repetição, pede para o usuário mais := mais + 1; digitar o numero de lanches feitos no mês e chama a End; Procedure Entrada; Var menos, entre, mais, num_lanche : word; resp : char; begin menos := 0; entre := 0; mais := 0; repeat write(‘Digite o número de lanches feitos no mês : ’); readln(num_lanche); Calcula_Lanches(menos, entre, mais, num_lanche); Write(‘Ler outro dados: (s/n)’); Readln(resp); Until (resp= ‘n’) or (resp = ‘N’); Mostra_Resultados (menos, entre, mais); end; Begin {Principal} Entrada; End. Obs.: Os parâmetros não precisam ter o mesmo nome das variáveis que estão sendo enviados a eles; Mas a ordem de envio e o tipo devem ser respeitados, ou seja, o primeiro valor enviando vai ser armazenado no primeiro parâmetro declarado que deverá ter o mesmo tipo, o segundo para o segundo que deverá ter o mesmo tipo do segundo e assim sucessivamente.
procedure Calcula_lanche, enviando para ela o valor das variáveis menos, entre, mais e num_lanche.
Ao entrar na procedure calcula_lanches, são criados na memória os parâmetros menos, entre, mais e num_lanche e incializados com os valores enviados pela procedure Entrada. Após é feita a verificação do numero de lanches feitos no mês pelo aluno, através do parâmetro num_lanche, é feita a contabilização. Terminando a verificação e contabilização, a procedure calcula_lanches é encerrada e os valores dos parâmetros menos, entre e mais são retornados para as variáveis correspondentes da procedure Entrada (o num_lanche não é retornado porque não é um parâmetro por referencia), logo todos os parâmetros são desalocados da memória. Ao retornar para procedure entrada, é verificado se o usuário deseja ler dados de um novo aluno, caso a resposta seja diferente de ‘n’ ou ‘N’, ele retorna para o início da estrutura de repetição e repete todo o processo. Senão chama a procedure Mostra_resultado, passando o valor das variáveis de contagem. A procedure Mostra_resultado, por sua vez, ao ser chamada cria as variáveis de parâmetro e atribui a elas os valores enviados pela procedure Entrada. Mostras as mensagens na tela e volta para a procedure entrada. Após voltar da procedure mostra_resultados, a procedure entrada é finalizada; As variáveis locais desta procedure são desalocadas da memória, e a execução volta para o begin principal.
Algoritmo e Lógica em Computação Adriana S. Zanini x Wagner Rocha
4
Material 10
5
4. FUNCTION São blocos de programa, definidas pelo usuário, com o intuito de melhor organizar o código, evitar repetições desnecessárias e facilitar no processo de manutenção. É um bloco de programa que sempre RETORNA valor após sua execução. FUNTION nome (parâmetros) : TIPO; Begin <Comando1>; : <ComandoN>; nome := valor de retorno; End; Os parâmetros são opcionais. Como toda function retorna valor, é necessário na hora de criarmos informar o tipo de dado de retorno. E na hora de chamar a função estar preparado para receber o valor de retorno. O valor pode ser retornado para qualquer dispositivo de armazenamento ou amostragem, como variável, tela, impressora, etc. Program Idade; var resp : char; function calcula_idade(ano : word) : word; var idade : Word; begin idade := 2005 – ano; calcula_idade := idade; end;
Procedure Ler_dados; Var Ano, id : Word; begin write(‘Digite ano de nascimento’); readln(ano); id := calcula_idade; writeln(‘Idade correspondente = ‘, id); end;
O retorno da function calcula_idade poderia ser feito direto para a tela, o que economizaria uma variável.
Writeln(‘Idade correspondente = ‘, calcula_idade);
Begin {Principal} Repeat Ler_dados; Write(‘Deseja fazer novo calculo? ‘); Readln(resp); Until (resp = ‘n’) or (resp = ‘N’); End.
Algoritmo e Lógica em Computação Adriana S. Zanini x Wagner Rocha
Material 10
6
Parte I - Passagem de parâmetros por valor 1. Faça um programa com uma sub-rotina (função) que receba 3 valores de entrada e retorne o maior valor entre estes três valores. 2. Faça um programa com uma sub-rotina (função) que calcule X elevado à Y = XY. Leia 2 valores de X e Y e exiba o resultado da chamada da sub-rotina na tela. Exemplo: 2 elevado à 3 é igual à 2*2*2 = 8. 3. Faça um programa que peça para ler 2 notas e depois mostre: - A média aritmética simples; - A média ponderada entre os dois valores (nota 1 com peso 1 e nota 2 com peso 2); - O valor necessário para recuperar a pior nota e passar com média igual ou superior a 6.0, considerando o uso da média aritmética simples (notas com pesos iguais); - O valor necessário para recuperar a pior nota e passar co m média igual ou superior a 6.0, considerando o uso da média ponderada (nota 1 => peso 1, nota 2 => peso 2); - Qual das duas médias (aritmética, ponderada ou tanto faz) é mais benéfica para o aluno, ou seja, qual das duas médias deixa este aluno com a melhor nota. Faça este programa de forma modular, ou seja, usando uma sub-rotina (função) para o cálculo de cada tarefa descrita acima. 4. Faça uma sub-rotina “ Br_UpCase” que dado um caracter qualquer retorne o mesmo caracter sempre em maiúsculo, aceitando inclusive os caracteres acentuados da língua portuguesa (por exemplo: á, é, í, ó, ú, ç, ã, õ, â, ô, à, ü). Faça um programa que leia uma palavra (string) e chame esta sub-rotina para cada um dos caracteres desta palavra, exibindo o resultado após a conversão para maiúsculo. Dicas: Letra := Texto[1]; { Copia o caracter número 1 da string “Texto” para a variável tipo char “Letra” } Texto[5] := Letra; { Copia o conteúdo da variável tipo char “Letra” para o quinto caracter da string armazenada na variável “Texto” }
5. Transforme o programa anterior de conversão de strings com caracteres em minúsculo para strings com caracteres em maiúsculo, em uma função. Esta função recebe uma string de entrada e devolve a string convertida para letras maiúsculas. 6. Criar um procedimento (procedure) que desenhe uma moldura ao redor da tela do micro (quadrado
24x80). Faça no programa principal uma chamada a esta procedure, desenhando a moldura e após escrevendo "Hello World" no meio da tela (Coluna X=35, Linha Y=12). Para desenhar a moldura use os caracteres especiais da tabela ASCII estendida do Turbo Pascal. Exemplo: pressione a tecla ALT e ao mesmo tempo um dos seguintes números no teclado numérico ALT 200, ALT 201, ALT 205, ALT 186, ALT 187, ALT 188. Exemplo:
HELLO WORLD 7. Altere o programa anterior de maneira que quando o usuário apertar uma tecla (readkey), a tela seja limpa, a moldura desenhada novamente e seja escrito "Bye-Bye World” no meio da tela. O programa deve terminar automaticamente após uma espera (delay) de 5 segundos. 8. Faça uma rotina genérica para criar molduras na tela com o tamanho especificado pelo programa através dos parâmetros que são passados para esta rotina. Os parâmetros vão indicar a linha inicial e final da moldura na tela, assim como a coluna inicial e final da moldura. No programa principal use esta rotina para emoldurar o seu nome escrito no centro da tela do computador.
Algoritmo e Lógica em Computação Adriana S. Zanini x Wagner Rocha
Material 10
7
9. Faça novamente um programa para o cálculo do fatorial, mas desta vez crie uma rotina separada que realize o cálculo do fatorial de um número. Utilize também a rotina que desenha uma moldura na tela ao apresentar o resultado (reaproveitamento de código). 10. Escrever um programa que obtenha a data atual (getdate) e imprima ela no formato textual por extenso. A escrita da data por extenso deve ser realizada por um procedimento separado. Exemplo: Data: 01/01/2000 => Imprimir: Sábado, 1 de janeiro de 2000. 11. Modificar o programa anterior para que seja lido o nome de uma pessoa e a data de seu nascimento. Em seguida o programa deve produzir uma mensagem como a que segue logo abaixo. A “data de hoje” é obtida com o comando getdate. Nome: Fulano da Silva Data de nascimento: 04/05/1998 Data de hoje: 12/05/1966 O Fulano da Silva, nascido na Segunda-Feira, 04 de maio de 1998 foi registrado neste cartório na data de hoje, Terça-Feira, 12 de maio de 1998. 12. Faça um programa que verifique uma determinada data fornecida pelo usuário, determinando se ela é válida ou não. Validar o dia (1 à 31, conforme o mês), mês (1 à 12) e ano (de 1 ao ano corrente), verificando se esta data é uma data correta. Lembre-se de verificar se o ano é bissexto ao validar a data. 13. Usando o programa que você fez para a validação da data, transforme este programa em uma função que retorne um valor indicando se a data é válida ou não. Altere o programa anterior (exercício 11) de maneira que este valide a data de nascimento fornecida pelo. Se a data for inválida, leia novamente a data de nascimento, valide e repita o processo tantas vezes quantas forem necessárias, até que o usuário forneça uma data correta. 14. Faça um programa que calcule a raiz quadrada de um número sem usar a função Sqrt do Pascal. Você deve implementar a sua própria função para o cálculo da raiz quadrada. Obtenha uma raiz com uma precisão de no mínimo 2 casas corretas após a vírgula.
Algoritmo e Lógica em Computação Adriana S. Zanini x Wagner Rocha