Edit page

Input/Output

Comparação e Tratamento de Dados

  • Igualdade: ==

  • Desigualdade: > < >= <= !=

Variáveis do tipo long reservam 64 bits ou 8 bytes (em arquiteturas de 64-bits) para guardar o inteiro pretendido. Num printf ou scanf, usamos %ld para nos referirmos a variáveis deste tipo.

Podemos atribuir o mesmo valores a várias variáveis: int notas = aprovacoes = 0; é sintaxe correta (apesar de poder ser mais claro se separarmos as atribuições).

i++, ++i, i+=1

Em C, podemos incrementar uma variável em 11 unidade de várias maneiras. Num primeiro momento, iremos abordar ++i e i++.

i++ e ++i agem de maneira idêntica quando usadas em contexto "isolado", diferindo contudo quando utilizadas em contextos de comparação ou similares.

  • ++i incrementa o seu valor antes de verificar a condição em que se encontra.

  • i++ incrementa o seu valor depois de verificar a condição em que se encontra.

Nota

Esta notação pode também ser usada para decrementar valores em 1 unidade: i-- e --i

int a = 0, b = 0, c = 0;
/* Fazem o mesmo */
a++;
++a;

// ---

int a = 0;
while (a++ <= 3) {
  ... /* O ciclo é executado 4 vezes */
}

// ---

int a = 0;
while (++a <= 3) {
  ... /* O ciclo é executado 3 vezes */
}

É perfeitamente natural que a diferença (subtil) entre as notações vos possa confundir inicialmente: prometemos que é algo que com a prática vos vai parecer cada vez mais natural!

Linha de Comandos

Caso tenhamos um ficheiro de texto (pode ser ou não no formato txt) e o queiramos passar como input de um dado programa, devemos usar o operador de redireção < no terminal. O comando abaixo corre myprogram, tendo como input o ficheiro input.txt.

$ ./myprogram < input.txt

De modo semelhante, podemos também usar o operador de redireção > para passar o output da execução de um programa para um ficheiro à nossa escolha. No comando abaixo, corremos myprogram e enviamos o seu output para o ficheiro output.txt.

$ ./myprogram > output.txt

Podemos, por fim, combinar estes dois operadores, escrevendo um comando que corre um programa com um dado ficheiro como input, redirecionando o respetivo output para outro ficheiro:

$ ./myprogram < input.txt > output.txt

Leitura e Escrita de Caracteres

Leitura de Valores do Standard Input

Cada linha contém 0 ou mais caracteres e acaba com o caracter \n. Funções habituais de manipulação de text streams (stdout/stdin) são (mas não só):

  • getchar(), que lê o proximo caracter da text stream.
  • putchar(n), que escreve o caracter cujo código ASCII é o inteiro n passado como argumento.
#include <stdio.h>

int main() {
    char a = 'T';
    printf("Ao caracter %c corresponde o código ASCII %d.\n", a , a);
    return 0;
}

/*
Resultado:
    Ao caracter T corresponde o código ASCII 84.
*/
  • As variáveis do tipo char são inteiros de 1 Byte.
  • Permitem realizar operações numéricas tal como fazemos com ints.

Operadores Lógicos

Em vez dos operadores and e or que usámos em Python, em C (e num vasto conjunto de outras linguagens) usamos, respetivamente, && e ||. Aqui, os argumentos são avaliados da esquerda para a direita e quando o valor do argumento for suficiente para definir o valor da expressão, o programa para de avaliar as condições.

A Constante EOF significa End of File (que pode ser criado no terminal UNIX através do Ctrl-D).

tip

Se colocarem a atribuição de uma variável à função getchar(), devem colocar a atribuição entre parênteses.

Sintaxe: while((c = getchar()) != EOF)

O seguinte programa conta o número de caracteres e palavras que lhe são dados como input.

#include <stdio.h>

#define FORA 0
#define DENTRO 1

int main() {
    char c;
    int num_palavras = 0, num_chars = 0, estado = FORA;

    while ((c = getchar()) != EOF) {
        ++num_chars;
        if (c == ' ' || c == '\n' || c == '\t') {
            estado = FORA;
        } else if (estado == FORA) {
            estado = DENTRO;
            ++num_palavras;
        }
    }

    printf("%d %d\n", num_palavras, num_chars);
    return 0;
}

Por exemplo, quando executado com o input, o programa

Lorem ipsum dolor sit amet, consectetur.

teria output 6 41.