Diferenças

Aqui você vê as diferenças entre duas revisões dessa página.

Link para esta página de comparações

Próxima revisão
Revisão anterior
c:entrada_e_saida_padrao [2023/08/01 17:06] – criada mazieroc:entrada_e_saida_padrao [2023/08/03 16:46] (atual) – [A função printf] maziero
Linha 1: Linha 1:
 +====== Entrada/saída padrão ======
 +
 +Este módulo apresenta as funções básicas para entrada e saída de dados em programas C usando os arquivos de [[unix:shell_avancado|entrada e saída padrão]], ''stdin'' e ''stdout''.
 +
 +===== A função printf =====
 +
 +A função ''printf'', definida no arquivo ''stdio.h'', permite escrever no arquivo de saída padrão (normalmente a tela do terminal).
 +
 +Sua sintaxe básica é:
 +
 +  int printf (formato, argumento, argumento, ...) ;
 +
 +O valor de retorno (que pode ser ignorado) indica o número de bytes que foram escritos na chamada.
 +
 +O parâmetro ''formato'' define o que será impresso. É basicamente uma string com caracteres fixos e campos reservados para a impressão dos demais argumentos da chamada. Por exemplo, a linha abaixo irá escrever o valor de duas variáveis inteiras ''i'' e ''j'' em decimal:
 +
 +  printf ("i vale %d e j vale %d\n", i, j) ;
 +  
 +A saída será:
 +
 +  i vale 10 e j vale -37
 +
 +O formato ''%d'' indica que o argumento deve ser escrito como um decimal. Há dezenas de formatos disponíveis, sendo os principais:
 +
 +| ''\n'' | nova linha | 
 +| ''\t'' | tabulação |
 +| ''\b'' | retorno |
 +| ''\"'' | aspas |
 +| ''\\'' | barra |
 +| ''%%'' | porcento % |
 +| ''%c'' | caractere simples |
 +| ''%s'' | string |
 +| ''%d'' ou ''%i'' | decimal |
 +| ''%u'' | decimal sem sinal |
 +| ''%l'' | decimal (long) |
 +| ''%ll'' | decimal (long long) |
 +| ''%Nd'' | decimal com N dígitos, com espaços à esquerda |
 +| ''%0Nd'' | decimal com N dígitos, com zeros à esquerda |
 +| ''%f'' | real |
 +| ''%g'' | real (double) |
 +| ''%e'' | real (em notação científica) |
 +| ''%M.Nf'' | real com M dígitos, sendo N após a vírgula |
 +| ''%o'' | octal |
 +| ''%x'' | hexadecimal |
 +| ''%p'' | ponteiro (endereço) |
 +
 +Uma descrição detalhada do formato usado no comando ''printf'' pode ser obtida [[https://www.tutorialspoint.com/c_standard_library/c_function_printf.htm|nesta página]] ou [[http://www.cplusplus.com/reference/cstdio/printf/| nesta página]].
 +
 +===== A função scanf =====
 +
 +A função ''scanf'' permite ler dados da entrada padrão (normalmente o teclado do terminal). Ela opera de forma similar à função ''printf'', usando uma string de formato para indicar os tipos e formato dos dados a serem lidos.
 +
 +Por exemplo, a operação abaixo permite ler um valor inteiro e depositá-lo na variável ''a'':
 +
 +  scanf ("%d", &a) ;
 +
 +<note important>
 +O segundo argumento da função não é a variável ''a'', mas **o endereço** da variável ''a'' (descrito como ''&a''). Isso é necessário porque, nas funções em C, a passagem de parâmetros é feita por valor. A função ''scanf'' precisa saber "onde fica" a variável ''a'' para poder depositar nela o valor lido, por isso é necessário informar o endereço de ''a''
 +</note>
 +
 +Eis um exemplo de uso:
 +
 +<code c media.c>
 +// Cálculo da média simples de dois valores
 +#include <stdio.h>
 +
 +int main ()
 +{
 +  int a, b;
 +  float c;
 +
 +  printf("entre com o valor de a: ") ;
 +  scanf("%d", &a);
 +
 +  printf("entre com o valor de b: ") ;
 +  scanf("%d", &b);
 +
 +  // cálculo da média simples
 +  c = (a + b) / 2.0 ;
 +
 +  printf("a = %d, b = %d\n", a, b) ;
 +  printf("a media simples de a e b eh %f\n", c) ;
 +
 +  return (0) ;
 +}
 +</code>
 +
 +===== Entrada/saída de caracteres =====
 +
 +Algumas funções estão disponíveis para a leitura e escrita de caracteres isolados. A função ''getchar'' lê um caractere da entrada padrão (normalmente o teclado):
 +
 +  c = getchar () ;
 +
 +Caso a entrada não tenha mais dados a serem lidos, essa função devolve um valor específico ''EOF'' (//end-of-file//), para indicar que a entrada encerrou.
 +
 +A função ''putchar'' escreve um caractere na saída padrão (normalmente a tela do terminal):
 +
 +  putchar ('x') ;
 +
 +Exemplo de uso:
 +
 +<code c chars.c>
 +#include <stdio.h>
 +
 +int main ()
 +{
 +  char c ;
 +  
 +  c = getchar() ;      // lê um caractere de STDIN
 +  while (c != EOF)     // enquanto a entrada não terminar
 +  {
 +    if (c == ' '     // troca espaço por '_'
 +      c = '_' ;  
 +
 +    putchar (c) ;      // escreve o caractere em STDOUT
 +
 +    c = getchar () ;   // lê o próximo caractere
 +  }
 +  return (0) ;
 +}
 +</code>
 +
 +===== Entrada/saída de strings =====
 +
 +Algumas funções estão disponíveis para a leitura e escrita de strings:
 +
 +  * ''gets (char *s)'' : lê uma string da entrada padrão (**não usar**: tem problemas de segurança)
 +  * ''puts (char *s)'' : escreve uma string na saída padrão
 +
 +<note warning>
 +A função ''gets'' não limita o número de bytes lidos e pode provocar **estouro de buffer**, por isso não deve ser usada! Use a função ''fgets'' ao invés dela.
 +</note>
 +
 +===== Exercícios =====
 +
 +Escrever programas em C para:
 +
 +  - Ler um inteiro N e uma sequência de N inteiros, gerando na saída o valor de N, os valores máximo e mínimo observados (inteiros), a média (real) e o desvio padrão (real) dos N valores lidos.
 +  - Imprimir a seguinte sequência de números, até N=10000:<code>
 +    1                             8
 +00001 00002 00003 00004 00005 00006 00007 00008
 +    9    10    11    12    13    14    15    16
 +00009 00010 00011 00012 00013 00014 00015 00016
 +...
 +</code>
 +  - Ler um texto da entrada padrão e produzir o mesmo texto na saída padrão, mas com as letras convertidas em maiúsculas. Sugestão: usar a função ''getchar()'' para ler caracteres da entrada (até encontrar um ''EOF''), a função ''putchar()'' para escrever caracteres na saída e uma estrutura ''switch'' (ou uma tabela) para converter os caracteres.\\ **Sugestão**: em C, caracteres são tratados como números inteiros; consulte uma [[https://ascii.cl/|tabela ASCII]] para ver seus valores respectivos. 
 +  - Escreva um programa que imprima as raízes quadradas e os logaritmos (base 10) de todos os números inteiros entre 1 e 1000. Os valores devem ser impressos com 4 casas decimais, da seguinte forma:<code>
 +       1.0000  0.0000
 +   ...
 +   500  22.3606  2.6989
 +   ...
 +   999  31.6069  2.9999
 +  1000  31.6227  3.0000
 +</code>