int a[3][4]; // uma matriz 3x4
i
e coluna j
escrevemos a[i][j]
a[i]
escolhe a linha i
a[i][j]
escolhe o elemento j
dessa linhaa[i,j]
a[i,j]
é equivalente a a[j]
\[ \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}} \]
for
embricados são convenientes para processar variáveis multi-dimensionais#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;
}
}
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} }
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 de execução:
Quantas cartas? 5
5 de PAUS
3 de COPAS
6 de ESPADAS
J de PAUS
10 de PAUS
void imprime_carta(int naipe, int valor)
{
imprime_valor(valor);
printf(" de ");
imprime_naipe(naipe);
printf("\n");
}
imprime_carta(2, 5)
escreve a linha5 de COPAS
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
}
}
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
}
}
rand()
para gerar inteiros pseudo-aleatórios #define NAIPES 4
#define VALORES 13
naipe = rand() % NAIPES;
// naipe entre 0 e 3
valor = rand() % VALORES;
// valor entre entre 0 e 12
int cartas[NAIPES][VALORES];
cartas[n][v]
contém:
n
e valor v
já saiu#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)
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
}
}
}
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
a[i][j]
\[ \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} \]
a[i][j]
é i*M + j
#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;
}
#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;
}