CCT-UFCA/Ciência da Computação/Introdução à Programação/Entrada e Saída
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;
}