A maior rede de estudos do Brasil

Grátis
Estruturas_de_Dados_e_Algoritmos_em_C.erivanildo- Blog - conhecimentovaleouro.blogspot.com by @viniciusf666

Pré-visualização | Página 21 de 50

a fprintf. A diferença principal é que a 
sequência de caracteres convertida é armazenada na região de memória referenciada por z, 
em vez de ser escrita no ficheiro. Assim, torna-se necessário garantir que foi reservado 
previamente espaço de armazenamento suficiente para a sequência de caracteres convertida 
e para o carácter nulo final. 
 
A Figura 2.38 apresenta um exemplo da utilização da função sprintf para a construção 
dinâmica de um formato de leitura para a função scanf. Se pretendermos fazer a leitura da 
cadeia de caracteres FRASE, que foi declarada com uma dimensão parametrizada pela 
constante MAX_CAR, não podemos usar o formato %MAX_CARs, uma vez que o 
formato de leitura da função scanf só aceita literais. A solução passa pela construção 
dinâmica do formato de leitura. A cadeia de caracteres FORMATO é constituída pela 
concatenação do carácter %, através do especificador de conversão %%, com o valor de 
MAX_CAR, através do especificador de conversão %d, e com o carácter s, ou seja, 
armazena o formato de leitura %40s. 
 
 
Figura 2.38 - Exemplo da utilização da função sprintf. 
 
 
 #define MAX_CAR 40 
 ... 
 char FRASE[MAX_CAR+1], FORMATO[20]; 
 ... 
 sprintf (FORMATO, "%%%ds", MAX_CAR); /* FORMATO é igual a "%40s" */
 ... 
 scanf (FORMATO, FRASE); /* equivalente a scanf ("%40s", FRASE); */
 char FRASE[] = "Aveiro, 25 de Fevereiro de 2003"; 
 char CIDADE[10], MES[10]; int DIA, ANO; 
 ... 
 sscanf (FRASE, "%9[^,],%d de %9s de %d", CIDADE, &DIA, MES, &ANO); 
 /* CIDADE é igual a "Aveiro", DIA = 25, */
 /* MES é igual a Fevereiro e ANO = 2003 */
 ... 
 printf ("(%s) %2d/%s/%4d\n", CIDADE, DIA, MES, ANO); 
 /* é impresso no monitor (Aveiro) 25/Fevereiro/2003 */
23 CAPÍTULO 2 : COMPLEMENTOS SOBRE C 
 
 
2.4 Agregados bidimensionais e tridimensionais 
Um agregado unidimensional é uma sequência linear de elementos que são acedidos através 
de um índice. No entanto, existem problemas em que a informação a ser processada é 
melhor representada através de uma estrutura de dados com um formato bidimensional, 
como por exemplo, uma tabela com várias colunas de informação, ou uma matriz no caso 
de aplicações matemáticas. Para esse tipo de aplicações precisamos de um agregado 
bidimensional. 
 
Um agregado bidimensional é pois um agregado de agregados. A sua definição respeita as 
mesmas regras de um agregado unidimensional, sendo a única diferença o facto de ter dois 
descritores de dimensão em vez de um. Pode ser visto como uma estrutura composta por 
linhas, cujo número é definido pelo primeiro descritor de dimensão, e por colunas, cujo 
número é definido pelo segundo descritor de dimensão. Mas apesar desta visão 
bidimensional ele é armazenado na memória de forma linear, em endereços de memória 
contíguas, de maneira a simplificar o acesso aos seus elementos. 
 
O acesso a um elemento do agregado bidimensional é feito através de dois índices, o 
primeiro para a linha e o segundo para a coluna, onde se encontra o elemento a que se 
pretende aceder. É preciso ter sempre em consideração que na linguagem C, os índices dos 
agregados são variáveis numéricas inteiras positivas e o índice do elemento localizado mais 
à esquerda em cada dimensão é o zero. Ao contrário do Turbo Pascal onde o acesso pode 
ser feito indiscriminadamente por A[L][C] ou A[L,C], na linguagem C deve ser feito 
obrigatoriamente por A[L][C]. 
 
A Figura 2.39 apresenta um exemplo da declaração de dois agregados, um unidimensional 
com 3 elementos inteiros e outro bidimensional com 6 elementos inteiros, bem como, da 
sua colocação na memória. 
 
 
Figura 2.39 - Declaração de agregados unidimensionais e bidimensionais. 
A Figura 2.40 apresenta um excerto de código que atribui valores aos agregados A e B. Para 
aceder a todos os elementos do agregado bidimensional B necessitamos de um duplo ciclo 
repetitivo for. Procure descobrir quais os valores que são armazenados nos agregados. 
 
 
Figura 2.40 - Manipulação dos agregados. 
 int A[3], B[2][3]; unsigned int I, J; 
 ... 
 for (I = 0; I < 3; I++) A[I] = I; 
 
 for (I = 0; I < 2; I++) 
 for (J = 0; J < 3; J++) B[I][J] = A[ (I+J)%3 ]; 
 ... 
int A[3], B[2][3];
B[0][0]
B[0][1]
B[0][2]
B[1][0]
B[1][1]
B[1][2]
A[0]
A[1]
A[2]
PROGRAMAÇÃO ESTRUTURAS DE DADOS E ALGORITMOS EM C 24 
A expressão de inicialização para variáveis de tipo agregado com N dimensões de um tipo 
base baseia-se no pressuposto que um tal agregado pode ser entendido como um agregado 
unidimensional de objectos, que são por sua vez, agregados com Nî1 dimensões do tipo 
base. Assim, a aplicação sistemática deste pressuposto e as regras de inicialização de 
agregados unidimensionais permitem a construção da expressão de inicialização adequada a 
cada caso. Cada linha de elementos de inicialização deve ser inserida entre chavetas, de 
maneira a aumentar a legibilidade da inicialização. 
 
A Figura 2.41 apresenta a declaração e inicialização de dois agregados bidimensionais, bem 
como da sua colocação na memória. 
 
 
Figura 2.41 - Declaração e inicialização de agregados bidimensionais. 
O agregado B, que tem 2×3 elementos, é inicializado com duas listas de inicialização, cada 
uma delas constituída por três constantes inteiras. Pelo que, todos os seus elementos são 
inicializados. O agregado C, que tem 3×3 elementos, é inicializado com apenas duas listas 
de inicialização. A primeira lista de inicialização é constituída apenas por uma constante, 
pelo que, o elemento C[0][0] é inicializado a 10 e os elementos C[0][1] e C[0][2] são 
inicializados a 0. A segunda lista de inicialização é constituída por duas constantes, pelo 
que, os elementos C[1][0] e C[1][1] são inicializados a 13 e a 14 respectivamente, e o 
elemento C[1][2] é inicializado a 0. Como não existe a terceira lista de inicialização, os 
elementos C[2][0], C[2][1] e C[2][2] são inicializados a 0. 
 
Para além dos agregados bidimensionais, por vezes existe a necessidade de utilizar 
agregados tridimensionais. Por exemplo, para a simulação de um campo electromagnético 
no espaço. A Figura 2.42 apresenta a declaração e inicialização de dois agregados 
tridimensionais, bem como da sua colocação na memória. Tal como na declaração de 
agregados unidimensionais é possível omitir o descritor de dimensão, ou seja, fazer uma 
definição incompleta, mas apenas da primeira dimensão, tal como é feito na declaração do 
agregado E. A primeira dimensão pode ser inferida pelo compilador a partir da expressão 
de inicialização, e neste exemplo é 2. 
 
int B[2][3] = { 
 {0, 1, 2},
 {3, 4, 5} 
 }; 
 
int C[3][3] = { 
 {10}, 
 {13, 14} 
 
 }; 
B[0][0]
B[0][1]
B[0][2]
B[1][0]
B[1][1]
B[1][2]
0
1 
2 
3 
4
5 
C[0][0]
C[0][1]
C[0][2]
C[1][0]
C[1][1]
C[1][2]
C[2][0]
C[2][1]
C[2][2]
10 
0 
0 
13
0 
0 
0 
14 
0 
25 CAPÍTULO 2 : COMPLEMENTOS SOBRE C 
 
 
 
Figura 2.42 - Declaração e inicialização de agregados tridimensionais. 
O agregado D, que tem 2×2×2 elementos, é inicializado com quatro listas de inicialização, 
cada uma delas constituída por 2 constantes inteiras. Pelo que, todos os seus elementos são 
inicializados. O agregado E, que tem a mesma dimensão, é inicializado com apenas três 
listas de inicialização com um total de 4 constantes. A primeira lista de inicialização é 
constituída apenas por uma constante, pelo que, o elemento E[0][0][0] é inicializado a 10 e 
o elemento E[0][0][1] é inicializado a 0. A segunda lista de inicialização é constituída por 
duas constantes, pelo que, os elementos E[0][1][0] e E[0][1][1] são inicializados a 12 e a 13 
respectivamente. A terceira lista de inicialização é constituída por apenas uma constante, 
pelo que, o elemento E[1][0][0] é inicializado