Ir para o conteúdo

CCT-UFCA/Ciência da Computação/Introdução à Programação/Entrada e Saída

De Wikiversidade

Entrada e Saída

[editar | editar código]

A entrada e saída (E/S) em C são essenciais para a interação do programa com o usuário ou outros dispositivos, permitindo a troca de informações. De forma simples, "entrada" refere-se aos dados que o programa recebe (como do teclado ou de arquivos), enquanto "saída" diz respeito ao que ele exibe ou grava (na tela ou em um arquivo). Para essas operações, utilizaremos principalmente a biblioteca <stdio.h> que fornece as funções necessárias para entrada e saída de dados. Em tópicos futuros, exploraremos conceitos mais avançados, como manipulação de arquivos.

Funções de Saída

[editar | editar código]

A principal função de saída em C é printf. Abaixo, veja uma explicação acompanhada de exemplos práticos:

Exemplo - "Hello World".

[editar | editar código]

O código a seguir imprime "Hello, World!" no terminal. Note que, na linha 5, o texto a ser exibido é passado como argumento para printf, entre parênteses.

#include <stdio.h>

// função principal!
int main() {
    printf("Hello, World!");
    return 0;
}
  • Linha 1: Importa a biblioteca <stdio.h>, necessária para usar a função printf.
  • Linha 3: Comentário (ignorado durante a execução do programa).
  • Linha 4: Define a função main, que é obrigatória em programas em C. Todo o código deve estar dentro dela ou ser chamado a partir dela.
  • Linha 5: Exibe "Hello, World!" no terminal.
  • Linha 6: Finaliza a execução da função main, retornando 0, o que indica que o programa terminou com sucesso.
  • Linha 7: Fecha o escopo da função main.

Saída Formatada

[editar | editar código]

Vamos criar uma variável para representar uma idade e exibir seu valor na tela. No código abaixo, o conteúdo da variável idade será inserido no lugar de %d.

#include <stdio.h>

/* 
    Programa que imprime o conteúdo
    da variável idade.
*/

int main() {
    int idade;
    idade = 20;
    printf("Eu tenho %d anos.\n", idade);
    return 0;
}
  • Linha 1: Importa a biblioteca stdio.h, necessária para usar printf.
  • Linhas 3 a 6: Comentário de múltiplas linhas, ignorado pelo programa. Diferente do comentário //, esse formato permite textos extensos entre /* e */.
  • Linha 8: Define a função main, ponto de entrada do programa.
  • Linha 9: Declara a variável idade do tipo int.
  • Linha 10: Atribui o valor 20 à variável idade.
  • Linha 11: Exibe Eu tenho 20 anos. no terminal e realiza uma quebra de linha (\n).
  • Linha 12: Finaliza a execução da função main, retornando 0.
  • Linha 13: Fecha o escopo da função main.


Agora, usamos uma variável float e o marcador %f para formatar um número decimal. O programa imprimirá O preço é 1.950000:

#include <stdio.h>

int main() {
    float preco;
    preco = 1.95;
    printf("O preço é %f.\n", preco);
    return 0;
}

Podemos melhorar a formatação do exemplo anterior para exibir apenas duas casas decimais usando %.2f:

#include <stdio.h>

int main() {
    float preco;
    preco = 1.95;
    printf("O preço é %.2f.\n", preco);
    return 0;
}

Os outros tipos seguem a mesma lógica, cada um com seu próprio código de formatação. Abaixo, segue uma tabela com os principais formatos:

Código Tipo de Dado Descrição Exemplo de Uso
`%d` Inteiro com sinal Imprime um número inteiro decimal. `printf("%d", 42);`
`%i` Inteiro com sinal Similar ao `%d`; lê/imprime um inteiro decimal (aceita notação octal e hexadecimal na leitura). `scanf("%i", &var);`
`%u` Inteiro sem sinal Imprime um número inteiro decimal sem sinal. `printf("%u", 300U);`
`%o` Inteiro sem sinal (octal) Imprime um número inteiro em notação octal. `printf("%o", 255);`
`%x` Inteiro sem sinal (hexadecimal) Imprime um número inteiro em notação hexadecimal (letras minúsculas). `printf("%x", 255);`
`%X` Inteiro sem sinal (hexadecimal) Imprime um número inteiro em notação hexadecimal (letras maiúsculas). `printf("%X", 255);`
`%f` Ponto flutuante Imprime um número de ponto flutuante em notação decimal. `printf("%f", 3.1415);`
`%e` Ponto flutuante Imprime um número de ponto flutuante em notação científica (letras minúsculas). `printf("%e", 3.1415);`
`%E` Ponto flutuante Imprime um número de ponto flutuante em notação científica (letras maiúsculas). `printf("%E", 3.1415);`
`%g` Ponto flutuante Imprime o valor de ponto flutuante no formato mais compacto entre `%f` e `%e`. `printf("%g", 3.1415);`
`%G` Ponto flutuante Semelhante a `%g`, mas utiliza `%E` se for o caso. `printf("%G", 3.1415);`
`%a` Ponto flutuante (C99) Imprime um número de ponto flutuante em notação hexadecimal (letras minúsculas). (Disponível no C99 em diante) `printf("%a", 3.1415);`
`%A` Ponto flutuante (C99) Imprime um número de ponto flutuante em notação hexadecimal (letras maiúsculas). (Disponível no C99 em diante) `printf("%A", 3.1415);`
`%c` Caractere Imprime um único caractere. `printf("%c", 'A');`
`%s` String Imprime uma sequência de caracteres (string). `printf("%s", "Olá, Mundo!");`
`%p` Ponteiro Imprime o endereço de memória (formato específico da implementação). `printf("%p", ptr);`
`%n` Nenhum (armazenamento) Não imprime nada; armazena na variável o número de caracteres impressos até o momento. Uso: em conjunto com outras funções, ex.: `scanf("%n", &cont);`
`%%` Literal (%) Imprime o caractere `%`. `printf("50%% concluídos.");`


Além da função printf também podemos utilizar outras funções para saída como:

  • putchar(): Exibe um único caractere na saída.
  • puts(): Exibe uma string seguida de uma nova linha. É útil para saídas simples sem necessidade de formatação.
  • perror(): Exibe uma string de erro na stream de erro padrão. Essa função pode ser utilizada ao importar a função <errno.h>.

Funções de Entrada

[editar | editar código]

Usamos scanf para ler dados da entrada padrão (normalmente, o teclado) e armazená-los em variáveis. Assim como printf, o scanf utiliza especificadores de formato para interpretar os dados lidos e armazená-los no endereço de memória da variável desejada.

Assim como na saída formatada, a entrada de dados deve ser compatível com o tipo da variável. Veja o exemplo a seguir:

#include <stdio.h>

int main() {
    int valor;
    printf("Informe um valor inteiro: ");
    scanf("%d", &valor);
    printf("Você informou: %d\n", valor);
    return 0;
}
  • Linha 1: Importa a biblioteca stdio.h, necessária para usar printf e scanf.
  • Linha 3: Define a função main, ponto de entrada do programa.
  • Linha 4: Declara a variável valor.
  • Linha 5: Exibe uma mensagem pedindo ao usuário que insira um número.
  • Linha 6: Captura o valor digitado pelo usuário e o armazena na variável valor. Note que passamos, obrigatoriamente, o endereço da variável usando &.
  • Linha 7: Mostra o valor adicionado pelo usuário.
  • Linha 8: Finaliza a execução da função main, retornando 0.
  • Linha 9: Fecha o escopo da função main.

Veja o mesmo exemplo, agora com uma formatação específica na entrada dos dados. O programa espera que o usuário digite dois números separados por um espaço. Essa exigência é definida por "%d %d" no scanf:

#include <stdio.h>

int main() {
    int valor1;
    int valor2;
    printf("Informe dois números separados por um espaço: ");
    scanf("%d %d", &valor1, &valor2);
    printf("Você informou: %d e %d\n", valor1, valor2);
    return 0;
}

Por fim, vamos a mais um exemplo. Agora, o programa recebe um número e, em seguida, um caractere. O código é semelhante aos anteriores, com uma exceção: a linha 8. Ela usa getchar() para evitar problemas com o buffer de entrada, garantindo que o caractere seja lido corretamente.

#include <stdio.h>

int main() {
    double valor;
    printf("Informe um número: ");
    scanf("%lf", &valor);
    
    getchar();
    
    char letra;
    printf("Informe uma letra: ");
    scanf("%c", &letra);
    
    printf("Você informou o número: %lf\nVocê informou a letra: %c\n", valor, letra);
    return 0;
}