FISP 1/6 15 a Aula Subprogramação /Subalgoritmos Função e Procedimento Objetivo: Simplificação e racionalização na elaboração de algoritmos mais complexos Recursos: Estruturação de algoritmos e modularização de sistemas, tendo como recurso a divisão de problemas grandes e complexos em problemas menores e de solução mais simples. Vantagens: Redução no número de linhas de programação, facilidade no entendimento e na manutenção de algoritmos e possibilidade de uso algoritmos (softwares) desenvolvidos por outras pessoas (divisão de tarefas para vários programadores). A ideia de reutilização de software tem sido adotada por muitos grupos de desenvolvimento de sistemas de computação (*), devido à economia de tempo e trabalho que proporcionam. O objetivo principal é a criação de uma BIBLIOTECA onde são armazenados algoritmos que podem ser reutilizados em outras aplicações. Tratam-se normalmente de algoritmos que executam tarefas corriqueiras e disponibilizados pelo fornecedor do compilador. No caso das linguagens de programação de alto nível o recurso de biblioteca é muito utilizado, como pode ser visto na linguagem C onde os comandos scanf e printf são funções (subalgoritmos) que foram desenvolvidas para realizar a tarefa de leitura e escrita padrão respectivamente, e estão armazenadas na biblioteca (arquivo cabeçalho) stdio.h. Um outro exemplo de biblioteca é o math.h, onde estão armazenadas as principais funções matemáticas: raiz quadrada, seno, cosseno, logaritmo, exponencial, potência, etc.. (*) Este assunto tem sido muito abordado numa nova área chamada Engenharia de Software Definição de Subalgoritmo É um nome dado a um trecho de um algoritmo mais complexo e que, em geral, encerra em si próprio um pedaço da solução de um problema maior o algoritmo principal a que ele é subordinado.
FISP 2/6 Estrutura de um algoritmo completo Um algoritmo completo é composto por um algoritmo principal e diversos subalgoritmos (tantos quantos forem necessários). O algoritmo principal é aquele por onde a execução do programa se inicia e este pode "chamar" os demais subalgoritmos. Na figura 1, a seguir, pode ser visto a estrutura de um algoritmo completo típico, onde são indicados na forma de módulos o algoritmo principal e os subalgoritmos. <biblioteca do algoritmo completo> <declaração das variáveis globais> cabeçalho do 1 o subalgoritmo Lembrar que as variáveis podem ser globais, locais e na lista de parâmetros de subalgoritmos corpo do 1 o subalgoritmo cabeçalho do 2 o subalgoritmo corpo do 2 o subalgoritmo cabeçalho do N o subalgoritmo corpo do N o subalgoritmo. no corpo do algoritmo principal além das instruções básicas podem ocorrer as "chamadas" dos subalgoritmos. corpo do algoritmo principal Cabeçalho do subalgoritmo No cabeçalho de um subalgoritmo são definidos o nome e o tipo do subalgoritmo, bem como os seus parâmetros.
FISP 3/6 Estrutura de um subalgoritmo Figura 1 estrutura de um algoritmo completo típico Como pôde ser visto na figura anterior, os subalgoritmos são partes integrantes do algoritmo principal e são descritos no início do mesmo. Agora o problema é saber como elaborar um subalgoritmo, ou seja, qual é a estrutura interna de subalgoritmo. cabeçalho do subalgoritmo corpo do subalgoritmo //inicio //fim Como foi visto anteriormente, no cabeçalho de um subalgoritmo são definidos o nome e o tipo do subalgoritmo, bem como os seus parâmetros e as variáveis locais. O nome de um subalgoritmo é o nome simbólico pelo qual ele é chamado por outro algoritmo. O corpo de um subalgoritmo contém as instruções que são executadas cada vez que ele é invocado (chamado). Variáveis locais são aquelas definidas dentro do próprio subalgoritmo e só podem ser utilizadas pelo mesmo. Na Linguagem as variáveis locais devem ser declaradas no corpo do subalgoritmo. Parâmetros ou argumentos são canais por onde os dados são transferidos pelo algoritmo chamador a um subalgoritmo, e vice-versa. Para que possa iniciar a execução das instruções em seu corpo, um subalgoritmo às vezes precisa receber dados do algoritmo que o chamou e, ao terminar sua tarefa, o subalgoritmo deve fornecer ao algoritmo chamador os resultados da mesma. Esta comunicação bidirencional pode ser realizada de duas formas que serão estudadas mais à frente: por meio de variáveis globais ou por meio da passagem de parâmetros. O tipo de um subalgoritmo é definido em função do número de valores que o subalgoritmo retorna ao algoritmo que o chamou. Assim, os subalgoritmos podem ser classificados em dois tipos: Funções, que retornam um, e somente um, valor ao algoritmo chamador; Procedimentos, que não retornam valor ao algoritmo chamador. A estrutura de um subalgoritmo tipo Função O nome função para um subalgoritmo origina-se da idéia de função matemática (por exemplo, raiz quadrada, seno, cosseno, tangente, logaritmo, etc.), onde um valor é calculado a partir de outro(s) fornecido(s) à função.
FISP 4/6 Exemplo: X=π/6=30 o sen(x)=sen(π/6)=0.5 onde X é o parâmetro ou argumento da função sen e π/6 é o valor armazenado pelo parâmetro X. Já 0.5 é o valor calculado a partir da função sen(x). Sintaxe em Linguagem C <tipo_de_dado> <nome>(<lista de parâmetros>) <variáveis locais>; <comando composto>; return <expressão ou valor>; onde: <nome> é o nome simbólico pelo qual o a função é chamada por outros algoritmos; <lista de parâmetros> são os tipos e nomes dos parâmetros da função; <tipo_de_dado> é o tipo de dado (int, float, double, char ou string) da informação retornada pela função ao algoritmo chamador; <variáveis locais> lista das variáveis locais à função; <comando composto> é conjunto de instruções do corpo da função. O uso ou chamada ou invocação de uma função sempre é feita pelo nome da função com o seus respectivos parâmetros ou argumentos entre parênteses. A função será executada e, ao seu término, o trecho que a invocou é substituído pelo valor retornado pela mesma dentro da expressão matemática em que se encontra. Especificamente no corpo da função e, somente neste caso, deve ser adicionado o comando return <expressão ou valor>, que é responsável pelo retorno ao algoritmo chamador do valor calculado pela função. Exemplo 1: Algoritmo que utiliza uma função que calcula um número real elevado ao quadrado. #include<stdio.h> float X,Y; float QUAD(float W) float Z; Z=W*W; return Z; int main() printf( \ndigite um número= ); scanf( %f,&x); Y=QUAD(X); printf( \ny=%f,y); system( PAUSE ); return 0; Subalgoritmo tipo função QUAD(W) Corpo do algoritmo principal (algoritmo chamador)
FISP 5/6 A estrutura de um subalgoritmo tipo Procedimento O nome Procedimento para um subalgoritmo origina-se da idéia de um conjunto de comandos e instruções que realizam uma tarefa específica tal como um procedimento. Este se diferencia do subalgoritmo função, pois não retorna valor após ser chamado por um algoritmo. A estrutura de um procedimento é similar à da função com exceção do comando return que não é utilizado, pois o procedimento não retorna valor, e também é associado o tipo void ( vazio em inglês ) ao nome do procedimento. Sintaxe em Linguagem C void <nome>(<lista de parâmetros>) <variáveis locais>; <comando composto>; onde: <nome> é o nome simbólico pelo qual o procedimento é chamado por outros algoritmos; <lista de parâmetros> são os tipos e nomes dos parâmetros do procedimento; <variáveis locais> lista das variáveis locais ao procedimento; <comando composto> é conjunto de instruções do corpo do procedimento. O uso ou chamada ou invocação de um procedimento sempre é feita pelo nome do procedimento com os seus respectivos parâmetros ou argumentos entre parênteses. Ao contrário da função, o procedimento é chamado em comandos isolados de um algoritmo, como as instruções de entrada (scanf) e saída (printf) de dados. Exemplo 2: Algoritmo que utiliza um procedimento que realiza a tarefa de escrita de um texto. #include<stdio.h> char X[10]; void ESCRITA(char texto[10]) printf( \n*********************** ); printf( \n %s,texto); printf( \n*********************** ); int main() ESCRITA( Meu nome ); system( PAUSE ); return 0; Subalgoritmo tipo procedimento ESCRITA Corpo do algoritmo principal (algoritmo chamador)
FISP 6/6 Observações importantes Variáveis globais são aquelas definidas no início de um algoritmo e visíveis (utilizáveis) por todos os subalgoritmos e pelo algoritmo principal. Variáveis locais são definidas dentro de um subalgoritmo e só podem ser usadas dentro do mesmo, não sendo visíveis fora deste escopo. Parâmetros são canais pelos quais se estabelece uma comunicação bidirencional entre um subalgoritmo e o algoritmo chamador (o algoritmo principal ou outro subalgoritmo). Implementação de subalgoritmo na linguagem C A grande maioria das linguagens de programação subdivide os subalgoritmos em função e procedimentos (ou subrotinas), mas especificamente na linguagem C todos os subalgoritmos são tratados como funções. Porém as funções no C podem ser classificadas em dois tipos: Funções que retornam valores; Funções que não retornam valores (uso do void vazio ). Como pode ser observada, a diferença acima descrita tem o mesmo conceito apresentado anteriormente, ou seja, a diferença entre função e procedimento. Exemplo de função em C (procedimento) que não retorna valor. Linguagem C #include<stdlib.h> #include<stdio.h> void muda_valor(int a) //exemplo de função que não retorna valor //início da função a=5; printf("valor na funcao %d\n",a); //término da função int main() int valor=10; //declaração da variável int valor com 10 printf("antes da funcao %d\n",valor); muda_valor(valor); //chamada de função que não retorna valor printf("depois da funcao %d\n",valor); system("pause"); Output (avalie o quê aconteceu!) Antes da funcao 10 Valor na funcao 5 Depois da funcao 10 Pressione qualquer tecla para continuar...