Вы находитесь на странице: 1из 30

Elementos de programao em C

Estruturas de repetio

Francisco A. C. Pinheiro, Elementos de Programao em C, Bookman, 2012.

Visite os stios do livro para obter material adicional: www.bookman.com.br e www.facp.pro.br/livroc

() Elementos de programao em C 1 / 24
Sumrio

1 Comando while

2 Comando do

3 Comando for

4 Iteraes infinitas e clusulas vazias

5 Interrompendo iteraes

6 Desvio incondicional

7 Outros desvios e interrupes

8 () Elementos de programao em C 2 / 24
Comando while

Comando while

hComandoWhilei ::= while ( hCondioi ) hClusulaRepetioi

hCondioi ::= Expresso do tipo escalar resultando em um valor


verdadeiro (diferente de 0) ou falso (igual a 0).

hClsulaRepetioi ::= hBlocoInstr i

() Elementos de programao em C 3 / 24
Comando while

Comando while

Exemplo
O que impresso pelo # include < stdio .h >
int main ( void ) {
programa ao lado? int qtd = 1;
while ( qtd <= 1500) {
printf ("% f \ n " , 1.0/( qtd + 1));
qtd = qtd + 1;
}
printf (" fim \ n ");
return 0;
}

() Elementos de programao em C 4 / 24
Comando while

Comando while

Exemplo
O que impresso pelo # include < stdio .h >
int main ( void ) {
programa ao lado? int qtd = 1;
while ( qtd <= 1500) {
Resposta: os 1.500 primeiros printf ("% f \ n " , 1.0/( qtd + 1));
termos da sequncia qtd = qtd + 1;
1 1 1 1 }
2 , 3 , 4 , 5 , .... printf (" fim \ n ");
return 0;
}

() Elementos de programao em C 4 / 24
Comando while

Comando while

Exemplo
O programa ao lado l # include < stdio .h >
int main ( void ) {
um nmero int num = -1;
assegurando que o while (( num <= 0) || ( num >= 230)) {
printf (" Digite 0 < numero < 230: ");
nmero lido esteja na scanf ("% d " , & num );
faixa [1, 229] }
printf ("2 x % d = % d \ n " , num , (2 * num ));
printf (" fim \ n ");
return 0;
}

() Elementos de programao em C 5 / 24
Comando while

Comando while

Exemplo
O programa ao lado l # include < stdio .h >
int main ( void ) {
um nmero int num = -1;
assegurando que o while (( num <= 0) || ( num >= 230)) {
printf (" Digite 0 < numero < 230: ");
nmero lido esteja na scanf ("% d " , & num );
faixa [1, 229] }
printf ("2 x % d = % d \ n " , num , (2 * num ));
printf (" fim \ n ");
return 0;
}

Pode-se realizar uma leitura inicial em vez de atribuir o valor 1


varivel num.
Porm, o melhor usar uma estrutura de repetio mais adequada,
que garanta pelo menos uma repetio.
() Elementos de programao em C 5 / 24
Comando while

Comando while

Exemplo
O programa ao lado l um # include < stdio .h >
int main ( void ) {
nmero N e a seguir l N int n , x , i = 0;
nmeros pares. Se N for printf (" Digite a qtd . de numeros : ");
scanf ("% d " , & n );
negativo ou zero o printf (" Digite % d numeros pares \ n " , n );
programa termina sem while ( i < n ) {
realizar nenhuma leitura x = 1;
while (( x % 2) != 0) {
adicional. printf (" Numero % d : " , i + 1);
scanf ("% d " , & x );
}
i ++;
}
return 0;
}

() Elementos de programao em C 6 / 24
Comando do

Comando do

hComandoDoi ::= do hClusulaRepetioi while ( hCondioi ) ;

hCondioi ::= Expresso do tipo escalar resultando em um valor


verdadeiro (diferente de 0) ou falso (igual a 0).

hClusulaRepetioi ::= hBlocoInstr i

() Elementos de programao em C 7 / 24
Comando do

Comando do

Exemplo
O programa ao lado l # include < stdio .h >
int main ( void ) {
um nmero int num ;
assegurando que o do {
printf (" Digite 0 < numero < 230: ");
nmero lido esteja na scanf ("% d " , & num );
faixa [1, 229] } while (( num <= 0) || ( num >= 230));
printf ("2 x % d = % d \ n " , num , 2 * num );
printf (" fim \ n ");
return 0;
}

() Elementos de programao em C 8 / 24
Comando do

Comandos do e while

Exemplo
O programa ao lado l # include < stdio .h >
int main ( void ) {
um nmero positivo N int num ;
e imprime o fatorial de long long int fat = 1 LL ;
do {
N. printf (" Digite um numero >= 0: ");
scanf ("% d " , & num );
} while ( num < 0);
while ( num > 1)
fat = fat * num - -;
printf (" Fatorial = % lld \ n " , fat );
return 0;
}

() Elementos de programao em C 9 / 24
Comando do

Comandos do e while

Exemplo
O programa ao lado l # include < stdio .h >
int main ( void ) {
um nmero positivo N int num ;
e imprime o fatorial de long long int fat = 1 LL ;
do {
N. printf (" Digite um numero >= 0: ");
scanf ("% d " , & num );
} while ( num < 0);
while ( num > 1)
fat = fat * num - -;
printf (" Fatorial = % lld \ n " , fat );
return 0;
}

Observao: se long long int for implementado com 64 bits, os fatoriais


no so calculados corretamente para N 21.

() Elementos de programao em C 9 / 24
Comando for

Comando for

hComandoFor i ::= for ( [hIniFor i] ; [hCondioi] ; [hFimIter i] )


hClusulaRepetioi

hIniFor i ::= hListaExprC i | hDeclVarLocal i

hFimIter i ::= hListaExprC i

hCondioi ::= Expresso do tipo escalar resultando em um valor


verdadeiro (diferente de 0) ou falso (igual a 0).

hListaExprC i ::= hExprC i | hListaExprC i , hExprC i

hExprC i ::= Expresso consistindo de operadores e operandos.

hDeclVarLocal i ::= Declarao de variveis locais.

hClusulaRepetioi ::= hBlocoInstr i


() Elementos de programao em C 10 / 24
Comando for

Execuo do comando for

Incio do for. Os comandos e declaraes na clusula inicial so executados


uma nica vez.
Teste da condio. A condio avaliada.
Iterao. Se a condio for verdadeira, os comandos da clusula de
repetio so executados.
Trmino da iterao. Os comandos da clusula final so executados, aps
o que o controle transferido para uma nova avaliao da
condio, reiniciando o processo.

() Elementos de programao em C 11 / 24
Comando for

Comando for

Exemplo
O programa ao lado l # include < stdio .h >
int main ( void ) {
imprime a soma dos 200 int soma = 0;
primeiros nmeros naturais. for ( int i = 1; i <= 200; i ++)
soma = soma + i ;
printf (" soma : % d \ n " , soma );
return 0;
}

() Elementos de programao em C 12 / 24
Comando for

Comando for

Exemplo
O programa ao lado l # include < stdio .h >
int main ( void ) {
imprime a soma dos 200 int soma = 0;
primeiros nmeros naturais. for ( int i = 1; i <= 200; i ++)
soma = soma + i ;
printf (" soma : % d \ n " , soma );
return 0;
}

Observao: a declarao de variveis na clusula inicial de um comando


for prpria do padro ISO/IEC 9899:1999.

() Elementos de programao em C 12 / 24
Comando for

Comando for

Exemplo
O programa ao lado # include < stdio .h >
int main ( void ) {
ilustra o uso de int num ;
chamadas a funo long fat ;
printf (" Digite um numero >= 0: ");
nas clusulas inicial e for ( scanf ("% d " , & num ) ;
final de um comando num < 0 ;
for. printf (" Digite um numero >= 0: ") ,
scanf ("% d " , & num ))
{ }
for ( fat = 1 L ; num > 1; num - -)
fat = fat * num ;
printf (" Fatorial = % ld \ n " , fat );
return 0;
}

() Elementos de programao em C 13 / 24
Iteraes infinitas e clusulas vazias

Iteraes infinitas e clusulas vazias

Os comandos do e while podem ter clusulas vazias.

while ( a > 5) { } do { } while ( a > 5) ;

while ( a > 5) ; do ; while ( a > 5) ;

Tanto a clusula de repetio quanto as clusulas inicial e final do


comando for podem ser vazias.

for ( ; ; ) { } for ( ; ; ) ;

() Elementos de programao em C 14 / 24
Interrompendo iteraes Comando break

Comando break

O comando break interrompe a iterao que o contm, encerrando o


comando de iterao.

() Elementos de programao em C 15 / 24
Interrompendo iteraes Comando break

Comando break

O comando break interrompe a iterao que o contm, encerrando o


comando de iterao.
Exemplo
for ( p = 1; p <= n ; p ++) { while ( p <= n ) {
if ( soma + p > lim ) { if ( soma + p > lim ) {
break ; break ;
} }
soma = soma + p ; soma = soma + p ++;
} }

() Elementos de programao em C 15 / 24
Interrompendo iteraes Comando break

Comando break
Exemplo
O que impresso pelo # include < stdio .h >
# include < stdbool .h >
programa ao lado se o int main ( void ) {
nmero lido for igual a 4? int n , b , soma ;
scanf ("% d " , & n );
while ( n > 0) {
soma = 1; b = 1;
printf ("% d " , b ++);
while ( true ) {
if ( b > n )
break ;
printf (" + % d " , b );
soma = soma + b ++;
}
printf (" = % d \ n " , soma );
n - -;
}
return 0;
}

() Elementos de programao em C 16 / 24
Interrompendo iteraes Comando break

Comando break
Exemplo
O que impresso pelo # include < stdio .h >
# include < stdbool .h >
programa ao lado se o int main ( void ) {
nmero lido for igual a 4? int n , b , soma ;
scanf ("% d " , & n );
Resposta: while ( n > 0) {
soma = 1; b = 1;
1 + 2 + 3 + 4 = 10 printf ("% d " , b ++);
1 + 2 + 3 = 6 while ( true ) {
1 + 2 = 3 if ( b > n )
break ;
1 = 1 printf (" + % d " , b );
soma = soma + b ++;
}
printf (" = % d \ n " , soma );
n - -;
}
return 0;
}

() Elementos de programao em C 16 / 24
Interrompendo iteraes Comando continue

Comando continue

O comando continue interrompe a iterao que o contm, reiniciando o


comando iterativo,
a partir de uma nova avaliao da condio (para os comandos do e
while) ou
a partir da clusula de fim de iterao (para o comando for).

() Elementos de programao em C 17 / 24
Interrompendo iteraes Comando continue

Comando continue

Exemplo
O programa ao lado l # include < stdio .h >
int main ( void ) {
seis nmeros pares e int num , soma , qtd =0;
maiores do que 0, while ( qtd < 6) {
printf (" Digite um numero par > 0: ");
imprimindo para cada scanf ("% d " , & num );
nmero lido N a soma if (( num % 2) != 0 || ( num <= 0))
dos naturais de 1 a N. continue ;
qtd ++; soma = 0;
O comando continue for ( int i = 1; i <= num ; i ++)
soma = soma + i ;
usado para reiniciar o printf (" x = %d , s ( x ) = % d \ n " ,
processamento caso o num , soma );
}
nmero lido no seja printf (" fim \ n ");
vlido. return 0;
}

() Elementos de programao em C 18 / 24
Desvio incondicional

Comando goto

O comando goto provoca o desvio incondicional do fluxo da execuo para


o comando rotulado por seu rtulo.
O rtulo de um goto deve estar no escopo da funo que o contm.

() Elementos de programao em C 19 / 24
Desvio incondicional

Comando goto

Exemplo
A funo ao lado imprime os void fun ( int modo , int lim ) {
int num = 0;
nmeros naturais at o primeiro do {
maior ou igual a lim. A if ( modo == 1) {
goto s1 ;
impresso ocorre } else {
if ( modo == 2) {
de 1 em 1, se modo for igual goto s2 ;
a 1; }
}
de 2 em 2, se modo for igual num ++;
a 2; ou s2 : num ++;
s1 : num ++;
de 3 em 3, se modo for igual printf ("% d " , num );
a 3. } while ( num < lim );
}

() Elementos de programao em C 20 / 24
Desvio incondicional

Programao sem goto

O comando goto no compatvel com a programao estruturada.


Todo programa pode ser desenvolvido usando-se para interromper o
fluxo sequencial da execuo apenas as estruturas convencionais de
deciso e repetio.
O uso do goto torna os programas mais difceis de ser entendidos e
modificados.

() Elementos de programao em C 21 / 24
Outros desvios e interrupes

Outras formas de desvio e interrupo

Para interrupo da execuo de funes:


return
exit
quick_exit (funo definida na verso 2011 do padro da
linguagem).
_Exit
abort
Para desvios no locais
setjmp
longjmp

() Elementos de programao em C 22 / 24
Obrigaes de prova

Obrigaes de prova

O uso de comandos iterativos exige duas obrigaes de prova:


1 Haver pelo menos uma iterao.
2 As iteraes eventualmente param.

() Elementos de programao em C 23 / 24
Bibliografia

Bibliografia

ISO/IEC
C Programming Language Standard
ISO/IEC 9899:2011, International Organization for Standardization;
International Electrotechnical Commission, 3rd edition, WG14/N1570
Committee final draft, abril de 2011.
Francisco A. C. Pinheiro
Elementos de programao em C
Bookman, Porto Alegre, 2012.
www.bookman.com.br, www.facp.pro.br/livroc

() Elementos de programao em C 24 / 24

Вам также может понравиться