Mudanças entre as edições de "PRG29003: Introdução a C++"

De MediaWiki do Campus São José
Ir para navegação Ir para pesquisar
Linha 148: Linha 148:
 
[[imagem:PRG2-Jogo-senha.jpg|400px]]
 
[[imagem:PRG2-Jogo-senha.jpg|400px]]
  
 +
 +
Um programa para esse jogo poderia usar números no lugar de cores. O programa sortearia inicialmente uma combinação de cores, e em seguida pediria ao jogador para tentar combinações sucessivamente, até que se descubra a combinação correta. A cada tentativa, o programa informaria ao jogador quantas cores estão em posição correta e quantas estão em posição errada. Por exemplo, o jogo poderia interagir com o jogador desta forma:
 +
 +
<syntaxhighlight lang=text>
 +
A cada tentativa, digite os códigos de cores separados por espaços:
 +
Cores: valores entre 1 e 8
 +
 +
Cores: 1 1 2 2
 +
Cores em posições corretas: 1
 +
Cores em posições erradas: 0
 +
 +
Cores: 3 3 2 2
 +
Cores em posições corretas: 1
 +
Cores em posições erradas: 0
 +
 +
Cores: 1 4 3 4
 +
Cores em posições corretas: 1
 +
Cores em posições erradas: 1
 +
 +
Cores:
 +
</syntaxhighlight>
 +
 +
 +
Tente criar um programa para esse jogo !
  
 
== Jogo ''Craps'' ==
 
== Jogo ''Craps'' ==

Edição das 14h19min de 8 de fevereiro de 2018


A linguagem de programação a ser usada se chama C++. Como indica o nome, essa linguagem é uma extensão à linguagem C, de forma a aderir ao paradigma de orientação a objetos. Como esse assunto será visto em profundidade na 4a fase, na disciplina de POO (Programação Orientada a Objetos), faremos um uso mais superficial dessa linguagem. Quer dizer, usaremos algumas de suas construções, mas não nos deteremos em seus aspectos teóricos. O objetivo de usar C++ é introduzir essa linguagem, que será usada em próximas disciplinas.


Mas o que tem de especial a linguagem C++ ? Muita coisa, se comparada à linguagem C. Veja este exemplo sobre string em ambas linguagens:

Linguagem C Linguagem C++
#include <stdio.h>
#include <string.h>

int main() {
  char nome[32], sobrenome[32];
  char nomeCompleto[64];

  printf("Nome: ");
  scanf("%32s", nome);
  printf("Sobrenome: ");
  scanf("%32s", sobrenome);
  
  strcpy(nomeCompleto, nome);
  strcat(nomeCompleto, " ");
  strcat(nomeCompleto, sobrenome);

  printf("Nome completo: %s\n", nomeCompleto);

  return 0;
}
#include <iostream>
#include <string>

using namespace std;

int main() {
  string nome, sobrenome, nomeCompleto;

  cout << "Nome: ";
  cin >> nome;
  cout << "Sobrenome: ";
  cin >> sobrenome;

  nomeCompleto = nome + " " + sobrenome;

  cout << "Nome completo: " << nomeCompleto << endl;
}


Obs: para compilar o programa C++, grave-o em um arquivo com extensão .cpp ou .cc e compile-o assim (supondo que o arquivo se chame main.cpp):

g++ -std=c++11 -o exemplo main.cpp


Esse exemplo mostra algumas diferenças entre as linguagens:

  • strings em C++ são representadas por variáveis do tipo string. Valores string podem ser concatenados com o operador +.
  • A leitura de dados do console (entrada padrão) se faz por meio da variável predefinida cin (console input). Essa variável cin funciona como um arquivo somente leitura, e é similar a stdin da biblioteca C padrão. No exemplo, a leitura formatada se faz por meio do operador >> (operador leitura). Outras formas de ler dados serão vistas mais adiante na disciplina.
  • A escrita de dados no console (saída padrão) se faz por meio da variável predefinida cout (console output). Essa variável também funciona como um arquivo, porém somente escrita, e é similar a stdout da biblioteca C padrão. A escrita formatada de dados se faz por meio do operador << (operador escrita). Outras formas de escrever dados serão vistas mais adiante.


Esses e outros detalhes diferem entre as linguagens C e C++, mas a principal diferença entre elas reside no paradigma de programação com que foram concebidas. A linguagem C segue o paradigma de programação estruturada, e C++ segue o paradigma de orientação a objetos. Em C++, um programa é pensado como um conjunto de objetos que se relacionam com o objetivo de apresentar a solução imaginada.


Em uma aula posterior teremos um primeiro contato com classes e objetos.

Uso do NetBeans

Na disciplina recomenda-se usar o ambiente integrado de desenvolvimento (IDE - Integrated Development Environment) NetBeans. Esse software auxilia na escrita de programas, pois integra um editor de texto, um gerenciador de projetos, compilador e depurador, além de ajuda on-line e outras facilidades. Os exemplos durante a disciplina serão disponibilizados como projetos do NetBeans, mas não é obrigado utilizá-lo - pode-se trabalhar diretamente com um editor de textos (ex: gedit) e o compilador C++ (g++) e depurador (gdb), porém isso é um pouco mais trabalhoso ...

Para instalar o NetBeans siga estes passos:

  1. Certifique-se de que possui a máquina virtual Java instalada. Execute este comando em um terminal:
    $ java -version
    java version "1.8.0_121"
    Java(TM) SE Runtime Environment (build 1.8.0_121-b16)
    Java HotSpot(TM) 64-Bit Server VM (build 25.51-b03, mixed mode)
    $
    
  2. Se não tiver o Java instalado, faça o seguinte:
    • Faça o download do instalador, escolhendo a versão adequada para o seu Linux (deve ser um arquivo .tar.gz para a versão do seu sistema operacional, se 32 ou 64 bits).
    • Descompacte o arquivo do instalador dentro do seu diretório pessoal. Note que deve aparecer uma pasta chamada jre1.8.0.121 (ou algo parecido).
    • Inclua esta linha ao arquivo .profile que existe em sua pasta pessoal, substituindo a versão do Java se necessário (use um editor de texto, como o gedit ou pluma):
      export PATH=${PATH}:${HOME}/jre1.8.0.121/bin
      
    • Saia da sua conta (encerre a sessão), e em seguida entre novamente.
  3. Faça o download do instalador do Netbeans:
  4. Execute o instalador em um terminal de texto. Supondo que o download foi realizado na pasta Download:
    $ bash Download/netbeans-8.2-cpp-linux-x64.sh
    
  5. Siga as instruções de instalação.

Alguns pequenos programas

Jogos clássicos são um bom exemplo de problemas interessantes e relativamente simples de transformar em programas. A seguir são sugeridos programas para alguns desses jogos.

Jogo da Forca


O jogo da Forca é um jogo em que se tenta adivinhar uma palavra letra a letra. Um jogador escolhe uma palavra, e informa quantas letras ela possui. Outro jogador tenta descobrir a palavra, informando sucessivamente letras que imagina pertencer à palavra. Cada letra que não exista na palavra implica uma penalidade, acrescentando uma parte do corpo à forca, como ilustrado na figura a seguir. Se o corpo na forca ficar completo, o desafiador perde a partida.

Prg2-forca.gif


Esse jogo pode ser facilmente implementado como um programa. Basicamente ele trata de manipulação de string e caracteres. Sendo assim, implemente esse jogo em linguagem C++.


Um bom ponto de partida é primeiro definir um protótipo que seja o mais simples posśivel, porém que contenha as características essenciais do jogo.

#include <iostream>
#include <string>

using namespace std;

int main() {
    string palavra = "abacaxi"; // a palavra a ser descoberta
    string incompleta = "_______"; // a parte da palavra que já está revelada
    int tentativas = 7; // a quantidade de erros que podem ser cometidos

    // abaixo deve-se escrever o algoritmo do jogo ...
}

Um início de implementação do jogo da Forca em C++

Jogo da Senha

O jogo da Senha é um jogo clássico entre dois jogadores. Um jogador escolhe uma senha, composta por uma combinação de quatro peças coloridas, e a esconde usando um pequeno anteparo. O outro jogador deve então tentar descobrir a combinação de peças, limitado por dez tentativas. A cada tentativa, o dono da senha usa uma combinação de peças brancas e pretas para informar ao desafiante quantas peças ele acertou. Cada peça preta informa que uma peça tem a cor certa e está na posição correta. Cada peça branca informa que uma peça com cor certa está em posição errada. Assim, usando raciocínio lógico, o desafiante deve ser capaz de descobrir a combinação correta de peças coloridas. A figura a seguir mostra o tabuleiro desse jogo.


PRG2-Jogo-senha.jpg


Um programa para esse jogo poderia usar números no lugar de cores. O programa sortearia inicialmente uma combinação de cores, e em seguida pediria ao jogador para tentar combinações sucessivamente, até que se descubra a combinação correta. A cada tentativa, o programa informaria ao jogador quantas cores estão em posição correta e quantas estão em posição errada. Por exemplo, o jogo poderia interagir com o jogador desta forma:

A cada tentativa, digite os códigos de cores separados por espaços:
Cores: valores entre 1 e 8

Cores: 1 1 2 2
Cores em posições corretas: 1
Cores em posições erradas: 0

Cores: 3 3 2 2
Cores em posições corretas: 1
Cores em posições erradas: 0

Cores: 1 4 3 4
Cores em posições corretas: 1
Cores em posições erradas: 1

Cores:


Tente criar um programa para esse jogo !

Jogo Craps


Um jogo de dados popular em cassinos se chama craps. Ele aparece em muitos filmes ambientados em cassinos, e a figura a seguir mostra a mesa do jogo. Nesse jogo se usam dois dados, que devem ser lançados em rodadas. Uma rodada é composta por jogadas sucessivas, sendo dividida em duas etapas: come-out e point. Apostas podem ser feitas com base nas categorias de resultados possíveis.


Prg2-Craps.jpg


Uma rodada inicia com uma ou mais jogadas até que se atinja o estado de come-out. Basicamente, os dados devem somar um dentre os valores 4, 5, 6, 8, 9 ou 10 para que se passe à etapa seguinte, chamada point. O valor obtido ao final de come-out é chamado também de point, e o objetivo é repeti-lo na próxima etapa. O jogador lança os dados até obter novamente o point, quando então ganha a rodada, ou aparecer o valor 7, quando a perde.

As apostas são do tipo pass ou dont pass, que é o oposto da primeira. A aposta pass vence se:

  • A rodada na etapa point terminar conseguindo-se obter o valor point com os dados
  • Durante a etapa come-out, os valores 7 ou 11 aparecerem nos dados.

... e perde se:

  • A rodada na etapa point terminar com o valor 7.
  • Durante a etapa come-out, os valores 2, 3 ou 12 aparecerem nos dados.


O jogo parece razoavelmente simples. Como seria um programa que o implementasse ?