Programação Imperativa

Aula 6

Sumário




Inicialização de variáveis

As variáveis devem ser sempre inicializadas com um valor antes do seu uso. Se isso não for feito, a variável fica com um valor indefinido. Na memória do computador uma variável com valor indefinido é sinónimo de lixo. Exemplo:

        #include <stdio.h>

        main()
        {
           int a;

           printf("O valor de a = %d\n", a); 
        }

Ao ser executado, o programa pode escrever uma coisa deste estilo:

        O valor de a = 1877;

Devem ter sempre o cuidado de inicializar as variáveis antes destas serem utilizadas. Se isso não for feito, o programa muito provavelmente não irá fazer aquilo que se está à espera.

No exemplo concreto que acabei de ilustrar, 1877 é lixo. Isto é, a variável a ficou com o valor 1877 mas ninguém deu instruções ao computador para ele ter lá esse valor.

Já agora, aposto que quase toda a gente vai cometer este tipo de erro quando estiverem a fazer exercícios nas aulas práticas. Eu próprio costumo fazer esse tipo de erros de vez em quando. Nunca desanimem quando têm erros nos vossos programas. É raro um programa funcionar à primeira. Aquilo que se faz é corrigir os erros e voltar a recompilar até que o programa funcione como deve ser.


Tipos de dados básicos

Existem 4 tipos de dados básicos: int, float, double e char.

O tipo de dados int serve para guardar números inteiros, positivos e negativos.

Os tipos de dados float e double são usados para guardar números reais. A diferença entre eles é a precisão. O float tem uma precisão de 6 casas decimais e o double tem uma precisão de 10 casas decimais.

O tipo de dados char serve para guardar um caracter, por exemplo a letra 'Z'.

Reparem que os números reais também são codificados numa sequência de 0s e 1s na memória do computador. Para os números reais, uma parte dos bits serve para representar a parte fraccionária e a outra parte dos bits serve para representar a parte decimal. Assim, nos computadores os números reias não são um conjunto contínuo e infinito como na Matemática. Isso só seria possível se a memória dos computadores também fosse infinita. Na prática, isso não é um problema de maior porque grande parte dos problemas podem resolver-se limitando os cálculos a uma determinado número de casas decimais. A diferença entre as variáveis do tipo float e double é que as variáveis do tipo double têm mais precisão, isto é, são representadas internamente no computador por mais bits.


Caracteres especiais para o printf e scanf

A cada um dos 4 tipos de dados base corresponde um caracter de formatação especial para as instruções printf e scanf:

Exemplo: O seguinte programa ilustra os 4 tipos de dados

        #include <stdio.h>

        main()
        {
           int    i;
           float  x;
           double y;
           char   c;

           i = 347;
           x = 3.558;
           y = 2.9E7;
           c = 'Z';

           printf("valor de i = %d\n", i );
           printf("valor de x = %f\n", x );
           printf("valor de y = %lf\n", y );
           printf("valor de c = %c\n", c );
        }

Ao ser executado, o programa vai fazer o seguinte:

        valor de i = 347
        valor de x = 3.558000
        valor de y = 29000000.000000
        valor de c = Z

Podemos alterar o número de casas decimais que pretendemos escrever para as variáveis do tipo float ou double. Para tal, deve-se acrescentar ao %f ou %lf a precisão desejada. Por exemplo, se no exemplo acima tivéssemos escrito:

           printf("valor de x = %.2f\n", x );

iria aparecer escrito:

        valor de x = 3.56

Operadores aritméticos

Os símbolos dos operadores aritméticos são:

Operação Operador Exemplo Valor de x antes Valor de x depois
Multiplicação * x = x * 2; 4 8
Divisão / x = x / 2; 4 2
Adição + x = x + 2; 4 6
Subtracção - x = x - 2; 4 2
Incremento ++ x++; 4 5
Decremento -- x--; 4 3
Módulo % x = x % 3; 4 1

NOTA: o operador módulo (%) dá o resto da divisão inteira.


Funções pré-definidas

Em C existem diversas funções matemáticas pré-definidas. Para poderem ser utilizadas nos programas, tem de se incluir no início do programa a biblioteca math.h usando a directiva:

        #include <math.h>

De seguida apresenta-se algumas das funções existentes nessa biblioteca:

        sin(x)          sen( x )     
        cos(x)          cos( x )
        tan(x)          tan( x )
        asin(x)         arcsen( x )
        acos(x)         arccos( x )
        atan(x)         arctan( x )
        exp(x)          e elevado a x
        log(x)          logaritmo natural de x
        log10(x)        logaritmo de base 10 de x
    sqrt(x)         raiz quadrada de x
    ceil(x)         o menor inteiro não inferior a x
    floor(x)        o maior inteiro não superior a x

Exemplo: o seguinte programa utiliza a função sqrt definida em math.h para calcular as raízes de uma equação do segundo grau:

        /* 
         * programa para calcular as raízes de 
         * uma equação do segundo grau 
         */
        
        #include <stdio.h>
        #include <math.h>

        main()
        {
           float a, b, c;       /* coeficientes do polinómio de grau 2 */
           float delta;         /* parte da raiz quadrada */
           float raiz1, raiz2;  /* as duas raízes */

           printf("Introduza os coeficientes de um polinómio de grau 2\n");
           printf("a = "); scanf("%f", &a );
           printf("b = "); scanf("%f", &b );
           printf("c = "); scanf("%f", &c );
           delta = sqrt( b*b - 4*a*c );
           raiz1 = (-b+delta) / (2*a);
           raiz2 = (-b-delta) / (2*a);
           printf("As raízes são %f e %f \n", raiz1, raiz2 );
        }

Ao ser executado, o programa vai fazer o seguinte (o que aparece em bold é escrito pelo utilizador):

        Introduza os coeficientes de um polinómio de grau 2
        a = 1
        b = -1
        c = -2
        As raízes são 2.000000 e -1.000000

Comentários

Os programas em C podem ter comentários escritos entre os sinais de /* e */, tal como no exemplo do programa que acabamos de ver. Os comentários são irrelevantes para o computador mas são úteis para as pessoas porque fazem com que os programas fiquem mais legíveis. No entanto, os comentários não devem ser utilizados em excesso, devem apenas ser utilizados para explicar as partes mais delicadas do programa. Comentários em excesso só servem para atrapalhar. Exemplo de uma mau comentário:

        #include <stdio.h>

        main()
        {
           int a;

           printf("Introduz um número "); /* pede ao utilizador para introduzir um número */
           ...
        }

Este é um exemplo de um mau comentário. É má prática de programação colocar comentários em coisas óbvias.