Variáveis multi-dimensionais

Indexação

Organização em memória

\[ \scriptsize \overbrace{\begin{array}{|cc|} \hline a[0][0] ~\cdots~ a[0][3] \\ \hline \end{array}}^{\text{linha 0}} \scriptsize \overbrace{\begin{array}{|c|} \hline a[1][0] ~\cdots~ a[1][3] \\ \hline \end{array}}^{\text{linha 1}} \scriptsize \overbrace{\begin{array}{|c|} \hline a[2][0] ~\cdots~ a[2][3] \\ \hline \end{array}}^{\text{linha 2}} \]

Processar variáveis multi-dimensionais

Inicializar a matriz identidade

#define N  5
...
double mat[N][N];   // matriz N*N
int i, j;           // linhas e colunas

for (i = 0; i < N; i++) {  // para cada linha
  for(j = 0; j < N; j++) { // para cada coluna
    if(i == j)             // diagonal?
      mat[i][j] = 1.0;
    else
      mat[i][j] = 0.0;
 }
}

Inicializadores

int a[3][4] = { {1,2,3,4},   // linha 0
                {5,6,7,8},   // linha 1
                {9,10,11,12} // linha 2
                };
int a[3][4] = { {1,2,3,4}, {5,6} };
  // equivalente:
  // { {1,2,3,4}, {5,6,0,0}, {0,0,0,0} }

Inicializadores (cont.)

int a[3][4] = { 1,2,3,4,5,6,7,8,9,10,11,12 };
  // equivalente a
  // { {1,2,3,4},{5,6,7,8},{9,10,11,12} }
int a[3][4] = { 0 };
  // inicializa todas as posições com 0

Exemplo: cartas na mão

Exemplo de execução:

Quantas cartas? 5
5 de PAUS
3 de COPAS
6 de ESPADAS
J de PAUS
10 de PAUS

Problemas

Representação das cartas

Imprimir uma carta

void imprime_carta(int naipe, int valor)
{
  imprime_valor(valor);
  printf(" de ");
  imprime_naipe(naipe);
  printf("\n");
}
5 de COPAS

Imprimir um naipe

void imprime_naipe(int naipe)
{
  switch(naipe) {
  case 0: printf("PAUS"); 
    break;
  case 1: printf("ESPADAS");
    break;
  case 2: printf("COPAS");
    break;
  case 3: printf("OUROS");
    break;
  default: printf("naipe inválido");  // erro
  }
}

Imprimir um valor

void imprime_valor(int valor)
{
  switch(valor) {
  case 0:  printf("A");
    break;
  case 1:  printf("J");
    break;
  case 11: printf("Q");
    break;
  case 12: printf("K");
    break;
  default: printf("%d", valor);
    // valores 2, 3 .. 10
  }
}

Escolher aleatoriamente uma carta

  #define NAIPES     4
  #define VALORES    13
  
  naipe = rand() % NAIPES;
      // naipe entre 0 e 3
  valor = rand() % VALORES;
      // valor entre entre 0 e 12

Evitar repetidos

  int cartas[NAIPES][VALORES];

Programa

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int main(void) {
  int cartas[NAIPES][VALORES] = { 0 };
  int num; // número de cartas a sortear

  srand((unsigned)time(NULL));
    // inicializar a "semente" de aleatórios

  printf("Quantas cartas? ");
  scanf("%d", &num);

(continua)

Programa (cont.)

  while(num > 0) {
    int valor, naipe;
    naipe = rand() % NAIPES;
    valor = rand() % VALORES;
    // verificar se a carta ainda não saiu
    if(!cartas[naipe][valor])  {
      imprime_carta(naipe, valor);
      // marcar a carta
      cartas[naipe][valor] = 1;
      num--;  // menos uma carta a sortear
    }
  }
}

Argumentos de funções

double somar(double a[][M], int n);  // OK
double somar(double a[][], int n, int m);
    // ERRO: ..........^^
    // não podemos omitir a 2ª dimensão

Argumentos de funções (cont.)

\[ \scriptsize \underbrace{\overbrace{\begin{array}{|cc|} \hline \!a[0][0] \cdots a[0][M-1]\\ \hline \end{array}}^{\text{linha}~0}}_{M ~\text{valores}} \scriptsize \underbrace{\overbrace{\begin{array}{|c|} \hline \!a[1][0] \cdots a[1][M-1] \\ \hline \end{array}}^{\text{linha}~1}}_{M~\text{valores}} \scriptsize \cdots \overbrace{\begin{array}{|c|} \hline \!a[i][0] ~\cdots a[i][j]~\cdots \\ \hline \end{array}}^{\text{linha}~i} \]

Argumentos de funções

Exemplo: somar uma matriz

#define LINHAS   3
#define COLUNAS  3

double soma_matriz(double a[LINHAS][COLUNAS])
{
    int i, j;
    double s = 0.0;
    for (i = 0; i < LINHAS; i++)
      for(j = 0; j < COLUNAS; j++)
          s += a[i][j];
    return s;
}

Exemplo (cont.)

#define COLUNAS  3

double soma_matriz(double a[][COLUNAS], int n)
{
    int i, j;
    double s = 0.0;
    for (i = 0; i < n; i++)
      for(j = 0; j < COLUNAS; j++)
          s += a[i][j];
    return s;
}