Imagine que você desenvolveu um programa para controlar suas finanças pessoais e com ele intenci- ona conter seus gastos e ainda guardar uma parte do que ganha na poupança. Esse programa necessita de interação? Como você informará suas receitas e despesas? Como ele apresentará o resultado dos seus cálculos com a finalidade de auxiliá-lo no controle de suas finanças?
As respostas de todas essas perguntas convergem para a seguinte conclusão: um programa de com- putador é praticamente inútil se não apresentar algum tipo de interação com o usuário. No cenário anterior, por exemplo, você precisa informar ao programa quais são as suas receitas e despesas. Além disso, é necessário que ele o deixe a par dos resultados dos seus cálculos, caso contrário ele não terá serventia alguma.
Os mecanismos que as linguagens de programação oferecem para interação com o usuário estão presentes em suas bibliotecas de entrada e saída. Em C, as funções responsáveis pelas operações básicas de entrada e saída se encontram na biblioteca stdio, que é utilizada por meio da diretiva: #include <stdio.h>
Vimos não seção 2.6 uma forma de exibir na tela uma sequência de caracteres através da função printf(), que, além de imprimir caracteres, também é capaz de exibir o conteúdo de variáveis de diversos tipos. Os detalhes de sua utilização, bem como uma função similar para entrada de dados são apresentados não nas seções posteriores.
2.10.1
Função printf()
A função de saída printf() permite que dados sejam escritos na saída padrão, que normalmente é a tela do computador. Uma chamada da função printf tem o seguinte formato:
int printf(string_de_formato, arg1, arg2, ..., argn)
Isso quer dizer que a função printf irá escrever na saída padrão os argumen- tos arg1,arg2,...,argn de acordo com o que está especificado no parâmetro string_de_formato. Além disso, o tipo int indica que a função retorna um número in- teiro, que neste caso corresponde ao número de caracteres impressos. O exemplo a seguir ilustra a utilização da função printf():
#include <stdio.h> int main() { int idade; float altura; idade = 18; altura = 1.90;
printf("Tenho %d anos e %.2f de altura.", idade, altura);
return 0; }
Após a execução do código acima será exibida na tela a seguinte frase: Tenho 18 anos e 1.90 de altura.
Os caracteres %d e %.2f são denominados de especificadores de formato e têm o objetivo de definir o formato das variáveis que serão escritas na saída padrão. De outro modo, podemos entendê-los como "guardadores de lugar"para as variáveis a serem exibidas. No exemplo acima, no lugar do %d será colocada a primeira variável passada por parâmetro (idade) e no lugar do %.2f a segunda variável (altura). Além disso, elas deverão ser dos tipos int e float, respectivamente. O ponto
seguido de um número antes do código de formato indica a quantidade de casas decimais a serem exibidas (quando aplicados a variáveis do tipo ponto-flutuante) e são denominados de especificadores de precisão. No exemplo anterior eles foram os responsáveis pela exibição da variável altura com duas casas decimais.
A tabela abaixo lista os especificadores de formato mais comuns utilizados na função printf(). Tabela 2.5: Especificadores de formatos mais utilizados na
função printf()
Código Formato
%d ou %i Inteiro (int) decimal %ld ou %li Inteiro (long int) decimal
%u Inteiro sem sinal %c Caractere
%s Cadeira de caracteres %f Número de ponto-flutuante
2.10.2
Função scanf()
A função de entrada scanf() possibilita a leitura de dados da entrada padrão, ou seja, do teclado. O que ela faz é interromper a execução do programa até que o usuário digite algo e depois pressione a tecla Enter. Depois que o programa retoma sua execução, o conteúdo digitado é armazenado em uma ou mais variáveis. Uma chamada da função scanf tem o seguinte formato:
int scanf(string_de_formato, arg1, arg2, ..., argn)
O parâmetro string_de_formato especifica os tipos de dados que serão lidos e os parâmetros arg, arg2, ..., argn correspondem aos endereços das variáveis nas quais serão armazena- dos os valores digitados pelo usuário. A função scanf() retorna um valor inteiro que indica o número de variáveis que tiveram valores atribuídos, sendo utilizado para verificar algum problema na entrada de dados. O exemplo a seguir ilustra a utilização da função scanf():
#include <stdio.h>
int main() {
int idade;
float altura;
printf("Informe sua idade: ");
scanf("%d", &idade)
printf("Informe sua altura: ");
scanf("%f", &altura);
printf("\nVocê tem %d anos e %.2f de altura.", idade, altura);
return 0; }
Ao contrário do exemplo da seção anterior, os dados a serem exibidos não estão pré-determinados, isto é, as variáveis não possuem valores a priori. As atribuições apenas ocorrem quando o usuário entra com valores via teclado. No exemplo, depois que a sequência de caracteres "Informe sua idade: " é exibida, a execução do programa é interrompida até que o usuário digite um valor. Quando isso ocorre, ele é armazenado no endereço da variável idade, obtido quando ela é precedida pelo caractere &. Por conseguinte, o printf() ao final do código irá exibir os dados informados pelo usuário e não os dados pré-determinados pelo programador.
Importante
A tecla Enter também possui um caractere que a representa, a saber, o caractere especial ‘\n’. Portanto, quando o ’\n’ é escrito na saída padrão, o efeito gerado é o mesmo da digitação da tecla Enter.
A função scanf() também pode ler numa mesma linha diversos dados, armazenando-os em dife- rentes variáveis. As leituras do código anterior, por exemplo, podem ser reescritas da seguinte forma:
printf("Informe sua idade e sua altura:");
scanf("%d %.2f", &idade)
Para que esse código funcione como desejado, o usuário precisa digitar um número inteiro seguido de um espaço e depois um número de ponto-flutuante. O espaço é requerido porque ele é utilizado na especificação do formato (entre o %d e o %.2f há um espaço). Assim como printf(), a função scanf()também possui uma lista de especificadores de formato. Os mais utilizados seguem abaixo:
Tabela 2.6: Especificadores de formatos mais utilizados da função scanf()
Código Significado
%d ou %i Leitura de um inteiro (int) decimal %ld ou
%li
Leitura deum inteiro (long int) decimal %u Leitura de um inteiro sem sinal
%c Leitura de um único caractere %s Leitura de uma cadeira de caracteres %f Leitura de um número de ponto-flutuante