Programar em C
185 pág.

Programar em C


DisciplinaLinguagem de Programação Estruturada128 materiais1.055 seguidores
Pré-visualização40 páginas
\u2014 que especifica a largura
\u2014 ou um asterisco, que diz que a largura será especificada pelo próximo argumento (ou seja, o argumento anterior
ao valor a ser impresso). Neste exemplo, o campo terá largura igual ao valor de num e o valor impresso será 300:
printf ("%*d", num, 300);
O campo é impresso de acordo com as seguintes regras:
\u2022\u2022 Se o valor for mais largo que o campo, este será expandido para poder conter o valor. O valor nunca será cortado.
\u2022 Se o valor for menor que o campo, a largura do campo será preenchida com espaços ou zeros. Os zeros são
especificados pela opção 0, que precede a largura.
\u2022 O alinhamento padrão é à direita. Para se alinhar um número à esquerda usa-se a opção - (hífen ou sinal de
menos) antes da largura do campo.
Por exemplo, compare as três maneiras de exibir o número 15:
printf ("%5d", 15); // exibe " 15"
printf ("%05d", 15); // exibe "00015"
printf ("%-5d", 15); // exibe "15 "
E alguns outros exemplos:
printf ("%-10s", "José"); // exibe "José "
printf ("%10s", "José"); // exibe " José"
printf ("%4s", "José"); // exibe "José"
Precisão
A precisão pode ter quatro significados diferentes:
\u2022 Se a conversão solicitada for inteira (d, i, o, u, x, X): o número mínimo de dígitos a exibir (será preenchido com
zeros se necessário).
\u2022 Se a conversão for real (a, A, e, E, f, F): o número de casas decimais a exibir. O valor será arredondado se a
precisão especificada no formato for menor que a do argumento.
\u2022 Se a conversão for em notação científica (g, G): o número de algarismos significativos. O valor será arredondado
se o número de algarismos significativos pedido for maior que o do argumento.
\u2022 Se a conversão for de uma sequência de caracteres (s): o número máximo de caracteres a exibir.
Entrada e saída simples 24
Assim como a largura do campo, a precisão pode ser especificada diretamente por um número ou com um asterisco,
mas deve ser precedida por um ponto.
Alguns exemplos:
printf ("%.5d", 314); // exibe "00314"
printf ("%.5f", 2.4); // exibe "2.40000"
printf ("%.5g", 23456789012345); // exibe "2.3457e+13"
printf ("%.5s", "Bom dia"); // exibe "Bom d"
É claro que podemos combinar a largura com a precisão. Por exemplo, %10.4f indica um campo de número real de
comprimento total dez e com 4 casas decimais. Note que, na largura do campo, o valor inteiro é levado em conta,
inclusive o ponto decimal, e não apenas a parte inteira. Por exemplo, essa formatação aplicada ao número 3.45 irá
resultar nisto:
" 3.4500"
Tamanho da variável
É importante ressaltar que quando são usados modificadores de tamanho de tipos, a maneira como os dados são
armazenados pode tornar-se diferente. Assim, devemos informar à função printf() precisamente qual o tipo da
variável cujo valor desejamos exibir. A função printf() admite cinco principais modificadores de tamanho de
variável:
\u2022 hh: indica que a conversão inteira corresponde a uma variável char. Por exemplo, poderíamos usar o formato
%hhd para exibir uma variável do tipo char na base decimal.
\u2022 h: indica que a conversão inteira corresponde a uma variável short.
\u2022 l: indica que a conversão inteira corresponde a uma variável long.
\u2022 ll: indica que a conversão inteira corresponde a uma variável long long.
\u2022 L: indica que a conversão de número real corresponde a uma variável long double.
Quando o tipo da variável não tem modificadores de tamanho (long ou short), não se usa nenhum modificador
de tamanho da variável na função printf().
Sequências de escape
Sequências de escape são combinações de caracteres que têm significado especial, e são sempre iniciadas por uma
barra invertida (\). Você pode usá-las em qualquer literal de caractere ou string. Por exemplo, a string "linha
1\nlinha 2" equivale a:
linha 1
linha 2
pois a sequência \n indica uma quebra de linha. Como foi citado anteriormente, a função printf(),
diferentemente de puts(), não imprime automaticamente uma quebra de linha no final da string. O código abaixo,
por exemplo:
printf("string 1");
printf("string 2");
Imprimiria isto:
string 1string 2
Isso pode ser útil, pois às vezes é desejável permanecer na mesma linha.
A seguir apresentamos a tabela com as sequências de escape suportadas pela linguagem C:
Entrada e saída simples 25
Sequência Significado
\n Quebra de linha (line feed ou LF)
\t Tabulação horizontal
\b Retrocede o cursor em um caractere (backspace)
\r Retorno de carro (carriage return ou CR): volta o cursor para o começo da linha sem mudar de linha
\a Emite um sinal sonoro
\f Alimentação de formulário (form feed ou FF)
\v Tabulação vertical (em impressoras)
\" Aspa dupla
\' Aspa simples
\\ Barra invertida
\0 Caractere nulo (caractere de valor zero, usado como terminador de strings)
\N O caractere cuja representação octal é N (dígitos de 0 a 7)
\xN O caractere cuja representação hexadecimal é N (dígitos de 0 a 9 e de A a F)
Representação octal e hexadecimal
Também é possível trocar uma sequência de escape pelo seu valor em octal ou hexadecimal. Você pode, por
exemplo, trocar o caractere "\n" pelo valor octal "\12" ou hexadecimal "\x0A". Vejamos mais alguns exemplos.
Hexadecimal Octal Caracter
 \x00 \00 \0
 \x0A \12 \n
 \x0D \15 \r
 \x07 \07 \a
 \x08 \10 \b
 \x0B \13 \v
scanf()
A função scanf() lê dados da entrada padrão (teclado) e os guarda em variáveis do programa. Assim como para
printf(), usamos uma string de formatação para especificar como serão lidos os dados. A sintaxe de scanf() é esta:
scanf ("string de formatação", &arg1, &arg2, ...);
Como você pode ver, a sintaxe é quase igual à de printf(), com exceção do E comercial (&). Você entenderá melhor
o seu uso nas seções seguintes, mas adiantamos que ele é um operador que retorna o endereço de uma variável. Isso
é necessário pois a função scanf() deve modificar as variáveis, e quando não usamos o operador de endereço,
passamos apenas o valor de uma variável para a função. Isso será explicado melhor no capítulo sobre ponteiros. O
fato de scanf receber endereços de variáveis (em vez de seus valores) também explica por que ele precisa ser
informado da diferença entre %f (float) e %lf (double) enquanto que o printf não precisa.
Um exemplo básico da utilização de scanf() é este:
int a;
scanf ("%d", &a);
Entrada e saída simples 26
O que este exemplo faz é declarar uma variável e aguardar o usuário digitar algo. Os dados só serão processados
quando o usuário apertar Enter. Depois disso, os caracteres digitados pelo usuário serão convertidos para um valor
inteiro e esse inteiro será guardado no endereço que corresponde à variável a. Se o valor digitado não puder ser
convertido (porque o usuário não digitou nenhum algarismo válido), a variável não será modificada.
Assim como na função printf(), podemos receber quantos valores quisermos, bastando usar vários especificadores de
conversão:
int a;
char b;
float c;
scanf ("%d %c %f", &a,&b,&c);
Dessa maneira, se o usuário digitar 120 z 17.63, teremos a igual a 120, b igual ao caractere 'z' e c igual ao
número 17,63. Se o usuário tentar digitar mais de um espaço entre os dados ou simplesmente nenhum espaço, ainda
assim o programa obterá os dados certos. Por exemplo, 120z17.63 também dará o mesmo resultado.
Agora uma questão um pouco mais difícil: vamos supor que especificamos um formato inteiro e o usuário digitou
um número real, como por exemplo 12.5. O que deverá acontecer?
#include <stdio.h>
int main ()
{
 int a;
 printf (&quot;Digite um número: &quot;);
 scanf (&quot;%d&quot;, &a);
 printf (&quot;\nO número digitado foi %d&quot;, a); 
 return (0);
}
Se você testar com o valor 12.5, vai ver que o programa retornará o número 12, pois a função scanf() apenas
interpreta