You are on page 1of 50

Paradigmas de Programação

Introdução

O surgimento do primeiro computado electrónico denominado ENIAC (Electronic Numerical


Integrator and Computer) no século XX, como uma máquina de auxilio à cálculos de precisão
necessários para a balística, foi um grande marco na história das ciências de computação. Aliado
a esta invenção encontramos as linguagens de programação, conjunto de regras sintácticas e
semânticas usadas para definir instruções ao computador. Desde o surgimento do primeiro
modelo de computador muitos foram os esforços empreendidos no melhoramento e
desenvolvimento deste modelo, tendo-se o mesmo processo se verificado com as linguagens de
programação.

O melhoramento do modelo do computador, não afectou os princípios básicos do seu


funcionamento (entrada, processamento e saída), tendo estes princípios mantidos de geração a
geração. Durante a evolução do modelo foram aperfeiçoados aspectos ligados ao tamanho,
tecnologia do fabrico, capacidade de processamento e de armazenamento, velocidade de
processamento, armazenamento e busca de informação, precisão no processo de cálculo, dentre
outro ligados a processamento eficiente dos dados.

Associadas as gerações do computador, as linguagens de programação foram evoluindo, com o


intuito de tornar o processo de instrução desta máquina mais simplificada e independente do tipo
de processador que o computador ostentasse. Assim como o computador manteve alguns
princípios do seu funcionamento inalteráveis durante a sua evolução, o mesmo se pode verificar
no processo da evolução das linguagens de programação, que mantiveram alguns aspectos
(estilos de programação) usados nos seus predecessores.

Na cadeira de Paradigmas de Programação, teremos oportunidade de abordar os diversos


paradigmas (estilos de programação) que as linguagens de programação cumpriram durante a sua
evolução. Cada estilo de programação possui uma visão intuitiva no processo de programação do
computador, isto é, o processo de resolução de problemas do quotidiano usando o computadores
será abordado sob ponto de vista da sua implementação usando uma linguagem de programação
que cumpre determinado paradigma (estilo) de programação.

Bernardino Eugénio Bila Pág. 1/50


Paradigmas de Programação

Prefácio

O presente manual, visa dar apoio e acompanhamento aos estudantes do curso de engenharia de
software da Universidade São Tomás de Moçambique no decurso da cadeira de Paradigmas de
programação. O Docente disponibiliza este material como forma de suprir a deficiência de obras
bibliográficas na cadeira de Paradigmas de Programação e guarda expectativas de que os
estudantes explorem-o como uma guia de consulta às aulas. Usuários do presente manual não
deverão basear-se unicamente neste material como forma de desenvolverem as suas faculdades
académicas durante o seu curso, sendo recomendável a consulta da bibliografia que o docente
apresenta no programa temático da cadeira.

Bernardino Eugénio Bila Pág. 2/50


Paradigmas de Programação

Epígrafe

“Ensinar é ajudar a outrem a construir habilidades


pessoais, organizacionais e profissionais”

Bernardino Eugénio Bila Pág. 3/50


Paradigmas de Programação

Objectivos

O cumprimento da disciplina busca dar ao aluno condições de compreender a organização das


linguagens de programação, com ênfase nos conceitos abstractos das mesmas e sua
representação durante o processo de execução. O aluno terá a oportunidade de conhecer as
características e peculiaridades básicas de algumas linguagens e dos paradigmas de programação
por elas utilizados.

Bernardino Eugénio Bila Pág. 4/50


Paradigmas de Programação

PLANO DE AULA
Curso: Licenciatura em Engenharia de Software
Disciplina: Paradigmas de Programação
Ano: 2007 II Semestre
Turma: 3PESW / 3LESW

I. TEMA: INTRODUÇÃO AS LINGUAGENS DE PROGRAMAÇÃO


1. CONTEÚDOS
i. Conceito de Linguagem de Programação
ii. Classificação das Linguagens de Programação
iii. Evolução das linguagens de programação
iv. Importância das linguagens de programação na Engenharia de Software

2. OBJECTIVOS ESPECÍFICOS
No fim deste tema, o aluno deve ser capaz de:
i. Definir o conceito de linguagem de programação
ii. Classificar os tipos de linguagem de programação
iii. Explicar o processo de evolução das linguagens de programação
iv. Descrever o papel das linguagens de programação no desenho de software

3. APRESENTAÇÃO DOS CONTEÚDOS

3.1. Definição do conceito Linguagem de programação


Para a definição deste conceito, o aluno deverá definir em suas palavras o conceito
Computador. A partir das definições dos alunos, pode-se depreender o seguinte:

Computador é uma máquina de cálculo.

Computador é uma máquina programável que recebe dados, processa-os e disponibiliza-os


em forma de informação.

Bernardino Eugénio Bila Pág. 5/50


Paradigmas de Programação

Computador é uma máquina composta de um conjunto de partes electrónicas e


electromecânicas capaz de receber, armazenar, tratar e produzir informações de forma
automática, com grande rapidez e precisão.

Computador é um dispositivo electrónico programável através de instruções, que usando o


hardware e software recebe dados, processa-os, armazena-os e disponibiliza-os.

Computador é um dispositivo electrónico capaz de processar informação por forma a


produzir um resultado desejado. O seu processamento baseia-se em três passos fundamentais:
1. Entrada de dados- input;
2. Processamento de dados de entrada através de regras pré-definidas (programas
específicos) - process;
3. Produzir dados de saída como resultado do processamento - output.

Como podemos denotar, o computar trata-se de uma máquina electrónica programável, que
usando instruções dum programa específico, aceita dados de entrada, processa-os,
armazena-os e produz um resultado de saída. Sendo está máquina programável, torna-se
necessário a existência dum mecanismo para a sua instrução, usando uma língua que esta possa
entender. A língua usada para a instrução do computador, denomina-se Linguagem de
Programação, portanto pode-se definir:

Linguagem de Programação, com sendo um método padronizado para expressar sequência de


instruções ordenadas duma forma lógicas a serem executadas pelo computador. É um conjunto
de regras sintácticas e semânticas usadas para definir um programa de computador.

3.2. Classificação das Linguagens de Programação


3.2.1. Quanto ao Tipo
 Linguagem de Máquina: os programas são escritos usando sequência de dígitos binários
(0s e 1s) para forma as instruções estendíveis pelo hardware da máquina, ordenando a
máquina as instruções fundamentais do seu funcionamento.

Esta linguagem é mais rápida que as linguagens do alto nível, porém o seu uso na
codificação de problemas da vida corrente é inadequado, devido:
Bernardino Eugénio Bila Pág. 6/50
Paradigmas de Programação

- A grande probabilidade de ocorrência de erro em todos o processo de


programação.
- Programas longos e de difícil legibilidade, por mais que os algoritmos usados
sejam simples, o que dificulta o processo de correcção de erros de programação;
- O processo de alocação de endereços de memória deve ser feito manualmente,
com um árduo trabalho e uma grande probabilidade de erros.
- Linguagem de difícil domínio, devendo conhecer o funcionamento do processador
e do restante hardware para usá-la.

 Linguagem de Baixo Nível: os programas são escritos usando um conjunto de


mneumónicas básicas, cujo sua tradução para o código de máquina (binário) é feito pelo
computador. O programa que faz a tradução das mneumónicas denomina-se Assembler.

Exemplo: ADD ival

A mneumónica ADD permite adicionar o conteúdo de localização ival para o


acumulador. O assembler então faz a tradução para a string equivalente de 0s e 1s. O
assembler também trata do problema de cálculo de endereço, usando nomes em formato
de texto para endereçar os dados. A consequência desta automação de tradução é que os
programas em linguagem Assembly são muito mais fáceis de escrever e depurar que
programas em linguagem de máquina.

 Linguagens de Alto Nível: próximas das linguagens utilizadas por humanos para
expressar problemas e algoritmos. Cada instrução duma linguagem do alto nível
corresponde a várias declarações numa linguagem do baixo nível

A sua principal vantagem principal é a abstracção, processo em que as propriedades


essenciais requeridas para a solução do problema são extraídas enquanto se escondem os
detalhes da implementação da solução adoptada pelo programador. Com a abstracção, o
programador concentrar-se mais na solução do problema ao invés de preocupar-se em
como o hardware vai tratar do problema.

Exemplo: Fortran, Pascal, C, C++, Java, C#

Bernardino Eugénio Bila Pág. 7/50


Paradigmas de Programação

Os programas em linguagem de alto nível são muito mais fáceis de serem desenvolvidos,
entendidos e depurados por diversas razões:

 Facilidade de auto-documentadas;
 A estrutura do programa pode ser desenvolvida para reflectir a estrutura do
problema real;
 Uso de nomes significtivos para variáveis e subrotinas;
 A solução do problema não necessita conhecer os detalhes do funcionamento do
hardware (detalhes do baixo nível).
 Programas escritas em linguagem de alto nível são de fácil legibilidade em cada
passo da execução.
 O ambiente de desenvolvimento nas linguagens de alto nível, normalmente provê
facilidades para a depuração, como visualização dos valores das variáveis, da
pilha. Além disso o compilador pode incluir instruções na geração de código para
detectar erros em tempo de execução, como overflow numéricos e violação de
limites de vectores e matrizes;
 A utilização de linguagens de baixo nível é indicada para funções que precisam
implementar instruções de máquina específicas que não são suportadas por
linguagens de alto nível, embora a grande maioria das linguagens de alto nível
apresentam uma biblioteca que permite implementar instruções de baixo nível
directamente em seus programas.

3.2.2. Quanto ao Paradigma


 Paradigma funcional
 Paradigma estruturado
o Paradigma Imperativo
o Paradigma Declarativo
 Paradigma Orientado a Objectos
 Paradigma Lógica
 Paradigma Distribuído
 Paradigma Concorrente

Bernardino Eugénio Bila Pág. 8/50


Paradigmas de Programação

3.3. Atributos de uma boa linguagem de Programação


 Claridade, simplicidade e unicidade;
 Legibilidade;
 Usabilidade dos programas;
 Portabilidade de programas;
 Suporte à abstracção;
 Fácil depuração de erros;
 Facilidade na manutenção dos programas - Manutenibilidade
 Suporte a uma biblioteca documentada de funções básicas;
 Facilidade de integração com outras linguagens do alto nível;
 Suporte a uma ambiente integrado de desenvolvimento (IDE).

3.4. Evolução das Linguagens de Programação


Existem centenas de linguagens de programação, desenvolvidas desde o início da
computação. Essas linguagens foram agrupadas de acordo com suas e características e
época em que foram desenvolvidas em 4 gerações:

3.4.1. Linguagens de primeira geração


A primeira geração de linguagens remonta aos dias da codificação em linguagem de
máquina, surgidas com o início da computação na década de 50, especificamente de 1950
a 1962. A Linguagem de máquina e Assembly representam esta primeira geração das
linguagens de programação.

Estas linguagens são caracterizadas por serem totalmente dependentes da máquina e


exibirem o mais baixo nível de abstração na sua implementação;

Estas linguagens actualmente são usadas somente quando as linguagens de alto nível não
satisfizerem as necessidades ou não forem suportadas.

3.4.2. Linguagens de Segunda Geração


A segunda geração de linguagens de programação foi desenvolvida de 1962 a 1974 e
serviu de base para o desenvolvimento das modernas linguagens de programação.

Bernardino Eugénio Bila Pág. 9/50


Paradigmas de Programação

As características marcantes das linguagens de segunda geração é o recurso a grande


quantidade de bibliotecas de software, permitiram a programação multi-usuário, sistemas
de execução em tempo real e desenvolvimento de sistemas de gestão de base de dados.

As linguagens Fortran, Cobol, Algol e algumas extensões como Basic, foram os


representantes dessa segunda geração.

A linguagem Fortran é ainda muito utilizada na área de engenharia e pela comunidade


científica. Cobol é uma linguagem que foi aceita e ainda continua em uso para aplicações
comerciais. Algol foi o precursor de muitas linguagens de terceira geração, por oferecer
ricamente estruturas de controle e tipos de dados.

3.4.3. Linguagens de Terceira Geração


As linguagens de terceira geração desenvolvidas de 1974 a 1986, também chamadas de
linguagens de programação modernas ou estruturadas, são caracterizadas pela grande
capacidade procedural e estrutural.

As linguagens de terceira geração tiveram como principais características a possibilidade


de criar sistemas distribuídos, incorporar recursos mais inteligentes, e exigir um hardware
menos robusto. Podem ser divididas em duas grandes categorias:
 linguagens de propósito geral e
 linguagens especializadas.

Linguagens de propósito gerais: foram desenvolvidas baseadas principalmente na


linguagem Algol e servem para uma infinidade de aplicações envolvendo a área
científica. As linguagens C, Pascal, PL/1 e Modula-2 são as principais linguagens desta
categoria, sendo que as duas primeiras continuam bastante usadas actualmente.

As linguagens especializadas: são caracterizadas pela forma sintáctica não usual porque
foram desenvolvidas para aplicação específica. Centenas de linguagens especializadas
estão em uso actualmente. Dentre elas podemos destacar a linguagem Lisp desenvolvida
especialmente para manipular símbolos e listas, Prolog desenvolvida para tratar e
representar conhecimentos, Smalltalk criada para representar os dados em forma de

Bernardino Eugénio Bila Pág. 10/50


Paradigmas de Programação

objectos, sendo a primeira a ser puramente orientada a objectos, APL desenvolvida para
manipular vectores, e a linguagem Forth desenvolvida para desenvolver softwares para
microprocessadores.

3.4.4. Linguagens de quarta geração


A quarta geração das linguagens de programação foram desenvolvidas a partir de 1986 e
teve como características principais a geração de sistemas especializados, capacidade de
abstracção, possibilidade de execução dos programas em paralelo e uso de ambientes
RAD (Desenvolvimento Rápido de Aplicativos) que permitem gerar o código por si só,
podendo ser usados por pessoal não expert para a criação de aplicações.

As linguagens de quarta geração podem ser classificadas em duas categorias:


 Linguagens de consulta,
 Geradoras de programas.

As linguagens de consulta foram desenvolvidas para manipular bases de dados,


permitindo o gerenciamento de um grande número de informações armazenados em
arquivos.
Exemplo: SQL; PL/SQL

As linguagens geradoras de programas representam uma sofisticada classe das


linguagens. Permitem ao programador criar facilmente programas complexos, utilizando
menos declarações e comandos. Estas linguagens possuem um nível bem mais alto que as
de terceira geração.
Exemplo: Visual Basic, Java, C++, C# (Plataforma ASP.Net)

3.4.5. Linguagens de quarta geração


Neste grupo encontramos as linguagens orientadas à inteligência artificial, cujas
instruções são escritas em linguagens naturais, permitindo uma fácil comunicação com a
máquina. Estas linguagens ainda estão pouco desenvolvidas.
Exemplo: LISP.

Relação de algumas linguagens de programação com o ano em que foram desenvolvidas:


Bernardino Eugénio Bila Pág. 11/50
Paradigmas de Programação

LINGUAGENS DE PROGRAMAÇÃO
ANO LINGUANGEM
1957 FORTRAN
1958 ALGOL
1960 LISP
1960 COBOL
1962 APL
1962 SIMULA
1964 BASIC
1964 PL/1
1966 ISWIM
1970 Prolog
1972 C
1975 Pascal
1975 Scheme
1977 OPS5
1978 CSP
1978 FP
1980 dBase II
1983 Smalltalk 80
1983 Ada
1983 Parlog
1984 Standard ML
1986 C++
1986 CLP(R)
1986 Eiffel
1988 CLOS
1988 Mathematica
1988 Oberon
1990 Haskell
1991 Visual Basic 1.0
1992 Visual Basic 2.0 Seis meses depois Visual Basic 3.0
1995 Visual Basic 4.0
1995 Delphi
1995 Java
1997 Visual Basic 5.0
1998 Visual Basic 6.0
2002 Plataformas Visual Studio.NET (Visual Basic.Net, C#.Net,...)
.... ....

3.5. Importância das linguagens de programação na engenharia de software

 Necessidade organizacional na automação de processos;

Bernardino Eugénio Bila Pág. 12/50


Paradigmas de Programação

 Exploração das capacidade oferecidas pela engenharia de microprocessadores;


 Respoder em real time ao ambiente concorrencial do negócio organizacional;
 Responder as exigências dos clientes de forma eficiente e eficaz.

Bernardino Eugénio Bila Pág. 13/50


Paradigmas de Programação

PLANO DE AULA
Curso: Licenciatura em Engenharia de Software
Disciplina: Paradigmas de Programação
Ano: 2007 II Semestre
Turma: 3PESW / 3LESW

II. TEMA: PROCESSADORES DE LINGUAGENS DE PROGRAMAÇÃO

1. CONTEÚDOS

i. Processadores de linguagens
ii. Processo de interpretação
iii. Processo de tradução-compilação

2. OBJECTIVOS ESPECÍFICOS
No fim deste tema, o aluno deve ser capaz de:
i. Definir o conceito processador de linguagem
ii. Explicar o processo de interpretação dum programa
iii. Explicar o processo de tradução dum programa

3. MEIOS DIDÁCTICO
 Texto de apoio
 Quadro branco
 Caneta de quadro de branco

4. MÉTODOS DE ENSINO
 interrogativo de modo a colectar dos estudantes os conhecimentos intuitivos que
possuem no processo de execução dum programa escrito em determinada
linguagem de alto nível;
 Expositivo, após a colecta das contribuições dos alunos, o docente fará uma
exposição dos processos de execução dos programas escritos em linguagens do
alto nível.

Bernardino Eugénio Bila Pág. 14/50


Paradigmas de Programação

5. DURAÇÃO DA AULA
A presente aula deverá ter uma duração de 80 min.

6. APRESENTAÇÃO DOS CONTEÚDOS

6.1. Conceito de Processador de linguagem (Compilador)

- Haverá alguma relação entre as linguagens do alto nível e do baixo nível?


- Que relação existe?
- Como é feita a ligação destes dois níveis de programação?

As linguagens de alto nível possuem uma certa independência da máquina, pois não são
desenvolvidas utilizando instruções específicas do processador (linguagem de máquina), mas
um conjunto de comandos que são transformados em linguagens de máquina, dado que os
computadores actualmente produzidos executam programas em uma linguagem de baixo
nível (linguagem de máquina).

As linguagens de programação são compiladas por:


 interpretação;
 tradução de programas em linguagem de máquina,
 combinação de interpretação e tradução.

Qualquer programa que a partir de código dum programa escrito numa linguagem de alto
nível gera um código equivalente em linguagem de máquina – executando-o ou preparando-
o para a execução – é denominado processador de linguagem ou compilador. Processadores
de linguagem incluem tradutores, interpretadores, e ferramentas auxiliares como editores
dirigidos à sintaxe.

6.2. Processo de interpretação (JIT- Just-In-Time Compiler)


No processo de interpretação, as instruções indicadas pelos comandos da linguagem são
interpretadas no momento de execução do programa. Em geral existe para executar cada
acção possível um subprograma (escrito na linguagem de máquina). Assim, a interpretação
de um programa é feita pela chamada daqueles subprogramas, em uma sequência apropriada.

Bernardino Eugénio Bila Pág. 15/50


Paradigmas de Programação

Mais precisamente, um interpretador é um programa que executa repetidamente a seguinte


seqüência:
 Obter o próximo comando do programa;
 Determinar que instruções devem ser executadas;
 Executar estas instruções.

Exemplo de algumas linguagens interpretadas: BASIC, Bash, C#, Perl, PHP, Python,
Euphoria, Forth, JavaScript, Logo, MUMPS, Ruby, linguagens de consulta (SQL, PL/SQL,
Trasanct-SQL)

Vantagem
 Rapidez no desenvolvimento

Desvantagem
 Maior tempo de execução
 Não permitem a distribuição do código como um executável
 Maior consumo de memória no processo de execução, isto porque o programa
interpretador deve ser mantido na memória até a fim da execução.

I
n
t
e
r
p
r
e
t
a
ç
ã
o

Bernardino Eugénio Bila Pág. 16/50


Paradigmas de Programação

Fig1 1: Esquema ilustrativo do processo de interpretação

Bernardino Eugénio Bila Pág. 17/50


Paradigmas de Programação

6.3. Processo de Tradução


No processo de compilação, os programas escritos em linguagem de alto nível são traduzidos
para versões equivalentes em linguagem de máquina, antes de serem executados. Esta
tradução é feita em vários passos, isto é, os subprogramas do programa inicial podem ser
inicialmente traduzidos para código Assembly, estes por sua vez traduzidos para código de
máquina, em linguagem de máquina; em seguida, unidades em código de máquina em uma
única unidade de código de máquina (um único código objecto); e, finalmente, o programa
inteiro é carregado na memória principal, como código executável de máquina.

Os tradutores usados em cada um destes passos têm nomes especiais:


 Compilador: tradução dos subprogramas para linguagem Assembly);
 Montador: tradução dos subprogramas em código de máquina);
 Ligador (linker): composição do único código objecto a partir dos subprogramas;
 Carregador: carregamento do código executável para a memória principal.

Vantagem
 Eficiência na execução do programa;
 Possibilidade de distribuição do código executável;
 Pouco consumo de memória durante a execução do programa.

Desvantagem
 Maior tempo no desenvolvimento;

Bernardino Eugénio Bila Pág. 18/50


Paradigmas de Programação

000001010110
Program P1; PUSH 2 000001010110
100010101010
Var a,b,s: Integer; LOADL 38 100010101010
101001101101
MOVE Ax, A 101001101101
101010010011
Function soma: Integer (a , b: ADD Ax, B 101010010011
101010010101
integer); STORE Ax,38 101010010101
C 000010100101
Begin LOAD 0[SB] 000010100101
M 000001010110
Soma:= a + b; o LOADL 1 000001010110
100010101010
End; m CALL Add o 101001101101
100010101010
p STORE 0[SB] n 101001101101
101010010011 L
Procedure Imprimir (soma: POP 2 101010010011
i t 101010010101
integer); HALT i 101010010101
a 000010100101
Begin l n 000010100101
Writeln (‘Soma: ‘, soma); a d 101010010011
End;
k 101010010101
ç o
e 000010100101
Begin ã r 000001010110 000001010110
r
a:= 2; o 100010101010 100010101010
LOADL 40
b:= 3; 101001101101 101001101101
s:= soma(a,b); LOAD 0[SB] 101010010011 101010010011
imprimir(s); ECHO 1 101010010101 101010010101
End. HALT 000010100101 101010010011
000001010110 101010010101
100010101010 000010100101
101001101101 000001010110
101010010011 100010101010
101010010101 101001101101
000010100101 10101001001
000010100101 10101001010
1
Fig.2 Esquema ilustrativo do processo de tradução

6.4. Combinação de interpretação e tradução


Na prática, como forma de reunir as vantagens dos processos de compilação muitas
linguagens são implementadas por uma combinação da interpretação e tradução. Um
programa pode ser traduzido para um código intermediário, que é por sua vez interpretado.
Este código intermediário pode ser simplesmente uma representação formatada do programa-
fonte, de onde foi removida informação irrelevante (como comentários e espaços) e onde os
componentes de cada comando estão armazenados em formato fixo, de maneira a simplificar
a descodificação de instruções que o compõem. Neste caso, a solução é basicamente
interpretativa.

Exemplo: Java, Pascal, C#, C++.


Bernardino Eugénio Bila Pág. 19/50
Paradigmas de Programação

PLANO DE AULA
Curso: Licenciatura em Engenharia de Software
Disciplina: Paradigmas de Programação
Ano: 2007 II Semestre
Turma: 3PESW / 3LESW

TEMA III: ANÁLISE SINTÁTICA NAS LINGUAGENS DE PROGRAMAÇÃO

1. CONTEÚDOS

i. Conceito de sintaxe da linguagem de programação


ii. Métodos formais de descrição da sintaxe nas linguagens de programação
iii. Avaliação léxica/sintáctica de expressões

2. OBJECTIVOS ESPECÍFICOS
No fim deste tema, o aluno deve ser capaz de:
i. Definir o conceito sintaxe de linguagem de programação
ii. Descrever o processo de análise sintáctica
iii. Aplicar os métodos métodos de avaliação léxica/sintáctica de expressões na
resolução de exercícios práticos

3. MEIOS DIDÁCTICOS
 Texto de apoio
 Quadro branco
 Caneta de quadro de branco

4. MÉTODOS DE ENSINO
 interrogativo de modo a colectar dos estudantes os conhecimentos intuitivos que
possuem sobre a análise sintáctica e semântica durante a execução dum programa
escrito em determinada linguagem de alto nível;
 Expositivo, após a colecta das contribuições dos alunos, o docente fará uma
exposição sobre a análise sintáctica e semântica das linguagens de programação.

Bernardino Eugénio Bila Pág. 20/50


Paradigmas de Programação

5. DURAÇÃO DA AULA
A presente aula deverá ter uma duração de 80 min.

6. APRESENTAÇÃO DOS CONTEÚDOS


- O que é sintaxe nas linguagens humanas?
- O que é sintaxe nas linguagens de programação?
- Porque estudamos a sintaxe das linguagens (humanas/programação)?

As linguagem de programação, igualmentes de qualquer linguagem humana (Português,


Francês, Espanhol, Inglês) para a sua correcta definição devem possuir os componentes
sintaxe e semântica. A sintaxe define as regras de como as frases e cada um dos seus termos
(palavras) devem ser construídos correctamente enquanto que a semântica definirá o
significado duma frase sintacticamente correcta.

6.1. Análise sintáctica nas linguagens de programação


A sintaxe nas linguagens de programação define quais são as construções válidas da
linguagem, independentemente do seu significado. Normalmente, a sintaxe é tratada em dois
níveis:
 Nível independente de contexto: considera apenas a estrutura das instruções da
linguagem. Este nível define os chamados pré-termos da linguagem.
Exemplos: if....then...else, switch...case...end, while...do, begin, end, {…}, etc.

 Nível contextual: adicionalmente, considera as restrições de contexto na utilização


dos pré-termos. Este nível define os termos (ou pré-termos bem formados) da
linguagem.

Exemplo de instruções sintacticamente correctas, tendo em conta a correcta colocação dos


pré-termos:

Linguagem de Programação Construções sintácticas


Pascal Function soma (x, y: integer): integer;
Begin
Soma: x + y;
End;

Bernardino Eugénio Bila Pág. 21/50


Paradigmas de Programação

Visual Basic function soma(byval x as integer, byval y as integer) as


integer
Soma = x + y
end function
C, C++, Java, C# int function soma (double x, y)
{
return x + y;
}
PHP function soma ($x, $y)
{
return $x+$y;
}

6.2. Métodos formais de descrição da sintaxe nas linguagens de programação

 Gramáticas Regulares: Uma gramática é regular se as suas regras possuem um


símbolo terminal (pré-termo) ou possuem no máximo um símbolo não terminal
posicionado no extremo direito ou esquerdo.

Exemplo de gramática regular:


Seja a gramática G = (V, T, S, P) onde:
– V é um conjunto finito de símbolos não-terminais (V = {A,B});
– T é um conjunto finito de símbolos terminais (T = {a,b});
– S ∈ V é um símbolo especial chamado de símbolo inicial (S = {ε});
– P é um conjunto finito de regras de produção
Definida pelas regras

ε Aa | Bb
A a | aB
B b

 Gramáticas Livre de Contexto: é uma gramática definida pelas regras do tipo:

A β Sendo β pertencente a união dos símbolos terminais e de não


terminais, incluindo o símbolo vazio, isto é, β Є (Vt U Vn)*

 Notação BNF (Backus-Naur Form1): formalismo para escrever as regras de


derivação das gramáticas livres de contexto.

Exemplo de derivação duma expressão usando a notação BNF

1
Em homenagem ao John Backus e Peter Naur que introduziram esta notação pela primeira vez na linguagem
ALGOL 60.

Bernardino Eugénio Bila Pág. 22/50


Paradigmas de Programação

Um programa é gerado através de derivações sucessivas a partir do símbolo inicial da


gramática. Cada string sucessiva na sequência é derivada da string anterior substituindo
um dos não-terminais por uma de suas definições.

Considerando a gramática definida a partir das regras abaixo, deriva o bloco

begin A:=B+C; B:=C end

Regras de derivação: Os símbolos a negrito, fora dos sinais <...> são terminais e
<program> é o símbolo inicial.

<programa> :: begin <lista_comandos> end

<lista_comandos> :: <comando> | <comando> ; <lista_comandos>

<comando> :: <var> := <expressão>

<var> :: A | B | C

<expressão> :: <var> + <var> | <var> - <var> | <var>

Sendo <programa> o símbolo inicial.

<programa> => begin <lista_comandos> end

=> begin <comando> ; <lista_comandos> end

=> begin <var>:=<expressão>; <lista_comandos> end

=> begin A:=<expressão>; <lista_comandos> end

=> begin A:=<var>+<var>; <lista_comandos> end

=> begin A:=B+<var>; <lista_comandos> end

=> begin A:=B+C; <lista_comandos> end

=> begin A:=B+C; <comando> end

=> begin A:=B+C; <var>:=<expressão> end

=> begin A:=B+C; B:=<expressão> end

=> begin A:=B+C; B:=<var> end

=> begin A:=B+C; B:=C end

Bernardino Eugénio Bila Pág. 23/50


Paradigmas de Programação

6.2. Avaliação sintáctica de expressões

A análise léxica de expressões duma linguagem de programação pode ser implementada usando
ter forma:

Infixa: As expressões são representadas colocando o operador entre dois operandos, esta forma
requer o uso de parênteses para a definição de prioridade de execução.

Exemplo: (a+b)*(c-d)

Préfixa: As expressões são representadas colocando o operador antes dos operandos. Esta forma
não requer o uso de parêntesis.

Exemplo: *+ab-cd

Posfixa: As expressões são representadas colocando o operador no fim dos operandos. Esta
forma não requer o uso de parêntesis.

Exemplo: ab+cd-*

As forma acima descritas podem ser processada facilmente numa linguagem de programação
usando uma pilha.

Tarefa: Usando a linguagem java implementa um processador léxico, recebendo a expressão na


forma infixa, passando-a para a prefixa/ posfixa e determinar o resultado da mesma, ilustrando
em cada iteração o estado da pilha.

6.4. Exercício de Aplicação


1. Explica por palavras próprias o conceito de sintaxe da linguagem de programação.

2. Usando a notação de BNF defina as gramáticas para a descrição formal das seguintes
declarações sintácticas na linguagem java. A gramática deverá indicar claramente os
conjuntos finitos de símbolos terminais, não terminais, inicial:
a) identificador
b) declaração de variável sem inicialização
c) declaração de variável com inicilização
d) atribuição
e) função
f) classe sem herança, com atributos, construtor e métodos.

Bernardino Eugénio Bila Pág. 24/50


Paradigmas de Programação

g) classe com herança, com atributos, construtor e métodos.

3. Usando as gramáticas definidas no exercício 2. derive as seguintes construções na linguagem


java:
a) Identificadores: varInteira, soma, sub_total, somaPar, soma_impar
b) Declaração de variável sem inicialização: int soma;
private double total;
protected string instituicao;
int soma, subTotal;
c) Declaração de variável sem inicialização: int j = 1, j= i+1;
public char ch = ‘x’;
string universidade = “USTM”;
d) Atribuição: a = 2 ;
soma = soma +1;
nota = (teste1 + teste2)*0.8 + nota_trab*0.2;
e) Funcões: int soma (int a, int b)
{
return a+b;
}

Private void print ()


{
System.println (“Universidade São Tomás de Moçambique”);
System.println (“Engenharia de Software”);
}
f) Classe: public classe Frequencia
{
private teste1;
private teste2;
public nota_trab;

public Frequencia (double t1, double t2, double nt)


{
Bernardino Eugénio Bila Pág. 25/50
Paradigmas de Programação

teste1 = t1;
teste2 = t2;
nota_trab = nt;
}

public double media ( double t1, double t2, double nt)


{
Double md = (t1 + t2)* 0.8 + nt*0.2;
return md;
}
}

4. Defina gramáticas para as seguintes instruções de controle da linguagem java:


a) If...then...else
b) Switch...case...default...end
c) For...do
d) While....do
e) Do....while

5. Passe as expressões abaixo dadas forma inifixa para a forma prefixa e posfixa:
a) (2+3) / (4-9) – 3
b) ( (2 * ( 6 -8 )-5) / (2 - 8) )*3
c) (3- 5) * (2-4)- (3*(3+8))

6. Ilustre o processo de cálculo das expressões do exercício 4, usando a pilha

Bernardino Eugénio Bila Pág. 26/50


Paradigmas de Programação

PLANO DE AULA
Curso: Licenciatura em Engenharia de Software
Disciplina: Paradigmas de Programação
Ano: 2007 II Semestre
Turma: 3PESW / 3LESW

TEMA IV: ANÁLISE SEMÂNTICA NAS LINGUAGENS DE PROGRAMAÇÃO

1. CONTEÚDOS

i. Conceito de semântica da linguagem de programação


ii. Processos básicos da análise semântica
iii. Métodos formais de descrição da semântica nas linguagens de programação

2. OBJECTIVOS ESPECÍFICOS
No fim deste tema, o aluno deve ser capaz de:
i. Definir o conceito semântica de linguagem de programação
ii. Descrever o processo de análise semântica
iii. Aplicar os métodos de avaliação semântica de expressões na resolução de
exercícios práticos

3. MEIOS DIDÁCTICOS
 Texto de apoio
 Quadro branco
 Caneta de quadro de branco

4. MÉTODOS DE ENSINO
 interrogativo de modo a colectar dos estudantes os conhecimentos intuitivos que
possuem sobre a análise sintáctica e semântica durante a execução dum programa
escrito em determinada linguagem de alto nível;
 Expositivo, após a colecta das contribuições dos alunos, o docente fará uma
exposição sobre a análise sintáctica e semântica das linguagens de programação.

Bernardino Eugénio Bila Pág. 27/50


Paradigmas de Programação

5. DURAÇÃO DA AULA
A presente aula deverá ter uma duração de 80 min.

6. APRESENTAÇÃO DOS CONTEÚDOS


- O que é semântica nas linguagens humanas?
- O que é semântica nas linguagens de programação?
- Porque estudamos a semântica das linguagens (humanas/programação)?

6.1. Análise semântica


A semântica de uma linguagem pode ser definida como sendo um conjunto de regras que
permite dizer se uma frase sintacticamente correcta tem ou não sentido.

6.2. Processos básicos da análise semântica


O objectivo da análise semântica é trabalhar nesse nível de inter-relacionamento entre partes
distintas do programa. As tarefas básicas desempenhadas durante a análise semântica são:
 Verificação de tipos;
 Verificação do fluxo de controle e
 Verificação da unicidade da declaração de variáveis.

6.2.1. Verificação de tipos


Detecta situações de uso de tipos incorrectos para determinados operadores.

Considere o seguinte exemplo de código em C, C++, Java, C#:


int resto (int a, float b)
{
return a%b;
}

Ao compilar o código acima, o analisador semântico, detectará um erro relacionado com a


verificação de tipos, indicando que o operador módulo (%) não pode ter um operador real.
Isto porque o compilador converte automaticamente os tipos dos parâmetros “a” e “b” à um
tipo adequado para o operador módulo (%).

Bernardino Eugénio Bila Pág. 28/50


Paradigmas de Programação

6.2.3. Verificação do fluxo de controle


Detecta situaçõe de uso de comandos em locais impróprios.

Considere o seguinte exemplo de código em C, C++, Java, C#:


void interromper (int j, int k)
{
if (j == k)
break;
else
continue;
}

Nesse caso, o compilador gera erros relacionados com a verificação de controlo porque nota
que o comando break só pode ser usado dentro do comando switch, while..do, for e
do...while. E o comando continue só é usado nos comandos cíclicos (while..do, for e
do...while).

6.2.3. Verificação da unicidade de declaração de variáveis


Detecta situações de duplicação nas declarações de variáveis, de componentes de estruturas e
em rótulos do programa.

Considere o seguinte exemplo de código em C, C++, Java, C#:


void maior ()
{
int a, b;
float a;
float x;
if ( a > b)
{
float x = a;
}
else
{
x = b;
}
}

Bernardino Eugénio Bila Pág. 29/50


Paradigmas de Programação

Ao tentarmos compilar o código, o controlador semântico gerará mensagens de erro relacionadas


com a existência de duas variáveis com o mesmo nome “a” e duplicidade da declaração da
variável “x”.

6.3. Métodos formais de avaliação semântica


Os processos da análise semântica são mais complexos que os de análise sintáctica, não existindo
portanto um formalismo padrão para descrever a semântica. Para a sua descrição podem ser
usados os métodos:
 Semântica Operacional
 Semântica Axiomática
 Semântica Denotacional

Bernardino Eugénio Bila Pág. 30/50


Paradigmas de Programação

PLANO DE AULA
Curso: Licenciatura em Engenharia de Software
Disciplina: Paradigmas de Programação
Ano: 2007 II Semestre
Turma: 3PESW / 3LESW

TEMA V: TIPOS DE DADOS USUAIS NAS LINGUAGENS DE PROGRAMAÇÃO

1. CONTEÚDOS

i. Tipos de dados primitivos


ii. Tipos de dados complexos
iii. Tipos de dados abstractos
iv. Tipos de dados definidos pelo programador
v. Exercício de aplicação

2. OBJECTIVOS ESPECÍFICOS
No fim deste tema, o aluno deve ser capaz de:
i. Enumerar os tipos de dados usuais nas linguagens de programação
ii. Explicar o conceito de tipos de dados abstractos
iii. Explicar a importância dos tipos de dados nas linguagens de programação

3. MEIOS DIDÁCTICOS
 Texto de apoio
 Quadro branco
 Caneta de quadro de branco

4. MÉTODOS DE ENSINO
 interrogativo de modo a colectar dos estudantes os conhecimentos intuitivos que
possuem sobre os tipos de dados usuais nas linguagens de programação;
 Expositivo, após a colecta das contribuições dos alunos, o docente fará uma
exposição teórica sobre os tipos de dados usuais nas linguagens de programação.

Bernardino Eugénio Bila Pág. 31/50


Paradigmas de Programação

5. DURAÇÃO DA AULA
A presente aula deverá ter uma duração de 80 min.

6. APRESENTAÇÃO DOS CONTEÚDOS


- Quais os tipos de dados frequentes nas linguagens de programação?
- Como podemos agrupar tais tipos de dados?
- Qual é importância tem a especificação dos tipos de dados na programação?

O computador possui uma área de armazenamento conhecida como memória. Todas as


informações existentes no computador estão ou na memória primária (memória RAM), ou na
memória secundária (discos, fitas, etc.). Um programa em execução, escrito em qualquer
linguagem de programação, interage com a memória do computador para ler e/ou armazenar
informações. O espaço de memória é uma quantidade finita, devendo o seu uso ser racional
por forma a garantir um óptimo desempenho do computador ao executar determinada
aplicação desenvolvida em determinada linguagem de programação.

As linguagens de programação de alto nível oferecem uma certa abstracção na alocação da


memória para o nosso programa armazenar suas informações, isto é, a linguagem reserva, em
lugar do programador, um espaço de memória para as variáveis que este usa no seu
programa. As linguagens dispõem de tipos de dados que permitem-as que reservem na
memória do computador um espaço suficiente para o armazenamentos de dados manipulados
através das variáveis. Os tipos de dados numa linguagem especificam a quantidade de
memória a ser reservada no computador e o domínio da informação que esse espaço de
memória deve armazenar.

6.1. Tipos de dados primitivos


São tipos de dados básicos que uma linguagem de programação de alto nível dispõe para o
armazenamento de um espaço na memória do computador para manipular informações
simples. Podemos classificar os seguintes tipos de dados como sendo primitivos:
 Numéricos
o Inteiros
o Reais
Bernardino Eugénio Bila Pág. 32/50
Paradigmas de Programação

 Alfanuméricos
o Caracter
o Cadeia de caracteres
 Lógicos

6.1.1. Tipos de dados Numéricos Inteiros


Permite reservar um espaço na memória do computador para armazenar números inteiros. A
tabela ilustrada na Fig.3, mostra o tamanho, a precisão e os subtipos que o tipo inteiro possui em
algumas linguagens de programação de alto nível:

Linguagem Tipo inteiro Tamanho Precisão


Shortint 1 byte -128 a 128
Byte 1 byte 0 a 255
Pascal Word 2 bytes 0 a 65.535
Integer 2 bytes -32.768 a 32.767
Longint 4 bytes - 2.147.483.648 a 2.147.483.648
unsigned short int 2 bytes 0 a 65.535
short int 2 bytes -32.768 a 32.767
int (16 bits) 2 bytes -32.768 a 32.767
Int (32 bits) 4 bytes -2.147.483.648 a 2.147.483.647
C++
unsigned int (16 bits) 2 bytes 0 a 65.535
unsigned int (32 bits) 4 bytes 0 a 4.294.967.295
long int 4 bytes -2.147.483.648 a 2.147.483.647
Unsigned long int 4 bytes 0 a 4.294.967.295
Byte 1 byte 0 a 255
VB 6.0 Integer 2 bytes –32.768 a 32.767
Long 4 bytes -2.147.483.648 a 2.147.483.647
Byte 1 byte 0 a 255
Sbyte 1 byte -128 a 127
short ou Int16 2 bytes -32.768 a 32.767
ushort ou UInt16 2 bytes 0 a 65.535
C# int ou int32 4 bytes -2.147.483.648 a 2.147.483.647
uint ou UInt32 4 bytes 0 a 4.294.967.295
-9.223.372.036.854.775.808 a
long ou Int64 8 bytes
9.223.372.036.854.775.807
ulong ou UInt64 8 bytes 0 a 0xffffffffffffffff
byte 1 byte -128 a 127
short 2 bytes -32,768 a 32,767
Java
int 4 bytes -2.147.483.648 a 2.147.483.647
-9.223.372.036.854.775.808 a
long 8 bytes
9.223.372.036.854.775.807
Fig. 3: Tipos de dados numéricos inteiros de algumas linguagens de alto nível
Bernardino Eugénio Bila Pág. 33/50
Paradigmas de Programação

6.1.2. Tipos de dados Numéricos Reais


Permite reservar um espaço na memória do computador para armazenar números com ponto
flutuante. A tabela ilustrada na Fig.4, mostra o tamanho, a precisão e os subtipos que o tipo real
possui em algumas linguagens de programação de alto nível:
Linguagem Tipo real Tamanho Precisão
Real 6 byte 2.9 x 10 a 1.7 x 1038
-39

Pascal Float 4 bytes 1,2 x 10-38 a 3,4 x 1038


Double 8 bytes 2,2 x 10-308 a 1,8 x 10308
unsigned short int 2 bytes 0 a 65.535
short int 2 bytes -32.768 a 32.767
int (16 bits) 2 bytes -32.768 a 32.767
Int (32 bits) 4 bytes -2.147.483.648 a 2.147.483.647
C++
unsigned int (16 bits) 2 bytes 0 a 65.535
unsigned int (32 bits) 4 bytes 0 a 4.294.967.295
long int 4 bytes -2.147.483.648 a 2.147.483.647
Unsigned long int 4 bytes 0 a 4.294.967.295
Single 4 byte -3.402823 x 1038 a 1.402823 x 1038
-1.7976931348 x 10308 a
Double 8 bytes
VB 6.0 1.7976931348 x 10308
-922.337.203.685.477,5808 a
Currency 8 bytes
922.337.203.685.477,5808
+/-1.5 x 10-45 a +/-3.4 x 1038
float ou Single 4 byte
com 7 casas significativas
+/-5.0 x10-324 a +/-1.8 x 10308
C# double ou Double 8 byte
com 15-16 casas significativas
Acima de 28 digitos. O seu uso requer
decimal ou Decimal 12 bytes
o sufixo “m” ou “M”
-/+1,40129846432481707 x 10-45 a -
Float 4 bytes
Java /+3,40282346638528860 x 10+38
4.94065645841246544 x 10-324d a
double 8 bytes
1.79769313486231570 x 10+308d
Fig. 4: Tipos de dados numéricos reais de algumas linguagens de alto ní

6.1.3. Tipos de dados alfanuméricos- caracter


Permitem reservar espaço no computador para armazenar um caracter. A fig.5 ilustra os tipos de
dados caracteres de algumas linguagens de alto nível.

Linguagem Tipo caracter Tamanho Precisão

Bernardino Eugénio Bila Pág. 34/50


Paradigmas de Programação

Pascal char 1 byte 256 caracteres


C++ char 1 bytes 256 caracteres
VB 6.0 char 1 byte 256 caracteres
C# char 2 bytes 256 caracteres
Java char 2 byte 0 a 65.535 caracteres
Fig. 5: Tipos de dados alfanumérico-caracter de algumas linguagens de alto nível

6.1.3. Tipos de dados alfanuméricos- cadeia de caracteres


Permitem reservar espaço no computador para armazenar uma cadeia de caracteres. A fig.6
ilustra os tipos de dados cadeia de caracteres de algumas linguagens de alto nível.

Linguagem Tipo cadeia de Tamanho Precisão


caracteres
Pascal string 1 byte por caracter 0 a 256 caracteres
C++ String 1 byte por caracter 0 a 2.048 caracteres
VB 6.0 string 1 byte por caracter 0 a 65.000 caracteres
2
C# string / StringBuilder 1 byte por caracter 0 a 2.147.483.647
Java String3 1 byte por caracter 0 a 2.147.483.647
Fig. 6: Tipos de dados alfanumérico- cadeia de caracteres de algumas linguagens de alto nível

6.1.4. Tipos de dados lógicos


Permitem reservar espaço no computador para armazenar valores l’ogicos. A fig.7 ilustra os
tipos de dados lógicos de algumas linguagens de alto nível.

Linguagem Tipo lógico Tamanho Precisão


Pascal Boolean 1 byte True ou False
C++ Bool 1 byte true (1) ou false (0)
VB 6.0 Boolean 2 byte TRUE ou FALSE
C# Bool 1 byte true (1) ou false (0)
Java Bool 1 byte true (1) ou false (0)
Fig. 7: Tipos de dados lógicos de algumas linguagens de alto nível

6.2. Tipos de dados complexos


São estruturas de dados que associam os tipos de dados primitivos em outras estruturas mais
complexas. Estes tipos podem ser:
 Sequências do mesmo tipo
 Estruturas de tipos composto

2
Opera com cadeias de caracteres mas não se trata dum tipo primitivo. É um tipo complexo porque é uma sequência
de caracteres e o seu máximo é 163.866.385.
3
Opera com cadeias de caracteres mas não é um tipo primitivo. É um tipo complexo porque é uma sequência de
caracteres.

Bernardino Eugénio Bila Pág. 35/50


Paradigmas de Programação

6.2.1. Tipos de dados complexos - Sequências do mesmo tipo


São estruturas complexas que agrupam na memória do computados espaços que permitem
armazenar dados do mesmo tipo, podendo ser de qualquer tipo primitivo.
Exemplo: Array, Vectores, Matrizes.

6.2.2. Tipos de dados complexos - Estruturas de tipos compostos


São estruturas complexas que agrupam na memória do computados espaços que permitem
armazenar dados de diferentes tipos, podendo ser de qualquer tipo primitivo e/ou outras
estruturas. Em algumas linguagens os tipos de dados complexos para além de agruparem
diferentes tipos de dados, agrupam também conjunto de funções para a manipulação dos seus
dados membros, normalmente designados por atributos.
Exemplo: records, object, structs, classes.

6.3. Tipos abstractos de dados


São tipos de dados que agrupam diferentes tipos de dados, normalmente, privados e métodos
privados e públicos não implementados. Os métodos públicos permitem a sua manipulação dos
dados membros da estrutura a partir do exterior do objecto do tipo da classe que implementa o
tipo abstracto de dados.

O conceito de abstracção deve-se ao facto de a estrutura possuir um conjunto de dados e funções


membros que permitem manipular o seu conteúdo do exterior sem se preocupar os detalhes da
implementação, sendo os tais detalhes escondidos do programador sendo-lhe disponíveis apenas
as funcionalidades da estrutura a partir dos seus métodos públicos.

Os tipos abstractos de dados constituem estruturas de dados complexos (classes) que possuem
uma visão geral da estrutura, devendo o programador implementar os métodos com as
funcionalidades previstas em determinada classe.

Desenvolver e implementas os tipos abstractos de dados mostra-se vantajoso nos seguintes


aspectos:
 Salvaguarda da integridade dos dados
Bernardino Eugénio Bila Pág. 36/50
Paradigmas de Programação

 Facilidade de manutenção da estrutura


 Reutilização da estrutura

Exemplo: Tipos abstractos para a implementação de Pilhas, Filas, etc.

6.4. Tipos de dados definidos pelo programador


Constituem tipos de dados compostos pelos tipos primitivos que o programador pode definir em
uma linguagem do alto nível, usado nomes da sua autoria conforme lhe convier o modelo da
solução por ele desenvolvida. Estes tipos permitem ao programador usas nomes sugestivos para
os modelos dos problemas reais.
Exemplo: Dias_de_Semana = (segunda, terça, quarta, quinta, sexta, sábado, domingo) assim
definido pode ser usado da declaração duma variável do tipo dia de semana.

Obs.: Existem também tipos de dados do tipo conjunto (set).

6.4. Exercícios de Aplicação


Para a consolidação da matéria exposta sobres os tipos de dados, o estudante deverá responder as
perguntas e resolver os exercícios a seguir, devendo usar respostas da sua autoria.

1. Qual é a necessidade da especificação dos tipos de dados numa linguagem do alto nível?

2. Cite os tipos de dados primitivos usuais nas linguagens de programação. Para cada tipo tente
identificar exemplos de dados e informações para os quais eles seriam mais adequados, deverá
prestar atenção na natureza e no intervalo de variação das referidas informações para que possa
escolher o tipo mais adequado.

3. Qual seria o tipo de dados mais adequado para armazenar a seguinte informação:
a) Número de telefone
b) Número do Bilhete de Identidade actual
c) Código de barras dum produto
d) Lista de estudantes duma turma
e) Notas de frequência duma turma

Bernardino Eugénio Bila Pág. 37/50


Paradigmas de Programação

f) Pauta duma turma


g) Arquivo duma biblioteca
h) Temperatura dum corpo

4. Defina os conceitos abstracção e tipos abstractos de dados. Dê exemplos que não constem no
texto, construídos a partir do que você entendeu sobres os tipos abstractos.

5. O gerente do supermercado Boa Sorte pretende contratar uma empresa de desenho de software
para o provimento duma aplicação para a gestão do seu stock. Mas antes de solicitar os serviços
duma empresa convida o estudante da USTM para lhe auxiliar a modelar um tipo abstracto de dado
que lhe permita dentre outras funções adicionar os produtos, vendê-los, abatê-los (remover) do stock
caso estejam fora do prazo, controlar a ruptura em stock dos produtos, a quantidade mínima para a
reposição dos produtos assim como a avaliação dos seus ganhos após a venda dos produtos em stock.
Desenhe a estrutura do tipo abstracto para o fim desejado pelo gerente do supermercado, deverá
explicar com deverá funcionar cada operação constante no seu tipo abstracto de dado.

6. Considere a definições a seguir, classifique em verdadeiro (V) ou falso (F) as expressões


apresentadas em cada alínea. Caso classifique falso devera justificar tal opção.
Caracter C, B;
Inteiro I, J;
Real R, K;
Cadeia X, V;
Lógico L, T;

a) C = 2 h) k = 2000e2 + 32 o) R= sin(PI/3) “plus” 23


b) C = “2” i) x = ‘A’+’m’+ ‘e’+ ‘m’ p) X = “Trimestre1”
c) B = ‘2’ j) L = 0 q) V = I + k / 4
d) C = B + ‘d’ k) T = 1 r) T = false or true
e) I = 24/2 l) L = 3 < 2 t) B = @
f) J = J + I -23; m) T = L and (I = = K) v) C = ‘!’
g) R = 2*I/3 n) j = k u) L = “Palavra com espaço”

Bernardino Eugénio Bila Pág. 38/50


Paradigmas de Programação

PLANO DE AULA
Curso: Licenciatura em Engenharia de Software
Disciplina: Paradigmas de Programação
Ano: 2007 II Semestre
Turma: 3PESW / 3LESW

TEMA VI: ESTRUTURAS DE CONTROLE NAS LINGUAGENS DE PROGRAMAÇÃO

1. CONTEÚDOS

i. Estruturas de decisão
ii. Estruturas de selecção
iii. Estruturas cíclicas/ repetitivas
iv. Exercício de aplicação

2. OBJECTIVOS ESPECÍFICOS
No fim deste tema, o aluno deve ser capaz de:
i. Explicar o funcionamento das estruturas de controle
ii. Aplicar uma estrutura de controle no lugar doutra
iii. Explicar das estruturas de controle nas linguagens de programação

3. MEIOS DIDÁCTICOS
 Texto de apoio
 Quadro branco
 Caneta de quadro de branco

4. MÉTODOS DE ENSINO
 interrogativo de modo a colectar dos estudantes os conhecimentos intuitivos que
possuem sobre as estruturas de controle usuais nas linguagens de programação;
 Expositivo, após a colecta das contribuições dos alunos, o docente fará uma
exposição teórica sobre as estruturas de controle usuais nas linguagens de
programação.

Bernardino Eugénio Bila Pág. 39/50


Paradigmas de Programação

5. DURAÇÃO DA AULA
A presente aula deverá ter uma duração de 80 min.

6. APRESEBTAÇÃO DOS CONTEÚDOS / MOTIVAÇÃO


Durante o processo de implementação de soluções de problemas da vida corrente deparamos
com situações em que devemos tomar um rumo em detrimento doutro, assim como dentre
várias opções a nossa disposição devemos optar por uma para prosseguirmos. Para além
destas decisões verificam-se tarefas que devem ser realizadas repetidamente até que uma
certa quantidade de vezes seja satisfeita ou uma dada condição seja verificada.
As situações acima descritas são frequentes em rotinas da vida humana. Tomando em conta
que estas rotinas devem ser implementadas num computador usando uma linguagem de
programação é necessário que as linguagem possuam estruturas adequadas para tais fins. A
essas estruturas denominamos de estruturas de controle.

- Que estruturas de controle são frequentes nas linguagens de programação?


- Como elas podem ser classificadas?
- Qual é importância delas na programação?

As estruturas de controle permite o compilador controlar o fluxo de execução das instruções


dum programa escrito em determina linguagem.

Estruturas de decisão
Permitem ao compilador seleccionar para execução um bloco de instruções, mediante o valor
duma condição avaliada. A forma completa da estrutura de decisão nas linguagens de
programação tem a forma:
SE (condição) ENTÃO instruções SENÃO instruções
A condição deverá ser uma expressão lógica ou uma que resulte nos valores 1 ou 0.
As instruções podem ser simples ou um grupo.

Esta estrutura executa o conjunto de instruções depois do ENTÃO caso o valor da condição
seja verdadeiro, caso contrário executa o conjunto de instruções depois do SENÃO.

Bernardino Eugénio Bila Pág. 40/50


Paradigmas de Programação

Estruturas de selecção
Permitem ao compilador seleccionar perante uma lista de opções uma para executar o
conjunto de instruções que possui. Esta selecção é efectuada com auxílio dum seleccionador
que a estrutura possui. A sua forma frequente é:
SELECCIONE (selector)
Opção1: Instruções
Opção2: Instruções
..............................
OpçãoN: Instruções
SENÃO: Instruções
FIM_SELECCIONE

A variável selectror deve ser dum tipo ordinal, isto é, um tipo que tendo elemento dele se
possa saber o anterior e o próximo elemento.
As opções podem ser unidades singulares, uma lista ou um intervalo de valores do tipo do
selector.

Conforme o valor que a variável selector tiver serão executadas as instruções dumas das
opções se ele for igual a um dos valores das opções. Caso contrário as instrução do SENÃO
serão executadas.

Estruturas cíclicas
Permitem ao compilador executar repetidamente uma instrução ou um conjunto de
instruções. As estruturas cíclicas podem ser de dois tipos:
 Iterativas: quando a número de vezes a repetir é conhecido logo a prior e o
processo decremento/incremento do índice controlador é automático.
 Condicionais: quando o número de vezes a repetir não conhecido a pior, estando
dependente duma condição.
As estruturas cíclicas iterativas mais frequentes são: for, foreach, Loop
As estruturas cíclicas condicionais mais frequentes são:
While (condição) instruções End
Do instuções While (condição)
Bernardino Eugénio Bila Pág. 41/50
Paradigmas de Programação

Repeat instruções Until (condição)


Obs.: Existe também a estruturas de controle de salto como GOTO cujo o seu uso não é
recomendável devido a complexidade da legibilidade do código quando empregue em excesso.

6.4. Exercícios de aplicação


1. Explica em palavras próprias a pertinência do uso de estruturas de controle nas linguagens de
programação.

2. Que diferencia existe entre as estruturas de controle de decisão e de selecção?


a) Pode-se usar uma estrutura de decisão no lugar duma de selecção? Caso afirmativo dê um
exemplo. Existe alguma desvantagem nessa inversão? Qual?
b) Pode-se usar uma estrutura de selecção no lugar duma de decisão? Caso afirmativo dê um
exemplo. Existe alguma desvantagem nessa inversão? Qual?

3. Perante os casos a seguir diga quais usarias estruturas de controle iterativa ou condicionais.
a) Leitura das notas duma turma
b) Cadastro de funcionário do Aparelho de Estado
c) Leitura de formulários do Censo Populacional realizado em Agosto de 2007
d) Soma de números naturais fornecidos pelo utilizador
e) Soma de números pares inferiores a 10000
f) Sistema de cobrança de bilhetes de acesso a uma sala de cinema.

4. Mostre as alterações necessárias para inverter um ciclo while...do num do...while e vice-versa.

5. Explica a diferencia entre os cíclos while...do e do...while

Bernardino Eugénio Bila Pág. 42/50


Paradigmas de Programação

PLANO DE AULA
Curso: Licenciatura em Engenharia de Software
Disciplina: Paradigmas de Programação
Ano: 2007 II Semestre
Turma: 3PESW / 3LESW

TEMA VIII: INTRODUÇÃO AOS PARADIMAS DE PROGRAMAÇÃO

1. CONTEÚDOS

i. Conceito de paradigma de programação


ii. Breve historial dos paradigmas de programação
iii. Relevância do estudo dos paradigmas de programação

2. OBJECTIVOS ESPECÍFICOS
No fim deste tema, o aluno deve ser capaz de:
i. Definir o conceito de paradigma de programação
ii. Explicar o historial dos paradigmas de programação
iii. Explicar a pertinência dos estudo dos paradigmas de programação

3. MEIOS DIDÁCTICOS
 Texto de apoio
 Quadro branco
 Caneta de quadro de branco

4. MÉTODOS DE ENSINO
 interrogativo de modo a colectar dos estudantes os conhecimentos intuitivos que
possuem sobre os paradigmas programação;
 Expositivo, após a colecta das contribuições dos alunos, o docente fará uma
exposição teórica sobre os paradigmas de programação.

5. DURAÇÃO DA AULA

Bernardino Eugénio Bila Pág. 43/50


Paradigmas de Programação

A presente aula deverá ter uma duração de 80 min.

6. APRESETAÇÃO DOS CONTEÚDOS / MOTIVAÇÃO


Nas aulas anteriores fez-se uma abordagem a volta das linguagens de programação no
processo de desenho de soluções informáticas à problemas da vida corrente. Devido a sua
maior diversidade descrevemos os seus aspectos essenciais4, por forma a criar uma base
sólida sobre aspectos a aprender para trabalhar com uma determinada linguagens de
programação que nunca trabalhara com ela antes. Descrevemos também critérios de escolha
duma linguagem de programação ideal.

A partir da presente aula aprenderemos a seleccionar a linguagem de programação a usar


para a implementação de determinada solução dum problema em conformidade com as
exigências do modelo do problema real, isto é, consoante o paradigma adoptado pela solução
do problema seleccionaremos a linguagem mais adequado ao modelo pertencente ao referido
paradigma.

- Na vossa percepção o que será um paradigma?


- Que importância tem o conhecimento dos paradigmas?

6.1. Paradigma de Programação


Segundo o Dicionário da lingua Portuguesa, um paradigma pode ser assumido como um
exemplo que serve de referência ou modelo.

Paradigma de programação trata-se dum estilo, padrão ou modelo de programação suportado


por linguagens que agrupam certas características comuns. O paradigma afecta como os
programadores podem desenhar, organizar e escreve programas em uma linguagem de
programação.

6.2. Historial dos Paradigmas de Programação


As linguagens de programção possuem certas similaridades na forma como foram desenhada
e o tipo de programação que elas permitem. As linguagens de programação de cada geração

4
Aspectos que normalmente compõem qualquer linguagem de programação do alto nível.

Bernardino Eugénio Bila Pág. 44/50


Paradigmas de Programação

possuiam uma orientação da forma como os problemas da vida corrente seria solucionados
usando o computador. Este facto permitiu que as linguagens tivessem analogias no modelo
ou estilo por elas adoptados para a solucionar os problemas reais. A estes estilos, modelos de
solucionar problemas reais recebeu o nome Paradigma de Programação.

6.3. Pertinência do estudo dos Paradigmas de Programação


O conhecimento dos paradigmas de programação, permitirá ao estudante programador:
 Apreender facilmente determinada linguagem, conhecendo o estilo de programação
adoptado por tal linguagem, isto é, conhecendo as caracteristicas do seu paradigma
facilmente poder-se-á aplicar tal linguagem na modelação de soluções à problema
reais.

 Soluções de determinados problemos da vida corrente, mostram-se mais eficientes


numa perspectiva estrutural orientado aos processos ou numa perspectiva orientado a
objectos, tal circunstância permitirá ao desenhador da solução informática seleccionar
a linguagem adequada para uma implementação computacional eficiente.

 O processo de modelação duma solução informática deve, desde a primeira fase se


preocupar com tecnologias que será adoptada para a implementação de tal solução,
tendo um conhencimento geral dos paradigmas possibitará ao desenhador uma melhor
leitura e controlo do processo de modelação.

Bernardino Eugénio Bila Pág. 45/50


Paradigmas de Programação

PLANO DE AULA
Curso: Licenciatura em Engenharia de Software
Disciplina: Paradigmas de Programação
Ano: 2007 II Semestre
Turma: 3PESW / 3LESW

TEMA VIII: PARADIGMA IMPERATIVO

1. CONTEÚDOS

i. Conceito de paradigma imperativo


ii. Princípios do paradigma imperativo
iii. Características das linguagens imperativas
iv. Vantagens e desvantagens do paradigma imperativo
v. Linguagens com abordagem imperativa

2. OBJECTIVOS ESPECÍFICOS
No fim deste tema, o aluno deve ser capaz de:
i. Definir o conceito de paradigma impertivo
ii. Explicar os princípios do paradigma imperativo
iii. Descrever as características das linguagens imperativas
iv. Explicar as vantagens e desvantagens do paradigma imperativo

3. MEIOS DIDÁCTICOS
 Texto de apoio
 Quadro branco
 Caneta de quadro de branco

4. MÉTODOS DE ENSINO
 interrogativo de modo a colectar dos estudantes os conhecimentos intuitivos que
possuem sobre as estruturas de controle usuais nas linguagens de programação;

Bernardino Eugénio Bila Pág. 46/50


Paradigmas de Programação

 Expositivo, após a colecta das contribuições dos alunos, o docente fará uma
exposição teórica sobre as estruturas de controle usuais nas linguagens de
programação.

5. DURAÇÃO DA AULA
A presente aula deverá ter uma duração de 80 min.

6. APRESEBTAÇÃO DOS CONTEÚDOS / MOTIVAÇÃO


 O que significa o termo imperativo?
 Que caraceteristicas possui o referido termo?

6.1. Paradigma Imperativo ou procedural


O Paradigma Imperativo foi o primeiro paradigma a surgir e actualmente ainda se mostra
dominante na modelação de sistemas estruturados, bsasados nos processos.

Paradigma imperativo é baseado em conceitos de chamada de procedimentos simples


contendo uma série ou sequência de instruções a serem executados, também conhecidos
como rotinas, subrotinas, métodos ou funções.

O Paradigma imperativo é também denominado de paradigma procedural, por incluir


subrotinas ou procedimentos como mecanismo de estruturação.

6.2. Princípios de Paradigma Imperativo


O paradigma imeperativa possui os seguintes princípios:
 Centrado em estados (conjunto de associações da variável e do valor) e comandos
que modificam esse sestados
 Execução sequêncial de comandos (execução up-down)
 Usa o conceito de variável para representar um espaço de memória
 Usa assignação (atribuição) para mudar o valor das variaáveis

Bernardino Eugénio Bila Pág. 47/50


Paradigmas de Programação

6.3. Características do Paradigma Imperativo


 Muito próximo da arquitextura da máquina real de Von Neumann5 (fig. 8)
 A transição dos estados é efectuada através de comandos.
 Agoritmos especificados com grandes detalhes
 Dita o que deve ser feito e como
 A ordem dos comandos é relevante
 Programação estruturada
 Desenvolvimento top-down
 Programação procedural ou modular
 Recurso a sub-programas (procedimentos e funções)
 Manipula dados locais e publicos
 Comandos em forma de verbo (receber, abrir, ler, fechar, etc.)

Entrada Programa Saída

Estado

Fig. 8: Modelo Computacional do Paradigma Imperativo

6.4. Vantagens do paradigma imperativo

 Eficiência (embute modelo de Von Neumann)

 Modelagem “natural” de aplicações do mundo real

 Paradigma dominante e bem estabelecido

6.5. Desvantagens do paradigma imperativo


 Difículdade na legibilidade do código quando se usa o comando GOTO
 Dificiuldade de manutenção e expansão do programa

5
John Von Neumann (1903-1957), matemático Húngaro- um dor construtores do ENIAC.

Bernardino Eugénio Bila Pág. 48/50


Paradigmas de Programação

 Dificuldade na reutilização do código.

6.6. Linguagens com abordagem Imperativa


 FORTRAN : FORmula TRANslation. Vulgariamente usada na ciência de computação
para solucionar problemas da análise numérica.
 COBOL: COmmon Business Oriented Language (Linguagem Orientada aos Negócios),
que define seu objectivo principal em sistemas comerciais, financeiros e
administrativos para empresas e governos.
 ADA: Linguagem de programação em homenagem à Ada Lovelace6 e desenvolvida
originalmente pelo Departamento de Defesa dos EUA. Baseada no Cobol e no
Pascal, ela serviria de base o Ruby.
 BASIC : Beginners All-purpose Symbolic Instruction Cod. Desenvolvida com fins
académicos
 SNOBOL: String Oriented Symbolic Language. Usada largamente nas decadas 60 e 80
como uma linguagem de manipulação de texto, tendo actualmete originado as
linguagem AWK ( autoria de Alfred Aho, Peter Weinberger, and Brian
Kernighan) a PERL para a manipulação de string com significado nas
expressões regulares.
 CLU : linguagem de programação criada pela Barbara Liskov7 e seus estudantes em
1974 e 1975.
 PL/1: Programming Language One. Desenhado para cientistas, engenheiros e aplicações
de negócio.
 ALGOL: ALGOrithmic Language. Usada principalmente em aplicações cientificas.
 PASCAL: linguagem de programação em homenagem ao Físico-Matemático Blaise
Pascal8. Foi criada em 1970 pelo Niklaus Wirth9, com o objectivo de
encorajar o uso de código estruturado.

6
Augusta Ada King, Condessa de Lovelace (1851-1852) reconhecida como sendo a primeira programadora em toda
a história que escreveu um programa que permitia a máquina análitica de Charles Babbage computar os valores de
funções matemáticas.
7
Barbara Liskov (nascida em 1939), prominete cientistade computação. Primeira mulher Norte Americana a tornar-
se uma PhD em ciências de computação (informática) em 1968 na Universidade de Stanford.
8
Blaise Pascal (1623-1662), Filósofo, Físco e Matemático Francês.
9
Niklaus E. Wirth (nascido em 1934), cientista Suíço de computação.
Bernardino Eugénio Bila Pág. 49/50
Paradigmas de Programação

 MODULA: iventada pelo Niklaus Wirth em 1970. Esata linguagem possui algumas
simililariades com o seu predecessor Pascal, primeira linguagem escrita pelo
Niklaus.
 C: linguagem de programação de propósito geral, estruturada, imperativa, procedural, de
alto nível e padronizada. Criada em 1972, por Dennis Ritchie10, nos laboratórios Bell,
para ser usada no sistema operacional UNIX11. Desde então, espalhou-se por muitos
outros sistemas operativos, e tornou-se uma das linguagens de programação mais
usadas. O seu nome “C” deveu ao facto de muitas das suas características derivarem
de uma linguagem de programação anterior chamada “B”.

10
Dennis MacAlistair Richies (nascido em 1941), cientista Norte Americano de computação, formado em Física e
Matemática Aplicada em Universidade de Harwad.
11
Sistema operativo portátil, multi-tarefa e multi-utilizador.

Bernardino Eugénio Bila Pág. 50/50

You might also like