Linguagem C Estruturas de Controle de Fluxos Disciplina: AAM Profa. Ana Watanabe 1/2013 vol.4 “regozijai-vos sempre.” I Tessalonicenses 5:16 Linguagem C • Objetivo da aula: • ESTRUTURAS DE CONTROLE DE FLUXO • Exercício de Fixação Linguagem C • ESTRUTURAS DE CONTROLE DE FLUXO • Os comandos de controle de fluxo são a base de qualquer linguagem. • C tem um conjunto muito rico e poderoso de comandos de controle de fluxo. • Eles se dividem em comandos de teste de condições e comandos de controle de loop. Linguagem C Comandos de testes de condições Estes comandos avaliam uma condição e executam um bloco de código de acordo com o resultado. São eles: • if • switch Linguagem C Comandos de testes de condições if Forma geral do comando if é: if (condição) comando; else comando; Obs.: A parte else é opcional Linguagem C • Exemplos if (x) if (y) printf(“1”); else printf(“2”); Neste caso, o else pertence ao segundo if. if (x) { if (y) printf(“1”); } else printf(“2”); Neste caso, o else pertence ao primeiro Linguagem C • “escada” if-else-if: É muito comum encontrar programas da seguinte forma: if (condição) comando; else if (condição) comando; else comando; Linguagem C • O computador avalia as expressões condicionais de cima para baixo. • Assim que encontra uma condição verdadeira, ele executa o comando associado a ela e passa por cima do resto da “escada”. • Se nenhuma condição for verdadeira, o computador executará o else final. Linguagem C Comandos de testes de condições: Switch É um comando de vários desvios • No switch, o computador testa uma variável sucessivamente contra uma lista de constantes inteiras ou de caracteres e executa um comando ou bloco de comandos quando encontrar uma coincidência. Linguagem C Forma geral do switch switch (variável) { case constante1: seqüência de comandos break; case constante2: seqüência de comandos break; default: seqüência de comandos } Linguagem C Dicas importantes: • De modo geral, a sequência de comandos do case não precisam estar entre chaves. • Porém, se o primeiro comando dentro de um case for a declaração ao de uma variável, será necessário colocar todos os comandos desse case dentro de um par de chaves. Linguagem C default • O comando default será executado se não for encontrada nenhuma coincidência na lista de constantes. • Caso não seja colocado um comando default e não haja coincidência, nenhum comando será executado. Linguagem C break • Quando o computador encontra alguma coincidência, ele executa os comandos associados àquele case até encontrar break ou o fim do comando switch. • É um erro comum programadores esquecerem de colocar o break após os comandos. Linguagem C importante: • O switch difere do if, já que o primeiro só pode testar igualdade e a expressão condicional if pode ser de qualquer tipo. • Não pode haver duas constantes case com valores iguais no mesmo switch. • Podem ser colocados comandos switch dentro de comandos switch. • Pode ser deixado um case vazio quando mais de uma condição usa o mesmo código. Linguagem C Comandos de controle de loops • Os comandos de controle de loops permitem que o computador repita um conjunto de instruções até que alcance uma certa condição. • Em C temos os seguintes comandos de controle de loop: • for • while • do while Linguagem C for • O loop for em C é muito mais forte e mais flexível que o da maioria das outras linguagens. • Sua forma geral é: for (inicialização; condição; incremento) comando; • Observe que as três partes do loop for são separadas por ponto e vírgula. • Nenhuma destas partes precisa existir. Ao omitir a condição ao do comando for, criamos um laço infinito. Linguagem C Inicialização • Na forma mais simples, inicialização é um comando de atribuição que o compilador usa para estabelecer a variável de controle de loop. •A inicialização pode conter qualquer comando válido em C. Linguagem C Condição • A condição é uma expressão de relação que testa se a condição final desejada pelo loop for ocorreu. • Aqui também pode ser colocado qualquer comando válido em C. Linguagem C Incremento • O incremento define a maneira como a variável de controle do loop será alterada cada vez que o computador repetir o loop. • Também aqui, podemos colocar qualquer comando válido em C. Linguagem C Exemplo 1 /* conta de 1 a 100 – pode ser usado pra retardo de tempo */ main() { int x; for (x = 1; x <= 100; x ++) ; } Linguagem C Exemplo 2 /* conta de 100 a 1 */ main() { int x; for (x = 100; x > 0; x --) ; } Linguagem C Exemplo 3 /* conta de 0 a 100, 5 em 5 */ main() { int x; for (x = 0; x <= 100; x = x + 5) ; } Linguagem C Loop infinito • Podemos fazer um comando for executar para sempre simplesmente não especificando sua parte condicional. Veja: for (;;) { } Linguagem C Saindo de um loop Podemos usar o comando break para encerrar um for a qualquer momento. main() /* O loop será executado 10 vezes */ { int a; for (a = 1; a < 100; a++) if (a == 10) break; } Linguagem C While •O while executa um comando (ou bloco de comandos) enquanto uma condição for verdadeira. A forma geral do while é: while (condição) comando; Linguagem C While Exemplo 1 pausa() { char tecla = ‘\0’; printf(“Tecle ESPAÇO para continuar...”); while (tecla != ‘ ’) tecla = getche(); } Linguagem C Exemplo 1 pausa() { char tecla = ‘\0’; printf(“Tecle ESPAÇO para continuar...”); while (tecla != ‘ ’) tecla = getche(); } Linguagem C do while •Ao contrário do loop for e do loop while, que testam a condição no começo do loop, o loop do while verifica a condição somente no final. •Desta forma, o loop será executado pelo menos uma vez. Linguagem C do while • A forma geral do loop do while é: do { comando; } while (condição); Linguagem C Um dos usos da estrutura do-while é em menus, nos quais você quer garantir que o valor digitado pelo usuário seja válido, conforme apresentado a seguir: Linguagem C int main () { int i; do { printf ("\n\nEscolha a fruta pelo numero:\n\n"); printf ("\t(1)...Mamao\n"); printf ("\t(2)...Abacaxi\n"); scanf("%d", &i); } while ((i<1)||(i>2)); switch (i) { case 1: printf ("\t\tVoce escolheu Mamao.\n"); break; case 2: printf ("\t\tVoce escolheu Abacaxi.\n"); break; } } Linguagem C Interrupção de loops •Quando precisamos encerrar um loop sem que sua condição de encerramento esteja satisfeita, podemos utilizar o comando break. O break faz com que a execução do programa continue na primeira linha seguinte ao loop ou bloco que está sendo interrompido.. Linguagem C O que faz esta rotina? for(t=0; t<100; ++t) { count=1; for(;;) { printf("%d", count); count++; if(count==10) break; } } Linguagem C O que faz esta rotina? for(t=0; t<100; ++t) { count=1; for(;;) /* imprimirá os números de 1 a 10 cem vezes na tela.*/ { printf("%d", count); count++; if(count==10) break; } } Linguagem C Comando continue •O comando continue funciona de maneira parecida com o comando break. •Porém, em vez de forçar o encerramento, continue força a próxima iteração do loop e pula o código que estiver no meio. Linguagem C Exemplo: O que faz o programa? main() { int x; for (x = 0; x < 100; x ++) { if (x % 2) continue; printf(“%d ”, x); } } Linguagem C /* programa para imprimir os números pares entre 0 e 98 */ main() { int x; for (x = 0; x < 100; x ++) { if (x % 2) continue; printf(“%d ”, x); } } Linguagem C O Comando goto •O goto é o último comando de controle de fluxo. Ele pertence a uma classe à parte: a dos comandos de salto incondicional. •O goto realiza um salto para um local especificado. Este local é determinado por um rótulo. Um rótulo, na linguagem C, é uma marca no programa. Você dá o nome que quiser a esta marca. Linguagem C O Comando goto • A forma geral é: nome_do_rótulo: .... goto nome_do_rótulo; .... Linguagem C •O comando goto deve ser utilizado com parcimônia, pois o abuso no seu uso tende a tornar o código confuso. •O goto não é um comando necessário, podendo sempre ser substituído por outras estruturas de controle. •Recomendamos que o goto nunca seja usado. Linguagem C •Existem algumas situações muito específicas onde o comando goto pode tornar um código mais fácil de se entender se ele for bem empregado. •Um caso em que ele pode ser útil é quando temos vários loops e ifs aninhados e se queira, por algum motivo, sair destes loops e ifs todos de uma vez. •Neste caso um goto resolve o problema mais elegantemente que vários breaks, sem contar que os breaks exigiriam muito mais testes. Ou seja, neste caso o goto é mais elegante e mais rápido. LINGUAGEM C • Exercício de Fixação: PRÁTICA: Escrever um programa que conforme as chaves muda a lógica dos 8 leds.