Capítulo 2
Recapitulação
2.0
Estruturas de Dados - Definição
-
Estruturas de Dados é
a disciplina que estuda as técnicas computacionais para a organização
e manipulação eficiente de quaisquer quantidades de informação.
Estruturas de Dados - 2 Aspectos:
-
Em um projeto de software, 2 aspectos devem
ser considerados para sua implementação:
-
De que forma estão organizados os dados,
qual a sua estrutura.
-
Quais procedimentos atuam sobre estes dados,
que operações podem ser realizadas sobre eles.
-
Ao estudar estruturas de dados teremos sempre
este par:
-
Um conjunto estruturado de informações
-
Uma classe de objetos ou um
tipo de dados.
-
Um conjunto definido de operações
sobre estes dados:
-
Um conjunto de métodos
ou funções.
2.1
Pilhas usando Vetores
-
Vetores possuem um espaço limitado
para armazenamento de dados.
-
Necessitamos definir um espaço grande
o suficiente para a nossa pilha.
-
Necessitamos de um indicador de qual elemento
do vetor é o atual topo da pilha.
Implementação
de Pilhas utilizando Programação Estruturada
-
Implementaremos a Estrutura de Dados Pilha
utilizando a técnica da Programação Estruturada.
-
Progr. Estr.: Inventada por
Niklaus Wirth (década 70) Também chamada de "Programação
sem GoTo"
-
Procedimento Didático:
-
Revisão/introdução
da Programação Estruturada
-
Modelagem da Pilha e de seus
algoritmos usando esta técnica.
2.1.1
Programação Estruturada
-
Baseada na expressão de algoritmos
única e exclusivamente através de 4 grupos de estruturas
de controle:
-
Bloco:
Comando ou conjunto de comandos
sempre executados em seqüência.
Ex (pascal): begin
? end;
-
Estrutura condicional:
SE-ENTÃO-SENÃO
Ex (pascal): if
(cond) then bloco1 else bloco2;
-
Estrutura de repetição:
ENQUANTO COND FAÇA BLOCO
Ex (pascal): while
(cond) do bloco;
-
Estrutura de abstração:
Procedimento ou Função.
Agrupamento de comandos
com um nome e eventualmente também parâmetros nomeados.
-
Para nós parece um retrocesso.
-
Na época:
-
Fazia-se programas completamente
ininteligíveis,
-
Foi um grande avanço
no sentido de:
-
se produzir código mais
fácil de se manter e entender e
-
com mais qualidade.
-
A Programação Estruturada definiu:
-
Uma nova disciplina na programação
-
Um novo grupo de linguagens
de programaçao, a 3ª Geração.
-
Exemplos: Pascal, Algol, C,
PL/1
-
Ainda utilizadíssima hoje em dia:
-
Sistemas Operacionais
-
Análise Numérica/Computação
Gráfica
-
Redes de Computadores
Na
Programação Estruturada:
-
Não existem objetos:
-
Dados e seu comportamento são
considerados em separado.
-
Unificar uma estrutura de dados
com as operações definidas sobre a mesma é função
do programador.
-
Existem variáveis e tipos (dados):
-
Variáveis podem ser globais
ou locais (escopo).
-
Tipos podem ser primitivos,
derivados ou estruturados.
-
Existem procedimentos e funções
(comportamento):
-
Conjunto de comandos referenciados
por um nome.
-
Um procedimento é especial
e se chama Programa Principal.
Programação Estruturada
- Aspecto Estrutural dos Dados
-
Modelamos as estruturas de dados propriamente
ditas como um tipo estruturado:
-
Estrutura é uma coleção
de variáveis referenciada por um mesmo nome.
-
Imagine um objeto sem métodos.
-
Chamamos a cada elemento dessa
coleção de campo.
-
Algoritmicamente:
tipo Empregado {
caracter nome[100];
caracter cargo[20];
caracter endereço[200];
inteiro salario;
};
Variáveis
Empregado chefe;
Programação Estruturada
- Aspecto Funcional
-
Modelamos as operações sobre
uma estrutura de dados como procedimentos ou funções
-
Variáveis globais valem
dentro de qualquer função (escopo
global).
-
Antes de vermos alocação
dinâmica de memória e ponteiros vamos trabalhar com funções
sem alguns parâmetros.
-
Algoritmicamente:
Variáveis
Empregado chefe;
Procedimento baixaSalario (inteiro
porcentagem)
variaveis
real auxiliar;
início
auxiliar <- chefe.salario * porcentagem;
chefe.salário <- chefe.salario
- auxiliar;
fim;
2.1.2
Modelagem da Pilha em Programação Estruturada
-
Aspecto Estrutural:
-
Necessitamos de um vetor para
armazenar as informações.
-
Necessitamos de um indicador
da posição atual do topo da pilha.
-
Necessitamos de uma constante
que nos diga quando a pilha está cheia e duas outras para codificar
erros.
-
Pseudo-código:
constantes Maxpilha = 100;
tipo Pilha {
inteiro dados[Maxpilha];
inteiro topo;
};
Modelagem da Pilha
-
Colocar e retirar dados da pilha.
-
Testar se a pilha está
vazia ou cheia.
-
Inicializar
-
Colocar e retirar dados da pilha:
-
Empilha(dado)
-
Desempilha(dado)
-
Topo
-
Testar se a pilha está vazia ou cheia:
-
Inicializar ou limpar:
Algoritmo InicializaPilha
FUNÇÃO inicializaPilha()
início
aPilha.topo <-
-1;
fim;
-
bservação: Este e os próximos
algoritmos pressupõem que foi definida uma variável global
tipo Pilha denominada aPilha.
Algoritmo PilhaCheia
Booleano FUNÇÃO
pilhaCheia()
início
SE (aPilha.topo
= Maxpilha - 1) ENTÃO
RETORNE(Verdade)
SENÃO
RETORNE(Falso);
fim;
Algoritmo PilhaVazia
Booleano FUNÇÃO
pilhaVazia()
início
SE (aPilha.topo
= -1) ENTÃO
RETORNE(Verdade)
SENÃO
RETORNE(Falso);
fim;
Algoritmo Empilha
Constantes
ErroPilhaCheia
= -1;
ErroPilhaVazia = -2;
Inteiro FUNÇÃO
empilha(inteiro dado)
início
SE (pilhaCheia)
ENTÃO
RETORNE(ErroPilhaCheia);
SENÃO
aPilha.topo <-
aPilha.topo + 1.
aPilha.dados[aPilha.topo]
<- dado;
RETORNE(aPilha.topo);
FIM SE
fim;
Algoritmo Desempilha
Inteiro FUNÇÃO
desempilha()
início
SE (pilhaVazia)
ENTÃO
RETORNE(ErroPilhaVazia);
SENÃO
aPilha.topo <-
aPilha.topo - 1;
RETORNE(aPilha.topo);
FIM SE
fim;
Algoritmo Desempilha - Variante
Inteiro FUNÇÃO
desempilha()
início
SE (pilhaVazia)
ENTÃO
ESCREVA("ERRO:
Pilha vazia ao tentar desempilhar!");
RETORNE(ErroPilhaVazia);
SENÃO
aPilha.topo <-
aPilha.topo - 1;
RETORNE(aPilha.dados[aPilha.topo]);
FIM SE
fim;
Algoritmo Topo
Inteiro FUNÇÃO
topo()
início
SE (pilhaVazia)
ENTÃO
ESCREVA("ERRO:Pilha
vazia ao acessar!");
RETORNE(ErroPilhaVazia);
SENÃO
RETORNE(aPilha.dados[aPilha.topo]);
FIM SE
fim;
2.1.3
Pilha - Implementação em "C"
-
Modelagem dos dados:
#define Maxpilha 100
#define ErroPilhaCheia -1
#define ErroPilhaVazia -2
/* define estrutura
de um tipo pilha */
struct estruturaDaPilha {
int dados[Maxpilha];
int topo;
};
/* declara o tipo
Pilha com a estrutura dada */
typedef struct estruturaDaPilha Pilha;
-
Codificação:
-
Código de definição
de tipos e constantes são sempre colocados em arquivos cabeçalho
(headerfiles).
-
Estes arquivos têm sempre
o sufixo .h
-
Exemplo: pilha.h
-
Para carregar as definições
utilizamos a diretiva de compilação #include no programa
que for utilizar aquele tipo:
#include <stdio.h>
#include "pilha.h"
-
Modelagem das operações:
/* Função
que empilha dados em Pilha de Inteiros */
/* Parametros:
*/
/* dado: o dado
que vai ser empilhado.
*/
int empilha(int dado)
{
IF ( pilhaCheia()
)
{ RETURN(ErroPilhaCheia); }
ELSE
{
aPilha.topo = aPilha.topo + 1;
aPilha.dados[aPilha.topo] = dado;
RETURN(aPilha.topo);
}
}
Pilha - Exemplo de Programa
Principal em "C"
/* Aplicacao:
Leitura de Dados Int. do Usuário e */
/* Armazenamento
em uma Pilha. */
/* PROGRAMA PRINCIPAL
*/
main()
{
char tecla = ´a´;
int dado;
WHILE ( tecla !=
´f´ )
{
printf("\nDigite E p/empilhar, D p/desempilhar \n");
printf("Digite M para mostra pilha e F p/fim \n");
tecla = getchar();
getchar(); /* Ler o [enter] */
SWITCH (tecla) {
´E´: { printf("Digite o vaor p/empilhar:
");
scanf("%d%", &dado); /* Não esqueça do & */
if (empilha(dado) < 0)
{ printf("Erro: Pilha cheia! \n"); }
}
- - - -
} /* fim switch */
} /*
fim while */
}
Pilha - Forma geral de
um programa "C":
#include <cabeçalhos-padrão>
#include "cabeçalhos específicos"
função1()
- - -
- - -
- - -
funçãoN()
- - -
- - -
- - -
main()
{
- - -
- - -
- - -
}
Headerfiles nunca
possuem comandos, somente definições
Headerfiles sempre são
incluídos.
Contém todas as definições.
Arquivos de programa (comandos):
Nunca
são incluídos
Nunca possuem diretivas #define
Arquivos de programa sempre
têm sufixo .c
Mais tarde veremos:
Como utilizar mais de um arquivo
.c (módulos)
Como garantir que definições
não sejam repetidas com as diretivas #ifndef e #ifdef
Pilha - Compilação
"C"
gcc -g -o <executavel> arq1.c arq2.c ? arqN.c
-
Parâmetros:
-
-g indica ao compilador
para gerar código debugável
-
-o nome do arquivo executável
que será gerado
Pilhas com Vetores - Roteiro
de Laboratório
-
Revisão da Modelagem e Implementação.
-
Utilização do Unix
-
Diretórios, donos de
diretórios, startx
-
Manpages. Exemplos com getchar()
e scanf(?)
-
Xman
-
FTP:
-
Como transferir arquivos de
e para a rede inf.
-
Edição de Programas usando Xemacs
-
Como eu chamo
-
Como editar
-
Como compilar
-
Como debugar