


















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
Material sobre Sistemas Operacionais
Tipologia: Notas de aula
1 / 26
Esta página não é visível na pré-visualização
Não perca as partes importantes!



















Material Didático do Instituto Metrópole Digital - IMD Versão 2.0 - Todos os Direitos reservados
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
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.
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
// 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
Vídeo 05 - 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.
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.
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
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
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.