Sumário Instrução de ciclo do{while Sintaxe e Semântica Exemplos Ciclos encadeados Instrução de ciclo for ( ) Sintaxe e Semântica Exemplos Ciclos encadeados Instruções de controlo de ciclo: break continue Selecção das instruções de ciclo while, do, for Programação 2007/2008 DEEC-IST 1 Instrução de ciclo do... while Sintaxe: do instrução while ( expressão ) Semântica: Em 1º lugar a instrução é executada e só depois é que a expressão é avaliada, se for verdadeira (diferente de zero) então a instrução (simples ou composta { ) é novamente executada. O ciclo repete-se até que o valor da expressão seja igual a falso (igual ao inteiro zero), então o controlo do programa passa o ponto a seguir à expressão. Utilização: Esta instrução é semelhante ao while, mas utiliza-se sempre que seja necessário executar o corpo do ciclo uma vez de forma independente do valor da condição. Programação 2007/2008 DEEC-IST 2
Instrução de ciclo do... while Problema I: Contagem do número de espaços numa frase char ch; int num_esp; num_esp=0; printf( Introduza uma frase com Enter no fim \n ); do{ ch=getchar(); if(ch== ) num_esp=num_esp+1; while(ch!= \n ); printf( Numero de espacos=%d, num_esp); Output do programa Introduza uma frase com Enter no fim uma frase com quatro espacos<enter> Numero de espacos = 4 Sugestão 1: Escreva um programa com a instrução while que seja equivalente ao programa com a instrução do while Sugestão 2: Altere o programa de modo a contar algarismos. Programação 2007/2008 DEEC-IST 3 Ciclos encadeados com do e while Problema II: Qual é o resultado do programa seguinte? Output do programa? int a, b; a=0; do{ a=a-2; b=0; while(b<5){ b=b+1; printf("a=%3d b=%3d ", a, b); printf("\n"); while(a>-10); Programação 2007/2008 DEEC-IST 4
Sintaxe: for ( ; expressão1 expressão2 ; expressão3 ) instrução Semântica: Em 1º lugar a expressão1 é avaliada, uma única vez. Normalmente é uma expressão de atribuição que inicializa uma ou mais variáveis. Em 2º lugar a expressão2 é avaliada. Constitui a condição de controlo do ciclo for. Se for falsa a execução do ciclo termina e passa para a instrução a seguir ao for. Se for verdadeira a instrução do corpo do for é executada. Após a execução da instrução do corpo do for, a expressão3 é avaliada. A expressão3 é normalmente utilizada para modificar uma variável que entra na expressão de controlo do ciclo, por exemplo para a incrementar ou decrementar a variável. Segue-se avaliação da expressão 2. O ciclo termina quando o valor da expressão2 for igual a falso. Programação 2007/2008 DEEC-IST 5 Problema I: Suponha que por mês efectua o depósito de 30 Euros e que a taxa de remuneração dos depósitos é de 0,25% ao mês. Considere que os juros são acumulados na conta. Qual é o valor na conta ao fim de 5 anos? int m; float conta; const int meses=5*12; const float taxa=1.0025; const int deposito=30; conta=0; /* Inicializacao */ for(m=1; m <= meses; m++){ /* Inicio do mes e no fim */ Resultado no ecrã: Mes = 60, conta = 1944.250 conta =(conta + deposito)* taxa; printf("mes = %d, conta = %.3f \n", m-1, conta); Programação 2007/2008 DEEC-IST 6
Problema II: Desenvolva um programa que efectue o cálculo de f(x,p) = x p sendo x um número real e p um número inteiro positivo. int p, i; float f, x; printf( Especifique x e p:\n ); scanf( %f%d,&x,&p); f=1.0; for(i=1; i <= p; i++) f=f*x; printf( f(%f,%d)=%f \n", x, p, f); Resultado no ecrã: Especifique x e p: 2.1 3 f(2.100000,3) = 9.260999 Programação 2007/2008 DEEC-IST 7 Problema III: Qual é o resultado do programa seguinte? Resultado no ecrã:?? int i, j; for(i=1; i<= 4; i++){ for(j=1; j<=5; j++) printf( %2d*%2d=%2d, i, j,(i*j)); Programação 2007/2008 DEEC-IST 8
Instrução break A instrução break pode ser utilizada dentro dos ciclos de while, do-while e for. A sua acção consiste em terminar a instrução de ciclo onde está. O fluxo do programa passa para a instrução imediatamente a seguir à instrução de ciclo onde está o break. Atenção aos ciclos encadeados, o break só interrompe o ciclo a que pertence. int i; for(i=1; i<= 200; i++){ printf( p(%d)=%d, i, i+1); if(i== 4){ printf( Fim antesdobreak\n ); break; printf( Fim depoisdobreak\n ); printf( Foradofor ); Resultado no ecrã:?? p(1)=2 p(2)=3 p(3)=4 p(4)=5 Fim antes do break. Fora do for Programação 2007/2008 DEEC-IST 9 Instrução continue A instrução continue pode ser utilizada dentro dos ciclos de while, dowhile e for. A sua acção consiste em passar imediatamente para a iteração seguinte do ciclo onde foi executada. int i; for(i=1; i<= 200; i++){ if((i>= 4)&&(i<= 199)) continue; printf( p(%d)=%d\n, i, i+1); printf( Fora do for.\n ); Resultado no ecrã:?? p(1)=2 p(2)=3 p(3)=4 p(200)=201 Fora do for. Programação 2007/2008 DEEC-IST 10
Selecção das instruções de ciclo while, do, for Com a apresentação das instruções de ciclo pode-se colocar a questão de como seleccionar a instrução mais adequada a ser utilizada num determinado algoritmo. Apresentam-se alguns critérios (que não sendo rigorosos) podem ajudar a resolver o problema. A instrução for é normalmente utilizada quando se conhece a priori o número de iterações que é necessário realizar. A instrução while é utilizada na situação oposta ao do for, isto é quando não se sabe apriori o número de iterações. Note-se no entanto que do ponto de vista de programação e de leitura do código fonte a utilização da instrução for é preferível ao while. A justificação é devida a que na instrução for fica explícita a inicialização e a actualização da variável que é utilizada na expressão de controlo. for(i=0; i<10; i=i+1){ /* Outras instruções */ <=> i=0; while(i<10){ /* Outras instruções */ i=i+1; Programação 2007/2008 DEEC-IST 11 Selecção das instruções de ciclo while, do, for A instrução do é utilizada quando se pretende executar um conjunto de instruções pelo menos uma vez de forma independente da avaliação da condição de controlo do ciclo. É no entanto possível transformar uma instrução do, numa instrução while, mas aumentando o código fonte. Veja-se o exemplo seguinte: j=0; do{ /* Instruções ABC */ j=j+1; while(j<k); <=> /* Instruções ABC */ j=1; while(j<k){ /* Instruções ABC */ j=j+1; Programação 2007/2008 DEEC-IST 12