Linguagem C: Entrada e Saída de Dados

De Aulas

Links relacionados: Programação em C

Função printf()

  • Função de I/O, que permite escrever no dispositivo padrão (tela).
  • A expressão de controle pode conter caracteres que serão exibidos na tela e os códigos de formatação que indicam o formato em que os argumentos devem ser impressos. Cada argumento deve ser separado por vírgula.

Sintaxe:

printf (“expressão de controle“, argumentos);

Caracteres Especiais:

\n : nova linha
\t : tab
\b : retrocesso
\" : aspas
\\ : barra   
\f : salta formulário
\0 : nulo

Formato do argumento:

%d  : inteiro (decimal)
%e  : notação científica
%f  : float (ponto flutuante)
%o  : octal
%u  : decimal sem sinal
%x  : hexadecimal
%lf : double
%c  : caractere simples
%s  : string (cadeia de caracteres)
%p  : ponteiro

Exemplo 01

1#include <stdio.h>
2
3int main() {
4    printf("Este é o número dois: %d\n", 2);
5    printf("%s está a %d milhões de milhas do sol.\n", "Vênus", 67);
6}

Exemplo 02

 1#include <stdio.h>
 2
 3// Observe que neste exemplo as variáveis não foram inicializadas
 4
 5int main() {
 6    int i, j;
 7    float x;
 8    char c;
 9    printf("%d ", i);
10    printf("%d %f ", j, x);
11    printf("%c\n", c);
12}

Exemplo 03

 1#include <stdio.h>
 2
 3int main() {
 4    // Observe que ele completa com espaços
 5    printf("%2d\n",350);
 6    printf("%4d\n",350);
 7    printf("%6d\n",350);
 8
 9    /*
10    O primeiro número se refere a quantidade total de números
11    e o segundo é referente à precisão, casas depois da vírgula
12    */
13    printf("%2.2f\n", 123.332234);
14    printf("%10.4f\n", 123.332234);
15    printf("%15.6f\n", 123.332234);
16}

Exemplo 04

 1#include <stdio.h>
 2
 3// Este exemplo mostra uma saída formatada estilo tabela
 4
 5int main() {
 6    float v1, v2, t;
 7    printf("%10s %10s %10s\n", "Valor 1", "Valor 2", "Total");
 8    v1 = 8.0;
 9    v2 = 95.3;
10    t = v1 + v2;
11    printf("%10.2f %10.2f %10.2f\n", v1, v2, t);
12    v1 = 843.0;
13    v2 = 1500.55;
14    t = v1 + v2;
15    printf("%10.2f %10.2f %10.2f\n", v1, v2, t);
16}

Exemplo 05

1#include <stdio.h>
2
3int main() {
4    // Completando com zeros à esquerda
5    printf("%04d\n", 21);
6    printf("%06d\n", 21);
7    printf("%6.4d\n", 21);
8    printf("%6.0d\n", 21);
9}

Exemplo 06

1#include <stdio.h>
2
3int main() {
4    // Imprimindo caracteres
5    // posição ASCII, char, exadecimal, octal
6    printf("%d %c %x %o\n", 'A', 'A', 'A', 'A');
7    printf("%c %c %c %c\n", 'A', 65, 0x41, 0101);
8}

Observação: A tabela ASCII possui 256 códigos de 0 a 255, se imprimirmos em formato caractere um número maior que 255, será impresso o resto da divisão do número por 256; se o número for 3393 será impresso A pois o resto de 3393 por 256 é 65.

Função scanf()

É uma função de I/O implementada em todos os compiladores C. Ela é o complemento de printf() e nos permite ler dados formatados da entrada padrão(teclado).

Sintaxe:

scanf(“expressão de controle”, argumentos);

A lista de argumentos deve consistir nos endereços das variáveis. C oferece um operador para tipos básicos chamado operador de endereço e referenciando pelo símbolo "&" que retorna o endereço do operando.

Operador de endereço &: A memória do computador é dividida em bytes, e são numerados de 0 até o limite da memória. Estas posições são chamadas de endereços. Toda variável ocupa uma certa localização na memória, e seu endereço é o primeiro byte ocupado por ela.

Exemplo 01

 1#include <stdio.h>
 2
 3int main() {
 4    int num;
 5
 6    // Lendo um número inteiro
 7    printf("Digite um número: ");
 8    scanf("%d", &num);
 9
10    // Imprime na tela o valor do número, \n indica nova linha
11    printf("O número é %d\n", num);
12
13    // Imprime o local da memória onde a informação está armazenada (ponteiro)
14    printf("O endereço é %p\n", &num);
15    return 0;
16}

Exemplo 02

 1#include <stdio.h>
 2
 3int main() {
 4    int i, j;
 5    float x;
 6    char c;
 7    char nome[30];
 8
 9    // Lendo um número inteiro
10    printf("inteiro i: ");
11    scanf("%d", &i);
12
13    // Lendo um número inteiro e em sequencia um float
14    printf("inteiro j e float x: ");
15    scanf("%d %f", &j, &x);
16
17    // Lendo um caracter, testar com o %c
18    printf("char c: ");
19    scanf("%s", &c);
20
21    // Lendo uma string, testar com uma string com mais de uma palavra
22    printf("string nome: ");
23    scanf("%s", nome);
24
25    // Mostrando as informações
26    printf("i = %d, j = %d, x = %f, c = %c, nome = %s", i, j, x, c, nome);
27    return 0;
28}


Tpl note.png

Na hora de ler o char c com %s gera problemas no código. Ao alterar para %c, o caracter não é lido, pois pega o enter do buffer da leitura anterior. Basta limpar com setbuf antes:

   setbuf(stdin, NULL);
   printf("char c: ");
   scanf("%c", &c);

Exemplo 03

 1#include <stdio.h>
 2
 3int main() {
 4    float n1, n2, n3, media;
 5
 6    // Lê as notas. Digitar as três em sequẽncia dando espaço entre uma e outra
 7    printf("Entre com as notas 1, 2 e 3: ");
 8    scanf("%f %f %f", &n1, &n2, &n3);
 9
10    // Calcula a média das notas
11    media = (n1 + n2 + n3) / 3;
12
13    // Imprime o resultado com apenas duas casas decimais
14    printf("Média: %.2f\n", media);
15}

Exemplo 04

Tpl note.png

Entrada de strings com espaços em branco

 1#include <stdio.h>
 2
 3int main() {
 4  char nome[100];
 5  printf("Entre com o nome: "); 
 6  // Le uma entrada de uma string contendo espaços também
 7  scanf("%[^\n]s", nome);
 8  // Limpa o buffer pra não dar problema com o ENTER
 9  setbuf(stdin, NULL);
10  printf("O nome é %s.\n", nome); 
11}

Função getchar()

  • Função original de entrada de caractere dos sistemas baseados em UNIX.
  • Armazena a entrada até que ENTER seja pressionada.

Exemplo

1#include <stdio.h>
2
3int main() {
4    char ch;
5    ch = getchar();
6    printf("%c\n",ch);
7    return 0;
8}

Função putchar()

  • Escreve na tela o argumento do seu caractere na posição corrente.

Exemplo

1#include <stdio.h>
2
3void main() {
4    char c;
5    printf("digite uma letra : ");
6    c = getchar();
7    putchar(c);
8    putchar('\n');
9}

Observação: Há inúmeras outras funções de manipulação de char complementares, tais como isalpha(), isupper(), islower(), isdigit(), isespace(), toupper(), tolower().

Exercícios

Exercício 1

Construa um programa que tendo como entrada dois pontos quaisquer do plano P(x1,y1) e Q(x2,y2), imprima a distância entre eles.

A fórmula da distância é:

√((x2-x1)^2+(y2-y1)^2)

Resolução

 1#include <stdio.h>
 2#include <math.h>
 3
 4int main() {
 5    float x1, y1, x2, y2;
 6    float distancia;
 7    printf ("Digite o valor de x1: ");
 8    scanf ("%f", &x1);
 9    printf ("Digite o valor de y1: ");
10    scanf ("%f", &y1);
11    printf ("Digite o valor de x2: ");
12    scanf ("%f", &x2);
13    printf ("Digite o valor de y2: ");
14    scanf ("%f", &y2);
15    distancia = sqrt(pow((x2 - x1), 2) + pow((y2 - y1), 2));
16    printf ("A distancia entre os pontos P1 e P2 e’ %.2f\n", distancia);
17}

Observação: Para compilar, linkar a biblioteca math.h com o parâmetro -lm conforme exemplo abaixo

gcc exercicio01.c -o ex01 -lm

Exercício 02

Faça um programa em C que mostre o resultado das seguintes expressões:

a) (-(-9) + sqrt((-9) * (-9) - 4 * 3 * 6)) / (2 * 3)

b) ((pow(3, 2) == 9) && (acos(0) == 0)) || (4 % 8 == 3)

Exercício 03

Escreva programas em C para converter uma temperatura dada em graus Fahrenheit para graus Celsius.

Exercício 04

Escreva programas em C para calcular o IMC (Índice de Massa Corpórea) a partir da entrada de dados pelo usuário.