Mudanças entre as edições de "Sistemas Operacionais e Introdução a Programação (diário 2010-1) - Prof. Ederson Torresini"

De MediaWiki do Campus São José
Ir para navegação Ir para pesquisar
Linha 58: Linha 58:
 
* Deixar claro (documentar) o escopo de cada função e estrutura de decisão e de repetição (quando não foi visíveis início e fim na mesma tela).
 
* Deixar claro (documentar) o escopo de cada função e estrutura de decisão e de repetição (quando não foi visíveis início e fim na mesma tela).
  
=Jogo: Batalha Naval=
 
#Desenha 1 onda
 
#Desenha 1 linha de ondas
 
#Desenha 1 matriz de tamanho fixo de ondas
 
#Desenha 1 matriz de tamanho variável de ondas (o usuário informa as dimensões)
 
#Mapeia 1 barco: latitude e longitude (vetor)
 
#Desenha o mar com 1 barco
 
#Mapeia 10 barcos: latitude e longitude (matriz)
 
#Desenha os 10 barcos
 
#Mapeia 10 barcos: latitude, longitude e se já foi atingido
 
#Pede ao usuário atirar
 
#Se o barco foi atingido, desenhar um X
 
#Ao final (todo os barcos atingidos): informar o usuário que venceu em 'n' movimentos
 
 
==Proposta de código==
 
Contempla:
 
* Bibliotecas e definições
 
* Declaração de constantes e variáveis
 
** Uso de variáveis com mesmo nome e diferentes escopos
 
** Vetor e matriz
 
* Operadores lógicos e matemáticos
 
* Expressões
 
** E/S
 
** Estruturas de decisão e repetição
 
* Funções
 
** Passagem de parâmetro por valor e por referência
 
* Acesso a uma matriz através de um vetor linear (função <tt>iniciaJogo</tt>)
 
* Ponteiros
 
 
<syntaxhighlight lang=c>
 
#include <stdio.h>
 
 
#define QTDE_BARCOS 2
 
 
 
int iniciaJogo(int *barcos, int *tiros, int *atingidos)
 
{
 
int barco;
 
for(barco=0; barco<QTDE_BARCOS; barco++)
 
{
 
printf("\nBarco número %d:\n", barco + 1); // O primeiro barco é o de no. zero :-)
 
printf("Informe a latitude do barco: ");
 
scanf("%d", barcos + 3*barco); // end. inicial (barcos)
 
// + qtde. objetos por linha
 
// * linhas
 
// + coluna (1o. elemento)
 
printf("Informe a longitude do barco: ");
 
scanf("%d", barcos + 3*barco + 1); // end. inicial (barcos)
 
// + qtde. objetos por linha
 
// * linhas
 
// + coluna (2o. elemento)
 
*(barcos + 3*barco + 2) = 0; // endereço inicial (barcos)
 
// + qtde. objetos por linha
 
// * linhas
 
// + coluna (3o. elemento)
 
}
 
*tiros = 0;
 
*atingidos = 0;
 
}
 
 
char desenhaPonto(int linha, int coluna, int barcos[QTDE_BARCOS][3])
 
{
 
int barco;
 
 
for (barco=0; barco<QTDE_BARCOS; barco++)
 
{
 
if (linha==barcos[barco][0] & coluna==barcos[barco][1])
 
{
 
if (barcos[barco][2] == 1)
 
{
 
return 'X';
 
}
 
}
 
}
 
return '~';
 
}
 
 
desenhaMar(int linhas, int colunas, char onda, int barcos[QTDE_BARCOS][3])
 
{
 
int linha;
 
int coluna;
 
int barco;
 
int tinhaBarco;
 
 
for (linha=1; linha<linhas; linha++)
 
{
 
for (coluna=1; coluna<colunas; coluna++)
 
{
 
printf("%c", desenhaPonto(linha, coluna, barcos));
 
}
 
printf("\n");
 
}
 
}
 
 
int seVenceu(int barcos[QTDE_BARCOS][3])
 
{
 
int barco;
 
int atingidos = 0;
 
 
for (barco=0; barco<QTDE_BARCOS; barco++)
 
{
 
if (barcos[barco][2] == 1)
 
atingidos++;
 
}
 
return atingidos;
 
}
 
 
int main(int argc, char* argv[])
 
{
 
const char onda= '~';
 
int barcos[QTDE_BARCOS][3];
 
int latitude;
 
int longitude;
 
int barco;
 
int tiros;
 
int atingidos;
 
 
if (argc < 3)
 
{
 
printf("Use: %s (qtde. de linhas) (qtde. de colunas).\n", argv[0]);
 
return -1;
 
}
 
 
// Inicia o jogo
 
iniciaJogo(&barcos, &tiros, &atingidos);
 
 
// Estrutura principal de repetição: vai atirando sem parar... :-P
 
while (1)
 
{
 
// Limpa a tela
 
system("clear");
 
// Desenha o mar
 
desenhaMar(atoi(argv[1]), atoi(argv[2]), onda, barcos);
 
 
atingidos = seVenceu(barcos);
 
if (atingidos == QTDE_BARCOS)
 
{
 
printf("\nParabéns! Venceu o jogo com %d tiros!\n", tiros);
 
return 0;
 
}
 
else
 
{
 
printf("\nTiros: %d\n", tiros);
 
printf("Alvos atingidos: %d.\n", atingidos);
 
printf("\nDigite latitude e longitude:\n");
 
printf("- Latitude: ");
 
scanf("%d", &latitude);
 
printf("- Longitude: ");
 
scanf("%d", &longitude);
 
for (barco=0; barco<QTDE_BARCOS; barco++)
 
{
 
if (latitude == barcos[barco][0] & longitude == barcos[barco][1])
 
{
 
barcos[barco][2] = 1;
 
atingidos++;
 
}
 
}
 
tiros++;
 
}
 
}
 
}
 
</syntaxhighlight>
 
  
 
==Expansões==
 
==Expansões==

Edição das 07h51min de 18 de fevereiro de 2010

Endereço encurtado: http://bit.ly/sop20101

Sistemas Operacionais

18/02

25/02

03/03

04/03

10/03

11/03

17/03

18/03

Lógica de Programação

24/03

25/03

31/03

01/04

07/04

08/04

14/04

15/04

22/04

Linguagem de Programação C

28/04

29/04

05/05: Projeto Final da Disciplina

  • Jogo: Batalha Naval.

06/05

12/05

13/05

19/05

20/05

26/05

27/05

02/06

09/06

10/06

16/06: Desenvolvimento do Projeto Final

17/06

23/06

24/06

30/06

01/07

07/07

08/07

Projeto Final


Regras de um bom programa

  • Entender o problema, modelá-lo, utilizar pseudocódigo / diagrama de bloco.
  • Definir entrada, processamento e saída.
  • Primeiro declarar, depois realizar expressões.
  • Deixar claro (documentar) o escopo de cada função e estrutura de decisão e de repetição (quando não foi visíveis início e fim na mesma tela).


Expansões

  • Limitar a quantidade de tiros e, caso o usuário não atinja todos os barcos, deve-se mostrá-los na tela.
  • Tratar exceções de E/S, incluindo números fora dos limites - como por exemplo um barco fora do "mar".
  • Alterar a interface para utilizar números para linhas e letras para colunas, além de permitir barcos de 3 tamanhos (sempre desenhados na horizontal).
  • Utilizar apenas um vetor unidimensional ao invés de uma matriz em todo o código.
  • MEGADESAFIO: utilizar a biblioteca ncurses, Tcl/Tk ou outra biblioteca gráfica para uma interface melhorada.



Voltar para página principal da disciplina