Sempre em movimento…

Porque sabemos que parar é morrer, nesta edição da Revista PROGRAMAR introduzimos várias alterações que achamos importantes para continuidade deste projecto. Das várias alterações introduzidas, a salta imediatamente à vista, mesmo ao leitor que ainda está somente a ler a página do editorial, é a mudança de design. Em qualquer tipo de publicação o design influencia o modo como vemos como lemos. Aqui temos que agradecer a todos quantos ajudaram a adaptar este novo design, mas especialmente ao Sérgio Alves por toda a parte da idealização e desenho do novo design.
Continuar a ler

LINQ: Implementação dos operadores TakeLast, TakeLastWhile, SkipLast e SkipLastWhile

Introdução

Há algum tempo necessitei de obter os últimos itens de uma sequência que satisfaziam um determinado critério e, olhando para os operadores disponíveis na classe Enumerable, apercebi-me de que tal operador não existia.

A única forma de obter o resultado pretendido era inverter a ordem dos itens na sequência, obter os itens que satisfaziam o critério e inverter os itens da sequência resultante. Algo como isto:

Sequence
.Reverse()
.TakeWhile(criteria)
.Reverse();

Continuar a ler

BYACC

No artigo anterior adquirimos algumas noções sobre FLEX e vimos como implementar um scanner simples. Relembrando, o FLEX é um gerador de analisadores lexicais ou scanners, e o BYACC é um gerador de parsers. Usados em conjunto permitem escrever aplicações bastante sofisticadas, mas no nosso artigo limitamo-nos a considerar uma calculadora simples, servindo como exemplo introdutório. Agora que temos o scanner para a nossa calculadora escrito podemos começar a considerar o parser.

Continuar a ler

BackgroundWorkers – Implementação prática em Windows Presentation Foundation (WPF)

Neste artigo pretendo mostrar o que é o BackgroundWorker e vou exemplificar como se deve proceder à sua implementação usando a tecnologia WPF na versão .Net Framework 4.

Suponhamos:

Tenho um algoritmo complexo de Optimização Combinatória que irá ter como parâmetro de entrada um objecto do tipo World. Classe que define toda a estrutura de dados da minha aplicação e no final retorna o objecto World com as alterações realizadas pelo algoritmo.

Esta geração vai implicar que tenhamos pelo menos três passos:

  1. A partir do objecto World vamos criar a estrutura de dados do algoritmo;
  2. Gera-se o algoritmo a partir dos dados recebidos;
  3. Depois de gerar o algoritmo é preciso converter o resultado de forma a reflectir no World o resultado do algoritmo.

Continuar a ler