(Parte 7 de 10)

Um dos muitos aspectos que causam confusão na declaração if, em qualquer linguagem de programação, são os ifs aninhados. Um if aninhado é uma declaração if que é objeto de um if ou um else. Os ifs aninhados são incômodos por poderem dificultar saber qual else está associado a qual if. Considere este exemplo:

if (x) if (y) printf (“1”); else printf (“2”);

A qual if o else se refere? Felizmente, a linguagem C fornece uma regra muito simples para resolver essa questão. Em C, o else é ligado ao if mais próximo dentro do mesmo bloco de código que já não tenha uma declaração else associada a ele. Neste caso o else é associado à declaração if(y). Para fazer com que else seja associado à declaração if(x), deve-se usar chaves para sobrepor a sua associação normal, como mostrado aqui:

if (x){ if (y) printf (“1”); } else printf (“2”);

O else agora está associado ao if(x), já que ele não é parte do bloco de código do if(y).

Exercícios:

1) Escrever um trecho de código que receba duas variáveis inteiras e atribua a uma terceira variável o maior valor.

2) O mesmo problema, em forma de função, retornando o maior valor.

3) Fazer uma função que receba uma variável do tipo inteiro e retorne: 1, se o valor recebido for maior do que 0; 0, se o valor recebido for igual a zero; e -1, se o valor recebido for menor do que 0. Use o comando if.

4) Escreva um programa que lê um par de coordenadas (x,y) inteiras e imprime uma mensagem informando em qual quadrante está o ponto. O programa deve identificar se o ponto está sobre algum dos eixos.

5) Escrever uma função que recebe dois inteiros (a e b) e um código inteiro (cod) e retorne: a + b, se cod >= 0; e |a - b|, se cod < 0.

3.5 A DECLARAÇÃO switch

Ainda que o encadeamento if-else-if possa realizar testes de múltipla escolha, ele quase nunca é elegante. O código pode ser muito difícil de acompanhar e pode confundir até mesmo o seu autor. Por esse motivo, a linguagem C tem internamente uma declaração de decisão de múltipla escolha chamada de switch. Na declaração switch, a variável é sucessivamente testada contra uma lista de inteiros ou constantes caractere. Quando uma associação é encontrada, o conjunto de comandos associado com a constante é executado. As constantes não precisam sequer estar em qualquer ordem especial. A forma geral da declaração switch é:

commandos;
break;
commandos;
break;
commandos;
break;
commandos;

switch (variável){ case constante1: case constante2: case constante3: M default } onde a declaração default é executada se nenhuma correspondência for encontrada. O default é opcional e, se ele não estiver presente, nenhuma ação será realizada se todas as correspondências falharem. Quando uma correspondência é encontrada, os comandos associados a case são executados até que o break seja encontrado ou até que se encontre o final do switch. Há três coisas importantes a saber sobre a declaração switch:

1) Ele difere do if, já que o switch pode testar somente igualdades, enquanto a expressão condicional if pode ser de qualquer tipo; 2) Nunca duas constantes case no mesmo switch podem ter valores iguais. Obviamente, uma declaração switch dentro de outra declaração switch pode ter as mesmas constantes case; 3) Uma declaração switch é mais eficiente que um encadeamento if-else-if.

É possível especificar comandos no switch que serão executados caso nenhuma correspondência seja encontrada. Basta adicionar uma declaração default. A declaração default é uma boa maneira de direcionar qualquer final livre que possa ficar pendente na declaração switch. Por exemplo, no programa de conversão de base numérica, pode-se usar uma declaração default para informar ao usuário que uma resposta inválida foi dada e para tentar outra vez.

Usa-se freqüentemente o switch para desviar uma seleção de menu para a rotina apropriada. Seguindo essa linha, pode-se usá-la para fazer um melhoramento adicional ao programa de conversão de base numérica. A versão mostrada aqui elimina as séries anteriores de ifs e substitui-as por uma clara declaração switch.

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

/* Programa de conversão de base numérica – switch */ #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);

case 1:
printf (“%d em hexadecimal e: %x”, valor, valor);
break;
case 2:
printf (“\nInforme o valor em hexadecimal: ”);
scanf (“%x”, &valor);
printf (“%x em decimal e: %d”, valor, valor);
break;
default:
printf (“\nOpção inválida. Tente outra vez.”)

switch(opcao){ printf (“\nInforme o valor em decimal: ”); scanf (“%d”, &valor); }

3.5.1 A DECLARAÇÃO break

Ainda que as declarações break sejam geralmente necessárias dentro de um switch, sintaticamente são opcionais. Elas são usadas para terminar a seqüência de comandos associada a cada constante. Entretanto, se a declaração break é omitida, a execução continuará pela próxima declaração case até que um break ou o final do switch seja encontrado. Observe o programa a seguir.

/* Um programa simples com switch e break */ #include <stdio.h> void main(){ int t;

switch (t){
case 1:
printf (“Este”);
break;
case 2:
printf (“é”);
case 3:
printf (“momento para todos os homens bons\n”);
case 5:
case 6:
printf (“para”);
break;
case 7:
case 8:
case 9:
printf (“.”);

for (t = 0; t < 10; t++) printf (“o”); break; }

Quando executado, o resultado seguinte é produzido:

para para

Este é o momento para todos os homens bons o momento para todos os homens bons

Este programa também ilustra o fator de que se pode ter declarações case vazias. Isso é útil quanto muitas condições usam a mesma seqüência de comandos. A habilidade de os cases serem executados juntos quando nenhum break está presente permite que programas bastante eficientes sejam escritos, evitando-se as injustificáveis duplicações de código.

3.5.2 DECLARAÇÕES switch ANINHADAS

É possível ter um switch como parte da seqüência de declaração de um switch externo. Mesmo que as constantes case do switch interno e externo contenham valores comuns, nenhum conflito surgirá. Por exemplo, o seguinte fragmento de código é perfeitamente aceitável.

switch(x){ case 1: switch(y){

case 0:

31 printf (“erro de divisão por zero”);

case 1:
process (x, y);
break;

break; } case 2: M

Como outro exemplo, um programa de banco de dados bastante simples mostrado a seguir ilustra como se pode usar uma declaração switch aninhada. Este programa solicita ao usuário a região e a letra inicial do nome do vendedor e, então, mostra o demonstrativo de vendas do mesmo. Switchs aninhados são requeridos uma vez que muitos vendedores têm a mesma letra inicial. Note que uma nova função, toupper( ), é introduzida. Ela retorna a letra maiúscula correspondente do seu argumento caractere. Ela é usada neste programa para permitir que o usuário insira informações tanto em letra maiúscula como em letra minúscula. A função complementar de toupper( ) é tolower( ), que converte caracteres maiúsculos em minúsculos. Ambas as funções estão contidas na biblioteca ctype.h.

/* Um banco de dados simples de vendedores por região */ #include <stdio.h>

#include <ctype.h> void main(){ char regiao, vendedor; printf (“As regiões são: Leste, Oeste e Norte\n”); printf (“Informe a primeira letra da região: ”); regiao = getche(); regiao = toupper(regiao); //converte para maiúsculas printf (“\n”);

printf (“Vendedores são: Rafael, João e Maria \n”);
printf (“Informe a primeira letra do vendedor: ”);
printf (“\n”);
switch (vendedor){
case ‘R’:
case ‘J’:

switch (regiao){ case ‘L’: vendedor = toupper(getche()); printf (“Vendas: R$%d\n”, 10000); break; printf (“Vendas: R$%d\n”, 12000); break;

case ‘M’:
break;
case ‘O’:
printf (“Informe a primeira letra do vendedor: ”);
printf (“\n”);
switch (vendedor){
case ‘R’:
case ‘L’:
case ‘H’:
break;
case ‘N’:
printf (“Informe a primeira letra do vendedor: ”);
printf (“\n”);
switch (vendedor){
case ‘R’:
case ‘J’:
case ‘T’:
}
break;

} printf (“Vendedores são: Ronaldo, Lisa e Hilton\n”); vendedor = toupper(getche()); printf (“Vendas: R$%d\n”, 10000); break; printf (“Vendas: R$%d\n”, 9500); break; printf (“Vendas: R$%d\n”, 13000); } printf (“Vendedores são: Tomás, João e Raquel\n”); vendedor = toupper(getche()); printf (“Vendas: R$%d\n”, 5000); break; printf (“Vendas: R$%d\n”, 9000); break; printf (“Vendas: R$%d\n”, 14000); }

Para ver como o programa funciona , selecione a região Oeste, digitando

O. Isso indica que case ‘O’ é selecionado pela declaração switch externa. Para ver o total de vendas de Hilton, digite H. Isso faz com que o valor 13000 seja apresentado. Note que a declaração break em um switch aninhado não tem efeito no switch externo. Exercício:

1) Escreva um programa que pede para o usuário entrar um número correspondente a um dia da semana e que então apresente na tela o nome do dia. utilizando o comando switch.

3.6 LAÇOS DE REPETIÇÃO

Os laços de repetição permite que um conjunto de instruções seja repetido até que uma condição seja encontrada. A linguagem C suporta os mesmos tipos de laços que outras linguagens estruturadas modernas. Os laços em C são o for, o while e o do-while. Cada um deles será examinado separadamente.

3.7 O LAÇO for

A forma geral do laço for é for (inicialização; condição; incremento){ comandos; }

Na sua forma simples, a inicialização é um comando de atribuição usado para inicializar a variável de controle do laço.

A condição é usualmente uma expressão relacional que determina quando o laço terminará pelo teste da variável de controle do laço contra algum valor.

O incremento usualmente define como a variável de controle do laço mudará cada vez que a repetição for realizada.

Estas três maiores divisões devem ser separadas por ponto-e-vírgula. O laço for continuará a execução do programa no comando seguinte a for.

Para um exemplo simples, o seguinte programa imprime os números de 1 a 100 na tela:

#include <stdio.h> void main(){ int x;

printf (“%d “, x);

for (x = 1; x <= 100; x++){ }

(Parte 7 de 10)

Comentários