• Nenhum resultado encontrado

Estruturas de funções I Aula 13

N/A
N/A
Protected

Academic year: 2021

Share "Estruturas de funções I Aula 13"

Copied!
17
0
0

Texto

(1)

Estruturas de funções I

Aula 13

Agenda

• Especificação de uma função • Estrutura de chamada de funções • Condições de retorno

• Funções de arrumação

Objetivo

Apresentar os conceitos relativos a interfaces de funções.

Referência

(2)

Modos de organizar programas - paradigmas

Verbete: paradigma

1. Modelo, padrão, estalão:

Paradigma de programação

• é um modelo ou forma de organizar programas

Paradigma procedural

• programas são modelados segundo estruturas de chamada de funções • freqüentemente cada função é um módulo (ex. FORTRAN)

• tende a gerar um volume grande de dados globais externos (COMMON) • encapsulamento é virtualmente impossível

Paradigma orientado a objetos

• programas são modelados segundo tipos abstratos de dados ou de classes de objetos

• pode-se encapsular os dados e as funções de apoio

• pode-se manipular instâncias de estruturas de dados (objetos)

Paradigma funcional

• programas são modelados segundo funções e associações de parâmetros, ex. Scheme, Lisp

(3)
(4)

Estrutura potencial de chamadas

Estrutura potencial de chamada

• definida pela relação função-chama-função • estática

• todas as chamadas conhecidas em tempo de compilação • dinâmica

• chamadas efetuadas e ainda ativas a cada momento da execução • chamadas dinâmicas utilizam variáveis do tipo referência para

função F3 F4 F5 F6 F1 F2 F7 MÓDULO 1 MÓDULO 2 MÓDULO 3 F8 F9 F10

• a figura mostra a estrutura potencial de chamadas, F1 é a origem • arco de chamada: seqüência de chamadas realizadas e ainda ativas • arco de chamadas recursivas indiretas: F9 -> F8 -> F3 -> F5 -> F9 • podem existir funções mortas ex: F10

• pode existir dependência circular entre módulos sem que isto configure uma recursão: F8 -> F3 -> F5 -> F6 -> F7

(5)

Função

Uma função é uma porção de código contida em um espaço de dados, • possui um nome

• possui uma assinatura • valor retornado • nome

• lista de parâmetros => tipos dos parâmetros int Func( int , float )

• a assinatura está associada a um de possivelmente vários corpos (código) • associação da implementação

• pode ser chamada (ativada) de diversos lugares

• na hora da chamada é estabelecida outra associação: a associação da chamada

• estática (tempo de compilação), caso normal de linguagens procedurais • dinâmica (tempo de execução), caso freqüente em linguagens

orientadas a objetos

• versionada - a associação pode depender da versão (DLL)

Chama F( float ) Associação da chamada F( float ) F( int ) Corpo

F( float ) F( float )Corpo F ( int )Corpo

Associação da implementação Associação da implementação Assinatura Assinatura

(6)

Função

Uma função pode

• retornar zero ou mais valores • receber zero ou mais parâmetros • alterar zero ou mais parâmetros

• utilizar ou alterar zero ou mais estados • variáveis membro de objetos • variáveis membro de classes • variáveis globais

• estados da plataforma de execução, exemplos: • cursor ligado / desligado

• arquivo aberto / fechado • arquivo existe / não existe

• janela: monitor inteiro / monitor parcial / minimizada • criar, ler, alterar ou destruir zero ou mais arquivos

• alocar / solicitar ou desalocar / liberar recursos • interagir com o usuário

• menus • diálogos • mensagens • . . .

(7)

Especificação de uma função

Objetivo da função

• pode ser idêntico ao nome da função

Acoplamento

• identifica todos os itens da interface e respectivos tipos

Condições do acoplamento

• Pré-condição ⇔ assertiva de entrada

• estabelece as condições que dados, estados e arquivos devem satisfazer imediatamente antes de iniciar a execução da função • Pós-condição⇔ assertiva de saída

• estabelece as condições que dados, estados e arquivos devem satisfazer ao terminar a execução da função.

Interface com o usuário

• todos os relatórios e mensagens (textos, sons, gráficos, animações, …) enviadas para o usuário

• todos os dados e comandos recebidos do usuário

• restrito à função sendo observada, evitando funções chamadas por esta função

Requisitos

• estabelecem as características e condições que a função deverá satisfazer

Hipóteses

• estabelecem as características e condições esperadas pela função

Restrições

• restringem a liberdade de escolha de projeto, implementação, ou controle da qualidade

(8)

Exemplo de especificação de uma função

/********************************************************************* *

* $FC Função: TBS Obter um string contido na tabela *

* $ED Descrição da função

* Procura a identificação de um string na tabela de strings. * Caso encontrado, copia-o para o espaço disponibilizado pelo * cliente.

* Não sendo encontrado copia o string com idString == 1; * valor default:

* "Identificação de string %d não foi encontrada." *

* Contido no arquivo de especificação de string: * DefinicaoDefault.defstr

*

* Caso este também não seja encontrado, copia o string ERRO_STRING * definido neste módulo. Valor default:

* "?!?!?" *

* $EP Parâmetros

* idString - identifica o string a ser procurado na tabela * dimString - é a dimensão máxima, incluindo o zero terminal, * que o string obtido poderá ter

* pString - ponteiro para espaço receptor do string com pelo * menos dimString bytes

*

* $FV Valor retornado

* Ver especificações das condições de retorno *

*********************************************************************/ TBS_tpCondRet TBS_ObterString( long idString ,

int dimString , char * pString ) ;

(9)

Pré e pós condições

Estabelecem as condições que dados e resultados devem satisfazer Devem ser especificadas no acoplamento

• condições do acoplamento

Podem ser fatoradas se envolverem relações complexas

Exemplos de pré-condições:

Tabela contém 0 ou mais símbolos.

Simbolo é uma seqüência de zero ou mais bytes quaisquer.

idSimbolo é um identificador em relação um para um com um símbolo existente.

Exemplo de pós-condições:

Se CondRet == OK Então

Tabela contém 1 ou mais símbolos Se Simbolo já figurava na tabela Então

idSimbolo é o valor associado ao Simbolo já existente na tabela Senão

Terá sido criado um novo valor para idSimbolo diferente de todos os demais identificadores registrados na tabela

Simbolo terá sido acrescentado à Tabela e associado ao idSimbolo criado

FimSe FimSe

Se CondRet != OK Então

Tabela não terá sido alterada

idSimbolo será igual a NIL_SIMBOLO FimSe

(10)

Especificação do acoplamento

Resumido, semelhante à programação

InserirSimbolo( Tabela, Simbolo ) ⇒ Tabela, IdSimbolo, CondRet

Por extenso separando entrada e saída

Inserir símbolo em uma tabela Recebe dados

Tabela - Tabela em que será inserido o símbolo Simbolo - Símbolo a inserir

Produz resultados

Tabela - Se não ocorreu erro e se o símbolo era novo: Tabela acrescida do símbolo

Se não ocorreu erro e o símbolo já existia, ou se ocorreu erro: a tabela não terá sido alterada

idSimbolo - Se não ocorreu erro: é a identificação do símbolo na tabela

Se ocorreu erro: é NIL_SIMBOLO

CondRet - Condição de retorno: ver tpCondTabela

Por extenso, segundo o padrão de especificação no livro

Inserir símbolo em uma tabela Tabela

ao entrar - Tabela em que será inserido o símbolo

ao sair - Se não ocorreu erro e se o símbolo era novo: Tabela acrescida do símbolo

Se não ocorreu erro e o símbolo já existia, ou se ocorreu erro:

a tabela não terá sido alterada Simbolo

ao entrar - Símbolo a inserir idSimbolo

ao sair - Se não ocorreu erro:

é a identificação do símbolo na tabela Se ocorreu erro:

é SIMBOLO_NIL CondRet

ao sair - Condição de retorno:

(11)

Interface com o usuário

Mensagens exibidas para o usuário • mensagens de erro ou advertência

• mensagens de feedback ou de estado do processamento • bolhas e mensagens de auxílio

Dados exibidos para o usuário • valores • tabelas • relatórios • diagramas • figuras • gráficos • animações • sinais sonoros • . . .

Dados recebidos do usuário Comandos recebidos do usuário

• menus • teclas • ícones • botões • voz • . . .

(12)

Estrutura do pseudo código de uma função

Crie uma estrutura de pseudo código para funções com algoritmos extensos • primeiro crie a estrutura

• depois preencha o código

// Extrair palavras chave

// Criar a lista de palavras chave // Ler primeiro caractere

// Gerar lista de palavras chave while ( tem caractere )

{

// Processar caractere corrente if ( Caractere é delimitador && Palavra chave vazia ) {

// Marcar o início de nova palavra chave } else if ( Caractere é delimitador

&& Palavra chave não está vazia ) {

// Registrar a palavra chave

} else if ( Caractere não é delimitador ) {

// Adicionar caractere à palavra } else

{

// Sinalizar erro de lógica: condição impossível } // if

// Ler próximo caractere } // while

// Ordenar a lista de palavras chave // Exibir a lista de palavras chave

(13)

Localizador

Localizador

• é um elemento de programa utilizado para localizar um elemento contido em algum conjunto ou estrutura de dados

• identificador

• um valor em correspondência um para um com o elemento procurado em memória

• chave

• um valor em correspondência um para um com o elemento procurado em algum arquivo

• referência

• um nome ou localizador alternativo para o elemento a ser localizado • ponteiro

• o endereço do elemento na memória • função de acesso

• uma função que computa o endereço do espaço de dados a partir de um ou mais parâmetros, exemplo

Exemplos

• idAluno identifica um determinado aluno no conjunto de todos os alunos • Alunos{ idAluno }

• Em C: ObterAluno( pAlunos, idAluno )

• Em C++ ou Java: Alunos.ObterAluno( idAluno ) • Arv{ pNo }

• TabSimb{ Simbolo }.Valor • *(TabSimb( Simbolo )).Valor

• ArquivoX{ Chave } => estrutura de pesquisa, ex.: BTREE • ArquivoX{ inxRegistro } => função fseek(...)

(14)

Conceitos básicos relacionados com funções

Condição de retorno

• é um valor retornado por uma função indicando o estado final de seu funcionamento. Exemplos:

• OK processamento normal

• ERRO_DADO dados fornecidos for a de sua especificação • ERRO_PRECISAO não se atingiu a precisão requerida

Exceção

• é uma condição de término especial indicando a ocorrência de uma anormalidade no processamento. Exemplo:

• falta de memória • erro de dispositivo

• deve ser tratada através de tratamento de exceções: try ... catch

Run-time

• é a definição e implementação da máquina virtual necessária para executar os programas

• passagem de parâmetros • retorno de valores

• retorno de condições de exceção

• como é realizada a amarração dinâmica

Amarração

• (binding) é a associação de um nome ao seu espaço de dados

• vinculação da assinatura de uma função a uma de suas implementações • vinculação do nome da função sendo chamada com a respectiva

assinatura

• pode ocorrer de forma estática

• a mesma implementação vinculada ao nome é chamada sempre • pode ocorrer de forma dinâmica

• escolhe-se a implementação em função do estado da execução e/ou da assinatura a cada vez que a chamada for realizada

(15)

Conceitos básicos relacionados com funções

Interface conceitual

• definição da interface de uma função sem preocupação com a sua implementação

• é tipicamente a especificação

InserirSimbolo( Tabela, Simbolo ) ⇒ Tabela, IdSimbolo, CondRet

Interface física

• é a implementação da interface conceitual, determinando a forma de realizar fisicamente a interface conceitual

• identificação dos parâmetros • identificação dos dados globais

• identificação dos dados persistentes (arquivo)

tpIdSimbolo InserirSimbolo( tpSimbolo Simbolo) Tabela global estático do módulo

CondRet - exceção

Interface implícita

• é formada pelos dados da interface diferentes de parâmetros e valor de retorno

• dados globais • estados

• arquivos

• interface com o usuário Estabelecimento das interfaces

• declaração => protótipo • definição => cabeçalho

• parâmetro formal => parâmetro • implementação => corpo da função

(16)

Condições de retorno e tratamento de exceção

typedef enum {

Leu_OK , /* Leitura normal */

Leu_EOF , /* Encontrou fim de arquivo antes de ler */ Leu_Erro /* Ocorreu erro de leitura */

} tpLeu ; . . .

tpLeu LerReg( FILE * ptArq , tpReg * ptReg ) {

if ( feof( ptArq )) {

memset( ptReg , 0xFF , sizeof( tpReg )) ; return Leu_EOF ;

} /* if */

fread( ptReg , ptArq , sizeof( tpReg ) , 1 ) ; if ( ioError != OK )

{

memset( ptReg , 0xFF , sizeof( tpReg )) ; return Leu_Erro

} /* if */

return Leu_OK ; } /* Função LerReg */

A função cliente contém o código:

Cond = LerReg( pArqA , pBuffer ) ; switch ( Cond )

{

case Leu_OK:

/* tratar o caso de leitura normal */ break ;

case Leu_Erro:

printf( "\nErro de leitura no arquivo: %s" , NomeArqA ) ; printf( "\nPrograma sendo cancelado" ) ;

Finalizar( 4 ) ; break ;

default:

printf( "\Erro de execução: LerReg condição desconhecida: %i" , Cond ) ;

printf( "\nPrograma sendo cancelado" ) ; Finalizar( 4 ) ;

(17)

Arrumação da casa (housekeeping)

Ao terminar a execução de um programa, componente ou função todos os

recursos alocados a este programa, componente ou função devem ser liberados • arquivos abertos

• dispositivos bloqueados • memória alocada

• recursos alocados

• semáforos, locks e outros elementos de sincronização

• estado do sistema para o que era antes de iniciar a execução • perfil de execução

Assegurar a liberação de recursos alocados é particularmente complexo quando o programa utiliza tratamento de exceções

• Pode-se utilizar um módulo de arrumação da casa para ajudar a resolver • De qualquer maneira é necessária disciplina ao programar

Referências

Documentos relacionados

• Árvores são ideais para armazenar hierarquias, além de serem mais rápidas e eficientes do que as estruturas de dados lineares... • É formada por um “conjunto de

– Os elementos devem estar ordenados – Realizar a busca pelo meio do vetor.

Promovido pelo Sindifisco Nacio- nal em parceria com o Mosap (Mo- vimento Nacional de Aposentados e Pensionistas), o Encontro ocorreu no dia 20 de março, data em que também

Entretanto, encontramos evidências neste trabalho de que estas variáveis não satisfazem as condições para serem utilizadas como instrumentos (Cap.2, seção 3.1.).

Assim como a Natureza, a leitura de folhetos de cordel constituiu uma fonte de inspiração para fazer poesia.. Na comunidade em que vivia Patativa, a leitura dos folhetos de

As quinolonas já têm sido relatadas como seguras para o tratamento da otite, sem apresentar sinais de ototoxicidade nos animais (GOTTHELF, 2004), e não foram observados

Apesar de o mercado acionário brasileiro ter se tornado mais importante para a economia brasileira, sobretudo entre o período de 2002 para 2005 (Tabela 3), sua repre- sentatividade

Para análise da susceptibilidade à erosão dos solos que compunham as paredes da voçoroca, foram realizados ensaios de Pinhole (Furo de Agulha), Desagregação e Dispersão