Professional Documents
Culture Documents
Linguagens de
programao
Linguagens de Programao
COORDENADORES DE CURSOS
ADMINISTRAO Antonella Maria das Chagas Sousa
ADMINISTRAO PBLICA Fabiana Rodrigues de Almeida Castro
CINCIAS BIOLGICAS Maria da Conceio Prado de Oliveira
FILOSOFIA Zoraida Maria Lopes Feitosa
FSICA Miguel Arcanjo Costa
LETRAS PORTUGUS Jos Vanderlei Carneiro
LETRAS INGLS Lvia Fernanda Nery da Silva
MATEMTICA Jos Ribamar Lopes Batista
PEDAGOGIA Vera Lcia Costa Oliveira
QUMICA Davi da Silva
SISTEMAS DE INFORMAO Arlino Henrique Magalhes de Arajo
Inclui bibliografia
1 Caractersticas das Linguagens. 2 Variveis e Tipos.
3 Controle do Fluxo de Execuo. 4 Programao Orientada a
Objetos. I.
Universidade Federal do Piau/Universidade Aberta do Piau. II.
Ttulo.
CDD: 511.3
A responsabilidade pelo texto e imagens desta obra do autor. O contedo desta obra foi licenciado, temporria e
gratuitamente, para utilizao no mbito do Sistema Universidade Aberta do Brasil, atravs da UFPI. O leitor se compromete
a utilizar o contedo desta obra para aprendizado pessoal, sendo que a reproduo e distribuio ficaro limitadas ao mbito
interno dos cursos. A citao desta obra em trabalhos acadmicos e/ou profissionais poder ser feita, com indicao da fonte.
A cpia desta obra sem autorizao expressa, ou com intuito de lucro, constitui crime contra a propriedade intelectual, com
sanes previstas no Cdigo Penal.
proibida a venda deste material.
Este texto destinado aos estudantes do programa de Educao a
Distncia da Universidade Aberta do Piau (UAPI), vinculada ao consrcio
formado pela Universidade Federal do Piau (UFPI); Universidade Estadual
do Piau (UESPI); Instituto Federal de Educao, Cincia e Tecnologia do
Piau (IFPI); com apoio do Governo do estado do Piau, atravs da Secretaria
de Educao. O texto composto de quatro unidades, contendo itens e
subitens que discorrem sobre as Linguagens de Programao, evidenciando
como estas estruturas podem ser utilizadas no estudo da Informtica.
Na Unidade 1, so estudadas as principais caractersticas que uma
linguagem de programao deve apresentar para que seja considerada uma
boa linguagem. A unidade tem incio com a justificativa da necessidade de se
estudar as Linguagens de Programao e termina com uma discusso sobre
os principais paradigmas atualmente considerados.
Na Unidade 2, so analisadas as variveis e os tipos de dados,
buscando entender os diversos atributos que as variveis tm, envolvendo a
vinculao que a associao entre as variveis e seus atributos. Os tipos
de dados tambm so analisados luz da notao matemtica, j de domnio
pblico.
Na Unidade 3, se analisa o controle do fluxo de execuo dos
programas nos nveis: de expresso, instruo e de subprogramas, finalizando
com um estudo sobre corrotinas.
Na Unidade 4, se analisam os tipos abstratos de dados e como eles
podem ser implementados em Ada, C++ e Java. Em seguida, feito um
estudo sobre a Programao Orientada a Objetos, tanto do ponto de vista
terico, quanto prtico.
UNIDADE 1
11 CARACTERSTICAS DAS LINGUAGENS
Introduo..................................................................................1 1
Por que estudar LP?...................................................................1 1
Caractersticas das linguagens de programao.........................1 2
O desenvolvimento de software................................................12
O processo de traduo das linguagens.....................................16
Anlises lxica e sinttica das LPs..............................................23
Paradigmas das linguagens de programao.............................27
UNIDADE 2
35 VARIVEIS E TIPOS DE DADOS
Introduo..................................................................................35
Atributos de uma varivel..........................................................3 6
Tipos de dados...........................................................................4 6
Equivalncia de tipos.................................................................57
UNIDADE 3
35 CONTROLE DE FLUXO
Introduo..................................................................................65
Controle de execuo em nvel de expresses...........................65
Controle de fluxo em nvel de instrues...................................7 2
Controle do fluxo em nvel de subprogramas............................81
UNIDADE 4
96 ABSTRAO DE DADOS
Introduo..................................................................................97
O conceito de abstrao.............................................................97
O conceito de encapsulamento..................................................98
Tipos de dados abstratos definidos pelo usuro......................100
Progamao orientada a objetos..............................................106
Herana.....................................................................................107
Poliformismo............................................................................110
Classes Abstratas......................................................................110
REFERNCIAS......................................................................115
UNIDADE 1
Caractersticas das Linguagens
Resumindo
O objetivo principal desta Unidade apresentar os conceitos bsicos das Linguagens de
Programao, buscando capacitar o aluno na avaliao e comparao de LPs. comum ver em
fruns de programao debates de desenvolvedores defendendo sua linguagem preferida,
levantando algumas caractersticas da linguagem, outras vezes, apenas dizendo que a LP melhor,
sem especificar suas vantagens e desvantagens, sem apresentar as propriedades desejveis em uma
LP. Imaginamos que em um mundo global competitivo, no devemos nem podemos nos limitar a
uma nica linguagem de programao. necessrio ampliar o leque de opes, aprendendo as
caractersticas bsicas e os conceitos em que elas so implementadas. As caractersticas mudam
muito entre as LPs e estaria relacionado, por exemplo, a sua sintaxe e recursos e isso muda
rapidamente, levando a um estudo constante por parte dos desenvolvedores. J os conceitos e
metodologia se modificam a uma velocidade bem menor. Logo o profissional que tenha uma
maior habilidade em aprender rapidamente uma nova linguagem possui maiores chances de
sucesso nesta rea.
CARACTERSTICAS
DAs LINGUAGEns
Introduo
Legibilidade
Ex: C/C++:
- Uso do * denota diversas coisas, como sinal multiplicador,
passagem por referncia, declarao de ponteiros.
12 unidade 1
Efeitos colaterais so prejudicais legibilidade. Eles causam
mudanas adicionais no estado do programa durante a avaliao
de uma determinada expresso ou a execuo de um comando
ou subprograma.
Ex: VISUAL BASIC:
- A no necessidade de informar os parmetros aos procedimentos
e funes, passagem por valor ou referncia. Adotando como
padro passagem por referncia, podendo ocasionar efeito
colateral indesejvel.
Redigibilidade
Eficincia
Facilidade de aprendizado
14 unidade 1
que torna mais difcil a um programador entender o cdigo produzido por
outro.
Ortogonalidade
Reusabilidade
Modificabilidade
Portabilidade
O desenvolvimento de software
16 unidade 1
reais. nesta fase que deve ser escolhida a linguagem (ou
possivelmente as linguagens) de programao a utilizar.
Codificao: Nesta fase, o software efetivamente escrito em
uma ou mais linguagens escolhidas para isso.
Validao: nesta fase, o sistema testado, ou de alguma outra
forma examinado, para que se tenha uma garantia de seu
funcionamento satisfatrio.
Utilizao e evoluo: nesta fase, o sistema finalmente preenche
seus objetivos. Se existem, so ento descobertos erros e
problemas que, de alguma forma, tornam o sistema inadequado
para o uso pretendido. So tambm examinadas possibilidades
de alterao e extenso do sistema que visam torn-lo mais
adequado para a aplicao, cujas necessidades j podem ser
diferentes daquelas consideradas na fase de especificao de
requisitos. As alteraes a serem feitas constituem o que se
chama de manuteno ou evoluo do software.
18 unidade 1
uma linguagem de especificao formal, gerando uma especificao que vai
ser implementada em alguma linguagem de programao.
Existem muitas linguagens de especificao formal. Entre elas,
podem ser citadas VDM, Lotos, Z, Redes de Petri e outras, dependendo da
rea em que o problema a ser resolvido se insere. A especificao formal vai
ser implementada em alguma linguagem de programao. A escolha desta
linguagem depende da experincia do programador e do conhecimento que
ele tem sobre a adequao das linguagens a cada tipo de problema. Deve
ser salientado, no entanto, que esta soluo representa uma soluo ideal e
ainda um processo em evoluo e difcil de ser bem realizado.
O objetivo principal de um programa de computador que ele seja
correto, ou seja, que faa apenas a tarefa para a qual foi projetado e de forma
correta. Esta exigncia tem se tornado cada vez mais presente, medida
que os problemas se tornam, a cada dia, mais complexos e difceis de
serem resolvidos. Lembremos que o homem, atualmente, controla reatores
nucleares e naves interplanetrias, e que cirurgias de alto risco podem ser
realizadas por robs. Isto significa que, inicialmente, os programas devem
ser corretos e depois apresentar um bom desempenho.
Enquanto o desenvolvimento de provas matemticas da corretude
de programas no for completamente dominado, uma soluo alternativa tem
sido a submisso do programa a testes de validade. Esta tcnica tem sido
empregada com relativo sucesso, para programas que no tenham grande
exigncia quanto necessidade de sua corretude. A escolha de bons testes
tem sido uma rea importante de pesquisa, lembrando que, os testes no
provam, matematicamente, a ausncia de erros; eles acusam a presena
deles para determinados casos, mas no para todos os casos possveis de
entrada de dados.
O processo de compilao
20 unidade 1
O processo de interpretao pura
22 unidade 1
vez que uma nova instruo for executada; no caso do compilador, isso
no necessrio. Adicionalmente, possvel adaptar o cdigo gerado por
um compilador para cada comando, de acordo com seu contexto, tirando
proveito de diferenas que no podem ser tratadas com a mesma facilidade
pelo interpretador. Por outro lado, em geral, o controle que o interpretador tem
sobre o programa que est sendo executado maior, e possvel detectar
durante a execuo situaes de erro invisveis (ou imprevisveis) para o
compilador durante a fase de traduo.
24 unidade 1
Os lexemas so agrupados em determinada categoria formando os
tokens, ou seja, conjuntos de lexemas de uma mesma categoria, podem ser
compostos por apenas um lexema. Por exemplo, a instruo C, cont = 4 *
num + 5; assim analisada:
Lexema Token
cont identificador
= Sinal_de_igualdade
4 Literal_inteiro
* Operador_mult
num identificador
+ Operador_soma
5 Literal_inteiro
; Ponto_e_vrgula
26 unidade 1
Algumas observaes podem ser feitas sobre a parse tree. Inicialmente,
muitas propriedades da gramtica podem ser observadas diretamente na
rvore. Por exemplo, verifica-se que a operao + da sentena aparece
na rvore em um nvel mais baixo que o do operador *. Ao se implementar
esta rvore, o processo deve ser iniciado pelas folhas, portanto, o operador
que est mais abaixo na rvore vai ser implementado primeiro. Isto significa
que este operador tem precedncia sobre o anterior. De outra forma, a rvore
mostra qual a ordem de precedncia entre os operadores da gramtica.
Outra observao que pode ser feita diretamente da parse tree que,
se a rvore se expande pela direita ou pela esquerda, isto significa, que, a
associatividade das operaes feita pela direita ou pela esquerda.
A parse tree nica para as gramticas no ambguas, ou seja, para
cada sentena de uma gramtica no ambgua, existe apenas uma parse tree
associdada a ela se a gramtica for no ambgua.
O paradigma imperativo
O paradigma funcional
28 unidade 1
O paradigma lgico
30 unidade 1
objeto receptor ir responder com o mtodo que for apropriado
sua classe.
Herana: uma das propriedades mais importantes do modelo
OO. Ela possvel via definio de hierarquia de classes, isto ,
uma estrutura em rvore de classes, onde cada classe tem 0 ou
mais subclasses. Uma subclasse herda todos os componentes
de sua classe-pai, incluindo a estrutura do estado interno e
pares mtodo-mensagem. Toda propriedade herdada pode ser
redefinida na subclasse, sobrepondo-se definio herdada.
Esta propriedade encoraja a definio de novas classes, sem
duplicao de cdigo.
Exerccio
SAIBA MAIS
32 unidade 1
UNIDADE 2
Variveis e Tipos de Dados
Resumindo
O objetivo principal desta Unidade conhecer com profundidade conceitos inerentes s variveis
e aos tipos de dados. Os conceitos e propriedades referentes a estes temas so importantes
para entender o comportamento de programas. As variveis e seus atributos decidem uma parte
importante da computao e os tipos de dados so importantes na verificao da corretude
dos tipos e das operaes que estes tipos podem realizar com os valores das variveis. Outra
parte importante dos sistemas computacionais diz respeito ao gerenciamento da memria em
tempo de execuo. Este gerenciamento deve ser feito de forma automtica pelo sistema em vez
de ser realizado pelo programador que pode cometer algum erro ao esquecer uma desalocao
necessria. As clulas que no so mais referenciadas em um programa devem ser incorporadas ao
rol de clulas livres para que possam ser reutilizadas e compartilhadas. A forma de apresentao
utilizada de acordo com o exigido para o ensino a distncia, ou seja, tendo em vista sempre esta
nova modalidade de ensino.
variveis e tipos de dados
Introduo
36 unidade 2
no faz esta diferena. As palavras especiais podem ser palavras-chave se
forem especiais em apenas alguns contextos, como o caso do printf de
C que s tem significado prprio se o arquivo stdIO.h estiver includo no
programa. Se uma palavra especial s puder ser utilizada para a finalidade
para a qual foi definida, dizemos que a palavra reservada.
begin
<declaraes>
<comandos>
end.
38 unidade 2
Nas linguagens C, C++ e Ada, o corpo de uma funo uma expresso
em bloco.
As regras de escopo
Escopo esttico
O escopo esttico recebeu este nome porque ele pode ser determinado
40 unidade 2
mas que esteja em um bloco mais externo. As linguagens que adotam esta
metodologia devem prover formas de acesso s variveis ocultas mais
externas. Em C e em C++, o operador de escopo :: utilizado para esta
funo. Se uma varivel global x estiver oculta por uma declarao local
de x, a varivel global pode ser referenciada atravs da declarao ::x.
Vamos verificar, a seguir, um exemplo que mostra o processo de ocultao
de variveis em uma linguagem simples, como Pascal.
Escopo dinmico
42 unidade 2
criao e a destruio de uma varivel conhecido como o seu tempo de vida.
Uma varivel s deve estar associada ao seu armazenamento, ocupando
memria, durante o seu tempo de vida. Quando uma varivel destruda
ou desalocada, a rea de memria ocupada por ela pode ser alocada para
outros propsitos. Isto significa economia de memria. As variveis podem
ser classificadas de acordo com os seus tempos de vida:
Variveis estticas
44 unidade 2
Variveis dinmicas no heap explcitas
46 unidade 2
Toda linguagem de programao oferece ao programador alguns tipos
pr-definidos que do uma indicao da rea de melhor e maior aplicabilidade
da linguagem, sendo este um bom critrio de anlise de uma linguagem.
Por exemplo, uma linguagem destinada a ser utilizada na rea comercial,
como COBOL, deve apresentar tipos primitivos cujos valores sejam strings
de tamanho fixo e valores de ponto fixo. Uma linguagem destinada a ser
utilizada em computao numrica, como Fortran, deve apresentar tipos
cujos valores sejam nmeros reais e tipos para valores complexos.
No entanto, alguns tipos de dados primitivos so oferecidos por muitas
linguagens, mesmo com nomes distintos. Por exemplo, Java tem boolean,
char, int e float. Ada tem os tipos Boolean, Character, Integer e Float. Os
valores destes tipos so:
48 unidade 2
(x, y), sendo x escolhido em S e y escolhido em T. Formalmente, temos:
S x T = {(x, y) | x S y T}
A cardinalidade de S x T dada por:
#(S x T) = #S x #T
A notao para o produto cartesiano de dois conjuntos pode ser
estendida para representar o produto cartesiano de vrios conjuntos. Neste
caso, denotamos por S1 x S2 x ...x Sn cujos valores so as n-uplas onde a
primeira componente est em S1, a segunda em S2, etc. Sendo todos os
conjuntos Si do mesmo tipo, a notao anterior se torna Sn = S x S x ...x S.
Neste caso, a cardinalidade dada por #(Sn) = (#S)n. Considerando o caso
particular em que n = 0, ento #(S0) = 1. Isto nos informa que existe exatamente
um valor para S0. Este valor exatamente a tupla vazia, simbolizada por ( ),
que a nica tupla sem qualquer componente.
Na teoria dos conjuntos, o produto cartesiano representado da
seguinte forma:
COBOL: Ada:
01 REGISTRO EMPREGADO. type Nome_Empregado is record
02 NOME-EMPREGADO. Primeiro : String (1..20);
05 PRIMEIRO PICTURE IS X(20). Meio : String (1..10);
05 MEIO PICTURE IS X(10). Ultimo : String (1..20);
05 ULTIMO PICTURE IS X(20). end record;
02 TAXA-HORARIA PICTURE IS type Registro_Empregado is
99V99. record
Nome : Nome_Empregado;
Taxa_Horaria : Float;
end record;
Empregado : Registro_Empregado;
O tipo mapeamento
50 unidade 2
Graficamente, isto pode ser visto conforme a figura a seguir.
52 unidade 2
ele proporciona sobre os outros, uma vez que um array deste tipo
pode crescer e diminuir durante a execuo do programa.
Figura =
{Bool X Cores X Forma X Float}
+ {Bool X Cores X Forma X Integer X Integer X Float}
+ {Bool X Cores X Forma X Integer X Integer}
54 unidade 2
Observao importante
Os tipos recursivos
O tipo String
56 unidade 2
String.
Um String uma sequncia de caracteres, podendo ter qualquer
nmero destes, inclusive nenhum. A quantidade de caracteres de um String
o tamanho do String. O nico String que no tem qualquer caractere o
String vazio.
No entanto, no existe um consenso entre os projetistas de linguagens
sobre qual deve ser a forma de implementao dos Strings.
Alguns projetistas defendem que os Strings sejam implementados
como tipos primitivos da linguagem. Neste caso, as operaes sobre eles
seriam pr-definidas e no seriam definidas na linguagem, e eles poderiam
ter qualquer tamanho. A linguagem funcional ML adota esta tcnica.
Uma outra metodologia que tem sido defendida por outros projetistas
considerar os Strings como arrays de caracteres. Neste caso, todas as
operaes implementadas para os arrays, podem ser aplicadas aos Strings.
Em particular, a seleo de um caractere um caso de indexao que
uma operao prevista para os arrays. Uma consequncia direta desta
metodologia que todos os Strings devem ter um seus tamanhos fixados,
porque os tamanhos dos arrays so fixados no momento em que eles so
construdos. Isto proibiria que a linguagem permitisse arrays de tamanhos
flexveis. Esta tcnica adotada pela linguagem Ada.
Uma terceira verso destes tipos trata os Strings como arrays de
ponteiros para caracteres, que a tcnica adotada por C e C++. Esta tcnica
permite uma grande economia de memria e um desempenho bem melhor no
tratamento de variveis com valores destes tipos. Deve ser esclarecido que as
implementaes, normalmente, so transparentes aos programadores, que
no devem preocupar-se com a corretude no processamento de operaes
com ponteiros, por ser uma tarefa que exige uma boa experincia por parte
do profissional neste tratamento.
A nosso juzo, se a linguagem de programao oferece o tipo lista,
natural implementar os Strings como listas de caracteres. Neste caso, todas
as operaes que so implementadas para as listas podem ser utilizadas nos
Strings. Esta a tcnica utilizada por Haskell, onde uma varivel String com
valor UFPI tem o mesmo significado que a lista [U, F, P, I].
Equivalncia de tipos
58 unidade 2
verificadas apenas em tempo de execuo, como seria correto se intervalos
fossem apenas subtipos, como em Ada.
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. 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 subtipos intervalo.
Note-se que, a rigor, linguagens como Snobol e Smalltalk, cuja
definio e implementao absolutamente no prev verificao esttica de
tipos, podem ser consideradas (trivialmente) linguagens fortemente tipadas:
basta considerar que todos os valores considerados na linguagem so do
mesmo tipo (string em snobol e objeto em Smalltalk). , assim, impossvel
cometer erros de tipagem, e, portanto, de forma trivial, todos os erros de
tipagem podem ser detectados estaticamente. Ou seja, a propriedade
de tipagem forte em linguagens de programao tem uma importncia
dependente da sofisticao do sistema de tipos oferecido pela linguagem.
Converso de tipos
Exerccio
60 unidade 2
4. Quais tipos de dados representam as estruturas, as unies e os vetores
em C?
SAIBA MAIS
Resumindo
O objetivo principal desta unidade apresentar ao leitor os principais conceitos referentes ao
controle do fluxo de um programa durante a sua execuo. Este controle pode se dar em trs
nveis: no nvel das expresses, no nvel das instrues e no nvel dos subprogramas. No nvel
das expresses, este controle guiado pelas regras de precedncia e pela associatividade dos
operadores aritmticos. No nvel de instruo, o controle feito pelas instrues de se; seleo e
de iterao que pode ser controlada por contadores ou por uma expresso lgica ou booleana. No
nvel dos subprogramas, o controle executado pelo sistema de execuo que composto pela
pilha do sistema que utilizada em cada chamada e em retornos de chamadas a subprogramas. A
forma de apresentao utilizada de acordo com o exigido para o ensino a distncia, ou seja, tendo
em vista sempre esta nova modalidade de ensino.
controle de fluxo
Introduo
Controle de Fluxo 65
Avaliao de expresses aritmticas
Precedncia de operadores
66 unidade 3
dos operadores. Neste caso, a operao de multiplicao tem precedncia
sobre a operao de adio. Para a expresso citada, o valor correto seria
23.
As regras de precedncia adotadas pela Computao, normalmente,
obedecem s regras de precedncia estabelecidas pela Matemtica, mas
esta no uma deciso obrigatria. A tabela a seguir apresenta algumas
linguagens e as regras de precedncia adotadas por cada uma delas, onde
a operao mais acima na tabela significa que o seu grau de precedncia
maior que o de uma operao que esteja situada mais abaixo na tabela.
Associatividade de operadores
Controle de Fluxo 67
O operador de exponenciao em Fortran associativo pela
direita, ou seja, na expresso A ** B ** C, avalia-se inicialmente
B ** C.
Em Ada a exponenciao no associativa, ou seja, a expresso
a ** b ** c ambgua e no legal. Deve-se usar parnteses para
resolver esta ambiguidade.
A tabela a seguir mostra as regras de associatividade adotadas por
algumas linguagens de programao.
68 unidade 3
Qual o valor da varivel x exatamente antes do final da execuo
deste programa? A resposta a esta questo pode parecer bvia para quem
no sabe que a ordem em que os operandos so avaliados tem influncia
no resultado final, neste caso. Se o operando a do operador + for avaliado
primeiro, o resultado ser 7. No entanto, pode ser que o operando fun(&x)
seja avaliado inicialmente. Neste caso, a aplicao fun tem o efeito colateral
de modificar o valor da varivel x para 8. A soma do valor de retorno 4, com
o valor de x que agora 8, totaliza um valor igual a 12.
Converso de tipos
Controle de Fluxo 69
de operaes binrias so construdos de forma que s possvel realizar
operaes binrias em que os dois operandos sejam do mesmo tipo. Isso
significa que os circuitos para realizar uma soma de inteiros, exigem que
os valores a serem somados sejam ambos do tipo inteiro. De forma similar,
tambm possvel somar dois nmeros reais, e os circuitos computacionais
so feitos, de tal forma, que esta operao s seja possvel se ambos os
valores de entrada forem nmeros reais. Dito de outra forma, s possvel
realizar operaes binrias com valores do mesmo tipo.
Se for declarada uma operao binria a ser realizada com argumentos
de tipos distintos, um dos valores ter que ser convertido para o tipo do outro,
para que a operao possa ser realizada.
Por exemplo, se uma linguagem permitir a codificao da expresso
4.0 + 3, ou seja, a soma de um nmero real com um nmero inteiro, ento,
dever acontecer uma converso do valor 4.0 para um nmero inteiro
para que seja somado com o valor inteiro 3; ou, o valor inteiro 3 deve ser
convertido em um valor real para que possa ser somado com o valor 4.0.
Este tipo de converso implcita, e realizada pelo compilador de forma
transparente, sem que o programador tome conhecimento deste fato. Este
tipo de converso conhecida como coero.
C++ e Java tm tipos inteiros menores que o tipo inteiro int. Em
C++, eles so char e short int; em Java, eles so byte, short e char. Tais
operandos so coagidos para o tipo int quando qualquer operador for aplicado
a eles. Embora dados possam ser armazenados em variveis desses tipos,
eles no podem ser manipulados, antes de serem convertidos para outro
maior.
Exemplo 3.3. Considere o seguinte cdigo em Java:
byte x, y, z;
...
x = y + z;
70 unidade 3
Nas linguagens baseadas em C, as converses explcitas so
conhecidas como casts. Para se especificar um cast, o tipo desejado deve
ser colocado entre parnteses antes da expresso a ser convertida. Por
exemplo, a declarao (int) contador; o motivo da colocao dos parnteses
que C tem vrios tipos com mais de uma palavra, por exemplo, long int.
Em Ada, a converso explcita tem a sintaxe das chamadas de funes. Por
exemplo, Float (soma).
Avaliao curto-circuito
Controle de Fluxo 71
S que o valor de ndice est fora dos limites da lista, e este teste ser feito
sobre um valor que no est na lista.
Desvios explcitos
72 unidade 3
aritmtico, tambm tem merecido ateno, mas de forma menos enftica. O
IF aritmtico do Fortran tem a seguinte sintaxe:
IF ( <expresso> ) <rtulo-1>, <rtulo-2>, <rtulo-3>
indica a transferncia de controle para os comandos indicados pelos
rtulos <rtulo-1>, <rtulo-2>, <rtulo-3>, conforme o valor de expresso
seja, respectivamente, negativo, nulo ou positivo. As linguagens modernas
apresentam formas alternativas de comando IF, que so preferveis a estas
construes. Em alguns casos, como em Fortran-77, ambas as formas
coexistem na linguagem.
Comandos de seleo
Controle de Fluxo 73
A tabela a seguir mostra a equivalncia entre as formas do comando
IF de Ada e uma escadinha de IFs em Pascal. Note que, quando a lista de
comandos em Ada contm mais de um comando, necessrio usar um
comando composto em Pascal.
Ada Pascal
if c1 then if c1 then
s1 s1
elsif c2 then else if c2 then
s2; s2
elsif c3 then else if c3 then
s3; begin
s4; s3;
s4
else end
s5; else
end if ; s5;
74 unidade 3
Usando o comando case Usando ifs aninhados
case exp of v:=exp;
if v=v1 then
v1 : c1; c1
v2 : c2; else if v=v2 then
c2
v3 : c3; else if v=v3 then
... c3
end; ...
Controle de Fluxo 75
uso do comando break necessrio para finalizar o switch nesta linguagem.
Suponha que exp tenha o valor v2, e que os quatro valores v1, v2, v3 e v4
sejam todos distintos. Neste caso, a execuo se realiza da seguinte forma:
76 unidade 3
Execuo iterativa de instrues
Controle de Fluxo 77
expresso exp uma condio de trmino: a repetio continua at que exp
se torne verdadeira. Tambm neste caso, a lista de comandos c sempre
executada pelo menos uma vez.
At certo ponto, possvel intercambiar os usos dos comandos repeat
e while, pela negao da expresso e. Assim, um comando repeat c until exp
equivalente sequncia de comandos
c;
while not exp do
c
e o comando while exp do c equivalente combinao
if exp then
repeat
c
until not exp
78 unidade 3
menos uma vez. Em Algol-60, podemos definir, atravs da clusula step s,
que o passo, isto , o incremento da varivel do for a cada interao deve ser
s. Em Pascal, existem apenas duas opes de passo: +1, indicado pelo uso
de to, como acima, e -1, indicada pelo uso da palavra downto, caso em que a
varivel de controle assume, sucessivamente, valores decrescentes.
O comando For visto acima, se distingue fundamentalmente dos
comandos while e repeat, pelo fato de que no For as expresses so pr-
calculadas, e o nmero de execues conhecido, a priori, enquanto, no caso
dos comandos while e Repeat, as expresses so reavaliadas a cada vez.
Linguagens como Ada e Clu consideram que a varivel v do For declarada
pelo cabealho, e , portanto, local ao comando. Nessas linguagens no h
nenhuma indeterminao quanto ao valor da varivel v aps a execuo do
comando: esse valor no existe. Outras linguagens costumam indicar que a
varivel do FOR tem um valor indefinido aps a execuo do comando, para
que possa ser escolhida, em cada caso, a melhor forma de implementao.
Em Algol-60, por exemplo, encontramos vrias outras formas
de comando For. Em particular, possvel especificar uma condio de
continuao, atravs de uma clusula while e3, em vez de especificar um
valor final para a varivel: a execuo do comando se encerra quando a
avaliao de e3 levar a um valor falso
for v:= e1 step e2 while e3 do c
As duas formas podem ser combinadas:
for v:= e1 step e2 while e3 until e4 do c
A linguagem C apresenta um comando For que separa claramente os
seus quatro componentes:
for ( e1; e2; e3 ) s
onde:
e1 especifica a forma de iniciao;
e2 especifica a condio de continuao (a execuo continua
enquanto a avaliao de e2 obtiver um valor interpretado como
true);
e3 prepara a execuo da prxima iterao, por exemplo
incrementando o valor de uma varivel de controle;
s o comando a ser repetidamente executado.
Controle de Fluxo 79
for ( i=1; i<=n; i++ ) s.
Considerado extremamente poderoso pelos programadores de C,
este comando bem caracterstico do estilo compacto de programao da
linguagem C, e, juntamente com outros comandos da linguagem, tem sido
criticado por levar a programas obscuros, dependendo de sua forma de
utilizao.
80 unidade 3
loop repeat
c1; c1;
if e then fim := e;
exit; if not fim then
c2;e c2;untilL fim;
end;
c1; ini:
while not e do c1;
begin if e then
c2; goto fim;
c1; c2;
end; goto ini;
fim:
Controle de Fluxo 81
a sua execuo no produz um resultado, na grande maioria das linguagens
de programao.
Definies iniciais
82 unidade 3
indicado por uma palavra especial da linguagem, do nome do
subprograma e do protocolo, se existir.
Controle de Fluxo 83
function calc_pagamento (renda : float;
isenes : integer := 1;
tarifa_imposto : float) : return float;
84 unidade 3
argumento, atravs de seu endereo. Em linguagens com outras formas
alternativas de passagem de parmetros, pode-se restringir a passagem
de expresses por referncia. Por exemplo, em Pascal, no podem ser
passadas por referncia expresses que no so variveis, e essa restrio
enfatizada pelo uso da palavra reservada var, que indica a passagem por
referncia apenas de variveis.
Casos em que no existe uma forma alternativa de passagem
de parmetros aceitam-se como argumentos passados por referncia,
expresses que no so variveis, e, em particular, valores constantes.
Como no faz sentido alterar o valor de tais argumentos, a maioria das
implementaes protege o argumento contra a alterao de valor, atravs
de sua duplicao: o parmetro recebe apenas o endereo de uma varivel
temporria, cujo valor inicial aquele obtido pela avaliao da expresso
(efetivamente uma cpia do valor, no caso de uma constante) e pode ser
alterado sem problemas. Em particular, a alterao inadvertida do valor de
uma constante traria efeitos imprevisveis para o restante da execuo do
programa.
Controle de Fluxo 85
Exemplo 3.6. Seja o seguinte programa em C.
void incr(int *x; int delta) -- x referncia a inteiro
{
*x += delta; -- contedo de x incrementado
}
int y=15;
int cinco=5;
... -- aqui, y = 15
incr( &y, cinco ); -- argumento o endereo de y
... -- aqui, y = 20
86 unidade 3
Passagem por nome
Controle de Fluxo 87
acesso a uma componente genrica de v[i]: por valor, seria passado o valor
de v[i], para o valor inicial de i; por referncia, seria passado o endereo
de v[i], tambm para o valor inicial de i. No caso da passagem por nome, o
que efetivamente passado a forma de clculo do endereo da i-sima
componente de v, v[i].
88 unidade 3
aps a chamada ser 2; se for usada a passagem de parmetros por valor/
resultado, o valor ser 1.
A passagem por referncia foi uma das primeiras metodologias de
passagem de parmetros a ser utilizada, e a forma oferecida por Fortran.
Em Algol-60, a passagem por nome default mas tambm oferecida a
passagem por valor, para acelerar a execuo dos programas em que uma
longa sequncia de chamadas (por exemplo, de um procedimento recursivo)
implicaria num nmero grande de chamadas de thunks, com prejuzo da
velocidade. Pascal, em virtude da preocupao com simplicidade que presidiu
ao seu projeto, oferece as duas maneiras mais simples de passagem de
parmetros: por valor (default) e por referncia (indicada por var). O caso
da linguagem Ada interessante: os parmetros podem ser declarados de
trs modos: in, out, in out, que aparentemente correspondem passagem
por valor, resultado, e valor-resultado. O manual da linguagem, entretanto,
abre a possibilidade de que o modo in out seja implementado por referncia,
e adverte o programador que um programa cujo funcionamento correto
dependa da forma de implementao um programa Ada errneo. Segundo o
mesmo manual, um programa errneo um programa incorreto, mas nenhum
compilador de Ada precisa indicar este fato. Por exemplo, um programa Ada
semelhante ao do Exemplo 3.9 seria errneo. O Exemplo 21 mostra como
simular passagem por nome atravs de outras formas.
Controle de Fluxo 89
que definir uma funo que calcule o valor de xi, e passe essa funo como
argumento para a funo soma.
Neste caso, para calcular o duplo somatrio, teramos que definir uma
funo Aij, que calcularia o valor da componente i,j de A.
soma(i,1,m,soma(j,1,n,Aij)
A funo Aij deve apenas atrasar o clculo de A[i,j], esperando que i
e j tenham atingido os valores apropriados:
function Aij:integer;
begin
Aij:=A[i,j]
end;
Subprogramas sobrecarregados
90 unidade 3
aumenta o poder de expressividade de uma linguagem, exatamente porque
implementa algoritmos distintos. Se eles so distintos, podem ter nomes
tambm distintos.
No entanto, muitos projetistas argumentam que alguma forma de
sobrecarga deve existir pelo menos para operaes que tenham alguma
coisa em comum, como a multiplicao de nmeros, e muitas linguagens
adotam esta tcnica.
Por exemplo, C++, Java e Ada incluem subprogramas sobrecarregados
pr-definidos e os programadores tambm tm permisso para escrever
mltiplas verses de subprogramas com o mesmo nome nessas linguagens.
Subprogramas genricos
Corrotinas
Controle de Fluxo 91
normalmente tm incio em pontos distintos do incio, sendo este, o motivo
pelo qual se chama de retomada da rotina, em vez de chamada.
Tipicamente, as corrotinas so criadas em uma aplicao por uma
unidade de programa chamada de unidade mestra, que no uma corrotina.
Um exemplo clssico que simula a execuo de corrotinas um jogo
de cartas em que participam quatro jogadores, utilizando a mesma estratgia
de jogo. O programa mestre inicia a simulao, retomando uma das corrotinas
jogadoras, que, depois de haver jogado sua vez, poderia retomar a seguinte
e assim por diante at o jogo terminar.
A Figura 3.1 a seguir, mostra graficamente uma possvel sequncia
de execuo de duas corrotinas A e B. Na figura pode-se observar os vrios
pontos de entrada e de sada que as corrotinas tm. A execuo de programas
em tempo compartilhado, onde, para cada processo destinado um time
slice, d-se atravs de corrotinas. Uma vez que, cada processo tem de ficar
suspenso por algum perodo e tem de retornar ao ponto em que foi suspenso
para continuar a sua execuo, quando for dado a ele um novo time slice.
Figura 3.1. Esquema de execuo de duas corrotinas.
92 unidade 3
Exerccio
Controle de Fluxo 93
SAIBA MAIS
Existem muitos bons textos sobre este tema. Alguns deles esto listados
em Referncias e colocados ao final desta Unidade. A nosso ver, um livro
importante o livro de David Watt, onde ele reala a ligao entre a Matemtica
e a Cincia da Computao em termos da teoria dos conjuntos e dos tipos de
dados. Outros esto na Internet disposio. Estes esto listados a seguir.
94 unidade 3
UNIDADE 4
Abstrao de Dados
Resumindo
O objetivo principal desta unidade apresentar os principais conceitos envolvidos nas abstraes
de dados e como eles so utilizados nas linguagens de programao. Inicialmente, ser vista uma
anlise dos tipos abstratos de dados e como eles podem ser utilizados para resolver o problema
da crise do software dos anos 80. Em um segundo momento, a anlise se estende s linguagens
de programao projetadas para incorporar as caractersticas dos tipos abstratos de dados,
conhecidas como linguagens orientadas a objetos. Os objetos sero vistos como tipos abstratos de
dados que incorporam mais uma caracterstica que herana. A unidade termina com uma anlise
das principais linguagens de programao orientadas a objetos. A forma de apresentao utilizada
de acordo com o exigido para o ensino a distncia, ou seja, tendo em vista sempre esta nova
modalidade de ensino
abstrao de dados
Introduo
O conceito de abstrao
Abstrao de Dados 97
em um contexto particular. Isto permite que se construam grupos destas
entidades, que guardem entre si, atributos comuns. Estes atributos comuns
podem ser abstrados, e, dentro de cada grupo, somente os atributos que
distinguem os elementos individuais precisam ser considerados. Isto permite
que os elementos do grupo sejam simplificados. A abstrao uma arma
contra a complexidade na programao, por simplificar e muito este processo.
Consideram-se dois tipos de abstrao nas linguagens atuais: a
abstrao de processos e a abstrao de dados.
A abstrao de processos
O conceito de encapsulamento
98 unidade 4
O primeiro deles se refere dificuldade que o programador ter
na administrao destes sistemas de forma coerente e confivel, sendo
necessria uma organizao em mdulos, que so grupos de subprogramas
e dados que estejam logicamente relacionados.
O segundo problema diz respeito recompilao, aps alguma
modificao em alguma parte do programa. Nos programas pequenos este
problema praticamente inexistente, mas, em um sistema grande, o custo de
recompilao se torna significativo. necessrio encontrar formas de evitar
que as unidades que no foram modificadas sejam tambm recompiladas.
Isto pode ser conseguido organizando-se os programas em colees de
subprogramas e de dados, em que cada uma destas colees possam ser
compiladas, sem a necessidade de que as outras tambm sejam. Esta
coleo conhecida como unidade de compilao.
O encapsulamento um agrupamento de subprogramas e dos dados
que eles manipulam. Ele constitui um sistema abstrado e uma organizao
lgica para uma coleo de computaes relacionadas. Ele resolve os dois
problemas elencados anteriormente.
Os encapsulamentos so, muitas vezes, incorporados a bibliotecas e
colocados disposio para serem reutilizados em programas que no foram
projetados para utilizar estas bibliotecas.
Em muitas linguagens de programao do tipo Algol, os programas
podem ser aninhados, como, por exemplo, Pascal. Tal mtodo de organizao
de programas utilizando regas de escopo esttico tem sido muito condenado,
exatamente pelo fato de que os subprogramas no podem ser recompilados
separadamente. Ou seja, os subprogramas aninhados no criam boas
construes de encapsulamentos.
Na linguagem C, uma coleo de funes e definies de dados
relacionadas pode ser colocada em um arquivo, que pode ser compilado
de forma independente. No entanto, as definies de dados em arquivos
diferentes no so verificadas. Isto significa que os arquivos em C no criam
encapsulamentos seguros.
Fortran 90 e Ada permitem que colees de subprogramas de tipos
e de dados sejam agrupadas em unidades que podem ser compiladas,
separadamente, de forma que as informaes de interface sejam salvas
pelo compilador e usadas na verificao de tipos, quando usadas por outra
unidade. Essas unidades fazem encapsulamentos perfeitos.
Abstrao de Dados 99
Tipos de dados abstratos definidos pelo usurio
100 unidade 4
Tabela 4 1. Principais operaes de uma pilha.
create(stack) Cria e possivelmente inicializa uma pilha
destroy(stack) Desaloca o armazenamento da pilha
empty(stack) Uma funo que verifica se a pilha est vazia ou
no
push(stack, element) Coloca um elemento na pilha
pop(stack) Remove o elemento do topo da pilha
top(stack) Retorna uma cpia do elemento do topo da pilha
102 unidade 4
else return Stk.List(Stk.Topsub);
end if;
end Top;
end Stack_pack;
104 unidade 4
...
}
106 unidade 4
Herana
Estados em objetos
108 unidade 4
Neste caso, estamos atualizando o valor do estado da propriedade do objeto
para amarela, com uma simples atribuio.
Mensagens em objetos
Classes abstratas
110 unidade 4
respeito de uma coleo de outras classes. Uma classe abstrata sozinha
completamente intil, j que no podemos instanciar um objeto desta classe,
podemos apenas instanciar objetos de classes que estendem a classe
abstrata inicial. Ela serve apenas para simplificar o sistema, juntando em um
nico lugar diversas caractersticas que so comuns a um grupo de classes.
No esquea disso: voc nunca vai poder criar um objeto do tipo de
uma classe abstrata. Sempre crie objetos das classes que estendem a classe
abstrata.
Casting em POO
112 unidade 4
Classe Gato {
Mtodo fale() {
imprimaNaTela( Miaaaaaauuuuuu! );
}
}
Para a classe Cachorro, poderamos fazer de forma semelhante:
Classe Cachorro {
Mtodo fale() {
imprimaNaTela( Au au au! );
} }
Agora, se fizermos um looping entre todos os objetos contidos em
nosso array criado anteriormente, enviando para cada objeto a mensagem
fale, cada um deles ir ter um comportamento diferente, dependendo se
um Cachorro ou um Gato. Nosso looping entre todos os animais cadastrados
no nosso sistema seria mais ou menos assim:
int cont;
para cont de 0 a 100 faa {
[cont].fale();
}
Isto polimorfismo! Uma mesma mensagem enviada para diferentes
objetos da mesma classe (Animal) e o resultado pode ser diferente, para
cada caso.
Exerccio
SAIBA MAIS
Existem muitos bons textos sobre este tema. Alguns deles esto
listados na Referncias colocada ao final desta Unidade. A nosso juzo, o
livro de R. Sebesta apresenta um diferencial nesta rea. Em particular ele
dedica dois captulos importantes a este tema.
Muito se tem publicado em nvel de notas de aula e apostilas publicadas
pela Wikipdia e outras formas de publicao, a maioria delas, disponveis
pela Internet.
Vale ressaltar que muitos manuais tratam do uso e no da Programao
Orientada a Objetos, apesar da linguagem a que ele se refere incorporar este
mecanismo.
114 unidade 4
AHO, A. V. R; ULLMAN, J. D. Compilers: principles, techniques, and tools.
Reading, MA: Addison-Wesley, 1986.