Você está na página 1de 61

Programação estruturada, Estrutura

de dados, pesquisa e ordenação

Juliano Rodrigo Lamb


Ementa de Estrutura

 Manipulação de cadeias de caracteres.


 Listas, filas e pilhas e suas aplicações.
 Árvores binárias e árvores de busca e suas
aplicações.
 Algoritmos de Ordenação e Pesquisa.
 Teoria dos Grafos.
 Aplicação dos conceitos de Engenharia de
Software no contexto.
Ementa de Programação

 Conceitos de Programação Estruturada,


Compilação e Interpretação. Visão geral da
linguagem.
– Variáveis, constantes, operadores e expressões.
Comandos de controle de execução. Funções.
Arrays.Ponteiros. Estruturas, uniões e variáveis
definidas pelo usuário. Processamento de
arquivos. Algoritmos e aplicações. Atividades em
Laboratório. Conceitos básicos de engenharia de
software aplicáveis à programação estruturada.
Metodologia

 Desenvolvimento de algoritmos
 Trabalhos
 Provas teóricas e/ou práticas
 Projetos
 Participação em sala

 Avaliação: 1 prova bimestral + trabalho (mínimo)


 Importante: As avaliações contam para as
duas disciplinas
Carga horária

 Estrutura = 4 aulas/semanais
 Programação = 2 aulas/semanais
Dúvidas?
O que é programação?

 Programação pode ser definida como


o ato de descrever um algoritmo que
resolva um problema proposto de
forma aplicável.
Mas .. E um algoritmo?

 Um algoritmo é uma seqüência de passos a


ser executada para se chegar a um objeto,
no caso, a solução de um problema
proposto.
– Para que a descrição do algoritmo seja aplicável,
tem de ser feita usando um protocolo lingüístico
que o executor reconheça. Este protocolo é
chamado linguagem de programação.
Linguagens de programação

 Como utilizamos computadores para realizar


a execução do programa, a linguagem de
programação precisa ser reconhecida pelo
computador que realizará aquela tarefa
específica.
Linguagens de programação

 Essencialmente computadores reconhecem


apenas uma linguagem específica, formada
por instruções relacionadas a
microinstruções registradas no
microprograma do processador. Esta
linguagem é chamada linguagem ou código
de máquina e é extremamente
incompreensível
Linguagens de programação

 No entanto é preciso que o programa


esteja em linguagem de máquina para
que o computador possa executá-lo, o
que é um problema e tanto.
Linguagens de programação

– A forma usada para solucionar a questão


é relativamente simples: a criação de
«tradutores» que permitam que o
programa seja escrito em linguagens mais
inteligíveis para então ser «traduzido»
para a linguagem de máquina. Há alguns
tipos diferentes de tradução, como
montagem, compilação, interpretação e
interpilação
Linguagens de programação

 O uso de tradutores permite que a


linguagem usada para a programação
apresente um certo nível de abstração da
forma como a máquina funciona.
– Linguagens que se aproximam muito do
funcionamento da máquina são chamadas de
baixo nível, já linguagens que se afastam do
funcionamento são chamados de alto nível.
Linguagens de programação

 Por exemplo, a linguagem Assembly possui


uma instrução para cada instrução de
máquina, sendo assim uma linguagem de
baixo nível.
– Isso traz dois inconvenientes: (1) é preciso
entender como cada processador funciona para a
criação do programa e (2) o programa se torna
pouco portável, sendo necessário reescrevê-lo
para cada tipo de diferente de processador.
Linguagens de programação

 Por outro lado, traz uma grande vantagem:


como não há uma «tradução» propriamente
dita, apenas uma conversão de símbolos
(tokens), a execução do programa se torna
extremamente eficiente.
Linguagens de programação

 Essa agilidade ocorre porque toda


tradução semântica gera verborragia,
ou seja, excesso de comandos para
fazer coisas simples.
– Quanto maior a diferença entre a
linguagem original e a de destino, maior a
probabilidade de verborragia, mas não
necessariamente.
Breve histórico

 Linguagens de programação tem


apresentado uma contínua evolução desde o
seu surgimento, datado da década de 1950.
– 1950: FORTRAN e LISP
– 1970: ADA, Pascal, Prolog e SmallTalk
– 1980: C++
Breve histórico

 Entre 1960 e 1970 novas linguagens foram


oferecidas para o desenvolvimento de
projetos de software.
– O Departamento de Defesa americano, durante o
desenvolvimento usando ADA (1970) já tinha
verificado mais de 500 linguagens relacionadas.
Desenvolvimento das primeiras
linguagens

 O estudo das primeiras linguagens de programação


compreende linguagens desenvolvidas entre os
anos 50 e 70, usualmente. Destaca-se:
– Linguagens numéricas
– Linguagens de negócios
– Linguagens para inteligência artificial
– Linguagens de sistema
Linguagens numéricas

 Tecnologia relacionada a computação já


teve inicio antes da 2a Grande Guerra entre
as décadas de 30 e 40.
– Eram máquinas designadas para resolver
problemas numéricos e conhecidas como
calculadoras eletrônicas.
– Destinavam-se exclusivamente para cálculo
numérico.
Linguagens numéricas

 No começo dos anos 50, a notação


simbólica começou a surgir.
– Liderados por Grace Hoper e John Backus teve-
se o desenvolvimento de uma linguagem de
máquina executável designada para compilar
operações aritméticas simples.
Linguagens numéricas

 O grande avanço na verdade ocorreu de 1955 a


1957 quando Backus liderou uma equipe para o
desenvolvimento do Fortran, acrônimo de FORmula
TRANslator.
– Objetivo inicial também era orientado para cálculos
numéricos, mas já incluía estruturas de controle com o uso
de expressões condicionais, usando da entrada e saída de
dados.
Linguagens numéricas

 FORTRAN teve tanto  Diferentes revisões para o


sucesso que mudou o FORTRAN:
conceito de programação – FORTRAN
até então substituindo – FORTRAN II (1958)
muitas linguagens. – FORTRAN IV (alguns anos
depois)
– FORTRAN 66
– FORTRAN 77
– FORTRAN 90
Linguagens numéricas

 Devido ao sucesso do FORTRAN e receio


da dominação da indústria pela IBM a
Sociedade Alemã de Matemática Aplicada
(GAMM) organizou um comitê para
desenvolver uma linguagem universal.
– ALGOrithmic Language (Algol) ou Algol 58 (Algol
60).
Linguagens numéricas

 Algol tinha diferentes objetivos:


– A notação deveria ser próxima a lógica matemática
– Deveria ser útil para a descrição de algoritmos
– Programas em Algol deveriam ser compiláveis em
linguagem de máquina
– Algol não deveria ser vinculado a uma arquitetura de
computador específica.
Linguagens numéricas

 Para permitir essa independência, nenhuma


entrada ou saída estava incluída na
linguagem; procedimentos especiais
poderiam ser escritos para essas operações.
– Para garantir a independência de algum
hardware em específico, cada implementação
poderia ser incompatível com outro.
Linguagens numéricas

 Algol nunca atingiu sucesso comercial nos


EUA
– Algum sucesso na Europa
 No entanto causou influência no cenário.
– Exemplo: desenvolvimento de um técnica que
permitia avaliação de expressões matemáticas
sem parênteses, usando um processo de
avaliação baseado em pilhas.
Linguagens numéricas

 Nesse momento a historia começa a divergir


– Através dos conceitos herdados começou-se
novos paradigmas:
 Classes C++ e posteriormente C (1980)
 Pascal (1968 – 1970)
Linguagens de negócio

 Processamento de dados foi desde cedo


uma aplicação de domínio depois dos
cálculos numéricos.
– Em 1955 tem se a linguagem FLOWMATIC, com
o objetivo de desenvolver aplicações de negócio
usando uma espécie de formulários.
Linguagens de negócio

 Em 1959 o Departamento de Defesa americano


trabalhava para desenvolver uma linguagem
melhorada.
– Após muitas divergências, foi publicada em 1960, a
COmmon Business Oriented Language – COBOL.
– Cobol foi revisado em 1961 e 1962, padronizada em 1968 e
revisada novamente em 1974 e 1984.
Linguagens para inteligência
artificial

 Este campo teve início em meados de 1950


com a Rand Corporation através da IPL
(Linguagem de Processamento de
Informações)
– IPL-V foi concebida, amplamente usada, mas
extremamente limitada a um design de baixo
nível.
Linguagens para inteligência
artificial

 O maior avanço no setor ocorreu quando


John McCarthy (MIT) desenvolveu LISP (LIst
PRocessing) para o IBM 704.
– LISP 1.5 tornou-se a linguagem padrão por
muitos anos.
– Evolução continuada.
Linguagens para inteligência
artificial

 LISP foi designada como uma linguagem


funcional de processamento de listas (list-
processing)
– O problema usual para LISP envolvia pesquisas.
Linguagens para inteligência
artificial

 Jogos foram um bom teste para a linguagem


LISP, onde desenvolvia-se uma arvore de
possibilidades e então o usuário poderia
navegar pela melhor possibilidade ou
estratégia.
Linguagens para inteligência
artificial

 Um paradigma alternativo foi o


processamento de strings envolvendo a
transformação de texto para um outro
formato qualquer.
– Tradução automática, onde símbolos são
substituídos por outros é uma aplicação natural.
(COMIT)
Linguagens para inteligência
artificial

 LISP foi designada com um propósito mais


geral.
– PROLOG despontava como uma linguagem com
objetivo específico para o controle de estruturas e
implementação de estratégias mas baseado nos
conceitos de matemática lógica.
Linguagens de Sistema

 Devido a necessidade de eficiência, o uso da


linguagem assembly permaneceu por muito
tempo, mesmo com a utilização de
linguagens de alto nível
– Muitos sistemas de programação (CPL/BCPL)
foram desenvolvidos, mas nunca amplamente
usados.
Linguagens de Sistema

 A linguagem C, mudou tudo isso.


– Com o desenvolvimento de um ambiente
competitivo em UNIX com quase que a totalidade
escrita em C durante os anos 70, linguagens alto-
nível tem mostrado ser efetivas neste ambiente,
assim como em outros.
Níveis de abstração

 Quando definimos nível de abstração,


entramos numa questão delicada, pois há
um tremendo mal entendido sobre o que
seja uma linguagem de alto nível.
– A linguagem C é uma linguagem de alto nível,
pois abstrai do funcionamento da máquina, se
aproximando da linguagem matemática. No
entanto pessoas com dificuldade em
matemática não entendem isso.
Níveis de abstração

 Linguagens de alto nível


– C, C++, Delphi, Pascal, Fortran, JAVA,...
 Facilitam a comunicação dos seres
humanos com a máquina, sendo
linguagens mais próximas dos
humanos.
– Devem ser convertidas em linguagem de
máquina para serem executadas.
Tipos de «tradução»

 Há muitas variações de como a


tradução de uma linguagem de mais
alto nível para a linguagem de máquina
é feita.
– Montagem
– Compilação
– Interpretação
– Dentre outros..
Montagem

 A mais simples é a montagem, que é


quando cada instrução da linguagem
de mais alto nível é traduzida
diretamente para uma instrução da
linguagem de máquina. O programa
que faz esta montagem é chamado
montador. Ex.: Assembly.
Compilação

 Um pouco mais complicada é a


compilação: a partir do programa em
linguagem de mais alto nível é gerado
um programa de mais baixo nível
equivalente, que é montado, gerando o
código objeto (programa em código de
máquina). Ex.: C.
Compilação

 Na compilação há em geral mais de um


programa trabalhando, basicamente o
compilador, que gera um objeto que faz
chamadas a procedimentos que não possui,
e o linkeditor, que liga ao objeto outros
objetos, chamados bibliotecas, que possuem
os procedimentos necessários, gerando o
objeto final ou código de máquina.
Interpretação

 Outra alternativa é a interpretação. Há


um programa chamado interpretador
que funciona como se fosse uma
máquina virtual, com suas próprias
instruções, e o programa é feito usando
tais instruções. Ex.: Tcl/Tk.
Compilação x Interpretação

 Tradução (Compilação)
– Programa completo de alto nível é primeiro
convertido para a linguagem de máquina para
então ser executado. Ex. C, Pascal.
 Interpretação
– Depois de cada instrução de alto nível ser
examinada e decodificada, ela é executada
imediatamente. Ex. Haskell.
 Métodos Híbridos
– Java
Manipulação de dados

 A principal parte da programação é a manipulação


de dados: armazenamento, leitura e alteração. Para
armazenamento e leitura usamos posições de
memória e registradores do processador.
– Em linguagens de mais baixo nível, usamos os próprios
endereços de memória e o nomes do registrador, mas
em linguagens de nível mais alto, usamos variáveis, que
são «apelidos» para tais endereços e nomes. Também é
necessário saber que quantidade de memória cada dado
ocupa e como ele deve se comporta. Isso é chamado
tipagem.
Paradigmas de programação

 Definição:forma como o
programador enxerga a solução do
problema. Tem mais a haver com
a estruturação.
– Em outras palavras, paradigma é a
metodologia de solução.
Paradigmas de programação

 Inicialmente os programadores não se


preocupavam com paradigma algum. Os
programas eram simples seqüências de
procedimentos.
– Hoje em dia chamamos isso de programação
seqüencial e exclui automaticamente todos os
demais paradigmas.
– Mais tarde foi desenvolvido o paradigma
procedimental e a programação estruturada.
Programação estruturada

 Programação estruturada é baseada na


estruturação do código. A idéia é que o
programa seja divido em pequenos
procedimentos estruturados, chamados
subrotinas ou funções.
– O programa é desenvolvido a partir das funções
mais abstratas e terminando pelas mais
específicas (desenvolvimento top-down).
– Deu origem à modularização e à programação
procedimental.
Programação procedimental

 Erroneamente chamada programação


procedural (procedural é procedimental em
inglês), programação procedimental é a
programação baseada em procedimentos.
– O conceito é usado normalmente em oposição a
programação funcional e às vezes se confunde
com programação estruturada ou com
programação imperativa.
Programação orientada a objetos

 Na orientação a objetos o programa não se baseia


em procedimentos, mas na relação entre objetos.
 Objetos são representações de «coisas» que
executam funções (chamadas métodos). Estas
«coisas» são quase microuniversos independentes.
– Da interação entre os objetos resulta a solução do
problema proposto. Por exemplo, uma porta é um objeto
que, através de sua interação com o portal, a tranca e a
chave permite que determinadas pessoas entram e saiam
enquanto outras não.
Programação orientada a objetos

 Problemas em conceituação: os
evangelizadores da desinformação pregam
que a orientação a objetos exclui outros
paradigmas e que seja o paradigma
definitivo, no entanto não é possível usar
orientação a objetos sem programação
estruturada, ou seja, o código precisa estar
estruturado para ser orientado a objetos.
Programação orientada a eventos

 A orientação a eventos pressupõe a


orientação a objetos, pois implica em criar
objetos que reajam a determinados eventos.
 Geralmente é criado loop principal que
intercepta os eventos, repassando-os para
os objetos registrados. Algumas linguagens
(ou módulos) oferecem uma implementação
pronta do loop principal.
Paradigmas de programação

 Em tese pode haver tantos paradigmas


quanto programadores, visto que paradigma
é a forma como o programador vê a solução
do programa.
 Apenas alguns dos mais clássicos são:
– Programação declarativa
– Programação restritiva × programação lógica
– Orientação a aspecto
– Programação genérica
Revisão

 Definições
– Algoritmos / programas de computador
– Linguagens de programação
– Níveis de abstração
– Tipos de <<tradução>>
– Paradigmas de programação
 Escreva
um algoritmo que leia três
números e imprima o maior deles.
 Uma empresa paga R10.00 por hora
normal trabalhada e R$ 15.00 por hora
extra.
– Escreva um programa que leia o total de
horas normais e o total de horas extras
trabalhadas por um empregado em um
ano e calcule o salário anual deste
trabalhador. (40 h/semanais)

Você também pode gostar