====== 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) ; 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''. Eis um exemplo de uso: // Cálculo da média simples de dois valores #include 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) ; } ===== 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: #include 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) ; } ===== 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 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. ===== 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: 1 2 3 4 5 6 7 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 ... - 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: 1 1.0000 0.0000 ... 500 22.3606 2.6989 ... 999 31.6069 2.9999 1000 31.6227 3.0000