User Tools

Site Tools


prog2:controle_de_fluxo

Controle de fluxo em C

Decisões

Estrutura if

if (expression)
  command ;

ou

if (expression)
{
  command ;
  command ;
  ...
}

A estrutura “if” pode testar qualquer expressão cujo resultado possa ser avaliada como número, sendo que 0 (zero) é considerado falso e não-zero é verdadeiro.

Ifs aninhados:

if (expression1)
  if (expression2)
  {
    command ;
    command ;
    ...
  }

Estrutura if-else

if (expression)
  command1 ; // <--- there is a semicolon here!
else
  command2 ;

ou

if (expression)
{
  command1a ;
  command1b ;
  command1c ;    
}
else
{
  command2a ;
  command2b ;
}

If-else aninhados:

if (expression1)
  if (expression2)
    command1 ;
  else
    command2 ;
else
  command3 ;

A cláusula else sempre se combina com o último if em aberto; caso se deseje forçar outra combinação, deve-se usar chaves ({…}) para organizar a abertura/fechamento das estruturas “if”.

Estrutura switch

switch (expression)
{
  case constant1:
       command1 ;
       ...
       break ;
  case constant2:
       command2 ;
       ...
       break ;
  case constant3:
  case constant4:
       command34a ;
       ...
       break ;
  ...
  default:
       commandNa;
       ...
       break ;
}

Exemplo (contagem de carros):

ch = getchar();
 
switch(ch)
{
  case ‘C’:
  case ‘c’:
    corsa++ ;
    break ;
  case ‘P’:
    prisma++ ;
    break ;
  case ‘p’:
    palio++ ;
    break ;
  default:
    outros++ ;
    break ;
}

Estrutura condicional ternária

A expressão

expression1 ? expression2 : expression3 ;

é equivalente a

if (expression1)
  expression2 ;
else
  expression3 ;

Exemplo:

x = x < 5 ? x + 1 : 1 ;

equivale a:

if (x < 5)
  x = x + 1 ;
else
  x = 1 ;

Laços

Estrutura while

while (expression)
  command ;

ou

while (expression)
{
  command1 ;
  command2 ;
  ...
}

Exemplo:

i = 0 ;
while (i < 100)
{
  printf ("i vale %d\n", i) ;
  i++ ;
}

Estrutura do-while

do
  command ;
while (expression) ;

ou

do
{
  command1 ;
  command2 ;
  ...
}
while (expression) ;

Exemplo:

i = 100 ;
do
{
  printf ("i vale %d\n", i) ;
  i-- ;
}
while i ;

Estrutura for

for (initializations; conditions; updates)
  command ;

ou

for (initializations; conditions; updates)
{
  command1 ;
  command2 ;
  ...
}

Exemplo: um laço de repetição com a variável de controle indo de 0 a 99:

for (i = 0; i < 100; i++)
  printf ("i vale %d", i) ;

Deve-se observar que a estrutura for equivale a:

initializations;
while (conditions)
{
  command1 ;
  command2 ;
  ...
  updates ;
}

Então o exemplo acima pode ser reescrito como:

i = 0 ;                     // inicialização
while (i < 100)             // condição
{
  printf ("i vale %d", i) ;
  i++ ;                     // update
}

Uma forma peculiar uso do for é o laço infinito, que não tem inicialização, condição nem update:

for (;;)
{
}

Desvios

Comando break

O comando break só é usado dentro de blocos switch, do, while ou for. Ao ser acionado, ele salta a execução para o primeiro comando após o bloco atual.

Exemplo:

for (;;)
{
  printf ("Aceita? (s/n) ") ;
  resp = getchar() ;
  if(resp == 's' || resp == 'n')
    break;
  printf ("\n") ;
}
// o break salta para cá 

Comando continue

O comando continue é usado em laços for, do e while. Ele interrompe a iteração atual e inicia a próxima iteração do laço onde se encontra.

Exemplo:

int i;
 
for (i = -10; i < 10; i++)
{
  if (i == 0)
    continue; // pula para a próxima iteração
  printf("%f\n", 15.0/i);
  // ...
}

Comando goto

O comando goto permite saltar a execução para locais definidos por rótulos ou etiquetas (labels), como mostra o exemplo a seguir:

goto PARTE2;
 
// ... (qualquer código)
 
PARTE2:
i = 0 ;
// ...  

O comando goto deve ser usado com muito cuidado, pois ele pode tornar o fluxo de execução muito complexo (e portanto sujeito a erros). Como regra geral, evite utilizá-lo, a não ser que seja absolutamente necessário.

Comando return

O comando return encerra a função atual e retorna ao ponto de onde ela foi chamada. Ele pode ser chamado em qualquer local da função, não necessariamente no final dela.

Exemplo:

int compara (int a, b)
{
  if (a > b) return  1 ;
  if (a < b) return -1 ;
  if (a == b) return  0 ;
}

Comando exit

A função exit (int status) é provida pela biblioteca de sistema stdlib.h e permite o encerramento da aplicação. O status informado como parâmetro é devolvido ao sistema operacional (mais especificamente ao shell que lançou a aplicação).

exit (0) ;

Comando assert

assert é uma macro que verifica uma asserção (condição) e encerra o programa se ela for falsa (nula). Ao encerrar, uma mensagem de erro indicando a localização da asserção violada é gerada, o que facilita localizar problemas.

#include <assert.h>
 
int main()
{
  ...
  assert (i >= 0) ;
  ...
}

Se a condição i >= 0 for falsa, o programa será interrompido e a seguinte mensagem será gerada, indicando o arquivo (program.c), a linha (6), a função (main) e a asserção violada:

a.out: program.c:6: main: Assertion `i >= 0' failed.

Exercícios

Escrever programas em C para:

  1. Dados três números inteiros positivos, informar que tipo de triângulo eles definem:
    • equilátero: 3 lados iguais;
    • isósceles: 2 lados iguais;
    • escaleno: 3 lados distintos;
    • degenerado: um lado é igual à soma dos outros dois;
    • impossível: um lado é maior que a soma dos outros dois.
  2. Dado um número inteiro positivo, determinar se ele é primo ou não.
  3. Dados os números reais a, b e c, calcular as raízes de uma equação do 2º grau na forma ax² + bx + c = 0. O programa deve informar se as raízes são reais ou complexas.
  4. Calcular o valor de π usando os 10.000 primeiros termos da série de Gregory.
  5. Dado um número inteiro 0 < n < 4000, escrevê-lo como número romano (exemplo: 1965 = MCMLXV).
  6. Dado N > 1 e dois números naturais i e j diferentes de 0, imprimir em ordem crescente os N primeiros naturais que sejam múltiplos de i, de j ou de ambos. Exemplo: Para N = 6, i = 2 e j = 3 a saída deverá ser: 0, 2, 3, 4, 6, 8.
  7. Dado um número x real positivo, calcular √x real com c casas decimais, por aproximação.
prog2/controle_de_fluxo.txt · Last modified: 2019/03/19 14:32 (external edit)