Sie sind auf Seite 1von 12

scanf()

A funo scanf opera, de forma similar printf, sobre um fluxo de caracteres, mas agora
trata-se de um fluxo de entrada. Os caracteres obtidos na entrada (em geral a scanf
opera sobre um fluxo de caracteres oriundo do teclado) devem ser tratados (ou
convertidos e atribuidos aos demais argumentos) de acordo com os caracteres do
primeiro argumento. No caso da printf os argumentos so expresses e estamos
interessados noright-value, mas no caso da scanf estamos interessados em atribuir os
valores obtidos do fluxo de entrada para variveis e a especificao e implementao da
scanf() espera que sejam fornecidos como parmetros o endereo das variveis onde
devem ser armazenados os valores obtidos no fluxo de entrada (devemos usar leftvalues). Este assunto est relacionado com ponteiros e ser detalhado em outra parte
da disciplina. A forma mais simples de especificar que queremos atribuir um certo valor
varivel X usar a expresso &X (E comercial X, ou no jargo da linguagem C:
endereo de X):
Um erro muito comum de programadores que usam a funo scanf esquecer de utilizar
o caractere E comercial (&) antes do nome da varivel que deve receber o valor
convertido a partir dos caracteres do fluxo de entrada!
O programa acima usa a funo scanf para obter um valor para a varivel i a partir dos
caracteres do teclado. Quando o programa acima executado invocada a funo scanf
(que fica aguardando os caracteres no fluxo de entrada , no caso o teclado). O programa
acima aguarda uma ao do usurio sem avis-lo... este tipo de programa no
considerado adequado e a boa disciplina de programao prescreve que os
desenvolvedores de programas devem planejar a interao do programa com o
usurio (em nossa disciplina vamos considerar que o usurio sempre o
prprio programador o que pode desculpar muitas coisas indevidas). O tema
interao tratado em outras disciplinas e aqui faremos uso da intuio, por
enquanto deve ser explicitado apenas que este no um tema simples e que existem
muitas diretrizes sobre como tratar a interao do programa com o usurio. Um
programa mais adequado aquele onde o desenvolvedor (programador) informa ao
usurio o que esperado dele:
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[]){
int i;
printf(Entre com um valor do tipo int na base 10:);
scanf("%i", &i);
printf("%i\n", i);
system("PAUSE");
return 0;
}

A funo scanf l uma ou mais linhas para obter caracteres a serem usados nas
converses. Um possvel problema para entender o funcionamento da funo scanf()

um certo tratamento desigual para as diferentes converses. Quando especificado no


primeiro parmetro uma converso do tipo %d a funo scanf() ir ignorar diversos
caracteres para poder encontrar uma sequncia de caracteres entre 0 e 9; mas com
relao a converso %c a funo scanf() no ignora nenhum caractere (nem mesmo o
caractere correspondente ao momento em que o usurio teclou enter (sim existe um
caractere denotando enter)!!! A funo scanf retorna ao ponto de chamada somente
aps ter processado toda a especificao de converso dada pelo primeiro argumento. O
caractere de mudana de linha tratado como caractere em branco exceto na converso
%c. Podemos combinar os programas acima em um programa onde duas variveis so
definidas, usada a funo scanf para obter valores para serem usados em atribuies e
a funo printf exibe os valores lidos:
Observe no programa acima o uso do modificador L junto com a especificao de
converso %e (%Le). Sem este modificador a funo scanf trata o parmetro como
sendo float (e, f e g correspondem a float!)
O programa abaixo usa as caractersticas de anlise da entrada da funo scanf para
elaborar um programa onde o usurio pode especificar de forma interativa dois
operandos e uma de quatro operaes. Observe que tanto a printf quanto a scanf so
funes que retornam um valor do tipo int. O valor retornado se relaciona ao nmero de
converses feitas. No caso da scanf ela retorna a constante EOF quando no consegue
fazer todas as converses especificadas.
A funo scanf l os caracteres da entrada e coloca na rea de memria correspondente
a ac at encontrar (i) um espao ou (ii) caractere de tabulao ou (iii) caracteres de
delimitao de linha ou (iv) indicao de fim de arquivo.

Recebendo caracteres em C
atravs da funo getchar()
A funo scanf() bem poderosa e flexvel.
Com ela, podemos pegar uma infinidade de dados do usurio, e inclusive
escolher o que vai ser 'capturado', limitar o tanto de coisas que pode ser
escrito, e uma srie de outras funcionalidades na linguagem C.
Porm, h mais opes que facilitam nossa vida.
Existe uma funo que faz o mesmo papel da scanf e voltada para o uso
com caracteres, a getchar().
Ela mais simples, pois no precisar usar %c ou &, como fazemos na
scanf(), e foi feito especialmente para ser usado com caracteres.
get -> pegar
char -> caractere

Para usar, fazemos:


seu_caractere = getchar();
Veja como seu uso em um cdigo que pede um caractere para o usurio,
armazena no char 'letra', e em seguida exibe esse mesmo caractere.
#include <stdio.h>
int main()
{
char letra;
printf("Insira um caractere: ");
letra = getchar();
printf("Voc digitou: '%c'", letra);
}

Tendo um maior controle sobre o tamanho dos inteiros - short


e long
Vamos apresentar agora dois modificadores do tipo inteiro em C: short e
long, ele alteram o tamanho de bytes do inteiro.
A diferena entre os inteiros e modificadores est na faixa de valores
armazenadas.
Um inteiro de 1 byte (char) armazena do nmero -128 a +127
Um inteiro de 2 bytes armazena do nmero -32 768 a +32 767
Um inteiro de 4 bytes armazena do nmero -2 147 483 648 a +2 147 483
647
Um inteiro de 8 bytes armazena do nmero -9 223 372 036 854 775 808 a
+9 223 372 036 854 775 807
'short' em ingls, significa curto e 'long', longo.
Colocando uma dessas palavras antes da 'int', voc definir um tamanho e
uma faixa de valores para suas variveis.
Por exemplo, se criar a varivel inteira 'numero' como short, dever fazer:
short int numero;
De modo anlogo para uma varivel com o modificador 'long':

long int numero;


Para saber o tamanho de bytes de seu sistema, use novamente a funo
sizeof:
#include <stdio.h>
int main()
{
printf("int : %d bytes\n", sizeof( int ) );
printf("short int: %d bytes\n", sizeof( short ) );
printf("long int: %d bytes\n", sizeof( long ) );
}
Controlando a faixa de valores dos inteiros atravs do sinal: signed e
unsigned
Todos ns sabemos que os nmeros, como os inteiros, podem assumir tanto
valores negativos como positivos.
Porm, muitas vezes, valores negativos (ou positivos) podem ser inteis,
chegando at a atrapalhar em termos de computao.
Por exemplo, o tamanho de memria sempre positivo, no existe um
bloco de -2 bytes em sua mquina.
Ento, para declarar que um nmero seja apenas positivo (incluindo o 0),
usamos o modificador unsigned:
unsigned int teste;
Analogamente para especificar que o inteiro possui valores positivos e
negativos:
signed int teste;
Em C, por padro, ao declararmos uma varivel do tipo int, ele ser
automaticamente do tipo signed.
Portanto, a declarao passada intil, serve apenas para fins didticos.
Caso queiramos apenas nmeros positivos, a faixa de valores negativos que
apresentamos intil e podemos desconsiderar ela, aumentando a faixa de
valores positivos.

Ento, ao declararmos inteiros com o modificador unsigned, as faixas de


valores passam a ser:
Um inteiro de 1 byte (char) armazena do nmero 0 a +255
Um inteiro de 2 bytes armazena do nmero 0 a +65 535
Um inteiro de 4 bytes armazena do nmero 0 a +4 294 967 295
Um inteiro de 8 bytes armazena do nmero 0 a +18 446 744 073 709 551
615

Quando usar short, long, signed e unsigned


O curso C Progressivo visa ensinar o bsico, ento, no ser necessrio
usarmos esses modificadores ao longo de nossa apostila online.
No futuro, quando voc for um programador profissional, ser um timo e
diferenciado costume usar esses modificadores.
Quando usar o short int em C
Voc dever usar o short quando quiser armazenar, sempre, valores
pequenos.
Por exemplo, suponha que voc v fazer um banco de dados para o
Governo Federal, onde ter que criar milhes de cadastros.
Para armazenar idades, usar short int. Ora, valores inteiros de idades so
pequenos e raramente passam do 100.
Ento no desperdice memria toa, use short!

Quando usar o long int em C


O long bastante usado para clculos de cunho acadmico, como cientfico
e estatstico.
comum tambm usarmos o long int para armazenar nmeros como RG e
CPF, que so compostos de vrios dgitos.

Quando usar unsigned int em C


Voc pode usar o unsigned para se certificar que essa varivel inteira nunca
ir receber um valor negativo, como para armazenar dados de memria,
idade, o life de um jogo etc.

A biblioteca math.h
Por: Eduardo Casavella
Fornece um conjunto de funes para operaes matemticas, tais como
funes trigonomtricas, hiperblicas, logaritmos, potncia e
arredondamentos.
Todas as funes da biblioteca math.h retornam um valor do tipo double.
Na tabela abaixo apresentamos algumas funes presentes na biblioteca
math.h
Funo
floor( )
ceil( )
sqrt( )
pow(varivel, expoente)
sin( )
cos( )
tan( )
log( )
log10( )

Descrio do comando
arredonda para baixo
arredonda para cima
Calcula raiz quadrada
potenciao
seno
cosseno
Tangente
logaritmo natural
logaritmo base 10

No programa abaixo, temos um resumo das funes mais utilizadas e os


comentrios.
Exemplo de utilizao da biblioteca math.h
1 #include <stdio.h>
2 #include <conio.h>
3 #include <math.h>
4
5 int main (void)
6 {
7 double x = 9.75;
8
9 double arredonda_pbaixo = 0.0;
1 double arredonda_pcima = 0.0;
0 double raiz_quadrada = 0.0;
11 double potencia = 0;
1
2 double seno = 0;
1 double cosseno = 0;
3 double tangente = 0;
1
4 double logaritmo_natural = 0;
1 double logaritmo_xbase10 = 0;
5
1 printf("\n********* Utilizando a biblioteca math.h
6 ***********\n\n");
1
7 printf("\nFuncoes de arredondamento\n\n");
1 printf("Valor original de x = %f\n",x);
8
1 arredonda_pbaixo = floor(x);
9 printf("Valor aproximado para baixo %f \n", arredonda_pbaixo );
2
0 arredonda_pcima = ceil(x);
2 printf("Valor aproximado para cima %f \n", arredonda_pcima);
1
2 printf("\n----------------------------------------------------\n\n");
2
2 printf("\nFuncoes de raiz e potenciacao \n\n");
3 printf("Valor original de x = %lf\n",x);
2 raiz_quadrada = sqrt(x);
4 printf("Valor da raiz quadrada %f \n",raiz_quadrada);

2
5
2
6
2
7
2
8
2
9
3
0
3
1
3
2
3
3
3
4
3
5
3
6
3
7
3
8
3
9
4
0
4
1
4
2
4
3
4
4
4
5
4

x = ceil(x); //arredondando o x para cima, x passa a valer 10


potencia = pow(x,2); //elevando o valor de x ao quadrado
printf("Valor de %.2lf ao quadrado %.2f \n",x,potencia);
printf("\n----------------------------------------------------\n\n");
printf("\nFuncoes trigonometricas\n\n");
x = 0; //atribuindo zero em x para fazer os clculos trigonomtricos
seno = sin(x);
printf("Valor de seno de %.2f = %.2f \n",x,seno);
cosseno = cos(x);
printf("Valor de cosseno de %.2f = %.2f \n",x,cosseno);
tangente = tan(x);
printf("Valor de tangente de %.2f = %.2f \n\n",x,tangente);
printf("\n----------------------------------------------------\n\n");
printf("\nFuncoes logaritmicas\n\n");
x = 2.718282;
logaritmo_natural = log(x);
printf("Logaritmo natural de x %.2f = %.2f \n",x,logaritmo_natural);
x = 10;
logaritmo_xbase10 = log10(x);
printf("Logaritmo de x na base 10 %.2f = %.2f
\n",x,logaritmo_xbase10);
printf("\n----------------------------------------------------\n\n");
getch();
return(0);
}

6
4
7
4
8
4
9
5
0
5
1
5
2
5
3
5
4
5
5
5
6
5
7
5
8
5
9
6
0
6
1
6
2
6
3
6
4
6
5
6
6
6
7

6
8
6
9
7
0
7
1
7
2
7
3
7
4

Tela de execuo

Tela de execuo da biblioteca math.h

Referencias
http://homepages.dcc.ufmg.br/~rodolfo/aedsi-210/printf_scanf/printfscanf.html
www.cprogressivo.net/2012/12/Recebendo-letras-do-usuario--As-funcoesscanf-getchar-getc-e-fgetc.html
http://www.cprogressivo.net/2013/01/Modificadores-do-tipo-inteiro-int-emC--short-long-signed-unsigned.html
linguagemc.com.br/a-biblioteca-math-h

Das könnte Ihnen auch gefallen