(Parte 6 de 10)

scanf(“%s”, nome);

Nesse caso, nome já em um endereço e não precisa ser precedido pelo operador &.

Os itens de dados de entrada devem ser separados por espaços, tabulações ou novas linhas. Pontuações como vírgula, ponto-e-ví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.

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); dando-se a entrada 10/20, colocará o valor 10 em x descartando o sinal de divisão, e dará a y o valor 20.

Os comandos de formato podem especificar um campo modificador de comprimento máximo. Esse modificador é um número inteiro colocado entre o sinal % e o código de comando de formato, que limita o número de caracteres lidos para qualquer campo. Por exemplo, para ler não mais que 20 caracteres em str, você pode escrever:

scanf(“%20s”, str);

Se o apontador de entrada é maior do que 20 caracteres, uma chamada subseqüentes para entrada começará onde ela pára. Por exemplo, se você digitar 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. 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( ) move-se para o próximo campo.

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.

Você não pode usar a função scanf( ) para exibir uma mensagem ao usuário. Portanto, todas as mensagens devem ser feitas explicitamente antes da chamada à função scanf( ).

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). Um scanset é definido colocando-se uma lista de caracteres que você quer 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:

O argumento correspondente a scanset deve ser uma variável string.

Após retornar de função scanf( ), a variável conterá uma string terminada com um nulo com os caracteres lidos. Para ver como isso funciona, considere este programa:

#include <stdio.h> void main(){ char s1[80], s2[80]; scanf (“%[1234567890]%s”, s1, s2); printf (“\n%s| |%s”, s1, s2); }

Experimente 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.

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:

Você pode especificar mais de um intervalo dentro de um scanset. Por exemplo, este programa lê dígitos e letras. Ele também ilustra que você pode usar o especificador de campo máximo como um scanset.

#include <stdio.h> void main(){ char str[80]; printf (“Informe dígitos e letras: ”); scanf (“%78[a-z0-9]”, str); printf (“\n%s, str); }

Você pode 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 você quiser examinar tanto letras maiúsculas como minúsculas, deve especificá-las individualmente.

3.4 A DECLARAÇÃO if

A forma geral da declaração if é if (condição){ comandos; } else{ comandos; }

A cláusula else é opcional. Se condição for verdadeira (qualquer coisa diferente de 0), o bloco que forma o destino de if será executado; caso contrário o bloco que forma o destino de else será executado (desde que exista else).

Lembre-se que somente o código associado a if ou o código associado a else será executado, nunca os dois. Tenha em mente também que o destino dos dois, if e else, pode ser um comando simples ou um bloco de comandos.

Para demonstrar o comando if vamos escrever um programa simples que converte bases numéricas. Este programa será capaz de apresentar as seguintes conversões:

· Decimal para Hexadecimal; • Hexadecimal para Decimal.

O programa permitirá que primeiro seja selecionado o tipo de conversão a partir de um menu e, então, solicitará o número a ser convertido.

decimal---> hexadecimal
hexadecimal ---> decimal

/* Programa de conversão de base numérica */ #include <stdio.h> void main(){ int opcao; int valor; printf (“Converter: \n”); printf (“1: decimal para hexadecimal\n”); printf (“2: hexadecimal para decimal\n”); printf (“\nInforme sua opção: ”); scanf (“%d”, &opcao);

printf (“\nInforme o valor em decimal: ”);
scanf (“%d”, &valor);
printf (“%d em hexadecimal e: %x”, valor, valor);

if (opcao == 1){ }

printf (“\nInforme o valor em hexadecimal: ”);
scanf (“%x”, &valor);
printf (“%x em decimal e: %d”, valor, valor);

if (opcao == 2){ }

3.4.1 USANDO A DECLARAÇÃO else

É possível associar um else com qualquer if. Se a expressão condicional associada a if é verdadeira, a instrução ou bloco de instruções associada será executada. Se for falsa, então a instrução ou bloco de instruções do else será executada. O programa seguinte demonstra este princípio fundamental.

/* Um exemplo de if-else */ #include <stdio.h> void main(){ int i; printf (“Informe um número: ”); scanf (“%d”, &i); if (i < 0) printf (“O número é negativo”); else printf (“O número é positivo ou nulo”); }

3.4.2 O ENCADEAMENTO if-else-if

Uma construção comum em programação é o encadeamento if-else-if. O seguinte exemplo ilustra esta construção:

if (condição){ comandos; } else if (condição){ comandos; } else if (condição){ comandos; } else{ comandos; }

As expressões condicionais serão avaliadas de cima para baixo. Assim que uma condição verdadeira é encontrada, o bloco associado a ela será executado, e o resto do encadeamento é ignorado. Se nenhuma das condições for verdadeira, então o else final será executado.

Se o else final não estiver presente e todas as outras condições forem falsas, então nenhuma ação será realizada.

Pode-se usar o encadeamento if-else-if para implementar o programa de conversão de base numérica desenvolvido anteriormente. Na versão original, cada declaração if era avaliada sucessivamente, mesmo se uma das declarações anteriores tivesse êxito. Ainda que não haja grande significado neste caso, a avaliação redundante de todos os ifs não é muito eficiente ou elegante. O seguinte programa resolve este problema. Nessa versão de encadeamento if-else-if, tão logo uma declaração if é satisfeita, o resto das declarações é ignorado.

decimal---> hexadecimal
hexadecimal ---> decimal

void main(){ int opcao; int valor; printf (“Converter: \n”); printf (“1: decimal para hexadecimal\n”); printf (“2: hexadecimal para decimal\n”); printf (“\nInforme sua opção: ”); scanf (“%d”, &opcao);

printf (“\nInforme o valor em decimal: ”);
scanf (“%d”, &valor);
printf (“%d em hexadecimal e: %x”, valor, valor);

if (opcao == 1){ }

scanf (“%x”, &valor);
printf (“%x em decimal e: %d”, valor, valor);
printf (“\nA opção escolhida é inválida.”)

else if (opcao == 2){ printf (“\nInforme o valor em hexadecimal: ”); } else { }

3.4.3 A EXPRESSÃO CONDICIONAL

Algumas vezes, iniciantes na linguagem C confundem-se pelo fato de que qualquer expressão válida na linguagem C pode ser usada para controla a declaração if. Isto é, o tipo de expressão não precisa se restringir àquelas envolvendo operadores relacionais e lógicos. Só é requerido que a expressão resulte em um valor zero ou não zero. Por exemplo, este programa lê dois inteiros do teclado e mostra o quociente. Para evitar um erro de divisão por zero, uma declaração if é usada para controlar o segundo número.

/* Divide o primeiro número pelo segundo*/ #include <stdio.h> void main(){ int a, b; printf (“Informe dois números: ”); scanf (“%d%d”, &a, &b); if (b) printf (“%d\n”, a/b); else printf (“Não posso dividir por zero\n”); }

Essa abordagem funciona porque, se b for zero, a condição controlando o if é falsa e a instrução else é executada. Caso contrário, a expressão é verdadeira (não zero) e a divisão é realizada. Não é necessário escrever uma declaração if como esta if (b != 0) printf (“%d\n”, a/b); porque é redundante.

3.4.4 ifs ANINHADOS

(Parte 6 de 10)

Comentários