Mudanças entre as edições de "Sistemas Operacionais e Introdução a Programação (diário 2010-1) - Prof. Ederson Torresini"
Ir para navegação
Ir para pesquisar
Linha 200: | Linha 200: | ||
==10/06== | ==10/06== | ||
==16/06: Desenvolvimento do Projeto Final== | ==16/06: Desenvolvimento do Projeto Final== | ||
+ | ===Expansões=== | ||
* Limitar a quantidade de tiros e, caso o usuário não atinja todos os barcos, deve-se mostrá-los na tela. | * 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". | * Tratar exceções de E/S, incluindo números fora dos limites - como por exemplo um barco fora do "mar". | ||
Linha 205: | Linha 206: | ||
* Utilizar apenas um vetor unidimensional ao invés de uma matriz em todo o código. | * Utilizar apenas um vetor unidimensional ao invés de uma matriz em todo o código. | ||
* MEGADESAFIO: utilizar a biblioteca [http://www.gnu.org/software/ncurses/ ncurses], [http://www.tcl.tk/ Tcl/Tk] ou outra biblioteca gráfica para uma interface melhorada. | * MEGADESAFIO: utilizar a biblioteca [http://www.gnu.org/software/ncurses/ ncurses], [http://www.tcl.tk/ Tcl/Tk] ou outra biblioteca gráfica para uma interface melhorada. | ||
+ | |||
+ | ===Dicas=== | ||
+ | * Entenda o problema, modele-o: utilize sempre que possível pseudocódigo / diagrama de bloco. | ||
+ | * Defina entradas, processamento e saídas do programa. | ||
+ | * Primeiro declare as variáveis, depois realize as expressões lógicas e matemáticas. | ||
+ | * Deixe claro (documente) o escopo de cada função (principalmente o fim) das estrutura de decisão e de repetição (quando não forem visíveis início e fim na mesma tela). | ||
==17/06== | ==17/06== |
Edição das 08h03min 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
- Etapas de desenvolvimento:
- 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 que 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 iniciaJogo)
- Ponteiros
#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++;
}
}
}
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
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.
Dicas
- Entenda o problema, modele-o: utilize sempre que possível pseudocódigo / diagrama de bloco.
- Defina entradas, processamento e saídas do programa.
- Primeiro declare as variáveis, depois realize as expressões lógicas e matemáticas.
- Deixe claro (documente) o escopo de cada função (principalmente o fim) das estrutura de decisão e de repetição (quando não forem visíveis início e fim na mesma tela).
17/06
23/06
24/06
30/06
01/07
07/07
08/07
Projeto Final
- C (segundo Guia Básico de C)