Mudanças entre as edições de "Programação 1 - Engenharia - Arrays Multidimensionais"

De MediaWiki do Campus São José
Ir para navegação Ir para pesquisar
Linha 400: Linha 400:
 
</syntaxhighlight>
 
</syntaxhighlight>
  
<!--
 
int Tiro()
 
{
 
  for (;;)  {
 
  printf("Entre com a linha: ");
 
  scanf ("%d", &linha);
 
  printf("Entre com a coluna: ");
 
  scanf ("%d", &coluna);
 
     
 
}
 
 
main()
 
{
 
  int situacao;
 
 
 
  ZerarMatriz();
 
  PosicionarNavios();
 
  ImprimeMatriz();
 
  do {
 
    situacao = Tiro();
 
  while (situacao!=0);
 
 
 
  switch (situacao) {
 
  case 1: printf("%s: Você acertou todos os navios\n", nome);
 
          printf("Sua pontuação é %d\n", pontuacao_final);
 
          break;
 
    case 2: printf("%s: Você atingiu o limite máximo de tiros\n", nome);
 
          break;
 
  default: printf("Algum problema ocorreu...\n");
 
          break;
 
  }
 
 
 
}
 
 
</li>
 
</li>
 
</ol>
 
</ol>
 
#<!-- <syntaxhighlight lang=c>
 
#include <stdio.h>
 
 
 
float media_soma_mat(int aA[][3],int aB[][3])
 
{
 
  int i,j;
 
  int soma_ac=0;
 
  /*int cC[2][3];*/
 
 
  for(i=0;i<2;i++){
 
    for(j=0;j<3;j++) {
 
        /*cC[i][j] = aA[i][j] + aB[i][j];*/
 
        soma_ac = soma_ac +aA[i][j] + aB[i][j];
 
    }
 
  }
 
  return (soma_ac/6.0);
 
}
 
 
void main()
 
{
 
  int mA[2][3]={
 
                11,12,13,
 
                21,22,23},
 
      mB[2][3]={
 
                1,2,3,
 
                1,2,3};
 
  float media;
 
 
  media =  media_soma_mat(mA,mB);
 
 
 
}
 
</syntaxhighlight>
 
-->
 
 
 
<!--
 
<!--
 +
{{collapse top|Solução - Função Tiro()}}
 +
<syntaxhighlight lang=c>
 
int Tiro()
 
int Tiro()
 
{
 
{
Linha 504: Linha 437:
 
    
 
    
 
}
 
}
-->
 
  
 
===Matrizes de caracteres e vetores de strings===
 
===Matrizes de caracteres e vetores de strings===

Edição das 15h05min de 22 de março de 2019

Objetivos

  • Definindo matrizes no C
  • Operações com matrizes e passagem de parâmetros tipo matriz
  • Matrizes com caracteres
  • Exercícios

Como definir e operar com matrizes no C

De forma similar ao vetor, basta definir a matriz usando colchetes para indicar a dimensão da variável.

Exemplo: Definir duas matrizes 2x3 já inicializadas e computar a soma das mesmas:

#include <stdio.h>

#define MAX_LIN 2
#define MAX_COL 3

void main()
{
  int mA[MAX_LIN][MAX_COL]={ 11,12,13,
                             21,22,23},
      mB[MAX_LIN][MAX_COL]={1,2,3,
                            1,2,3},
      mC[MAX_LIN][MAX_COL];
  int i,j;

  for(i=0;i<MAX_LIN;i++){
     for(j=0;j<MAX_COL;j++) {
        mC[i][j] = mA[i][j] + mB[i][j];
     }
  }
  
}

Exercício

  1. Implementar um programa para calcular a média de todos elementos da matriz C do exemplo acima.
    solução
    #include <stdio.h>
    
    void main()
    {
      int mA[2][3]={ 11,12,13,
                     21,22,23},
          mB[2][3]={1,2,3,
                    1,2,3},
          mC[2][3];
      int i,j, soma_ac=0;
      float media;
    
      for(i=0;i<2;i++){
         for(j=0;j<3;j++) {
            mC[i][j] = mA[i][j] + mB[i][j];
            soma_ac = soma_ac + mC[i][j];
         }
      }
      media = soma_ac/6.0;
    }
    
  2. Implementar um programa para ler uma matriz quadrada NxN pelo teclado e armazená-la em uma matriz matA. Defina matA com um tamanho máximo matA[N_MAX][N_MAX].
    solução
    #include <stdio.h>
    
    #define N_MAX 50
     
    void main()
    {
      int mA[N_MAX][N_MAX];
      int i,j,dimN;
      
      /*  Entrada da dimensão   */
      printf("Entre com a dimensao\n");
      scanf ("%d",&dimN);
      
      /*      Entrada de dados  */  
      for (i=0;i<dimN;i++) {
        for (j=0;j<dimN;j++) {
           printf("Entre com  mA[%d][%d]\n",i,j);
           scanf("%d",&mA[i][j]);  
        }
      }
      
      /* impressao dos dados lidos */
      for (i=0;i<dimN;i++) {
        for (j=0;j<dimN;j++) {
           printf("=>  mA[%d][%d] => %d\n",i,j,mA[i][j]);  
        }
      }  
    }
    

Passando matrizes como parâmetro

#include <stdio.h>

#define TAM_LIN 2
#define TAM_COL 3

void somar_mat(int aA[TAM_LIN][TAM_COL],int aB[TAM_LIN][TAM_COL], int cC[TAM_LIN][TAM_COL])
{
  int i,j;

  for(i=0;i<TAM_LIN;i++){
     for(j=0;j<TAM_COL;j++) {
        cC[i][j] = aA[i][j] + aB[i][j];
     }
  }
}

void main()
{
  int mA[TAM_LIN][TAM_COL]={ 11,12,13,
                             21,22,23},
      mB[TAM_LIN][TAM_COL]={1,2,3,
                            1,2,3},
      mC[TAM_LIN][TAM_COL];

 somar_mat(mA,mB,mC);
  
}
OBSERVE que matrizes são sempre passadas como referência.

Exercício

  1. Fazer uma função que recebe duas matrizes 2x3 como parâmetros e retorna a média entre todos elementos da matriz soma destas matrizes.
  2. Solução - Exercicio 01
    //Autor: Victor Cesconetto De Pieri
    
    #include <stdio.h>
    
    #define DIM_1 2
    #define DIM_2 3
     
    void main()
    {
      int mA[DIM_1][DIM_2]={ 10,20,30,
                     30,20,10},
          mB[DIM_1][DIM_2]={1,2,3,
                    3,2,1},
          mSoma[DIM_1][DIM_2];
      int i,j, soma=0;
      float media;
     
      for(i=0;i<DIM_1;i++){
         for(j=0;j<DIM_2;j++) {
            mSoma[i][j] = mA[i][j] + mB[i][j];
            soma = soma + mSoma[i][j];
         }
      }
      media = soma/(DIM_1 * DIM_2);
      printf("Media : %f\n",media);
    }
    
  3. Implementar uma programa para calcular o determinante de uma matriz 3x3 (de reais) a ser fornecida pelo teclado.
  4. Solução - Exercicio 02
    //Autor: Victor Cesconetto De Pieri
     
    #include <stdio.h>
     
    #define DIM_1 3
    #define DIM_2 3
     
    void main()
    {
    
      float mA[DIM_1][DIM_2];
      int i,j;
      float detA,diagPrin,diagSec;
    
      for(i=0;i<DIM_1;i++){
    	 for(j=0;j<DIM_2;j++){
      		printf("Digite o valor mA[%d][%d] da matriz: \n",i,j);
    		scanf("%f",&mA[i][j]);
    	 }
      }
      //formula para calcular o determinante 3x3
      diagPrin = (mA[0][0]*mA[1][1]*mA[2][2]) + (mA[0][1]*mA[1][2]*mA[2][0]) + (mA[0][2]*mA[1][0]*mA[2][1]);
     
      diagSec = (mA[2][0]*mA[1][1]*mA[0][2]) + (mA[2][1]*mA[1][2]*mA[0][0]) + (mA[2][2]*mA[1][0]*mA[0][1]);
    
      detA = diagPrin - diagSec;
      printf("Determinante : %f\n",detA);
    }
    
  5. Implementar um programa para ler duas matrizes (matA e matB) e multiplicá-las, colocando o resultado em uma matriz matC. Assumir dimensões de matA e matB de 2x3 e 3x4 respectivamente.
    Solução - Exercicio 03
    #include <stdio.h>
    
    #define DIM_1 2
    #define DIM_2 3
    #define DIM_3 4
    
    main()
    {
      int matA[DIM_1][DIM_2]={{2,5,7},
                              {4,7,5}
                             },
          matB[DIM_2][DIM_3]={{7,5,6,4},
                              {4,6,4,3},
                              {9,2,2,1}
                              },
          matR[DIM_1][DIM_3] ={
                               {0,0,0,0},
                               {0,0,0,0}
                              },
          i,j,k;
    
    
      for (i=0;i<DIM_1;i++) 
         for (j=0;j<DIM_3;j++) {
            for (k=0;k<DIM_2;k++)
                 matR[i][j]=matR[i][j]+matA[i][k]*matB[k][j];
            printf("MatR[%d][%d] => %d \n", i, j,  matR[i][j]);
         }
                   
    }
    
  6. Vamos implementar um jogo similar a batalha naval da seguinte forma.
      1. Crie uma matriz de inteiros global chamada ZonaDeGuerra com 10x10 posições (iniciada com 0). Construa uma função para gerar randomicamente a posição de 1 porta-aviões (colocando 1 na sua posição), 5 fragatas (número 2) e 5 submarinos (número 3). Assuma que a cada casa onde o inimigo alvejar será somado 10 ao número da casa.
      2. Crie um contador global de tiros iniciado com 0.
      3. Crie uma função de tiro. Esta função deve ler a posição de tiro, verificar se a casa ainda não foi alvejada. Se alvejada pergunta novamente a posição. Se a posição for válida e tiver um navio então o usuário ganha pontos da seguinte forma: 10 para o porta aviões, 5 para o submarino e 3 para fragata. A função deve retornar 0 se o jogo continua, 1 se o usuário atingiu todos os navios ou 2 se o usuário teve um número máximo de tiros ultrapassado (assumir 30 tiros).
      4. Ao final do jogo é mostrado o nome do jogador, o númerode tiros dados e a pontuação obtida.
    #include <stdio.h>
    #include <stdlib.h>
    #include <time.h>
     
    /**********************************/
    /***** DEFINIÇÕES DESTE MÓDULO  ****/
    /**********************************/
     
    #define TAM_MAT 10
    #define MAX_TIROS 30
    #define MAX_NOME 30
     
    /**********************************/
    /***** VARIÁVEIS GLOBAIS **********/
    /**********************************/
     
    int ZonaDeGuerra[TAM_MAT][TAM_MAT];/* Matriz do espaço de batalha */
    int ContadorTiros=0;
    int PontuacaoFinal;    			   /* acumula a pontuação do jogador */
    char nome[MAX_NOME];
    int x_sorteado;
    int y_sorteado;
     
     
    /***********************************/
    /****  FUNÇÕES DESTE MÓDULO ********/
    /***********************************/
     
    /***** FUNÇÕES DE INICIALIZAÇÃO ****/
     
    void ZerarMatriz()
    {
      int i,j;
     
      for (i=0;i<TAM_MAT;i++)
      	for(j=0;j<TAM_MAT;j++)
      		ZonaDeGuerra[i][j]=0;
    }
     
    void SortearCasa()
    {
       do {
       	/* generate secret number: */
            x_sorteado = rand() % TAM_MAT;
            y_sorteado = rand() % TAM_MAT;
       } while (ZonaDeGuerra[x_sorteado][y_sorteado]!=0);
     
    }
     
    PosicionarFragatas()
    { 
      int i;
      for(i=0;i<5;i++){
          SortearCasa();
          ZonaDeGuerra[x_sorteado][y_sorteado]=2; 	 	 
      }
    }
     
    PosicionarSubmarinos()
    { 
      int i;
      for(i=0;i<5;i++){
         SortearCasa();
         ZonaDeGuerra[x_sorteado][y_sorteado]=3; 	 	 
      }
    }
     
    void PosicionarPortaAvioes()
    {
      SortearCasa();
      ZonaDeGuerra[x_sorteado][y_sorteado]=1;
    }
     
    void PosicionarNavios()
    {
      /* initialize random seed: */
      srand ( time(NULL) );
     
      PosicionarPortaAvioes();
      PosicionarFragatas();
      PosicionarSubmarinos(); 
    }
     
    /*** FUNÇÕES DE IMPRESSÃO NA TELA **/
     
    void ImprimeLinha(int linha)
    {
      int j;
     
      printf("     ");    
      for(j=0;j<TAM_MAT;j++) {
        printf("| %2d ",ZonaDeGuerra[linha][j]); 
      }
      printf("|\n");
      printf("     +----+----+----+----+----+----+----+----+----+----+\n");
    }
    
    void ImprimeLinhaEscondida(int linha)
    {
      int j;
     
      printf("     ");    
      for(j=0;j<TAM_MAT;j++) {
        if (ZonaDeGuerra[linha][j]>=0 &&  ZonaDeGuerra[linha][j]<=3)
             printf("| -- "); 
        else 
             printf("| %2d ",ZonaDeGuerra[linha][j]);
      }
      printf("|\n");
      printf("     +----+----+----+----+----+----+----+----+----+----+\n");
    }
     
    void ImprimeMatrizTudo()
    {
      int i;
     
      printf("     +----+----+----+----+----+----+----+----+----+----+\n");
      for(i=0;i<TAM_MAT;i++)
      	ImprimeLinha(i);
    }
     
    void ImprimeMatrizEscondida()
    {
      int i;
     
      printf("     +----+----+----+----+----+----+----+----+----+----+\n");
      for(i=0;i<TAM_MAT;i++)
      	ImprimeLinhaEscondida(i);
    }
     
     
    int Tiro()
    {
         /* usar um switch */
    }
     
    main()
    {
      int situacao;
      ZerarMatriz();
      PosicionarNavios();
      ImprimeMatrizEscondida();
      do {
         situacao = Tiro();
      } while (situacao==0);
    }