sexta-feira, 18 de dezembro de 2009

Apostila RGSS/RGSS2 | Cap.3 - Manipulando e Verificando Dados

3.Manipulando e Verificando Dados


Começaremos agora a colocar em prática o pouco que aprendemos.
No decorrer do capítulo aprenderemos alguns métodos de Ruby utilizados para verificar valores; comentários; e conheceremos as palavras que a linguagem Ruby reserva para si.

Palavras Reservadas

A seguir a lista de palavras reservadas, ou seja, palavras que Ruby reserva para si e portanto não podem ser usadas para dar nome ao outro objeto.

BEGIN   class      ensure      nil      self      when

END      def      false      not      super      while

alias      defined      for      or      then      yield

and      do      if      redo      true

begin      else      in      rescue      undef

break      elsif      module      restry      unless

case      end      next      return      until



Comentários

Comentários são trechos de código que não interferem na execução do programa, então podemos usá-los para fazer anotações em trechos do programa quando precisamos dar atenção especial àquele trecho ou simplesmente para descrever o que o mesmo faz. Esse recurso é muito útil e ajuda muito a organizar o programa, e também ajuda a relembrar o “porquê daquela linha”, por exemplo, imagine que estava desenvolvendo um programa e por algum motivo teve que parar por um bom tempo, se deixou comentário em seu código será mais fácil de relembrar o que cada coisa faz.
Para comentar uma linha do código, coloque # antes da mesma. Lembre-se esse tipo de comentário é válido para apenas uma linha. Exemplo:


OBS:
Perceba ao escrever no editor de scripts do RPGMaker, o texto fica colorido conforme a sintaxe. No caso, uma linha comentada recebe a coloração verde como na imagem acima. Isso acontece com outras partes da sintaxe também, como por exemplo, palavras reservadas ficam em azul.

Existe também um comando para comentários multi-linhas, usada para fazer comentários longos(com várias linhas). Mas este comando não é usada apenas para isso, também serve para documentação embutida pela ferramenta rdtool, mas isso não será abordado(talvez futuramente).
O comando é composto por delimitadores, um para indicar o início e outro para o fim, são eles =begin e =end, respectivamente. O que estive escrito entre esses delimitadores será considerado comentário e não irão interferir do programa. Mas existem alguns cuidados a tomar. É obrigatório escrever o delimitador no início da linha(colado no início da linha), e para cada =begin tem que existir um =end, lembrando que se ao colocar =begin dentro de um outro comentário também o torna um comentário. Exemplo:



OBS: escrever qualquer coisa com exceção da palavra =end no início, pois isso encerraria o comentário.


print( ) puts( ) p( )

Bom, até agora usamos o método printvárias vezes. O que o método fez foi nos mostrar em uma message box o valor de uma variável, ou até mesmo um dado escrito diretamente(sem precisar de variável). E é isso mesmo que ele faz, assim como o método p( ). Veja os exemplos

Embora com ou sem parênteses funcione, é recomendável utilizá-los

Já o método puts( ), não dos mostra a janela com o valor. Bom normalmente os métodos print( ) e p( ) , do ruby, também não, mas com modificações feitas neles pelo RGSS os valores são exibidos na janela. Também é possível alterar o método puts( ) de ruby para mostrar a mensagem em uma janela, mas não veremos isso agora para não “embolar” a cabeça de ninguém. Resumindo estes três métodos nos retorna o valor empregado como argumento(o valor dentro do parênteses ou na frente do método) à eles na saída padrão, mas que pode ser alterada para uma message box por exemplo.

Operadores


Os operadores são utilizados para manipular os dados , por exemplo, construir expressões matemáticas, operações lógicas, comparar valores, etc. É essencial o uso destes para construir nosso programas e portanto


Operadores aritméticos


Veremos a seguir operadores aritméticos e suas funções.

Operador
Função
Exemplo
Retorno
+
Adição
1+1
2
-
Subtração
1-1
0
*
Multiplicação
1*1
1
/
Divisão
1/1
1
%
Resto da Divisão
1%1
0
+
Mais(unário)
+1
1
-
Menos(unário)
-(1)
-1
**
Exponenciação
2**3
8

Atente para as coluna “Exemplo" e "Retorno”, ela mostra exemplos do que o operador faz, onde "Exemplo"  é a expressão utilizando o operador em questão, e "Retorno" é o resultado da expressão, ou seja, o valor que será retornado pela expressão, e que podemos usá-lo de imediato ou *armazená-lo em uma variável para uso posterior.

*A partir deste ponto sempre irei colocar, em relação a variável, como armazenar informação na variável e não fazer referência como anteriormente, pois a explicação do capítulo 2  sobre variáveis foi para fins didáticos e após ter entendido não é preciso ficar se referindo desta forma à função de uma variável, assim facilitamos o trabalho daqui em diante.

Os operadores anteriormente mostrados são operadores aritméticos, para expressões matemáticas, mas o operador “+” pode ser usado na concatenação de strings também.

O código acima abrirá uma janela do Windows com os três trechos juntos escritos.

Operadores relacionais

Agora uma tabela com alguns operadores relacionais, eles servem para comparar valores. Lembre-se aí não estão todos.
Operador
Função
>
Maior que
>=
Maior que ou igual a
<
Menor que
<=
Menor que ou igual a
!=
Diferente de
==
Diferente de

Exemplos:

Repare que todos retornam valores booleanos(TrueClass ou FalseClass).

Operadores condicionais ou lógicos

Operador
Função
and
“e” lógico/condicional
&&
“e” lógico/condicional
or
“ou” lógico/condicional
||
“ou” lógico/condicional
not
Negação
&
“e”
|
“ou”
^
“ou exclusivo”
!
Negação

Não é necessário usá-los em conjunto com operadores relacionais, embora sejam comumente usados.
São conhecidos como operadores condicionais porque impõem uma condição para o retorno, onde cada operador tem uma condição diferente.

and :
Este operador avalia duas expressões, uma que o precede e a que vem a frente do and, e verifica se as duas expressões retornam true para então a operação retorna true também, se pelo menos uma das expressões retornar false, a operação também retornará false independente da outra expressão retornar true ou false.Exemplos:

*Perceba que foram necessários parênteses no código, sem eles não seria possível ver o verdadeiro efeito do operador direto como foi feito.

&& :
Tem o mesmo efeito do operador and.

or :
Avalia duas expressões da mesma forma que o operador and, porem este verifica se a primeira expressão ou a segunda expressão tem valor true para o operador poder retornar true, ou seja, pelo menos uma das expressões tem que ser verdadeira para a operação retornar true, consequentemente, se nenhuma das expressões forem true a operação retornará false. Exemplos:

*Perceba que foram necessários parênteses no código, sem eles não seria possível ver o verdadeiro efeito do operador direto como foi feito.

|| :
Tem o mesmo efeito do operador or.

not :
Este operador avalia apenas uma expressão. Como descrito na função, ele é um operador de negação, portanto ele nega o valor, e essa negação é simplemente uma inversão do valor, ou seja, se o valor for true será invertido para false, e se for false será invertido para true. Exemplos:

*Perceba que foram necessários parênteses no código, sem eles não seria possível ver o verdadeiro efeito do operador direto como foi feito.

! :

Tem o mesmo efeito do operador not.

& :
Este é um pouco mais complicado. Quando se trabalha apenas com lógica(true ou false) o operador tem a mesma função do &&. Veja os exemplos:


 Ao trabalhar com números, as coisas mudam um pouco. Primeiro os números envolvidos na operação são transformados em números binários para o operador iniciar uma operação lógica do tipo and bit a bit, ou seja, vai verificar aplicar a lógica and comparando cada dígito do número para formular uma resposta de retorno que será transformada para decimal novamente. Exemplos:

Antes de iniciar a análise dos exemplos, devo citar que é preciso ter em mente que um número em binário é apresentado apenas pelos números 0 e 1, e que para efeito de calculo, considere 1 como true e 0 como false, isso para facilitar o entendimento do operação and bit a bit.

*OBS: O bit pode ser encarado como o número de dígitos do número binário.
*OBS: Conversões de decimal para binário e vice-versa são necessárias porque a linguagem que a máquina utiliza é diferente da humana, e usa um outro sistema numérico conhecido como binário que utiliza apenas de 0 e 1 para construção de seus números. Então a comunicação homem-máquina-homem com maior facilidade implica nestas conversões.

Vamos analisar a primeira operação. Primeiro os números foram transformados de decimais para binários:
DECIMAL
BINÁRIO
15
1111
1
1

Em seguida é feita a operação lógica and bit a bit:

1111 and 0001 => 1111
                     0001
                     -------
                     0001

O resultado agora é convertido para decimal novamente e impresso na janela gerada pelo comando printpara podermos ver o valor de retorno:
BINÁRIO
DECIMAL
0001
1

Ao testar o código verá que será exatamente 1 o valor retornado.

Agora demonstrando o segundo exemplo:
Primeiro os números foram transformados de decimais para binários:
DECIMAL
BINÁRIO
11
1011
14
1110

Em seguida é feita a operação lógica and bit a bit:

1011 and 1110 => 1011
                    1110
                    -------
                    1010

O resultado agora é convertido para decimal novamente e impresso na janela gerada pelo comando print para podermos ver o valor de retorno:
BINÁRIO
DECIMAL
1010
10

Ao testar o código verá que será exatamente 10 o valor retornado.

*OBS: Escrever 0001 ao invés de escrever apenas 1, foi apenas uma forma mais simples de explicar.

Mesmo hoje em dia ser muito fácil encontrar calculadoras que façam essas conversões para você(geralmente qualquer computador vem com um software de uma calculadora do tipo), seria legal como é feita estas conversões na mão.

DECIMAL para BINÁRIO

Simplesmente deve dividir o número que deseja converter para binário, dividendo, por 2(porque que números binários são de base 2, lembre-se BI=2), divisor, não se importando com o resto da divisão(o resto será 1 quando existir) caso exista(ele será usado depois), evitando assim números com vírgula. O resultado da divisão(quociente) será o nosso novo dividendo desde que ele não valha 1. Este processo deve ser repetido até o quociente valer 1. Então é preciso juntar o valor deste quociente final que sempre será 1 com os valores de resto das divisões anteriores, seguindo da última para a primeira. Uma ilustração para ajudar a entender:


BINÁRIO para DECIMAL

Para essa conversão é preciso conhecer exponenciação. Primeiro um exemplo em seguida um explicação, será melhor fazer desta forma para explicar:

*OBS: o sinal ** representa elevar a uma potencia, portando, 2**2 é o mesmo que 2², ou 2 elevado a 2.

Passando 1111 para decimal:

1 x 2**3 + 1 x 2**2 + 1 x 2**1 + 1 x 2**0 = 15

Passando 1110 para decimal:

1 x 2**3 + 1 x 2**2 + 1 x 2**1 + 0 x 2**0 = 15

Pelos exemplo acima, é possível perceber que é somado o valor resultante de cada bit, e o valor de cada bit muda conforme sua “posição”(qual digito) no número, da mesma forma que no sistema decimal o primeiro digito vale unidades, o segundo dezenas, terceiro centenas, etc. Só com os números binários o primeiro digito vale 2 elevado a 0, o segundo 2 elevado a 1, o terceiro 2 elevado a 2, e assim segue.
Assim como nos decimais, 0(zero) dezenas significa que não tem dezenas, nos binários o bit 0 significa que não tem aquele digito, então não vamos incluí-lo no cálculo, para isso bastou multiplicar por 0(zero) o valor da potencia resultante da casa em questão.
Isso é o básico sobre a conversão entre estes dois tipos, ainda existem alguns detalhes com relação a conversão do número quando há virgula. Para não continuar a prolongar está explicação que foge um pouco do assunto em questão é melhor que os interessados em saber mais sobre essas conversões tentem “andar por suas próprias pernas“, pesquisando por conta própria, ou até mesmo, para os mais empolgados, tentar descobrir sozinho apenas analisando o que já foi passado.

Continuando com o operador &, não utilize para trabalhar diretamente com objetos do tipo string, pois isso ocasionará erros.

Existe uma situação onde este operador age diferente das situações anteriormente vistas. Quando está trabalhando com objetos do tipo array.
Nessa situação, ele busca a intersecção entre as duas arrays avaliadas, ou seja, valores em comum entre elas. Então não importa o tipo de objetos armazenados nessa array já que o operador não precisa “mexer“ nestes valores.
Ao final, o operador retorna como resposta uma array com os valores em comum entre as duas arrays avaliadas, organizadas conforme os valores estão organizados na primeira array da operação e sem repetir valores iguais mesmo que exista a repetição do mesmo valor várias vezes nas duas arrays avaliadas. Se não houver valores em comum a função retorna uma array vazia. Exemplos:


Na imagem do código acima foi colocado na frente de cada operação um comentário seguido do valor que será retornado(como vem sendo feito em todos exemplos), mas é importante ressaltar que o valor retornado é um array carregada com os valores citados(isso ajuda a explicar o porque do “13“, por exemplo, que na verdade é “1” e “3”).

| :
Funciona da mesma forma que o operador &, porém, ao invés de fazer a operação lógica and executa-se a operação or, tanto para o bit a bit, como para valores lógicos(true e false), tanto para arrays. Exemplos:

Perceba como o resultado é idêntico ao resultado dos exemplo com operador or(||).


O procedimento é idêntico ao do operador &, porém, a operação bit a bit usou a lógica or ao invés de and. Veja:
DEC
BIN
14
1110
3
0011

1110 or 0011 => 1110
                  0011
                  ------
                  1111

DEC
BIN
1111
15


Ao trabalhar com arrays, ao contrario do operador & que buscava a intersecção entre as arrays, o operador “|” busca a união entre elas, formando uma nova array seguindo as mesmas regras de organização do operador &: ordem em que aparecem os valores da primeira array da operação; sem valores repetidos mesmo que hajam vários iguais nas duas arrays; o valor retornado é um array com os valores dos dois operandos. Caso a array retorne vazia, significa que não existem valores em nenhuma das arrays da operação(nil).

*OBS: também não é possível operar valores do tipo string com este operador.

^ :
Funciona da mesma forma que os operadores & e |, porém, executa-se a operação lógica conhecida como ou exclusivo, tanto para o bit a bit, como para valores lógicos(true e false).
O operador ou exclusivo, quando usado com valores lógicos(true e false), retorna verdadeiro quando as duas expressões avaliadas forem diferentes(uma true e a outra false), e retorna false quando as duas expressões são iguais(as duas são true ou as duas são false). Exemplos:


Para a operação bit a bit, assim como foi visto anteriormente, considere nos números binários “0” como false e “1” como true para a comparação bit a bit da operação com números, seguindo aquele mesmo processo dos anteriores.


Resolução:
DEC
BIN
14
1110
3
0011

1110 ou exlusivo 0011 => 1110
                              0011
                               ------
                               1101

BIN
DEC
1101
13


*OBS: também não é possível operar valores do tipo string com este operador.
*OBS: não é possível operar arrays com este operador.


Operadores de deslocamento

Operador
Função
>>
Desloca bits a direita
<<
Desloca bits a esquerda


Eles servem para deslocamento de bits. Assim como os operadores bit a bit vistos anteriormente, estes também necessitam de conhecimento sobre binário e decimal.

 O operador “>>“ avalia duas expressões, uma que o precede e outra logo em seguida do operador(EX: A>>B). Onde B é o número de bits que serão deslocados a direita em A, isso significa que B representa quantos dígitos serão “empurrados” para fora do número em binário. Exemplo:


O que aconteceu foi o seguinte:
DEC
BIN
15
1111



Simplesmente é isso o que é feito. Lembre-se, este operador só funciona com dados do tipo Integer(números inteiros).

O operador “<<“ também avalia duas expressões, uma que o precede e outra logo em seguida do operador(EX: A>>B). Onde B é o número de bits que serão deslocados a esquerda em A, isso significa que B representa quantos dígitos serão “adicionados”  ao número em binário(os bits adicionados tem valor “0“). Exemplo:


O que aconteceu foi o seguinte:
DEC
BIN
15
1111



Simplesmente é isso o que é feito. Lembre-se, este operador só funciona com dados do tipo Integer(números inteiros).


Operadores de Atribuição


O principal operador de atribuição é o “=“, ele serve para atribuir valor a um objeto.
Para entender os outros operadores é preciso entender este, que por sinal é muito simples. Já vimos ele em funcionamento no capítulo 2 quando atribuímos valores as nossas variáveis. É importan ressaltar que o operador = não é a mesma coisa que o sinal =  que usamos na matemática, este ultimo diz que duas coisas são iguais, já aqui nosso operador, de forma curta e grossa, diz para a expressão da esquerda ter o valor da expressão da direita. Exemplos:


Dando atenção especial para a linha:

var = var + 2

Podemos começar a entender os outros operadores de atribuição.
O que acontece é que o novo valor da variável var é igual a “var + 2”.
E existe uma operador equivalente a isto, o operador “+=“, veja como ficaria o exemplo acima utilizando este operador:

var += 2

O resultado será o mesmo. O único cuidado que deve ser tomado é a certeza do objeto var ser do tipo que o operador funcione.
A tabela a seguir mostra vários operadores seguem a mesma linha, a diferença está na operação que eles executam:

Exemplo
Equivalente
var += 2
var = var + 2
var -= 2
var = var - 2
var *= 2
var = var * 2
var /= 2
var = var / 2
var %= 2
var = var % 2
var **= 2
var = var ** 2
var &= 2
var = var & 2
var &&= 2
var = var && 2
var |= 2
var = var | 2
var ||= 2
var = var || 2
var >>= 2
var = var >> 2
var <<= 2
var = var << 2

Comentários:
Os códigos estão sendo escritos no editor de scripts do RPGMakerXP e em seguida é tirado uma screenshot do código para servir de exemplos na apostila, ou seja, sendo uma imagem o leitor não poderá copiar os códigos para testar os exemplo. A idéia e fazer com  que o leitor escreva ele mesmo os códigos ao invés de apenas copiar e colar. A partir do próximo capítulo os códigos começaram a ser escritos, pois a esta altura o programador já deve ter se familiarizado um pouco com o editor e percebido que as vezes quando estamos escrevendo acabamos errando e isso interfere em nosso programa, desta forma aprendeu como corrigir alguns erros.

Agradecimentos:
zecomeia
livro “Ruby: Investigando a Linguagem” por Ivan Mecenas (Editora Alta Books)

Nenhum comentário:

Postar um comentário