Escolar Documentos
Profissional Documentos
Cultura Documentos
Controle de fluxo
W. Celes e J. L. Rangel
ou
if ( expr ) {
bloco de comandos 1
...
}
else {
bloco de comandos 2
...
}
A indentao (recuo de linha) dos comandos fundamental para uma maior clareza do
cdigo. O estilo de indentao varia a gosto do programador. Alm da forma ilustrada
acima, outro estilo bastante utilizado por programadores C :
if ( expr )
{
bloco de comandos 1
...
}
else
{
bloco de comandos 2
...
}
Estruturas de Dados PUC-Rio
3-1
Primeiramente, notamos que no foi necessrio criar blocos ( {...} ) porque a cada if est
associado apenas um comando. Ao primeiro, associamos o segundo comando if, e ao
segundo if associamos o comando que chama a funo printf. Assim, o segundo if s
ser avaliado se o primeiro valor fornecido for par, e a mensagem s ser impressa se o
segundo valor fornecido tambm for par. Outra construo para este mesmo exemplo
simples pode ser:
int main (void)
{
int a, b;
printf("Digite dois numeros inteiros:");
scanf("%d%d",&a,&b);
if ((a%2 == 0) && (b%2 == 0))
printf ( "Voce digitou dois numeros pares!\n");
return 0;
}
3-2
ser fornecido o valor 5 para temp. Observando o cdigo do programa, podemos pensar que
nenhuma mensagem seria fornecida, pois o primeiro if daria resultado verdadeiro e ento
seria avaliado o segundo if. Neste caso, teramos um resultado falso e como,
aparentemente, no h um comando else associado, nada seria impresso. Puro engano. A
indentao utilizada pode nos levar a erros de interpretao. O resultado para o valor 5 seria
a mensagem Temperatura muito quente. Isto , o programa est INCORRETO.
Em C, um else est associado ao ltimo if que no tiver seu prprio else. Para os casos
em que a associao entre if e else no est clara, recomendamos a criao explcita de
blocos, mesmo contendo um nico comando. Reescrevendo o programa, podemos obter o
efeito desejado.
/* temperatura (versao 2) */
#include <stdio.h>
int main (void)
{
int temp;
printf ( "Digite a temperatura: " );
scanf ( "%d", &temp );
if ( temp < 30 )
{
if ( temp > 20 )
printf ( " Temperatura agradavel \n" );
}
else
printf ( " Temperatura muito quente \n" );
return 0;
}
Esta regra de associao do else propicia a construo do tipo else-if, sem que se tenha
o comando elseif explicitamente na gramtica da linguagem. Na verdade, em C,
construmos estruturas else-if com ifs aninhados. O exemplo abaixo vlido e
funciona como esperado.
/* temperatura (versao 3) */
#include <stdio.h>
int main (void)
{
int temp;
printf("Digite a temperatura: ");
scanf("%d", &temp);
3-3
Estruturas de bloco
Observamos que uma funo C composta por estruturas de blocos. Cada chave aberta e
fechada em C representa um bloco. As declaraes de variveis s podem ocorrer no incio
do corpo da funo ou no incio de um bloco, isto , devem seguir uma chave aberta. Uma
varivel declarada dentro de um bloco vlida apenas dentro do bloco. Aps o trmino do
bloco, a varivel deixa de existir. Por exemplo:
...
if ( n > 0 )
{
int i;
...
}
...
A varivel i, definida dentro do bloco do if, s existe dentro deste bloco. uma boa
prtica de programao declarar as varveis o mais prximo possvel dos seus usos.
Operador condicional
C possui tambm um chamado operador condicional. Trata-se de um operador que
substitui construes do tipo:
...
if ( a > b )
maximo = a;
else
maximo = b;
...
expresso2;
n != n (n 1) (n 2)...3 2 1, onde 0 != 1
3-4
3-5
/* calcula fatorial */
for (i = 1; i <= n; i++)
{
f *= i;
}
printf(" Fatorial = %d \n", f);
return 0;
Observamos que as chaves que seguem o comando for, neste caso, so desnecessrias, j
que o corpo do bloco composto por um nico comando.
Tanto a construo com while como a construo com for avaliam a expresso booleana
que caracteriza o teste de encerramento no incio do lao. Assim, se esta expresso tiver
valor igual a zero (falso), quando for avaliada pela primeira vez, os comandos do corpo do
bloco no sero executados nem uma vez.
C prov outro comando para construo de laos cujo teste de encerramento avaliado no
final. Esta construo o do-while, cuja forma geral :
do
{
bloco de comandos
} while (expr_booleana);
3-6
/* Fatorial (versao 3) */
#include <stdio.h>
int main (void)
{
int i;
int n;
int f = 1;
/* requisita valor do usurio */
do
{
printf("Digite um valor inteiro nao negativo:");
scanf ("%d", &n);
} while (n<0);
/* calcula fatorial */
for (i = 1; i <= n; i++)
f *= i;
fim
pois, quando i tiver o valor 5, o lao ser interrompido e finalizado pelo comando break,
passando o controle para o prximo comando aps o lao, no caso uma chamada final de
printf.
3-7
gera a sada:
0
fim
Devemos ter cuidado com a utilizao do comando continue nos laos while. O
programa:
/* INCORRETO */
#include <stdio.h>
int main (void)
{
int i = 0;
while (i < 10)
{
if (i == 5) continue;
printf("%d ", i);
i++;
}
printf("fim\n");
return 0;
}
3.3. Seleo
Alm da construo else-if, C prov um comando (switch) para selecionar um dentre
um conjunto de possveis casos. Sua forma geral :
3-8
switch ( expr )
{
case op1:
...
/* comandos executados se expr == op1
break;
case op2:
...
/* comandos executados se expr == op2
break;
case op3:
...
/* comandos executados se expr == op3
break;
default:
...
/* executados se expr for diferente de
break;
}
*/
*/
*/
todos
*/
opi deve ser um nmero inteiro ou uma constante caractere. Se expr resultar no valor opi,
os comandos que se seguem ao caso opi so executados, at que se encontre um break. Se
o comando break for omitido, a execuo do caso continua com os comandos do caso
seguinte. O caso default (nenhum dos outros) pode aparecer em qualquer posio, mas
3-9