OpenLLM-France/wikimedia huggingface dataset:
# BlitzMax/Lições/Console

A janela do console do BlitzMax é utilizada apenas pelo desenvolvedor, o produto final não terá a janela de console. O console é usado principalmente para avaliar ou modificar o funcionamento do programa sem a necessidade de usar o programa principal. As ações do console no BlitzMax são mostradas na janela Output.

## Olá mundo

Vamos escrever o simples e famoso "Olá mundo" utilizando a função Print que irá imprimir o texto no console do BlitzMax:
Você pode ver também que o console do BlitzMax também não aceita caracteres especiais do idioma português como acentos, cedilhas ou tremas.

## Variável

Agora vamos ver como exibir variáveis no console do BlitzMax, vamos criar uma variável string chamada minhaString, e vamos exibi-la no console:
Vamos agora escrever um texto e colocar o valor da variável junta, para isso escreveremos o texto entre aspas e colocaremos o + para colocar a variável:
Os atalhos dos tipos de variáveis são: @ (byte), % (int), %% (long int), # (float), ! (double), $ (string).

## Input

Vamos agora interagir com o console, para isso iremos utilizar a função Input para escrever uma string e iremos utilizar a função Print para imprimir o valor. Caso não esteja conseguindo digitar o valor simplesmente clique na janela de Output.
Você também pode escrever um texto dentro do parâmetro da função Input, esse texto é exibido logo antes do cursor para inserir:

## If, EndIf

Agora vamos começar com estruturas de condição utilizando os comandos If e EndIf.
Observe que a a estrutura de condição de strings é case sensitive, ou seja, maiúsculas são diferentes de minúsculas, nesse caso se você escrever a letra a (minúsculo) o console não irá aceitar a condição.

## Else, ElseIf

Agora vamos escrever uma condição contrária para caso a primeira condição não seja verdadeira, utilizando o comando Else:
Agora iremos escrever múltiplas condições para a variável, utilizaremos o comando ElseIf:

## Select, Case, EndSelect

Vamos agora escrever uma condição com um bloco de opções para apenas uma variável utilizando os comandos Select e Case.

## For, Next

Vamos entrar agora na parte de estruturas de repetição que são estruturas que se repetem até que uma condição seja satisfeita. Vamos agora usar o For e Next que usam o conceito de incremento para controlar a sua execução. Primeiramente vamos criar uma variável inteira, vamos imprimi-la e adicionar +1 ao valor dela em cada iteração até que o valor chegue a 5 (condição satisfeita), essa adição é feita automaticamente no BlitzMax.

## While, Wend

São estruturas que caso a condição de entrada seja verdadeira irão se repetir até que aconteça alguma modificação para que a condição seja falsa.
Sempre que o conteúdo da string for a palavra repetir, a estrutura irá se repetir.
# BlitzMax/Lições/Imagem

Vamos agora ver como manipular imagens com vários comandos no BlitzMax.

## Iniciando o gráfico

Para se trabalhar com imagens necessitamos antes de tudo a criação da janela gráfica, vamos cria-la usando o comando Graphics com a largura e altura como parâmetros.

## Criando uma imagem

Vamos criar uma imagem, primeiramente vamos criar a variável minhaImagem que irá armazenar o conteúdo da imagem, depois vamos usar o comando CreateImage com os parâmetros largura e altura.
Agora antes de escrever pixels na imagem precisamos criar outra variável para poder editar seus pixels, para isso vamos usar o comando LockImage que irá receber como parâmetro a variável onde a imagem está armazenada.

## Carregando um arquivo de imagem

Além de poser criar uma imagem também podemos carregar um arquivo de formatos conhecidos como .bmp .jpg e .png. Para isso primeiramente vamos usar a função LoadImage que irá entrar como atributo o nome da imagem, caso ela esteja na mesma pasta do arquivo .bmx.
Caso queira colocar o endereço do arquivo de outra pasta que não ao do seu projeto coloque normalmente o endereço no atributo.
Após isso vamos colocar a imagem para ser exibida usando a função DrawImage entrando como parâmetros o objeto imagem, o pixel X e o pixel Y de onde a imagem será desenhada.
# BlitzMax/Lições/GameNet

O GameNet é o módulo exclusivo criado especialmente para o BlitzMax para facilitar na programação de jogos multiplayer.
Para trabalhar com multiplayer tente assimilar o conceito de Hospedeiro e Cliente. Hospedeiro é aquele que hospeda a informação, que mantém o jogo ativo, cliente é aquele que acessa o hospedeiro do jogo. Um cliente pode se desconectar de um jogo sem que ele acabe, mas caso o Hospedeiro se desconecte todos os outros clientes irão cair.
Apesar do conceito multiplayer está associado a internet podemos programar Hospedeiros e Clientes no mesmo computador, na verdade o endereço que o Cliente irá acessar será o chamado Localhost (ou seja, você mesmo) com a vantagem (que também pode ser desvantagem) de não depender da velocidade da rede.
Inicialmente você deverá trabalhar com dois ou mais programas de uma vez, um será o Servidor que irá hospedar o jogo, os outros serão os Clientes que irão acessar o servidor, para isso crie dois ou mais projetos, um com "hospedeiro.bmx" e o outro "cliente.bmx", lembre-se que você deverá testar os dois programas ao mesmo tempo.

## Iniciando

Primeiro, no arquivo início "hospedeiro.bmx" vamos criar um servidor e ao final vamos fecha-lo.
Agora no "hospedeiro.bmx" fazemos a checagem se o servidor foi inicializado.
# BlitzMax/Lições/Lista

Listas são estruturas de dados organizadas através da enumeração de dados. Em oposição aos vetores que são estruturas de dados estáticas, as listas são estruturas de dados dinâmicas podendo variar de tamanho desde apenas um byte até encher uma memória RAM inteira. As listas são muito usadas para evitar desperdício de memória. O BlitzMax possui comandos específicos que tratam exclusivamente de listas.

## Criando uma lista

Usa-se o comando CreateList para se criar uma lista, o nome da variável tipo lista será minhaLista.

## Adicionando itens

Com a lista criada, agora precisamos fazer uso dela, para isso inicialmente vamos adicionar alguns itens na lista, podemos adicionar itens no início ou no final da lista. Claro, se a lista estiver vazia adicionar no início ou no fim não fará a menor diferença.

### Adicionando no início

Para adicionarmos um valor no início da lista usamos o comando ListAddFirst, no primeiro parâmetro temos a lista a qual queremos adicionar o item, no segundo campo temos o item em si. No BlitzMax utilizamos também o comando EachIn para percorrer cada membro da lista dentro do For.
Os elementos foram exibidos na seguinte ordem: três (último a ser colocado), dois (segundo a ser colocado), um (primeiro a ser colocado). A ordem de inserção dos elementos foi trocada porque eles foram adicionados sempre ao início da lista.

### Adicionando no final

Para adicionarmos um valor no final da lista usamos o comando ListAddLast, no primeiro parâmetro temos a lista a qual queremos adicionar o item, no segundo campo temos o item em si.
Os elementos foram exibidos na seguinte ordem: um (primeiro a ser colocado), dois (segundo a ser colocado), três (terceiro a ser colocado). Apesar da inserção dos códigos estar na mesma ordem do código anterior, os elementos foram exibidos na ordem contrária, já que foram adicionados ao final da lista.

## Ordenando uma lista

A ordenação é a forma de organizar a lista, ela pode ser com inteiros, strings ou floats em ordem crescente ou decrescente. No BlitzMax utiliza-se o comando SortList para ordenar as listas, o primeiro parâmetro é o nome da lista a ser ordenada, o segundo parâmetro é o tipo da ordenação True (se for crescente) ou False (se for decrescente)
Após a ordenação os elementos foram exibidos na seguinte ordem: A, B, C.

## Contando elementos de uma lista

Você pode saber quantos elementos tem em uma lista através da função CountList que irá retornar um inteiro, use a própria lista como parâmetro.
# BlitzMax/Lições/MaxIDE

Integrated Development Enviroment

## Ambiente

Ao abrir o BlitzMax você verá a janela de ajuda e ao lado os tópicos com as tags.
* Home - que contém toda a documentação do BlitzMax
* Code - que contém os tipos, os métodos e as funções do atual arquivo aberto
* Debug

## Comandos

* File
** New
** Open
** Open recent
** Close
** Save
** Save As
** Save All
** Next File
** Previous File
** IDE Options
** Project Manager
** Import BB Project
** Print
** Exit
* Edit
** Undo
** Redo
** Cut
** Copy
** Paste
** Select All
** Block Ident
** Block Outdent
** Find
** Find Next
** Replace
** Goto Line
* Command
** Build
** Build and Run
** Command Line
** Step
** Step In
** Step Out
** Halt
** Build Options
*** Quick Build
*** Debug Build
*** Build GUI App
** Lock Build File
** Unlock Build File
** Build Modules
** Rebuild All Modules
** Syncronyze Modules
* Help
** Home
** Back
** Forward
** Quick Help
** About BlitzMax
# BlitzMax/Lições

* MaxIDE
* Console
* Função
* Ponteiro
* Lista
* Árvore
* Arquivo
* Banco
* Evento
* Gráfico
* Imagem
* Música
* Pixmap
* GameNet
* Socket
* OpenGL
* Orientação a objeto
* Inteligência artificial
* MaxGUI
* Max3D
# BlitzMax/Lições/Gráfico

Vamos agora iniciar a parte de preparação de gráfico para mostrar os comandos gráficos do BlitzMax.

## Criando um gráfico

Para criar um gráfico iremos usar o comando Graphics que precisa de no mínimo 2 parâmetros, o primeiro é a largura e o segundo é a altura da tela. No final iremos fechar o gráfico com o comand EndGraphics
Vamos agora adicionar um comando adicional que é o depth que deverá sempre ser 0.
O próximo comando é a frequência (hertz) do gráfico. É ele que determina quantos frames por segundo a aplicação terá.
Por último é o campo flag que deverá sempre ser 0.

## Criando um loop

Agora que criarmos um gráfico vimos que o que ele apenas faz é piscar na tela, para fazer o gráfico ficar funcionando continuamente precisamos criar um loop, nesse exemplo agora vamos criar um gráfico que irá sair só quando apertarmos a tecla Esc, para isso vamos criar um While-Wend.

## Desenhando algo na tela

Agora que já conseguimos fazer uma tela que fique constantemente ligada vamos colocar algo para ser exibido, para isso dentro do nosso loop vamos usar a função DrawRect como parâmetros vamos colocar: 1. o pixel X onde o retângulo vai ser desenhado, 2. o pixel Y onde o retângulo vai ser desenhado, 3. a largura do retângulo, 4. a altura do retângulo.
Agora precisamos descarregar do buffer o que foi desenhado (no caso, o nosso retângulo), para isso vamos usar a função Flip

## Atualizando a tela

Agora com o loop criado podemos acompanhar a atualização da nossa tela, para isso vamos criar uma variável e coloca-la como parâmetro no DrawRect.
Agora vamos incrementa-la dentro do loop para o DrawRect ser desenhado em um local diferente.
Se você colocou o programa para rodar deve ter notado que o retângulo deixou um rastro na tela, isso acontece porque o Flip apenas desenha a imagem por cima da outra, se não quisermos ter esse problema deve-se limpar a tela antes de desenhar qualquer coisa, para isso usa-se a função Cls (que vem de Clear Screen) que deve ser sempre a primeira a ser chamadano loop.
# BlitzMax/Lições/Função

Em programação, funções podem ser definidas como subprogramas ou subrotinas que consistem como uma parte de código utilizada para resolver um problema específico. Para utilizar uma função você deverá sempre fazer esses 2 procedimentos:
* Criar o protótipo da função
* Chamar a função

## Criando uma função

Primeiramente vamos criar uma função simples que vai exibir apenas uma mensagem na tela. Para isso iremos usar o comando Function e EndFunction para criar o protótipo.
Apesar de ter escrito toda a função você notou que ela não foi exibida, isso porque você criou apenas o protótipo dela, para exibir ser conteúdo você precisa chamar a função para ela ser executada.

## Chamando uma função

Para chamar a função você precisa apenas escrever o seu nome após a criação do protótipo.
O comando Print faz parte do protótipo da função, depois de criado, o programa chama a função para ser executada. Note que você SEMPRE deve chamar a função para ela ser executada.

## Parâmetros de uma função

Parâmetro pode ser entendido como um valor externo que será aplicado à função, os parâmetros ficam sempre dentro dos parênteses. No exemplo abaixo a função irá exibir o valor 5 que colocamos externamente na chamada da função.

## Modificando uma variavel via função

Também pode-se modificar o valor de uma variavel externa através da passagem por referência, para isso dentro do atributo coloque o comando Var.

## Função retornando um valor

Até agora vimos funções do tipo procedimento que apenas rodam. Uma função também pode funcionar como uma variável para exibir alguma coisa, para isso devemos fazer a função retornar alguma coisa para a sua saída na hora em que for chamada. No exemplo veremos uma função que irá retornar o quadrado de um numero.

## Função recursiva

A função recursiva é aquela que recorre a si mesmo na hora da execução, é utilizada principalmente para facilitar e simplificar algoritmos. Sua execução ocorre da seguinte forma: a função chama ela mesma, que chama ela mesma, que chama ela mesma, que chama ela mesma...... e assim por diante.
Você deve ter notado que a execução do programa se tornou contínua (aperte Esc para encerrá-lo), isso acontece porque nós não inserimos nenhuma condição de parada, ou seja, um "freio" para função, para isso iremos criar uma condição If-Else para fazer a condição de parada.
# BlitzMax/Lições/MaxGUI

O MaxGUI é um módulo adicional do BlitzMax que serve para o desenvolvimento de aplicações de alto nível.

## Criando uma janela

Vamos começar criando uma simples janela, para isso vamos usar a função CreateWindow, vamos entrar 4 parâmetros: o nome da janela, o eixo x de onde ela será desenhada, o eixo y de onde ela será desenhada, a largura e a altura.
# Logística/Gestão de armazéns/Picking/Procedimentos de organização/Bucket brigade

Este procedimento é uma variação do picking por zona e da metodologia de passe, excepto que as zonas não são definidas no sistema, mas sim pela actividade em cada zona que os operadores percorrem. Em termos simples, o pedido é iniciado pelo Operador 1, o Operador 2 desloca-se até ao Operador 1 quando precisa de trabalho. O lugar onde se encontram é designado por limite temporário de zona. O Operador 2 recolhe, então, o pedido até que o Operador 3 se desloque de volta para reunir-se com eles e assuma a satisfação do pedido. Isto mantém todos os operadores activos e, automaticamente, equilibra o sistema numa base diária (Hudock, 2004).
Este procedimento exige uma rigorosa coordenação entre os operadores, um estudo prévio de produtividade de cada um dos mesmos e uma preparação dos pedidos de acordo com a configuração física, apesar de parecer um procedimento aparentemente simples. No entanto, é possível comprovar analiticamente que com este procedimento de organização do trabalho, os operadores se mantêm em volta da divisão óptima do trabalho, eliminando a actividade de balanceamento e planeamento (Medeiros, 1999).
Deste modo podem-se indicar como principais benefícios da utilização do procedimento de bucket brigade (Medeiros, 1999):
* Redução da necessidade de planeamento, pois faz automaticamente o balanceamento do trabalho;
* Através do auto ajuste, o processo torna-se mais ágil e flexível;
* Maior número de unidades processadas, para além de se aproximar, tendencialmente, do balanceamento óptimo do trabalho;
* Redução do trabalho secundário e aumento da qualidade, pela redução do trabalho em processo.
# Logística/Gestão de armazéns/Picking/Procedimentos de organização/Picking por onda

Este procedimento funciona à semelhança do picking discreto, ou seja, cada operador é responsável por um pedido e por um tipo de produto de cada vez. A diferença entre os dois está na programação de um certo número de pedidos ao longo do turno. Normalmente este tipo de procedimento é utilizado para coordenar as funções de separação de pedidos e despacho (Medeiros, 1999).
# Logística/Gestão de armazéns/Picking/Procedimentos de organização/Picking discreto

No picking discreto, cada operador é responsável por uma única encomenda de cada vez e avia apenas um único produto de cada vez. Este tipo de procedimento possui um conjunto de vantagens, essencialmente por ser o mais simples, adequando-se perfeitamente quando toda a documentação está em papel. A probabilidade de erros na actividade de picking é reduzida, pois existe apenas um documento para cada encomenda. Este procedimento é, todavia, o menos produtivo, pois como o operador deve aviar a totalidade da encomenda, o tempo de deslocação é muito superior ao dos outros métodos (Medeiros, 1999).
# Logística/Gestão de armazéns/Picking/Procedimentos de organização/Picking por zona

Nesta procedimento de organização, as áreas de armazenagem são separadas em zonas. Cada zona possui determinados produtos e cada Operador da actividade de picking está relacionado com uma dessas zonas. Quando um pedido dá entrada, cada Operador coloca os respectivos produtos a esse pedido, que fazem parte da sua zona de trabalho. Se o pedido se encontrar completo, ele pode ser despachado. Caso contrário, o mesmo irá para a zona de picking seguinte e o próximo Operador irá colocar os produtos necessários (Medeiros, 1999).
A área total de recolha está organizada em secções distintas (zonas) com uma pessoa atribuída a cada zona. O Operador que é atribuído a cada zona coloca todas os produtos para cada pedido que se encontra dentro dessa zona. Os produtos de cada zona são levadas para uma área de consolidação de pedidos em que são combinados para completar o pedido antes do despacho. Se os produtos necessárias estão espalhados por três zonas, em seguida, três operadores vão trabalhar nesse pedido. Cada Operador só funciona em um pedido de cada vez e existe apenas um único período de programação por turno (Halsey, 1998).
Existem duas variações de picking por zona.
* Picking por zona sequencial: é picking por zona em uma zona de cada vez. O pedido é deslocado para a próxima zona a qual pode ter (ou em alguns casos não) ter linhas para ser recolhido. isto é por vezes referido como o método "pick and pass".
* Picking por zona simultânea: é picking por zona de todas as zonas aplicáveis independentemente, e depois consolidar o pedido em um local designado à medida que é concluído (Halsey, 1998).
Este procedimento é usualmente utilizado quando existem diferenças de produtividade entre os operadores ou diferenças de equipamentos ou tecnologias utilizadas na área de picking. Deste modo, as zonas de picking são determinadas até obtermos um balanceamento da carga de trabalho entre as zonas (Medeiros, 1999).
# Logística/Gestão de armazéns/Picking/Procedimentos de organização

Etapas de desenvolvimento - 9 fases :
| Início: | Básico: | Criação: | Desenvolvimento: | Maturação: | Revisão: | Desenvolvido: | Finalização: | Abrangente: |
Para organizar a actividade de picking existem cinco procedimentos básicos, procedimentos esses que são caracterizados como “puros”. Usualmente o que se observa é uma composição ou mistura de diferentes procedimentos, originando estratégias mistas de organização do picking (Medeiros, 1999).
É importante que durante a definição da estratégia mais adequada a utilizar, se responda as seguintes perguntas:
Nos artigos seguintes explicam-se cinco procedimentos básicos da actividade de picking (Medeiros, 1999).
* Picking discreto
* Picking por zona
* Picking por lote
* Picking por onda
* Bucket brigade
# Logística/Gestão de armazéns/Picking/Organização da actividade de picking

A actividade de separação e preparação de pedidos é de grande intensidade em termos de movimentação de materiais. Dependendo do tipo de armazém, cerca de 30% a 40% do custo total desse armazém está directamente associado a essa mesma actividade.
Tal situação verifica-se pois o tempo associado a essa actividade e o número de trabalhadores são maiores que nas outras actividades de armazenagem. Através de estudos de sistemas de separação de pedidos mais usuais, onde temos uma grande utilização de operações de deslocamento, recolha de produtos e documentos em papel, obtemos informações de como o tempo do Operador nessa actividade é gasto(Medeiros, 1999).
Um objectivo fundamental para uma boa produtividade em um sistema de separação de pedidos é a minimização dos tempos de deslocamento ou movimentação. Ao observamos a utilização do tempo por parte de um Operador na actividade de picking, verifica-se que a grande parte do tempo gasto pelos operadores se encontra na movimentação para a recolha e colocação de produtos na linha de picking.
A maneira como organizamos a estratégia de picking está directamente associada com o tempo de deslocamento. Por estratégia de picking entendemos a maneira como organizamos o processo de separação de pedidos, planeando a quantidade de operadores por pedido, o número de vários produtos utilizados em cada recolha e os períodos para agrupar ou organizar pedidos.
Existem diversas soluções tecnológicas de armazenagem, combinações de equipamentos e sistemas de controlo que deslocam, armazenam e recolhem produtos com alta precisão e velocidade, dependendo do grau de automação, podendo-se destacar alguns tais como (Medeiros, 1999):
* Carrousels;
* Mini-loads;
* Sistemas AS/RS (Automatic Storage e Retrieval Systems);
* WMS.
Estes sistemas diminuem o tempo de deslocamento do Operador, pois tem como objectivo trazer os produtos específicos no momento da separação, além da diminuição do tempo de contagem. Equipamentos como leitores ópticos e código de barras, reduzem o tempo de procura e documentação.
# Logística/Gestão de armazéns/Picking/Procedimentos de organização/Picking por lote

Neste procedimento um Operador escolhe um grupo de pedidos, ao mesmo tempo, uma linha de cada vez. Quando um produto aparece em mais que um pedido, a quantidade total necessária para todos os pedidos combinados é recolhida de uma só vez, e em seguida separada por pedido. A segregação pode ter lugar enquanto se faz a recolha em totes (pequenas peças em pequenas quantidades) ou a quando do transporte para uma área designada, onde são classificados e agrupados por pedido individual (Hudock, 2004).
Recolher mais que um pedido de uma vez, tem um efeito significativo sobre a produtividade do picking para os casos de case e broken case picking. De facto, quantos mais pedidos um Operador conseguir gerir eficazmente de uma só vez, maior é o ganho de produtividade (Hudock, 2004).
Este tipo de procedimento permite um ganho de produtividade em relação aos outros, visto trabalhar-se com diversos pedidos por recolha. No entanto, é indicado apenas quando os produtos são recolhidos maioritariamente em quantidades fraccionadas (não em caixas), e quando os pedidos possuem pouca variedade de produtos e pequenos volumes (Medeiros, 1999).
O ganho de produtividade obtido, ocorre devido à diminuição de tempo de deslocamento dos operadores. Um ponto negativo deste procedimento é a sua maior complexidade e maior necessidade de utilizar severas medidas de modo a minimizar os riscos de erros, medidas essas que podem passar pelo uso de soluções tecnológicas actuais (Medeiros, 1999).