Está aula irá apresentar alguns tópicos importantes sobre programação que devem ser revisados.
Variáveis
O computador, grosso modo, manipula dados. Os dados são separados em tipos, conhecidos como tipos básicos ou tipos primitivos, que compõem todos os outros tipos.
Tipos básicos de variáveis
Tipo Inteiro (código/comando: int) – Representa os números inteiros, por exemplo -1, 0, 1, -50, 30. No dia-a-dia, podemos considerar o número de pessoas em um lugar como um tipo inteiro, já que não dá para contar “meia pessoa”.
Tipo Real ou Ponto Flutuante (código/comando: float) – Representa os números reais, que são escritos com vírgula, por exemplo “5.3”, “-0,3359”, “10.00” (por ter vírgula, mesmo que o número depois da virgula seja apenas zero, ainda é um ponto flutuante). O nosso dinheiro pode ser visto como um valor real ou tipo float.
Tipo Lógico ou Booleano (código/comando: bool) – São os dados que possuem apenas dois valores distintos: verdadeiro ou falso. Por exemplo, o estado de uma luz: acesa ou apagada; dois valores distintos, mas o que é verdadeiro ou falso fica pela interpretação do programador.
Para armazenar os valores dos tipos (float, int, char, bool), usamos uma coisa chamada variável. O nome é “variável”, porque o valor que ele guarda pode mudar ao longo da execução do código – O SEU VALOR, e não o seu tipo.
A variável que guarda o dinheiro da carteira do jogador funciona dessa forma, sempre possuirá o tipo int (não lembro de um jogo que vendedores cobrem centavos), mas seu valor muda toda hora.
Declaração de variável
Dizemos ao computador quais variáveis queremos ou precisamos declarando-as – escrevendo o seu tipo seguido do nome:
int preço do produto; (int é o tipo e preço do produto é o nome)
Contudo existem regras para declaração de nomes:
- Não pode haver espaços caso o nome seja composto;
- Não pode iniciar com números;
- Não pode conter caractere especial (! @ [ ‘ > &, entre muitos outros).
Podemos também inicializar a variável com um valor desejado. Alguns exemplos corretos:
int preco_do_produto = 10;
int precoProtudo = 10;
int PrecoProduto = 10;
int preco1 = 10;
E exemplos INCORRETOS:
int preçoProduto = 10;
int 1preco = 10;
int #preco = 10;
int preco.produto = 10;
Operadores
Vamos apresentar aqui as operações mais comuns entre as linguagens de programação, estas operações são separadas em:
Operadores Aritméticos: as operações matemáticas conhecidas: adição, subtração, multiplicação e divisão.
Operadores Relacionais: são operadores usados para comparação entre variáveis. Por definição o resultado dos operadores é lógico (verdadeiro ou falso). Estes são:
Operadores Lógicos – servem para combinar expressões, geralmente formadas pelos operadores relacionais (x < y E x > z). Eles são (a forma de escreve-los podem variar de linguagem para linguagem, sendo também um caso raro):
Exemplo de operadores:
dinheiroFinal = meuDinheiro – produtoPreco;
if(meuDinheiro == produtoPreco)(...)
if(meuDinheiro > produtoPreco || valeCompra > 1) (...)
Há outro operador importantíssimo, o igual (=). Na programação ele não representa igualdade, mas ATRIBUIÇÃO. No nosso exemplo, podemos entender que é ATRIBUÍDA à variável “dinheiroFinal” o resultado da conta, OU, que “dinheiroFinal” RECEBE o valor resultante conta. É exatamente por isso que a comparação entre valores iguais é feita usando “dois iguais” (==), e não um só. Reforçando: “=” – “recebe”; “==” – “é igual a? ”.
Estruturas de Seleção
float nota1, nota2, nota3;
DarNota(nota1);
DarNota(nota2);
DarNota(nota3);
float media = (nota1 + nota2 + nota3)/3;
Exibir(media);
Repare que esse trecho ocorre um passo atrás do outro, não existe nenhum aviso sobre média baixa ou aprovação do aluno.
Para incorporar essas questões no código podemos usar a Estrutura de Seleção, que irá executar um bloco de ações caso uma condição pré-estabelecida seja verdadeira.
If...Then, Else (Se....Então, Senão)
É a mais comum, e a única que revisaremos.
É uma estrutura de seleção que testa uma condição: se ela for verdadeira, executa um bloco de ações, se falsa executa outro (se houver). Podemos também testar condições dentro de outros blocos. Vamos a um exemplo:
Veja que para separar os blocos usamos chaves (“ { } ”), elas determinam o código a ser executado.
Comparamos o resultado da média das notas, e, caso a média seja igual ou maior que a média de aprovação (media == 5.0; media > 5.0), há uma nova seleção para executar outras duas ações internas. Repare que se a media for maior ou igual a 5.0, o primeiro “if” será falso, logo o que executará é o código dentro das chaves do “else”.
Estrutura de Repetição
Repetição Pré-Testada (While)
A ideia é que, enquanto uma condição for verdadeira, o bloco de código será executado. Exemplo:
Enquanto o contador for menor que o valor limite, o código é executado – neste caso, o valor da variável “contador” nunca chegará a 10 porque o limite foi declarado recebendo 10.
Repetição com Variável de Controle (For)
Usa variáveis com condições pré-determinadas para controlar o número de repetições.
Inicializa-se uma variável de controle (contador), que sofrerá incremento a cada repetição. O termo de incremento “contador += 1”, possui o mesmo efeito que “contador = contador +1” usado no exemplo do “While.
Sempre que a condição de parada não for atingida, ele sofrerá o incremento, esta condição de parada é definida pelo termo do meio “contador < limite” – e em seguida o “for” já incrementa a variável “contador”.
Outro detalhe é que, mesmo com um loop dentro de outro, cada loop deve ser executado por completo para seguir o restante do código, ou seja, o loop interno deve rodar até o fim para dar continuidade ao loop externo, e a cada vez que isso ocorre, o loop interno recomeça.
Funções
Se pararmos para analisar os códigos da aula anterior, vemos que as ações executavam seguidas uma embaixo da outra. Podemos tirar duas conclusões, num primeiro momento:
Imagine um algoritmo com inúmeros passos. Se programarmos como nos exemplos, o código ficaria bagunçado, teríamos inúmeras variáveis declaradas a todo momento, e, para entender o código e identificar cada um dos passos, seria uma loucura.
magine, também, que precisássemos efetuar um mesmo passo repetidas vezes, em vários momentos. Escreveríamos o mesmo passo muitas vezes sem necessidade, convenhamos, haja paciência para fazer isso.
Nessa perspectiva, a melhor opção é separar o código em Funções, separando os passos do nosso algoritmo, organizando cada coisa em um lugar definido.
Para dar sentido ao conceito de Função, imagine que o jogo principal (onde você controla o personagem pelo cenário) roda com um bloco de código principal. Quando você precisa acessar menu de opções, ou menu de equipamentos, itens – há outro bloco de código que executará esses menus.
Tente imaginar como seria, num bloco só, organizar toda essa sequência de códigos, inviável, por tanto o código dos menus deve ser organizado fora do código principal para facilitar o entendimento do código, e ser possível de reaproveita-lo toda vez que necessário.
Escrevendo uma função
A aparência de uma função em programação pode variar de linguagem para linguagem (seria uma maravilha serem todas iguais, não é?), mas, de forma geral, são assim:
Vamos por partes:
Tipo de Retorno: indica o tipo do valor de retorno. Por exemplo, se a função busca uma letra presente numa frase e retorna essa letra, então o tipo de retorno seria ‘char’.
Nome da Função: o nome usado para chamar a função. Segue as mesmas regras das variáveis. Contudo, é possível ter funções com nomes iguais.
Parâmetros: os parâmetros de uma função são declarados dentro dos parênteses. Mesmo que ela não receba nenhum parâmetro, é obrigatória a presença de parênteses (eles ficariam vazio). Cada parâmetro é separado por vírgula e segue a dupla ‘Tipo e Nome’.
Tipo do Parâmetro: indica o tipo do parâmetro que a função deve receber. Se por exemplo, a função deve receber uma frase, então o parâmetro seria ‘(string frase)’.
Nome do Parâmetro: Segue a mesma lógica e regra das variáveis.
Retorno de uma Função: quando a função executa, ela pode retornar valores. Para retornar, é necessário chamar o comando de retorno – ‘return’. Toda vez que ele é chamado, a função obrigatoriamente encerra, retornando o valor ou variável na frente dele, para onde a função foi chamada. Adiante há um exemplo de uso de função.
Funções ‘Void’: existem também funções que não retornam valor nenhum, nesse caso o tipo da função é ‘void’, e não é necessário haver um ‘return’.
Exemplos
Escrevendo ou definindo uma função:
Chamando uma função pronta:
Um ponto importante é: passamos por parâmetro apenas o valor que a variável guarda – isso é chamado de passagem de parâmetro por valor – onde o valor é copiado (por ser copiado, a função não manipula a variável original) para dentro da função através dos parâmetros. Para alterar a variável original, é necessária a passagem de parâmetro por referência, que será falado em outro momento, por ser mais avançado.
Lembrando que não é necessário passa o retorno de uma função para uma variável. Basta apenas escrever o nome da função e finalizar a linha com ‘;’.
Programação Orientada a Objeto
A orientação a objeto é baseada em dois conceitos primários – Classes e Objetos. As classes são Estruturas Heterogêneas que permitem às suas instancias (variáveis da estrutura, no caso classe) ter variáveis e funções dentro de sua estrutura. Vamos nos situar num exemplo de raças dentro de um RPG.
Quando se cria um personagem, é necessário escolher uma raça, uma profissão, gênero, atributos físicos, também possuem ações dentro do jogo, como ataque, fuga, etc.
Veja, todo personagem criado terá pelo menos a maioria dessas características, exatamente por isso que chamamos todos de ‘personagem’, como um termo genérico.
Na programação, para facilitar, podemos englobar todas as características numa estrutura só. Essa estrutura é chamada de classe, que no caso, a classe poderia se chamar ‘Personagem’. E cada personagem criado representa um ‘objeto’ da classe ‘Personagem’.
Portanto o Ogro chamado Estebam e o Humano chamado José serão considerados objetos da classe Personagem, possuindo uma variável para sua raça, outra para profissão, e assim por diante.
É como se criássemos um tipo personalizado, capaz de guardar outras variáveis e funções.
Uma outra sacada da orientação a objeto é o que se chama Herança, uma classe pode herdar os atributos (variáveis e funções) de outra classe ‘superior’.
Mudando o exemplo da classe Personagem, temos o seguinte: classe-pai – Personagem - que possui atributos raça, profissão, gênero e tipo de arma preferida; e três classes-filhas, Humano, Ogro e Elfo. Quando for criada uma personagem para o jogador, ela será um objeto de uma das três classes (Humano, Ogro e Elfo). Logo o Ogro Estebam será um objeto da classe Ogro, que herda atributos da classe Personagem.
Mas lembre-se, que cada classe pode ter seus próprios atributos e ainda assim herdar outros. Portanto, a classe Ogro pode ter atributos que a classe Personagem não terá, mesmo mantendo a herança.
A Herança facilita a especialização de classes. Cria-se classes genéricas que guardam atributos generalizados (como a classe Personagem que possui elementos comuns para todo tipo de personagem), e para cada caso particular cria-se classes especialistas, como por exemplo limitar o tipo de armas que uma raça é capaz de utilizar, ou determinadas ações que apenas uma raça é capaz de fazer (como uma raça vampiro ser a única capaz de sugar sangue).
Uma classe possui um aspecto próprio de declaração:
Vamos por partes:
Nome da Classe: define o nome da classe e segue as regras dos nomes das variáveis.
Modificador de acesso: indica o nível de acesso. ‘public’ permite acesso a qualquer código externo a classe. ‘protected’ permite acesso às classes filhas, mas proíbe a qualquer outro acesso externo. ‘private’ proíbe qualquer acesso externo à própria classe, inclusive das classes filhas.
Atributos: variáveis que pertencem a uma classe são chamadas de atributos. Funcionam quase da mesma forma que as variáveis, mas possuem modificadores de acesso.
Construtor da Classe: define a inicialização de um objeto e possui sempre o mesmo nome da classe. Por exemplo o construtor de uma classe Vector2, pode ser Vector2 (x, y), pois para criar um vetor, o mínimo necessário são suas coordenadas.
Método: funções que pertencem a uma classe são chamadas de métodos. Funcionam quase da mesma forma, mas possuem modificadores de acesso.
Exemplos
Definindo uma classe:
No ‘position’, ‘speed’ e ‘direction’, podemos entender que foi herdado da classe ‘GameObject’, e por isso não estão declarados, mas ainda assim podem ser usados no código.
Usando objetos:
Lembrando que os modificadores de acesso ficam a cargo do programador, ele quem define qual quer usar.
Exercícios – Revisão de Programação
1) Escreva um código verifique entre 3 números qual é o maior.
2) Faça uma função que recebe um valor inteiro e verifica se o valor é positivo ou negativo. A função deve retornar um valor booleano.
3) Escreva um programa em C++ que preencha uma matriz 3×3 com valores aleatórios entre 0 e 100.
4) Escreva um programa que rode dois “for”, sendo um crescente e outro decrescente. Para cada iteração exiba a multiplicação entre os iteradores.
5) Escreva um código em C++ que lê uma temperatura do teclado em graus Celsius e exiba-a em Fahrenheit. A fórmula de conversão é F = (9 * C + 160).
6) Faça um código que recebe um valor do teclado, e exiba se o quadrado desse valor é menor que ele quadruplicado.
7) Escreva um código que contenha 2 funções: uma que calcule a potência K de um valor X, e outra que calcule a raiz quadrada de um valor X. O código deve receber valor do teclado e exibir os resultados obtidos das funções.
8) Faça uma função que recebe, por parâmetro, uma matriz A(5,5) e retorna a soma dos seus elementos.
9) Crie uma classe chamada “FormaGeometrica”, e duas classes chamadas “Retangulo” e “Triangulo”. As classes “Retangulo” e “Triangulo” devem herdar da “FormaGeometrica”. Escreva as classes de forma que, as classes filhas utilizem no mínimo 1 atributo herdado da classe pai, e ainda que as classes filhas tenham no mínimo 1 método próprio. O método próprio deve ser o cálculo da área. O atributo herdado a ser usado fica a livre escolha.
Entrega 22/02. Grupo máximo: 2 pessoas.
Enviar código(s) fonte(s) para mrplcardoso@gmail.com, com assunto “Exercicio 01 – P2d3d I 2º Games”. No corpo do e-mail deve estar o código fonte e o nome das pessoas do grupo.
Trabalhos entregues de forma diferente NÃO serão aceitos.