Programa��o I

Erros frequentes em C

Existe 2 tipos de erros em programa��o:

  1. erros de compila��o
  2. erros de execu��o

Os erros de compila��o ocorrem quando o programa que escrevemos n�o obedece �s regras da linguagem. Este tipo de erros s�o normalmente f�ceis de detectar. Os mais frequentes s�o:

  1. Esquecer um ponto e v�rgula.
  2. Esquecer de fechar uma chaveta.
  3. Esquecer de fechar as aspas num printf ou scanf.
  4. Esquecer de fechar um coment�rio.
  5. Esquecer a declara��o de vari�veis.
  6. Escrever mal uma palavra (ex: studio.h em vez de stdio.h)

Os erros de execu��o s�o mais subtis. O programa compila normalmente sem erros, mas ao ser executado n�o faz aquilo que estamos � espera que fa�a. Na g�ria inform�tica, denominamos este tipo de erros por bugs.

Muitos principiantes em programa��o ficam frustrados quando n�o conseguem detectar os bugs. Com a experi�ncia, v�o ver que come�am a detect�-los com rapidez. O importante � n�o entrarem em p�nico.

Para se detectar um bug, devem tentar isolar o erro. Isso pode ser feito utilizando printfs no meio do c�digo para ver o que � que o programa est� a fazer passo a passo. Em alternativa, existem programas especiais denominados de debuggers que permitem executar o programa passo a passo e ver o conteudo das vari�veis do programa.

De seguida, apresenta-se alguns bugs cl�ssicos que ocorrem em C. S�o cl�ssicos porque n�o existe nenhum programador de C que nunca os tenha feito. Tenho a certeza que mais tarde ou mais cedo todos v�s tamb�m v�o cometer (ou j� cometeram) estes erros.

  1. Esquecer de inicializar vari�veis
  2. Esquecer o & no scanf
  3. N�o colocar as flags correctas (%d,%c,%f,...) no printf ou scanf
  4. Utilizar = em vez de ==
  5. Ciclo infinito
  6. Ponto e v�rgula no lugar errado
  7. N�o agrupar instru��es quando se pretende uma instru��o composta

1. Esquecer de inicializar vari�veis

Exemplo:

       int i, soma;

       i = 1;
       while (i < 10)
        {
          soma = soma + i;
          i++;
        }
       ...

A vari�vel soma n�o est� inicializada.

2. Esquecer o & no scanf

Exemplo:

       ...
       printf("Introduza um n�mero: ");
       scanf("%d", x);
       ...

em vez de:

       ...
       printf("Introduza um n�mero: ");
       scanf("%d", &x);
       ...

3. N�o colocar as flags correctas (%d,%c,%f,...) no printf ou scanf

Ditto.

4. Utilizar = em vez de == em compara��es

Exemplo:

       if( i = 3 ) 
        {
          ...
        }

em vez de:

       if( i == 3 ) 
        {
          ...
        }

5. Ciclo infinito

Um ciclo cuja condi��o de paragem nunca � verificada. Isto acontece muito quando nos esque�emos de actualizar um contador que controla a condi��o de paragem do ciclo. Exemplo:

       i = 1; s = 0; v = 0;
       while( i <= 100 )
        {
           s = s + i;
           v = v + i*i;
        }
       printf("%d %d\n", s, v);

6. Ponto e v�rgula no lugar errado

Exemplo:

       i = 1; s = 0; v = 0;
       while( i <= 100 );
        {
           s = s + i;
           v = v + i*i;
           i++;
        }
       printf("%d %d\n", s, v);

O problema � o ponto-e-v�rgula a seguir ao while. O c�digo vai dar origem a um ciclo infinito visto que o corpo do while � a instru��o vazia. O programa anterior � equivalente a:

       i = 1; s = 0; v = 0;
       while( i <= 100 )
         ;
       s = s + i;
       v = v + i*i;
       i++;
       printf("%d %d\n", s, v);

Este erro � t�o frequente que alguns programadores acabam por adoptar outra regra nas chavetas:

       i = 1; s = 0; v = 0;
       while( i <= 100 ) {
          s = s + i;
          v = v + i*i;
          i++;
       }
       printf("%d %d\n", s, v);

Assim, torna-se menos provavel que um programador coloque o ponto-e-v�rgula fora do s�tio. Visualmente, a chaveta a abrir d� uma indica��o que a instru��o while est� por completar.

O mesmo tipo de erro ocorre com a instru��o if e for. Exemplo:

       if( i > 0 );
         printf("ol�");
       printf("At� logo!");

Para o compilador, este c�digo � equivalente a:

       if( i > 0 )
          ;
       printf("ol�");
       printf("At� logo!");

Isto �, caso a condi��o (i>0) seja verdadeira, o computador ir� executar a instru��o vazia. As instru��es seguintes ser�o executadas incodicionalmente, quer a condi��o seja verdadeira quer seja falsa.

7. N�o agrupar instru��es quando se pretende uma instru��o composta

Exemplo:

     if(...)
       instru��o1
       instru��o2

Para o compilador, isto � equivalente a,

     if(...)
       instru��o1
     instru��o2

e provavelmente aquilo que queriam fazer era,

     if(...)
      {
        instru��o1
        instru��o2
      }