Controle de Fluxo - C/C++

Started by Dark_Side, 11 de December , 2006, 04:52:08 AM

Previous topic - Next topic

0 Members and 1 Guest are viewing this topic.

Dark_Side

Hi,

São instruções básicas na maioria das linguagens de programação: If, Switch, For, While, Do e Goto.

Estas instruções fazem parte de um conjunto chamando controle de fluxo.
O controle de fluxo consiste nestas instruções que promovem, por exemplo, a repeticação de um bloco de códigos, validação de valores, execução de determinadas instruções sob condições verdadeiras ou falsas, dentre outras funções.

O que veremos no artigo de hoje é exatamente isso - Controle de fluxo em C/C++.

Vamos analisar cada instrução:

QuoteIf - utilizada para executar um bloco de código se uma condição for verdadeira;

Switch - executa determinadas instruções de acordo com o valor de uma variável ou uma expressão;

While - executa determinadas instruções enquanto uma condição for verdadeira;

Do.. While - opera de forma semelhante à instrução while, entretanto, enquanto while só inicia a execução do bloco de códigos caso a condição seja verdadeira, a instrução DO executa este mesmo bloco uma primeira vez e, ao final da execução, verifica se a condição é verdadeira, para que só assim o bloco continue sendo executado.

For - utilizada para executar um bloco de códigos, quantas vezes forem necessárias, até que uma condição seja verdadeira - geralmente incrementamos ou decrementamos o valor de uma variável específica a cada interação;

goto - pula para um lugar no código pré-definido, denominado label.

Se você reparar bem, nota-se que as instruções trabalham na base de condições. Estas condições são feitas de acordo com sinais lógicos, chamados operadores relacionais. São eles:

Quote<  - Menor que
<= - Menor ou igual a
== - Igual a
!= - Diferente de
>  - Maior que
>= - Maior ou igual a

Para podermos utilizar estes operadores, devemos ter dois valores, que são representados da seguinte forma:

QuoteA == B;

A - valor 1;
== operador relacional;
B - valor 2.

Uma observação a ser feita é que, ao contrário de algumas linguagens, em C, o operador == é utilizado como operador de igualdade e não o operador = que é o operador de atribuicão em C (exemplo: a = 10).
É um erro bastante comum utilizar = ao invés de ==. O resultado desta confusão está associado ao fato de uma condição ser sempre verdadeira, já que os valores passariam a ser exatamente iguais após a atribuição.

Os seis operadores relacionais acima são binários, isto é, podem retornar dois valores: TRUE (verdadeiro) ou FALSE (false).

Exemplos:
Quote10 < 20 (10 é menor que 20)
Como o valor 10 é menor que o valor 20, então a operação retorna TRUE;

Quote30 > 20 (30 é menor que 20)

Desta vez, temos um valor FALSE.

É comum utilizarmos mais de uma condição, por exemplo, um número que seja, ao mesmo tempo, maior que 10 e menor do que 15.

Para caso como esse, há ainda outros três operadores:
Quote|| - OR  (OU)
&& - AND (E)
!  - NOT (NÃO)

Vejamos o uso de cada um deles:

Exemplo 1:

x > 10 || x < 20

A condição acima retornaria TRUE caso o valor de "x" fosse maior do que 10 OU menor do que 20.

Se qualquer condição for verdadeira, o operador retorna TRUE; se todas as condições forem falsas, o operador retorna FALSE.

Exemplo 2:

x > 10 && x < 20

É a situação colocada anteriormente: um número que seja maior que 10 e menor que 20, ao mesmo tempo.

O operador && retorna TRUE caso todas as condições sejam verdadeiras; ou retorna FALSE caso qualquer uma seja falsa.

Exemplo 2:

!(x > 0)

O operador ! retorna TRUE caso o valor de x NÃO seja maior do que ZERO, e retorna FALSE caso o valor de x SEJA maior do que ZERO.

Uma condição FALSA possui o valor 0; uma condição verdadeira possui o valor 1.

Por este motivo, se temos um valor igual a ZERO este é considerado FALSO, se temos um valor DIFERENTE DE ZERO temos um valor VERDADEIRO - mesmo que não seja necessariamente 1.

Em C, isso é traduzido através da seguinte notação:

(x == 0) - se X for igual a ZERO, então o valor NÃO é verdadeiro = (!x)
(x != 0) - se X for diferente de ZERO, então o valor de X é verdadeiro = (x).

Estas notações são usadas simplesmente para simplicar =)


Vejamos como podemos utilizar as instruções de controle de fluxo.


1) Instrução If

Como havia dito, esta instrução executa um bloco de códigos somente se uma condição for verdadeira.
Há diversas maneiras de utilizá-la:

A)
Quoteif(condição)
{
instrução1;
instrução2;
instrução3;
...
}

B)
Quoteif(condição)
  instrução;

C)
Quoteif(condição)
{
instrução1;
instrução2;
instrução3;
...
}
else
{
instrução4;
instrução5;
instrução6;
...
}


D)
Quoteif(condição)
 instrução;
else
 outra_instrução;

E)
Quoteif(condição)
{
instrução1;
instrução2;
instrução3;
...
}
else
{
instrução4;
instrução5;
instrução6;
...
}
else if(outra_condição)
{
instrução7;
instrução8;
instrução9;
...
}

F)
Quoteif(condição)
 instrução;
else
 outra_instrução;
else if(outra_condição);
 uma_outra_instrução;

Temos seis maneiras. Veremos cada uma delas:


A)
#include <stdio.h>
int main()
{
int x;
printf("Digite um numero: ");
scanf("%d",&x);

if(x < 10)
{
printf("O numero que voce digitou foi %d\n",x);
printf("Este numero e' menor do que 10");
}

return 0;
}

O que o programa acima faz?

Primeramente, pede a entrada de um número e o armazena na variável "x".
Em seguida, verificamos se o valor é menor do que 10; se afirmativo, mostra o número digitado e diz que ele é menor do que 0; do contrário, simplesmente encerra o programa.

Delimitamos todas as instruções a serem executadas por chaves: { e }  que são chamadas de Brackets.

Quando temos apenas uma instrução a ser executada, podemos simplificar o uso da instrução, como veremos a seguir.

B)

#include <stdio.h>
int main()
{
int x;
printf("Digite um numero: ");
scanf("%d",&x);

if(x < 10)
printf("O numero que voce digitou e' menor do que 10");


return 0;
}

Desta vez, o programa verifica se o número digitado é menor do que 10 e mostra a mensagem notificando.

Uma obsevação muito importante, veja:

if(x < 10)
printf("O numero que voce digitou foi %d\n",x);
printf("O numero que voce digitou e' menor do que 10");

Se você utilizasse o trecho acima, da forma como está, iria se deparar com um problema: mesmo que o valor de "x" seja maior ou igual a 10, a mensagem "O numero que voce digitou e' menor do que 10" sempre seria mostrada. Isso ocorre pois quando não delimitamos as instruções com {} apenas a primeira é executada.

Se você observar bem, notará que caso a condição for falsa (se x for maior ou igual a 10), o programa sempre encerra.
É possível executar uma ou mais instruções ao invés do programa encerrar. Veremos no próximo exemplo.



C)
#include <stdio.h>
int main()
{
int x;
printf("Digite um numero: ");
scanf("%d",&x);

if(x < 10)
{
printf("O numero que voce digitou foi %d\n",x);
printf("Este numero e' menor do que 10");
}
else
{
printf("O numero que voce digitou foi %d\n",x);
printf("Este numero e' maior ou igual do que 10");
}
return 0;
}

Vemos uma diferença notável no código:

else
{
printf("O numero que voce digitou foi %d\n",x);
printf("Este numero e' maior ou igual do que 10");
}

Inicialmente, o programa verifica se o valor de "x" é menor do que 10 e executa duas instruções se, de fato, a condição for verdadeira. Porém, ao invés de encerrar o programa caso a condição seja falsa, o programa mostra o número digitado e diz que ele é maior ou igual a 10.

Note que, novamente, se fizermos algo similar ao exemplo abaixo, teríamos problemas:

if(x < 10)
 printf("O numero que voce digitou foi %d\n",x);
 printf("Este numero e' menor do que 10");
else
 printf("O numero que voce digitou foi %d\n",x);
 printf("Este numero e' maior ou igual do que 10");

No caso acima, o programa sempre mostraria as mensagens:
"Este numero e' menor do que 10"
"Este numero e' maior ou igual do que 10"

Isso ocorre pois as instruções estão fora da estrutura, não delimitadas por {}.

No próximo exemplo, veremos a versão simplificada deste.

D)
#include <stdio.h>
int main()
{
int x;
printf("Digite um numero: ");
scanf("%d",&x);

if(x < 10)
 printf("Este numero e' menor do que 10");
else
 printf("Este numero e' maior ou igual do que 10");


return 0;
}

Desta vez, o programa verifica o valor de "x" e, se for menor que 10, mostra uma mensagem, do contrário, mostra uma outra mensagem.

Às vezes, queremos verificar se uma variável possui algum dos valores definidos, para isso, podemos utilizar a instrução Else If.

E)

#include <stdio.h>
int main()
{
int x;
printf("Digite um numero: ");
scanf("%d",&x);

if(x < 10)
{
printf("O numero que voce digitou foi %d\n",x);
printf("Este numero e' menor do que 10");
}
else if(x==10)
{
printf("O numero que voce digitou foi %d\n",x);
printf("Este numero e'igual do que 10");
}
else
{
printf("O numero que voce digitou foi %d\n",x);
printf("Este numero e' maior do que 10");
}
return 0;
}

Desta vez, verificam-se três condições:

1) Se X é menor que 10;
2) Se X é igual a 10;
3) Se X é maior que 10.

Para cada situação, uma mensagem é mostrada.


F)
#include <stdio.h>
int main()
{
int x;
printf("Digite um numero: ");
scanf("%d",&x);

if(x < 10)
 printf("Este numero e' menor do que 10");
else if(x==10)
 printf("Este numero e'igual do que 10");
else
 printf("Este numero e' maior do que 10");

return 0;
}

Temos acima a versão simplificada do código :).

Como solução, usa-se a instrução Switch.

2) Switch

Utilizamos para executar determinadas instruções dependendo do valor de uma variável ou expressão.
A sintaxe é:

Quoteswitch(variável)
{
case VALOR1:
instrução1;
instrução2;
instrução3;
break;

case VALOR2:
instrução3;
instrução4;
instrução6;
break;

case VALOR3:
instrução7;
instrução8;
instrução9;
break;

default:
instrução10;
instrução11;
instrução12;
}

Vejamos um exemplo:

#include <stdio.h>
int main()
{
int x;
printf("Digite um numero entre 0 e 5: ");
scanf("%d",&x);

switch(x)
{
case 0:
printf("X = 0");
break;

case 1:
printf("X = 1");
break;

case 2:
printf("X = 2");
break;

case 3:
printf("X = 3");
break;

case 4:
printf("X = 4");
break;

case 5:
printf("X = 5");
break;

default:
printf("O numero que voce digitou nao esta' entre 0 e 5\n");
printf("Que feio...");
}

return 0;
}

O programa obtém um número digitado e, para cada valor, exibe uma mensagem. Se o valor digitado não estiver dentre os valores listados, o programa exibe duas mensagens alternativas.

Veja que não é necessário utilizar chaves para delimitar as instruções, como era feito com a instrução If.
Um detalhe a ser observado é que a instrução break foi utilizada para terminar a execução de cada bloco de instruções.

Vamos entender isso melhor:

case 0:
printf("X = 0");
break;

Se o valor for igual a 0, o programa mostra a mensagem "X = 0"  e imediatamente depois interrompe a execução da instrução switch, ou seja, as instruções abaixo não serão executadas:

case 1:
printf("X = 1");
break;

case 2:
printf("X = 2");
break;

case 3:
printf("X = 3");
break;

case 4:
printf("X = 4");
break;

case 5:
printf("X = 5");
break;

default:
printf("O numero que voce digitou nao esta' entre 0 e 5\n");
printf("Que feio...");
}

Ao final do bloco de códigos de cada clásula case, devemos introduzir a instrução break, do contrário, todas as instruções de cada CASE seriam executadas até que o programa se deparasse com o break de algum deles ou o fim do switch. Veja:

switch(x)
{
case 0:
printf("X = 0");

case 1:
printf("X = 1");
break;

Se o valor de X for ZERO, o programa mostraria: "X = 0" e "X = 1", já que não há break após a primeira instrução.
A razão para que as mensagens "X = 2", "X = 3", "X = 4",... sejam mostradas, é que existe a instrução break após as instruções do segundo CASE.

switch(x)
{
case 0:
printf("X = 0");

case 1:
printf("X = 1");

case 2:
printf("X = 2");
break;

Se o valor de X for ZERO, o programa mostraria: "X = 0", "X = 1" e "X = 2".
Se o valor for 1, o programa mostraria: "X = 1" e "X = 2".

switch(x)
{
case 0:
printf("X = 0");

case 1:
printf("X = 1");

case 2:
printf("X = 2");

case 3:
printf("X = 3");

case 4:
printf("X = 4");

case 5:
printf("X = 5");

default:
printf("O numero que voce digitou nao esta' entre 0 e 5\n");
printf("Que feio...");

Agora, TODAS as mensagens seriam mostradas se o valor de X fosse de 0 a 5, salvo sob a condição de que este valor não esteja neste intervalo, quando somente as mensagens dentro da clásula "default" (padrão - nenhum dos valores acima) seriam mostras.


3) While

Executa determinadas instruções enquanto uma condição for verdadeira;

É uma instrução que faz parte do que chamamos de LOOP.
Um loop é a execução de um bloco de códigos que é repetida diversas vezes até que uma condição seja verdadeira.

Há 3 maneiras diferentes de usar o while:

QuoteA)

while(condição)
{
instrução1;
instrução2;
instrução3;
...
}

B)

while(condição)
 instrução;

C)

while(condição);


Vejamos cada uma delas:

#include <stdio.h>
int main()
{
int x;
printf("Digite um numero menor do que 10:");
scanf("%d",&x);

while(x < 10)
{
        printf("%d\n",x);
        x++;
        }
        return 0;
}

O program acima solicita a entrada de um número menor do que 10 e, enquanto este valor for menor do que 10, mostra-o a cada interação do loop.

Veja o trecho:

while(x < 10) // Condição
{
        printf("%d\n",x); // Mostra o valor de X
        x++; // Incrementa X
        }

O programa só iniciaria a execução dos códigos caso o valor de X fosse previamente menor do que 10. Experimente entrar com um valor maior ou igual a 10 e você verá que o programa simplesmente encerra.

Quando fazemos "x++" estamos adicionando ao valor de "x" 1; equivale à operação "x = x+1". Note que é necessário, pois, do contrário, o valor de "x" seria eternamente menor do que 10. Nesta situação, temos um loop infinito - que veremos mais adiante.

Além de incrementar o valor da variável, podemos utilizar: x--; que decrementa o seu valor valor da variável; equivale a x = x-1.


B)

#include <stdio.h>
int maiN()
{
while(1)
 printf("Eu sou um loop infinito");

return 0;
}

Temos um exemplo de loop infinito. Desta vez, temos um programa que mostraria a mensagem "Eu sou um loop infinito" eternamente, ou até você se cansar e fechar o programa, a luz da sua casa cair, sua mãe mandar você desligar o computador...

Note que a instrução executa apena uma instrução.

Quando queremos executar duas ou mais, utilizamos os brackets:

#include <stdio.h>
int tecla; // Para obter a tecla digitada
int main()
{
while(1){
 printf("Pressione X para encerrar!\n");
 tecla = getchar();
 if(tecla == 'X' || tecla == 'x')
   break;
}

return 0;
}

Temos um exemplo um pouco mais elaborado.

Agora, o programa entraria em um loop infinito solicitando o pressionamento da tecla X para encerrar.

Vejamos:

tecla = getchar();
 if(tecla == 'X' || tecla == 'x')
   break;

A função getchar() aguarda o pressionamento de uma tecla e retornar seu valor numérico (ASCII). Armazenamos este retorno na variável X.

Veja que existe um IF dentro da instrução WHILE. Neste, verificamos se a tecla digitada corresponde à tecla X OU à tecla x.
Isso se faz necessário pois o usuário pode digitar X ou x - não é mesmo  ;)

nibbles

Só corrigir alguns errinhos (de digitação provavelmente..)

QuoteFor - utilizada para executar um bloco de códigos, quantas vezes forem necessárias, até que uma condição seja verdadeira - geralmente incrementamos ou decrementamos o valor de uma variável específica a cada interação;

*enquanto a condição for verdadeira...

Quote30 > 20 (30 é menor que 20)

Desta vez, temos um valor FALSE.

*inverteu o sinal só... no caso retornaria TRUE...

QuoteExemplo 1:

x > 10 || x < 20

A condição acima retornaria TRUE caso o valor de "x" fosse maior do que 10 OU menor do que 20.

*não foi muito feliz no exemplo hehe... isso retornaria TRUE sempre... :P




são erros provavelmente de descuido, eu sei que você programa pra caramba, só corrigindo para que o artigo fique mais true xD
já te elogiei por MP... seus artigos são muito bons mesmo, depois eu termino de ler esse
continue postando seus artigos ^^



"A diversão do inteligente é se fingir de burro para aquele que se finge de inteligente."
"ENGENHARIA SOCIAL. Porque não existe patch para a ignorância humana."

Dark_Side

Hi,
Lolz,
realmente, erros feios...
Foram por problemas de digitação,  por falta de atenção e até mesmo por dificuldades minhas :)