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 1: Linha 1:
 
__toc__
 
__toc__
  
 +
 +
= Apresentação =
 +
 +
Programas precisam armazenar e organizar dados de forma eficiente, o que depende do tipo de problema a ser resolvido, da quantidade de dados a serem manipulados, e da forma com que dados são representados. Para isso existe o conceito de '''estruturas de dados''', que são justamente formas de armazenar e organizar dados. Algumas estruturas de dados corriqueiras são:
 +
* Filas
 +
* Pilhas
 +
* Listas
 +
* Tabelas de dispersão (hash)
 +
* Árvores
 +
... porém há muitas outras (faça uma pesquisa se ficou curioso).
 +
 +
Em PRG2 serão estudadas as estruturas de dados acima listadas, as quais são de uso comum em programas em geral. O estudo será orientado a pequenos projetos, com a intenção de mostrar possíveis usos dessas estruturas.
 +
 +
* '''Projeto 1:''' (fila e pilha)
 +
* '''Projeto 2:''' (lista)
 +
* '''Projeto 3:''' (árvore)
 +
* '''Projeto 4:''' (tabela hash)
 +
 +
O estudo dessas estruturas será dividido em duas etapas:
 +
# '''Uso das estruturas de dados:''' as estruturas de dados são apresentadas, destacando-se suas características, operações e aplicações. Os projetos serão desenvolvidos usando estruturas de dados já existentes.
 +
# '''Implementação das estruturas de dados:''' As estruturas de dados serão implementadas, de forma a funcionarem como as estruturas usadas na etapa 1. Como resultado, cada equipe terá ao final criado uma biblioteca de programação contendo suas estruturas de dados. Os projetos criados na etapa 1 devem ser compilados e funcionar usando essa biblioteca, sem necessitar qualquer modificação.
 +
 +
= A linguagem C++ =
  
 
* [http://glu.fcfrp.usp.br/tulio/materiais/c++.pdf Introdução a C++ (USP)]
 
* [http://glu.fcfrp.usp.br/tulio/materiais/c++.pdf Introdução a C++ (USP)]

Edição das 18h01min de 8 de fevereiro de 2018


Apresentação

Programas precisam armazenar e organizar dados de forma eficiente, o que depende do tipo de problema a ser resolvido, da quantidade de dados a serem manipulados, e da forma com que dados são representados. Para isso existe o conceito de estruturas de dados, que são justamente formas de armazenar e organizar dados. Algumas estruturas de dados corriqueiras são:

  • Filas
  • Pilhas
  • Listas
  • Tabelas de dispersão (hash)
  • Árvores

... porém há muitas outras (faça uma pesquisa se ficou curioso).

Em PRG2 serão estudadas as estruturas de dados acima listadas, as quais são de uso comum em programas em geral. O estudo será orientado a pequenos projetos, com a intenção de mostrar possíveis usos dessas estruturas.

  • Projeto 1: (fila e pilha)
  • Projeto 2: (lista)
  • Projeto 3: (árvore)
  • Projeto 4: (tabela hash)

O estudo dessas estruturas será dividido em duas etapas:

  1. Uso das estruturas de dados: as estruturas de dados são apresentadas, destacando-se suas características, operações e aplicações. Os projetos serão desenvolvidos usando estruturas de dados já existentes.
  2. Implementação das estruturas de dados: As estruturas de dados serão implementadas, de forma a funcionarem como as estruturas usadas na etapa 1. Como resultado, cada equipe terá ao final criado uma biblioteca de programação contendo suas estruturas de dados. Os projetos criados na etapa 1 devem ser compilados e funcionar usando essa biblioteca, sem necessitar qualquer modificação.

A linguagem C++

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: 0
Cores em posições erradas: 0

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

Cores: 3 3 5 5
Cores em posições corretas: 0
Cores em posições erradas: 0

Cores: 4 6 6 4
Cores em posições corretas: 3
Cores em posições erradas: 0

Cores: 4 6 7 4
Você descobriu as cores na sequência correta !


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 ?