Entrada de Dados na Linguagem C
Professor Adolfo Neto DAINF UTFPR
Objetivos
Ao final desta aula o aluno será capaz de
escrever programas em C utilizando a função
SCANF para entrada de dados.
Roteiro
1)
A função SCANF(): definição e forma geral
2)
Lendo Valores Inteiros em Variáveis
3)
Lendo int, float e double com Scanf()
4)
Usando Caracteres em Scanf() que Serão
Descartados
5)
Lendo String de Caracteres
6)
Formatando a Entrada de Scanf()
7)
Determinando o Número Máximo de Caracteres a
ser Lido
A Função SCANF()
● A função scanf( ) é uma das funções de entrada de dados da
Linguagem C que pode ser usada para ler virtualmente qualquer tipo de dado inserido por meio do teclado.
● Freqüentemente ela é usada para a entrada de números
inteiros ou de ponto flutuante.
● A forma geral da função scanf( ) é:
A Função SCANF()
● Os especificadores de formato de entrada são precedidos por
um sinal % e dizem à função scanf( ) qual tipo de dado deve ser lido em seguida.
A Função SCANF()
● Os caracteres de conversão d, i, o, u e x podem ser precedidos
por h para indicarem que um apontador para short ao invés de int aparece na lista de argumentos, ou por l (letra ele) para indicar que um apontador para long aparece na lista de argumentos.
● Semelhantemente, os caracteres de conversão e, f e g podem
ser precedidos por l (letra ele) para indicarem que um apontador para double ao invés de float está na lista de argumentos.
A Função SCANF()
● A cadeia de formato geralmente contém especificações de
conversão, que são usadas para controlar a conversão da entrada.
● A cadeia de formato pode conter:
– espaços, tabulações e novas linhas, que serão ignorados;
– caracteres comuns (não %), que devem combinar com o
próximo caractere nãoespaço do fluxo de entrada;
– especificações de conversão, consistindo no caractere %,
um caractere * opcional de supressão de atribuição, um número opcional especificando um tamanho máximo do campo, um h ou l opcional indicando o tamanho do destino, e um caractere de conversão.
#include <stdio.h> main(void) { int count; /* Obs.: O espaço foi removido */ scanf("%d", &count); printf("%d\n",count); } Lendo Valores Inteiros em Variáveis
#include <stdio.h> #include <stdlib.h> main(){ int i; printf("Digite um numero inteiro:"); scanf("%d",&i); printf("%d\n",i); float j; printf("Digite um numero real:"); scanf("%f",&j); printf("%f\n",j); double k; printf("Digite um numero real:"); scanf("%lf",&k); printf("%f\n",k); } Lendo int, float e double com Scanf()
#include <stdio.h> main() { int a,b=1; printf("Digite dois numeros separados por uma virgula:"); scanf("%d,%d", &a, &b); printf("Numeros digitados: %d e %d",a,b); /* Verifique o que acontece se voce NAO digitar uma virgula!!! */ } Usando Caracteres em Scanf() que Serão Descartados
#include <stdio.h> main(void) { char nome[40]; scanf("%s", nome); /* Experimente digitar só um nome e mais de um nome */ printf("%s", nome); } Lendo String de Caracteres
Formatando a Entrada de Scanf()
● Os itens de dados de entrada devem ser separados por
espaços, tabulações ou novas linhas.
● Pontuações como vírgula, pontoevírgula e semelhantes não
contam como operadores.
● Isso significa que scanf(“%d%d”, &r, &c); aceitará uma entrada
dos números 10 20, mas falhará com 10,20.
● Como na função printf( ), os códigos de formato da função
scanf( ) devem ser correspondidos na ordem com as variáveis que estão recebendo a entrada na lista de argumento.
Formatando a Entrada de Scanf()
● Um * colocado depois do % e antes do código de formato lerá
um dado de um tipo especificado, mas suprimirá a sua atribuição.
● Assim, scanf(“%d%*c%d”, &x, &y); dandose a entrada 10/20,
colocará o valor 10 em x descartando o sinal de divisão, e dará a y o valor 20.
● Ainda que espaços, tabulações e novas linhas sejam usados
como separadores de campos, quando da leitura de um único caractere, esses últimos são lidos como qualquer outro caractere.
● Por exemplo, com uma entrada de “x y”; scanf(“%c%c%c”, &a,
&b, &c); retornará com o caractere “x” em a, um espaço em b e o caractere “y” em c.
#include <stdio.h> main(void) { char str[40]; /* Experimente digitar o alfabeto inteiro para ver o que acontece */ scanf("%20s", str); printf("%s",str); } Determinando o Número Máximo de Caracteres a ser Lido
Determinando o Número Máximo de Caracteres a ser Lido ● Se o apontador de entrada é maior do que 20 caracteres, uma chamada subseqüente para entrada começará onde ela pára. ● Por exemplo, se for digitado ABCDEFGHIJKLMNOPQRSTUVWXYZ em resposta à chamada scanf( ), nesse exemplo, somente os 20 primeiros caracteres, até o “T”, serão colocados em str por causa do especificador de tamanho máximo.
Determinando o Número Máximo de Caracteres a ser Lido ● Isso significa que os caracteres restantes “UVWXYZ” não são usados. Se uma outra chamada à função scanf( ) é feita, tal como scanf(“%s”, str); então “UVWXYZ” é colocado em str. ● A entrada para o campo pode ser terminada, antes que o campo de comprimento máximo seja alcançado, se um caractere de espaço em branco é encontrado. ● Nesse caso, a função scanf( ) movese para o próximo
Lendo Somente Caracteres PréDeterminados ● A função scanf( ) inclui também uma característica muito poderosa chamada scanset. ● Um scanset define uma lista de caracteres que serão correspondidos por scanf(). ● A função scanf( ) continuará a ler caracteres enquanto eles estiverem no scanset. ● Assim que um caractere entrado não corresponder a qualquer um do scanset, a função scanf( ) segue para o próximo especificador de formato (se existir).
Lendo Somente Caracteres PréDeterminados ● Um scanset é definido colocandose uma lista de caracteres que querse que seja examinada entre chaves. A chave inicial deve ser prefixada por um sinal de porcentagem. ● Por exemplo, este scanset diz à função scanf( ) para ler somente os dígitos de 0 a 9: %[1234567890]. ● O argumento correspondente a scanset deve ser uma variável string. ● Após retornar de função scanf( ), a variável conterá uma
#include <stdio.h> #include <conio.h> main() { char s1[80], s2[80]; /* Podese testar esse programa usando a entrada “123456789abcdefg987654” seguida por um retorno de carro. O programa exibirá, então: 123456789| |abcdefg987654. Uma vez que “a” não faz parte do scanset, a função scanf( ) pára de ler os caracteres em s1 quando ele é encontrado e os caracteres restantes são colocados em s2. */ scanf ("%[1234567890]%s", s1, s2); printf ("\n%s| |%s", s1, s2); getch(); } Lendo Somente Caracteres PréDeterminados
Lendo Somente Caracteres PréDeterminados ● Você pode especificar um intervalo dentro de um scanset usando um hífen. ● Por exemplo, isto diz à função scanf( ) para aceitar os caracteres de A a Z: %[AZ] ● Podese especificar mais de um intervalo dentro de um scanset.
#include <stdio.h> #include <conio.h> main() { char str[80]; printf ("Informe digitos e letras: "); /* Podese especificar um conjunto invertido se o primeiro caractere é um ^. Quando está presente, o ^ instrui a função scanf( ) a aceitar quaisquer caracteres que não estão definidos no scanset. Um ponto importante a lembrar é que o scanset difere letras minúsculas de maiúsculas. Portanto, se quiser examinar tanto letras maiúsculas como minúsculas, deve especificálas individualmente. Experimente digitar um caractere especial no meio da string */ scanf ("%78[az09]", str); printf ("\n%s", str); getch(); } Lendo Somente Caracteres PréDeterminados
Exercícios
(Lista 1, Ex 1)
Escrever um algoritmo que leia a matricula de um
funcionário, o número de horas trabalhadas no
mês, o valor que recebe por hora e calcule o seu
salário mensal.
Obs.:
Matrícula: tipo long int
Numero de horas: int
Valor por hora: float
Exercícios
(Lista 1, Ex 2)
Escrever um algoritmo que leia 3 valores (a, b e c) e calcule:
a) A área do triângulo que tem a por base e b por altura
b) A área do círculo de raio c
c) A área do trapézio que tem a e b por base e c por altura
d) A área do quadrado de lado b
Após calcular, deverá escrever os valores calculados. Obs.: todos os valores do tipo double
REFERÊNCIAS
●
http://www.dee.feis.unesp.br/graduacao/discipli