Anda di halaman 1dari 12

Algoritmos e Estruturas de Dados

Captulo 05 Ciclos

Filipe Marques

Escola Superior de Tecnologia e Gesto Instituto Politcnico de Viana do Castelo

Algoritmos e Estruturas de Dados

Ciclos

Introduo
Se no utilizarmos qualquer instruo de controlo do tipo if-else ou while, um programa no mais do que uma sequncia de instrues a serem executadas. Se utilizarmos instrues de controlo do tipo if-else, as sequncia de instrues do programa podem ou no ser executadas de acordo com as condies pr-definidas. O controlo de fluxo do programa pode assim ser realizado atravs de instrues como switch e if, e outras instrues que iro ser apresentadas neste captulo e permitiro a repetio de instrues. Estas instrues designam-se por instrues de controlo de fluxo e incluem o if, switch, os ciclos while, for e do ... while.

while
Esta instruo de controlo de fluxo executa uma instruo ou bloco de instrues enquanto uma determinada condio for verdadeira. A sua sintaxe :

while (condio) instruo;


O funcionamento desta instruo o seguinte: A condio avaliada. Se o resultado da condio for falso, o ciclo termina e o programa continua na instruo imediatamente a seguir ao while. Se o resultado da condio for verdadeiro, executada a instruo ou bloco de instrues associada ao while. Volta-se ao ponto inicial. O programa seguinte escreve no ecr os primeiros 10 nmeros: #include <stdio.h>

main() { int i=1; while (i <= 10) { printf("%d\n",i); i = i+1;


Pgina 2 Filipe Marques

Algoritmos e Estruturas de Dados

Ciclos

} }
De salientar que necessrio a criao de um bloco dentro do while, pois necessrio executar duas instrues distintas dentro de cada iterao. P - Se no fossem colocadas as chavetas o que imprimiria o programa? R - Iria originar um ciclo infinito, imprimindo sempre o nmero 1 pois a varivel de controlo nunca seria alterada, levando a que a condio fosse sempre verdadeira. Portanto, neccessrio que a varivel que controla o ciclo seja alterada dentro do ciclo de forma a permitir que o ciclo termine algures. O que faz o seguinte programa?

#include <stdio.h> main() { int n; n=10; while (n != 0) { printf("%d\n",n); n = n-1; } }


Escrever while(n) ou while(n!=0) exectamente o mesmo. Se n for diferente de 0, a condio devolve verdadeiro, sendo executadas as duas instrues dentro do ciclo. Quando n for zero, o programa termina pois no existe nenhuma instruo a seguir ao ciclo, no sendo escrito o nmero 0. So assim apresentados os 10 primeiros nmeros de forma decrescente.

fo r
A instruo for adapta-se a situaes em que o nmero de iteraes conhecido partida, sendo a sua sintaxe:

for (inicializaes ; condio ; ps-instruo) instruo;


Pgina 3 Filipe Marques

Algoritmos e Estruturas de Dados

Ciclos

O seu funcionamento o seguinte: 1. executado o cdigo presente em inicializaes, servindo normalmente para inicializar as variveis presentes no ciclo. Esta componente executada apenas uma vez. 2. A condio avaliada. 3. Se o resultado da condio for falso, ento o ciclo termina e o programa continua na instruo imediatamente a seguir. 4. Se o resultado da condio for verdadeiro, ento executada a instruo ou bloco de instrues do ciclo. 5. Depois de ser executada a instruo presente no ciclo, executada a ps-instruo. Esta componente do ciclo serve normalmente para realizar as alteraes necessrias para passar prxima iterao do ciclo, como por exemplo o incremento ou decremento de variveis. 6. Voltar ao ponto 2. Por exemplo, o seguinte cdigo com um ciclo while:

i = 1; while (i <= 10) { printf(%d\n,i); i = i + 1; }


Pode ser escrito utilizando um ciclo for:

for (i = 1; i <= 10; i = i + 1) printf(%d\n,i);


De salientar que o ciclo for separa e identifica todas as componentes de um ciclo: As inicializaes. A condio que se tem que verificar para a instruo ser executada. A instruo. O salto que se faz de uma instruo para a outra. No ciclo for, se existir a necessidade de realizar mais do que uma inicializao ou mais do que uma ps-instruo, estas devero ser separadas por vrgula.
Pgina 4 Filipe Marques

Algoritmos e Estruturas de Dados

Ciclos

Em C, qualquer ciclo for com a seguinte sintaxe:

for (inicializaes; condio; ps-instruo) instruo;


pode sempre ser escrito como um ciclo while:

inicializaes; while (condio) { instruo; ps-instruo; }

do ... while
Esta instruo difere das anteriores porque o teste da condio realizado no fim da instruo ou bloco de instrues do ciclo, e no antes como acontece com os ciclos while e for. Assim, o corpo do ciclo do ... while executado pelo menos uma vez, ao contrrio dos ciclos while e for que podem nunca ser executados. A sintaxe do ciclo do ... while :

do instruo; while (condio);


O seu funcionamento pode ser descrito da seguinte forma: 1. A instruo ou bloco de instrues executada. 2. A condio avaliada; 3. Se o resultado da condio for verdade, volta-se ao ponto 1. 4. Se o resultado da condio for falso, termina o ciclo e o programa continua na instruo seguinte ao ciclo. Este ciclo particularmente insteressante para o processamento de menus, pois o teste da condio de sada feito apenas depois de ser apresentado o menu pelo menos uma vez.

Ciclos Encadeados
Os ciclos encadeados so ciclos que esto presentes dentro de outros ciclos.

Pgina 5

Filipe Marques

Algoritmos e Estruturas de Dados

Ciclos

No existe qualquer limitao ao nmero de ciclos que pode ocorrer dentro de outros ciclos. Por exemplo, o seguinte programa escreve os seguintes nmeros no ecr: 1 12 123 ... 1 2 3 4 5 6 7 8 9 10

#include <stdio.h> main() { int i,j; for (i=1 ; i<=10 ; i=i+1) { for (j=1 ; j<=i ; j=j+1) printf("%d ",j); putchar('\n'); } }
Assim, o ciclo interior no apresenta um nmero de iteraes fixas, mas depende do valor da varivel de controlo do ciclo exterior. Nos ciclos encadeados, a passagem de uma iterao para a prxima no ciclo exterior s realizada depois de completado o bloco de instrues que o compem. Desta forma, o ciclo interior funciona como uma instruo simples que tem que ser completamente executada antes de se passar para a prxima iterao do ciclo exterior.

Operadores ++ e -Estes operadores so particularmente teis para o incremento e decremento de variveis, de forma a reduzir a quantidade de cdigo escrito. Operador Exemplo ++ -Pgina 6

Equivalente x=x+1 x=x1


Filipe Marques

x++ ou ++x x-- ou -x

Algoritmos e Estruturas de Dados

Ciclos

Ambos os operadores podem ser utilizados esquerda e direita das variveis. No entanto, a utilizao dos operadores esquerda ou direita de uma varivel pode alterar o resultado final. y = x ++; 1. O valor de x atribudo a y 2. O valor de x incrementado y = ++ x; 1. O valor de x incrementado 2. O valor de x atribudo a y

x = 5; y = x++; 1. Coloca o valor 5 na varivel x. 2. Coloca o valor 5 na varivel y. 3. Incrementa a varivel x. Valores finais: x=6 y=5

x = 5; y = ++x; 1. Coloca o valor 5 na varivel x. 2. Incrementa a varivel x. 3. Coloca o valor x na varivel y. Valores finais: x=6 y=6

Todas estas consideraes aplicam-se ao operador --.

Atribuio Composta
possvel reduzir a quantidade de cdigo sempre que se pretende que uma varivel receba um valor que depende do valor que ela j tem, como por exemplo:

x = x + 1;
No necessrio repetir o nome da varivel do lado direito da atribuio, podendo-se escrever a atribuio anterior da seguinte forma:

x + = 1;
Quando se utilizam atribuies compostas, absolutamente necessrio que o operador fique imediatamente junto ao sinal de igual.

Pgina 7

Filipe Marques

Algoritmos e Estruturas de Dados

Ciclos

Exerccios
Escreva um programa que apresente no ecr a tabuada do 7. #include <stdio.h> main() { int n; n=1; while (n<=10) { printf("7 * %d = %d\n",n, 7*n); n = n+1; } } Reescreva o programa anterior de forma a apresentar a tabuada de qualquer nmero introduzido pelo utilizador. #include <stdio.h> main() { int n,num; printf("Introduza um numero: "); scanf("%d",&num); n=1; while (n<=10) { printf("%d * %d = %d\n",num, n, num*n); n = n+1; } } Escreva um programa que calcule a soma e o produto dos n primeiros nmeros naturais. Por exemplo, se o utilizador escrever o nmero 5, o programa escrever soma=15 e produto=120. #include <stdio.h> main() { int n, num, soma, produto;
Pgina 8 Filipe Marques

Algoritmos e Estruturas de Dados

Ciclos

printf("Introd. um numero: "); scanf ("%d", &num); for (soma=0, n=produto=1 ; n <= num ; n=n+1) { soma = soma + n; produto = produto * n; } } printf("Soma = %d\nProduto=%d\n",soma,produto);

Escreva um programa que apresente um menu com as opes Clientes, Fornecedores, Encomendas e Sair. O programa deve apresentar a opo escolhida pelo utilizador at que escolha a opo Sair. #include <stdio.h> main() { char opcao; do { printf("\tM E N U P R I N C I P A L\n"); printf("\n\n\t\tClientes"); printf("\n\n\t\tFornecedores"); printf("\n\n\t\tEncomendas"); printf("\n\n\t\tSair"); printf("\n\n\n\t\t\tOpao:"); scanf(" %c", &opcao); fflush(stdin); /* Limpar o Buffer do teclado */ switch (opcao) { case 'c': case 'C': puts("Opo CLIENTES"); break; case 'f': case 'F': puts("Opo FORNECEDORES"); break; case 'e': case 'E': puts("Opo ENCOMENDAS"); break; case 's': case 'S': break; /* No faz nada */
Pgina 9 Filipe Marques

Algoritmos e Estruturas de Dados

Ciclos

default : puts("Opo INVALIDA!!!"); } while (opcao!= 's' && opcao != 'S'); } getchar(); /* Parar o ecr */

Escreva um programa que mostre os 10 primeiros nmeros pares. #include <stdio.h> main() { int i; for (i=2; i<=20; i=i+2) printf("%2d\n",i); } Escreva um programa que apresente no ecr toda a tabela ASCII (0..255) escrevendo em cada linha o cdigo ASCII e o caractere correspondente. #include <stdio.h> main() { int i; for (i=0 ; i<=255 ; i++) printf("%3d --> %c\n",i, (char) i); } Escreva um programa que solicite ao utilizador um nmero n e um caractere c, apresentando de seguida n linhas, cada uma delas com n caracteres. #include <stdio.h> main() { int i,j,n; char ch; printf("Introd. um N: "); scanf("%d",&n); printf("Introd. um Char: "); scanf(" %c",&ch);
Pgina 10 Filipe Marques

Algoritmos e Estruturas de Dados

Ciclos

} /*De salientar a utilizao do espao antes do %c para retirar o <ENTER> que ficou no buffer do teclado.*/ Escreva um programa que apresente no ecr meia rvore de natal com asteriscos, devendo o utilizador determinar o nmero de ramos. Por exemplo, se pretender 3 ramos: * ** *** #include <stdio.h> main() { int i,j,n; printf("Qual o N de Ramos: "); scanf("%d", &n); for (i=1 ; i<=n ; i++) { for (j=1 ; j<=i ; j++) putchar('*'); putchar('\n'); }

for (i=1 ; i<=n ; i++ ) { for (j=1 ; j<=n ; j++) putchar(ch); putchar('\n'); }

Altere o programa anterior de forma que em vez de asteriscos sejam escritas letras em cada nvel, comeando com a letra A. Por exemplo, se pretender 3 ramos: A BB CCC #include <stdio.h>
Pgina 11 Filipe Marques

Algoritmos e Estruturas de Dados

Ciclos

main() { int i,j,n; printf("Qual o N de Ramos: "); scanf("%d", &n); for (i=1 ; i<=n ; i++) { for (j=1 ; j<=i ; j++) putchar('A'+i-1); putchar('\n'); } } Escreva um programa que solicite um nmero ao utilizador at que o valor deste esteja entre os valores 1 e 100. #include <stdio.h> main() { int n; do { printf("Introd. um n: "); scanf("%d", &n); } while ( n < 1 || n > 100 ); printf("Foi Introduzido o n %d\n",n); }

Pgina 12

Filipe Marques

Anda mungkin juga menyukai