Docsity
Docsity

Prepare-se para as provas
Prepare-se para as provas

Estude fácil! Tem muito documento disponível na Docsity


Ganhe pontos para baixar
Ganhe pontos para baixar

Ganhe pontos ajudando outros esrudantes ou compre um plano Premium


Guias e Dicas
Guias e Dicas


Sistemas Operacionais, Notas de aula de Sistemas Operacionais

Material sobre Sistemas Operacionais

Tipologia: Notas de aula

2017

Compartilhado em 08/11/2017

m_douglas1607
m_douglas1607 🇧🇷

4.7

(7)

26 documentos

1 / 26

Toggle sidebar

Esta página não é visível na pré-visualização

Não perca as partes importantes!

bg1
Material Didático do Instituto Metrópole Digital - IMD
Versão 2.0 - Todos os Direitos reservados
Lógica de Programação
Aula 14 - Subalgoritmos: funções e
procedimentos – mecanismos de
passagem de parâmetros
Apresentação
pf3
pf4
pf5
pf8
pf9
pfa
pfd
pfe
pff
pf12
pf13
pf14
pf15
pf16
pf17
pf18
pf19
pf1a

Pré-visualização parcial do texto

Baixe Sistemas Operacionais e outras Notas de aula em PDF para Sistemas Operacionais, somente na Docsity!

Material Didático do Instituto Metrópole Digital - IMD Versão 2.0 - Todos os Direitos reservados

Lógica de Programação

Aula 14 - Subalgoritmos: funções e

procedimentos – mecanismos de

passagem de parâmetros

Apresentação

Apresentação

Ao longo da nossa disciplina, conhecemos as instruções primitivas e as estruturas de controle. Na aula anterior, conhecemos as estruturas de dados homogêneas, que são os vetores e as matrizes. Existem problemas com diversos graus de complexidade e, com todos os conhecimentos que adquirimos até aqui, é certo que já somos capazes de construir algoritmos que resolvam problemas de diversos tipos. Nesta aula, veremos que, para reduzir a complexidade de um algoritmo, é interessante sabermos utilizar o nosso raciocínio lógico para dividir um problema grande em diversos problemas menores. Dessa forma, a complexidade é reduzida, favorecendo a compreensão.

E é nesse contexto que entram os subalgoritmos, que são trechos de programas que podem ser utilizados dentro de um programa maior, sempre que necessário ou conveniente.

Nesta aula, conheceremos os conceitos acerca de subalgoritmos, classificando-os em funções e procedimentos. Conheceremos também os conceitos, sintaxe e aplicações das funções e procedimentos. Veremos como criar, declarar e em que parte do algoritmo eles devem ficar posicionados. Também aprenderemos como fazer a chamada de funções e procedimentos dentro do algoritmo principal e os conceitos de escopo de variáveis, definindo variáveis globais e locais e a comunicação entre as funções e procedimentos e o algoritmo através dessas variáveis. Outro tópico que será abordado na aula será o estudo dos mecanismos de passagem de parâmetros. Estudaremos os tipos de parâmetros e os métodos de passagem de parâmetros que podemos utilizar em funções e procedimentos.

Vídeo 01 - Apresentação

Para reduzir essa complexidade, é interessante utilizarmos a nossa habilidade de raciocínio lógico para decompor os problemas grandes e complexos em diversos problemas menores e mais simples.

Dessa forma, fica mais fácil manter o foco em um "subproblema" por vez, aumentando a compreensão.

Em algoritmos, essa decomposição é possível quando utilizamos os subalgoritmos.

Um subalgoritmo é um trecho de programa que contém início e fim, executa um determinado conjunto de instruções e possui um identificador, por meio do qual pode ser chamado em qualquer parte do algoritmo, como se fosse um comando.

Imagine que um determinado algoritmo precisa realizar um mesmo conjunto de ações repetidas vezes ao longo de sua execução. Ao invés de escrevermos esse conjunto de ações várias vezes ao longo do algoritmo, criamos um subalgoritmo e o algoritmo principal o "chama" sempre que precisar dele.

Por exemplo: Ao preencher um formulário com dados de diversas pessoas, o usuário digita, em dado momento, o ano de nascimento da pessoa e, automaticamente, é preenchido o campo seguinte, com a idade da pessoa.

Em um programa que não utiliza subalgoritmos, a expressão idade <- ano_atual – ano_nascimento é calculada cada vez que novos dados são inseridos. Se utilizarmos um subalgoritmo que realize esse cálculo, apenas "chamamos" o subalgoritmo no momento necessário.

Ao terminar a execução do subalgoritmo "chamado", o fluxo de execução natural do algoritmo principal prossegue.

Dessa forma, quando um algoritmo é muito complexo, a estratégia é dividi-lo em um algoritmo principal e diversos (tantos quantos forem necessários) subalgoritmos. Se, ainda assim, algum nível de complexidade

for mantido, é possível que os subalgoritmos criem e utilizem outros subalgoritmos.

A utilização de subalgoritmos facilita o trabalho do programador, pois, além de melhorar a compreensão e reduzir a complexidade, permite que se detectem e corrijam eventuais falhas com maior precisão e agilidade e favorece, também, a reutilização de subalgoritmos que foram implementados em outros programas. Dessa forma, reduzimos, além da complexidade, o tempo gasto para escrever o programa.

Vídeo 02 - Subalgoritmos

Atividade 01

  1. O que é um subalgoritmo? Quando é interessante utilizar subalgoritmos?
  2. Quais as vantagens de se utilizar subalgoritmos?

Elementos de um subalgoritmo

Os elementos de um subalgoritmo são o corpo e o cabeçalho. No corpo, são definidas as instruções, ou seja, as ações que o subalgoritmo vai executar cada vez que for "chamado" dentro do algoritmo principal.

No cabeçalho, definimos o nome, os parâmetros, as variáveis locais e o tipo. Veja a descrição de cada um desses elementos a seguir.

  1. Nome – é o identificador pelo qual o subalgoritmo será chamado no algoritmo principal.
  2. Parâmetros – são os dados que permitem as relações entre o subalgoritmo e o algoritmo. Ou seja, são os dados que o subalgoritmo precisa receber para executar suas instruções e os dados que ele retorna quando termina de executar. Por exemplo, para realizar uma soma, os parâmetros recebidos são

A essa visibilidade das variáveis (se ela é local ou global) damos o nome de escopo de variáveis. Trata-se da abrangência de uma variável, ou seja, em quais limites do algoritmo ela é visível e pode ser utilizada.

Veja, na Figura 1, como podemos ilustrar a hierarquia da visibilidade das variáveis.

Veja que as variáveis A e B estão declaradas no algoritmo principal. Logo, elas são variáveis globais que podem ser utilizadas em qualquer subalgoritmo do conjunto que vemos na Figura 1.

Porém, declaramos a variável A novamente, em outro contexto, no subalgoritmo1. Essa nova variável A, nesse caso, não é a mesma que foi criada no algoritmo principal. Trata-se de uma variável local do subalgoritmo1 e que pode ser utilizada no subalgoritmo 1.1 (ou em qualquer subalgoritmo interno ao subalgoritmo 1). A variável X é, também, local ao subalgoritmo1 e pode ser utilizada no subalgoritmo 1.1.

É declarada no subalgoritmo 2.1 outra variável X, que é local naquele subalgoritmo (ela não tem relação alguma com a variável X do subalgoritmo1). A variável M é local ao subalgoritmo2 e pode ser utilizada no subalgoritmo 2.1. A variável W é local ao subalgoritmo 1.1 e somente nesse subalgoritmo pode ser visualizada.

Figura 1 - Hierarquia no escopo de variáveis Fonte: Adaptado de Manzano (2005, p. 186).

Uma variável local pode ter o mesmo nome de uma variável global. Porém, uma vez declaradas em contextos diferentes, elas são distintas.

Além de melhorar o desempenho do algoritmo, essa divisão entre variáveis locais e globais serve para definir os parâmetros de um subalgoritmo. Ou seja, elas estabelecem a comunicação entre o subalgoritmo e o algoritmo principal, que o "chamou".

As variáveis globais do algoritmo servem como dados de entrada para o subalgoritmo e as variáveis locais do subalgoritmo armazenam os dados recebidos para, com eles, efetuar os cálculos necessários.

No caso das funções, como veremos adiante, a variável (local) de retorno (através do comando retorne) serve como dado de saída da função para o algoritmo principal e uma variável global recebe e armazena essa informação. Ao acessar essa variável global, temos acesso ao valor de retorno da função.

A maneira com que tratamos as variáveis dentro do algoritmo pode afetar de forma direta o desempenho do programa, pois uma variável local é liberada (um espaço na memória é liberado) assim que o subalgoritmo que a utiliza termina de executar. Dessa forma, se uma variável vai ser utilizada somente no interior de um subalgoritmo, não há necessidade de declará-la como variável global. Você pode utilizar variáveis globais nos subalgoritmos que você criar, porém, é recomendável que você utilize variáveis locais, pois isso permite que o subalgoritmo seja executado sem interferir em outros subalgoritmos que possam estar utilizando as mesmas variáveis.

Algoritmo ""

var

<declaração de variáveis do algoritmo>

<declaração da função>

inicio

fimalgoritmo

A sintaxe da criação de uma função é a seguinte:

// cabeçalho, com o nome, os parâmetros e o tipo de retorno

funcao (<lista de parâmetros>:<tipo dos parâmetros>):

// declaração das variáveis da função

var

<declaração das variáveis locais da função>

// inicio da execução da função

inicio

<instruções>

// valor a ser retornado no algoritmo, ao chamar a função

retorne

fimfuncao

Veja o algoritmo a seguir, que utiliza uma função que soma dois números.

algoritmo"Funçao soma"

var

a,b, soma: inteiro//declaração das variáveis globais

funcao fsoma(a1, b1: inteiro):inteiro

//declaração da função

var

resultado : inteiro//declaração de variáveis locais

inicio

resultado<-a1+b1//instruções

retorne resultado//valor de retorno

Função criada

fimfuncao

inicio

leia(a)

Corpo do algoritmo principal

  1. Os parâmetros da função são separados por vírgula (como na declaração de variáveis), se forem do mesmo tipo. Se forem de tipos diferentes, devemos separá-los por ponto e vírgula (;).
  2. O tipo de retorno da função, bem como todas as suas variáveis locais, pode ser qualquer um entre os tipos de dados básicos que conhecemos: inteiro, real, lógico, literal ou caractere. Porém, o VisuAlg não suporta variáveis compostas (vetores e matrizes) como parâmetros de subalgoritmos.
  3. O comandoretorne é utilizado para informar o valor de retorno da função ao algoritmo, no momento em que a função é "chamada".
  4. A função é "chamada" sempre em uma expressão, na qual o valor armazenado na variável de retorno da função é atribuído a uma variável do algoritmo principal.
  5. Sempre que chamar a função, é imprescindível que os parâmetros passados (no caso do nosso exemplo, os valores das variáveis globais a e b) devem, obrigatoriamente, estar entre parêntesis, na mesma ordem, ser do mesmo tipo e em igual quantidade aos parâmetros da função (variáveis locaisa1 eb1).

Vídeo 05 - Funções

Atividade 04

  1. Determine o conceito de função. Em qual local do algoritmo a função deve ser definida? Explique a sintaxe da criação de uma função.
  2. De que forma é realizada a chamada de uma função?
  1. Qual a utilidade do comandoretorne?
  2. Experimente remover a declaração da variável localresultado da função que criamos em nosso exemplo e utilizar a variável global soma no cálculo da expressão desoma e no retorno. Execute. O algoritmo funcionou? Explique o motivo.
Funções

As funções retornam o seu valor de forma explícita, por meio do comandoretorne.

As chamadas às funções ocorrem sempre em expressões ou instruções de atribuição.

Procedimentos

Os procedimentos não retornam valor. Não existe comando retorne.

Os procedimentos são chamados em comandos isolados, como as instruções de entrada e saída de dados (leia e escreva), e nunca em expressões ou atribuições.

Procedimentos

Um procedimento é um subalgoritmo, assim como a função. A principal diferença entre ambos é que a função retorna um valor, enquanto o procedimento não retorna, mas modifica os valores recebidos.

Um procedimento é um subalgoritmo que é chamado dentro do algoritmo através da citação de seu nome (identificador) e deve alterar os valores dos parâmetros recebidos.

Vimos anteriormente que uma função retorna um único valor, enquanto um procedimento não retorna, mas modifica os valores. Existem, porém, outras diferenças importantes entre os dois.

algoritmo "Procedimento triangulo"

var

altura, base, area : real// declaração das variáveis globais

procedimento ptriangulo (var h,b,ar : real)

// declaração do procedimento

inicio

ar <- (b*h)/2// instruções

fimprocedimento

inicio

escreval ("Digite o valor da base: ")

leia (base)

escreval ("Digite o valor da altura: ")

leia (altura)

ptriangulo(altura,base, area)// chamada ao procedimento

escreval (area,"m²")

fimalgoritmo

Veja que o procedimento é criado após a declaração das variáveis globais do algoritmo. No momento da declaração do procedimento, seus parâmetros (variáveis locais) são informados entre parêntesis, precedidos da palavra chavevar. Isso ocorre porque os procedimentos, como vimos há pouco, modificam valores por meio dos parâmetros, diferente das funções, que utilizam a instruçãoretorne.

Sabemos que os parâmetros permitem a comunicação entre o subalgoritmo e o algoritmo que o "chama". Dessa forma, o procedimento recebe os valores através das variáveis globais (no caso,altura ebase) e os armazena em suas variáveis locais (h eb). Após realizar o cálculo da área, o valor resultante é passado, por meio da variável local ar, e armazenado na variável global area.

Por isso, ao "chamarmos" o procedimento no algoritmo principal, devemos fornecer os parâmetros (variáveis globais do algoritmo), entre parêntesis, na mesma ordem, quantidade e tipo que os parâmetros (variáveis locais) do procedimento, assim como fazemos nas funções.

Vídeo 06 - Procedimentos

Atividade 05

  1. Explique, com suas palavras, o que é um procedimento.
  2. Explique, com suas palavras, como se dá a comunicação entre as variáveis globais do algoritmo e as variáveis locais do procedimento, na passagem de parâmetros.

Passagem de parâmetros

Sabemos que em funções e procedimentos deve haver uma comunicação entre o subalgoritmo e o algoritmo que o "chama", através das variáveis globais do algoritmo e das variáveis locais do subalgoritmo.

Na Figura 2, podemos ver uma função, no módulo da esquerda, que calcula uma soma entre dois números. No módulo da direita, temos o corpo do algoritmo que "chama" essa função.

O algoritmo passa os dados de entrada (números armazenados nas variáveis a e b, que são os parâmetros reais) para a função, que os armazena em suas variáveis locaisa1 eb1 (parâmetros formais). O cálculo é efetuado e o valor encontrado é armazenado na variável localresultado. Através do comando retorne, esse valor é passado como dado de saída para o algoritmo (no momento da chamada da função), que o armazena na variável global soma para então ser exibido.

Em um procedimento, essa passagem de parâmetros é feita de uma forma um pouco diferente. Veja a Figura 3.

Figura 2 - Troca de informações entre algoritmo e função

No procedimento, a comunicação de saída não é feita de forma explícita como na função. Veja que, ao contrário do que é feito na função, a palavra reservadavar é utilizada nos parâmetros do procedimento. Veja, também, que na chamada ao procedimento todos os dados são passados como parâmetros, ao passo que na função, são passados apenas os dados de entrada (os números armazenados em a e b). Por que será que isso ocorre?

Porque os parâmetros, na função da Figura 2, estão sendo passados por valor e, no procedimento da Figura 3, os parâmetros estão sendo passados por referência.

Vamos compreender o que isso significa?

Figura 3 - Troca de informações entre algoritmo e procedimento

Passagem de parâmetros por valor

Quando um parâmetro é passado por valor, no momento da chamada do subalgoritmo, o valor do parâmetro real é "copiado" para o parâmetro formal. Dessa forma, não há alteração no valor do parâmetro real, sejam quais forem os cálculos realizados no subalgoritmo.