Tecnicas de Programação
Tecnicas de Programação
Tecnicas de Programação
cni
TÉCNICAS DE PROGRAMAÇÃO
As técnicas de programação exercem papel
cas
fundamental na computação, pois possibilitam
aos profissionais dessa área aprender e
desenvolver uma programação. À medida Cassiana Fagundes da Silva
que o conhecimento sobre os conceitos e as
funcionalidades das linguagens de programação
de
aumenta, o programador desenvolve, também,
suas habilidades e passa a ter maior capacidade
de entender o comportamento dos programas,
bem como mais facilidade para aprender novas
linguagens.
pro
Cassiana Fagundes da Silva
gra
Código Logístico Fundação Biblioteca Nacional
ISBN 978-85-387-6614-8
ma
cao
59310 9 788538 766148
Técnicas de
Programação
IESDE BRASIL
2020
© 2020 – IESDE BRASIL S/A.
É proibida a reprodução, mesmo parcial, por qualquer processo, sem autorização por escrito da autora e do
detentor dos direitos autorais.
Projeto de capa: IESDE BRASIL S/A. Imagem da capa: Rawpixel/Envato Elements
2 Desenvolvendo um programa 29
2.1 Análise léxica e sintática 30
2.2 Nomes e variáveis 33
2.3 Tipos de dados 36
2.4 Expressões e sentenças de atribuição 45
4 Modularização 66
4.1 Fundamentos de subprogramas 67
4.2 Métodos de passagem de parâmetros 70
4.3 Subprogramas sobrecarregados e genéricos 73
4.4 Semântica de chamadas e retornos 75
5 Orientação a objetos 80
5.1 Conceitos de abstração 80
5.2 Tipos abstratos de dados e encapsulamento 82
5.3 Implementação de construções orientadas a objetos 86
5.4 Metodologias de desenvolvimento top down e bottom up 89
Gabarito 94
APRESENTAÇÃO
As técnicas de programação exercem papel fundamental na computação,
pois possibilitam aos profissionais dessa área aprender e desenvolver
uma programação. À medida que o conhecimento sobre os conceitos e as
funcionalidades das linguagens de programação aumenta, o programador
desenvolve, também, suas habilidades e passa a ter maior capacidade de
entender o comportamento dos programas, bem como mais facilidade para
aprender novas linguagens.
Considerando essa relevância, no primeiro capítulo, serão abordados os
conceitos de linguagem de programação, de modo a entender sua evolução
histórica e as razões pelas quais se deve estudar e compreender seus diversos
tipos. Os domínios e métodos de implementação de linguagens também são
discutidos para que o leitor entenda qual é o melhor paradigma a ser usado
nos diversos ambientes.
O segundo capítulo apresentará as estruturas básicas de um programa
em desenvolvimento, destacando a importância da análise léxica e sintática,
a declaração de variáveis e os tipos de dados. Também serão ilustradas as
expressões e sentenças de atribuições usadas na criação de um programa.
O terceiro capítulo propõe reflexões sobre as estruturas de seleção de
controle e seus respectivos tipos, de maneira que o leitor saiba aplicar e
identificar qual das estruturas é mais adequada no desenvolvimento de um
programa.
Diante da importância de aprimorar continuamente o desenvolvimento de
programas, o quarto capítulo visa estabelecer os conceitos de subprogramas
ou modularização nas linguagens de programação, ou seja, quando o
programa é dividido em partes distintas, tornando-o mais legível e de fácil
manutenção para os programadores.
No último capítulo, as características principais do desenvolvimento de
programas orientados a objetos são destacadas, além da modularização e do
desenvolvimento por meio das metodologias top down e bottom up.
Espera-se que este livro favoreça pesquisas e o aprofundamento nos
conhecimentos das técnicas de programação. Boa leitura!
1
Introdução a linguagens
de programação
Diariamente, vários programas são desenvolvidos e disponibi-
lizados no mercado para uso geral ou específico. A criação desses
programas somente torna-se possível por meio das linguagens de
programação que, há décadas, vêm sendo usadas por profissionais
de computação. É por meio das linguagens de programação que se
pode fazer um computador seguir instruções para realizar qualquer
processo.
Vale lembrar que, inicialmente, as linguagens de programação
eram bastante simples, uma vez que os computadores tinham limi-
tações no que diz respeito a suas configurações físicas de proces-
samento e memória. Porém, com os avanços tecnológicos, novas
linguagens vêm sendo criadas para atender às necessidades dos
usuários. Desse modo, o objetivo deste capítulo é apresentar uma
reflexão sobre as linguagens de programação (conceitos, evolução
e especificações) embasada em pesquisa bibliográfica da área,
para favorecer uma compreensão abrangente sobre elas e os pa-
radigmas que as classificam.
10 Técnicas de Programação
As linguagens de programação podem ser classificadas conforme
seus níveis, isto é, níveis mais baixos e níveis mais altos interpretados
pelo processador. As de baixo nível se caracterizam por um conjunto de
circuitos, e as operações dos programas são controladas de forma mais
primitiva, baseando-se no sistema binário de numeração para represen-
tação e operação dos dados. São chamadas também de linguagens de
máquina, principalmente por sua forma de representação e execução.
SAUTER, E.; AZEVEDO, F. S. de; Segundo o critério de facilidade de aprendizado, todo programa-
KONZEN, P. H. de A. (orgs.). dor deve ser capaz de aprender uma linguagem nova com facilidade.
Computação científica em
linguagem C: um livro colaborativo. Nesse sentido, linguagens que necessitam de muitas características e
Universidade Federal do Rio Grande várias formas de usar a mesma funcionalidade tornam-se mais difíceis
do Sul, 9 jan. 2020. Disponível em:
https://www.ufrgs.br/reamat/ de serem aprendidas. Além disso, nesses casos, a maioria dos usuários
ComputacaoCientifica/livro/livro. conhece uma parte da linguagem, dificultando o entendimento de códi-
pdf. Acesso em: 11 mar. 2020.
gos desenvolvidos por outros programadores ou usuários.
12 Técnicas de Programação
A ortogonalidade está relacionada às combinações de conceitos
básicos que o programador é capaz de criar, sem a produção de efei-
tos anômalos nessa combinação. Segundo Varejão (2004), uma lingua-
gem de programação é mais ortogonal quanto menor for o número de
exceções aos seus padrões regulares.
14 Técnicas de Programação
1.2 Evolução das linguagens de programação
Vídeo Antes das linguagens de programação, a programação era realiza-
da através da linguagem de máquina. Assim, os programadores pre-
cisavam entender exatamente cada um dos comandos referentes à
arquitetura da máquina para que determinada tarefa pudesse ser ini-
ciada e executada. Nota-se que a quantidade de conhecimento para
a programação era bastante alta, e a programação em si tornava-se
pouco produtiva devido a essas dificuldades com instruções e coman-
dos de máquina.
Figura 1
Arquitetura de Von Neumann
Memória
(armazena tanto instruções quanto dados)
Artigo
https://www.scielo.br/scielo.php?script=sci_arttext&pid=S0103-40141996000100022
16 Técnicas de Programação
Por outro lado, com o desenvolvimento dos sistemas computa-
cionais ao final da década de 1970 e início da década de 1980, as
linguagens de programação apresentaram aumento em sua comple-
xidade de resolução de problemas. O paradigma declarativo, com a
linguagem Prolog, também era bastante utilizado na resolução de
problemas que envolviam Inteligência Artificial. Nessa época, por-
tanto, as linguagens de programação já permitiam o uso de modu-
larizações e bibliotecas nos programas desenvolvidos, bem como já
começavam a aparecer os conceitos de abstrações de dados. São
exemplos de linguagens da época a Modula-2 e ADA.
18 Técnicas de Programação
Na figura, nota-se que Fortran, desenvolvida por John W. Backus, 4
em 1957, para computadores da International Business Machines
4
A IBM, empresa dos Estados
Corporation (IBM) , foi uma das primeiras linguagens de programa- Unidos atuante na área da
ção criada. Apresentava como característica a eficiência computacional, tecnologia da informação, é re-
conhecida por sua longa história
pois não usava alocação dinâmica de memória.
iniciada desde 1911. Atualmen-
Posteriormente, nos anos 1958 e 1959, surgiram as linguagens de te, desenvolve e comercializa
hardware e software.
programação Algol e Lisp. Algol foi considerada a primeira linguagem a
utilizar uma sintaxe formalmente definida. Lisp, por sua vez, criada por
John McCarthy, no Massachusetts Institute of Technology (MIT), através
do seu paradigma funcional e com processamento simbólico, era mais
Curiosidade
usada na área de Inteligência Artificial, assim como ocorre atualmente.
JavaScript é uma lingua-
A linguagem de programação Cobol, na década de 1960, foi desen- gem de programação
que permite implementar
volvida para ser usada em aplicações comerciais e se caracterizava por itens complexos em
ter muitos dados e pouca computação. Os princípios de legibilidade páginas web. É utilizada
sempre que uma página
foram implantados em sua criação, porém acabaram afetando sua web faz mais do que sim-
redigibilidade e comprometendo seu entendimento. plesmente mostrar uma
informação estática, com
No ano de 1964, na Universidade de Darmouth, foi desenvolvida conteúdo que se atualiza
a cada intervalo, mapas
a linguagem Basic por John Kemeny e Thomas Kurtz. Essa linguagem interativos ou gráficos
apresentava um fácil aprendizado e era muito usada por estudantes 2D/3D animados etc.
20 Técnicas de Programação
•• Maior habilidade ao usar uma linguagem de programação.
•• Maior capacidade para escolher linguagens de programação
apropriadas.
•• Maior habilidade para aprender novas linguagens de
programação.
•• Maior habilidade para projetar novas linguagens de programação.
Artigo
https://revistas.unifacs.br/index.php/rsc/article/download/5133/3488
22 Técnicas de Programação
1.4 Tradutores de linguagens de programação
Vídeo Os tradutores de linguagens de programação são fundamentais no
desenvolvimento de um programa. Isso porque a linguagem escolhida
pelo programador, independentemente de qual seja, geralmente precisa
ser traduzida para uma linguagem de máquina e, consequentemente, ser
entendida e executada pelo computador. A transformação de uma lingua-
gem de programação em linguagem de máquina acontece pela submissão
do código-fonte desenvolvido para tradução. Posteriormente, esse código
é transformado em linguagem de máquina, possibilitando o entendimen-
to, por parte do computador, das instruções que precisam ser executadas.
1.4.1 Compilação
O método de compilação consiste no processo em Figura 3
que os programas são traduzidos para a linguagem Processo de compilação
de máquina e, então, executados diretamente no Programa-fonte
computador. Esse método realiza a tradução integral
do programa-fonte ou código-fonte para o código da Analisador
léxico
máquina, de modo que o programa passa a ser exe-
Unidades léxicas
cutado diretamente após esse processo.
Analisador
Segundo Sebesta (2018), o processo de compila- sintático
24 Técnicas de Programação
Figura 4
Processo de interpretação pura
Programa-fonte
Dados de
entrada
Interpretador
Resultado
Fonte: Sebesta, 2018, p. 49.
Figura 5
Sistemas de implementação híbridos
Dados de
Árvores entrada
Código
Unidades de análise
intermediário
léxicas sintática
Gerador
Analisador Analisador
Programa-fonte de código Interpretador Resultado
léxico sintático
intermediário
26 Técnicas de Programação
CONSIDERAÇÕES FINAIS
As linguagens de programação encontram-se presentes no cotidiano,
seja através dos softwares utilizados na realização de determinadas tare-
fas no computador ou em programas embutidos em aparelhos eletroele-
trônicos ou industriais.
Embora tenham surgido há décadas e sido classificadas em vários pa-
radigmas, nota-se que determinadas linguagens de programação apre-
sentaram maior aderência e aplicabilidade do que outras. Essa aderência
esteve muito relacionada às qualidades de cada linguagem, isto é, progra-
madores têm buscado linguagens que apresentem maior portabilidade,
flexibilidade, reusabilidade e outras características impactantes nos siste-
mas computacionais utilizados por diversos tipos de usuários e sistemas
operacionais.
Além disso, com a evolução tecnológica dos hardwares, torna-se
possível expandir as linguagens de programação existentes, pois o pro-
cessamento e desempenho dos processadores possibilitam mais inde-
pendência em relação aos seus métodos de implementações e aos seus
tradutores para a linguagem de máquina.
Diante disso, os ambientes de programação são fundamentais para
os sistemas de desenvolvimento de software, nos quais a linguagem de
programação é um dos componentes do processo.
ATIVIDADES
1. Qual é a importância da linguagem de programação para o desenvol-
vimento de um programa?
REFERÊNCIAS
BRANCO,@dia, G. A. Jr.; TAMAE, R. Y. Uma breve introdução ao estudo e implementação
de compiladores. Revista Científica Eletrônica de Psicologia, ano V, n. 8, fev. 2008.
Disponível em: http://faef.revista.inf.br/imagens_arquivos/arquivos_destaque/
RHXqIjJHvJQhhCK_2013-5-28-11-13-48.pdf. Acesso em: 13 mar. 2020.
DE MELO, A. C. V.; DA SILVA, F. S. C. Princípios de linguagens de programação. São Paulo:
Editora Blucher, 2003.
28 Técnicas de Programação
2
Desenvolvendo um programa
Você já percebeu que, a cada dia, o número de aplicativos
para celular ou computadores aumenta exponencialmente?
Esses aplicativos também podem ser definidos como progra-
mas, os quais são um conjunto de instruções e comandos exe-
cutado logicamente em um determinado computador, para um
fim específico.
Para que um programa possa ser executado em alguma
máquina, é necessário que a linguagem de programação esco-
lhida cumpra uma sequência de etapas ou fases. Por exemplo,
é preciso ter uma sintaxe de fácil compreensão, assim como a
semântica suportar vários tipos de dados, estruturas básicas de
desenvolvimento, entre outros conceitos e métodos de imple-
mentação imprescindíveis a uma linguagem de programação.
Além disso, outro ponto importante ao desenvolver um pro-
grama diz respeito à manipulação de dados. Na operação de
algum programa, vários tipos de dados são inseridos e a lingua-
gem de programação adotada deve suportar essa diversidade
para garantir uma boa computação deles.
Entende-se que a tarefa de um desenvolvedor de linguagem
de programação não é trivial, bem como a de um utilizador de
linguagem de programação. Nesse sentido, é importante que
todo e qualquer programa, independentemente de sua lingua-
gem, seja construído de maneira clara, objetiva e concisa para
sua utilização por todos os envolvidos.
Desenvolvendo um programa 29
2.1 Análise léxica e sintática
Vídeo O entendimento de conceitos como análise léxica e sintática é de
suma importância na construção de um programa, independentemente
de sua linguagem de programação. Você já ouviu falar deles?
Figura 1
Sintaxe e semântica de uma linguagem de programação
photovibes/Shutterstock
30 Técnicas de Programação
Para Sebesta (2018), a sintaxe de uma linguagem de programação
é a forma de suas expressões, instruções e unidades de programa-
ção. Por sua vez, a semântica é entendida como o significado dessas
expressões, instruções e unidades de programação. Ambos os termos
estão diretamente relacionados e, quando bem projetada a lingua-
gem de programação, a semântica segue a sintaxe. Um exemplo é a
expressão escrita na linguagem Pascal:
x:=y
Vê-se que a sintaxe é responsável por verificar se o comando de atri-
buição está correto, e a semântica por realizar a substituição do valor
de x pelo valor de y.
Figura 2
Trecho de código-fonte desenvolvido em linguagem de programação C
Desenvolvendo um programa 31
•• Em relação à análise léxica, foi percorrido o trecho de código e
analisado os vocabulários (x, y, for, =, (, <, int, ++, aux,
A []). Erro léxico foi identificado na variável y#.
•• Na análise sintática, são verificadas as combinações dos tokens
que formam o programa, por exemplo, o comando for → for
(expr1; expr2; expr3) {comandos}. Na linguagem de
programação C, o comando for precisa respeitar uma sintaxe
para que o compilador entenda o que faz parte do vocabulário
da linguagem, como as expressões utilizadas nas estruturas de
repetição.
•• No exemplo, os erros são apontados em relação à estrutura do
comando ; for(x=0,... ), uma vez que as expressões pre-
cisam estar dentro de parênteses e separadas por ponto e vír-
gula. Como observa-se na Figura 2, terceira linha, não existe um
fechamento de parênteses e as expressões estão separadas por
vírgula e ponto e vírgula.
•• Já a análise semântica do trecho de código apresentado busca os
tipos semelhantes em comandos com, por exemplo, a atribuição
e seus respectivos identificadores declarados. Na situação em
Leitura
questão, erros não foram encontrados, pois a semântica estava
Sugere-se conhecer a
dissertação de Diego coerente com o especificado.
Roberto Gonçalves de
Pontes, intitulada Geração Sebesta (2018) defende que a análise léxica deve ser separada da
de rótulo de privacidade análise sintática por razões de simplicidade, eficiência e portabilidade.
por palavras-chaves e
casamento de padrões A simplicidade é decorrente de as técnicas de análise léxica serem
(2016), que “discute mais fáceis, se comparadas à análise sintática, de modo que mantê-las
como o conteúdo das
políticas de privacidade divididas é mais viável. Além disso, quando detalhes de baixo nível são
pode ser apresentado de removidos de um analisador léxico, este se torna menor e mais limpo
maneira mais sintética
para o usuário, com as de se utilizar.
informações sobre a
coleta e a utilização dos Já a eficiência trata da otimização do analisador léxico, que necessi-
dados sendo exibidas em ta de uma grande quantidade de tempo de compilação, tornando inviá-
uma tabela, denominada
Rótulo de Privacidade”. vel a sua otimização. A portabilidade, por sua vez, aborda os arquivos
São Carlos, 2016. Universidade de entrada lidos, de maneira que o analisador sintático seja indepen-
Federal de São Carlos. Disponível dente da plataforma.
em: https://repositorio.
ufscar.br/bitstream/handle/ Pode-se dizer que a análise léxica é uma junção de padrões, tam-
ufscar/8730/DissDRGP.
pdf?sequence=1&isAllowed=y. bém chamada de casamento de padrões, em que o analisador léxico
Acesso em: 17 abr. 2020. tenta encontrar uma subcadeia de caracteres idêntica ao padrão in-
formado. O casamento de padrões vem sendo usado há muitos anos,
32 Técnicas de Programação
tendo sua primeira aplicabilidade nos editores de texto chamados ed,
introduzidos no sistema operacional UNIX.
Desenvolvendo um programa 33
guagens atuais se caracteriza pela substituição dos endereços numéri-
cos de memórias por nomes, tornando as linguagens mais legíveis, de
fácil entendimento e escrita.
Quadro 1
Exemplos de palavras reservadas
if for while
34 Técnicas de Programação
•• Não deve iniciar com número.
•• Não deve ter caracteres especiais { ( + - * / \ ; . , ? .
•• Não deve apresentar espaços em branco.
•• Não pode usar hífen ou acentuação.
•• Pode conter letras maiúsculas, minúsculas, números, subscrito
ou underline (_).
Quadro 2
Exemplos de nomes válidos e inválidos de variáveis
Nota 1Nota
nota_1 nota 1
email @e-mail
Cadastro1 Cadastro1º
Endereco endereço
que ela pode assumir – se for um número decimal, por exemplo, será valor: termo usado como
representação de valores. Em
atribuído à variável um tipo de dado inteiro. linguagens de programação,
valores significam que estão
Já o valor de uma variável pode ser alterado à medida que ela é atua-
sendo representados dados.
lizada. Em outras palavras, uma variável pode iniciar a sua execução
com um determinado valor e, conforme as instruções/comandos do
programa forem executadas, esse valor pode ser alterado.
Desenvolvendo um programa 35
Para uma variável global, o tempo de vida é todo o período de
execução do programa em que foi declarada. Em contrapartida,
em variáveis locais, o tempo de vida corresponde ao período em
Atenção que o bloco de comando no qual as variáveis foram declaradas é
36 Técnicas de Programação
Nesse contexto, é válido questionar: como define-se um valor? Tudo
que se avalia durante o processo de computação pode ser entendido
como um valor, ou seja, o que for armazenado, ou incorporado a uma
estrutura de dados do programa, ou então passado como argumento
para uma função ou um procedimento, entre outros. Alguns exemplos
são apresentados na Tabela 1.
Tabela 1
Exemplos de valores na linguagem de programação C
21 3.98 029
Desenvolvendo um programa 37
Considerando que os primitivos são definidos na implementa-
ção de uma linguagem de programação, determinadas limitações
de hardware podem impactar nesse processo. Um exemplo dessa
variação é verificado na linguagem de programação C, em que, para
as variações de hardware de 16, 32 ou 64 bits, o tipo int modifica a
sua faixa de valores ou intervalo. Esses tipos podem ser classificados
em: inteiro, caractere, booleano, decimal, ponto flutuante, enumera-
do e intervalos inteiros.
var x: integer;
y: float;
int x, y;
38 Técnicas de Programação
Dec Hex Oct Chr Dec Hex Oct HTML Chr Dec Hex Oct HTML Chr Dec Hex Oct HTML Chr
0 0 000 NULL 32 20 040   Space 64 40 100 @ @ 96 60 140 ` `
Tabela 2
End of
4 4 004 36 24 044 $ $ 68 44 104 D D 100 64 144 d d
Transmission
5 5 005 Enquiry 37 25 045 % % 69 45 105 E E 101 65 145 e e
6 6 006 Acknowledgment 38 26 046 & & 70 46 106 F F 102 66 146 f f
7 7 007 Bell 39 27 047 ' ‘ 71 47 107 G G 103 67 147 g g
8 8 010 Backspace 40 28 050 ( ( 72 48 110 H H 104 68 150 h h
9 9 011 Horizontal Tab 41 29 051 ) ) 73 49 111 I I 105 69 151 i i
10 A 012 Line feed 42 2A 052 * * 74 4A 112 J J 106 6A 152 j j
11 B 013 Vertical Tab 43 2B 053 + + 75 4B 113 K K 107 6B 153 k k
12 C 014 Form feed 44 2C 054 , , 76 4C 114 L L 108 6C 154 l l
13 D 015 Carriage return 45 2D 055 - - 77 4D 115 M M 109 6D 155 m m
14 E 016 Shift Out 46 2E 056 . . 78 4E 116 N N 110 6E 156 n n
15 F 017 Shift In 47 2F 057 / / 79 4F 117 O O 111 6F 157 o o
16 10 020 Data Link Escape 48 30 060 0 0 80 50 120 P P 112 70 160 p p
17 11 021 Device Control 1 49 31 061 1 1 81 51 121 Q Q 113 71 161 q q
18 12 022 Device Control 2 50 32 062 2 2 82 52 122 R R 114 72 162 r r
(Continua)
Desenvolvendo um programa
39
40
Técnicas de Programação
Dec Hex Oct Chr Dec Hex Oct HTML Chr Dec Hex Oct HTML Chr Dec Hex Oct HTML Chr
Device
19 13 023 51 33 063 3 3 83 53 123 S S 115 73 163 s s
Control 3
Artigo
https://www.lia.ufc.br/~valdisio/download/ieee.pdf
Desenvolvendo um programa 41
Os tipos de dados enumerados são usados para melhorar a legibi-
lidade e confiabilidade do código. Nesse caso, a primeira é aumentada
porque os identificadores de valores são mais facilmente reconhecidos
do que códigos numéricos; já a segunda é aumentada por conta dos
valores fora da enumeração, não sendo válidos. Assim, a cardinalida-
de de um tipo enumerado corresponde ao número de identificadores
usados na enumeração.
42 Técnicas de Programação
Quando se trabalha com produtos cartesianos em linguagem de
programação, ao se referenciar os componentes de uma determina-
da tupla, é preciso seguir uma notação. De acordo com a linguagem
de programação, para acessar o campo endereço, por exemplo, é
necessário usar:
func.nempregado.endereco
Desenvolvendo um programa 43
As uniões disjuntas, por outro lado, não possibilitam intersecção
entre o conjunto de variáveis dos tipos que formam a união. Para isso,
um campo de identificação chamado tag é usado com o intuito de iden-
tificar qual o tipo originário do valor da união disjunta (VAREJÃO, 2004).
END;
Tabela 3
Mapeamentos finitos
10 11 13 15 ... 30 34 40
0 1 2 3 ... 4 5 6
44 Técnicas de Programação
por meio de um algoritmo, o qual toma qualquer valor em uma função
e o computa em outra.
x + y * c
Desenvolvendo um programa 45
As variáveis apresentam, hipoteticamente, valores como 3, 2 e 10,
respectivamente. O resultado dessa expressão está relacionado ao
modo como a avaliação dos operadores é realizada. Por exemplo,
da esquerda para a direita, será feita a adição e, posteriormente,
a multiplicação, obtendo-se 50 como resultado; já da direita para a
esquerda, o resultado será diferente, pois, primeiro, será realizada a
multiplicação e, então, a adição com o valor resultante de 60.
Tabela 4
Precedência geral de operadores aritméticos
1ª Parênteses ( )
2ª Potenciação **
4ª Adição, subtração +, –
46 Técnicas de Programação
(2+3) **2 * (5–2) + 7
5**2 * 3 + 7
25 * 3 + 7
75 + 7
82
A – B + C
perigos é o & (e comercial), uma vez que, quando usado como opera- MELO, A. C. V. de; SILVA, F. S. C. da.
São Paulo: Blucher, 2003, p. 68-72.
dor binário, representa e especifica uma operação AND lógica. Já se
Desenvolvendo um programa 47
empregado como operador unário, o seu significado é diferente, pois
torna-se o endereço de uma variável em tipos ponteiros.
Tabela 5
Operadores relacionais
Igual == == =
Diferente != != /=
48 Técnicas de Programação
liadas primeiro, isto é, serão calculados os valores das expressões
x + 3 e 2 * y para, então, verificar-se a operação maior.
A = B = C
Desenvolvendo um programa 49
Os alvos múltiplos, por sua vez, possibilitam a atribuição de um va-
lor a mais de uma variável, como na instrução:
SALARIO, TOTAL = 0
soma = ++ cont;
50 Técnicas de Programação
Se o operador for pós-fixado, no entanto, a instrução é apresentada
da seguinte forma:
soma = cont++;
CONSIDERAÇÕES FINAIS
O desenvolvimento de um programa nem sempre pode ser conside-
rado uma tarefa trivial. Uma sequência de regras precisa ser estabeleci-
da e entendida, com o objetivo de facilitar a criação de programas aos
programadores/desenvolvedores.
Entre os primeiros cuidados de uma linguagem de programação es-
tão a sintaxe e a semântica, ou seja, a forma notacional da linguagem e
como essa é compilada ou interpretada (ou ambas) pelo computador,
para transformar linguagens de alto nível em baixo nível (linguagem de
máquina).
Dessa forma, entende-se que, ao se desenvolver um programa, sem-
pre é importante que variáveis sejam declaradas para que possam ser
executadas no tempo de vida do programa e, principalmente, possam ar-
mazenar valores, permitindo apresentá-los aos usuários. Além disso, para
cada variável usada, é necessário que tipos de dados lhe sejam atribuídos,
pois eles permitem que as variáveis possam armazenar na memória do
computador uma faixa de valores.
Além disso, foi apresentada a importância de entender como as ex-
pressões podem ser avaliadas pelos programadores e pelo computador
no momento da execução. A ordem de avaliação das expressões aritméti-
cas, relacionais e booleanas é muito similar à encontrada na matemática, e
atende ao mesmo propósito. No entanto, tratando-se de algumas lingua-
gens de programação, determinados operadores podem ser usados com
mais de uma funcionalidade no código-fonte, gerando uma sobrecarga de
operador. Para isso, é necessário que o programador crie estratégias para
sua melhor utilização.
Desenvolvendo um programa 51
ATIVIDADES
1. Qual a importância da sintaxe no desenvolvimento de uma linguagem
de programação?
REFERÊNCIAS
RICARTE, I. Introdução à compilação. Rio de Janeiro: Elsiever, 2008.
SEBESTA, R. W. Conceitos de linguagens de programação. 11. ed. Porto Alegre: Bookman,
2018.
VAREJÃO, F. M. Linguagem de programação: conceitos e técnicas. Rio de Janeiro: Elsevier,
2004.
52 Técnicas de Programação
3
Estruturas de seleção
de controle
No desenvolvimento de um programa, é importante que de-
terminadas estruturas sejam seguidas, pois é por meio delas
que se torna possível a execução de instruções e comandos
no computador. Porém, nessas estruturas, é necessário que
variáveis sejam declaradas, bem como tipos de dados sejam
atribuídos, independentemente da linguagem de programação
escolhida para o desenvolvimento.
Não obstante, além dessas variáveis e dos tipos de dados,
é preciso que o programa utilize determinadas estruturas para
a resolução de seus problemas, e, dentro delas, encontram-se
as estruturas de seleção e controle (DE MELO; DA SILVA, 2003).
Essas estruturas são muito utilizadas pelos mais diversos
programadores ao redor do mundo, uma vez que permitem
maior controle e flexibilização dos comandos executados du-
rante o tempo de vida do programa. Ou seja, pelo uso da es-
trutura de seleção, o programador pode definir qual bloco de
comandos executar, desviando, assim, o fluxo de execução dos
comandos escritos.
O mesmo acontece na estrutura de controle que garante
maior domínio da quantidade de repetições que determinado
trecho de código deve executar. Dessa forma, os programas
desenvolvidos apresentam maior agilidade e desempenho em
seus processos de execução.
54 Técnicas de Programação
Diante disso, para Sebesta (2018), as questões de projeto podem ser
resumidas da seguinte forma:
Uma instrução
única, uma
Qual é a forma ou Como o significado
sequência de
o tipo da seleção dos seletores
instruções ou
que controla a aninhados pode
uma instrução
seleção? ser especificado?
composta pode ser
selecionada?
Instrução
ELSE
Instrução
IF (peso == 70)
IF (altura == 180)
Resultado = 0;
ELSE
Resultado = 1;
IF A > B then
soma:= soma + A;
cont:= cont + 1;
ELSE
soma:= soma + B;
contb:= contb + 1;
end IF;
56 Técnicas de Programação
Nesse exemplo, nota-se que existe uma palavra reservada denomi-
nada end IF, que é usada quando a cláusula then é um composto.
Sendo assim, uma vez que a palavra reservada end IF permite a fina-
lização das instruções do IF aninhado, fica claro que a cláusula ELSE
coincide com o then interno.
IF soma = 0 then
IF cont = 0 then
Resultado:= 0;
end IF;
ELSE
Resultado:= 1;
end IF;
corpo do laço
58 Técnicas de Programação
Nesse exemplo, a instrução for não precisa e não tem um corpo do
laço, pois todas as ações desejadas são apresentadas dentro da pró-
pria instrução (parênteses), e não dentro de seu laço. Por outro lado, Figura 4
quando as instruções são controladas logicamente, normalmente, são Laço de repetição
while (expressão)
corpo do laço
do
corpo do laço
while (expressão)
int contador = 0;
while(contador < 5)
contador += 1;
int contador = 0;
do {
contador += 1;
Deve-se permitir
que o mecanismo Somente um
O mecanismo corpo do laço deve
apareça em um
condicional deve ser finalizado ou
laço controlado ou
ser uma parte laços envolventes
somente em um
integrante da também podem
laço sem qualquer
saída? ser finalizados?
outro controle?
60 Técnicas de Programação
3.3 Desvio incondicional
Vídeo O desvio incondicional, ao ser adotado no desenvolvimento de um
programa, estabelece-se na forma que o controle da exceção será
transferido para algum lugar determinado no código. Desde o início
das linguagens de programação, na década de 1960, foi questionado
se os desvios incondicionais deveriam fazer parte de qualquer lingua-
gem de alto nível, ou se seu uso deveria ser apenas restrito.
goto TERMINOU
...
[ ] ...
fi
62 Técnicas de Programação
construção durante a execução. Assim, se mais de uma expressão for
verdadeira, uma das instruções correspondentes será não determinis-
ticamente escolhida para a execução. Caso nenhuma expressão seja
verdadeira, haverá um erro em tempo de execução que acarretará o
término do programa.
Figura 5
Fluxograma de abordagem usada como instrução seletora
V
Todas são
Erro em tempo de execução
falsas
V
Exatamente uma é
verdadeira
F Execute a instrução
associada Curiosidade
Escolha aleatoriamente uma A seleção de Dijkstra é muito va-
das expressões booleanas liosa quando aplicada à constru-
verdadeiras ção de programas que realizam
a manutenção de interrupções,
sendo que essas apresentam a
Fonte: Adaptada de Dijkstra, 1976 apud Sebesta, 2018, p. 322.
mesma prioridade.
[ ] ...
od
CONSIDERAÇÕES FINAIS
Neste capítulo, uma variedade de seleções e estruturas foi discutida, a
nível de controle. As instruções de controle das linguagens de programa-
ção imperativas são definidas em várias categorias, como seleção, seleção
múltipla, seleção iterativa e desvio incondicional.
Segundo Sebesta (2018, p. 322), “somente as sequências, os laços
lógicos de pré-teste e as seleções são absolutamente necessários para
exprimir computações”. Trata-se de um resultado inicialmente teórico,
amplamente usado para “banir completamente os desvios incondicionais”.
Nesse sentido, tem-se observado que vários são os problemas com a
instrução goto, porém nenhum deles apresenta uma razão teórica para a
sua não utilização. Vários autores têm considerado o uso da goto na saída
prematura de laços de repetição, principalmente em linguagens de progra-
mação que não oferecem esse tipo de instrução de saída. Dentre as que
64 Técnicas de Programação
apresentam saídas para seus laços, pode-se elencar C, C++, Fortran 90,
Java e Perl – essas saídas ocupam o lugar das instruções goto.
Diante das discussões apresentadas em relação ao uso dos desvios
incondicionais, ou goto, entende-se que esses fazem parte do ciclo de vida
da maioria das linguagens de programação até o momento desenvolvidas.
Assim, o ideal é que os cuidados no uso dessas instruções fiquem minimi-
zados ao ensino das disciplinas de programação.
Já em relação aos comandos protegidos de Dijkstra, são definidos como
construções alternativas, com características teóricas passivas, uma vez
que não são abordados como parte de construções de controle de uma
linguagem, além de sua semântica aparecer nas linguagens concorrentes,
como Ada e CSP.
ATIVIDADES
1. O que são estruturas de controle?
REFERÊNCIAS
DE MELO, A. C. V.; DA SILVA, F. S. C. Princípios de linguagens de programação. São Paulo:
Blucher, 2003.
DIJKSTRA, E. W. A Discipline of Programming. Englewood Cliffs, NJ: Prentice Hall, 1976.
SEBESTA, R. W. Conceitos de linguagens de programação. 11. ed. Porto Alegre: Bookman,
2018.
66 Técnicas de Programação
4.1 Fundamentos de subprogramas
Vídeo Subprogramas são muito utilizados quando se pretende dividir pro-
blemas complexos em várias partes mais gerenciáveis e resolvê-las in-
dependentemente. No entanto, para melhor entendimento do conceito
e da aplicação de subprogramas, é necessário entender a abstração,
visto que essa é a base para seu uso.
Modularização 67
A legibilidade aumenta por meio da divisão lógica do programa em
unidades funcionais e das separações do código relacionado à imple-
mentação da abstração. A redigibilidade é aprimorada, uma vez que
vários trechos podem ser usados em diferentes partes do programa,
sem a necessidade de reescrever todas as vezes que forem usados.
68 Técnicas de Programação
matemáticas. Como exemplos de funções, é possível citar: dar o valor
do maior elemento de três elementos ou determinar se um elemento
está dentro de uma faixa de valores aceitáveis.
4.1.1 Parâmetro
Os parâmetros facilitam o processo de aplicação de dados diferen-
ciados a chamadas distintas de um subprograma (VAREJÃO, 2004). Sem
o uso de parâmetros, a utilidade dos subprogramas se concentra na
divisão de códigos em pequenos trechos.
Modularização 69
O exemplo de uma função com parâmetro na linguagem de progra-
mação C pode ser descrito na figura a seguir.
Figura 3
Função com parâmetro em linguagem C
Por outro lado, cinco modelos básicos foram desenvolvidos para im-
plementação de passagem de parâmetros, chamados passagem por va-
70 Técnicas de Programação
lor, passagem por resultado, passagem por valor-resultado, passagem por Figura 4
referência e passagem por nome. Passagem de parâmetros
em linguagem de progra-
Denomina-se passagem de parâmetro por mação
valor o momento em que o valor de um
parâmetro real é inicializado e ativa o
seu parâmetro formal correspondente.
A forma como essa ativação acontece
dentro do subprograma pode ser carac-
terizada como uma variável local den-
tro desse módulo, e o modelo semântico
equivalente a esse processo é chamado
de modo entrada.
Modularização 71
valores reais. Alguns autores também definem esse método como uma
combinação entre a implementação de passagem de valor e a passa-
gem de resultado.
Em determinadas bibliografias, a passagem por valor-resultado é
chamada de passagem por cópia, uma vez que o parâmetro real é co-
piado para o parâmetro formal na entrada do subprograma e, depois,
copiado de volta na finalização do subprograma. Assim, as desvanta-
gens da implementação desse método são as mesmas encontradas na
passagem por valor e por resultado, como a exigência de armazena-
mento múltiplo para parâmetros, tempo de cópia de valores e a ordem
em que os parâmetros reais são atribuídos, respectivamente.
A passagem por referência também é considerada um mo-
delo de entrada/saída. No entanto, o que difere da passagem por
valor-resultado é a transferência de um caminho de acesso, por meio
de um endereço, para o subprograma chamado.
Como vantagem, esse método apresenta bastante eficiência em
seu processo de passagem em níveis de tempo e espaço. No entanto,
como desvantagem, o acesso aos parâmetros formais torna-se mais
lento pela existência de mais um nível de endereçamento indireto.
Além disso, somente uma comunicação unidirecional com o subpro-
grama chamado é exigida, fazendo com que mudanças inadvertidas e
errôneas possam ser feitas no parâmetro real.
Pode ocorrer apelido quando parâmetros passados por referência são
usados, tanto entre dois ou mais parâmetros quanto entre um deles e
uma variável não local acessível. O acesso a essas variáveis não locais é
realizado de várias formas, como por declarações externas, por blocos de
dados globais, por módulos externos, por escopo estático e dinâmico etc.
Por fim, porém não menos importante, a passagem por nome
também é um modelo semântico caracterizado como entrada/saída. A
passagem de parâmetro real, contudo, ocorre de modo diferente, pois
existe uma substituição do parâmetro real pelo parâmetro formal em
todas as ocorrências do subprograma.
Nota-se, nesse método, que os parâmetros reais, sempre quando
chamados ao subprograma, são vinculados a valores ou então ende-
reços reais. Como principal vantagem da passagem por nome, tem-se
a flexibilidade proporcionada ao programador. A desvantagem fica
por conta da lentidão do processo em relação aos outros métodos de
passagem de parâmetros.
72 Técnicas de Programação
4.3 Subprogramas sobrecarregados e genéricos
Vídeo Para entender subprogramas sobrecarregados, é necessário com-
preender o conceito de um operador sobrecarregado. Chama-se de
operador sobrecarregado aquele que apresenta vários significados a
um único tipo de dado do operador. Por exemplo, pode-se descrever
o operador de multiplicação em uma linguagem C, que, em deter-
minados momentos, pode ser representado por uma multiplicação
ao ser adicionado a dois operandos de tipos de dados reais ou, em
outro momento, ser adicionado a um tipo de dado inteiro.
Modularização 73
Para Sebesta (2018), diz-se que um subprograma genérico, também
Glossário
conhecido por polifórmico, apresenta parâmetros com várias formas
polimorfismo paramétrico:
é adotado em subprogramas, de
de ativações. Algumas linguagens de programação, como Ada e C++,
modo que estes possam definir apresentam um polimorfismo paramétrico em tempo de compilação.
seus tipos de dados generica-
mente para suportar qualquer O subprograma genérico é onde as diferentes versões do subpro-
valor sem depender diretamente grama são instanciadas ou construídas pelo compilador mediante soli-
de seu tipo (SEBESTA, 2018).
citação do programa do usuário. Consequentemente, como as versões
dos subprogramas apresentam o mesmo nome, tem-se a impressão
de que um único subprograma pode acessar diferentes tipos em várias
chamadas, conforme ilustra o trecho de código descrito a seguir.
Figura 5
Exemplo de parâmetros genéricos
generic
type TIPO_INDICE is (< >);
type TIPO_ELEMENTO is private;
type VECTOR is array (TIPO_INTEIRO range < >) of
TIPO_ELEMENTO;
procedure ORD_GENERICA (LISTA : in out VECTOR);
procedure ORD_GENERICA (LISTA : in out VECTOR) is
TEMP : TIPO_ELEMENTO;
begin
for TOPO in LISTA’FIRST .. TIPO_
INDICE’PRED(LISTA’LAST) loop
for BASE in TIPO_INDICE’SUCC(TOPO) ..
LISTA’LAST loop
Saiba mais if LISTA(TOPO) > LISTA(BASE) then
TEMP := LISTA(TOPO);
Os subprogramas genéricos de
LISTA(TOPO) :+ LISTA(BASE);
linguagem Ada e as funções da
linguagem C++ são versões LISTA(BASE) := TEMP;
mais simplificadas de subpro- end if
gramas cujos tipos de parâme- end loop; - for BASE ...
tros formais são vinculados de end loop; - for T|OPO...
modo dinâmico aos tipos reais end ORD_GENERICA;
em uma chamada. Já para saber
como funcionam nas linguagens Fonte: Sebesta, 2018, p. 359.
Smalltalk e Java, sugerimos
ler o capítulo 12, da 10. edição O código da Figura 5 demonstra um procedimento de três parâme-
de Conceitos de linguagens de tros genéricos, desenvolvidos na linguagem Ada, que possibilitam ao
programação, de Robert Sebesta, subprograma atribuir um vetor genérico ao parâmetro. Esse exemplo
publicado em 2015 pela editora
Bookman. mostra um processo de classificação de trocas criado para funcionar
em qualquer vetor com elementos de tipos de dados numéricos.
74 Técnicas de Programação
Essa classificação genérica nada mais é do que um modelo para um
procedimento. Nenhum código é gerado para ele pelo compilador, e
ele não tem nenhum efeito sobre um programa, a menos que seja ins-
tanciado para algum tipo.
template <parâmetros>
class identificador
typename identificador
Modularização 75
Uma chamada a subprograma em uma linguagem típica tem nu-
merosa ações associadas a ela. A chamada deve incluir o meca-
nismo para quais métodos de passagem de parâmetros usados.
Se as variáveis locais não forem estáticas, a chamada deverá
fazer com que seja alocado armazenamento para as variáveis
declaradas no subprograma chamado e vinculá-las a ele. Deve-
rá salvar o status de execução da unidade de programa chama-
dora e organizar-se para transferir o controle para o código do
subprograma e assegurar que esse controle possa retornar para
o lugar apropriado quando a execução do subprograma for con-
cluída. Por fim, a chamada deverá fazer com que algum mecanis-
mo seja criado para fornecer acesso a variáveis não locais visíveis
ao subprograma chamado. (SEBESTA, 2018, p. 376)
1 2 3 4
Salvar a Executar o Passar o Transferir o
execução da processo de endereço de controle para o
unidade de passagem de retorno para o chamado
programa atual parâmetros chamado
76 Técnicas de Programação
como estático – foca as operações de chamada e de retorno em situa-
ções mais complexas.
Figura 6
Registro de ativação na linguagem de programação assemelhada ao Algol
Variáveis locais
Parâmetros
Vínculo dinâmico
Vínculo estático
Topo da pilha
Endereço de retorno
Modularização 77
Nesse sentido, a ativação de um procedimento precisa da criação
dinâmica de uma instância do registro de ativação. Para isso, o formato
do registro de ativação deve ser fixado durante a compilação, mesmo
que seu tamanho dependa da chamada em algumas.
Melo e Silva (2003) dizem que é razoável criar instâncias desses re-
gistros de ativação em uma pilha, uma vez que a semântica das chama-
das e os retornos especificam que o subprograma chamado por último
será o primeiro concluído.
CONSIDERAÇÕES FINAIS
Em todo e qualquer processo de desenvolvimento de software/pro-
grama existe a necessidade de compreensão do processo de abstração.
Isso porque, por meio dele, torna-se possível descrever as ações aptas a
serem representadas e implementadas.
Nesse sentido, os subprogramas surgiram com o objetivo de melhorar
o processo produtivo da programação, pois tratam do conceito “dividir
para conquistar”, que possibilita dividir problemas complexos em proble-
mas menores e colocá-los em execução.
Estudou-se também que, com o surgimento da modularização e uti-
lização de subprogramas, vários benefícios se apresentaram aos desen-
volvedores, dentre eles a reusabilidade e a eficiência da programação. A
reusabilidade possibilita que módulos/subprogramas já desenvolvidos se-
jam aproveitados e adaptados a novos programas, aumentando a produ-
tividade dos programadores, uma vez que minimiza o número de testes e
correções de trechos de códigos.
Além disso, destacou-se que os subprogramas podem ser definidos
como funções ou procedimentos, sendo necessário que atendam a uma
estrutura composta por cabeçalho e perfil de parâmetro. Analisou-se,
também, que os subprogramas podem ser sobrecarregados.
ATIVIDADES
1. Qual a importância dos subprogramas no desenvolvimento de um
programa?
78 Técnicas de Programação
REFERÊNCIAS
MELO, A. C. V. de; SILVA, F. S. C. da. Princípios de linguagens de programação. São Paulo:
Blucher, 2003.
SEBESTA, R. W. Conceitos de linguagens de programação. 11. ed. Porto Alegre: Bookman,
2018.
VAREJÃO, F. M. Linguagem de programação: conceitos e técnicas. Rio de Janeiro: Elsevier,
2004.
Modularização 79
5
Orientação a objetos
A orientação a objetos (OO) é um paradigma relativamente
antigo, utilizado desde a década de 1960. No entanto, tornou-se
mais conhecido e empregado no desenvolvimento de diversas
aplicações com o surgimento da linguagem de programação
Java.
O paradigma OO apresenta um enfoque voltado a melho-
rar e gerenciar a complexidade de um sistema. Na orientação a
objetos, a visão do mundo real pode ser estabelecida por meio
de vários objetos autônomos, concorrentes e com interação en-
tre si. Para isso, ao se desenvolver um programa no contexto
da orientação a objetos, é necessário que informações sobre o
problema sejam vistas de modo mais abstrato, isto é, pela ideia
de abstração.
Além desse conceito em relação às complexidades do siste-
ma, é importante prever quais tipos de dados serão definidos
para melhor se adequarem ao paradigma e, principalmente, às
características evidentes de reuso.
Neste capítulo, as implementações da orientação a objetos
são conceituadas, e os processos das metodologias top down
e bottom up no desenvolvimento de programas também são
apresentados.
80 Técnicas de Programação
Vale ressaltar que a abstração possibilita a determinadas partes do
problema apresentarem menor ou maior peso, fazendo com que al-
guns detalhes sejam desconsiderados, em certos momentos, para que
outros possam ser ressaltados (CORREIA; TAFNER, 2006).
Orientação a objetos 81
A abstração de processos é um dos conceitos mais antigos no pro-
jeto de uma linguagem de programação. Todos os subprogramas são
abstrações de processos, pois oferecem formas de especificar o que
determinado processo deve realizar, porém sem apresentar maiores
detalhes de como isso deverá ser feito.
82 Técnicas de Programação
Assim, o encapsulamento é como um dos grandes trunfos da pro-
gramação orientada a objetos, pois disponibiliza o objeto com toda a
sua funcionalidade, sem a necessidade de entender internamente seu
funcionamento, muito menos como os dados precisam ser armaze-
nados ou recuperados. Além disso, o encapsulamento possibilita que
modificações sejam feitas internamente no objeto, acrescentando
métodos, sem afetar os demais componentes do sistema que utilizam Glossário
esse mesmo objeto. métodos: são procedimentos
ou funções que realizam as
Em determinadas situações, o encapsulamento pode ser colocado ações próprias do objeto, ou seja,
em bibliotecas e disponibilizado para outros programas que não sejam representam as ações que os
objetos podem executar. É por
os mesmos para os quais foram escritos. Muitas linguagens de progra-
meio dos métodos que os obje-
mação oferecem a capacidade de reunir coleções de subprogramas, tos se manifestam e interagem
tipos de dados e unidades que podem ser compilados separadamente, com outros objetos.
significando que suas informações de interfaces são salvas pelo compi-
lador e, quando usadas por outra unidade, servem para verificação do
tipo de interface (SEBESTA, 2018).
Orientação a objetos 83
Já em linguagens de alto nível, os tipos de vírgula flutuante ado-
tam o conceito de abstração de dados como uma ocultação da in-
formação, ou seja, o formato real do valor de dados em uma célula
de memória de vírgulas flutuantes é oculto do usuário. E somente
as operações disponíveis são as oferecidas pela linguagem, de modo
que o usuário não tem permissão para criar novas operações sobre
os tipos de dados.
Permite às unidades
de programa Permite um conjunto
declararem suas de operações
variáveis, porém que manipulam
oculta a sua objetos do tipo.
representação.
84 Técnicas de Programação
Além disso, o ocultamento das informa-
ções é importante para o aumento da con-
fiabilidade, uma vez que os clientes podem
mudar qualquer representação subjacente de
objetos de maneira direta, permitindo maior integridade
dos respectivos objetos.
Quadro 1
Exemplo de um tipo de dados abstrato Figura 3
Ocultamento de
informações
Operações Descrição
Cria (pilha) Permite a criação e inicialização de um objeto na pilha.
Destrói (pilha) Possibilita deslocar o armazenamento da pilha.
Função que retorna true se a pilha estiver vazia e false
Vazia (pilha)
se estiver cheia.
Empurra um determinado elemento para uma pilha es-
Empilha (pilha, elemento)
pecificada.
Desempilha (pilha) Remove o elemento do topo da pilha especificada.
Retorna uma cópia do elemento do topo da pilha es-
Topo (pilha)
pecificada.
....
cria(pilha);
empilha(pilha, nome1);
empilha(pilha, nome2);
if (! Vazia (pilha))
...
Orientação a objetos 85
Nesse trecho de código, nota-se que a pilha foi criada e, na sequên-
cia, foram adicionados ou empilhados nome1 e nome2. Posteriormente,
é verificado, por meio do condicional if, se a pilha está cheia; caso ne-
gativo, a variável temp é alocada ao topo da pilha para que as inserções
possam ser realizadas desse ponto em diante.
Pessoa
Nome: string;
Idade: inteiro;
Cadastrar()
86 Técnicas de Programação
Além disso, outro ponto a ser considerado se refere à visibilidade
dada aos clientes em relação ao nome do tipo e aos cabeçalhos de
subprograma de abstração. Embora o nome do tipo necessite de vi-
sibilidade externa, sua definição sempre precisa ser oculta. O mesmo
ocorre com as definições dos subprogramas, em que os cabeçalhos
estão visíveis, porém os corpos (operações) ocultos.
Orientação a objetos 87
início do RIC. Isso faz com que todos os acessos sejam mais eficientes
em relação aos seus campos e registros.
Por sua vez, a segunda não precisa estar envolvida no RIC da-
quela classe. Os métodos que foram vinculados dinamicamente, no
entanto, devem ter entradas para essas estruturas. Como exem-
plo de entrada, poderia ser utilizado um ponteiro para o código
do método, definido no momento de sua criação. Essa abordagem
apresenta como desvantagem o fato de que toda instância precisa
armazenar ponteiros para seus respectivos métodos dinamicamen-
te vinculados.
class Pequena {
public int a, b, c;
public int d, e;
88 Técnicas de Programação
Figura 4
Registros de instância de classe e tabelas de métodos virtuais
Registro de b
instância de classe
para Pequena c
Registro de b
instância de classe
para Grande c
VMT desenhar
VMT para Grande
d examinar
Orientação a objetos 89
A programação top down adota, em sua abordagem de desenvolvi-
mento, o processo de decomposição de problemas complexos, ou mui-
to abrangentes, em problemas menores e mais específicos, mais fáceis
de serem entendidos.
Problema inicial
Tarefas mais
complexas e
genéricas
Tarefas mais
simples e
específicas
90 Técnicas de Programação
estruturas de dados e de algoritmos adequados para que códigos-fonte
possam ser implementados.
ColdSnow/Shutterstock
blema complexo, tarefas definidas e com formas reconhecidas como
imprescindíveis ao desenvolvimento. Sendo assim, após sua imple-
mentação, essas partes são reunidas pelo programador para a obten-
ção da solução do problema mais complexo. Assim, pode-se dizer
que tal abordagem apresenta maior precisão e comprometimento
da equipe, levando a dados detalhados do projeto e permitindo
melhor monitoramento e controle.
Orientação a objetos 91
De modo geral, é importante ressaltar que a elaboração de um pro-
grama poderá adotar uma abordagem mista, top down e bottom up.
CONSIDERAÇÕES FINAIS
O conceito de orientação a objetos teve sua origem difundida pela
linguagem Simula 67, mas somente obteve maior repercussão com o
surgimento da linguagem Smalltalk, na década de 1980. Muitos autores
consideravam essa linguagem totalmente orientada a objetos, uma vez
que apresentava, entre suas características e seus recursos-chave, os
conceitos de tipos de dados abstratos, herança e um tipo particular de
vinculação dinâmica.
Dessa forma, as definições de abstração de dados foram inseridas no
desenvolvimento de programas com o objetivo de minimizar a comple-
xidade deles. Isto é, por meio da abstração, tornava-se possível dividir o
programa em partes menores, a fim de minimizar a dificuldade de co-
dificação, e, ao final, integrá-lo novamente. Com base nos conceitos de
abstração, os tipos de dados abstratos passaram a ser muito utilizados
por todos os projetistas, de modo a serem projetados para todas as lin-
guagens e tornarem-se cada vez mais seguros e confiáveis.
Relacionado com os conceitos de OO, há, também, o encapsulamento.
Ele possibilita a inclusão de uma quantidade de tipos de dados de objetos
a determinadas entidades, de modo que o programador consegue orga-
nizar e acessar os métodos ou as operações das referidas classes.
Os dois principais recursos dos tipos de dados abstratos são o em-
pacotamento de objetos de dados, com suas operações associadas, e a
ocultação de informação. Uma linguagem de programação pode suportar
tipos de dados abstratos diretamente ou, então, simulá-los com encapsu-
lamentos mais genéricos.
Por fim, as implementações das construções orientadas a objetos são
estruturas baseadas em duas abordagens denominadas de armazena-
mento de dados de instâncias e vinculação dinâmica de mensagens e métodos.
Diante disso, conclui-se que as técnicas de programação, independen-
temente do paradigma adotado na resolução de um programa, precisam
respeitar sintaxes de linguagens e estruturas na utilização de comandos
para melhor desempenho e produtividade do código-fonte.
92 Técnicas de Programação
ATIVIDADES
1. O que são dados abstratos?
REFERÊNCIAS
CORREIA, C. H.; TAFNER, M. A. Análise Orientada a Objetos. 2. ed. São Paulo: Visual Books,
2006.
SEBESTA, R. W. Conceitos de linguagens de programação. 10. ed. Porto Alegre: Bookman,
2018.
VAREJÃO, F. M. Linguagem de programação: conceitos e técnicas. Rio de Janeiro: Elsevier,
2004.
Orientação a objetos 93
GABARITO
1 Introdução a linguagens de programação
1. As linguagens de programação são fundamentais para o
desenvolvimento de programas, pois, através delas, torna-se
possível realizar a comunicação entre o hardware da máquina e as
instruções escritas pelo programador. Além disso, permitem auxiliar
no desenvolvimento de várias competências e habilidades dos
programadores em relação ao raciocínio lógico, o pensamento mais
analítico etc.
2 Desenvolvendo um programa
1. Em qualquer linguagem de programação, o entendimento da sintaxe
é importante, primeiro, porque é por meio dela que se torna possível
a legibilidade de um programa por parte de seus desenvolvedores,
segundo, pelo fato de o compilador entender e apontar os erros
existentes no código-fonte.
94 Técnicas de Programação
memória do computador e, principalmente, processados durante a
execução do programa.
4 Modularização
1. Os subprogramas foram desenvolvidos com o objetivo de facilitar o
processo de desenvolvimento de um programa, uma vez que permitem
dividir o programa em partes menores de códigos e, assim, executá-las
de modo independente.
Gabarito 95
2. A modularização traz vários benéficos aos programadores, como o
aumento da legibilidade, a redigibilidade, a facilidade de modificabilidade
dos programas, a reusabilidade de códigos, a confiabilidade e a
eficiência na programação.
5 Orientação a objetos
1. A abstração de dados pode ser definida como uma representação
de determinado objeto que inclui apenas os atributos de relativa
importância em determinado contexto. Por exemplo, na representação
de um objeto ou uma entidade carro, é possível atribuir a ele apenas
as informações realmente relevantes, como placa, para viabilizar
o registro de uma multa de trânsito. Dessa forma, com o uso da
abstração, os programadores conseguem, de modo mais eficiente,
focar os atributos mais importantes para determinado problema.
96 Técnicas de Programação
te
cni
TÉCNICAS DE PROGRAMAÇÃO
cas
Cassiana Fagundes da Silva
de
pro
Cassiana Fagundes da Silva
gra
Código Logístico Fundação Biblioteca Nacional
ISBN 978-85-387-6614-8
ma
cao
59310 9 788538 766148