275 pág.

Pré-visualização | Página 18 de 45
Ha´ casos, em que uma estrutura com mais de uma dimensa˜o e´ mais u´til. Por exemplo, quando trabalhamos com matrizes, onde os valores sa˜o organi- zados em uma estrutura de linhas e colunas. Em linguagem C, a declarac¸a˜o de uma matriz segue a seguinte forma ge- ral: tipo dado nome array[nro linhas][nro colunas]; O comando acima define um array de nome nome array contendo nro linhas × nro colunas elementos adjacentes na memo´ria. Cada elemento do array e´ do tipo tipo dado. Por exemplo, para criar um array de inteiros que possua 100 linhas e 50 colunas, isto e´, uma matriz de inteiros de tamanho 100×50, usa-se a declarac¸a˜o abaixo: int mat[100][50]; Como no caso dos arrays de uma u´nica dimensa˜o, cada posic¸a˜o da ma- triz possui todas as caracterı´sticas de uma varia´vel. Isso significa que ela 115 pode aparecer em comandos de entrada e saı´da de dados, expresso˜es e atribuic¸o˜es: scanf(“%d”,&mat[5][0]); mat[0][0] = 10; mat[1][2] = mat[5][0] + mat[0][0]; Perceba, no entanto, que o acesso ao valor de uma posic¸a˜o da matriz e´ feito agora utilizando dois ı´ndices: um para a linha e outro para a coluna. Lembre-se, cada posic¸a˜o do array e´ uma varia´vel. Portanto, todas as posic¸o˜es do array sa˜o igualmente acessı´veis, isto e´, o tempo e o tipo de procedimento para acessar qualquer uma das posic¸o˜es do array sa˜o iguais ao de qualquer outra varia´vel. 5.4 ARRAYS MULTIDIMENSIONAIS Vimos ate´ agora como criar arrays com uma ou duas dimenso˜es. A lingua- gem C permite que se crie arrays com mais de duas dimenso˜es de maneira fa´cil. Na linguagem C, cada conjunto de colchetes [ ] representa uma dimensa˜o do array. Cada par de colchetes adicionado ao nome de uma varia´vel durante a sua declarac¸a˜o adiciona uma nova dimensa˜o a`quela varia´vel, independente do seu tipo: int vet[5]; // 1 dimensa˜o 116 float mat[5][5]; // 2 dimenso˜es double cub[5][5][5]; // 3 dimenso˜es int X[5][5][5][5]; // 4 dimenso˜es O acesso ao valor de uma posic¸a˜o de um array multidimen- sional e´ feito utilizando um ı´ndice para cada dimensa˜o do array. 1 #include <s t d i o . h> 2 #include <s t d l i b . h> 3 i n t main ( ) { 4 i n t cub [ 5 ] [ 5 ] [ 5 ] ; 5 i n t i , j , k ; 6 / / preenche o ar ray de 3 dimenso˜es com zeros 7 for ( i =0; i < 5; i ++){ 8 for ( j =0; j < 5; j ++){ 9 for ( k =0; k < 5; k++){ 10 cub [ i ] [ j ] [ k ] = 0 ; 11 } 12 } 13 } 14 system ( ‘ ‘ pause ’ ’ ) ; 15 return 0; 16 } Apesar de terem o comportamento de estruturas com mais de uma di- mensa˜o, os dados dos arrays multidimensionais sa˜o armazenados line- armente na memo´ria. E´ o uso dos colchetes que cria a impressa˜o de estarmos trabalhando com mais de uma dimensa˜o. Por esse motivo, e´ importante ter em mente qual a dimensa˜o que se move mais rapidamente na memo´ria: sempre a mais a direita, independente do tipo ou nu´mero de dimenso˜es do array, como se pode ver abaixo marcado em vermelho: 117 int vet[5]; // 1 dimensa˜o float mat[5][5]; // 2 dimenso˜es double cub[5][5][5]; // 3 dimenso˜es int X[5][5][5][5]; // 4 dimenso˜es Basicamente, um array multidimensional funciona como qualquer outro array. Basta lembrar que o ı´ndice que va- ria mais rapidamente e´ o ı´ndice mais a` direita. 5.5 INICIALIZAC¸A˜O DE ARRAYS Um array pode ser inicializado com certos valores durante sua declarac¸a˜o. Isso pode ser feito com qualquer array independente do tipo ou nu´mero de dimenso˜es do array. A forma geral de inicializac¸a˜o de um array e´: tipo dado nome array[tam1][tam2]...[tamN] = {dados }; Na declarac¸a˜o acima, dados e´ uma lista de valores (do mesmo tipo do ar- ray) separados por vı´rgula e delimitado pelo operador de chaves {}. Esses valores devem ser colocados na mesma ordem em que sera˜o colocados dentro do array. A inicializac¸a˜o de uma array utilizando o operador de cha- ves {}so´ pode ser feita durante sua declarac¸a˜o. A inicializac¸a˜o de uma array consiste em atribuir um valor inicial a cada posic¸a˜o do array. O operador de chaves apenas facilita essa tarefa, como mostra o exemplo abaixo: 118 Exemplo: inicializando um array Com o operador de {} Sem o operador de {} 1 #include <s t d i o . h> 2 #include <s t d l i b . h> 3 i n t main ( ) { 4 i n t vet [ 5 ] = {15 ,12 ,91 ,35} ; 5 6 system ( ‘ ‘ pause ’ ’ ) ; 7 return 0; 8 } 1 #include <s t d i o . h> 2 #include <s t d l i b . h> 3 i n t main ( ) { 4 i n t vet [ 5 ] ; 5 vet [ 0 ] = 15; 6 vet [ 1 ] = 12; 7 vet [ 2 ] = 9 ; 8 vet [ 3 ] = 1 ; 9 vet [ 4 ] = 35; 10 11 system ( ‘ ‘ pause ’ ’ ) ; 12 return 0; 13 } Abaixo sa˜o apresentados alguns exemplos de inicializac¸a˜o de arrays de diferentes tipos e nu´mero de dimenso˜es: Exemplos: inicializando um array 1 #include <s t d i o . h> 2 #include <s t d l i b . h> 3 i n t main ( ) { 4 i n t matr iz1 [ 3 ] [ 4 ] = {1 ,2 ,3 ,4 ,5 ,6 ,7 ,8 ,9 ,10 ,11 ,12} ; 5 i n t matr iz2 [ 3 ] [ 4 ] = {{1 ,2 ,3 ,4} ,{5 ,6 ,7 ,8} ,{9 ,10 ,11 ,12}} ; 6 7 char s t r 1 [ 1 0 ] = { ’ J ’ , ’ o ’ , ’ a ’ , ’ o ’ , ’ \0 ’ } ; 8 char s t r 2 [ 1 0 ] = ‘ ‘ Joao ’ ’ ; 9 10 char s t r m a t r i z [ 3 ] [ 1 0 ] = { ‘ ‘ Joao ’ ’ , ‘ ‘ Maria ’ ’ , ‘ ‘ Jose ’ ’ } ; 11 12 system ( ‘ ‘ pause ’ ’ ) ; 13 return 0; 14 } Note no exemplo acima que a inicializac¸a˜o de um array de 2 dimenso˜es pode ser feita de duas formas distintas. Na primeira matriz (matriz1) os valores iniciais da matriz sa˜o definidos utilizando um u´nico conjunto de chaves {}, igual ao que e´ feito com vetores. Nesse caso, os valores sa˜o atribuı´dos para todas as colunas da primeira linha da matriz, para depois passar para as colunas da segunda linha e assim por diante. Lembre-se, 119 a dimensa˜o que se move mais rapidamente na memo´ria e´ sempre a mais a direita, independente do tipo ou nu´mero de dimenso˜es do array. Ja´ na segunda matriz (matriz2) usa-se mais de um conjunto de chaves {}para definir cada uma das dimenso˜es da matriz. Para a inicializac¸a˜o de um array de caracteres, pode-se usar o mesmo princı´pio definido na inicializac¸a˜o de vetores (str1). Percebe-se que essa forma de inicializac¸a˜o na˜o e´ muito pra´tica. Por isso, a inicializac¸a˜o de um array de caracteres tambe´m pode ser feita por meio de “aspas duplas”, como mostrado na inicializac¸a˜o de str2. O mesmo princı´pio e´ va´lido para iniciar um array de caracteres de mais de uma dimensa˜o. Na inicializac¸a˜o de um array de caracteres na˜o e´ ne- cessa´rio definir todos os seus elementos. 5.5.1 INICIALIZAC¸A˜O SEM TAMANHO A linguagem C tambe´m permite inicializar um array sem que tenhamos definido o seu tamanho. Nesse caso, simplesmente na˜o se coloca o valor do tamanho entre os colchetes durante a declarac¸a˜o do array: tipo dado nome array[ ] = {dados }; Nesse tipo de inicializac¸a˜o, o compilador da linguagem C vai considerar o tamanho do dado declarado como sendo o tamanho do array. Isto ocorre durante a compilac¸a˜o do programa. Depois disso, o tamanho do array na˜o podera´ mais ser modificado durante o programa. Abaixo sa˜o apresentados alguns exemplos de inicializac¸a˜o de arrays sem tamanhos: 120 Exemplos: inicializando um array sem tamanho 1 #include <s t d i o . h> 2 #include <s t d l i b . h> 3 i n t main ( ) { 4 / / A s t r i n g tex to te r a´ tamanho 13 5 / / (12 carac te res + o carac te re ’\0 ’ ) 6 char t e x t o [ ] = ‘ ‘ Linguagem C. ’ ’ ; 7 8 / / O nu´mero de posi c¸ o˜es do ve to r sera´ 10. 9 i n t ve to r [ ] = {1 ,2 ,3 ,4 ,5 ,6 ,7 ,8 ,9 ,10} ; 10 11 / /O nu´mero de l i n h a s de mat r i z sera´ 5 . 12 i n t mat r i z [ ] [ 2 ] = {1 ,2 ,3 ,4 ,5 ,6 ,7 ,8 ,9 ,10} ; 13 14 system ( ‘ ‘ pause ’ ’ ) ; 15 return 0; 16 } Note no exemplo acima que foram utilizados 12 caracteres para iniciar o array de char “texto”. Pore´m, o seu tamanho final sera´ 13. Isso ocorre por que arrays de caracteres sempre possuem o elemento seguinte ao u´ltimo caractere como sendo o caractere ‘\0’. Mais detalhes sobre isso podem ser vistos na sec¸a˜o seguinte. Esse tipo de inicializac¸a˜o e´ muito u´til quando na˜o queremos contar quantos caracteres sera˜o necessa´rios