Curso de Linguagem C aplicada á Engenharia (DOC)
34 pág.

Curso de Linguagem C aplicada á Engenharia (DOC)


DisciplinaLinguagem e Estruturação Linguagem C130 materiais933 seguidores
Pré-visualização34 páginas
que você esteja usando inicializaçao de matriz para construir uma tabela de mensagens de erros, como mostrado aqui:

 char e1 [20] ="informaçao inválida\n":

 char e2 [23] = "seleçao fora_do_limite|n";

 char e3 [19] = "autorizaçao negada\n";

Como você pode supor, é bastante monótono contar manualmente os caracteres em cada mensagem para determinar a dimensao correta da matriz. É possível deixar a linguagem C dimensionar automaticamante as matrizes, neste exemplo, pelo uso de "matrizes sem determinaçao de tamanho.

Se, em uma declaraçao de inicializaçao de matriz, o tamanho nao é especificado, o compilador criará uma matriz grande o suficiente para armazenar todos os inicializadores presentes.

Usando este método, a tabela de mensagem fica assim:

 char e1 [ ] ="informaçao inváalida\n":

 char e2 [ ] = "seleçao fora_do_limite\n";

 char e3 [ ] = "autorizaçao negada\n"; /*O compilador conta ele próprio o

 número de elementos e cria as matrizes de tamanho adequado*/

A inicializaçao de matrizes sem a especificaçao de tamanho nao está restrita somente a matrizes unidimensionais. Para matrizes multidimensionais, deve-se especificar tudo, menos a dimensao mais à esquerda (compiladores mais modernos aceitam especificação em aberto da dimensão mais à direita) , para permiitr que a linguagem C indexe adequadamente a matriz. Dessa maneira, é possível construir tabelas de diferentes tamanhos com o compilador alocando espaço suficiente para elas. Por exemplo, a declaraçao da matriz "sqrs" como uma matriz sem especificaçao de tamanho é mostrada aqui:

 int sqrs[ ][2] = {

 1, 1,

 2, 4,

 3, 9,

 4, 16,

 5, 25,

 6, 36,

 7, 49,

 8, 64,

 9, 81,

 10, 100,

 };

Vantagem: A tabela pode ser aumentada indefinidamente porque o compilador se encarrega de contar as linhas da matriz.

Um Jogo de Caça ao Submarino:

 No jogo de caça ao submarino o computador controla um submarino e você um couraçado. O objetivo do jogo é uma embarcaçao destruir a outra. Contudo, os navios têm capacidades de radar limitadas. A única maneira do submarino encontrar o couraçado é estar diretamente sob ele. O vencedor é aquele que encontrar o outro primeiro, com o submarino e o couraçado alternando movimentos aleatórios sobre o "oceano".

O "oceano" é um pequeno campo de jogo que mede 76,2 x 76,2 mm². Tanto o submarino quanto o couraçado tratam esse plano como coordenadas X, Y, com 0,0 sendo o canto superior esquerdo. Uma matriz bidimensional, chamada de "matriz", é usada para guardar o tabuleiro de jogo e cada elemento nele é inicializado com um espaço, o que denota um elemento nao usado.

A funçao main() c/ suas variáveis globais sao mostradas aqui:

 char matriz [3] [3] = { /* vars. globais */

 ' ', ' ', ' ',

 ' ', ' ', ' ',

 ' ', ' ', ' ',

 };

 int compX, compY, jogX, jogY;

main()

{

 randomize(); /*inicializa (gera a semente inicial) aleatoriamente o gerador de números randômicos*/

 compX=compY=jogX=jogY=0; /* inicializa vars de coordenadas */

 for(;;){

 if(tent_sub()){

 printf("O submarino venceu!\n");

 break;

		 }

 if(tent_jog()){

 printf("O couraçado (você) venceu!\n");

 break;

		 }

 exibe_tabuleiro();

	 }

}

A funçao randomize() serve para randomizar o gerador de número randômico da linguagem C, que é usado para gerar o movimento do computador, como veremos em breve.

A primeira funçao necessária é aquela que cria o movimento do computador. O computador (submarino) gera o seu movimento usando o gerador de números randômicos da linguagem C rand(), que retorna um número randômico entre 0 e 32.767. Tanto a funçao rand() como randomize() usam o arquivo cabeçalho (header) stdlib.h . A funçao randomize() requer ainda o arquivo time.h . Um valor randômico é gerado tanto para a coordenada X quanto para a Y, toda a vez que o computador é chamado a gerar um

movimento. Esses valores sao usados entao em uma operaçao de módulo para prover um número entre 0 e 2. Finalmente, o computador verifica se encontrou (e por definiçao destruiu) o couraçado. Se o movimento gerado tem as mesmas coordenadas da localizaçao atual do couraçado, o submarino vence. Se o computador venceu, a funçao retorna verdadeira, caso contrário retorna falso. A funçao tent_sub() é apresentada aqui:

tent_sub() /* gera o próximo movimento do computador usando um

		 gerador de números randômicos.*/

{

 matriz [compX] [compY]= ' '; /* apaga última posiçao do submarino */

 compX=rand() % 3; /* o resto de uma divisao por 3 é sempre 0 1 ou 2 */

 compY=rand() % 3;

 if(matriz[compX][compY] == 'B')

 return 1; /* O submarino ganhou a batalha*/

 else{

 matriz[compX][compY]= 'S';

 return 0; /* Ele nao acertou*/

	 }

}

O couraçado recebe o seu próximo movimento do jogador.A funçao requisita ao usuário as novas coordenadas e entao verifica se o submarino foi encontrado ou nao. Em caso positivo, o jogador vence e a funçao retorna verdadeiro. Caso contrário a funçao retorna falso. A funçao tent_jog() é mostrada aqui:

tent_jog() /*pega o próximo movimento do jogador*/

{

 matriz[jogX] [jogY]= ' '; /* apaga última posiçao do couraçado */

 do{

 printf("Informe as novas coordenadas (X,Y): ");

 scanf("%d%d",&jogX,&jogY);

 } while (jogX<0||jogX>2||jogY<0||jogY>2); /* testa validade das coords */

 if(matriz[jogX][jogY]== 'S')

 return 1; /*O couraçado ganhou a batalha*/

 else{

 matriz[jogX][jogY]='B';

 return 0; /* Ele nao acertou*/

	 }

}

Após cada série de movimentos, o tabuleiro do jogo é exibido pela funçao &quot;exibe_tabuleiro()&quot;. Uma célula nao usada fica vazia. A célula que guarda a última posiçao do submarino conterá um S e a célula que guarda a posiçao do couraçado, um B:

exibe_tabuleiro() /*Exibe tabuleiro do jogo*/

{

 printf(&quot;\n&quot;);

 printf(&quot;%c | %c | %c\n&quot;, matriz[0][0],matriz[0][1],matriz[0][2]);

 printf(&quot;--|---|--\n&quot;);

 printf(&quot;%c | %c | %c\n&quot;, matriz[1][0],matriz[1][1],matriz[1][2]);

 printf(&quot;--|---|--\n&quot;);

 printf(&quot;%c | %c | %c\n&quot;, matriz[2][0],matriz[2][1],matriz[2][2]);

}

 O programa inteiro é mostrado aqui:

 /* Jogo Couraçado x Submarino */

 #include <stdio.h>

 #include <stdlib.h>

 #include <time.h>/*requerido por randomize()*/

 char matriz [3] [3] = { /* vars. globais */

 ' ', ' ', ' ',

 ' ', ' ', ' ',

 ' ', ' ', ' ',

 };

 int compX, compY, jogX, jogY;

main()

{

 randomize(); /*inicializa (gera a semente inicial) aleatoriamente o gerador de números randômicos*/

 compX=compY=jogX=jogY=0;

 for(;;){

 if(tent_sub()){

 printf(&quot;O submarino venceu!\n&quot;);

 break;

		 }

 if(tent_jog()){

 printf(&quot;O couraçado (você) venceu!\n&quot;);

 break;

		 }

 exibe_tabuleiro();

	 }

}

tent_sub() /* gera o próximo movimento do computador usando um

		 gerador de números randômicos.*/

{

 matriz [compX] [compY]= ' ';

 compX=rand() % 3;

 compY=rand() % 3;

 if(matriz[compX][compY] == 'B')

 return 1; /* O submarino ganhou a batalha*/

 else{

 matriz[compX][compY]= 'S';

 return 0; /* Ele nao acertou*/

	 }

}

tent_jog() /*pega o próximo movimento