Você está na página 1de 93

RESUMO

DE

LINGUAGENS DE PROGRAMAO I

SUMRIO
Captulo I - Introduo ................................................................................................................3 I.1 O que uma linguagem de programao .......................................................................3 I.2 Motivos para se estudar os conceitos de linguagens de programao.........................3 I.3 Requisitos desejveis em uma linguagem de programao ..........................................3 I.4 Domnios de programao ................................................................................................4 I.5 Paradigmas de linguagens de programao ...................................................................4 I.6 Histrico ..............................................................................................................................7 I.7 Sintaxe x Semntica ..........................................................................................................8 I.8 Funcionamento das LPs ...................................................................................................9 I.9 Lista de Exerccios .......................................................................................................... 12 Captulo II - LISP ...................................................................................................................... 13 II.1 Introduo ................................................................................................................... 13 II.2 Notao Numrica...................................................................................................... 13 II.3 Predicado .................................................................................................................... 15 II.4 Funes J Prontas do LISP ..................................................................................... 15 II.5 Operadores Lgicos ................................................................................................... 15 II.6 Definio de Funes ................................................................................................. 16 II.7 Expresses Condicionais ........................................................................................... 17 II.7.1 Seleo Simples (IF) ........................................................................................... 17 II.7.2 Seleo Mltipla (COND) .................................................................................... 18 II.8 Recursividade ............................................................................................................. 18 II.9 CONS .......................................................................................................................... 19 II.10 Outras Funes do LISP .......................................................................................... 19 II.10.1 Comentrios ....................................................................................................... 19 II.10.2 Exibir no vdeo ................................................................................................... 19 II.10.3 Leitura ................................................................................................................. 20 II.11 Listas em LISP .......................................................................................................... 20 II.12 Lista de Exerccios ....................................................................................................... 24 Captulo III - A Memria........................................................................................................... 26 III.1 Alocao de memria................................................................................................ 26 III.2 Funcionamento dos ponteiros...................................................................................... 27 III.3 Exerccio de Laboratrio .............................................................................................. 27 III.4 Lista de Exerccios ........................................................................................................ 30 Captulo IV - Valores e Tipos .................................................................................................. 32 IV.1 Valores ....................................................................................................................... 32 IV.2 Tipos ........................................................................................................................... 32 IV.2.1 Tipos Primitivos ..................................................................................................... 32 LP numrica FORTRAN nmeros reais com escolha de preciso.............................. 32 IV.2.2 Tipos compostos.................................................................................................... 34 IV.3 Verificao de Tipos ..................................................................................................... 50 IV.4 Lista de Exerccios ....................................................................................................... 54 Captulo V - Expresses e Atribuio..................................................................................... 56 V.1 Expresses aritmticas ................................................................................................. 56 V.1.1 Ordem de avaliao de operadores ...................................................................... 56 V.1.2 Ordem de avaliao dos operandos ..................................................................... 57 V.2 Expresses Relacionais ................................................................................................ 60 V.3 Expresses Booleanas ................................................................................................. 60 V.4 Avaliao Curto-Circuito ............................................................................................... 60 V.5 Atribuio ....................................................................................................................... 61

V.6 Lista de Exerccios ........................................................................................................ 62 Captulo VI VARIVEIS ........................................................................................................ 64 VI.1 Nomes ........................................................................................................................... 64 VI.2 Endereo ....................................................................................................................... 65 VI.3 Tipo................................................................................................................................ 65 VI.4 Valor .............................................................................................................................. 65 VI.5 Tempo de vida .............................................................................................................. 65 VI.6 Escopo .......................................................................................................................... 68 VI.7 Constantes Nomeadas................................................................................................. 71 VI.8 Inicializao de Variveis............................................................................................. 71 VI.9 Variveis Transientes e Variveis Persistentes ......................................................... 71 VI.10 Lista de Exerccios ..................................................................................................... 71 Captulo VII - Abstrao de Controle...................................................................................... 75 VII.1 Instrues de seleo .............................................................................................. 75 VII.1.1 Seletores Bidirecionais: .................................................................................... 75 VII.1.2 Seletores Mltiplos ............................................................................................ 76 VII.2 Instrues Iterativas: ................................................................................................ 77 VII.2.1 Laos controlados por contador: ...................................................................... 77 VII.2.2 Laos controlados logicamente:....................................................................... 79 VII.2.3 Mecanismos de controle de laos localizados pelo usurio .......................... 79 VII.3 Desvio incondicional ................................................................................................ 80 VII.4 Comandos protegidos:............................................................................................. 80 VII.5 Lista de Exerccios ...................................................................................................... 81 Captulo VIII - Abstrao de Processos ................................................................................. 83 VIII.1 Introduo ................................................................................................................ 83 VIII.2 Definies ................................................................................................................ 83 VIII.3 Parmetros .............................................................................................................. 84 VIII.3.1 Tipos de Parmetros ........................................................................................ 84 VIII.3.2 Mtodos de passagem de parmetros ........................................................... 85 VIII.3.3 Verificao de tipos dos parmetros.................................................................. 86 VIII.4 Mdulo ..................................................................................................................... 86 VIII.5 Abstrao de Dados Tipos Abstratos de Dados ................................................... 87 VIII.6 Subprogramas Sobrecarregados (OVERLOADING)............................................... 88 VIII.7 Subprogramas Polimrficos Polimorfismo paramtrico .................................... 89 VIII.8 Classes ....................................................................................................................... 90 VIII.9 Lista de Exerccios ..................................................................................................... 92

CAPTULO I - INTRODUO
I.1 O que uma linguagem de programao
Notao para descrever ordens que o computador dever executar.

I.2 Motivos para se estudar os conceitos de linguagens de programao

Melhora a compreenso das linguagens j conhecidas Assim, ao conhecer vrias linguagens, o nmero de limitaes impostas ao construir um software reduzido, pois o programador torna-se capaz de aprender novas construes de linguagem. Facilita o aprendizado de novas linguagens Ao adquirir uma compreenso dos conceitos fundamentais das linguagens, ser mais fcil compreender como esses esto incorporados ao projeto da linguagem aprendida. Por exemplo, programadores que entendem o conceito de abstrao de dados aprendero construir, melhor e mais rpido, tipos abstratos de dados em Java. Facilita o projeto de uma linguagem Um exame crtico das LPs ajudar no projeto de sistemas complexos, ajudando os usurios a examinar e avaliar esses produtos.

Facilita a escolha de uma linguagem para um projeto Pois cada linguagem tem sua caracterstica prpria, bem como aplicaes prprias.

I.3 Requisitos desejveis em uma linguagem de programao

Legibilidade Um software deve ser facilmente lido e entendido, pois a manuteno uma parte importante. A linguagem no deve permitir implementar cdigo ilegvel. Para isto, a linguagem deve ter: Simplicidade (por isso, ela NO deve ter muitos comandos, um nico smbolo com vrios significados, sobrecarga de operadores, para uma funo: c = c + 1; c++; c += 1; ++c) Ortogonalidade, ou seja, um conjunto pequeno de instrues primitivas pode ser combinado para construir as estruturas de controle e de dados da linguagem. Alm disso, toda combinao de primitivas deve ser legal e significativa. A falta de ortogonalidade acarreta excees s regras da LP. Instrues claras de controle, para isso, deve ser evitado o uso de GOTO. Tipos de Dados e Estruturas adequados (Ex.: ter um tipo booleano e no um tipo inteiro como sinalizador, ter um tipo registro e no usar um conjunto de vetores) Boa sintaxe, (contra-exemplos: restringir identificadores a tamanhos muito pequenos, no ter palavras especiais para identificar incio e/ou final de blocos, permitir letra maiscula e minscula, permitir que palavras especiais possam ser usadas como nomes de variveis, ter instrues com nomes no significativos ou duas instrues com nome idnticos mas com significados diferentes).

Facilidade de escrita (Redigibilidade) Facilidade com que a linguagem pode ser usada para criar programas. Portanto, a linguagem no deve ter um nmero grande de construes primitivas e um conjunto consistente de regras para combin-las.

Profa. Cinthia C L Caliari

Tratamento de excees Verificar erros em tempo de execuo e pr em prtica medidas corretivas Eficincia Reuso de cdigo Subprogramas, modularizao, estrutura de dados Flexvel Facilidade de modificar o programa a partir de novos requisitos Fcil de aprender

a Questionamento: Uma LP que abrangesse todos os tipos de dados possveis, todos os operadores possveis, possusse qualquer tipo de comando implementado seria considerada uma boa linguagem de programao? Sim ou No? Por qu?

I.4 Domnios de programao


Uma LP pode ser desenvolvida, criada para determinados fins, determinados domnios. Podemos citar alguns destes domnios: Aplicaes comerciais COBOL (1960) Possuem facilidade para produzir relatrios elaborados Aplicaes cientficas FORTRAN (1957) Possuem estrutura de dados simples, mas exigem um grande nmero de computaes aritmticas com nmeros reais. As estruturas de dados mais comuns so matrizes e as de controle so os laos de contagem e selees. Programao de novos sistemas PL/S; C Devem ser eficientes na execuo, ou seja, uma execuo rpida. Alm disso, devem ter recursos de baixo nvel que permitam ao software fazer interface com dispositivos externos.

Linguagens de scripting AWK; KSH So usadas colocando-se uma lista de comandos, chamados de script, em um arquivo para serem executados. Linguagens de propsitos especiais RPG produzir relatrios comerciais

I.5 Paradigmas de linguagens de programao


Um paradigma um modelo, padro ou estilo de programao suportado por determinado grupo de linguagens. A maioria dos livros da rea de LP categoriza 4 paradigmas de programao:

O paradigma imperativo O paradigma funcional O paradigma lgico O paradigma orientado a objetos

a O paradigma Imperativo A maioria das LPs dos ltimos 35 anos foi projetada em funo da arquitetura de computador prevalecente, chamada de arquitetura Von Neumann (pronuncia-se fon Niman) em homenagem a um de seus criadores, John von Neumann. Nesta arquitetura, tanto os dados como os programas so armazenados na mesma memria. A CPU, que executa realmente as instrues, separada da memria.

Profa. Cinthia C L Caliari

Memria

Unidade Lgica Aritmtica

Unidade de Controle

Dipositivos E/S

CPU
Portanto as instrues e os dados devem ser transmitidos da memria para CPU e viceversa. Assim as linguagens imperativas modelam esta arquitetura atravs de variveis, que modelam as clulas de memria, e comando de atribuio, responsveis pela transmisso entre memria e CPU. Desta forma os programas feitos nestas linguagens so muito eficientes, pois extraem ao mximo as funcionalidades da mquina. Exemplos de LPs imperativas: FORTRAN, PASCAL, C, etc.. Vantagens:

Eficincia (arquiteturas atuais so Von Neumann) Paradigma mais do que estabelecido

a O paradigma Funcional Imita ao mximo as funes matemticas No usa variveis e comandos de atribuio Iterao feita por meio de recursividade, j que no permite variveis para o controle Exemplos: LISP, inicialmente puramente funcional depois adquiriu alguns conceitos imperativos. Scheme, ML, Haskell (puramente funcional) Exemplo de Haskell:
fatorial 0 = 1 fatorial n = n*fatorial (n -1)

Podemos observar que a sintaxe da definio e da aplicao da funo define-se no nome desta simplesmente escrito prximo aos parmetros. Logo, definio de funes pode incluir mais de uma linha, que definem verses de funes para diferentes formas de parmetros reais. Usadas principalmente em aplicaes de IA, alm desta rea utilizou-se LISP para criar o editor de texto EMACS. Comparao No precisa se preocupar com variveis queda de eficincia Programao mais simples Execuo concorrente mais simples 5

Profa. Cinthia C L Caliari

a O paradigma Lgico Linguagens que utilizam-se de lgica simblica e um processo de inferncia lgica. Consistem em proposies (instruo lgica que pode ou no ser verdadeira) HOMEM (Fred) e conectores lgicos (e, ou, negao, implica, equivale) Exemplo: Prolog estrela (sol) orbita (terra, sol) orbita (marte, sol) planeta (P) :- orbita (P, sol) ?-Planeta (Terra). Aplicaes: Sistemas de gerenciamento de banco de dados relacionais, sistemas especialistas, IA dentre outras. Comparao: programas mais lgicos, gerando menos erro e manuteno processamento paralelo tempo de prototipao mnimo a O paradigma Orientado a Objetos De maneira simplista podemos dizer que LPs OO permitem a criao de um tipo de dado (classe), onde este tipo alm de conter variveis (atributos) tambm possuir na sua declarao os procedimentos ou funes (mtodos) para manusear este tipo. Uma varivel deste tipo poder ser criada, e esta chamada ento de objeto. Qualquer atualizao ou alterao da varivel se dar mediante os procedimentos e funes declarados no tipo. nfase em reutilizao de cdigo Uso mais comum junto com o paradigma imperativo. Embora existam, por exemplo, verses de Lisp OO como CLOS Exemplo em JAVA:
class Data { private int dia; private int mes; private int ano; public void dia mes ano } } public class Principal { public static void main (String[] args ) { Data Data_Nascimento = new Data(); Data_Nascimento.Alterar_data (1, 1, 1980); } } Alterar_data ( int d, int m, int a) { = d; = m; = a;

Profa. Cinthia C L Caliari

Observao: Tendncia Atual a combinao de paradigmas Atualmente as linguagens de programao modernas incorporam um ou mais paradigmas. Por exemplo, Java uma linguagem imperativa, orientada a objetos e distribuda. Pascal uma linguagem imperativa. ML uma linguagem dominantemente funcional, porm possui uma extenso imperativa.

I.6 Histrico
Breve comentrio sobre as linguagens do quadro abaixo: Fortran a precursora de todas as linguagens imperativas modernas. Linguagem oficial dos antigos mainframes da IBM. Ainda muito usada em supercomputadores, como o CRAY, por fsicos e engenheiros. Algol apresentou o primeiro esboo interessante de uma linguagem de programao moderna, incluindo conceitos como estruturas de blocos e procedimentos. No saiu dos limites da academia. Cobol foi criada para o desenvolvimento de aplicaes comerciais. Foi desbancada pelo surgimento dos sistemas gerenciadores de bancos de dados. Ainda existem muitos sistemas desenvolvidos nesta linguagem em fase de manuteno. Novas verses contam com Cobol OO. Simula precursora das linguagens orientadas a objetos. Smalltalk certamente a nica linguagem orientada a objetos pura. Pascal a linguagem mais popular de todas as descendentes de Algol. Simples, sistemtica e com implementaes eficientes foi o carro-chefe da Borland por muitos anos. uma das linguagens mais recomendadas para ensino de programao. De Pascal surgiram muitas outras linguagens como Modula-2 e Delphi, que passou a incorporar orientao a objetos e definio/manipulao de dados (SQL). C ainda hoje uma das linguagens mais utilizadas, principalmente no ambiente Unix, que foi desenvolvido atravs dela. Sua marca maior a eficincia, porm construes de baixo nvel tornam seus programas difceis de serem lidos e depurados. A partir de C, surgiram as linguagens C++ e Java, as quais incorporaram o paradigma de orientao a objetos, porm a segunda eliminou o uso explcito de apontadores e deu nfase programao distribuda na Internet, fator primordial de seu sucesso. Em outra linha de desenvolvimento, inicialmente voltado para aplicaes de inteligncia artificial, sugiram as linguagens funcionais e lgicas. Lisp linguagem funcional foi a precursora. A linguagem Prolog largamente utilizada ainda hoje para o desenvolvimento de aplicaes cognitivas (novo nome para inteligncia artificial). As linguagens funcionais tm ML como representante de maior sucesso. Vale ressaltar tambm Haskell e Miranda uma linguagem funcional pura.

Profa. Cinthia C L Caliari

50

Fortran Cobol
Algol 60

Lisp Prolog

60
Simula

PL/1

Smalltalk

Pascal

C ML

70
Modula Ada

80

Oberon Eiffel

C++

Miranda

Haskell

Funcional 90
Java

Lgico

Imperativo Orientado por Objertos

I.7 Sintaxe x Semntica


fundamental para o sucesso de uma LP ter uma descrio concisa e inteligvel da linguagem. Os estudos das LPs podem ser divididos em exames de sintaxe e semntica. importante conhecer os limites entre estes dois conceitos e sua importncia: Sintaxe o formato dos programas linguagem usada para construir programas, ou seja, a forma de suas expresses, de suas instrues e de suas unidades de programa. Semntica significado dos programas como eles se comportam quando executados em um computador, ou seja, o significado das expresses, instrues e unidades de programa. A sintaxe influencia a forma como programas so escritos, enquanto que a semntica dita como os programas devem ser entendidos por outros programadores e executados em um computador. A semntica a parte mais importante e que realmente caracteriza uma linguagem. Por exemplo, uma dada construo pode ser apresentada da mesma forma em diferentes linguagens de programao, porm com semnticas diferentes, ou vice-versa. No final das contas, voc s vai saber us-la adequadamente se conhecer bem o seu significado. Para corrigir sintaxe, temos os compiladores. Porm desentendimentos

Profa. Cinthia C L Caliari

semnticos podem nos levar a produzir o programa errado ou com comportamentos indesejados e imprevisveis. Exemplo de sintaxe em C:
if { } (<expresso>) <instrues>

A semntica dessa forma de instruo obedece seguinte condio: se o valor atual da expresso for verdadeiro, a instruo incorporada ser selecionada para execuo.

I.8 Funcionamento das LPs


Um processador de um computador s capaz de executar um conjunto restrito de operaes de hardware muito bsicas. Instrues de mquina consistem de vrios bytes armazenados na memria principal que instruem o processador a executar uma operao de hardware. Uma coleo de instrues de mquina na memria principal se chama programa em linguagem de mquina ou, como mais conhecido, programa executvel. Implementar programas em LPs de baixo nvel, ou seja, prximo da linguagem de mquina muito difcil e improdutivo. A maioria dos programas so criados em LPs de alto nvel. Nestas linguagens escrevemse programas utilizando instrues que no so conhecidas pela mquina. O arquivo gerado pelo conjunto de comandos destas Lps dito arquivo fonte ou cdigo fonte. Ele no pode ser executado pelo processador. Para se executar o programa necessrio realizar uma converso do cdigo fonte para o cdigo de mquina. Isto feito atravs de um outro programa: o tradutor. A traduo pode ser feita de duas maneiras: atravs da compilao ou atravs da interpretao. a Compilao Na compilao todo o programa fonte traduzido para a linguagem de mquina, gerandose assim um outro arquivo chamado de programa executvel. Este programa pode ser ento submetido ao processador e executado pelo mesmo. O programa que realiza a compilao chamado de compilador. A grande vantagem da compilao a execuo rpida do programa. Apenas o cdigo executvel carregado na memria. A desvantagem a falta de portabilidade. Gerao de um cdigo executvel: Cdigo Fonte

Compilador

Ligador

Programa

Compilador => converte para cdigo de mquina. Ligador => Liga as partes de um cdigo, transformando-o em um nico bloco. 9

Profa. Cinthia C L Caliari

PROGRAM Arquivo Prog1; Fonte USES CRT; : :

Editor de texto

COMPILADOR

Arquivo Executvel

01000111 11001110 11111111 01000111

Execuo
Observe que, a velocidade da conexo entre a memria de um computador e seu processador, normalmente, determina a velocidade do computador, porque, muitas vezes, as instrues podem ser executadas mais rapidamente do que podem ser transferidas para o processador para serem executadas. Essa conexo chamada de GARGALO DE VON NEUMANN. Ele o principal fator limitante na velocidade da arquitetura de computadores de Von Neumann. O gargalo de Von Neumann foi uma das principais motivaes para a pesquisa e desenvolvimento de computadores paralelos. aInterpretao A interpretao traduz um comando de cada vez, executando-o antes de traduzir o comando seguinte. No h gerao de programa executvel.

<SCRIPT> Arquivo valor = 10

Fonte

document.write(..)

INTERPRETADOR

01000111

Executa

10

Profa. Cinthia C L Caliari

Vantagem Permite fcil implementao de muitas operaes de depurao do cdigo-fonte, porque todas as mensagens de erro, em tempo de execuo, podem referir-se a unidades de cdigo. Portabilidade. Basta que tenhamos um interpretador da LP em cada ambiente e o mesmo programa poder ser executado em cada um deles.

Desvantagem Necessidade de se manter na memria tanto o programa fonte como o interpretador fazendo com que o processo se torne lento.

a Mecanismos hbridos Uma soluo para a lentido da interpretao e a falta de portabilidade da compilao gerar LPs hbridas, ou seja, LPs que combinem a compilao com a interpretao. Essas LPs traduzem programas em uma linguagem de alto nvel para uma linguagem intermediria, projetada para permitir fcil interpretao. Esse mtodo mais rpido que a interpretao pura porque as instrues da linguagem fonte so decodificadas somente uma vez.

public class exem { Arquivo public static void ... Editor de texto Fonte } :

COMPILADOR ?????? Cdigos ?????? Intermedirios ?????? ?????? INTERPRETADOR

01000111

Executa

11

Profa. Cinthia C L Caliari

I.9 Lista de Exerccios


1)Qual a importncia de se conhecer os conceitos gerais de linguagens de programao? 2) Linguagens de baixo nvel so aquelas que esto mais prximas da linguagem de mquina. Quais propriedades desejveis em lps as linguagens de baixo nvel no satisfariam? Ento, por que ainda se utilizam tais linguagens? 3) Cite uma vantagem da interpretao e da compilao. 4) Por que algumas LPs so hbridas? 5) A arquitetura de um computador influencia na implementao de uma LP? Por que? 6) Por que til que o programador tenha embasamento em projeto de linguagens, mesmo que, talvez, ele jamais projete, de fato, uma linguagem de programao? 7) Que linguagem de programao dominou as aplicaes comerciais ao longo dos ltimos 40 anos? 8) Em que linguagem o UNIX foi escrito? 9) Qual instruo de controle primitiva usada para construir instrues de controle mais complicadas em linguagens em que elas no existem? 10) O que manipulao de excees? 11) Por que o gargalo Von Neumman importante? 12) Quais os argumentos que voc poderia levantar a favor e contra a idia de uma nica linguagem para todos os domnios de programao? 13) Avalie o JAVA, usando os critrios descritos neste captulo. 14) Defina, com suas palavras, sintaxe e semntica. 15) Explique cada um dos quatro paradigmas e d uma LP exemplo de cada. 16) Por que LPs compiladas so mais rpidas? 17) D exemplos de falta de legibilidade em uma LP. 18) Explique o que portabilidade. 19) Cite e explique duas maneiras de como se obter um sistema multiparadigma.

12

Profa. Cinthia C L Caliari

CAPTULO II - LISP
II.1 Introduo
LISP uma linguagem bastante dinmica e fcil de se adaptar s mudanas de paradigmas de programao que podem ocorrer. Seus programas so constitudos de pequenos mdulos, os quais cumprem objetivos bem simples. Um programa completo constitudo da combinao de seus mdulos. LISP uma linguagem flexvel, pois permite que funes definidas pelo usurio no sejam distintas daqueles inerentes linguagem, alm de no haver tipificao de dados. A linguagem LISP interpretada, o que a tornava muito mais lenta que as outras linguagens. Mas, com o aparecimento de compiladores eficazes e da melhoria do suporte dos processadores, LISP tornou-se mais eficiente. Esta uma linguagem que permite ao programador incorporar outros estilos de programao. Permitindo, assim, adaptar a linguagem ao problema que est sendo resolvido. LISP uma linguagem interativa, pois cada parte de um programa pode ser compilada, corrigida e testada, de forma independente das demais.

II.2 Notao Numrica


LISP se utiliza de notao prefixa, ou seja, para construir expresses so utilizados primeiro operadores e, aps, operandos. Ento, o LISP considera o primeiro elemento com o sendo um operador e os demais, operandos. Ex. NOTAO INFIXA : NOTAO PREFIXA : 2+3*5 (+ 2 (* 3 5))

Vantagens da Notao Prefixa: a. possvel usar um operador para mais de dois argumentos: > (+ 1 2 3) 6 > (+ 1 2 3 4 5 6 7 8 9 10) 55

b. No existe precedncia entre operadores. A precedncia feita atravs de parnteses: > (+ 1 (* 2 3) 7 > (* (+ 1 2) 3) 9

c. Os operadores definidos pelo programador so usados da mesma maneira que os operadores da linguagem (operador primeiro, operandos depois).

13

Profa. Cinthia C L Caliari

Desvantagem: Escrita de combinaes complexas. Ex.: ( (+ 1 (* 2 3)) (* (/ 4 5) 6)) Para facilitar a leitura, possvel identar uma expresso: ( (+ 1 (* 2 3)) (* (/ 4 5) 6)) Podemos fazer as seguintes observaes: 1) Diviso de argumentos inteiros retorna inteiro ou frao: > (/ 21 7) > (/ 21 7.0) > (/ 9 2) >3 > 3.0 > 9/2 2) Diviso com um argumento retorna o inverso do argumento: > (/ 2.0) > (/ 2) > 0.5 > 1/2 Ex.1 Converta de notao infixa para prefixa: a) 1 + 2 3 b) 1 2 * 3 c) 1 * 2 3 d) 1 * 2 * 3 e) (1 2) * 3 f) (1 2) + 3 g) 1 (2 + 3) h) 2 * 2 + 3 * 3 * 3 2 Calcule as expresses abaixo e depois converta de notao prefixa para infixa: a) (* (/ 1 2) 3) b) (* 1 ( 2 3)) c) (/ (+ 1 2) 3) d) (/ (/ 1 2) 3) e) (/ 1 (/ 2 3)) f) ( ( 1 2) 3) g) ( 1 2 3) 3 Calcule o valor das expresses LISP abaixo: a) (* (/ 1 2) 3) b) (* 1 ( 2 3)) c) (/ (+ 1 2) 3) d) (/ (/ 1 2) 3) e) (/ 1 (/ 2 3)) f) ( ( 1 2) 3) g) ( 1 2 3) h) ( 1)

> (/ 9.0 2) > 4.5

14

Profa. Cinthia C L Caliari

II.3 Predicado
Predicado a funo usada como teste. O valor do teste interpretado como VERDADEIRO ou FALSO. Isso no significa que seja um tipo lgico ou booleano, mas uma expresso condicional considera NIL como FALSO e qualquer outro valor como VERDADEIRO. Ex.: > > > > (> 4 3) t (< 4 3) NIL

II.4 Funes J Prontas do LISP


(max 2 19 7) - retorna o maior valor da lista (min 2 19 7) - retorna o menor valor da lista (expt 2 4) - 2 elevado a 4 (sqrt 9) - raiz quadrada de 9 (mod 4 2) - retorna o resto inteiro da diviso de 4 por 2 (truncate 13.6) - retorna o valor truncado e o resto (round 13.6) - retorna o valor arredondado e o resto (abs 2) - retorna o valor absoluto de 2 (random 5) retorna um nmero randmico entre 0 e 5 ZEROP - retorna T se o argumento for 0. Exemplo: (ZEROP (- 3 2 1)) >T (ZEROP 1) > NIL EQUAL - retorna T se existirem dois argumentos e eles forem iguais. Exemplos: (EQUAL (+ 2 3) (- 6 1)) T Note que EQUAL avalia resultado de expresses booleanas tambm. EVENP - retorna T se o argumento for par. Exemplo: (EVENP * 3 17)) >T ODDP - retorna T se o argumento for mpar.

II.5 Operadores Lgicos


AND Avalia os argumentos da esquerda para a direita at que um deles seja falso. e nenhum for falso, devolve o valor do ltimo argumento. OR Avalia os argumentos da esquerda para a direita at que um deles seja diferente de falso, devolvendo este valor. Se todos forem falsos, devolve falso. NOT Avalia verdadeiro se o argumento for falso e vice-versa. OBS.: Lembre-se que qualquer valor diferente de NIL considerado verdadeiro.

15

Profa. Cinthia C L Caliari

Exerccio: Determine o valor das seguintes expresses: a) (and (or (> 2 3) (not (= 2 3))) (< 2 3)) b) (not (or (= 1 2) (= 2 3))) c) ( o r ( < 1 2 ) ( = 1 2 ) ( > 1 2 ) ) d) (and 1 2 3) e) (or 1 2 3) f) (and nil 2 3) g) (or nil nil 3)

II.6 Definio de Funes


Vamos definir uma funo para elevar um nmero ao quadrado: SINTAXE: > ( defun nome (par1 par2 ... parn) corpo) Onde: DEFUN Informa ao avaliador que estamos definindo uma funo NOME Nome da funo PAR So os parmetros passados CORPO Combinao de expresses que determina o valor da funo para os parmetros passados. > (defun quadrado (n) (* n n) ) quadrado O avaliado acrescenta a funo ao conjunto de funes da linguagem, associando ao nome que lhe foi dado e retorna como valor o nome da funo. > quadrado 5 25 > quadrado 9 81 > quadrado (+ 1 2) 9

16

O interpretador avalia primeiro o operando (+ 1 2) = 3, que usado pela funo como parmetro real. > (quadrado (quadrado (+ 1 2)) (quadrado (quadrado (3)) (quadrado (* 3 3)) (quadrado 9) (* 9 9) 81

Etapas de avaliao de operandos e do corpo da funo

Ao definir uma funo associamos um procedimento a um nome, precisando de memria para guardar o procedimento em si e a associao. Esta memria do LISP chamada de AMBIENTE. O ambiente s existe enquanto se trabalha com a linguagem. Ao terminar, perde-se todo o ambiente. O que fazer, ento, para no perder o trabalho? Escrever as funes em um ficheiro e ir passando-as para o LISP. Observe que quase no h limitaes para a escrita de nomes. Assim, a diferena entre nomes e combinaes est na existncia de parnteses e espaos em branco. > (defun x+y*z (x y z) (+ (* y z) x)) x+y*z > (x+y*z 1 2 3) 7 O primeiro elemento da combinao o avaliador LISP usa como definio da funo.

II.7 Expresses Condicionais


So expresses cujo valor depende de um ou mais testes realizados previamente, onde possvel escolher caminhos diferentes para obteno do resultado. No caso mais simples temos 2 alternativas.

II.7.1 Seleo Simples (IF) SINTAXE: (IF condio conseqncia alternativa) IF avaliado determinando o valor da condio. Se for T, avaliado a conseqncia. Se for NIL, avaliada a alternativa. EX.: (IF (> 4 3) 5 6)

LP I

Prof. Cinthia C L Caliari

EXERCCIO: 1) Defina uma funo soma_grandes que recebe 3 nmeros como argumentos e determina a soma dos dois maiores 2) Escreva uma funo que calcula o fatorial de um nmero. 3) Defina uma funo que calcula o delta de uma equao do 2 grau.

II.7.2 Seleo Mltipla (COND) uma espcie de CASE do PASCAL Este comando simplifica o caso de muitos IF(s). SINTAXE: (COND (cond1 (cond2 (condn expr1) expr2) expren))

COND testa cada uma das condies. A primeira verdadeira que encontrar, devole o valor da expresso correspondente, terminando a avaliao. EX.: (COND ((> 4 3) 5) T 6)) 2) (defun teste (x y z w) (cond (( > x y) z) ((< (+ x w) (* y z)) x) ((= w z) (+ x y)) (T 777))) Se esta funo for definida com IF, teremos: 3) (defun teste (x y z w) (if ( > x y) z (i f ( < ( + x w ) ( * y z ) ) x (if (= w z) (+ x y) 777))))

II.8 Recursividade
Em funes recursivas deve haver: a) Um passo bsico com resultado reconhecido de imediato b) Um passo recursivo em que se tenta resolver um sub-problema inicial O objetivo resolver subproblemas cada vez mais simples at atingir o mais simples de todos, ou seja, aquele que tem resultado imediato. Podem ocorrer ERROS, como por exemplo: 18

LP I

Prof. Cinthia C L Caliari

a) No detectar o caso mais simples b) No diminuir a complexidade do problema c) A recurso pode no parar Exemplo: 1) Faa funes que calculem: a) S = 1 + 2 + 3 + ... + n 1 3 5 7 b) S = + + + + ... 1 2 3 4 4 4 4 4 4 c) = 4 + + + ... 3 5 7 9 11 100 99 98 97 d) S = + + + + ... 0! 1! 2! 3! x1 x 2 x3 e) e x = x 0 + + + + ... 1! 2! 3!

II.9 CONS
Esta estrutura similar ao registro. Cria uma estrutura com 2 elementos. Pode haver CONS aninhados > (cons 1 2) (1 . 2) > (cons (cons 1 2) 3) ((1 . 2) . 3)

II.10 Outras Funes do LISP


II.10.1 Comentrios O smbolo ; indica incio de comentrio

II.10.2 Exibir no vdeo


> ( w r i t e m e n s a g e m ) ; exibe no vdeo um resultado mensagem > (write (+ 2 3)) 5 > ( p r i n c m e n s a g e m ) ; exibe uma string sem aspas ou um resultado mensagem > ( p r i n c ( + 2 3 ) ) ; exibe no vdeo um resultado 5 > ( w r i t e - l i n e m e n s a g e m ) ; exibe no vdeo como string sem aspas mensagem > ( t e r p r i ) ; salta de linha

19

LP I

Prof. Cinthia C L Caliari

II.10.3 Leitura > (read) > ( r e a d - l i n e ) ; leitura de string Ex.: > ( + ( r e a d ) ( r e a d ) ) 2 3 5 Exerccios: 1) Implementar um programa que calcula as razes de uma equao de 2 grau (ax2 + bx + c = 0) 2) Implemente um programa que tenha o seguinte menu: 1 Somar dois nmeros 2 Razes da equao de 2 grau 3 Sair De acordo com a opo desejada, o usurio dever entrar com os dados necessrios a cada operao. 3) Implemente um programa que calcule o peso ideal de uma pessoa: HOMENS => peso ideal = 72.7 * h 58 MULHERES => peso ideal = 62.1 * h 44.7 Deve haver um menu: 1 PESO IDEAL PARA HOMENS 2 PESO IDEAL PARA MULHERES 3 SAIR O usurio dever entrar com a opo e, a seguir com a altura.

II.11 Listas em LISP


Lista uma estrutura de dados que armazena vrios elementos. uma estrutura muito utilizada e bastante flexvel. Alis, o nome LISP uma abreviao de LIST PROCESSING. Uma lista pode ser criada com: Aspas: > (1 2 3 4 ) (1 2 3 4) O comando LIST: > (list 1 2 3 4) ( 1 2 3 4) O comando CONS: > (cons 1 (cons 2 (cons 3 (cons 4 5)))) (1 2 3 4 . 5)

20

LP I

Prof. Cinthia C L Caliari

Operaes com listas: 1) Criar uma lista e nome-la para us-la mais tarde: > setf alunos (Joo Carla Lucia Paulo Bruno) 2) Para retornar o contedo da lista, basta cham-la: > alunos (Joo Carla Lucia Paulo Bruno) 3) Acrescentar um objeto ao incio da lista: > (setf alunos (cons Pedro alunos)) (Pedro Joo Carla Lucia Paulo Bruno) 4) Acrescentar um objeto ao final da lista, ou concatenar listas: > (setf alunos (append alunos Ana)) (Pedro Joo Carla Lucia Paulo Bruno Ana) 5) Excluir um nome da lista: > (setf alunos (remove Joo alunos)) (Pedro Carla Lucia Paulo Bruno Ana) 6) Fazer referncia a algum objeto da lista: > first alunos ; retorna o primeiro elemento Pedro > second alunos ; ; retorna o segundo elemento Carla > rest alunos ; retorna o restante da lista (sem o primeiro elemento) Carla Lucia Paulo Bruno Ana Exerccio: D o resultado de cada uma das listas abaixo: Setf L (list 1 4 5 8 0) a) First L b) Rest L c) First (rest L) d) Rest (first L) e) Rest (rest L) f) Rest (rest (rest L))

OBS.: 1) O primeiro elemento da lista corresponde a n = 0. 2) lista vazia uma seqncia sem qualquer elemento e pode ser escrita como nil ou ainda mais simplesmente (). 3) Null ! retorna true se lista vazia. Exemplos: > (null nil) t > (null (cons 1 (cons 2 nil))) nil 21

LP I

Prof. Cinthia C L Caliari

Exerccios: 1) Escreva uma funo que cria um alista de todos os elementos do inteiro a at o inteiro b.
Criar_lst ( 1 5) ( 1 2 3 4 5) Criar_lst (5 10) ( 5 6 7 8 9 10)

2) Implemente um funo que conte todos os elementos de uma lista

Caso simples: lista vazia contar ( L ) null L = t 0 Caso Geral: Lista com um elemento contar ( L ) 1 + 0 1 + contar (rest L) Lista com dois elementos contar ( L ) 1 + 1 + 0 1 + contar (rest L) Funo recursiva: 1 + contar ( rest L )

3) Implemente uma funo que some todos os elementos de uma lista 4) Implemente uma funo que recebe um elemento, verifica se ele existe. Caso exista na lista, devolve sua posio, caso contrrio, mostra a mensagem ELEMENTO NO EXISTE. Voc dever fazer funes auxiliares. 5) Implemente uma funo que devolve o n-simo elemento de uma lista 6) Escreva uma funo que crie uma lista com todos os elementos mpares de outra lista.

22

LP I

Prof. Cinthia C L Caliari

RESPOSTAS: 1)
(defun criar-lista (a b) (if (> a b) NIL (cons a (criar-lista (+ a 1) b)))) 2) (defun qelem (L) (if (null L) 0 (+ 1 (qelem (rest L))))) 3) (defun somar (L) (if (null L) 0 (+ (first L) (somar (rest L))))) 4) (defun posicao (elem L) (cond ((null L) 2) ((= elem (first L)) 1) ( t (+ 1 (posicao elem (rest L)))))) (defun existe (elem L) (if (>= (qelem L) (posicao elem L)) (posicao elem L) (write-line "elemento no existe"))) 5) (defun n-esimo (n L) (cond ((> n (qelem L)) nil) ((= n 1) (first L)) (t (n-esimo (- n 1) (rest L))))) 6) (defun listaImpar (L) (cond ((null L) nil) ((oddp (first L)) (cons (first L) (listaImpar (rest L)))) (t (listaImpar (rest L)))))

23

LP I

Prof. Cinthia C L Caliari

II.12 Lista de Exerccios


1 Escreva as expresses abaixo em forma prefixa: a) 1 + b) c)

( a + b) 2 * ( 2ab c) c3
c2 * (ab + c) 4a

( a 2b) 2
3

a+2 b3 c 2 2a + 3( 2a 1) 4 2a

2 Avalie as condicionais abaixo: a) (and (>= (+ 1 2) 3) ( < 2 5) ( 3 3)) b) (or (< (+ 1 1) 0) (and (+ 3 1) (> (* 2 2) 5)) (= (- 2 3) -1)) c) (and (> (* 2 3) (sqrt 81))(or (= (+ 2 3) (* 2 3))( 3 (* 2 4))))

3 Implemente um programa em LISP que leia um nmero inteiro e faa o clculo abaixo: N +1 N + 2 N + 3 2N a) S = + + + ... + 1 3 5 2N 1 2N 1 2N 3 2 N 5 1 b) S = + + + ...+ 1 2 3 N

4 Faa um programa em LISP que calcule os n primeiros termos das sries: a)

1000 997 994 991 + + ... 1 2 3 4 61 59 57 + + + ... 1! 2! 3!

b) 63 +

5 Escreva uma funo em LISP que calcula o novo salrio de um empregado: Salrio at 300 reais, reajuste de 50% Salrio acima de 300 reais reajuste de 30%

6 Faa uma funo em LISP que calcula a rea de um quadrado, e outra funo que calcula a rea de um trapzio.

7 - Faa uma funo em LISP que receba duas notas e seus pesos e calcula a mdia ponderada dessas notas.

8 Faa um programa em LISP, que pea ao usurio para entrar com trs notas de um aluno. Faa outra funo que calcule a mdia aritmtica e verifique a situao do aluno segundo as informaes: APROVADO (todas as notas devem ser >= 7,0) PROVA FINAL 24

LP I

Prof. Cinthia C L Caliari

(mdia >= 4,0 ou mdia >= 7,0 mas com alguma nota < 7,0) REPROVADO (mdia < 4,0). Como deve ser feita a chamada desta funo?

9 Faa um programa em Lisp, que pea ao usurio para entrar com trs valores positivos. Faa outra funo que receba os trs valores a nteriores e verifique se eles podem formar um tringulo (cada lado menor que a soma dos outros dois). Se puderem, diga se o tringulo eqiltero (trs lados iguais), issceles (dois lados iguais) ou escaleno (trs lados diferentes). Como deve ser feita a chamada desta funo?

10 Escreva duas funes em LISP. Uma para entrar com o cdigo e a quantidade de produtos vendidos e calcular o valor bruto da nota fiscal (sem desconto), segundo a tabela: cdigo 1 a 10 11 a 20 21 a 30 Preo R$ 10,00 R$ 15,00 R$ 20,00 Valor bruto da NOTA At R$ 250,00 (inclusive) Entre R$ 250,00 e 500,00 Acima de R$ 500,00 % desconto 5 7,5 10

Outra funo para calcular o valor final da nota, com desconto. Observe que o desconto depende apenas do valor bruto da nota, ou seja, depende da primeira funo. 11 Faa uma funo em LISP para criar uma lista que representa uma pg. Voc deve entrar com o 1. elemento, a razo e a quantidade de elementos.

25

LP I

Prof. Cinthia C L Caliari

CAPTULO III - A MEMRIA


III.1 Alocao de memria
A memria principal de um computador consiste de uma enorme seqncia contgua e finita de bits. Contudo, a menor unidade que pode ser diretamente endereada corresponde normalmente ao tamanho da palavra do computador (8 bits, 16 bits, 32 bits, etc..). Podemos imaginar ento a memria como sendo um vetor de tamanho finito cujos elementos correspondem ao tamanho da palavra do computador, o qual chamaremos de vetor de memria. Trataremos aqui a questo da alocao permitida pela LP, ou seja, como a LP trata este tipo de alocao. Existem basicamente duas formas de reservar memria: estaticamente ou dinamicamente. a) Estaticamente: a memria alocada (reservada) antes que o programa comece sua execuo. Ex. variveis declaradas em VAR (global) no pascal. b) Dinamicamente: a memria alocada no momento em que requisitada, em tempo de execuo. Ex. varivel alocada com NEW no pascal. Como ocorre esta alocao? A forma mais comum de gerenciamento da memria subdividi-la em reas. Uma destas formas a diviso da memria em 4 segmentos (pascal): segmento de dados, segmento de pilha, segmento de heap (monte) e segmento de cdigo. No segmento de cdigo fica armazenado o programa executvel. No segmento de dados ficam localizadas as variveis estticas. No segmento de heap ficam localizadas as variveis dinmicas. No segmento de pilha ficam localizadas variveis locais, parmetros e chamadas de procedimentos ou funes. Neste modelo cada clula de memria referenciada por um par: endereo de incio do segmento; deslocamento (offset). O offset indica a posio da clula de memria dentro do segmento, ou seja, a distncia da clula ao incio do segmento.

26

LP I

Prof. Cinthia C L Caliari

III.2 Funcionamento dos ponteiros


Por que fala-se que o ponteiro alocado dinamicamente se no Pascal, por exemplo, ele declarado na rea das variveis globais? Por exemplo: PROGRAM TESTE; TYPE Tp_pont = ^no; no = RECORD Chave : integer; nome : string[30]; END; VAR pont : Tp_pont; Na verdade a varivel pont (neste caso) alocada estaticamente no segmento de dados. Esta varivel conter apenas um endereo para uma rea de memria na heap, onde est localizada a varivel pont^ (dinmica) que conter o dado propriamente dito. Esta alocao na heap ocorre quando o comando new (no pascal) utilizado e, s neste momento, que a varivel dinmica ser alocada na memria.

III.3 Exerccio de Laboratrio


Funcionamento da Memria

Objetivos: Verificar como a LP trabalha com a memria Identificar possveis erros ocorridos com o estouro de memria 1) Abra o arquivo ponteiro.pas no PASCAL. OBS. S faa alteraes no programa quando for requisitado pelo exerccio. 2) Faa o que cada item solicitar e responda as questes. a) Faa a compilao do programa. Ocorrer um erro (aperte f1). Diga o possvel problema que ocorreu. Que soluo voc daria? b) Altere o tamanho do vetor para 1000. Compile e execute passo a passo (F7 ou F8). Que problema ocorreu? Que soluo voc daria? c) Com o problema b solucionado (diminua o tamanho do vetor para 100), execute o programa (crt + f9). Que erro ocorreu ? (espere aparecer mensagem de erro) Explique porque este erro ocorreu.. d) Retire as chaves de {WRITELN(Deseja continuar <S/N> ?); READLN (op)}. Estas linhas deixaro de ser comentrios. Pressione Crtl+F7. Uma janela ser aberta para digitao da varivel que deseja ver o contedo. Digite LISTA. Pressione Crtl+F7 e digite pt. Recomece a execuo passo a passo com F8, quando a tarja verde atingir o while continue a execuo com F7, assim voc ter acesso aos procedimentos. Continue a 27

LP I

Prof. Cinthia C L Caliari

execuo passando pelos procedimentos da lista. Preste ateno no contedo das variveis e perceba o que est acontecendo. Descreva o que ocorreu com o contedo da varivel lista e da varivel pt na passagem do procedimento Inserir_no_final_LST. Continue a execuo at que chegue a pergunta: Deseja continuar <S/N> ?. Digite S. D outra passada pelos procedimentos e explique o que aconteceu com o contedo das variveis. Termine a execuo. e) Pressione Crtl+F7 e digite Q. Caso queira, pode arrastar esta janela para o canto superior da tela. Execute passo a passo com F8. Quando a pergunta: Deseja continuar <S/N>? aparecer, digite N. Continue a execuo. Voc pode ver o que est sendo armazenado em Q. O que ocorre na linha Q:= Q^.prox ? Est correto? Existe algum erro de programao? Encerre a execuo e Comente as linhas que contm Q. f) Insira a varivel P na janela verde (CTRL + F7). P uma varivel que receber o endereo de qualquer varivel, dinmica ou esttica. Comece a execuo passo a passo com F7 e janela verde visvel. O primeiro procedimento ser acessado. Qual o valor de P em {1}? Qual o valor de P dentro do procedimento nada em {2}. Explique o que ocorreu. Continue a execuo passo a passo com F8. Explique o que ocorre com o contedo da varivel P nos momentos {a}, {b} e {c}. Finalize a execuo. g) Altere a passagem de parmetro do procedimento nada para passagem por referncia (acrescente o var). Execute passo a passo com F7. Qual o valor de P em {1}? Qual o valor de P em {2}? Explique o que aconteceu. h) Tire o comentrio de {lista.primeiro := 10;}. Compile. O que ocorreu? Elimine esta linha. i) Tire o comentrio de {lista.primeiro := p;}. Compile. O que ocorreu? Explique. j) Tire o comentrio de {writeln ( lista.primeiro);}. Compile. O ocorreu? Explique. Elimine esta linha. k) Tire o comentrio de {writeln ( lista.primeiro^);}. Compile. O ocorreu? Explique. Elimine esta linha. l) Tire o comentrio de {writeln ( lista.primeiro^.item.nome);}. Compile. O ocorreu? Explique. OBS. o tamanho da pilha e da heap pode ser alterado em option ! memory size 1) Supondo que uma linguagem tenha definido que seu segmento de dados e o segmento de pilha possuem no mximo 64Kbytes cada um e que seu segmento de heap possui no mximo 640Kbytes. Voc est implementando um programa nesta linguagem e precisa declarar um vetor de tamanho igual a 10000, onde cada posio armazenar um nmero real e um caracter. Adimitindo-se que um nmero real ocupa 6bytes de memria e um caracter 1 byte. Perguntas: a) Considerando este vetor uma varivel global, voc ter problemas na declarao? Por que? Caso sua resposta seja sim proponha solues. b) Considerando este vetor uma varivel local, voc teria problemas? Explique.

28

LP I

Prof. Cinthia C L Caliari

c) Se ao invs de vetor voc utilizasse alocao dinmica, haveria problema? Por que? d) A implementao de uma varivel dinamicamente soluciona o problema de espao ocorrido com variveis estticas ou variveis locais? Explique. 2) Por que um endereo de memria composto de duas partes, exemplo: $435A, $A45F 3) Suponha a declarao da lista: PROGRAM EXE; TYPE apont = ^NO; NO =RECORD nome : string; prox : apont; END; TP_LISTA = RECORD PRIM, ULT : apont; END;

VAR LISTA : TP_LISTA; A : INTEGER; AP1,AP2: ^INTEGER; R : NO; PROCEDURE TESTE (VAR B:INTEGER); VAR L : TP_LISTA; C, D : apont; BEGIN new (C); new (D); C^.prox := D; END;

a) Responda: Caso o procedimento seja chamado no programa principal a varivel LISTA.PRIM estar alocada em que segmento? E as variveis A, B e C? A varivel apontada por C^.prox est alocada em que segmento? b) Assinale com um X, no programa principal abaixo, as linhas de cdigo que estiverem corretas. BEGIN NEW( LISTA ); NEW (AP1); AP1 := 10; AP1^:=10; AP2:=AP1; WRITELN(AP1); NEW (R); NEW (R^.PROX); NEW (LISTA.PRIM); R := LISTA.PRIM; LISTA.ULT^:= R; END. [ [ [ [ [ [ [ [ [ [ [ ] ] ] ] ] ] ] ] ] ] ]

29

Prof Cinthia C L Caliari

III.4 Lista de Exerccios


1) A memria dividida em quantas partes? Quais so elas? O que cada uma armazena? 2) O endereo de memria dividido em quantas partes? Quais so eles? 3) Suponha que uma LP tenha definido seu segmento de dados com 64Kb, o de pilha com 64Kb e o heap com 128Kb. Ao implementar um programa nesta linguagem, necessrio armazenar um vetor de 3.000 posies, onde cada posio armazena um registro contendo uma string 30 caracteres, trs inteiros e um real. Admitindo-se que cada caracter ocupa 1 byte, cada inteiro 2 bytes, o real 6 bytes, e cada ponteiro 8 bytes, pergunta-se: a) Se este vetor for uma varivel global voc ter problemas? Por que? b) Se o vetor for uma varivel local teria problemas? Por que? c) Se os elementos forem armazenados em uma lista encadeada, voc teria problemas? Por que? d) Sugira solues. 4) Com relao ao Pascal responda s questes abaixo: PROGRAM EXEMPLO; TYPE pont = ^no; tpinfo = integer; No = record info : tpinfo; prox : pont; end; tplista = record prim, ult : pont; end; var lista : tplista; ponteiro : pont; {1} a : integer; ap1,ap2: ^integer; R : No; procedure teste (var a:integer, b : integer); var lista : tplista; C : pont; begin ... end; begin ... end. a) Sabendo que um inteiro ocupa 2 bytes de memria e um apontador ocupa 4 bytes, quantos bytes sero alocados ao executar o programa at a declarao {1} ? Justifique mostrando os clculos. 30

Prof Cinthia C L Caliari

b) Relacione todas as variveis do programa, colocando sua localizao na memria, se o procedimento TESTE fosse chamado no Programa Principal c) Assinale com um X, no programa principal abaixo, as linhas de cdigo que estiverem corretas. Observem que elas no esto necessariamente em seqncia. begin new( lista ); new (ap1); R.info := 10; ponteiro := lista^.prox; writeln( ap2^); lista.prim^.prox := ponteiro ; new (R); teste (R.info, ap1^); ap1 := a; R^.info := 10 ; end. [ [ [ [ [ [ [ [ [ [ ] ] ] ] ] ] ] ] ] ]

5) Com relao memria, qual a diferena de passagem de parmetro por valor e por referncia? 6) Um vetor bi-dimensional A[1..lin, 1..col] de inteiros (2 bytes) armazenado na memria, comeando no endereo S. Monte uma expresso matemtica que capaz de mostrar a correta posio de um elemento arbitrrio A[i,j]?

31

Prof Cinthia C L Caliari

CAPTULO IV - VALORES E TIPOS


Dados so a matria prima da computao, pois os programas produzem resultados manipulando-os. Por isso importante que uma linguagem suporte vrios tipos de dados e estruturas. E, so esses tipos que permitem a representao de valores nos programas.

IV.1 Valores
Tudo que pode ser avaliado, armazenado, incorporado a uma estrutura de dados, passado como argumento para um procedimento ou funo, retornado como resultado de funes, etc.

IV.2 Tipos
Tipos so grupos de valores que exibem comportamento uniforme perante as mesmas operaes. Podemos definir Cardinalidade de um tipo (#) como o nmero de valores distintos que o tipo pode assumir. Exemplos: #booleano = 2 (em pascal) #inteiro = limite inferior + limite superior + 1 # inteiro = limite inferior limite superior + 1 A quantidade de tipos de dados suportada depende da LP. As LPs podem permitir a criao de tipos de dados do usurio, bem como a criao de estruturas de tipos de dados. O tipo de dado de uma varivel est registrado em um descritor. O descritor da varivel consiste no conjunto dos seguintes atributos: ! Nome: identificador (smbolo), que serve para referenciar o dado. ! Endereo: posio na memria onde est localizado o dado. Os tipos de dados se dividem em Tipos primitivos e Tipos compostos ou estruturados.

IV.2.1 Tipos Primitivos Definio: So conjunto de valores que no podem ser decompostos em valores mais simples. Tipos de dados que no podem ser definidos em termos de outros tipos. Caractersticas importantes Formam, juntamente com um ou mais tipos primitivos, os tipos estruturados. Esto associados com o hardware. Os tipos primitivos de uma linguagem dependem de sua rea de aplicao: LP comercial COBOL Decimal LP numrica FORTRAN nmeros reais com escolha de preciso

Tipo primitivo discreto = aquele que possui uma relao 1 pra 1 com um intervalo dos inteiros. Exemplo: caracter 32

Prof Cinthia C L Caliari

IV.2.1.1 Tipos Numricos u Inteiro O tipo de dados primitivo mais comum o inteiro. Algumas linguagens permitem diversos tamanhos de inteiros. Exemplos: PASCAL : BYTE SHORTINT WORD INTEGER LONGINT = 0 a 255 = -128 a 127 = 0 a 65535 = -32768 a 32767 = -2.147.483.648 a 2.147.483.647 1 byte 1 byte 2 bytes 2 bytes 4 bytes 1 byte 2 bytes 4 bytes a 8 bytes

Java :

byte short int long

= -128 a 127 = -32768 a 32767 = -2.147.483.648 a 2.147.483.647 = -9.223.372.036.854.775.808 9.223.372.036.854.775.807

Um valor inteiro pode ser representado em um computador por uma string de bits,com um dos bits mais a esquerda representando o sinal do nmero. u Ponto-flutuante o armazenamento de um nmero real no formato cientfico sem delimitar limite superior e inferior. Como a representao finita, nmeros reais com dzimas peridicas e nmeros especiais ( por exemplo) s podem ser representados por aproximaes. Exemplo: 3,14 = 3,14 x 100 0,000001 = 1,00 x 10 -6 1941 = 1,941x 103 O armazenamento em ponto representatividade maior. Em C: float = seis dgitos de preciso double = dez dgitos de preciso ocupa 4 bytes ocupa 8 bytes flutuante economiza espao de memria. A

O tipo ponto-flutuante segue o Padro de Ponto Flutuante IEEE 754. Este padro define trs formatos: preciso simples (32 bits); preciso dupla (64 bits) e preciso extendida (80 bits). simples = intervalo de expoente entre -126 e 127 dupla = intervalo de expoente entre -1022 e 1023

u Decimais Esse tipo de dado armazena um nmero fixo de dgitos decimais, com o ponto decimal em uma posio fixa do valor. So utilizados para processamento de dados comerciais, sendo fundamental para o COBOL.

33

Prof Cinthia C L Caliari

Os tipos decimais tm a vantagem da capacidade de armazenar, com preciso valores decimais, pelo menos os de dentro de uma faixa restrita, o que no pode ser feito em ponto flutuante. IV.2.1.2 Booleanos Assumem apenas dois valores: verdadeiro e falso, por isso formam os tipos mais simples. Normalmente so usados como flags (sinalizadores) em programas, aumentando a legibilidade. C uma exceo, onde qualquer inteiro diferente de zero considerado verdadeiro e o zero considerado falso. Apesar de poderem ser representados por apenas um bit, geralmente ocupam 1 byte de memria por questes de facilidade de acesso.

IV.2.1.3Caracter Os caracteres so armazenados nos computadores como codificao numrica. A mais utilizada a ASCII (American Standard Code for Information Interchange), que usa valores de 0 a 127 para codificar 128 caracteres diferentes. Uma outra tabela de cdigo foi desenvolvida: a UNICODE (16 bits), pois com a globalizao a tabela ASCII est tornando-se obsoleta. Esta nova codificao inclui o alfabeto cirlico, usado na Srvia, e os dgitos tailandeses, por exemplo. O Java a primeira linguagem amplam ente usada a adotar o conjunto de caracteres UNICODE.

IV.2.2 Tipos compostos um tipo composto a partir de tipos mais simples. Exemplos: registro, vetor, strings, etc.

IV.2.2.1Mapeamentos Consiste no mapeamento de um conjunto de valores para outro (que pode ser do mesmo tipo) S T

A C K J

1 2 3 4

S T SIMBOLIZA O CONJUNTO DE TODOS OS POSSVEIS MAPEAMENTOS DISTINTOS DE S PARA T

Mapeamento finito = Funes cujo domnio finito. Podemos observar que vetores so um exemplo, pois h um mapeamento finito do conjunto ndice para o conjunto dos componentes. 34

Prof Cinthia C L Caliari

u Vetor ! Servem para criar um agregado homogneo de elementos de dados, ou seja, todos os valores de dados tm o mesmo tipo e so processados da mesma maneira. ! Cada elemento acessado por um ndice. ! O conjunto ndice deve ser finito e discreto. ! A maior parte das LPs restringe o conjunto ndice a um intervalo dos inteiros. Algumas fixam o limite inferior (C, C++, Java) outras no. ! Pascal e ADA permitem que os ndices sejam de qualquer tipo primitivo discreto (inteiro, enumerado ou intervalo). ! Dependendo da linguagem a estrutura pode ser manipulada como um todo. Porm, linguagens como Ada e Algol-68 permitem a seleo de um sub-array. ! Em geral, o uso incorreto de ndices (ex. acessar um ndice inexistente) s pode ser verificado em tempo de execuo. ! Linguagens como Pascal, ADA e Java fazem verificao dinmica dos ndices (aumenta confiabilidade, mas reduz eficincia) ! Linguagens como C, C++ e FORTRAN no fazem verificao de ndices. Exemplo de problema que pode ocorre em C: int v[7]; v[13] = 198; // atribuio vlida com conseqncias imprevisveis

J Quantidade de ndices de um vetor depende da linguagem. FORTRAN 1 PASCAL =3 = limite de memria

Devemos observar que os elementos de um vetor de uma dimenso so armazenados de forma contgua na memria. Vetores de mais de uma dimenso so normalmente armazenados como vetores de uma dimenso de tamanho igual ao nmero de clulas do vetor multidimensional. Por exemplo, os vetores bidimensionais costumam ser armazenados por linha. Assim, o acesso ao elemento de um vetor multidimensional bastante custoso, pois necessita de um clculo da posio do elemento na memria. Se for preciso uma aplicao utilizando o mximo de eficincia computacional, talvez seja melhor substituir uma representao multidimensional por outra unidimensional. Normalmente, em um vetor multidimensional o nmero de elementos de cada dimenso fixo. Mas, em Java, isto pode no acontecer, pois os vetores multidimensionais so, na verdade, vetores unidimensionais, onde cada elemento outro vetor independente. Por exemplo: um vetor bidimensional considerado um vetor unidimensional onde todos os elementos so vetores unidimensionais independentes e que, portanto, podero ser criados com tamanhos diferentes. 35

Prof Cinthia C L Caliari

A declarao abaixo cria um vetor bidimensional com 5 linhas onde a primeira linha tem 1 coluna, a segunda linha tem 2 colunas, e assim por diante. int[][] vet = new int[5][]; for (int i=0; i<vet.length; i++) vet[i] = new int[i+1]; } J Inicializao de vetores Algumas linguagens, como C, C++, Java, FORTRAN 77, permitem a inicializao na declarao. Mas outras, como PASCAL e MODULA-2, no permitem na seo de declarao de variveis. Exemplo: C int lista [ ] = {4, 5, 7, 83} J Operaes com vetores As operaes, que podem ser realizadas com vetores, dependem da linguagem. APL, por exemplo, possui diversos comandos para se trabalhar com vetores e matrizes (as quatros operaes aritmticas bsicas, inverter a matriz, inverter a coluna, etc). PASCAL permite utilizar um comando de atribuio entre dois vetores: V1 := V2; J Categorias de um vetor Existem quatro categorias de vetores: ! ! ! ! Estticos Semi-estticos Semi-dinmicos Dinmicos

! Esttico aquele em que os ndices so definidos em tempo de compilao e a alocao de memria esttica, ou seja, realizada antes da execuo. Seu tamanho fixo e seus elementos ficam armazenados no Segmento de Dados. Vantagem eficincia de tempo. Exemplo: FORTRAN 77, declarao global de um vetor no PASCAL ! Semi-esttico (stack-dinmico fixo) aquele em que os ndices so definidos em tempo de compilao e a alocao de memria dinmica, ou seja, realizada durante a execuo. Seu tamanho fixo e seus elementos ficam armazenados no Segmento de Pilha, sendo, portanto, variveis locais. Assim, a memria s ser a alocada ao chamar o procedimento ou funo em que o vetor for declarado. 36

Prof Cinthia C L Caliari

Vantagem eficincia de espao. Exemplo: Pascal, C (a declarao dos procedimentos e funes) ! Semi- dinmico (stack-dinmico) aquele em que os ndices so definidos em tempo de execuo e a alocao tambm. Porm, aps a especificao dos limites no se pode mais alter-los. Seus elementos podem ser armazenados no segmento de Pilha. Assim, a memria s ser alocada quando forem definidos os ndices do vetor. Vantagem flexibilidade, ou seja, o tamanho de um vetor no precisa ser conhecido at que ele seja usado. Exemplo: ADA GET (LIST_LEN); declare LIST: array (1..LIST_LEN) of INTEGER; begin ... end;

Em declare alocado e em end; desalocado.

! Dinmico (heap-dinmico) aquele em que os ndices e a alocao da memria ocorrem dinamicamente e podem ser modificados a qualquer momento. Este tipo de vetor fica alocado no Segmento Heap. O aumento ou diminuio do vetor so implementados por meio da alocao de um novo espao de memria para o vetor, da cpia do contedo (se for o caso) e da desalocao da memria que tinha sido reservada para ele. Exemplo: FORTRAN 90 INTEGER, ALLOCATABLE, ARRAY(:,:) :: MAT

A linha acima a declarao de um tipo matriz MAT de elementos do tipo inteiro que s ser alocada dinamicamente pela instruo ALLOCATE. ALLOCATE (MAT( 10, NUMERO_DE_COLS)) Para desalocar o vetor, necessrio usar o comando: DEALLOCATE (MAT). C e C++ tambm permitem vetores dinmicos utilizando malloc e free, new e delete. C: void f (int a){ int *vet; vet = (int *vet); malloc (a * sizeof(int)); vet[0] = 10; free (vet); } C++ void f (int a){ int *vet; vet = new int[a]; vet[0] = 10; delete[] vet; } 37

Prof Cinthia C L Caliari

JAVA: int[] criaVetor (int a){ int[] vet; vet = new int[a]; vet[0] = 10; return vet; }

possvel desalocar o vetor a qualquer instante: vet = null;

A implementao de vetores dinmicos e semi-dinmicos em C ou C++ complexa e bastante suscetvel a erros, pois tarefa do programador gerenciar a alocao e desalocao de memria. Por outro lado, Java cria programas mais legveis e confiveis, j que os vetores so criados sem a utilizao explcita do conceito de ponteiros e o programador no precisa desalocar explicitamente a memria que acabou de utilizar. u String A string na verdade uma cadeia de caracteres. So usadas para armazenar dados no numricos e para entrada e sada de dados. Algumas LPs podem considerar uma String como tipo primitivo (PERL, SNOLBOL e ML), pois fornece comandos para se trabalhar com a String automaticamente, no sendo necessrio que o usurio implemente coisa alguma. Outras LPs tratam Strings como um mapeamento finito, ou seja, como um vetor de caracteres (C, C++, Pascal e Ada). As operaes que manipulam Strings so as mesmas que manipulam vetores e/ou so criadas bibliotecas com funes prprias para Strings. Existem ainda aquelas que consideram uma String como uma lista recursiva (MIRANDA, PROLOG e LISP). Estas linguagens tm o tipo lista como um tipo predefinido. Ex.: ADA String um array unidimensional de CHARACTER, que apresenta operaes como referncias a substrings, concatenao, operadores relacionais e atribuio. C/C++ String um array unidimensional de char . H uma biblioteca padro (string.h) que fornece operaes com este tipo de dado, como cpia de string (strcpy), comparao (strcmp), tamanho da string (strlen), etc. Pascal String um array unidimensional de char. As operaes de cpias e comparao so feitas atravs dos operadores de atribuio e relacionais, respectivamente. J operaes como a concatenao pode ser feita atravs do comando concat ou do operador +. Java String considerada um novo tipo (uma classe da biblioteca padro). Assim, ela possui suas prprias operaes. Com relao ao tamanho de uma String, h trs formas de implementao: ! Esttica: O tamanho da string predefinido ou definido na compilao e no pode ser modificado durante a execuo. o que acontece, por exemplo, no FORTRAN 90, COBOL, PASCAL e ADA. Se, no Pascal, uma varivel nome, declarada com tamanho 30 (declarao abaixo), for preenchida com 20 caracteres, os 10 restantes sero preenchidos com caracteres brancos (espaos vazios). 38

Prof Cinthia C L Caliari

nome: string[30]; {Pascal} ! Dinmica Limitada: O tamanho da string varivel at um mximo fixo e definido na declarao da varivel, ou seja, a string pode armazenar qualquer quantidade de caracteres entre 0 e o mximo. Podemos tomar como exemplo o C e o C++. Se, em C/C++ uma varivel nome for declarada como abaixo, criado um ponteiro que aponta para a cadeia de caracteres, aluno0, onde 0 o caracter nulo que indica o final da string. Portanto, estas linguagens armazenam um caracter especial para indicar o final da string, ao invs de armazenarem seu tamanho. char *str = aluno; ! Dinmica: O tamanho da string varivel e sem nenhum mximo. Exemplos so as Strings de PERL, SNOLBOL, APL e JAVASCRIPT. Nestas LPs, sempre ocorre alocao e desalocao de memria quando h necessidade de aumentar uma string.

IV.2.2.2 Tipo Ponteiro Um tipo ponteiro aquele em que as variveis tm uma faixa de valores que consistem em endereos de memria e um valor especial, o NIL (no um endereo vlido, serve apenas para indicar que o ponteiro no pode ser utilizado para referenciar qualquer clula de memria). Um ponteiro pode ser usado para acessar uma rea de memria em que o armazenamento alocado dinamicamente. Eles no so tipos estruturados nem variveis escalares pois, so mais usados para referenciar uma varivel e no armazenar um dado. Exemplo: Pascal (^), C e C++ (*) e Ada (access). TYPE ponteiro = ^no; no = RECORD item : Tp_item; prox : ponteiro; END; VAR P, Q : ponteiro; Em ML qualquer tipo: DATATYPE intlist = nil cons of int*intlist

Java no usa ponteiros explicitamente, mas existem ponteiros sob a superfcie como forma de endereos de memria. Vejamos o exemplo abaixo: int num; Data dt1; Ao declararmos uma varivel do int, um local da memria chamado num mantm um valor inteiro. Entretanto, o local da memria dt1 no mantm os dados do objeto Data, mas sim o endereo de um objeto Data que realmente armazenado em outro lugar da memria. Assim, o nome dt1 um referncia ao objeto Data. E no o prprio objeto. 39

Prof Cinthia C L Caliari

Vantagem: usa memria dinmica (heap) e apresentam poder de endereamento direto.

Operaes com ponteiros ] Atribuio que pode ser feita entre variveis do tipo ponteiro ou entre uma varivel ponteiro e um endereo de memria. Por exemplo, em C: int *p, *q, r; // dois ponteiros para int e um int q = &r; // atribui o endereo da varivel r para q; p = q; // atribui o endereo armazenado em q a p. Em Pascal: P, Q: ^INTEGER; R : INTEGER; BEGIN NEW(P); ... P^:=R; Q:=P; ... END.

] Alocao que armazena dinamicamente um espao de memria acessado via ponteiros e retorna o endereo da primeira clula alocada. Em C: int *p = (int*) malloc (sizeof(int)); Em Pascal: P, Q: ^INTEGER; R : INTEGER; BEGIN NEW(P); ... End. ] Desalocao fora a liberao de reas de memria que esto alocadas e apontadas pelo ponteiro. Em C: free(p); Em Pascal: dispose (p); ] Desreferenciamento retorna o contedo do que apontado pelo ponteiro. Pode ser implcita como Java ou explcita como C ou Pascal: Em C: int *p; *p = 10; *p = *p + 10; 40

Prof Cinthia C L Caliari

Em Pascal: P : ^INTEGER; BEGIN NEW(P); P^ = 10; P^= P^ + 10; END. Em Java: String str = new String(eu); str += e voc;

Problemas com ponteiros A programao com ponteiros requer muita ateno do programador para no gerar erros durante sua manipulao. Os problemas mais comuns que ocorrem so: @ Baixa Legibilidade Ponteiros so conhecidos como o GOTO das estruturas de dados. Portanto, o programador deve ter muita disciplina e cuidado. Por exemplo, ao fazer: P.ITEM.PROX^ := Q; No podemos, rapidamente verificar a estrutura que est sendo atualizada. @ Erro de Violao do Sistema de Tipos Em LPs nas quais o tipo apontado pelo ponteiro no restrito, expresses contendo ponteiros podem ser avaliadas com valores de tipos diferentes do esperado originalmente, gerando erros na avaliao em tempo de execuo. Por exemplo, em Pascal: P: ^ITEM; R : ^INTEGER; BEGIN ... R := P; WRITELN (R); ... END. Se ITEM for um registro , p. ex., neste caso, o valor exibido na tela imprevisvel, pois R agora aponta para um registro e no para um inteiro. @ Ponteiro Oscilante contm um endereo de uma varivel dinmica desalocada. Exemplo: P:=Q; Dispose (Q); a) a localizao para a qual ele aponta pode ter sido realocada para outra varivel. Se forem tipos diferentes ponteiro invlido. b) a posio pode estar sendo utilizada pelo SO para alguma operao interna (temporariamente).

41

Prof Cinthia C L Caliari

@Variveis Heap-Dinmicas Perdidas variveis dinmicas que no esto mais acessveis. So chamadas de lixo porque no so mais teis, j que no podem mais ser acessadas, nem podem ser realocadas novamente para outro uso. Exemplo: Uma lista com um nico apontador P apontando para o primeiro elemento. Se o programador fizer: P := P^.prox; Perdeu o primeiro elemento. Obs. PASCAL aponta somente para dentro da heap. C pode apontar, virtualmente, para qualquer varivel em qualquer lugar da memria. Java no tem ponteiro oscilante. Variveis desse tipo: a) Deixaram de ser teis, no podem mais serem acessadas. b) no podem ser realocadas para um novo uso. Solues para ponteiros oscilantes ler Sebesta captulo 6 6.10.10.2 pgina 258-259

IV.2.2.3 Registro Um registro um agregado possivelmente heterogneo de elementos que so identificados por nome. Seus diferentes campos no so processados da mesma maneira, como tambm seus campos no precisam ser acessados em uma ordem seqencial. A referncia a campos pode ser de duas formas: Referncia Amplamente Qualificada e Referncia Elptica. ] Referncia Amplamente Qualificada aquela em que o nome do registro e o campo do registro, para ser acessado, necessitam de ser especificados. Exemplo (no pascal): Supondo um tipo registro definido como no exemplo abaixo: TYPE Tp_reg = RECORD Nome:STRING; Serie : STRING[5]; END; A varivel deste tipo deve ser declarado como: VAR R : Tp_reg; Ento, o campo nome deve ser referenciado da seguinte maneira:

42

Prof Cinthia C L Caliari

BEGIN Writeln (Digite o nome:); Readln (R.Nome); Writeln(Digite a serie); Readln (R.Serie); END; : END.

] Referncia Elptica O nome do registro pode ser omitido e apenas os campos seriam especificados. Exemplo (no pascal): BEGIN WITH R DO BEGIN Writeln (Digite o nome:); Readln (Nome); Writeln(Digite a serie); Readln (Serie); END; : END.

Sua cardinalidade : #(registro) = #tipo_campo1 * #tipo_campo2 **#tipo_campo_n

IV.2.2.4 Unio disjunta um tipo que pode armazenar diferentes valores de tipo durante a execuo do programa. Exemplo: voc precisa de uma varivel que seja capaz de armazenar tanto um inteiro quanto um caracter. Nas declaraes normais isto no seria possvel. Utiliza-se ento a idia de unio disjunta, que em tempo de execuo reserva o espao apropriado para o valor a ser armazenado. PASCAL, ADA C, C++, Algol 68 COBOL ML = Registro variante = union = redefines = constructions

43

Prof Cinthia C L Caliari

Exemplo em PASCAL registro variante: TYPE Forma = (circulo, triangulo, retangulo); Cores = (vermelho, verde, azul); Figura = record Preenchido : Boolean; Cor : cores; case aspecto : forma of circulo : (diametro : real); triangulo : (ladoesq : integer; ladodir : integer; angulo : real); retangulo : (lado1: integer; lado2 : integer); END; END; VAR Minhafigura : figura; BEGIN ... case minhafigura.aspecto of circulo : writeln (O diametro do circulo = , minhafigura.diametro); triangulo : BEGIN writeln (Os lados do triangulo sao = , minhafigura.ladoesq, minhafigura.ladodir); writeln (O angulo entre os lados e = , minhafigura.angulo); END; retangulo : writeln (Os lados do retangulo sao = , minhafigura.lado1, minhafigura.lado2); END; ... END. Sua cardinalidade : retangulo: lado1, lado2 circulo: diametro

cor preenchimento aspecto

triangulo: ladoesq, ladodir, ang

44

Prof Cinthia C L Caliari

Em ADA, teremos: Type FORMA is (CIRCULO, TRIANGULO, RETANGULO); Type CORES is (VERMELHO, VERDE, AZUL); Type FIGURA (ASPECTO : FORMA) is Record PREENCHIDO : BOOLEAN; COR : CORES; Case ASPECTO is When CIRCULO => DIAMETRO : FLOAT; When TRIANGULO => LADOESQ : INTEGER: LADODIR : INTEGER: ANGULO : FLOAT; When RETANGULO => LADO1 : INTEGER: LADO2 : INTEGER: END case; END record; As duas instrues a seguir declaram variveis do tipo figura: FIGURA_1 : FIGURA; FIGURA_2 : FIGURA (ASPECTO +. TRIANGULO); FIGURA_1 um registro variante no-restringido que no tem valor inicial. Seu tipo pode mudar pela atribuio. Por exemplo: FIGURA_1 := (PREENCHIDO => true, COR => AZUL, ASPECTO => RETANGULO, LADO_1 => 12, LADO_2 => 3); A varivel FIGURA_2 restringida para ser um tringulo e no pode ser mudada para outra variante. OBERON, Modula-3 e Java = No permitem unies (segurana).

IV.2.2.5 Tipos Enumerados aquele em que os valores se tornam constantes simblicas. Possuem uma relao direta com os inteiros na ordem em que aparecem. Isto , um conjunto de constantes representado pelos identificadores. Vejamos como trabalhar com um tipo enumerado: Em Pascal: No permitido que um valor participante de um tipo enumerado componha outro tipo. A varivel do tipo enumerado no pode receber valores lidos do teclado nem seu contedo pode ser exibido via comando write (exibio no Pascal), 45

Prof Cinthia C L Caliari

Como possuem uma relao direta com os inteiros, variveis destes tipos podem ser usadas em comparaes. No exemplo dado em Pascal (acima) poder-se-ia fazer IF (Sexo < feminino) THEN , esse comando retornaria um valor verdadeiro.

Exemplo: TYPE Tp_sexo = (masculino, feminino); Tp_semana = (segunda, tera, quarta, quinta, sexta, sbado, domingo); VAR Sexo : Tp_sexo; {varivel Sexo s assume o valor masculino ou feminino} I: Tp_semana; BEGIN Sexo := 1; //erro pois Sexo do tipo enumerado e no inteiro Sexo := masculino; IF (Sexo < feminino) THEN FOR I:= segunda TO domingo DO BEGIN .... END; CASE Sexo OF masculino :... feminino : ... END; END.

Em C: A uma varivel de tipo enumerado podem ser atribudas apenas as constantes definidas na declarao do tipo enumerado. Internamente, o compilador designa o valor 0 para o primeiro smbolo da enumerao, e incrementa de um o valor associado a cada smbolo na seqncia. Isto pode ser modificado se o programador quiser atravs de atribuio explcita de um valor inteiro a um smbolo, como nos exemplos abaixo. Sintaxe: enum [<nome>] (<ident1>[=<const1>], [<ident2>[=<const2>],] ... );

Elemento Descrio nome identN constN Nome do tipo enumerado Nome do identificador da constante Valor da constante. Se no for especificado, ser o valor da constante anterior acrescido de 1 ou zero caso seja const1

46

Prof Cinthia C L Caliari

Exemplo: #include <stdio.h> #include <conio.h> void main(){ enum Sexo {MASCULINO, FEMININO}; //Neste exemplo, MASCULINO corresponde a 0 e FEMININO a 1 enum Mes {JAN=1, FEV, MAR, ABR, MAI, JUN, JUL, AGO, SET, OUT, NOV, DEZ}; //Agora, JAN corresponde a 1, FEV a 2 e assim por diante, pois foi //atribudo um valor inicial primeira constante. As variveis so declaradas com o tipo, seguido do nome: Sexo sex; Mes meses; A varivel tambm pode ser declarada seguida de um tipo sem nome:
enum {calculo=3, computacao=8, fisica, criptografia=15,algebra} materia; printf("%i,%i,%i,%i,%i", calculo, computacao, fisica, criptografia, algebra); //imprime os valores for (meses =jan; meses < jul; meses++){...} if (sex == MASCULINO) {...} if (meses == DEZ) meses = JAN; else meses++; }

Em Java o tipo enumerado s apareceu na versao 1.5 (Java 5.0). Este tipo um pouco mais complexo por que este tipo uma classe, onde possvel ao programador criar sua prpria classe de tipo enumerado. Vejamos abaixo, o uso comum de uma objeto do tipo enum.

47

Prof Cinthia C L Caliari

public class TesteEnum {; // enumerao com constantes que representam o sexo public enum TpSexo {MASCULINO, FEMININO}; public static void main (String[] args){ //definio de um objeto que pode conter MASCULINO ou FEMININO TpSexo sexo; sexo = TpSexo.MASCULINO; switch (sexo){ case MASCULINO : System.out.println (sexo);//MASCULINO System.out.println(sexo.ordinal());//0 System.out.println(sexo.toString());//MASCULINO break; case FEMININO : //... } //O for ser rodado do incio at o fim dos elementos do tipo enumerado. for (TpSexo sex : TpSexo.values()){ System.out.println (sex); System.out.println(sex.ordinal()); } } }

Observaes sobre o tipo: Para que a LP permita o uso de valores iguais em tipos enumerados diferentes necessria uma verificao maior. Como possuem uma relao direta com os inteiros, variveis destes tipos podem ser usadas em comparaes. No exemplo dado em Pascal (acima) poder-se-ia fazer IF (Sexo < feminino) THEN , esse comando retornaria um valor verdadeiro.

IV.2.2.6 Tipos Sub-faixa um tipo estabelecido usando-se como valores uma sub-faixa de outro tipo. Exemplo (pascal): TYPE Tp_maiscula = A .. Z; Tp_numeros = 1..10; VAR C : Tp_maiscula; BEGIN READLN ( C ); END. Pascal apresenta um problema: a varivel C aceitar qualquer valor do tipo caracter independente de estar foram do limite -> erro de verificao de tipos.

48

Prof Cinthia C L Caliari

IV.2.2.7 Tipo Conjunto um tipo definido por uma coleo de valores distintos todos do mesmo tipo. No conjunto, no h noo de ordem dos elementos. As operaes mais importantes de um tipo conjunto so: ! ! ! ! ! Adicionar elementos no conjunto (descartando duplicaes) Remover um elemento pertencente ao conjunto Acessar elementos Pesquisar elementos (descobrir se um elemento pertence ou no ao conjunto) Obter a quantidade de elementos

Exemplo (PASCAL ): A varivel do tipo enumerado no pode receber valores lido do teclado ou seu contedo ser exibido via comando write. TYPE Tp_semana = (seg, ter, qua, qui, sex, sb, dom); Tp_conj_semanda = set of Tp_semana; VAR Semana, s1,s2: Tp_conj_semana; BEGIN Semana := []; {conjunto vazio} Semana := [segunda]; S1 := [domingo]; S2:= semana + s1; END. Com uma varivel do tipo conjunto possvel realizar as seguintes operaes: unio, interseo, diferena, comparaes e teste de presena. No Pascal temos: + ] unio * ] interseo - ] diferena <= ou >= ] teste de incluso = ou <> ] teste de igualdade in ] teste de presena

49

Prof Cinthia C L Caliari

Exemplo (JAVA):
import java.util.Set; import java.util.HashSet; public class Conjunto { public static void main (String[] args){ Set<String> conj = new HashSet<String>(); Set<String> conj2 = new HashSet<String>(); Object[] itens; conj.add("a"); conj.add("b"); conj.add("c"); conj.add("b"); conj2.add("a"); conj2.add("nome"); System.out.println ("a est "+conj.contains("a")); System.out.println ("b est "+conj.contains("b")); System.out.println ("b est "+conj2.contains("b")); System.out.println (conj.toString()); System.out.println (conj); itens = conj.toArray(); for (int i =0; i< itens.length; i++) System.out.println ("vet["+i+"] = "+itens[i]); for (String s : conj2) System.out.println (s); conj2.addAll(conj); System.out.println (conj2.toString()); for (String s : conj2) System.out.println (s); } }

possvel ter, dentre outros mtodos, os descritos abaixo: addAll ] Adiciona todos os elementos de uma coleo em um conjunto remove ] Remove um objeto do conjunto removeAll ] Remove todos os elementos de uma coleo do conjunto clear ] Remove todos os elementos de um conjunto isEmpty ] Indica se um conjunto est vazio ou no size ] Indica quantos elementos pertencem ao conjunto

IV.3 Verificao de Tipos


a atividade de assegurar que os operandos de um operador sejam de tipos compatveis. Exemplo: no se pode somar o contedo de uma varivel inteira com uma string. Considere alguma operao que espera um operando (varivel) do tipo T, mas que recebe um operando do tipo T. Deve-se ento checar se T equivalente (compatvel) a T. 50

Prof Cinthia C L Caliari

Em diversas situaes, devemos decidir se dois objetos so do mesmo tipo, ou se so de tipos equivalentes, para que possam ser usados em uma determinada construo de uma linguagem. A forma da resposta depende, claro, da linguagem, que deve definir suas prprias regras de equivalncia de tipos. A Equivalncia de Tipos ou Compatibilidade de Tipos pode ser verificada de duas maneiras: ] Equivalncia estrutural: T T se e somente se T e T possuem o mesmo conjunto de valores. Verifica-se o tipo declarado. ] Equivalncia nominal: T T se e somente se T e Tforem definidas no mesmo local ou em declaraes que usem o mesmo nome do tipo. Assim, podemos perceber que toda equivalncia nominal tambm estrutural, mas o contrrio nem sempre verdadeiro. Exemplo: TYPE T1 : ARRAY [ 1.. 10] OF INTEGER; T2 : ARRAY [ 1.. 10] OF INTEGER; VAR X1, Y1 : T1; X2 : T2; X3 : T1; X1 e X2 s so equivalentes estruturalmente. X1, Y1 e X3 so equivalentes estruturalmente e nominalmente. A linguagem Algol-68 utiliza a equivalncia estrutural, cuja implementao considerada um pouco mais trabalhosa: se dois tipos no tem o mesmo nome, necessrio verificar suas estruturas, num teste que pode envolver a verificao da equivalncia de vrios outros tipos, componentes dos tipos cuja equivalncia se quer determinar. Por outro lado, Ada adota a equivalncia nominal pois considera de tipos distintos at mesmo duas variveis introduzidas na mesma declarao: a declarao x,y:array(1..10) of integer; faz com que as variveis x e y tenham tipos annimos, que, portanto, no tem o mesmo nome. E PASCAL ? mistura as duas equivalncias. Estrutural para tipos simples e nominal para tipos compostos. Exemplo:

51

Prof Cinthia C L Caliari

TYPE T1 = T2 = T_V1 T_V2 VAR N1 : T1; N2 : T2; V1, V3 : T_V1; V2: T_V2; BEGIN N1 := N2; {aceita} V1 := V2; {no aceita} V1 := V3: {aceita} END. integer; integer; = ARRAY[1..5] OF INTEGER; = ARRAY[1..6] OF INTEGER;

C usa equivalncia estrutural para quase tudo exceto para registros e unies. C++ e Java usa equivalncia de nomes. A checagem de tipos feita pela linguagem pode ser: ] Em tempo de compilao: LPs so chamadas de estaticamente tipadas. Todo parmetro e varivel possuem um tipo fixo escolhido pelo programador. Deste modo, o tipo de cada expresso pode ser deduzido e cada operao checada em tempo de compilao. A maior parte das LPs de alto nvel so estaticamente tipadas. Menos custoso. Menos flexibilidade. ] Em tempo de execuo: LPs so chamadas de dinmicamente tipadas. Somente os valores tm tipo fixo. Uma varivel ou parmetro no possuem tipo associado, mas podem designar valores de diferentes tipos em pontos distintos da execuo. Isto implica que os tipos dos operandos devem ser checados imediatamente antes da execuo da operao. Lisp, Apl e Smalltalk so LPs dinamicamente tipadas. Perda de eficincia. Mais flexibilidade. Diz-se que uma linguagem fortemente tipada, se possvel, apenas por anlise esttica do programa (anlise realizada em tempo de compilao), determinar que a estrutura de tipos da linguagem no violada. Uma linguagem que no garante a ausncia de erros de tipos, pelo menos de forma esttica, dita fracamente tipada. Um tipo pode ser violado de forma esttica (atribuio) ou dinmica (leitura de dado).

52

Prof Cinthia C L Caliari

Ex.: PROGRAM TESTE; TYPE NATURAL=1..32767; VAR I:INTEGER; S:SHORTINT; N:NATURAL; BEGIN I:=10; S:=-10; N:=I; N:=S; {VIOLAO DINMICA DE TIPO} WRITELN(N); {mostra -10 na tela} N:= -10; {VIOLAO ESTTICA DE TIPO} I:=32767; WRITELN(I); {mostra 32767 na tela} S:=I; {VIOLAO DINMICA DE TIPO} WRITELN(S); {mostra -1 na tela} END. Exemplos de linguagens fortemente tipadas so Algol-68 e Ada; Pascal seria fortemente tipada com algumas pequenas modificaes, tais como a definio de tipos procedimento, e a definio de sub-faixa. C, C++ tambm no fortemente tipado ML fortemente tipada. Se, em alguma situao, necessrio um valor de um tipo t1, e apenas est disponvel um valor de um tipo t2, pode ser necessria uma converso de tipo. Assim, quando os tipos envolvidos em uma expresso no so equivalentes, a linguagem pode oferecer a possibilidade de converso de tipos. Um tipo compatvel aquele vlido para o operador ou com permisso nas regras da linguagem para ser convertido pelo cdigo gerado pelo compilador para um tipo vlido. Existe dois tipos de converso: A converso implcita (automtica), chamada de coero, feita com base nas regras definidas, sem interferncia do programador. Desta forma, o cdigo de converso, (por exemplo do valor inteiro de i para o real equivalente) quando necessrio, deve ser includo pelo compilador. Esta forma de converso s vezes conhecida como coero. Por exemplo, a maioria das linguagens aceita um comando x := i; mesmo quando x uma varivel real, e i uma varivel inteira. A converso explcita ocorre quando h vrias maneiras de converter um valor de um tipo t1 para o tipo t2, necessrio indicar a forma de converso desejada, e, em geral, isso feito atravs de uma funo de converso. Este o caso da converso de reais em inteiros, que pode ser feita por arredondamento, truncamento, etc. Normalmente, funes pr-definidas da linguagem esto disponveis para as situaes mais comuns, incluindo casos como arredondamento, truncamento, aproximao superior (ceiling) ou inferior (floor). realizada diretamente pelo programador e chamada de casting

53

Prof Cinthia C L Caliari

A converso de tipos primitivos ditada pelas regras da linguagem. Normalmente, admitida uma converso de um tipo de representao menor para um de representao maior. Vejamos como exemplo o Java: De byte short char int long float Para short, int, long, float, double int, long, float, double int, long, float, double long, float, double float, double double

A converso pode ser feita de trs maneiras: ! Por atribuio atravs de coero para o tipo do lado esquerdo da atribuio ! Por promoo aritmtica para o tipo de resultado esperado da operao (inferncia) ! Por converso explcita (casting) Exemplo: float f1, f2; int i; f1 = i; // atribuio f2 = f1/i; // promoo i = (int) f; // casting A coero contribui para que uma linguagem seja fortemente tipada ?

IV.4 Lista de Exerccios


1) Defina valor de uma LP e tipo. 2) Defina tipo primitivo e tipo composto. 3) Explique o conceito de cardinalidade de um tipo. 4) O que um descritor? 5) Explique a diferena entre o tipo ponto flutuante e decimal. Quando se deve usar um e quando se deve usar o outro? 6) O que uma unio disjunta? Qual a vantagem de uma unio disjunta em relao a um registro? Qual o problema que esse tipo pode acarretar? 7) Defina o que so tipos enumerados e sub-faixa. 54

Prof Cinthia C L Caliari

8) Defina o que so vetores Estticos, Semi-estticos, Semi-dinmicos e Dinmicos. Quais as vantagens de cada tipo? 9) Que recurso de inicializao de vetores est presente em ADA, mas no em outras linguagens imperativas comuns? 10) Defina referncias amplamente qualificadas e referncias elpticas a campos em registros. 11) Quais os problemas que podem ocorrer com ponteiros? 12) Qual a vantagem de se tratar strings como um tipo primitivo? 13) Atualmente a tabela ASCII atende a todas as linguagens de programao? Justifique. 14) O que coero? Toda LP possui coero? 15) Defina erro de tipo, verificao de tipos e tipificao forte. 16) Uma LP que realiza a verificao de tipos dinamicamente mais eficiente do que uma LP que realiza a verificao de tipos estaticamente? Explique. 17) Defina compatibilidade de tipo nominal e compatibilidade de tipo estrutural. Quais so as vantagens de ambas? 18)Analise o cdigo abaixo. Se a equivalncia dos tipos for estrutural este programa compilar sem erros? E se for nominal? Explique.
PROGRAM EX; TYPE Tp_vet = array[1..100] of INTEGER; Tp_vet2 = array[1..100] of INTEGER; Inteiro = integer; VAR A : INTEGER; v1 : Tp_vet; B : Inteiro; PROCEDURE TESTE (v:Tp_vet2); BEGIN : END; BEGIN A := 11; B := A; TESTE (v1); END.

55

Prof Cinthia C L Caliari

CAPTULO V - EXPRESSES E ATRIBUIO


Expresses so o meio fundamental de especificar computao em uma linguagem de programao. Elas so compostas de operadores e operandos, devem ser avaliadas e produzem algum resultado. Os operadores indicam a operao que dever ser realizada. Esta operao necessita ser validada, ou seja, deve-se verificar se a operao compatvel com o tipo de operando passado e com a quantidade de operandos envolvidos. Para saber qual o resultado que uma expresso dar em uma determinada linguagem, necessrio saber em que ordem esta linguagem realiza a avaliao de operadores e operandos, ou seja, suas regras de associatividade e precedncia.

V.1 Expresses aritmticas


Nas LPs, as expresses aritmticas consistem em operadores, operandos, parnteses e chamadas a funes cuja finalidade especificar uma computao aritmtica. Pode-se ter operadores: Unrio Possui um nico operando: (-) Binrio Possui dois operandos: (+ , -, /, *, etc.) Ternrio Possui trs operandos (o operador ? do C, C++ e Java)

_ Notao Na maioria das linguagens imperativas os operadores binrios so infixos. No LISP, eles so prefixos.

V.1.1 Ordem de avaliao de operadores


a ordem em que os operadores so executados. _ Precedncia Define a ordem em que operadores de diferentes nveis de prioridade so executados. A maioria das linguagens obedece ordem de precedncia matemtica. Exemplo: Mais alta Pascal *, /, div, mod +, - todos C++, Java ++, -- (pr) +, - unrio *, /, % +, - binrio ++, -- (ps)

Mais baixa

_ Associatividade Quando uma expresso contm mais de um operador do mesmo nvel de precedncia, a ordem em que eles sero executados depende das regras de associatividade da linguagem.

56

Prof Cinthia C L Caliari

Na maioria das linguagens a regra de associatividade define que a execuo ocorrer da esquerda para a direita, exceto com o operador de exponenciao, se houver na linguagem, cuja execuo ocorrer da direita para a esquerda. Exemplo: FORTRAN A ** B ** C (O operador direita avaliado primeiro) ADA A ** B** C ( ilegal pois no associativa. O programador deve especificar, atravs de parnteses, qual operao deve ser realizada primeiro). Em APL todos os operadores possuem a mesma ordem de precedncia, a regra de associatividade da direita para a esquerda. _ Parnteses Podem ser usados para alterar as regras de precedncia e associatividade das expresses. O seu uso aumenta a legibilidade, pois o programador no precisa lembrar de regras. Ex. (a + b) * c _ Expresses condicionais Em C, C++ e JAVA, existe um operador ternrio ? que usado para formar expresses condicionais que tm somente uma linha de comando. Sua sintaxe : expresso_1 ? expresso_2 : expresso_3

Podemos ver no exemplo abaixo:

Condicional usando ifthenelse If (cont == 0) Media = 0; else Media = soma cont;

Condicional usando ? Media = (cont == 0) ? 0 : soma / cont; /

Assim, ? denota o incio da clusula then e :, o incio do else. Ambas so obrigatrias.

V.1.2 Ordem de avaliao dos operandos


Ser que esta ordem interfere em alguma coisa? S se houver efeitos colaterais. _ Efeitos Colaterais Funcionais ocorre quando uma funo modifica um parmetro ou uma varivel global.

57

Prof Cinthia C L Caliari

Exemplo:

A := 10; x := A + func(A);
onde,

function func (var A: integer): integer; begin A := 5; func := 10; end;


Neste caso, a ordem da avaliao produz efeito sobre o resultado, pois: Se o valor de A for buscado primeiro, seu valor ser 10 e a expresso valer 20. Se o segundo operando for avaliado primeiro, A ter valor 5 e a expresso valer 15. Veja no exemplo abaixo:

int a = 5 int funcao1 ( ) { a = 17; return 3; } /* fim da funcao1 */ void funcao2 ( ) { a = a + funcao1( ); } /* fim da funcao2 */ void main ( ) { funcao2( ); } /* fim do main */
O valor de a em funcao2( ) depende da ordem de avaliao, definida pela linguagem, sobre os operandos na expresso a = a + funcao1 ( );. Assim, a poder ser 8 ou 20. Soluo: evitar variveis globais dentro de funes ou procedimentos ver a ordem de avaliao da LP. H, por exemplo, LPs que avaliam da esquerda para a direita (JAVA), outras que permitem que o implementador decida a ordem (ADA) _ Operadores sobrecarregados Um operador possui mais de uma finalidade. Por exemplo: no Pascal, o operador + pode ser usado para adio de tipos numricos, mas pode tambm ser usado para concatenar strings. Mas, esse um exemplo em que a sobrecarga no prejudica a legibilidade. No C, o operador & pode ser um operador binrio (significando AND) ou unrio (significando o endereo de uma varivel). Neste caso, como as operaes realizadas no tm nenhuma relao entre si, a sobrecarga prejudica a legibilidade. No C++ e no Java, o operador / indica a diviso ente dois nmeros. Se os dois forem inteiros, o resultado ser um inteiro (truncado). Isso pode provocar um erro de lgica no programa, pois se tiver um comando media = total/quant onde media um real e total(250) e quant(100)

58

Prof Cinthia C L Caliari

inteiros, o resultado dar um inteiro truncado (2) que ser convertido para real. Portanto, a mdia teria como resultado 2 e no 2.5 como deveria ser. No Pascal isso no acontece pois o operador que realiza a diviso por inteiros div. Algumas linguagens que suportam tipos abstratos de dado (C++, ADA, etc) permitem que o programador sobrecarregue mais ainda seus operadores. Por exemplo, possvel definir um operador + para realizar uma adio de vetores. Mas isso no impediria que o programador definisse + para significar multiplicao, por exemplo.

_ Converso de tipo Converso de Estreitamento converte um tipo em outro de faixa inferior. Exemplo, converter um longint para um int, cuja faixa de valores menor Converso de Alargamento converte um tipo em outro de faixa maior. Exemplo, converter um int para um real, cuja faixa de valores maior. Expresses de modo misto um operador permite operandos de tipos diferentes. Existem dois tipos de converses de valores: ! Coero Converso de tipos implcita. Exemplo: JAVA

void meumetodo ( ){ int a, b, c; char d; ... a = b * d; ... }


O JAVA aceita um inteiro receber um caracter, pois o caracter ser automaticamente convertido para o seu cdigo na tabela UNICODE. Mas isso tambm pode gerar um problema. Se houve um erro e, ao invs de d, deveria ser digitado c? Obs.: O C++ e o JAVA tm tipos inteiros menores do que o int (char e short int C++ e byte, short e char JAVA) que, quando um operador aplicado sobre eles, eles so convertidos para int e, depois retornados a seus valores originais. ! Cast Converso explcita de tipos. Exemplo: JAVA

void meumetodo ( ){ int a, b, c; double d; ... a = b * (int)d; ... }

59

Prof Cinthia C L Caliari

_ Erros em Expresses Limitaes da aritmtica do computador: Overflow O resultado muito grande no podendo ser armazenado na clula de memria. Underflow o resultado muito pequeno no podendo ser representado na clula de memria Limitaes inerentes aritmtica: Diviso por zero

V.2 Expresses Relacionais


Tem 2 operandos e um operador relacional : >, <, <=, >=, < >, = Os operadores relacionais possuem menor precedncia do que os aritmticos a + 1 > 2 * 2 (as operaes aritmticas so realizadas primeiro)

V.3 Expresses Booleanas


Consistem em variveis,constantes, expresses relacionais e operadores booleanos: AND, OR, NOT, s vezes, OR exclusivo e um para equivalncia. 2 operandos e um operador 1 operando e um operador No PASCAL os operadores booleanos tm maior precedncia que os relacionais. Portanto, a > 5 or a < 0 no funciona (pois 5 no operando booleano). O correto seria (a > 5) or (a < 0)

V.4 Avaliao Curto -Circuito


Uma avaliao curto-circuito de uma expresso tem seu resultado determinado sem avaliar todos os operandos e ou operadores. Ex:

(13*A)*(B/131) se A = 0 no precisa de avaliar o resto, pois o resultado ser 0. (A>=0) and (B<0) se o 1 for Falso no precisa de avaliar o resto
C possui avaliao curto-circuito: (a>b) || (b++/3) Assim, b s ser incrementado se a <= b (efeito colateral) Observemos o cdigo abaixo em Java. Supondo uma varivel do tipo VETOR que possui TAM elementos, que ser pesquisada a procura de um valor CHAVE:

ind = 1; while (ind<vetor.length && vetor[ind] != chave) do ind = ind+1;


Se a avaliao no for feita com curto-circuito, ambas as expresses relacionais sero avaliadas, independente do valor da primeira. Isto poderia acarretar um erro de subscrito, se CHAVE no estivesse no VETOR, pois cairia fora da extenso do vetor.

60

Prof Cinthia C L Caliari

V.5 Atribuio
o mecanismo pelo qual a varivel modificada dinamicamente. Atribuies simples Sintaxe: <nome_varivel> <comando atribuio> <expresso> Alvos mltiplos permite a atribuio de um valor a mais de uma varivel. Exemplo: soma, total = 0; C, C++ Alvos condicionais Dependendo de uma condio o valor atribudo a uma varivel ou a outra. Exemplo: flag ? cont1 : cont2 = 0; Isto equivalente a: IF (flag) THEN cont1 := 0 ELSE cont2 := 0; Operadores de atribuio compostos So comandos de atribuio que agregam, alm da funo de atribuir, uma outra representada simbolicamente. Exemplo em Java: soma += valor; Equivalente a: soma = soma + valor; O C, C++ e o Java tm verses de operadores de atribuio compostos para a maioria de seus operadores binrios. Operadores de atribuio unrios So comandos de atribuio que agregam, alm da funo de atribuir, uma outra mas no so representados por 2 smbolos. Exemplo em Java: Com Operadores Unrios soma = ++cont; soma = cont++; soma = cont++; soma = ++cont; Sem Operadores Unrios cont soma soma cont soma cont cont soma = = = = = = = = cont + 1 cont; cont; cont + 1; - cont; cont + 1; cont + 1; - cont;

Atribuio em Expresses Quando um comando de atribuio utilizado no meio de uma expresso. LPs como C, C++ e JAVA permitem esse tipo de atribuio. while ((ch = getchar( )) != EOF) {....}

Esse tipo de atribuio pode causar expresses difceis de ler e entender, como por exemplo: A = B+(C=D/B++)1;

(a ordem seria: C = D / B; B = B + 1; A = B(antigo) + C 1)

61

Prof Cinthia C L Caliari

Tambm possvel, no C, C++ e Java realizar atribuies como: soma = cont = 0;

Como C e C++ aceitam expresses numricas em suas instrues if, isso pode aumentar a probabilidade de erros de programas, pois ao digitar if (x = y) . . . ao invs de if (x == y) . . .

o compilador no detectar este erro. JAVA s permite expresses booleanas em suas condicionais. Exemplo de uma programa em Java com coero, casting, ps e pr incremento e atribuio em expresso: public class Coero { public static void main(String[] args){ int num; double a, b,c; char car = 'a'; float d = 3.5f; a = 1.0; b = 2.0; num = (int)(a*b); //num = 2 num = num*(int)d; // num = 2*3 = 6 num = (int)(num*d); // num = 6*3.5 = 21 num = car*2;//num = 194 a = b = 0;//a = 0.0 e b = 0.0 num = 3; b = 1; a = - num + b;//a = -3+1 = -2 a = num + -b++;//a = 3+-1.0 = 2.0 e b = 2.0 a = num + -++b;//b = 3.0 e a = 3+(-3.0) = 0.0 a = -b++;//a = -3.0 e b = 4.0; a = -++b;//b = 5.0 e a = -5.0 if ((a=b)!=0); a = b+(c=d/b++)-1;//a = 4.7 b = 6.0 e c = 0.7 b = 5; a = (c=d/b++)+b-1;// a = 5.7 b = 6.0 e c = 0.7 System.out.println("RESULTADO\na = "+a+"\nb = "+b+ "\nnum = "+num); } }

V.6 Lista de Exerccios


1) O que precedncia de operadores e associatividade de operadores? 2) O que um operador sobrecarregado? 3) Defina efeito colateral funcional.

62

Prof Cinthia C L Caliari

4) Defina converses de estreitamento e de alargamento. 5) O que uma expresso de modo-misto? 6) Para que serve um operador de atribuio composto? D um exemplo. 7) Em algumas linguagens, pode-se tratar um operador de atribuio como operador aritmtico. Quais as desvantagens que isto pode acarretar? 8) Qual a precedncia dos operadores unrios em Java? 9) Voc acha que eliminar os operadores sobrecarregados de uma linguagem seria bom? Por qu? 10) Seria bom eliminar todas as regras de precedncia de operadores exigindo, assim, parnteses em todas as expresses? Por que? 11) Descreva uma situao em que o operador de adio em uma LP no seria comutativo. 12) Mostre a ordem de avaliao das seguintes expresses como o exemplo abaixo: a + b * c + d => (a + (b * c)1)2 + d)3 a) a * b c + d b) a * (b c) / d mod 10 c) (a b) / c and (d * e / a 3) d) a + b e) a or c = d and b 13) Mostre a ordem de precedncia do exerccio anterior, supondo que a linguagem no tem regra de precedncia e que os operadores associem-se da direita para a esquerda. 14) Supondo o programa abaixo: function F1 (var tam : integer) : integer; begin tam := tam + 1; F1 := 2 * tam 5; end; {programa principal} begin i := 1; soma := (2 * i) + f1 ( i ); j := 1; soma2 := f1 ( j ) + (2 * j); end. a) Supondo que os operandos so avaliados da esquerda para direita, quais os valores de soma e soma2? b) Supondo que os operandos so avaliados da direita para esquerda, quais os valores de soma e soma2?

63

Prof Cinthia C L Caliari

CAPTULO VI VARIVEIS
Uma vez que o programador tenha entendido o uso de variveis, ele entendeu a essncia da programao. Dijkstra

No paradigma imperativo: Uma varivel um objeto que contm um valor, o qual pode ser inspecionado e atualizado sempre que necessrio. So usadas para modelar objetos do mundo real que possuem estados. uma abstrao de uma clula ou de um conjunto de clulas de memria de um computador. Ou seja, a substituio de um endereo numrico de memria por um nome, tornando os programas mais legveis, mais fceis de escrever e de manter. Uma varivel pode ser caracterizada como um sxtuplo de atributos: nome, endereo, valor, tipo, tempo de vida e escopo.

VI.1 Nomes
O nome uma cadeia de caracter usada para identificar uma entidade do programa. Os nomes, ou identificadores, obedecem a uma regra de formao de identificadores da LP. Algumas linguagens fazem distino entre maiscula e minscula (Isto pode ser uma vantagem ou uma desvantagem). PRIMEIRAS LINGUAGENS FORTRAN I FORTRAN 90 e C ADA = nomes de 1 caracter (matemticos) = nomes de at 6 caracteres = 31 caracteres = no tem limite de tamanho

Palavras especiais a) palavras reservadas = no podem ser usadas para nenhum outro fim b) palavra-chave = so especiais apenas em certos contextos, por exemplo: em FORTRAN: (usa nos dois sentidos) REAL N {Tipo} REAL = 3.4 {nome de uma varivel} Problemas de legibilidade. c) nomes predefinidos = possuem um significado predefinido mas, podem ser redefinidos. Exemplo: readln e o writeln em PASCAL. (Define um outro sentido, no pode ser mais usado com o anterior). VAR readln : INTEGER; BEGIN readln := 1; END. Obs: Existem variveis que no possuem nome: os ns alocados dinamicamente.

64

Prof Cinthia C L Caliari

VI.2 Endereo
o endereo de memria onde o espao para a varivel foi alocado, ou seja, a posio na memria da primeira clula ocupada pela varivel. Mas, em muitas linguagens, possvel ter o mesmo nome associado a lugares diferentes da memria, em tempos diferentes no programa. Ento, possvel ter: ! Variveis com mesmo nome acessando lugares diferentes da memria, em tempos diferentes. ! Variveis com nomes diferentes acessando o mesmo endereo de memria (esses nomes so chamados apelidos ou alases).

VI.3 Tipo
Determina a faixa de valores que a varivel pode assumir. O tipo pode ser declarado explicitamente, atravs de declarao de variveis com o tipo definido, ou implicitamente, onde a primeira ocorrncia do nome da varivel no programa constitui sua declarao. A maioria das linguagens de programao exige declaraes explcitas, pois as implcitas podem prejudicar a legibilidade e porque podem impedir que o compilador detecte erros tipogrficos e do programador. Existem LPs, como o JavaScript, em que os tipos so vinculados dinamicamente, ou seja, no h especificao do tipo da varivel na sua declarao. medida que a varivel recebe um determinado valor, ela vinculada ao tipo do valor. Ex.: LIST = [10.2 5.1 0.0] LIST = 47 A primeira instruo faz com que ela se torne um array unidimensional de tamanho 3 e de elementos do tipo real. A segunda instruo faz com que a varivel torne-se do tipo inteiro. Desvantagens: ! Diminui a capacidade de deteco de erros do compilador, pois dois tipos quaisquer podem aparecer em lados opostos de uma operao de atribuio ! O custo para implementar este tipo de vinculao alto, principalmente durante a execuo, pois a verificao de tipos ocorrer em tempo de execuo, a varivel dever ter um descritor que armazenar seu tipo corrente e o espao de memria reservado para uma varivel deve ter tamanho varivel j que o tipo da varivel tambm pode variar. Linguagens que usam vinculao dinmica, geralmente, so linguagens interpretadas.

VI.4 Valor
o contedo da clula ou das clulas de memria associadas varivel e deve ser compatvel com seu tipo.

VI.5 Tempo de vida


Uma varivel pode ser criada (alocada) e em um outro instante eliminada (desalocada). O intervalo de tempo existente entre a criao e a destruio de uma varivel chamado de tempo de vida da varivel.

65

Prof Cinthia C L Caliari

De acordo com o tempo de vida podemos classificar quatro categorias de variveis escalares (no estruturadas): Variveis estticas So aquelas alocadas antes que a execuo do programa inicie e assim permanecem at que a execuo do programa encerre. So as variveis globais. Vantagens: ! Eficincia (endereamento direto e no gasta tempo de execuo do programa para alocar e/ou desalocar espao em memria). ! Sensveis a histria Desvantagem: ! Falta de flexibilidade (Uma linguagem que s possui variveis estticas no permite recursividade). ! Armazenamento no pode ser compartilhado

Variveis stack-dinmicas So aquelas alocadas na pilha em tempo de execuo, ao chamar um subprograma, por exemplo. Elas so declaradas na codificao do programa e seus tipos so estaticamente verificados. Essas variveis so alocadas na pilha em tempo de execuo. Vantagens: ! Economia de memria ! Flexibilidade (Na recurso, necessrio manter uma pilha de variveis locais para cada chamada recursiva). Desvantagem: ! Perda de tempo para a alocao e desalocao de memria. Em linguagens como Pascal, Java e C++, as variveis locais so assumidas como dinmicas na pilha. Variveis heap-dinmicas explcitas So clulas de memria sem nome (annimas), alocadas na heap em tempo de execuo, que podem ser acessadas atravs de ponteiros. Geralmente utilizam de um comando para a alocao e outro para a desalocao. Vejamos alguns exemplos de linguagens com esses tipos de comandos:

66

Prof Cinthia C L Caliari

Pascal type nodo = record dado: integer; prox : ^nodo; end; var elem : ^nodo; begin ... new (elem); {Aloca um espao na memria para um tipo inteiro (dado) e um tipo ponteiro (prox)} ... dispose (elem); {desaloca a clula para a qual elem aponta} ... end; C++ int *elem; // declarao no aloca espao ... elem = new int; //Aloca um espao na memria para um tipo inteiro ... delete elem; //desaloca a clula para a qual nodo aponta ... Em ambas as linguagens, uma varivel criada pelo operador new. Esta varivel no tem nome e dever ser referenciada pelo ponteiro elem. Depois, a varivel desalocada pelo operador dispose (Pascal) ou delete (C++). Em Java, todos os dados que no so escalares primitivos so objetos. Os objetos so dinmicos e, portanto, acessados atravs de ponteiros. A alocao do objeto no Java segue o padro do C++ com o comando new, mas no se usa nenhum comando de desalocao da varivel por causa do coletor de lixo. Variveis dinmicas explcitas so usadas, na maioria das vezes, para implementar estruturas dinmicas (listas, pilhas, filas, rvores, etc). Vantagem ! Economia de memria Desvantagem: ! Perda de tempo para a alocao ! Dificuldades de usar corretamente

Variveis heap-dinmicas implcitas So aquelas que no precisam de declarao p rvia. Armazenam qualquer tipo e o seu tipo atribudo quando lhe so atribudos valores. Vantagem ! Flexibilidade (cdigo altamente genrico)

67

Prof Cinthia C L Caliari

Desvantagem ! Sobretaxa de manter todos os atributos dinmicos em tempo de execuo. ! Perda de certa capacidade de deteco de erros pelo compilador. ! Perda de tempo para gerenciar estas variveis. Exemplos: Algol 68, APL

VI.6 Escopo
a faixa de instrues na qual a varivel visvel, ou seja, na qual ela pode ser referenciada. As regras de escopo de um LP determinam como uma varivel declarada fora de um subprograma ou bloco pode ser ali acessada. Existem dois tipos de escopo: a) o Esttico Quando o escopo de uma varivel pode ser determinado antes da execuo de um programa. Em algumas linguagens como Pascal, Ada e Java-Script, os sub-programas podem ser aninhados dentro de outros sub-programas, criando assim, uma hierarquia de escopos em um programa. Exemplo: PROGRAM EXEMPLO; VAR X : INTEGER; PROCEDURE TESTE1; VAR X : INTEGER; BEGIN WRITELN (X); END;

PROCEDURE TESTE2; BEGIN WRITELN (X); END; BEGIN ... END.

A varivel x global ficou oculta pelo varivel x local de Teste1. Em geral, uma declarao para uma varivel oculta qualquer declarao de outra varivel com o mesmo nome em um escopo envolvente maior. Algumas LPs permitem que sejam acessadas as variveis ocultas a um procedimento. Por exemplo, em C++, as globais ocultas podem ser acessadas assim: ::x Algumas linguagens como C, C++ e Java permitem que qualquer instruo composta tenha declaraes e, assim, defina um novo escopo. Por exemplo, suponha list um vetor de inteiros: if (list[i] < list[j]) { int temp; temp = list[i]; list[i] = list[j]; list[j] = temp; } Os escopos criados por blocos so tratados da mesma forma que aqueles criados por subprogramas, ou seja, seu escopo somente dentro do bloco em que foi declarada.

68

Prof Cinthia C L Caliari

Variveis que so referenciadas em um bloco, mas no so declaradas dentro do mesmo so conectadas a declaraes em escopos maiores. Linguagens como C++ e Java permitem que variveis sejam definidas em qualquer lugar de uma funo. Mas seu escopo ser da posio da declarao at o fim da funo. Uma instruo for do C++ e do Java permitem declaraes de variveis em sua inicializao e o escopo dessa varivel se restringe, na verso padro do C++ e no Java, construo do for. Em linguagens como o Pascal, em que possvel declarar sub-rotinas dentro de sub-rotinas, as variveis visveis na sub-rotina mais interna so aquelas declaradas na prpria sub-rotina mais as declaradas na mais externa mais as declaradas no programa principal.
PROGRAM EXEMPLO; VAR X : INTEGER; PROCEDURE TESTE3; VAR Y : INTEGER; BEGIN ... T3 END; PROCEDURE TESTE1; VAR A : INTEGER; PROCEDURE TESTE2; VAR B : INTEGER; BEGIN {TESTE2} ... END; {TESTE2} BEGIN {TESTE1} T1 ... END; {TESTE1} BEGIN {EXEMPLO} EX ... END. {EXEMPLO}

T2

Podemos observar no exemplo acima que o escopo de cada uma das variveis ser: VARIVEL X Y A B DECLARAO Programa Principal Teste3 Teste1 Teste2 ESCOPO Todo o programa Teste3 Teste1 e Teste2 Teste2

Mas, em todos os casos, a verificao da declarao da varivel ocorre do bloco mais interno para o bloco mais externo. b) o Dinmico Baseia-se na seqncia de chamadas de subprogramas, no em suas relaes espaciais um com o outro. Assim, o escopo ser determinado em tempo de execuo.

69

Prof Cinthia C L Caliari

PROGRAM TESTE; USES CRT; VAR X: INTEGER; PROCEDURE TESTE1; BEGIN WRITELN (X); END; PROCEDURE TESTE2; VAR X : INTEGER; BEGIN X := 15; TESTE1; END; BEGIN X := 10; TESTE1; TESTE2; END.
O que ser impresso no vdeo? 10 10 Pois o escopo do pascal esttico, ou seja teste1 s consegue ver X global e no o local. Se fosse escopo dinmico imprimiria 10 15

Caractersticas: ! No precisa passar variveis. ! A verificao das variveis feita em tempo de compilao; mais complicado de realizar pois incapaz de, estaticamente, verificar o tipo das referncias a variveis no-locais. Portanto, o programa incapaz de determinar estaticamente a declarao para uma varivel referenciada como no-local. ! Este tipo de escopo resulta em programas menos confiveis porque quando um subprograma inicia sua execuo, suas variveis locais so todas visveis a qualquer outro subprograma em execuo. ! Pode dificultar a leitura do programa (deve-se saber a ordem de chamada). Assim, provoca ilegibilidade porque a seqncia de chamadas a sub-programas deve ser conhecida para determinar o significado das referncias a variveis no-locais. ! Perde tempo na execuo para a verificao Exemplos: APL, SNOBOL4 e as primeiras verses de LISP.

Escopo x Tempo de vida Tempo de vida o tempo de existncia da varivel, ou seja, o intervalo de tempo em que a varivel est alocada na memria. Escopo referente ao local onde o acesso varivel permitido. Normalmente, o tempo de vida de uma varivel local o intervalo de tempo entre a chamada do subprograma em que ela foi declarada e o final de sua execuo. Mas, existem excees, como as variveis declaradas como static no C++, cujo escopo local mas o tempo de vida durante toda a execuo do programa (Veja exemplo abaixo). Exemplo:

70

Prof Cinthia C L Caliari

Em C: int teste (void) { static int num = 100; num = num + 1; return (num); } void main (void) { int i; i = teste; printf ( %i , i); }

A varivel existe durante toda a execuo do programa, mas o seu escopo pertence somente a teste.

VI.7 Constantes Nomeadas


uma varivel que armazena um valor fixo e este no pode ser alterado pelo programa. So importantes, pois aumentam a legibilidade e confiabilidade do programa, alm de facilitar quando o programa utiliza um nmero de fixo de valores de dados e depois deseja altera-lo. As declaraes de constantes nomeadas em Pascal devem ter valores simples do lado direito do operador =. Ada, C++ e Java permitem vinculao dinmica de valores para constantes nomeadas. Ento, expresses com variveis podem ser atribudas s constantes na declarao.

VI.8 Inicializao de Variveis


A inicializao de variveis muitas vezes pode ocorrer no momento de sua declarao, quando a linguagem permitir, ou em tempo de execuo.

VI.9 Variveis Transientes e Variveis Persistentes


Variveis Transientes: variveis cujo tempo de vida limitado pela ativao do programa que a criou. Ex. variveis locais. Variveis Persistentes: so aquelas cujo tempo de vida transcende a ativao de um programa em particular Ex. arquivos.

VI.10 Lista de Exerccios


1) Qual o perigo p otencial das LPs que fazem distino entre letras maisculas e minsculas? 2) De que maneira as palavras reservadas so melhores do que as palavras-chave? 3) O que um apelido? 4) Defina variveis estticas, dinmicas na pilha, dinmicas explcitas e dinmicas implcitas. Quais as vantagens e desvantagens de cada uma? 5) Defina tempo de vida, escopo. 6) Defina escopo esttico e escopo dinmico. Quais as vantagens e desvantagens de cada um? 7) Quais as vantagens das constantes nomeadas? 8) D um exemplo em que uma varivel sensvel histria til em um subprograma. 71

Prof Cinthia C L Caliari

9) Considere o programa em Pascal esquemtico abaixo: PROGRAM EX; VAR X : INTEGER; PROCEDURE SUB2; VAR X : INTEGER; BEGIN { SUB2 } X := 10; SUB1; END; { SUB2 }; BEGIN { EX } X := 5; SUB2; END. { EX };

PROCEDURE SUB1; BEGIN { SUB1 } WRITELN (X = , X); END; { SUB1 };

a) Suponha que este programa tenha sido compilado e executado usando as regras de escopo esttico. Qual o valor de X que ser mostrado na tela? b) E se as regras forem de escopo dinmico, qual o valor de X que ser mostrado na tela? 10) Considere o programa abaixo: PROGRAM EX; VAR X, Y, Z : INTEGER; PROCEDURE SUB1; VAR A, Y, Z : INTEGER; PROCEDURE SUB2; VAR A, B, Z : INTEGER; BEGIN { SUB2 } . . . END; { SUB2 }; BEGIN { SUB1 } . . . END; { SUB1 }; PROCEDURE SUB3; VAR A, X, W : INTEGER; BEGIN { SUB3 } . . . END; { SUB3 }; BEGIN { EX } . . . END. { EX }

Liste todas as variveis, juntamente com as unidades de programa em que elas foram declaradas que so visveis nos corpos de SUB1, SUB2 e SUB3, supondo que seja usado o escopo esttico. 11) Considere o programa abaixo: PROGRAM EX; VAR X, Y, Z : INTEGER; PROCEDURE SUB1; VAR A, Y, Z : INTEGER; BEGIN { SUB1 } . . . END; { SUB1 }; PROCEDURE SUB2; VAR A, X, W : INTEGER; PROCEDURE SUB3; VAR A, B, Z : INTEGER; BEGIN { SUB3 } . . . END; { SUB3 }; BEGIN { SUB2 } . . . END; { SUB2 } BEGIN { EX } . . . END. { EX }

72

Prof Cinthia C L Caliari

Liste todas as variveis, juntamente com as unidades de programa em que elas foram declaradas que so visveis nos corpos de SUB1, SUB2 e SUB3, supondo que seja usado o escopo esttico. 12) Considere o programa abaixo em C: void fun (void) { int a, b, c; /* definio 1 */ . . . while (. . .) { int b, c, d; /* definio 2 */ . . . /* 1 */ while (. . .) { int c, d, e; /* definio 3 */ . . . /* 2 */ } . . . /* 3 */ } . . . /* 4 */ } Para cada um dos quatro pontos marcados nessa funo, liste cada varivel visvel, juntamente com o nmero da instruo de definio que a define. 13) Considere o programa abaixo: PROGRAM EX; VAR X, Y, Z : INTEGER; PROCEDURE SUB1; VAR A, Y, Z : INTEGER; BEGIN { SUB1 } . . . END; { SUB1 }; PROCEDURE SUB2; VAR A, B, Z : INTEGER; BEGIN { SUB2 } . . . END; { SUB2 }; PROCEDURE SUB3; VAR A, X, W : INTEGER; BEGIN { SUB3 } . . . END; { SUB3 }; BEGIN { EX } . . . END. { EX }

Dadas as seguintes seqncias de chamada e supondo-se que seja usado o escopo dinmico, quais variveis so visveis durante a execuo do ltimo subprograma ativado? Inclua, em cada varivel visvel, o nome da unidade em que ela foi declarada. a) EX chama SUB1; SUB1 chama SUB2; SUB2 chama SUB3. b) EX chama SUB1; SUB1 chama SUB3. c) EX chama SUB2; SUB2 chama SUB3; SUB3 chama SUB1. d) EX chama SUB3; SUB3 chama SUB1. e) EX chama SUB1; SUB1 chama SUB3; SUB3 chama SUB2. f) EX chama SUB3; SUB3 chama SUB2; SUB2 chama SUB1.

73

LP I

Prof. Cinthia C L Caliari

14) Com relao ao procedimento P1 abaixo, responda aos itens (a), (b) e (c): Program Exemplo; Var x : String; Procedure P1 (var x : String); Begin ... End; a) qual o escopo da varivel x? b) qual o seu tempo de vida? c) Em que segmento fica armazenada? Var a, b : String; Begin ... P1(b); ... End;

74

LP I

Prof. Cinthia C L Caliari

CAPTULO VII - ABSTRAO DE CONTROLE


Instruo de Controle: mecanismos que proporcionam selecionar entre caminhos alternativos do fluxo de controle e ou provocar a execuo repetida de certos conjuntos de instrues. Apenas duas instrues de controles seriam necessrias: uma condicional (se, por exemplo) e outra de iterao (enquanto, por exemplo). Estrutura de Controle: uma instruo de controle e sua coleo de comandos cuja execuo ela controla.

VII.1 Instrues de seleo


Oferece meios de escolher entre dois ou mais caminhos.

VII.1.1 Seletores Bidirecionais: IF ...

THEN ... ELSE

Neste tipo de instruo, podem ocorrer problemas como, por exemplo, em ifs aninhados. Veja o cdigo abaixo em JAVA: if (ok) if (total > 0) resultado = total/10; else resultado = 0;

Neste caso, embora parea que o else seja relativo ao if mais externo, ele relativo ao if mais interno, j que no JAVA, o else sempre faz par com o if mais recente. Em linguagens como o ALGOL 60, no permitido esse tipo de sintaxe, ou seja, quando se tem um if dentro de outro, necessrio que o segundo seja colocado em uma instruo composta de duas maneiras: if (ok) then begin if (total > 0) then resultado = total/10 else resultado = 0 end if (ok) then begin if (total > 0) then resultado = total/10 end else resultado = 0

75

LP I

Prof. Cinthia C L Caliari

Esse tipo de controle tambm pode ser feito atravs de palavras especiais de fechamento de seleo, como em ADA: if (OK) then if (TOTAL > 0) then RESULTADO = TOTAL/10; else RESULTADO = 0; end if; end if; if (OK) then if (TOTAL > 0) then RESULTADO = TOTAL/10; end if; else RESULTADO = 0; end if;

Assim, else sempre marca o final da clusula then, mesmo se ela contiver v rias instrues, e end if, por sua vez, marca o final de todo o if. Dessa forma, mesmo que dentro do if ou do else se tenha mais de uma instruo, no h problemas com relao ao controle da instruo: if A > B then TOTAL := TOTAL CONT := CONT + else TOTAL := TOTAL CONT := CONT + end if;

+ A - B; A; + B - A; B;

VII.1.2 Seletores Mltiplos Permitem a escolher uma opo dentre vrias. Um seletor mltiplo pode ser construdo tambm atravs do uso de IFs aninhados mas, geralmente, o cdigo fica confuso, difcil de escrever e ler e pouco confivel. Exemplo em Pascal:
Case mes of 2 : max := 28; 4, 6, 9, 11 : max := 30; 1, 3, 5, 7, 8, 10, 12 : max := 31; else writeln (ERRO); end;

Exemplo em C, C++, Java:


switch (mes) { case 2: maxDia = 28; break; case 4: case 6: case 9: case 11: maxDia = 30; break; case 1: case 3: case 5: case 7: case 8: case 10: case 12: maxDia = 31; break; default: printf (ERRO); }

76

LP I

Prof. Cinthia C L Caliari

VII.2 Instrues Iterativas:


Faz com que uma ou mais instrues sejam executadas zero, uma ou mais vezes. Corpo de um lao interativo: coleo de instrues controladas pelo comando de repetio. Pr-teste de um lao: quando o teste para finalizao do lao ocorre antes do corpo do lao. Ps-teste de um lao: quando o teste para finalizao do lao ocorre depois do corpo do lao.

VII.2.1 Laos controlados por contador: Exemplo: FOR. Possuem uma varivel de lao onde os valores iniciais e finais so predeterminados e geralmente a diferena entre seus valores seqenciais, stepsize, pode ser estabelecido. Vejamos exemplos de algumas linguagens: ALGOL 60 => h trs formas mais simples e outras, mais complexas, combinando as primeiras: 1) for cont := 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 do Lista[cont] := 0 2) for cont := 1 step 1 until 10 do Lista[cont] := 0 3) for cont := 1, cont + 1 while (cont <= 10) do Lista[cont] := 0 4) for indice := 1, 4, 13, 41 Step 2 until 47, 3 * ndice while ndice < 1000, 34, 2, -24 do soma := soma + ndice Neste caso, indice ter os valores 1, 4, 13, 41, 43, 45, 47, 141, 423, 34, 2, -24

77

LP I

Prof. Cinthia C L Caliari

5) i := 1; for cont := 1 step cont while (cont < 3*i) do i := i + 1 Aqui ns temos uma situao em que o cont est sendo alterado de forma diferente a cada passo, ou seja, ele sempre dobra pois step sempre o valor anterior de cont. Ainda temos o fato de o fator de parada estar sempre se modificando tambm. Ento teremos: i 1 2 3 4 5 cont 1 2 4 8 16 step 1 2 4 8 16 until 3 6 9 12 15 fim do lao

ADA CONT : FLOAT := 1.35; for CONT in 1..10 loop SOMA := SOMA + CONT; end loop Neste caso, a varivel CONT do tipo FLOAT no afetada pelo lao for. Aps a finalizao do lao, a varivel CONT ainda FLOAT com valor 1.35, pois ser oculta pelo contador CONT do lao, que foi implicitamente declarado para ser o tipo da faixa discreta INTEGER C, C++ e Java for (ind = 0; ind <= 10; ind++) soma += lista[ind]; Todas as expresses do for do C so opcionais, ou seja: Se a segunda expresso estiver ausente (ind = 0; ; ind ++), o lao ser infinito. Se a primeira expresso estiver ausente, nenhuma inicializao est sendo feita. Se a terceira expresso estiver ausente, o contador no est sendo incrementado. Outra observao que pode ser feita que toda expresso pode conter mltiplas instrues: for (cont = 0, cont2 = 0.0; cont <= 10 && cont2 <= 100.0; soma = ++cont1 + cont2, cont2 *= 2.5);

78

LP I

Prof. Cinthia C L Caliari

Observaes: Como em C, valores diferentes de zero significam verdadeiro e valores iguais a zero so falso, temos que a segunda expresso pode ser uma expresso aritmtica. No C++ possvel definir uma varivel na primeira expresso e, seu escopo vai da definio at o final do lao. Ex. for (int cont = 0; cont < comp; cont ++) { ...} Em Java, a expresso de controle do lao se restringe ao tipo booleano.

VII.2.2 Laos controlados logicamente: So lao controlados por expresses booleanas, ao invs de contadores. Exemplo: WHILE e REPEAT. Podem apresentar pr-teste ou ps-teste. Programadores devem ter mais cuidado com o ps-teste, pois a seqncia de instrues sempre ser feita, pelo menos, uma vez. PASCAL WHILE soma := 0; readln (indat); while (indat >= 0) do begin soma := soma + indat; readln (indat); end; REPEAT readln (valor); repeat valor := valor /10; dgitos := dgitos +1; until (valor < 1); soma = 0; cin >> indat; while (indat >= 0) { soma += indat; cin >> indat; } DO WHILE cin >> valor; do { valor /= 10; dgitos ++; } while (valor > 1); C

VII.2.3 Mecanismos de controle de laos localizados pelo usurio Exemplo: EXIT, BREAK. ADA => tem sadas condicionais e incondicionais exit [rotulo_do_lao] [when condio] C, C++ => sadas incondicionais no rotuladas (break) JAVA => sadas incondicionais rotuladas (break) Tanto o EXIT quanto o BREAK servem para sadas mltiplas de laos, principalmente em situaes inesperadas. Mas, se mal utilizadas, diminuem a legibilidade do programa. 79

LP I

Prof. Cinthia C L Caliari

VII.3 Desvio incondicional


Transfere o controle da execuo para um lugar pr-determinado pelo programador. exemplo: goto Esse tipo de desvio pode causar srios problemas de legibilidade, tornando os programas pouco confiveis e de difc il manuteno, apesar de ser bastante flexvel.

VII.4 Comandos protegidos:


IF E1-> C1 E2 -> C2 ... En -> Cn

FI Onde Ei fornece um resultado lgico. Qualquer Ei que seja verdadeiro provoca a execuo de Ci . Esta forma foi sugerida por Dijkstra em 1975. Utilizados em programao concorrente (CSP e ADA). Essa construo parece com seleo mltipla, mas sua semntica diferente: Todas as expresses booleanas so avaliadas cada vez que a se alcana esta construo durante a execuo. Se mais de uma expresso for verdadeira, uma delas ser escolhida nodeterministicamente. Se nenhuma for verdadeira, ocorrer um erro que causar a finalizao do programa. Exemplos: 1) Encontrar o maior de dois nmeros if x >= y -> max := x [ ]y >= x -> max := y fi 2) Dados 4 nmeros, organiza-los de forma que q1 < q2 < q3 < q4 do q1 > q2 -> temp := q1; q1 := q2 ; q2 := temp; [ ] q2 > q3 -> temp := q2; q2 := q3 ; q3 := temp; [ ] q3 > q4 -> temp := q3; q3 := q4 ; q4 := temp; od

80

LP I

Prof. Cinthia C L Caliari

VII.5 Lista de Exerccios


1 O que uma estrutura de controle? 2 Que problema pode ocorrer ao se fazer aninhamento de seletores bidirecionais? D uma sugesto de soluo. 3 O que uma instruo de lao pr-teste? E ps-teste? 4 Qual a caracterstica da instruo for do ALGOL60 que torna os programas que a usam difceis de serem lidos? 5 Analise os potenciais problemas de legibilidade ao usar palavras reservadas de fechamento para instrues de controle que so o inverso das palavras reservadas iniciais. 6 Reescreva o cdigo abaixo usando uma estrutura de lao controlado por contador, em Pascal, ADA e C, supondo que as variveis so do tipo inteiro. Discuta qual a linguagem tem melhor capacidade de escrita, melhor legibilidade e melhor combinao das duas. k := j; lao: if k > 10 then goto fora k := k + 1 i := 3 * k 1 goto lao fora: ... 7 Refaa o problema anterior transformando todas as variveis e constantes em tipo real e mude a instruo k := k + 1 para k := k + 1.2

8 Reescreva o cdigo abaixo usando uma instruo de seleo mltipla em Pascal e C , supondo que todas as variveis sejam do tipo inteiro. if if if if (k (k (k (k = = = = 1) 3) 4) 6) or (k = 2) then or (k = 5) then then j := 4 * k or (k = 7) or ( j j k := 2 * k 1 := 3 * k + 1 1 = 8) then j := k 2

9 Considere a instruo abaixo em ALGOL 60: for i := j + 1 step i * j while i<=3*j do j := j + 1; Suponha que o valor inicial de j seja 1. Liste a seqncia de valores para a varivel i usada, supondo que: a) Todas as expresses sejam avaliadas uma vez na entrada do lao b) Todas as expresses sejam avaliadas antes de cada iterao c) Expresses step sejam avaliadas uma vez na entrada do lao, expresses while so avaliadas antes de cada iterao. 81

LP I

Prof. Cinthia C L Caliari

d) Expresses while sejam avaliadas uma vez na entrada do lao, expresses step so avaliadas antes de cada iterao, logo aps incrementar o contador dos laos. 10 Seja a instruo case do Pascal abaixo. Reescreva-a usando seleo bidirecional. case ind of 2, 4 : par := par + 1; 1, 3 : impar := impar + 1; 0 : zero := zero + 1; else erro := true; end; 11 Seja o cdigo em C abaixo. Reescreva-o sem usar goto nem break: j = 3; for (i = 0; i < 3; i++) { switch (j + 2) { case 3: case 2: j--; break; case 0 : j += 2; break; default : j = 0; } if ( j > 0 ) break; j = 3 i; } 12 Seja o cdigo abaixo que localiza a primeira linha da matriz de elementos inteiros n x n, chamada mat, que s tem elemento zero. Reescreva o cdigo sem goto nem break, em PASCAL ou Java: for i := 1 to n do begin for j := 1 to n do if mat[i,j] <> 0 then goto rejeita writeln (Primeira linha so com zeros : , i); break; rejeita: end;

13 Reescreva o cdigo abaixo, em Pascal ou Java, utilizando um comando de repetio ps-teste, sem operadores unrios nem ternrios: cin >> x; //comando de entrada de dado pelo teclado cin >> y; while (x % 3 != 0 ) { (x > y) ? x = y++ : x *= y++; }

82

LP I

Prof. Cinthia C L Caliari

CAPTULO VIII - ABSTRAO DE PROCESSOS


VIII.1 Introduo
Abstraindo computacionalmente etapas para que uma determinada tarefa seja executada. Ex. de um subprograma: procedimento, funo. Caractersticas gerais dos subprogramas utilizados: Possuem um nico ponto de entrada Um nico subprograma em execuo a cada instante O controle sempre retorna ao chamador quando a execuo do subprograma encerra-se

VIII.2 Definies
Subprograma: descreve a interface e as aes Chamada: a solicitao explcita para executar o subprograma Subprograma ativo: se for chamado e sua execuo no foi encerrada ainda. Cabealho: a primeira linha de definio do subprograma. Especifica o subprograma (funo ou procedimento), fornece um nome ao subprograma, e pode especificar a lista de parmetros. Perfil do parmetro: o nmero, a ordem e os tipos de seus parmetros formais Protocolo: seu perfil de parmetros mais seu tipo de retorno ( se for funo) Argumento: so os valores passados para a abstrao, o valor armazenado no parmetro real. Exemplo: PROCEDURE Teste (var a: integer); BEGIN WRITELN (DIGITE O VALOR DE A:); READLN (A); END; void Teste (int *a) { printf(%s,"DIGITE O VALOR DE A:"); scanf (A); } Os subprogramas podem ter declaraes e definies: Declaraes => prottipos => cabealho => informaes sobre tipos, sem definir variveis. So necessrias para verificao esttica de tipos. Definies => o subprograma todo

83

LP I

Prof. Cinthia C L Caliari

VIII.3 Parmetros
H duas maneiras de um subprograma acessar dados: variveis globais ou os parmetros. Os dados passados por parmetro so acessados por nomes locais. A passagem de parmetros mais flexvel do que utilizar variveis globais. Assim, pode-se parametrizar um processo, o nde ser aceita qualquer varivel do tipo do parmetro. O acesso extensivo a variveis globais pode reduzir a confiabilidade.

VIII.3.1 Tipos de Parmetros Parmetros formais procedure teste (a : real); So os parmetros do cabealho do subprograma. Muitas vezes recebem o nome de variveis fictcias. Parmetros reais teste ( b ); So os parmetros passados quando o subprograma chamado. Existem duas formas bsicas de vinculao do parmetro formal com o real Parmetro posicional (PASCAL, C, C++, Java, etc.) Quando a vinculao entre os parmetros realizada baseando-se em sua posio no cabealho. Desvantagem: lembrar ordem em uma lista grande de parmetros. Parmetro nomeado (ADA, FORTRAN) O nome do parmetro formal ligado ao real especificado. procedure somador ( m_vetor : tp_vet; m_comp: integer); somador (c=>m_comp, v =>m_vetor); Desvantagem: lembrar os nomes dos parmetros formais Existem ainda LPs, como C++,ADA, FORTRAN 90, em que parmetros formais podem ter valores padro. Isso quer dizer que, se nenhum parmetro real for passado, o subprograma utilizar o valor padro.
float calc_pg (float renda, float tarifa_imposto, int isencoes = 1) pagamento = calc_pg (20000.0, 0.15);

Em C++, os parmetros so organizados de modo que o padro venha por ltimo, por que so posicionais.

84

LP I

Prof. Cinthia C L Caliari

VIII.3.2 Mtodos de passagem de parmetros Passagem de parmetros a maneira de transmitir parmetros aos subprogramas chamados. So caracterizados por: 1) receber dados do parmetro real - modo de entrada 2) transmitir dados ao parmetro real - modo de sada 3) ambos - modo de entrada e sada a) Passagem por valor O parmetro real utilizado para inicializar o formal, que uma varivel local ao subprograma. Devantagens: custoso (armazenamento adicional e tempo para transferncia do parmetro real para o formal) b) Passagem por resultado O parmetro real no transmite nada como entrada, mas recebe algo no trmino do subprograma. O parmetro local age como uma varivel local, mas seu valor transferido para o parmetro real ao terminar o subprograma.O valor inicial do parmetro real no deve ser utilizado pelo subprograma. Devantagens: Custo (armazenamento e operaes cpias extras), coliso com parmetros reais. sub ( p1, p1);

Neste caso, os parmetros formais tm nomes diferentes, mas o mesmo tipo. Ento, os parmetros reais podem ser iguais. Mas, se um deles for passado por resultado, pode haver problemas. c) Passagem por valor-resultado uma mistura de passagem por valor e passagem por resultado. Os valores r eais so transferidos para os formais. No final do subprograma, o valor formal transferido de volta para o real. O parmetro formal age como varivel local. Tambm chamada de passagem por cpia. Devantagens: Custo (armazenamento mltiplo para parmetros e tempo para cpias de valores), coliso (devido ordem com que os parmetros so atribudos). d) Passagem por referncia Transmite um caminho de acesso, um endereo, por exemplo, que permite o acesso ao prprio parmetro real. Vantagem: menos tempo, economia de memria. Devantagem: acesso aos parmetros formais lento, pode ocasionar alterao indesejada, podem ocorrer apelidos, por exemplo:

85

LP I

Prof. Cinthia C L Caliari

void fun (int *primeiro, int *segundo) com a seguinte chamada: fun (&total, &total) primeiro e segundo em fun sero apelidos. fun (&lista[i], &lista[j]) mas, e se i = j? e) Passagem constante O parmetro real associado ao parmetro formal diretamente (atravs de seu endereo, por exemplo), mas no pode ser alterado. void fun (const int &p1, int p2, int &p3) {} Observaes: Passagem constante e parmetros em modo de entrada no so a mesma coisa, pois parmetros em modo de entrada podem ser alterados no subprograma, mas essas alteraes no so refletidas nos parmetros reais correspondentes. Parmetros constantes nunca podem ser alterados. Quando o acesso definio dos parmetros mais lento que o acesso por cpia? Quando a execuo do programa se d de forma distribuda em mquina remota, a chamada est em uma mquina, mas a execuo do subprograma se d em outra mquina.

VIII.3.3 Verificao de tipos dos parmetros a verificao da coerncia do parmetro real com o formal. Sem essa verificao, o programa pode gerar erros difceis de diagnosticar. O FORTRAN 77 - no exige verificao de tipos Pascal, Modula-2, FORTRAN 90, Java e Ada exigem. C original no fazia: void funcao( x ); int x; { } No ANSI C pode ou no fazer: void funcao ( int x ); { } ou do outro modo.

VIII.4 Mdulo
Qualquer unidade de programa que nomeada e que pode ser implementada como entidade independente.

86

LP I

Prof. Cinthia C L Caliari

Um mdulo pode ser um simples procedimento ou funo, ou um grupo de vrios componentes (tipos, constantes, variveis, procedimentos, ...) declarados com um objetivo comum. Um mdulo encapsula seus componentes.

VIII.5 Abstrao de Dados Tipos Abstratos de Dados


o mecanismo atravs do qual observa-se o domnio de um problema e foca-se nos objetos, aes e propriedades, que so relevantes para uma aplicao especfica. Descreve as caractersticas essenciais de um objeto que o distingue de todos os outros tipos de objetos. Proporciona uma abstrao sobre uma estrutura de dados. Cdigo e estrutura de dados de uma abstrao devem estar armazenados em um mesmo local Proporciona o ocultamento da informao, promovendo proteo contra acessos inesperados estrutura de dados. tipo + ocultamento da informao + encapsulamento = TAD Os tipos abstratos de dados so constitudos de duas partes: Especificao (interface) e a Implementao Vantagens: Legibilidade, facilmente modificado, mais seguro

Exemplos: program objeto; type reg = OBJECT X,Y: INTEGER; PROCEDURE INICIAR ( a,b:integer); END; PROCEDURE REG.INICIAR ( a,b:integer); begin X := A; Y := B; END; var R : REG; BEGIN R.INICIAR (10,20); END.

87

LP I

Prof. Cinthia C L Caliari

Outro exemplo: public class No { String info; No prox; No (Item _info){ this.info = _info; } } public class Lista{ private No prim; private int NElem; public Tabela(){ this.prim = null; } public boolean Vazia (){...} public int getNElem(){...} public void inserePrimeiro(String elem){...} public boolean remove (String elem){...} } public class UsaLista{ public static void main (String[] args){ lista p; p.inserePrimeiro("elemento 1"); p.inserePrimeiro("elemento 2"); p.remove("elemento 1"); }

VIII.6 Subprogramas Sobrecarregados (OVERLOADING)


Um identificador ou operador dito estar sobrecarregado (overloaded) se este simultaneamente denota dois ou mais subprogramas diferentes. Em PASCAL apenas operadores e subprogramas pr-definidos so sobrecarregados, no permitido ao programador criar subprogramas sobrecarregados. Exemplo: writeln ( 'digite algo'); writeln (a); {a inteiro}

C++, ADA, JAVA. Obs. : Cada verso do subprograma deve ser diferente quanto ao nmero, ordem ou aos tipos de seus parmetros. Muitas vezes o overloading chamado de polimorfismo ad hoc

88

LP I

Prof. Cinthia C L Caliari

Exemplo em C++:
#include <stream.h> int maior (int i, int j) { return ( i > j ? i : j); } double maior (double i, double j) { return (i > j ? i : j ); } main ( ) { int a = 10, b = 15, c; double d1 = 7.0, d2 = 14.5, d3; c = Maior (a,b); d3=Maior (d1,d2); cout << form("Comparando %d cout << form("Comparando %f }

e e

%d, o maior e %d\n", a, b, c); %f, o maior e %f\n", d1, d2, d3);

VIII.7 Subprogramas Polimrficos Polimorfismo paramtrico


Um subprograma genrico ou polimrfico leva parmetros de diferentes tipos em vrias ativaes, ou seja, um subprograma no teria os tipos de seus parmetros definidos em tempo de compilao. Exemplo: Um procedimento inserePrimeiro que seria genrico, serviria para inserir elementos em um lista de inteiros, em uma lista de real, etc... ADA, C++, JAVA Subprogramas polimrficos so chamados de polimorfismo paramtrico. Exemplo em C++:
#include <stream.h> template <class Tipo> Tipo Maior (Tipo primeiro, Tipo segundo) { return ( primeiro > segundo ? primeiro : segundo); } main ( ) { int a = 10, b=15, c; double d1 = 7.0, d2 = 14.5, d3; c = Maior (a,b); d3= Maior (d1, d2); cout << form("Comparando %d cout << form("Comparando %f }

e e

%d, o maior e %d\n", a, b, c); %f, o maior e %f\n", d1, d2, d3);

89

LP I

Prof. Cinthia C L Caliari

VIII.8 Classes
um novo modelo de dados definido pelo usurio, proporcionando encapsulamento, proteo e reutilizao. Uma classe tipicamente contm: Uma especificao de herana Uma definio para a representao de dados Definio para as operaes

Herana: um mecanismo para derivar novas classes a partir de classes existentes. Uma classe derivada herda a representao de dados e operaes de sua classe base, mas pode adicionar novas operaes, estender a representao de dados ou redefinir a implementao de operaes j existentes. Assim poderamos dizer que: Classe = TAD + herana Exemplo em Java: Classe que define o objeto Pessoa que possui como atributos os dados que definem uma pessoa: public class private private private Pessoa { String nome; int identidade; Data nascimento;

Pessoa (String n, int i, Data nasc){ this.nome = n; this.identidade = i; this.nascimento = nasc; } public String toString(){ return "Nome : "+this.nome+"\n Identidade : "+ this.identidade+"\nData de nascimento : "+ this.nascimento.toString(); } public void setNome (String novoNome){ this.nome = novoNome; } public String getNome (){ return this.nome; } }

Classe que define o objeto Funcionrio que um tipo de Pessoa. Assim, um Funcionrio possui os atributos de uma Pessoa (que so herdados, embora seus campos no possam ser diretamente acessados pois so privados) e outros atributos a mais. Assim como os atributos, a classe Funcionrio tambm herda os mtodos da classe Pessoa.

90

LP I

Prof. Cinthia C L Caliari

public class Funcionario extends Pessoa{ private Data admisso; private float salario; Funcionario (String nome, int id, Data nasc, Data adm, float sal){ super (nome, id, nasc); this.admisso = adm; this.salario = sal; } public String toString(){ return (super.toString()+"\n" + "Data de admisso : " + this.admisso.toString()+"\n" + "Salrio : "+ this.salario); } } Classe UsaPessoa, onde so declaradas duas variveis: Uma do tipo Pessoa e outra do Tipo Funcionrio (herdeiro de Pessoa) public class UsaPessoa { public static void main (String[] args){ Pessoa p1 = new Pessoa("Joao", 12345, new Data ((byte)12,(byte)8,(short)1998)); Funcionario f1 = new Funcionario ("Jose", 13243, new Data ((byte)30,(byte)8, (short)1980), new Data ((byte)02, (byte)3,(short)2003), 880.00f); System.out.println ("O nome do Funcionrio "+ f1.getNome()); System.out.println ("O nome da Pessoa "+p1.getNome()); System.out.println ("Funcionario : "+f1.toString()); System.out.println ("Pessoa : "+p1.toString()); } }

No console aparecer as seguintes mensagens: O nome do Funcionrio Jose O nome da Pessoa Joao Funcionario : Nome : Jose Identidade : 13243 Data de nascimento : 30/08/1980 Data de admisso : 02/03/2003 Salrio : 880.0 Pessoa : Nome : Joao Identidade : 12345 Data de nascimento : 12/08/1998

91

LP I

Prof. Cinthia C L Caliari

VIII.9 Lista de Exerccios


1 Quais as trs caractersticas gerais de um subprograma? 2 O que significa um subprograma estar ativo? 3 O que um perfil de parmetro? O que um protocolo de subprograma? 4 O que so parmetros formais? E parmetros reais? 5 Quais so as vantagens e desvantagens dos parmetros de palavra-chave? 6 Quais so os trs modelos semnticos de passagem de parmetros? 7 Quais so os mtodos de passagem de parmetros, suas vantagens e desvantagens? 8 Como podem ocorrer apelidos com passagem de parmetros por referncia? 9 O que um subprograma sobrecarregado? 10 O que polimorfismo paramtrico? 11 Considere o seguinte programa escrito na sintaxe C: void principal () { int valor = 2; int[] lista = {4, 3, 5, 7, 9}; troca (valor, lista[0]); troca (lista[0], lista[1]); troca (valor, lista[valor]); } void troca (int a, int b) { int temp; temp = a; a = b; b = temp; } Para cada um dos mtodos de passagem de parmetros (passagem por valor, por referncia, por valor-resultado), quais so todos os valores das variveis valor e lista depois de cada uma das trs chamadas de troca?

92