sábado, 6 de fevereiro de 2010

Listas, Pilhas e Filas

Listas, Pilhas e Filas

As estruturas de dados dinâmicas mais simples em programação são as Listas. Essas estruturas são utilizadas quando a quantidade de elementos armazenados na estrutura não é previamente conhecida.

Por exemplo, podemos pensar numa biblioteca que irá cadastrar seus livros. A principio, seria possível utilizar um simples vetor de livros, ilustrado na Figura 1, para realizar essa tarefa.



Figura 1. Vetor de livros

Existem três problemas principais nessa solução:

  • Até que o vetor seja totalmente preenchido, haverá desperdício de memória.

  • Quando o vetor é totalmente preenchido nenhum novo livro poderá ser cadastrado.

  • Caso algum livro seja excluído esse vetor possuirá espaços vazios.

Para solucionar esse problema, podemos criar uma lista dinâmica. Nesse caso, a lista de livros poderá crescer e diminuir durante a execução do programa. Retomando o exemplo do livro, imagine que cada livro cadastrado utilize 1 Kbyte de memória dinâmica (não sabe o que é memória dinâmica?) e que há um vetor de seis posições. A Figura 2 ilustra a diferença no uso de memória entre uma implementação de lista usando um vetor estático e uma lista dinâmica.






Figura 2. Vetor estático Vs. uma lista dinâmica

Para implementação de uma lista dinâmica, cada nó é alocado na memória dinâmica e possui um ponteiro para o próximo elemento da lista. Além disso, essa implementação deve possuir um conjunto básico de métodos:

  • Inserir nó: esse método deve alocar uma área em memória para o novo nó e apontar o ponteiro do último nó para esse novo nó.

  • Encontrar nó: em listas simples, esse método deverá percorrer a lista inteira no pior caso.

  • Excluir nó: utiliza o método anterior e libera a memória correspondente. Além disso, deve

Tradicionalmente, listas dinâmicas são implementadas através de estruturas (não sabe o que é estrutura?) ou registros (não sabe o que é registro?) armazenadas na memória dinâmica. A estrutura que implementa um nó de uma lista deve incluir, além do conteúdo da informação do nó, um ponteiro para o próximo nó. Tipicamente, a definição da estrutura é da forma:

Listagem 1. Código em C

typedef struct noh {
struct noh* proximo;
} noh;

Listagem 2. Código em Pascal

Type noh=record
noh: proximo;
end

Cada nó de um lista é de memória dinâmica através de suas rotinas de alocação dinâmica de memória, que estão presentes na biblioteca padrão da linguagem. Há duas atividades básicas relacionadas à manipulação desta área:

  • Requisitar uma área de memória dentro do espaço livre disponível

  • Liberar uma área de memória

Em C, a alocação de memória é suportada pela rotina malloc (não conhece malloc?). Esta rotina recebe como argumento a quantidade em bytes que deverá ser alocada. Por isso utilizamos também a função sizeof que irá retornar o número de bytes ocupados por um tipo. O valor de retorno do malloc é o endereço do início da área que o sistema operacional alocou. Por exemplo, para reservar o espaço necessário para o nó de uma lista, seria necessário ter inicialmente declarado a variável que receberá o ponteiro para um nó:

noh *area;
area = malloc(sizeof(struct noh));

Para liberar uma área alocada por malloc, a rotina free deve ser utilizada. Assim, o exemplo acima poderia ser complementado da seguinte forma:

free(area);

Em Pascal, vamos utilizar a função new (não conhece a função new?), que aloca um espaço em memória para a variável recebida como argumento. A função para liberação de memória em Pascal é a função dispose.

var area : noh;
new(area);
d
ispose(area);

Filas e pilhas são estruturas usualmente implementadas através de listas, adicionando regras ao métodos de manipulação dos nós dessa lista.

Uma fila (queue) tipicamente estabelece uma política FIFO -- first in, first out -- de acesso aos dados. Em outras palavras, a ordem estabelecida na lista é a ordem de inserção. No momento de retirar um nó da lista, o nó mais antigo (o primeiro que entrou) é o primeiro a ser retirado.

Uma pilha (stack), por outro lado, estabelece uma política LIFO -- last in, first out. Uma estrutura de pilha também oferece basicamente duas operações de manipulação, PUSH, para inserção no topo da pilha, e POP, para retirada do topo da pilha.

Exercícios

  1. Crie uma lista para armazenamento de alunos de uma faculdade.
  1. Implemente uma função que tenha como valor de retorno o comprimento de uma lista, isto é, calcule o número de nós da lista.

  2. Escreva um algoritmo que inverta a ordem dos elementos dessa lista.

  3. Escreva uma função que receba uma lista encadeada terminada em NULL e devolva a soma das chaves dos nodes da lista. Escreva duas versões: uma iterativa e uma recursiva.

  4. Transforme essa lista em uma fila.

  5. Transforme essa lista em uma pilha.

  6. Escreva uma função que construa um vetor inteiro com o mesmo "conteúdo" de uma lista encadeada dada: o primeiro elemento do vetor deve ter o mesmo valor que o item do primeiro nó, o segundo elemento do vetor deve ter o mesmo valor que o item do segundo nó etc. Planeje com cuidado a "entrada" e a "saída" da sua função.


sexta-feira, 5 de fevereiro de 2010

Sexta-feira (Pesquisa e Ordenação)

Caros alunos,

como apresentado na aula de hoje, por favor sigam meus updates através desse Blog. As atividades de hoje são:

- Apresentações (meu nome é Luiz, não se esqueçam! hahaha)
- Nossa matéria é Pesquisa e Ordenação, cujo o planograma vocês podem requisitar enviando um email para lhzsantana@uninove.br.
- Em nossas aulas, vamos utilizar os programas
Dev C/C++:
www.bloodshed.net/devcpp.html
Free Pascal: http://www.freepascal.eti.br/

- Eu gostaria que vocês preenchessem a seguinte pesquisa de perfil:
http://www.surveymonkey.com/s/PMP8KDD

- Além disso, vamos tentar fazer os seguintes exercícios:

1. Faça um programa em C que receba do teclado a cotação atual do Dólar em relação ao Real e um valor, que deverá ser convertido de Real para Dólar. Faça a conversão do valor, baseado na cotação atual, e apresente o valor em Dólar para o usuário.

2. Crie um programa em C
para uma escola, para armazenamento dos dados de seus alunos, utilizando uma estrutura com os seguintes membros: nome, idade e telefone. Utilize o conceito de vetor de estruturas para armazenar até 20 alunos.

3. Escreva um programa que leia duas cadeias de caracteres e concatene a segunda cadeia ao final da primeira, e escreva essa cadeia em um arquivo.

quinta-feira, 4 de fevereiro de 2010

Quinta-feira (Pesquisa e Ordenação)

Caros alunos,

como apresentado na aula de hoje, por favor sigam meus updates através desse Blog. As atividades de hoje são:

- Apresentações (meu nome é Luiz, não se esqueçam! hahaha)
- Nossa matéria é Pesquisa e Ordenação, cujo o planograma vocês podem requisitar enviando um email para lhzsantana@uninove.br.
- Em nossas aulas, vamos utilizar os programas
Dev C/C++:
www.bloodshed.net/devcpp.html
Free Pascal: http://www.freepascal.eti.br/

- Eu gostaria que vocês preenchessem a seguinte pesquisa de perfil:
http://www.surveymonkey.com/s/337839T

- Além disso, vamos tentar fazer os seguintes exercícios:

1. Faça um programa em C que receba do teclado a cotação atual do Dólar em relação ao Real e um valor, que deverá ser convertido de Real para Dólar. Faça a conversão do valor, baseado na cotação atual, e apresente o valor em Dólar para o usuário.

2. Crie um programa em C
para uma escola, para armazenamento dos dados de seus alunos, utilizando uma estrutura com os seguintes membros: nome, idade e telefone. Utilize o conceito de vetor de estruturas para armazenar até 20 alunos.

3. Escreva um programa que leia duas cadeias de caracteres e concatene a segunda cadeia ao final da primeira, e escreva essa cadeia em um arquivo.

quarta-feira, 3 de fevereiro de 2010

Web 2.0 e PBL

Há muito tempo venho pensando nesse assunto e já publiquei alguns artigos com esse texto. Eu acreito que a Web 2.0 seja a ferramenta ideal para as necessidades do Problem-based Learning (PBL).

Web 2.0 é o termo cunhado por Tim O’Reilly para designar uma nova geração de serviços baseados na Web. Segundo sua definição a Web 2.0 é a mudança para uma internet como plataforma, onde os aplicativos aproveitem os efeitos de rede para se tornarem melhores quanto mais são usados pelas pessoas, aproveitando a inteligência coletiva Em outro artigo, o mesmo Tim O’Reilly sugere algumas regras que ajudam a definir a Web 2.0:

a) beta perpétuo: o software não é mais um artefato, mas um comprometimento dos desenvolvedores com os usuários;

b) pequenas peças frouxamente unidas: dados e serviços de uma aplicação devem ser reutilizados por outras, e devem reutilizar dados e serviços de outras aplicações sempre que possível;

c) software acima do nível de um único dispositivo: os aplicativos não estão no cliente ou servidor, mas no espaço entre eles;

d)l lei da conservação de lucros de Clayton Christensen: num ambiente de rede, APIs abertas e protocolos padrões vencem, sem que se perca a vantagem competitiva;

e) dados são o novo “Intel inside”: a mais importante vantagem competitiva será os dados.

A última regra talvez represente o maior impacto causado pela Web 2.0 e representado pela expressão User-Generated Content (UGC) ou mídia gerada pelo consumidor. O UGC surgiu com o avanço das tecnologias Web, que aumentou não só o acesso dos consumidores à informação, mas também sua facilidade para expressar suas opiniões. Na Internet o UGC está presente em comentários, fóruns, lista de discussões, blogs e fotologs, comunidades, grupos, sites participativos e na Wikipédia. Os consumidores utilizam todas as ferramentas disponíveis (e.g., sites, blogs, e-mails, mensagens, celulares) para divulgar, sobretudo, suas experiências pessoais e opiniões em relação a produtos, serviços, marcas, empresas, notícias. Assim como acontecia com o boca-a-boca, o UGC tende a ter um maior poder de influência sobre outros consumidores do que as mídias tradicionais (e.g., TV, rádio, jornais impressos), pois tendem a passar mais credibilidade.

O fenômeno da colaboração não é novo, desde os homens primitivos que se organizavam em busca de sobrevivência até os dias atuais com o fenômeno dos softwares livres ou de código aberto, agora como paradigma de produção e/ou distribuição de conhecimento. Entretanto, com o UGC e a Web 2.0, a colaboração tornou-se comum nas aplicações e atividades centradas na Web, sendo que essas aplicações não são apenas disponbilizam informações aos consumidores, como também permitem que estes disponbilizem suas informações.

Na Educação, essa mão dupla de comunicação poderá potencializar as técnicas já existentes medida em que as aplicações migrarem de um computador presente num certo espaço físico, para aplicações que estão em todo o espaço-tempo e não mais num local ou hardware particular. Além disso, em ambientes colaborativos, a construção do material pode ser feita pelos próprios estudantes e gerenciada e orientada pelos docentes, modificando o paradigma tradicional de educação onde os estudantes são apenas consumidores do conhecimento apresentado pelos docentes, tornando-se também construtores da informação. A análise de conteúdos desenvolvidos, também, permite aos docentes perceber com maior clareza quais as deficiências de seus estudantes e onde melhorar suas aulas. Alguns trabalhos evidenciam essas possibilidades, dentre os quais destacam-se:

a) Universidade Aberta do Brasil (UAB): um projeto criado pelo Ministério da Educação, para a articulação e integração experimental de um sistema nacional de educação superior. Esse sistema será formado por instituições públicas de ensino superior, as quais levarão ensino superior público para municípios brasileiros que não têm oferta ou cujos cursos ofertados não são suficientes para atender a todos os cidadãos. A UAB será formado por universidades federais e centros federais de educação tecnológica, articulados e integrados com a rede de pólos de apoio presencial para educação a distância;

b) Vídeo@RNP: este projeto permite a distribuição gratuita de vídeos sobre atividades de ensino e pesquisa realizadas em todo o país. Os conteúdos multimídias podem ser inseridos e acessados pela internet, permitindo que este material saja produzido coletivamente por um grande número de docentes, oferecendo vantagens como: a diminuição do tempo de produção e o aumento da qualidade do material criado;

c) One Laptop Per Child (OLPC): os laptops do MediaLab do MIT são projetados para acesso remoto para as aplicações baseadas na Web. Esta descentralização das atividades de aprendizagem torna-se possível quando as aplicações não se encontram mais fixas num espaço-tempo (e.g., máquina na escola ou em casa, num certo horário) mas se encontram disponíveis, virtualmente, em todos os lugares e tempos para os estudantes. Os OLPCs permitirão que os estudantes acessem aplicações que estão na Web 2.0 independente de hora ou local.

As definições da Web 2.0 e suas possibilidades para educação assemelham-se sobremaneira com a definição do Construtivismo, uma concepção do conhecimento e da aprendizagem, que deriva da epistemologia genética de Jean Piaget e da pesquisa sócio-histórica de Lev Vygotsky , que partem da idéia de que o conhecimento se constitui pela interação do indivíduo com o meio físico e social, por força de sua ação e não por qualquer dotação prévia. Na Educação, essa teoria reúne outras tendências atuais do pensamento, que têm em comum a insatisfação com um sistema educacional que consiste em repetir, recitar, aprender, ensinar o que já está pronto, ao invés de fazer agir, operar, criar, construir a partir da realidade vivida por estudantes e docentes. Nesta concepção o conhecimento não se traduz em atingir a verdade absoluta, mas numa questão de adaptação do organismo a seu meio ambiente. Assim, o sujeito do conhecimento está o tempo todo modelando suas ações e operações conceituais com base nas suas experiências.

Dentre as metodologias educacionais construtivistas destaca-se a Problem-Based Learning (PBL), na qual o aprendizado passa a ser centrado no estudante, que sai do papel de receptor passivo, para o de agente e principal responsável pelo seu aprendizado. Os docentes que atuam como facilitadores nos grupos têm a oportunidade de conhecer bem os estudantes e de manter contato com eles durante todo o curso. A metodologia do PBL enfatiza o aprendizado auto-dirigido, centrado no estudante e ocorre em pequenos Grupos (até 12 estudantes). Diferentemente das metodologias tradicionais, o docente se limita a facilita a discussão dos estudantes, conduzindo-a quando necessário e indicando os recursos didáticos úteis para cada situação. Uma sessão tutorial inicial trabalha os conhecimentos prévios dos estudantes sobre o assunto apresentado; os problemas são primeiramente identificados e listados, e em seguida são formulados os objetivos de aprendizado, com base em tópicos considerados úteis para o esclarecimento e a resolução do problema (sete passos). Na etapa seguinte os estudantes vão trabalhar independentemente, na busca de informações e na sua elaboração (estudo auto-dirigido) antes da próxima sessão tutorial, quando as informações trazidas por todos serão discutidas e integradas no contexto do caso-problema.

Quarta-feira (Pesquisa e Ordenação)

Caros alunos,

como apresentado na aula de hoje, por favor sigam meus updates através desse Blog. As atividades de hoje são:

- Apresentações (meu nome é Luiz, não se esqueçam! hahaha)
- Nossa matéria é Pesquisa e Ordenação, cujo o planograma vocês podem requisitar enviando um email para lhzsantana@uninove.br.
- Em nossas aulas, vamos utilizar os programas
Dev C/C++:
www.bloodshed.net/devcpp.html
Free Pascal: http://www.freepascal.eti.br/

- Eu gostaria que vocês preenchessem a seguinte pesquisa de perfil:
http://www.surveymonkey.com/s/MSLBHFQ

- Além disso, vamos tentar fazer os seguintes exercícios:

1. Faça um programa em C que receba do teclado a cotação atual do Dólar em relação ao Real e um valor, que deverá ser convertido de Real para Dólar. Faça a conversão do valor, baseado na cotação atual, e apresente o valor em Dólar para o usuário.

2. Crie um programa em C
para uma escola, para armazenamento dos dados de seus alunos, utilizando uma estrutura com os seguintes membros: nome, idade e telefone. Utilize o conceito de vetor de estruturas para armazenar até 20 alunos.

3. Escreva um programa que leia duas cadeias de caracteres e concatene a segunda cadeia ao final da primeira, e escreva essa cadeia em um arquivo.

terça-feira, 2 de fevereiro de 2010

Terça-feira (Práticas em Linguagens de Programação)

Caros alunos,

como apresentado na aula de hoje, por favor sigam meus updates através desse Blog. As atividades de hoje são:

- Apresentações (meu nome é Luiz, não se esqueçam! hahaha)
- Nossa matéria é Práticas em Linguagens de Programação, cujo o planograma vocês podem requisitar enviando um email para lhzsantana@uninove.br.
- Em nossas aulas, vamos utilizar o programa Dev C/C++:
www.bloodshed.net/devcpp.html
- Eu gostaria que vocês preenchessem a seguinte pesquisa de perfil: http://www.surveymonkey.com/s/WRXZ5BR
- Além disso, vamos tentar fazer os seguintes exercícios:

1. Faça um programa em C que dada um temperatura em graus Celsius, fornecida via teclado, exiba como saída a temperatura em graus Fahrenheit.

3. Escreva um programa que leia duas cadeias de caracteres e concatene a segunda cadeia ao final da primeira, e escreva essa cadeia na tela.

2. Crie um programa em C
para uma biblioteca, que receba o nome de 20 livros em um vetor.

segunda-feira, 1 de fevereiro de 2010

Segunda-feira (Pesquisa e Ordenação)

Caros alunos,

como apresentado na aula de hoje, por favor sigam meus updates através desse Blog. As atividades de hoje são:

- Apresentações (meu nome é Luiz, não se esqueçam! hahaha)
- Nossa matéria é Pesquisa e Ordenação, cujo o planograma vocês podem requisitar enviando um email para lhzsantana@uninove.br.
- Em nossas aulas, vamos utilizar o programa Dev C/C++:
www.bloodshed.net/devcpp.html
- Eu gostaria que vocês preenchessem a seguinte pesquisa de perfil: http://www.surveymonkey.com/s/C5HTT7G
- Além disso, vamos tentar fazer os seguintes exercícios:

1. Faça um programa em C que dada um temperatura em graus Celsius, fornecida via teclado, exiba como saída a temperatura em graus Fahrenheit.

2. Crie um programa em C
para uma biblioteca, que utilize uma estrutura com os seguintes membros: nome do livro, autor, editora e ano de publicação. Utilize o conceito de vetor de estruturas para armazenar até 20 livros.

3. Escreva um programa que leia duas cadeias de caracteres e concatene a segunda cadeia ao final da primeira, e escreva essa cadeia em um arquivo.