Primeira Apostila - Noz Eh Maker
Primeira Apostila - Noz Eh Maker
Primeira Apostila - Noz Eh Maker
Create successful ePaper yourself
Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.
(Sere)Curso de Jogos CDJ<br />
<strong>Apostila</strong> I<br />
Conceitos de C/C++ I<br />
CasaDosJogos –<br />
http://www.casadosjogos.com.br<br />
2007
Introdução<br />
• Histórico e Apresentação da Linguagem:<br />
Linguagem C<br />
A linguagem C foi desenvolvida na década de 70, por Dennis Ritchie<br />
e Ken Thompson, baseando-se na linguagem B, e implementado para<br />
sistemas operacionais UNIX. Tanto C quanto B derivam da primitiva<br />
linguagem BCPL, onde B é a primeira letra de BCPL, e C, a segunda. C<br />
influenciou várias linguagens como D e Euphoria.<br />
C é uma linguagem de programação estruturada, de médio nível, e<br />
tem como ponto forte sua eficiência, leveza, poder e velocidade com<br />
códigos bem legíveis e de fácil interpretação. Uma de suas maiores<br />
vantagens é sua aproximação com a linguagem de leitura de máquina, ao<br />
mesmo tempo que mantêm grandiosa abstração de dados complexos ao<br />
programador.<br />
Linguagem C++<br />
De forma bastante “grosseira”, podemos ver o C++ como uma<br />
“atualização” ou “extensão” da linguagem C, mas é bem mais que isso.<br />
Basicamente, é definida por Bjarne Stroustrup como “C with classes”, ou C<br />
com classes. Esses conceitos de classe veremos futuramente no próximo<br />
curso.<br />
Foi desenvolvida em 1983, trazendo consigo principalmente<br />
vantagens ligadas à orientação a objetos, reutilização e aproveitamento de<br />
código, e muita facilidade na hora de organizar e montar seu código fonte.<br />
Essa linguagem influenciou várias outras, como C#, Java, D, PHP etc.
• Compiladores:<br />
Um compilador é um tipo de aplicativo que cria uma “camada de<br />
abstração” entre o programador e o computador. Em outras palavras, o<br />
compilador traduz tudo que é escrito por um usuário de um jeito que a<br />
máquina entenda, e de forma que interprete essa informação.<br />
Em todo o universo computacional, existem várias linguagens de<br />
programação categorizadas da seguinte forma:<br />
• Alto Nível (C++, Java)<br />
• Médio Nível (C, Pascal)<br />
• Baixo Nível (Assembly)<br />
Quanto mais baixo o nível, mais próximo estamos da linguagem de<br />
montagem da máquina. Um exemplo de linguagens de baixo nível que<br />
conhecemos é a linguagem de bits (0 ou 1) e Assembly (que trabalha<br />
diretamente com operações de registros e endereços de memória).<br />
Quando falamos de médio e alto nível, falamos de linguagens que<br />
cada vez mais “encobrem” detalhes na hora de implementar, e quanto<br />
maior o nível, menos detalhes específicos ligados a hardware teremos que<br />
nos preocupar. Por exemplo: se estivermos mexendo com C++, não<br />
precisaremos nos preocupar com qual endereço de memória ou parte física<br />
do disco teremos que guardar a informação. O compilador e a linguagem de<br />
programação se encarregará disso automaticamente.<br />
O compilador cria a “ponte de comunicação” entre uma linguagem<br />
humanamente simples e prática ao ser humano trabalhar, sem perder todo<br />
o excesso de informação e detalhes que a máquina precisa.<br />
Um compilador trabalha passo-a-passo da seguinte forma:<br />
• O compilador lê linha após linha (levando em conta o fluxo de<br />
código), verificando se toda a sintaxe foi descrita corretamente<br />
(se estiver errada, retornará uma mensagem de erro<br />
detalhada ao usuário);<br />
• Traduz o código-fonte de C++ (por exemplo) pra linguagem de<br />
máquina;<br />
• Se tudo for interpretado corretamente, ele irá criar um arquivo<br />
com extensão .OBJ, com todas as linhas traduzidas, e um<br />
arquivo .EXE, que é executado pelo sistema operacional;<br />
Outro aspecto importante são as evoluções na área de<br />
compiladores, que cada dia mais deixam de ser apenas “interpretadores de<br />
comandos”, e se tornam verdadeiros ambientes de desenvolvimento,<br />
trazendo consigo várias opções de compilação, depuração, bibliotecas<br />
prontas etc. Um exemplo de ambientes de desenvolvimento nesse estilo<br />
são aplicativos como o Eclipse e o Microsoft Visual Studio.
• C ou C++:<br />
Muitas pessoas confundem a relação entre C e C++. Trata-se de<br />
duas linguagens diferentes.<br />
O C é uma linguagem de programação estruturada, de médio nível,<br />
sendo bastante semelhante à linguagem Pascal (apesar de ter uma sintaxe<br />
bem diferente). O C++ reaproveita alguns conceitos e sintaxes do C, ao<br />
mesmo tempo em que acrescenta novos conceitos interessantes de<br />
bibliotecas e programação voltada à orientação a objetos.<br />
Não é o propósito desse curso detalhar as diferenças entre<br />
orientação a objetos e programação estruturada, por isso vamos a eles de<br />
forma sucinta:<br />
• Programação estruturada: Blocos de texto interpretados logicamente da<br />
primeira a última linha, sem modificações no fluxo de leitura.<br />
• Orientação a objetos: Vemos o conceito de classes e objetos. Ao invés de<br />
criarmos blocos de programas únicos e lidos da primeira a última linha, na<br />
orientação a objetos podemos interligar cada bloco de código em uma e<br />
mais classes, que podem ser lidas e executada por outras<br />
simultaneamente, da mesma forma em que o fluxo de leitura é<br />
completamente variável ao programador, aumentando o reaproveitamento e<br />
organização de código-fonte.
Usando o compilador<br />
• Criando projeto no Microsoft C++ 2005 Visual Studio<br />
Express:<br />
Primeiro passo:<br />
1) Baixe-o em:<br />
http://msdn.microsoft.com/vstudio/express/visualc/default.aspx/, instale e<br />
execute o Visual Studio.<br />
2) Quando o programa abrir, na guia principal do programa ao alto, clique<br />
em File<br />
3) Depois clique em New e depois Project, ou simplesmente aperte<br />
Ctrl+Shift+N<br />
Segundo passo:<br />
Se abriu uma janela escrita "New Project", então em "Project Files"<br />
escolha "Win32" e em "Templates", clique em "Win32 Console<br />
Application". Agora embaixo em "Name" dê qualquer nome ao projeto (por<br />
exemplo, chame-o de teste) e aperte OK.<br />
Terceiro passo:<br />
Em "Win 32 Application Wizard" aperte "Next >".<br />
Quarto passo:<br />
Em "Application Type" deixe "Console Application" como está, e abaixo,<br />
em "Additional options" marque a opção "Empty Project". Agora aperte<br />
"Finish".<br />
Quinto passo:<br />
1) É aqui que mais as pessoas confundem. Você sempre deve criar um<br />
projeto (como fizemos até o quarto passo) e em seguida adicionar os<br />
códigos fonte e coisas do gênero que ficam vinculados ao projeto criado,<br />
ok? Adicionaremos uma página de código fonte pra gerarmos nosso<br />
primeiro código.<br />
2) Agora na guia do alto, procure "Project" e depois "Add New Item". Ou<br />
apenas aperte CTRL+SHIFT+A<br />
Sexto passo:<br />
Com certeza em "Visual Studio installed templates" a opção "C++ File<br />
(.cpp)" deve estar marcada. Só vá em "name", dê um novo nome como<br />
teste1 e aperte Add.
Sétimo passo:<br />
Copie esse código como está abaixo, e cole no compilador:<br />
#include <br />
using namespace std;<br />
int main()<br />
{<br />
cout
• Criando projeto no Dev-C++ 4.9.9.2:<br />
Primeiro passo:<br />
1) Baixe-o em: http://prdownloads.sourceforge.net/dev-cpp/devcpp-<br />
4.9.9.2_setup.exe, instale e execute-o<br />
2) Quando o programa abrir, na guia principal do programa ao alto, clique em File<br />
3) Depois clique em New Project<br />
Segundo passo:<br />
1) Se abriu uma janela escrita "New Project", então na guia "Basic" escolha<br />
"Empty Project".<br />
2) Marque "C++ Project" abaixo.<br />
3) Dê um nome ao projeto.<br />
3) Aperte OK.<br />
Terceiro passo:<br />
Em "Create New Project" salve o projeto em alguma pasta de sua escolha.<br />
Quarto Passo:<br />
Aperte CTRL+N ou em “File”, e quando o compilador perguntar se “deseja anexar<br />
esse fonte ao projeto atual?” diga que sim.<br />
Agora basta colar o seguinte código na página de código-fonte em branco:<br />
#include <br />
using namespace std;<br />
int main()<br />
{<br />
cout
Sétimo passo:<br />
Deve abrir uma janela mostrando a mensagem "Estou pronto pra começar o curso<br />
de C++ da CDJ!" e algo como "Aperte qualquer tecla para continuar...". Se isso<br />
aparecer corretamente, então o compilador está em perfeito estado para uso!<br />
• Erros de compilação:<br />
Basicamente, quando terminamos de criar nosso código-fonte, o<br />
compilador realiza dois processos até termos o aplicativo final, que são: a<br />
compilação e a execução.<br />
Quando compilamos um código-fonte, realizamos um processo de<br />
verificação e interpretação de código, até ser possível que a máquina<br />
“entenda” e possa executar esses comandos. Isso é a compilação, e é<br />
nesse processo que se verifica se o código foi descrito corretamente.<br />
Para isso, quando é feita a compilação, na barra inferior desse<br />
aplicativo, são demonstrados status de verificação e integridade de erros, e<br />
o compilador retorna uma mensagem de aviso, se o código apresentar<br />
erros (digitação incorreta do programador) ou não. Se ele tiver erros, todo o<br />
processo de compilação é interrompido, e o compilador especifica qual é a<br />
causa da falha. Não se pode chegar no código-fonte final se houver erros<br />
de compilação.<br />
Outra informação importante, além dos avisos de erros, são os<br />
“warnings”. A diferença entre os dois vêm do fato de um “warning” não<br />
impossibilitar a execução de um código-fonte, mas sim que futuramente ele<br />
pode causar erros quando o programa já estiver sendo executado (por<br />
exemplo, um acesso a endereço de memória não especificado).<br />
• Gerando Executável:<br />
Feita a compilação, se ela foi executada corretamente, torna-se<br />
possível criar uma versão .EXE de seu código. Basta apenas clicar na<br />
opção Build de um compilador (no caso do visual Studio, é só apertar F7<br />
num código já compilado, lembre-se disso!).<br />
No processo de geração de executável, o compilador se utiliza de<br />
arquivos .OBJ (gerados na compilação), e se baseia em arquivos .CPP<br />
(arquivos de código-fonte de C++) para gerar o código .EXE final.
Primeiro programa<br />
“Hello World” é a clássica aplicação que todo programador iniciante<br />
cria quando começa a estudar uma linguagem, sendo um tipo de programa<br />
bem simples. Trata-se apenas de uma mensagem de texto “OLÁ MUNDO!”<br />
mostrada em tela.<br />
Fizemos isso na hora que criamos o projeto, agora vamos analisar o<br />
código linha após linha:<br />
#include <br />
using namespace std;<br />
int main()<br />
{<br />
cout
aquela linha (apesar de que nem sempre você coloca ponto e vírgula,<br />
iremos verificar isso com o tempo).<br />
int main()<br />
{<br />
//insira todo o código do aplicativo aqui<br />
return 0;<br />
}<br />
Aqui estamos definindo a função principal (main) do programa. Ela<br />
sempre é a primeira a ser executada obrigatoriamente pelo compilador, e<br />
todo o conteúdo do programa é executado nesse bloco de informação,<br />
entre as chaves { e }.<br />
O int é a definição de função integer (função de números inteiros).<br />
Iremos explicar melhor sobre tipos de dados (inteiros, reais) no próximo<br />
capítulo.<br />
Todos os comandos do seu aplicativo devem estar onde eu coloquei<br />
//insira todo o código do aplicativo aqui . Por exemplo, o comando cout<br />
que usamos.<br />
Já o return 0; tem a ver com o conceito de função. De forma bem<br />
resumida, toda função é um pequeno bloco de código fonte que retorna<br />
imediatamente um dado, ao final de sua execução. Óbvio que dependendo<br />
do tipo de função que seja, pode ser que não retorne nada. Ao executar o<br />
Return 0; estamos dizendo ao compilador que a função finalizou todas as<br />
suas tarefas, e que agora deve retornar ao compilador um resultado (ou<br />
valor) qualquer. Não se preocupe ainda com isso.<br />
A princípio, pense nisso como um comando que precisa ser utilizado<br />
em blocos da função int main(), de forma padrão.<br />
cout
}<br />
No Dev-C++ 4.9.9.2 é a mesma idéia, mas apenas com a utilização<br />
de mais uma função:<br />
#include <br />
using namespace std;<br />
int main()<br />
{<br />
cout
Variáveis<br />
• Conceito:<br />
São objetos que possuem a função de armazenar certos valores<br />
(como números, textos) que podem ser utilizados e trabalhados ao longo de<br />
um código.<br />
Por exemplo, pense num jogo, e que precisamos armazenar ao<br />
longo da partida informações vitais como vida (HP) do personagem, pontos de<br />
mana (SP), pontos de experiência (EXP), munição da arma, dinheiro<br />
armazenado, nome do jogador etc. Tudo isso ficaria armazenado em variáveis.<br />
Elas são vitais num programa.<br />
• Tipos de Variáveis:<br />
Existem diversos tipos, mas visando o nosso curso, vamos falar dos<br />
5 exemplos básicos mais comuns, que são:<br />
• Int (inteiros): são números inteiros comuns, que não aceitam valores<br />
decimais, frações, nem nada do gênero (exemplo: 1, 45, 87, 914). Uma<br />
variável int pode armazenar do valor -2.147.483.648 a 2.147.483.648.<br />
• Char (caracteres): Armazena um único caracter, de um possível conjunto<br />
de símbolos e letras. Podem armazenar até 256 valores de caracteres<br />
diferentes.<br />
• Float (reais): diferente dos inteiros, o float guarda valores numéricos<br />
ligados ao universo dos números reais (exemplo: 2,41 , 4,17 , 8,9592). Ele<br />
pode armazenar de 1,2e-38 a 3,4e38 (e = número elevado a)<br />
• Boolean (lógico): apenas determina valor do tipo true ou false, ou apenas<br />
verdadeiro ou falso. Por exemplo, se num jogo temos uma porta que só<br />
pode ser aberta com uma chave, podemos usar uma condição booleana<br />
que armazena se o jogador está com a chave ou não. Se estiver, é true,<br />
caso contrário, false.<br />
• Double: É apenas o valor de float estendido. Se for utilizar uma variável<br />
que precise de mais valores do que o float suporta, use double. Esse<br />
armazena de 2,2e-308 a 1,8e308.
• Como usar variáveis:<br />
Declarando (criando) variáveis<br />
Basta apenas definir seu tipo (int, char, float, double) junto de um<br />
nome qualquer, pra identificá-la. Por exemplo:<br />
Int var;<br />
Nesse exemplo, criamos uma variável do tipo número inteiro,<br />
chamada var. Não se esqueça do ponto e vírgula!<br />
Mais exemplos:<br />
Int main(){<br />
int pontos;<br />
return 0;<br />
}<br />
int main(){<br />
float raiz;<br />
return 0;<br />
}<br />
Atribuindo valores<br />
Vamos supor que ao criar um jogo, temos um personagem com<br />
pontos de vida no total de 100 pontos. Faríamos o seguinte (se a variável em<br />
questão já tiver sido declarada):<br />
pontos_de_vida = 100;<br />
Assim estamos definindo que a variável pontos_de_vida guarda o<br />
valor numérico inteiro 100.<br />
Vamos supor que, na segunda linha do código, o personagem morre.<br />
Assim:<br />
pontos_de_vida = 0;
Teríamos então, o seguinte código:<br />
Teste o seguinte código:<br />
int main(){<br />
//declaramos a variável<br />
int pontos_de_vida;<br />
//aqui a vida do personagem principal é 100<br />
pontos_de_vida = 100;<br />
//aqui a vida do personagem principal é 0<br />
pontos_de_vida = 0;<br />
return 0;<br />
}<br />
#include <br />
using namespace std;<br />
int main()<br />
{<br />
int valor = 20;<br />
cout
Por fim, um exemplo que se utiliza de valores booleanos e de<br />
caracteres (bool e char especificamente):<br />
#include <br />
using namespace std;<br />
int main()<br />
{<br />
char caracter = 'c';<br />
bool logico = true;<br />
cout
Operadores Matemáticos<br />
• Conceito:<br />
Tendo em vista o estudo de variáveis numéricas, torna-se necessário<br />
estudar operadores que sejam aplicados a esses objetos. Falamos de cálculos<br />
matemáticos como adição, subtração, divisão etc.<br />
• Tipos:<br />
Temos os seguintes tipos e suas formas de representação:<br />
• Soma: +<br />
• Subtração: -<br />
• Divisão: /<br />
• Multiplicação: *<br />
• Resto de Divisão Inteira: %<br />
• Exemplos:<br />
Veremos um código-fonte que demonstra cada operação:<br />
#include <br />
using namespace std;<br />
int main()<br />
{<br />
int soma = 15 + 15;<br />
int subtracao = 200-50;<br />
int multiplicacao = 15*5;<br />
float divisao = 15.0 /4.0;<br />
float resto_inteiro = 5 % 2;<br />
cout
cout
Teste o código e verifique:<br />
#include <br />
using namespace std;<br />
int main()<br />
{<br />
float x1 = (10.0+14.0)/2.0; //x1 = 12<br />
float x2 = 10.0+14.0/2.0; // x2 = 17<br />
cout
Comentários<br />
• Conceito:<br />
São usados quando queremos inserir textos ao longo de um códigofonte<br />
sem que pra isso eles sejam necessariamente executados. São muito<br />
úteis para escrevermos explicações sobre o que uma linha ou função do<br />
programa faz, ou pra marcarmos algum trecho do código que não queremos<br />
que seja executado no momento dentre outras funcionalidades. É muito útil<br />
para testes e busca por erros.<br />
Para isso, basta usar // antes de uma linha de código. Feito isso, ele<br />
ficará com uma cor diferente no compilador (tanto no visual studio quanto no<br />
dev-c++), e tudo que estiver na linha não será executado.<br />
Para criar um comentário que contenha mais de uma linha, basta<br />
usar /* (conteúdo do comentário) */. Tudo que estiver entre esses pares de<br />
caracteres (barra vertical e asterisco) não é executado. Veja o exemplo:<br />
#include <br />
using namespace std;<br />
int main()<br />
{<br />
int x;<br />
x = 10;<br />
//x = 100;<br />
cout
Diretivas<br />
#include<br />
Essa diretiva tem como objetivo “concatenar” (ou anexar) um códigofonte<br />
de outro arquivo com o que você está utilizando no momento. Isso vale<br />
pra tudo que foi criado no código anterior, desde variáveis, classes, funções<br />
etc.<br />
Nós a declaramos da seguinte forma:<br />
ou<br />
#include <br />
#include “iostream.h”<br />
usamos < > quando estamos chamando arquivos de bibliotecas<br />
padrões do compilador, e “ “ quando chamamos arquivos comuns que<br />
queremos anexar ao projeto atual (que não necessariamente pertençam a<br />
biblioteca, como um arquivo de cabeçalho que criamos). Ao utilizar include, ele<br />
sempre verifica se a biblioteca (ou cabeçalho) está na pasta raiz do projeto ou<br />
na pasta include do compilador.<br />
Normalmente #include é usado em arquivos de cabeçalho (os quais<br />
veremos mais tarde, são os arquivos .h ou .hpp), mas também pode ser<br />
empregado em arquivos de código-fonte (.c ou .cpp).<br />
#define<br />
Essa diretiva tem como facilidade a função de simplificar a digitação.<br />
Ao invés de digitar várias vezes comandos complexos e extensos que são<br />
utilizados diversas vezes ao longo de um código, como:<br />
cout
Veja o exemplo:<br />
#include <br />
#define BLA cout
Leitura e Retorno de<br />
Dados<br />
• Retorno:<br />
formato:<br />
Cout<br />
Como já visto, é uma função que imprime textos em tela, no seguinte<br />
cout
Repare que o símbolo >> agora está invertido com relação ao cout.<br />
Isso ocorre porque não há mais fluxo de saída de dados, agora nós estamos<br />
inserindo dados ao aplicativo.<br />
Com esse comando, emitimos tudo que é digitado no teclado para<br />
dentro de uma variável. Veja o exemplo de um programa que captura idade de<br />
um usuário:<br />
#include <br />
using namespace std;<br />
int main()<br />
{<br />
int idade;<br />
cout > idade;<br />
cout
#include <br />
using namespace std;<br />
int main()<br />
{<br />
int fator1;<br />
int fator2;<br />
cout > fator1;<br />
cout fator2;<br />
cout