Sie sind auf Seite 1von 14

51

Algoritmos / Linguagem C Prof. Dr. Antnio Marcos SELMINI

Captulo 5 Estruturas de Repetio


5.1 Introduo
Nos captulos anteriores foi mostrado que no desenvolvimento de programas de computadores normalmente h a necessidade de se fazer testes lgicos para que o programa possa executar determinadas instrues, ou seja, atravs do teste lgico existe a seleo de instrues a serem executadas. At este ponto do curso, os algoritmos desenvolvidos realizavam apenas um conjunto de instrues uma nica vez e o algoritmo era finalizado. Suponha a seguinte situao: em uma sala com 50 alunos, deseja-se calcular a mdia semestral de cada aluno considerando que todos realizaram duas provas. Para resolver esse problema com os conceitos de programao apresentados at agora seria necessrio executar o mesmo programa 50 vezes. Isso no parece algo eficientes, mas resolveria o problema. Uma outra soluo e a mais recomendada a utilizao de estruturas de repetio. Uma estrutura de repetio nada mais do que uma instruo que indica ao computador para repetir um conjunto de comandos vrias vezes. O nmero de repeties pode ser controlado pelo programador ou at mesmo pelo operador do sistema. A quantidade de vezes que um conjunto de instrues ser executado depende de um teste lgico. As estruturas de repetio em programao tambm so conhecidas como laos de repetio. Basicamente sero estudadas trs estruturas bsicas de repetio. O nmero de estruturas de repetio e a sua sintaxe so especficos de cada linguagem de programao, mas o conceito central o mesmo. O que difere uma estrutura de repetio da outra a ordem de execuo do teste lgico. Em algumas estruturas o teste realizado no incio e em outras no final.

5.2 Estrutura de Repetio while()


A estrutura de repetio while() utilizada para repetir um conjunto de instrues vrias vezes de acordo com um teste lgico que realizado no incio da instruo. A sintaxe para a estrutura while() :
while(condio_lgica) { //Instruo_1; //Instruo_2; //. . . //instruo_n; }

onde a condio_lgica uma expresso composta por operadores relacionais e lgicos. O conjunto de instrues dentro do bloco de repetio s ser executado caso a condio_lgica resulte em um valor verdadeiro, caso contrrio, no ser executado. Ao atingir o final da instruo while(), o

52

Algoritmos / Linguagem C Prof. Dr. Antnio Marcos SELMINI

computador automaticamente retorna para o incio da instruo e testar novamente a condio e todo o processo se repetir at que a condio resulte em um valor falso. Exemplo 1: programa em C para imprimir os valores de 1 at 10 no vdeo.
#include <stdio.h> #include <conio.h> int main() { int cont; cont = 1; while( cont <= 10 ) { printf(%d, cont); cont = cont + 1; } getch(); return(0); }

Exemplo 2: programa em C para calcular a mdia dos nmeros pares entre 1 e 100.
#include <stdio.h> #include <conio.h> int main() { int cont, soma; cont = 1; soma = 0; while(cont <= 100) { if(cont % 2 == 0 ) soma = soma + cont; cont = cont + 1; } printf(A soma dos nmeros pares %d, soma); getch(); return(0); }

Exemplo 3: programa em C para calcular e imprimir a mdia dos 50 alunos de uma sala de aluno. Suponha que cada aluno fez duas provas durante o semestre.
#include <stdio.h> #include <conio.h> int main() { int cont; float p1, p2, media; cont = 1; while(cont <= 50) { printf(Digite a primeira nota: ); scanf(%f, &p1); printf(Digite a segunda nota: ); scanf(%f, &p2); media = (p1+p2)/2; printf(A media do aluno %d %f, cont, media);

53

Algoritmos / Linguagem C Prof. Dr. Antnio Marcos SELMINI

cont = cont + 1; } getch(); return(0); }

5.3 Estrutura de Repetio do-while()


Como j destacado na introduo deste captulo, o que difere uma estrutura de repetio de outra a ordem de realizao do teste lgico. Na estrutura while(), o teste lgico realizado logo no incio da estrutura e dependendo do valor do teste, o conjunto de instrues dentro da estrutura pode ser executado ou no. Outra estrutura de repetio do-while(). Essa estrutura semelhante a estrutura while(). A diferena que na estrutura do-while() o teste lgico realizado no final. Dessa forma, o conjunto de instrues pertencentes a estrutura realizado pelo menos uma vez. A sintaxe para a estrutura do-while() :
do { //Instruo_1; //Instruo_2; //. . . //instruo_n; } while(condio_lgica);

Exemplo 4: Refazendo o exemplo 1 usando a estrutura do-while()


#include <stdio.h> #include <conio.h> int main() { int cont; cont = 1; do { printf(%d, cont); cont = cont + 1; } while( cont <= 10 ); getch(); return(0); }

Exemplo 5: Refazendo o exemplo 2 usando a estrutura do-while()


#include <stdio.h> #include <conio.h> int main() { int cont, soma; cont = 1; soma = 0; do { if(cont % 2 == 0 ) soma = soma + cont;

54

Algoritmos / Linguagem C Prof. Dr. Antnio Marcos SELMINI

cont = cont + 1; } while(cont <= 100); printf(A soma dos nmeros pares %d, soma); getch(); return(0); }

Exemplo 6: Refazendo o exemplo 3 usando a estrutura do-while()


#include <stdio.h> #include <conio.h> int main() { int cont; float p1, p2, media; cont = 1; do { printf(Digite a primeira nota: ); scanf(%f, &p1); printf(Digite a segunda nota: ); scanf(%f, &p2); media = (p1+p2)/2; printf(A media do aluno %d %f, cont, media); cont = cont + 1; } while(cont <= 50); getch(); return(0); }

5.4 Estrutura de Repetio for()


A estrutura de repetio for() uma das mais usadas e tambm a preferidas da maioria dos programadores. Como j enfatizado neste captulo, as trs estruturas tm desempenho muito semelhante mudando apenas a sintaxe de cada uma. Tanto na estrutura while() quanto do-while() havia um teste lgico para informar ao computador se o conjunto de instrues seria executado ou no. Alm do mais, para controlar o nmero de execues normalmente se utiliza uma varivel que a cada ciclo de execuo, a mesma incrementada. Na estrutura de repetio for(), tanto a inicializao da varivel de controle quanto o teste lgico e o incremento ou decremento so escritos em uma nica linha. A sintaxe para a estrutura de repetio for() :
for(inicializao; teste_lgico; incremento/decremento) { //Instruo_1; //Instruo_2; //. . . //instruo_n; }

55

Algoritmos / Linguagem C Prof. Dr. Antnio Marcos SELMINI

onde: inicializao se refere a forma como a varivel de controle do lao ser inicializada; teste_lgico o teste que ser realizado a cada ciclo de execuo do lao de repetio. Para um valor verdadeiro o conjunto de instrues dentro do lao ser executado; incremento/decremento se refere a forma como a varivel de controle do lao ser alterada. A inicializao da varivel de controle ocorre apenas uma vez, na primeira vez que o lao for executado, mas tanto o teste lgico quanto o incremente ou o decremento sero executados todas as vezes. Exemplo 7: Refazendo o exemplo 1 usando a estrutura de repetio for().
#include <stdio.h> #include <conio.h> int main() { int cont; for(cont = 1; cont <= 10; cont = cont + 1) printf(%d, cont); getch(); return(0); }

Como pode ser percebido, a estrutura de repetio for() simplifica um algoritmo. Esse o motivo pela qual a estrutura preferida dos programadores. Dos trs parmetros pode-se omitir alguns. Os exemplos 8, 9 e 10 tm o mesmo efeito do exemplo 7. Exemplo 8
#include <stdio.h> #include <conio.h> int main() { int cont = 1; for(; cont <= 10; cont = cont + 1) printf(%d, cont); getch(); return(0); }

Exemplo 9
#include <stdio.h> #include <conio.h> int main() { int cont; for(cont = 1; cont <= 10; ) { printf(%d, cont); cont = cont + 1;

56

Algoritmos / Linguagem C Prof. Dr. Antnio Marcos SELMINI

} getch(); return(0); }

Exemplo 10
#include <stdio.h> #include <conio.h> int main() { int cont = 1; for(; cont <= 10; ) { printf(%d, cont); cont = cont + 1; } getch(); return(0); }

5.5 Representando estruturas de repetio com fluxograma

verdadeiro

falso
verdadeiro

Representao da estrutura while() e for()

falso

Representao da estrutura dowhile()

5.6 Operadores de Incremento e Decremento


Em C existe um operador utilizado para adicionar 1 ao valor de uma varivel e tambm um operador para subtrair 1 do valor da varivel. O operador utilizado para acrescentar o operador de incremento (++) e o operador utilizado para subtrair o operador de decremento (--). Estes operadores podem ser usados de duas formas: prefixado (aparece antes do nome da varivel) ou ps-fixado (aparece depois do nome da varivel).

57

Algoritmos / Linguagem C Prof. Dr. Antnio Marcos SELMINI

A instruo: x = x + 1 equivalente a ++x e x++. Por outro lado, a instruo x = x 1 equivalente a --x e x--. A diferena entre a forma prefixada ou ps-fixada s aparece quando a instruo faz mais do que simplesmente incremente ou decrementar o valor da varivel. Por exemplo: y = 4; x = ++y; Neste caso o valor da varivel x ser 5 e o da varivel y tambm ser 5, porque o valor de y incrementado antes do operador de atribuio ser executado, ou seja, a prioridade do operador de incremento/decremento quando ele est na forma prefixada. Acompanhe o que acontece nesse prximo exemplo: y = 4; x = y++; Nesta situao, o operador de atribuio tem prioridade em relao ao operador de incremento/decremento. Neste caso o valor da varivel x = 4 e o da varivel y ser 5. Os operadores unrios (os que operam sobre um nico operando) tm prioridade em relao aos operadores binrios, ou seja, os operadores de incremento/decremento tem prioridade em relao aos operadores aritmticos. Por exemplo: x = a * b++ equivalente a x = a* (b++)

5.7 Operadores Aritmticos de Atribuio


Em C possvel combinar as operaes aritmticas com operaes de atribuio de forma clara e objetiva. Os operadores utilizados so: +=, -=, *=, /= e %=. Exemplo: x += 3 equivalente a x = x + 3 x -= 5 equivalente a x = x 5 x *= 1 equivalente a x = x * 1 x /=6 equivalente a x = x / 6 x %= 10 equivalente a x = x % 10

5.8 Comandos break e continue


Quando em uma estrutura de repetio queremos encerrar as iteraes antes de atingir a condio final, utilizamos o comando break. Por exemplo:
... int k; for(k = 1; k <= 6; k++) if(k == 3) break; printf(%d\n, k); ...

58

Algoritmos / Linguagem C Prof. Dr. Antnio Marcos SELMINI

Por outro lado, o commando continue utilizado quando, em um comando de repetio, queremos encerrar a iterao corrente e passar para a prxima. Por exemplo:
... int k; for(k = 1; k <= 6; k++) if(k == 3) break; printf(%d\n, k); ...

5.9 Tabela de Precedncia dos Operadores


A tabela abaixo mostra a precedncia dos operadores bsicos (aritmticos, lgicos, relacionais e aritmticos de atribuio) estudados at agora. Os operadores que esto no mesmo bloco tm a mesma prioridade, mas tem prioridade em relao aos operadores que esto mais abaixo na tabela. Smbolo ++ -! * / % + < <= > >= == != && || ?: = *= /= %= += -= Operador Incremento prefixado ou ps-fixado Decremento prefixado ou ps-fixado NO Lgico Multiplicao aritmtica Diviso aritmtica Mdulo aritmtico Mais aritmtico Menos aritmtico Menor relacional Menor ou igual relacional Maior relacional Maior ou igual relacional Igual relacional Diferente relacional E Lgico OU Lgico Condicional Atribuio Aritmtico de atribuio (multiplicao) Aritmtico de atribuio (diviso) Aritmtico de atribuio (mdulo) Aritmtico de atribuio (adio) Aritmtico de atribuio (subtrao)

59

Algoritmos / Linguagem C Prof. Dr. Antnio Marcos SELMINI

5.10 Exerccios em Classe


Estrutura de repetio while() 1. Desenvolver um programa em C que leia dois valores inteiros e positivos. O segundo valor dever ser maior do que o primeiro. O seu programa dever imprimir todos os nmeros inteiros entre o primeiro e o segundo nmero digitado pelo usurio. 2. Criar um programa em C que leia dois nmeros inteiros. O primeiro ser o limite superior de um intervalo e o segundo ser o incremento. Imprimir todos os nmeros no intervalo de 0 at o limite lido. Por exemplo: Limite superior: 20 Incremento: 5 Sada no vdeo: 0 5 10 15 20 3. Escreva um programa em C para calcular a rea (A) de n crculos e o comprimento da circunferncia (C) de cada um. A quantidade de crculos e o raio (R) de cada um devem ser fornecidos pelo usurio. As frmulas so: A = R 2 e C = 2R

4. Escreva um programa em C que leia 15 nmeros fornecidos pelo usurio. Imprima o maior valor informado. 5. Escreva um programa em C que leia um nmero inteiro e positivo. Imprimir sua tabuada no vdeo (considerar apenas o intervalo entre 0 e 10). O programa deve permitir reprocessamento. 6. Escreva um programa em C que leia vrios nmeros fornecidos pelo usurio. Imprima o menor valor informado. A finalizao da leitura dever ser definida pelo programador. 7. Escreva um programa em C que calcule o fatorial de um nmero inteiro e positivo. 8. Escreva um programa em C que leia um valor inteiro e positivo. Verifique se o nmero digitado primo. Um nmero primo se for divisvel apenas por 1 e por ele mesmo. 9. Escreva um programa em C que calcule o valor da expresso abaixo:
1 1 1 1 h = + + +L+ 1 2 3 20 10. Determine o valor armazenado na varivel x aps a execuo de cada instruo abaixo. Considere cada instruo independente da outra. Considere tambm os seguintes valores para cada uma das variveis: a = 1, b = 2, c = 2, d = 4. a) x = a + b++ + c++ + d++; b) x = ++a + b++ / (d++ + c); c) x = b++ + b++ + ++c + c; d) x = ++a + a + ++b + b;

60

Algoritmos / Linguagem C Prof. Dr. Antnio Marcos SELMINI

11. Represente cada uma das sequncias de nmeros abaixo usando expresses matemticas (lei formao somatrio ou produtrio) e) 1 + 2 + 3 + 4 + .... + 20 f) 1 * 2 * 3 * 4 * ... * 20 1 1 1 1 g) + + + ... + 1 2 3 50 1 2 3 n 1 1 1 1 h) + + + ... + 1 2 3 n 1 1 1 1 1 i) + + ... 1 2 3 4 10 12. Indique o valor de cada uma das expresses abaixo. (Exerccio extrado do livro Treinamento em Linguagem C 2 edio, Victoriane Viviane Mizrahi) int i = 1, j = 2, k = 3, n = 2; float x = 3.3, y = 4.4; a) b) c) d) e) f) g) h) i) i < j+3 2*i-7 <= j-8 !(n-j) !n-j !x * !x i && j && k i || j 3 && 0 i < j && 2 >= k i < j || 2 >= k

Estrutura de repetio do-while()

13. Escreva um programa em C que multiplique dois valores inteiros e positivos sem utilizar o operador de multiplicao (*). 14. Criar um programa em C que imprima os 10 primeiros termos da srie de Fibonacci. A srie dada por: 1 1 2 3 5 8 ... 15. Escreva um programa em C que calcule e imprima a mdia de cada um dos 50 alunos de uma turma. Suponha que foram aplicadas 2 provas. Imprima tambm a situao de cada aluno (Aprovado / Reprovado) levando em considerao que a mdia para aprovao deve ser maior ou igual a 6. 16. Faa um programa em C que leia um nmero e imprima todos os seus divisores. 17. Escreva um programa em C que leia 15 nmeros fornecidos pelo usurio. Imprima quantos nmeros maiores que 30 foram digitados. 18. Desenvolva um programa em C que calcule o valor da expresso:

61

Algoritmos / Linguagem C Prof. Dr. Antnio Marcos SELMINI

1 1 1 1 h = + + +L+ 1 2 3 n
Estrutura de repetio for()

19. Desenvolva um programa em C para calcular o valor da expresso: 1 2 3 4 y= + + + + Ln n n 1 n 3 n 4 20. Faa um programa em C para calcular o valor da expresso: 1 1 1 1 h = + L 1 2 3 n 21. Desenvolva um programa em C para calcular o valor da expresso: 1 2 3 n x = + + +L+ 1! 2! 3! n! 22. Chico tem 1,50m e cresce 2 centmetros por ano, enquanto que, Juca tem 1,10m e cresce 3 centmetros por ano. Escreva um programa em C que calcule e imprima quantos anos so necessrios para que Juca seja maior que Chico. 23. Criar um programa em C que calcule e imprima o valor de bn. O valor de n dever ser maior ou igual a zero e o valor de b dever ser inteiro.

5.11 Exerccios Complementares


Observao: para os exerccios complementares vocs podem usar qualquer estrutura de repetio. O ideal variar entre as trs para assimilar o conceito.

1. Execute o teste de mesa para os trechos de programa abaixo e indique o valor armazenado em cada uma das variveis aps a execuo do programa. a) A = 1; S = 0; while (A<5) { S = S + A; A = A + 2; } b) A = 1; N = 0; S = 0; while (S < 12 ) { S = S + A; A = A + 1; N = N + 1; }

62

Algoritmos / Linguagem C Prof. Dr. Antnio Marcos SELMINI

2. Faa o teste de mesa nos trechos de programa abaixo: a) A = 1; B = 4; S = 0; while (A <= 6 ) { if (A <= B) S = S + A*B; else S = S - A*B; A = A + 1; B = B 1; } b) G = 1; while (G <= 5) { C = 0; while (C < G) C = C + 1; G = G + 1; } 3. Construa o fluxograma para os itens a e b do exerccio anterior. 4. Dado o conjunto de instrues a seguir, coloque o comando de repetio adequadamente: a) executar um conjunto de instrues 10 vezes; b) executar um conjunto de instrues N vezes, onde N uma varivel informada pelo usurio. 5. Indique o valor de cada uma das expresses abaixo. (Exerccio extrado do livro Treinamento em Linguagem C 2 edio, Victoriane Viviane Mizrahi) I int i = 1, j = 2, k = 3, n = 2; float x = 3.3, y = 4.4; a) i == 2 || j == 4 || k == 5 b) x <= 5.0 && x != 1.0 || i > j 6. Qual o valor da expresso abaixo? (Exerccio extrado do livro Treinamento em Linguagem C 2 edio, Victoriane Viviane Mizrahi) int a = 1, b = 2, c = 3; ++a / a && !b && c || b-- || -- a + 4*c > !!b 7. Faa programa em C que imprima todos os nmeros pares entre 85 e 907. 8. Escreva um programa em C que leia 20 valores inteiros e imprima a soma dos nmeros cujos quadrados so menores que do que 225.

63

Algoritmos / Linguagem C Prof. Dr. Antnio Marcos SELMINI

9. Escreva um programa em C que calcule a soma dos primeiros 10 valores inteiros, ou seja, 1+2+3...+10. 10. Construa um programa em C que, para um grupo de 50 valores inteiros fornecidos pelo usurio determine: a) a soma dos nmeros positivos; b) a quantidade de valores negativos; 11. Escreva o fluxograma para o exerccio anterior. 12. A srie de Ricci difere da srie de Fibonacci porque os dois primeiros valores so fornecidos pelo usurio. Os demais termos so gerados da mesma forma que a srie de Fibonacci. Criar um programa em C que imprima os 15 primeiros valores da srie. 13. Criar um programa em C que leia um nmero que servir para controlar os nmeros pares que sero impressos a partir de 2. Exemplo: Quantidade: 4 Sada no vdeo: 2 4 6 8 14. Faa um programa em C que leia um nmero e imprima a soma dos nmeros mltiplos de 5 no intervalo aberto entre 1 e o nmero lido. Suponha que o nmero lido ser maior que zero. 15. Faa um programa em C que entre com nmeros e imprima o triplo de cada nmero. O programa termina quando entrar o nmero -1. 16. Dados n valores inteiros, desenvolver um programa em C para calcular a mdia dos valores que so mpares e mltiplos de 3. 17. Dados n valores inteiros. Construir um programa em C para calcular a porcentagem de valores pares. 18. Faa o fluxograma do exerccio anterior. 19. Desenvolva um programa em C que leia nmeros inteiros at entrar o nmero -999. Para cada nmero imprima seus divisores. 20. Criar um programa em C que receba a idade, a altura e o peso de 30 pessoas. Calcule e imprima: a) quantidade de pessoas com idade superior a 50 anos; b) mdia das alturas das pessoas com idade entre 10 e 20 anos; 21. Escreva um programa em C que calcule o valor de ex. O valor de x dever ser informado via teclado. O valor da expresso dever ser calculado pela soma dos 10 primeiros termos da srie abaixo. x2 x3 x4 ex =1+ x + + + +L 2! 3! 4!

64

Algoritmos / Linguagem C Prof. Dr. Antnio Marcos SELMINI

22. Escreva um programa em C que leia vrios nmeros inteiros e positivos. Calcular a soma dos nmeros que no so primos. 23. Dados n valores de x, desenvolver um programa em C para calcular e imprimir o valor da funo y para cada valor de x. O valor de y dado por: y = x2 + 3 . 2

24. Desenvolver um programa em C para exibir um quadrado formado por asteriscos conforme exemplo abaixo. O tamanho n do lado do quadrado deve ser fornecido pelo usurio (DEITEL, 2006). Considere como exemplo n = 5: ***** * * * * * * ***** 25. Desenvolver um programa em C para exibir um tringulo formado por asteriscos conforme exemplo abaixo. O tamanho n do lado do tringulo deve ser fornecido pelo usurio (DEITEL, 2006). Considere como exemplo n = 5: * *** ***** ******* ********* 26. Um engenheiro precisa fazer o grfico da funo f ( x) = x2 + 1 . Para isso ele quer criar um x+2 programa que gere a tabela de pares ordenados (x, y) e, em seguida, construa o grfico a partir da tabela. Vamos ajud-lo na primeira parte desta tarefa, construindo a tabela de pares ordenados. Para isso sero fornecidos como dados de entrada: o valor inicial de x, o valor final de x e o incremento. Por exemplo, se x varia de 0.0 a 0.3 com incremento 0.2, devemos gerar uma tabela com os seguintes valores de x: 0.0, 0.2, 0.4, 0.6 .... 2.6, 2.8, 3.0.

27. Desenvolver um programa em C para calcular o valor do arco-tangente de x a partir da soma das n primeiras parcelas da srie: x3 x5 x7 para -1 < x < 1 atg ( x) = x + + L 3 5 7 1 1 1 1 para x >= 1 atg ( x) = + 3 5 + 7 L 2 x 3x 5 x 7x 1 1 1 1 atg ( x) = + 3 5 + 7 L para x <= -1 2 x 3x 5 x 7x

Das könnte Ihnen auch gefallen