Edit page

Estruturas de Controlo

Conversão de Temperaturas

#include <stdio.h>

/* Conversão Fahrenheit-Celsius */

#define INFERIOR 0
#define SUPERIOR 300
#define PASSO 20

int main ()
{
    float fahr, celsius;

    fahr = INFERIOR;
    while (fahr <= SUPERIOR)
    {
        celsius = (5.0/9.0) * (fahr-32);
        printf("%3.0f\t%6.1f\n", fahr, celsius);
        fahr = fahr + PASSO;
    }
    return 0;
}

Podes (e deves!) comentar o código utilizando /* e */.

A UC de IAED costuma requerer a compilação do código com a flag -ansi que, entre outras coisas, proíbe comentários single-line com //. Esta é, contudo, outra maneira de comentar o código, podendo ser usada caso a flag em questão não esteja presente.

Como visto anteriormente, todas as variáveis devem ser declaradas antes de serem utilizadas.

A sintaxe da atribuição de valor a uma variável funciona como em Python (<variável> = <expressão>).

Podes ainda definir constantes utilizando #define. No código acima, definimos como constantes INFERIOR, SUPERIOR e PASSO. Existem várias razões para escolher definir algo como uma variável vs defini-lo como uma constante:

  • Caso tenhamos a certeza que queremos que aquele nome esteja associado àquele valor durante todo o nosso código, faz sentido defini-lo como uma constante.
  • Para propósitos de tradução, faz sentido ter strings de ajuda/texto associadas a constantes: algo como #define HELP_MESSAGE "Clique aqui para obter ajuda." é o exemplo típico para estes casos (costumando, inclusive, ser algo relevante nos projetos de IAED, e que consta das boas práticas da cadeira).

Podemos ainda fazer coisas giras com #define:

#define ever (;;)

void not_stopping_baby() {
  for ever {
    printf("Ups\n");
  }
}

// ou ainda

void oh_no() {
  for ever {
    oh_no();
  }
}

Resta realçar que as constantes são, por convenção, definidas com o nome todo em caracteres maiúsculos.

Ciclo while

Sintaxe: while (<expressão>) <instrução>

warning

Um erro comum na escrita de ciclos while consiste na colocação (errada) de um ; após a expressão que define o ciclo. Muitas vezes isto resultará num loop infinito. Um bom truque para o evitar é abrir chavetas imediatamente a seguir à expressão, independentemente do while conter apenas uma instrução.

while (i >= 0);
    i = i - 1;

// vs.

while (i >= 0) {
    i = i - 1;
}

Ciclo for

Os ciclos for também já são conhecidos do Python. São, no entanto, escritos de maneira diferente.

Sintaxe: for (<inicialização de variáveis>; <teste>; <incremento>) <instrução>

Aplicado ao exemplo anterior,

while (fahr <= superior) {
    celsius = (5.0 / 9.0) * (fahr - 32);
    printf("%3.0f\t%6.1f\n", fahr, celsius);
    fahr = fahr + passo;
}

// vs.

for (fahr = INFERIOR; fahr <= SUPERIOR; fahr = fahr + PASSO) {
    celsius = (5.0 / 9.0) * (fahr - 32);
    printf("%3.0f\t%6.1f\n", fahr, celsius);
}

Input/Output

Leitura de valores do standard input

É possível criar um programa que interage com o utilizador utilizando certas instruções.

Com o scanf() é possível ler o input introduzido no terminal, como podes ver neste exemplo.

#include <stdio.h>
/*
 * Objetivo: vamos pedir um inteiro ao utilizador e devolver o
 * quadrado desse numero
 */
int main () {
    int x;
    printf("Introduza um valor inteiro:\n");
    scanf("%d",&x);
    printf("O quadrado de %d é %d\n", x, x * x);
    return 0;
}

Utiliza-se o %d para ler um inteiro. Se pretendêssemos ler dois inteiros seguidos faríamos scanf("%d%d", &x, &y), por exemplo. Para ler um float utiliza-se %f (para uma lista mais completa, ver todos os format codes disponíveis).

Num scanf, é necessário colocar o & antes do nome da variável (a não ser que estejamos na presença de uma sequência de caracteres, %s). Aprenderão mais à frente na cadeira, na secção Ponteiros e Tabelas, o porquê da sintaxe ser esta.

Temos aqui outro exemplo que inclui um ciclo while. Este programa reproduz no terminal o input recebido (assumindo que apenas recebe inteiros) até ser introduzido um número negativo. Na aba ao lado mostra-se como adicionar um contador ao programa, que conta o número de inteiros introduzidos, imprimindo-o no final.

#include <stdio.h>

/* Copia inteiros do input para output */

int main () {
    int v;

    scanf("%d", &v);
    while (v >= 0) {
        printf("%d\n", v);
        scanf("%d", &v);
    }
    return 0;
}
#include <stdio.h>

/* Copia inteiros do input para output */

int main () {
    int v;
    long contador;

    contador = 0;
    scanf("%d", &v);
    while (v >= 0) {
        printf("%d\n", v);
        contador++;
        scanf("%d", &v);
    }
    printf("%ld\n", contador);
    return 0;
}

Como se pode ver no exemplo do contador, a forma de incrementar o valor de uma variável é algo que não existe em Python. contador++ em C equivale a contador += 1 em Python. Nota-se que este último também existe em C, no entanto.