A maior rede de estudos do Brasil

Grátis
Estruturas_de_Dados_e_Algoritmos_em_C.erivanildo- Blog - conhecimentovaleouro.blogspot.com by @viniciusf666

Pré-visualização | Página 15 de 50

todos os outros caracteres */
 scanf ("%*c"); /* descartar o carácter fim de linha */
 } while (T == 0); 
 /* repetir enquanto um valor numérico não tiver sido lido */
 ... 
} 
PROGRAMAÇÃO ESTRUTURAS DE DADOS E ALGORITMOS EM C 40 
 
Figura 1.65 - Exemplo da utilização do especificador de conversão %n. 
1.8.2 A função printf 
Na linguagem C, a saída de dados é implementada pela função printf cuja sintaxe se 
apresenta na Figura 1.66. A função printf escreve sucessivamente sequências de caracteres 
no fluxo de texto de saída (stdout), representativas de texto e dos valores das expressões que 
formam a lista de expressões, segundo as regras impostas pelo formato de escrita. 
 
O texto é especificado no formato de escrita pela introdução de literais, que são copiados 
sem modificação para o fluxo de texto de saída. O modo como o valor das expressões é 
convertido, é descrito pelos especificadores de conversão. Deve, por isso, existir uma 
relação de um para um entre cada especificador de conversão e cada expressão da lista de 
expressões. Se o número de expressões for insuficiente, o resultado da operação não está 
definido. Se, ao contrário, esse número for demasiado grande, as expressões em excesso 
são ignoradas. 
 
O tipo da expressão e o especificador de conversão devem ser compatíveis, já que a 
finalidade deste último é indicar, em cada caso, o formato da sequência convertida. Quando 
o especificador de conversão não é válido, o resultado da operação não está definido. 
 
O processo de escrita só termina quando o formato de escrita se esgota, ou ocorreu um 
erro. A função devolve o número de caracteres escritos no fluxo de texto de saída, ou o 
valor -1, se ocorreu um erro. 
 
Como o formato de escrita pode conter literais que são directamente copiados sem 
modificação para o fluxo de texto de saída, a instrução printf é muito geral, podendo ser 
tornada semanticamente equivalente à instrução write de Pascal, quando o formato de 
escrita não contém o carácter '\n', ou à instrução writeln, quando este é precisamente o 
último carácter presente. De um modo geral, a inclusão de literais no formato de escrita 
possibilita melhorar a compreensão dos dados impressos e organizar a sua apresentação de 
um modo mais regular. A impressão do carácter %, que não é um literal, é obtida através 
do especificador de conversão %%. 
 
A largura mínima de campo indica o número mínimo de caracteres usados na 
representação do valor da expressão. Quando a expressão pode ser representada com 
menos caracteres, são introduzidos espaços ou zeros até perfazer o número indicado. 
Quando a largura mínima de campo é insuficiente, o campo é alargado para conter o valor 
convertido. 
 
 
 int NUM, /* valor a ser lido */
 N; /* contador de caracteres lidos */
 ... 
 N = 0; /* inicialização do contador de caracteres lidos */
 scanf ("Numero = %*d%n%d", &N, &NUM); 
 /* leitura do valor e utilização do contador */
41 CAPÍTULO 1 : INTRODUÇÃO AO C 
 
 
 
Figura 1.66 - Definição formal da função printf. 
int printf ( formato de escrita , lista de expressões ) 
 
 formato de escrita ::= "cadeia de caracteres de definição" 
 cadeia de caracteres de definição ::= especificador de conversão | literal | 
 cadeia de caracteres de definição especificador de conversão | 
 cadeia de caracteres de definição literal 
 
 especificador de conversão ::= %carácter de conversão | 
 %modificador de conversão carácter de conversão 
 
 carácter de conversão ::= i ɒ d ɒ escreve uma quantidade inteira decimal (signed) 
 u ɒ escreve uma quantidade inteira em decimal (unsigned) 
 o ɒ escreve uma quantidade inteira em octal (unsigned) 
 x ɒ escreve uma quantidade inteira em hexadecimal (unsigned) 
 f ɒ escreve uma quantidade real em notação PI.PF 
 eɒ E ɒ escreve uma quantidade real em notação científica. O 
carácter indicador de expoente é e ou E conforme se usa o carácter de conversão e ou E
 gɒ G ɒ escreve uma quantidade real no formato f ou e dependente 
do valor. O carácter indicador de expoente é e ou E conforme se usa o carácter de 
conversão g ou G 
 c ɒ escreve um caracter 
 s ɒ escreve uma cadeia de caracteres 
 p ɒ escreve o valor de um ponteiro para void 
 
 modificador de conversão ::= modificador de formato | especificador de precisão | 
 especificador de dimensão | 
 modificador de formato especificador de precisão | 
 modificador de formato especificador de dimensão | 
 especificador de precisão especificador de dimensão | 
 modificador de formato especificador de precisão especificador de dimensão
 
 modificador de formato ::= modificador de aspecto | largura mínima de campo | 
 modificador de aspecto largura mínima de campo 
 
 modificador de aspecto ::= qualquer combinação de espaço, î, +, #, 0 
 
 largura mínima de campo ::= valor decimal positivo que indica o número mínimo de 
caracteres a serem escritos 
 
 especificador de precisão ::= . | . valor decimal positivo 
 
 especificador de dimensão ::= h ɒ com i, d, u, o, x, indica tipo short 
 l ɒ com i, d, u, o, x, indica tipo long 
 L ɒ com f, e, g, indica tipo long double 
 
 literal ::= carácter diferente de % | literal carácter diferente de % 
 
 lista de expressões ::= expressão de tipo aritmético | expressão de tipo ponteiro para void | 
 lista de expressões , expressão de tipo aritmético | 
 lista de expressões , expressão de tipo ponteiro para void 
PROGRAMAÇÃO ESTRUTURAS DE DADOS E ALGORITMOS EM C 42 
O papel do modificador de aspecto é controlar a apresentação dos valores convertidos. 
Assim, tem-se que: 
x O carácter –, significa justificação da sequência convertida à esquerda no campo. Por 
defeito, ela é justificada à direita. 
x O carácter 0, significa que quando for necessário introduzir caracteres extra para 
perfazer a largura mínima de campo na representação de valores numéricos, são 
introduzidos zeros, em vez de espaços, para uma justificação à direita. 
x O carácter +, significa que todos os valores numéricos passam a ter sinal, os positivos, o 
sinal + e os negativos, o sinal –. Por defeito, só os valores negativos são representados com 
sinal. 
x O carácter espaço, significa que os valores numéricos positivos passam a ser 
representados com um espaço na posição do sinal. Por defeito, só os valores negativos são 
representados com sinal. 
x O carácter #, significa que os valores numéricos no sistema hexadecimal ou octal são 
representados precedidos de '0x' ou '0', respectivamente. Os valores numéricos reais são 
representados com o separador ., mesmo que não haja parte fraccionária. Além disso, 
quando for usado o carácter de conversão g, os zeros à direita na parte fraccionária são 
representados. 
 
O papel do especificador de precisão está associado de alguma forma com a precisão com 
que os valores convertidos são expressos. Assim, tem-se que: 
x Para valores inteiros, indica o número mínimo de algarismos usados na representação 
do valor. Se surgir apenas o carácter ., significa um número zero de algarismos. 
x Para valores reais: 
x Com os caracteres de conversão e ou f indica o número de algarismos usados na 
representação da parte fraccionária. Se surgir apenas o carácter ., significa um 
número zero de algarismos. Quando não está presente, esse número é de 6. 
x Com o carácter de conversão g indica o número máximo de algarismos 
significativos. Se surgir apenas o carácter ., significa um número zero de algarismos. 
x Quando o valor não puder ser expresso no número de algarismos indicado pelo 
especificador de precisão, então o valor será arredondado. 
x Para valores de tipo cadeia de caracteres, indica o número máximo de caracteres a 
imprimir. 
 
É preciso ter em atenção que não existe uma total simetria nos