segunda-feira, 29 de outubro de 2012

Reflexão Final do Módulo 6


Nesta reflexão constam todos os conteúdos, de uma forma resumida, que foram abordados ao longo do módulo 6 na disciplina de Programação de Sistemas Informáticos.

Ao longo deste módulo aprendi o conceito de ponteiros, pois seria com eles que iria trabalhar ao longo de todo o módulo. Em seguida realizei pequenos programas para aprender a utilizar os ponteiros.
Depois de sabermos minimamente trabalhar com ponteiros passamos para as pilhas, que são um tipo de estruturas dinâmicas pois permitem poupar memória e eliminar dados. Realizei vários exercícios que me ajudaram a perceber melhor as pilhas.
Depois de várias aulas a trabalhar com pilhas passamos para as filas, também elas um tipo de estruturas dinâmicas. Ao longo deste tema efectuei vários exercícios que me serviram de auxílio para aprender a trabalhar com filas.
Em seguida passamos para a parte mais difícil mas mais importante, as listas ordenadas, que permitem remover elementos em qualquer parte da lista. Para mim foi o tema mais difícil deste módulo mas percebi tudo muito bem pois realizei vários exercícios que facilitaram a minha aprendizagem. 

quinta-feira, 18 de outubro de 2012

O que são estruturas dinâmicas?

Em programação, uma variável ou estrutura de dados diz-se dinâmica quando pode ser criada e destruída no decurso de um programa, consoante as necessidades de tratamento de informação.

Existem 3 tipos de estruturas dinâmicas:


  • Pilhas
É uma estrutura de dados que corresponde a uma lista sequencial. Respeita a propriedade LIFO (Last In First Out), ou seja, o último a entrar é o primeiro a sair.
Program Pilha ;
type dados=record
                nome:string;
                idade:integer;
                prox:^dados;
end;
var p1,px:^dados;
    x:char;
    y,i:integer;
procedure inserir;
Begin
      p1:=nil;
                new(px);
                writeln('Nome: ');
                read(px^.nome);
                writeln('Idade: ');
                read(px^.idade);
                px^.prox:=p1;
                p1:=px;
end;
procedure listar;
begin
px:=p1;
repeat
                writeln('Nome: ',px^.nome);
                writeln('Idade: ',px^.idade);
                px:=px^.prox;
until px=nil;
end;
procedure eliminar;
begin
px:=p1;
if px<>nil then
                begin
                               p1:=px^.prox;
                               dispose(px);
     end
else
                writeln('Pilha vazia');
end;
begin
                p1:=nil;
     repeat
                writeln('1-para inserir dados.');
                writeln('2-para mostrar dados.');
                writeln('3-para eliminar dados.');
                writeln('Qual a opoção');
                read(y);
                case y of
                               1:inserir;
                               2:listar;
                               3:eliminar;
                end;
                               writeln('Deseja continuar?(S-N)');
                               read(x);
                until(x='n') or (x='N');   
 End.

  • Filas
Os elementos entram sempre na cauda da estrutura e o próximo elemento a sair é sempre o que se situa na frente da fila. Respeita a propriedade FIFO (First In First Out), ou seja, o primeiro a entrar é o primeiro a sair.
Program fila ;
type pessoa=record
                nome:string;
                idade:integer;
                peso:real;
                prox:^pessoa;
end;
var cauda,frente,px:^pessoa;
    x:char;
    y:integer;
 procedure inserir;
 begin
                new(px);
                writeln('Nome:');
                read(px^.nome);
                writeln('Idade:');
                read(px^.idade);
                writeln('Peso:');
                read(px^.peso);
                if frente=nil then
                begin
                               frente:=px;
                               cauda:=px;
                end
                else
                begin
                               cauda^.prox:=px;
                               cauda:=px;
                               cauda^.prox:=nil;
                end;
 end;
 procedure percorrer;
 begin
                px:=frente;
                if px=nil then
                               writeln('Pilha vazia')
                else
                begin
                               repeat
                                               writeln('Nome: ',px^.nome);
                                               writeln('Idade: ',px^.idade);
                                               writeln('Peso: ',px^.peso);
                                               px:=px^.prox;
                               until (px=nil);
                end;
 end;
 procedure eliminar;
 begin
                px:=frente;
                if px=nil then
                               writeln('Pilha vazia')
                else
                begin
                               px:=frente;
                               frente:=frente^.prox;
                               dispose(px)
                end;
 end;    
 Begin
      cauda:=nil;
      frente:=nil;
      repeat
                writeln('1-para inserir dados.');
                writeln('2-para mostrar dados.');
                writeln('3-para eliminar dados.');
                writeln('Qual a opoção');
                read(y);
                case y of
                               1:inserir;
                               2:percorrer;
                               3:eliminar;
                end;
                               writeln('Deseja continuar?(S-N)');
                               read(x);
                until(x='n') or (x='N');   
 End.


  • Listas Ordenadas
Os elementos devem ficar por ordem alfabética ou por ordem crescente ou decrescente dos seus valores. Neste caso podemos remover um elemento em qualquer lugar da lista. 
Program lista_ordenada;
type lista=record
                nome:string;
                ponteiro:^lista;
end;
var px,pz,p1,p2:^lista;
    escolha, OP:char;

procedure inserir;            
 Begin
                new(px);
                writeln('Introduza o nome');
                read(px^.nome);
                px^.ponteiro:=pz;
                pz:=px;  
 End;
 procedure listar;
 begin
  px:=pz;
   If px=nil then
                  writeln('A lista está vazia')
   else
                  begin
                                  repeat
                                                 writeln('Nome - ', px^.nome);
                                                 px:=px^.ponteiro
                                 until px=nil;
                  end;
 end;
 procedure ordenar;
 var trocar: boolean;
 aux:string;
 begin
 P1:=Pz;
 P2:=Pz^.PONTEIRO;
                IF (pz <> nil) and (pz^.ponteiro <> nil) then
                               repeat
                                               trocar:=false;
                                               p1:=pz;
                                               p2:=pz^.ponteiro;
                                               repeat
                                                                              if p1^.nome>p2^.nome then
                                                                                              begin
                                                                                                              trocar:=true;
                                                                                                              aux:=p1^.nome;
                                                                                                              p1^.nome := p2^.nome;
                                                                                                              p2^.nome:=aux;
                                                                                              end;
                                                                                              p1:=p1^.ponteiro;
                                                                                              p2:=p2^.ponteiro;
                                                               until p1^.ponteiro = nil;
                               until not trocar
                else
                               begin
                                               if p1=nil then
                                                               writeln('Lista vazia');
                                               if p1^.ponteiro=nil then
                                                               Writeln('Só existem 1 elementos');
                               end;                                                                                                                  
 end;
 procedure remover;
 var pa:^lista;dado:string;
 begin
                if pz<>nil then
                begin
                               writeln('Introduza o dado a eliminar');
                               read(dado);
                               pa:=nil;
                               px:=pz;
                               while (px<>nil) and (px^.nome<>dado) do
                               begin
                                               pa:=px;
                                               px:=px^.ponteiro;
                               end;
                               if px=nil then
                                               writeln(dado,' não se encontra na lista')
                               else
                                               begin
                                                               if pa=nil then    
                                                                              pz:=px^.ponteiro
                                                               else
                                                                              pa^.ponteiro:=px^.ponteiro;
                                               dispose(px);
                                               writeln(dado,' foi removido da lista');
                                               end;
                end
                else
                               writeln('Lista vazia');
 end;    
 begin
                pz:=nil;
                               repeat
                                               writeln('1-Inserir');
                                               writeln('2-Listar');
                                               writeln('3-Sair');
                                               writeln('4-Apagar');
                                               writeln('Qual a opção?');
                                               readln(op);
                                                               case op of
                                                                              '1':Begin inserir; ordenar; end;
                                                                              '2':listar;
                                                                              '4':remover;
                                                               end;
                                               writeln('Deseja continuar??');
                                               Readln(escolha);
                               until(escolha='N') or (escolha='n');
 end.


Nota: Para preencher uma lista ordenada utiliza-se o mesmo processo que utiliza para uma pilha.

Reflexão:
As estruturas dinâmicas foram a base deste módulo. Aprendi a realizar filas, pilhas e listas ordenadas.  

Conceito de ponteiros

Um ponteiro ou apontador é um tipo especial de variável que é capaz de receber um endereço de memória RAM relativo a um determinado tipo de dados (simples ou estruturados) e ficar como que a apontar para ele.

Como declarar num ponteiro diretamente como variável;

  • Nome_var:^Tipo_base;
Como declarar num ponteiro antecedido da declaração de um tipo:
  • Type Nome_tipo:=^Tipo_base;
Reflexão:
Neste módulo aprendi o conceito de ponteiros, como utiliza-los e qual a sua função.