25 outubro 2006

Lógica de Programação 10

Neste tópico vamos ver alguns dos operadores da nossa linguagem. Vamos começar com os operadores matemáticos:

(3 + 5) * 2 - (10 / 2)
Como você pode ver, os operadores são muito parecidos com aqueles que a gente aprende na escola: + é soma, - é subtração, * (asterisco) é multiplicação e / (barra) é divisão. Os parênteses funcionam como na matemática, mudando a ordem em que as expressões são avaliadas. Se não há parênteses, a ordem padrão é utilizada: multiplicação e divisão primeiro, depois soma e subtração.

O resultado de operadores matemáticos, que precisam de um número de cada lado, é sempre outro número: primeiro 3 + 5 é calculado, depois 8 * 2, então 10 / 2 (por causa do parênteses) e finalmente 16 - 5, resultando em 11.

Outro tipo de operadores são os de comparação:
3 == 5
3 != 5
3 < 5
1 <= 1
2 >= -5
Esses operadores precisam de um número de cada lado (por enquanto) e retornam não um número, mas um valor booleano. Valores booleanos podem apenas ser falso ou verdadeiro. Nesse exemplo, 3 é diferente de 5, então 3 == 5 (o operador para igual) retorna falso e 3 != 5 (o operador para diferente) retorna verdadeiro. Como 3 é menor que 5, 3 < 5 também retorna verdadeiro. Um é menor ou igual a 1, então 1 <= 1 também é verdadeiro, assim como 2 >= -5.

O último tipo de operador que vamos ver agora são os operadores lógicos:
falso ou verdadeiro
não verdadeiro e 3 > 2
salário > 5 * salário mínimo e idade < 30 e não solteiro
Alguns desses operadores nós já vimos, sempre precisando de um valor booleano de cada lado (com exceção do operador não). O operador ou retorna verdadeiro se qualquer um dos valores é verdadeiro (no exemplo, falso ou verdadeiro retorna verdadeiro). O operador não inverte o valor booleano: se era verdadeiro, retorna falso e vice-versa. O operador e retorna verdadeiro só se os dois valores são verdadeiros (o exemplo retorna falso, já que não verdadeiro é falso). A terceira linha mistura todos os operadores que nós já vimos: retorna verdadeiro se a variável salário tem valor maior que 5 vezes o salário mínimo (outra variável) e ao mesmo tempo idade é menor que 30 e ao mesmo tempo a variável solteiro é falsa.

05 outubro 2006

Lógica de programação 9

No último post nós vimos como trocar um número máximo de lâmpadas, e também como trocar apenas as lâmpadas queimadas dentro desse número máximo. Isso é o que nós conseguimos até agora:

trocas = 0
enquanto trocas < 10 faça
se não existir lâmpada queimada então
interrompa
fim se
// todo aquele código que troca uma lâmpada
trocas = trocas + 1
fim enquanto
Como você pode ver, estamos limitando o número de trocas na condição da repetição enquanto que dentro do bloco de código repetido nós usamos um condicional para interromper a repetição quando terminamos de trocar as lâmpadas queimadas. Vamos ver o que acontece se trocarmos as condições de lugar:
trocas = 0
enquanto existir lâmpada queimada faça
se trocas >= 10 então
interrompa
fim se
// todo aquele código que troca uma lâmpada
trocas = trocas + 1
fim enquanto
Veja como as condições se inverteram. Isso aconteceu porque a condição do enquanto deve ser verdadeira durante toda a repetição, até que fica falsa quando a repetição deve terminar; por outro lado, a condição do condicional é falsa durante toda a repetição, ficando verdadeira para sinalizar o fim das trocas de lâmpadas. Se você simular esse código vai descobrir que ele faz exatamente a mesma coisa que o anterior.

Será que existe outra maneira de fazer isso? Claro: nós podemos unir essas duas condições numa expressão só, porque no fundo elas servem para dizer "continue repetindo... continue repetindo... pare!". Se é assim, nós podemos colocá-las no nosso enquanto e mandar aquele condicional passear:
trocas = 0
enquanto existir lâmpada queimada e trocas < 10 faça
// todo aquele código que troca uma lâmpada
trocas = trocas + 1
fim enquanto
Para fazer isso, usamos uma nova palavra reservada: e. Esse tipo de palavra chave (outro nome para palavra reservada) também é conhecido como operador, porque pega expressões, fazendo alguma operação com elas, e retorna o resultado da operação. O operador e retorna um valor verdadeiro se as expressões da cada lado dele (direito e esquerdo) forem verdadeiras ao mesmo tempo. Esse código faz a mesma coisa que os dois anteriores, mas de uma maneira mais elegante e resumida.

Na próxima parte vamos conhecer outros operadores da nossa linguagem.

03 outubro 2006

Lógica de programação 8

Nós já sabemos trocar todas as lâmpadas de uma sala usando repetição (se não lembra veja a parte 6 dessa série), mas digamos que o SINDETROL (Sindicato dos Estagiários Trocadores de Lâmpadas) tenha feito um acordo que limita as trocas de lâmpadas a 10 por dia. Nesse caso, nós vamos ter que contar as trocas de lâmpadas e parar quando chegarmos na décima troca. Para fazer isso podemos usar uma variável:

trocas = 0
enquanto trocas < 10 faça
// todo aquele código que troca uma lâmpada
trocas = trocas + 1
fim enquanto
Vamos tentar entender o que está acontecendo. No começo, o valor inicial da variável trocas é zero, porque ainda não trocamos lâmpadas hoje. Como zero é menor que 10 o código que troca uma lâmpada é executado e trocas é somado com 1. Como 1 ainda é menor que 10, trocamos mais uma lâmpada e trocas passa a ser 2. Isso acontece até que trocas está valendo 9, porque já trocamos 9 lâmpadas, e o código de troca de lâmpadas é executado pela última vez. Depois disso, trocas é incrementado para 10. Como 10 não é menor que 10 a repetição pára e o estagiário vai tomar um cafezinho. Note que só podemos incrementar o valor de trocas depois que realmente fazemos uma troca. Pronto. Fim do tópico.

Não! Como você deve lembrar, a repetição da parte 6 tinha como condição ainda existir alguma lâmpada queimada para ser trocada. Agora estamos trocando 10 lâmpadas sem nem ver se elas estão queimadas ou não! Vamos tentar consertar isso com um comando novo:
trocas = 0
enquanto trocas < 10 faça
se não existir lâmpada queimada então
interrompa
fim se
// todo aquele código que troca uma lâmpada
trocas = trocas + 1
fim enquanto
Agora, enquanto a repetição limita o número de trocas a 10, o condicional que colocamos logo no começo da repetição trata de interromper a repetição se não tiver mais lâmpadas queimadas. Se as lâmpadas queimadas acabaram o comando interrompa cancela a repetição, fazendo com que o computador execute o comando seguinte ao fim da repetição.

Mas essa não é a única forma de fazer isso (dica: o que acontece se usarmos o mesmo mecanismo, mas com as condições da repetição e do condicional trocadas?). Na próxima parte, vamos ver variações desse exemplo.

02 outubro 2006

Lógica de programação 7

Como eu prometi, hoje vamos aprender a contar. Quer dizer, espero que você já saiba contar: o que nós vamos aprender é como fazer o computador contar. Para fazer isso, nós vamos usar outro conceito importante, chamado variável. Uma variável é um espaço na memória do computador que pode guardar um dado qualquer. As variáveis têm nomes, para que o computador saiba (e o programador também!) de que espaço na memória que a gente está falando. Na nossa linguagem nós criamos uma nova variável quando damos um valor para ela pela primeira vez:

x = 10
Isso faz com que o computador reserve um espaço na memória para guardar o valor da variável x e ponha o valor 10 nesse espaço. Vamos criar mais variáveis:
y = 5
x = 11
soma = x + y
salário = 1654.32
salário anual = salário * 12
média = (4 + 5 + 2 + 3.14159) / 4
Na primeira linha criamos uma nova variável y com o valor 5. Assumindo que esse exemplo é a continuação do outro, mudamos o valor da variável x, que era 10 e passou a ser 11 (no mesmo espaço de memória em que ela estava antes, porque ela já existia quando mudamos o seu valor). Também criamos uma variável soma com o resultado da soma de x com y: o valor inicial de soma é 16. A variável salário tem um valor real, em vez de ser inteiro como nos casos anteriores. Note que na nossa linguagem o separador de casas decimais é o ponto e não a vírgula; a grande maioria das linguagens de programação usa esse formato, que não por acaso é como os americanos escrevem os números deles. A variável salário anual tem o valor de salário multiplicado por 12 (19851.84). Os parênteses funcionam como na matemática: a variável média tem a soma dos 4 valores divida por 4 (3.5353975).

Veja que nesses exemplos eu só usei o valor de uma variável depois de ter dado um valor para ela. Não importa qual a linguagem, é sempre importante garantir que a variável tem valor antes de começar usar o valor dela. Algumas linguagens dão um valor padrão (zero, por exemplo); em outras o computador avisa que você esqueceu de definir um valor inicial; outras não ligam pra isso e deixam o pepino pra você (pepino porque você não tem como saber o que você vai encontrar na memória). Você pode descobrir isso lendo a documentação ou o manual da linguagem.

Mas o computador ainda não está contando! Cadê? Cadê a contagem? Calma, esse tópico foi só a vaselina. No próximo vai.