Arrays em C

Arrays de uma dimensão

Existem situações em que necessitamos de ter muitas variáveis, cada qual mais ou menos com a mesma função. Isso acontece muitas vezes quando trabalhamos com listas ou sequências de números. Por exemplo, a média de uma lista de n números, X1, X2, ..., Xn, é definida como:
    média = (X1 + X2 + ... + Xn) / n
e o desvio de cada número em relação à média é dado pela fórmula:
    desvio = Xi - média    , para i = 1,2,...,n
Imaginem que queríamos fazer um programa para calcular a média de uma lista de 10 números e o desvio de cada número em relação à média. Com a matéria que aprendemos até agora, teríamos de fazer qualquer coisa deste estilo:
    float x1, x2, x3, x4, x5, x6, x7, x8, x9, x10;
    float d1, d2, d3, d4, d5, d6, d7, d8, d9, d10;
    float media;
    
    ...
    media = (x1+x2+x3+x4+x5+x6+x7+x8+x9+x10) / 10;
    d1 = x1 - media;
    d2 = x2 - media;
    ...
    d10 = x10 - media;    
Se em vez de 10 números fossem 100, teríamos de declarar 100 variáveis e isso seria uma grande chatice. É aqui que surge o conceito de array. A definição seguinte:
    float x[10];
define um array de nome x com 10 posições, cada uma correspondendo a uma variável do tipo float. Um array é como se fosse uma lista ou sequência de variáveis. Na linguagem C, os arrays começam sempre na posição 0. Por isso, a declaração float x[10] define as variáveis:
    x[0], x[1], x[2], ..., x[9]
Depois de definido o array, os seus elementos podem ser acedidos e modificados individualmente, tal e qual como nas variáveis que vimos até agora. Por exemplo:
    x[7] = 54;
    a = x[7];
O caso geral da definição de um array é:
    tipo nome[dimensão]
Se quisermos definir um array de nome a com 5 posições, cada qual podendo conter um número inteiro, temos de escrever:
 
int a[5];


   


 pensar no array a como se fosse uma sequência de 5 caixas, cada qual do tipo int, indexadas pelos índices 0,1,2,3,4.
depois de efectuar as seguintes instruções:
    a[0] = 134;
    a[1] = 5;
    a[2] = 71;
    a[3] = -65;
    a[4] = 12;
o estado do array a passa a ser


Depois desta breve introdução, vamos fazer o programa para calcular a média de uma lista de 10 números e os respectivos desvios em relação à média.
    #include <stdio.h>
    
    main()
    {
      float x[10];        /* lista de números */
      float desvio[10];   /* desvios em relação à média */
      float soma;   
      float media;  
      int   i;
      
      /* introdução dos números e cálculo da média */
      soma = 0;
      printf("Introduz 10 números: ");      
      for( i=0; i<10; i++ )
       {
         scanf("%f", &x[i] );
         soma = soma + x[i];
       }
      media = soma / 10;
      
      /* calculo dos desvios */
      for( i=0; i<10; i++ )
        desvio[i] = x[i] - media;
      
      /* escreve a média, os números, e os respectivos desvios */              
      printf("A média é %f\n", media );
      for( i=0; i<10; i++ )
        printf("x[%d] = %f    desvio[%d] = %f\n", i, x[i], i, desvio[i] );
    }   
Atenção: Têm que ter cuidado e não aceder a posições fora dos limites do array. Por exemplo, se definirem:
       
    float x[10];
e tentarem aceder a x[12] o compilador não dá erro, mas o programa vai comportar-se de um modo imprevisível.
Apesar de funcionar correctamente, o programa pode ser melhorado através da definição de uma constante.
    #include <stdio.h>
    
    #define N 10    
        
    main()
    {
      float x[N];        /* lista de números */
      float desvio[N];   /* desvios em relação à média */
      float soma;   
      float media;  
      int   i;
      
      /* introdução dos números e calculo da média */
      soma = 0;
      printf("Introduz %d números: ", N);      
      for( i=0; i<N; i++ )
       {
         scanf("%f", &x[i] );
         soma = soma + x[i];
       }
      media = soma / N;
      
      /* calculo dos desvios */
      for( i=0; i<N; i++ )
        desvio[i] = x[i] - media;
      
      /* escreve a média, os números, e os respectivos desvios */              
      printf("A média é %f\n", media );
      for( i=0; i<N; i++ )
        printf("x[%d] = %f    desvio[%d] = %f\n", i, x[i], i, desvio[i] );
    }   
Este é um bom exemplo para ilustrar a vantagem da utilização de constantes. Se em vez de 10 números quisermos 100, basta alterar a linha da definição da constante para:
    #define N 100
Se não tivéssemos usado a constante N, teríamos de vasculhar o programa todo e substituir as ocorrências de 10 por 100. Isso torna o programa mais difícil de modificar. Além disso, mais facilmente se pode introduzir erros de execução. Por exemplo, podíamos esquecer de substituir um dos 10 por 100. O programa funcionaria na mesma, mas iria dar resultados errados.

Comentários