Mudanças entre as edições de "MCO018703 2020 1 AULA05"

De MediaWiki do Campus São José
Ir para navegação Ir para pesquisar
 
(4 revisões intermediárias pelo mesmo usuário não estão sendo mostradas)
Linha 1: Linha 1:
=Objetivos=
+
=Objetivo=
  
*Aprender sobre funções para controle de de fluxo;
+
*Aprender sobre o comando de repetição ''while'' controlado por condição;
*Utilizar o comando de decisão ''if else''.
+
*Saber usar o comando ''while'' e ''do while''.
  
=Funções para Controle de Fluxo - Decisão=
+
=Funções para Controle de Fluxo - Repetição=
  
==if( )==  
+
==while( )==
  
É um controle de fluxo usado para selecionar uma ou mais instruções baseado no resultado de um teste de comparação. Todas as instruções entre as chaves { } são executadas somente se o resultado desse teste for verdadeiro; se não, essas instruções não são executadas. Verdadeiro é qualquer resultado, mesmo negativo, diferente de zero. Falso é um resultado zero. A Figura 1 mostra o controle de fluxo utilizando os comandos '''if''' e '''if...else'''.
+
Uma das operações mais frequentes que os programas executam é repetir um grupo de instruções até que uma condição inicialmente verdadeira se torne falsa. É para isso que serve o comando '''while'''. A sua sintaxe é a seguinte:
  
 
<syntaxhighlight lang=c>
 
<syntaxhighlight lang=c>
if (expressão){
+
while (expressão) {
   bloco de instruções; // se "expressão" for verdadeira, "bloco de instruções" é executado
+
   bloco de instruções;    
 
}
 
}
 
</syntaxhighlight>
 
</syntaxhighlight>
  
[[imagem:Fig037_MCO018703.jpg|600px|center]]
+
O bloco de instruções será executado enquanto o parâmetro expressão for verdadeiro. A Figura 1 mostra o comando '''while''' e '''do while'''.
 +
 
 +
[[imagem:Fig039_MCO018703.jpg|600px|center]]
 
<center>
 
<center>
Figura 1 - Controle de Fluxo com os comandos '''if''' e '''if...else'''.
+
Figura 1 - Controle de Fluxo com os comandos '''while''' e '''do while'''.
 
</center>
 
</center>
  
==if( )...else==
+
;Exemplo 1
  
Ao se acrescentar mais um bloco de instruções no loop do comando '''if''' pode-se criar o comando '''if...else''' (Figura 1), para fazer um novo teste quando o resultado da expressão for falsa.  
+
O exemplo abaixo mostra como o comando ''while'' permite implementar loops com controle no início.
  
 
<syntaxhighlight lang=c>
 
<syntaxhighlight lang=c>
if (expressão) {
+
int contador;
   bloco de instruções1; // se "expressão" for verdadeira, "bloco de instruções1" é executado
+
void setup( )  
 +
{
 +
   Serial.begin(9600); // inicializa a porta serial
 +
}
 +
void loop( )
 +
{
 +
  contador=0;
 +
  while (contador<5) { 
 +
    Serial.print("valor do contador: "); // imprime o texto entre ""
 +
    Serial.println(contador); // imprime o valor do contador
 +
    contador=contador+1;
 +
    delay(500);
 +
  }
 
}
 
}
else {
+
</syntaxhighlight>
   bloco de instruções2; // se "expressão" for falsa, "bloco de instruções2" é executado
+
 
 +
==do...while==
 +
 
 +
Para que o bloco de instruções seja executado ao menos uma vez, ele é  deslocado para a entrada da caixa de decisões, antes do teste de validade:
 +
 
 +
<syntaxhighlight lang=c>
 +
do {
 +
   bloco de instruções;                              
 
}
 
}
 +
while (expressão);
 
</syntaxhighlight>
 
</syntaxhighlight>
  
==if( )...else if( )==
+
Aqui o "bloco de instruções" será executado primeiro e só então o parâmetro "expressão" é avaliado. Veja na Figura 1.
  
E de novo ao se acrescentar agora o comando '''if...else''' no loop do comando '''if''' pode-se criar mais um outro comando, o '''if...else if'''. No exemplo abaixo se "expressão1" for verdadeira o "bloco de instruções1" é executado; se "expressão1" for falsa mas "expressão2" for verdadeira "bloco de instruções2" é executado; e se "expressão1" e "expressão2" forem falsas o "bloco de instruções3"  é executado. A Figura 2 mostra os comandos '''if( )...else if( )''' e '''switch...case'''.
 
  
[[imagem:Fig038_MCO018703.jpg|600px|center]]
+
;Exemplo 2
<center>
 
Figura 2 - Controle de Fluxo usando os comandos '''if( )...else if( )''' e '''switch...case'''.
 
</center>
 
  
 +
Nesta variação do comando '''do while''' permite a repetição de uma ou mais instruções, com controle do loop no final.
 +
Isto permite que o bloco seja executado pelo menos uma vez.
  
 
<syntaxhighlight lang=c>
 
<syntaxhighlight lang=c>
if (expressão1) {
+
int contador;
   bloco de comandos1;
+
void setup( )  
}
+
{
else if (expressão2) {
+
   Serial.begin(9600); // inicializa a porta serial
  bloco de instruções2;  
 
 
}
 
}
else {
+
void loop( )
  bloco de comandos3;  
+
{
 +
  contador=0;
 +
  do {
 +
    Serial.print("valor do contador: "); // imprime o texto entre ""
 +
    Serial.println(contador); // imprime o valor do contador
 +
    contador=contador+1;
 +
    delay(500);
 +
  } while (contador<5);
 
}
 
}
 
</syntaxhighlight>
 
</syntaxhighlight>
  
==switch...case==  
+
==for==
  
É possível ir inserindo comandos  '''if...else '''na posição do segundo bloco de instruções de outro comando '''if...else '''e assim criar uma cadeia de comandos para testar dezenas de expressões até encontrar uma que retorne um resultado verdadeiro e executar um dos blocos de instruções; mas existe um comando próprio que simplifica bastante essa seleção, é o comando '''switch...case''' (Figura 2). Esse comando permite comparar uma mesma variável inteira, ou uma expressão que retorne um inteiro, com vários valores possíveis.
+
Inserindo-se no loop do comando '''while''' um contador que registre cada execução do bloco de instruções cria-se o comando for. Esse contador deve ter uma variável de controle que deve ser previamente inicializada com um tipo e um valor. A sua sintaxe é a seguinte:
  
; switch..,case
 
 
<syntaxhighlight lang=c>
 
<syntaxhighlight lang=c>
switch (expressão) {
+
for (variável;expressão;incremento) {
  case 1:  bloco de instruções1;
+
  bloco de instruções;  
          break;
 
  case 2:  bloco de instruções2;
 
          break;
 
  case 3:  bloco de instruções3;
 
          break;
 
  default: bloco de instruções4;  
 
 
}
 
}
 
</syntaxhighlight>
 
</syntaxhighlight>
  
=Operadores Relacionais e Lógicos=
+
A '''variável''' é inicializada normalmente com 0 ou 1; o parâmetro '''expressão''' deve conter o valor máximo
 +
(ou mínimo) que o contador deve alcançar; e '''incremento''' é o valor que será incrementado (ou decrementado) da variável cada vez que o bloco de instruções é executado. Observe que cada parâmetro entre parênteses é separado por ponto e vírgula.
  
Vamos recordar os principais operadores relacionais e lógicos vistos nas aulas anteriores.
+
[[imagem:Fig040_MCO018703.jpg|300px|center]]
 
+
<center>
;Relacionais
+
Figura 2 - Controle de Fluxo com o comando '''for'''.
{| border="1" cellpadding="5" cellspacing="0"
+
</center>
! style="color:white;background: #D2691E;" | Operador
 
! style="color:white;background: #D2691E;" | Significado
 
|-
 
!style="text-align: center;" | >
 
| maior que
 
|-
 
!style="text-align: center;" | >=
 
|maior ou igual que
 
|-
 
!style="text-align: center;" | <
 
|menor que
 
|-
 
!style="text-align: center;" | <=
 
|menor ou igual que
 
|-
 
!style="text-align: center;" | ==
 
|igual a
 
|-
 
!style="text-align: center;" | !=
 
|diferente de  
 
|}
 
 
 
 
 
;Lógicos
 
{| border="1" cellpadding="5" cellspacing="0"
 
! style="color:white;background: #D2691E;" | Operador
 
! style="color:white;background: #D2691E;" | Significado
 
|-
 
!style="text-align: center;" |&&
 
|AND (E)
 
|-
 
!style="text-align: center;" |<nowiki>||</nowiki>
 
|OR (OU)
 
|-
 
!style="text-align: center;" |!
 
|NOT (NÃO)
 
|}
 
 
 
Ver [http://www.ead.cpdee.ufmg.br/cursos/C/c.html Operadores Relacionais e Lógicos]
 
  
=Exemplos=
+
;Exemplo 3
  
[1] Acender o LED se digitar 1 no monitor serial.
+
No código abaixo a variável de controle '''i''' do contador criada e inicializada com 0; o contador é testado e se o valor nele acumulado for menor que 10 seu valor é enviado para o Terminal, e depois de 1 segundo, o contador é incrementado e seu novo valor é testado novamente.
  
 
<syntaxhighlight lang=c>
 
<syntaxhighlight lang=c>
byte estebyte; // variável que vai receber o valor do monitor serial
+
void setup( )
void setup() {
+
{
    pinMode(10, OUTPUT);
+
  Serial.begin(9600); // inicializa a porta serial  
    Serial.begin(9600);
+
}
 +
void loop( )  
 +
{
 +
  for (int i=0; i < 10; i++)
 +
    Serial.println(i); // imprime o valor de i
 +
    delay(1000);  
 +
  }
 
}
 
}
 +
</syntaxhighlight>
  
void loop() {
+
;Exemplo 4
    Serial.println("Digite 1 no Monitor para acender o LED: ");
 
    while(true)
 
    {
 
      if(Serial.available() > 0)
 
      {
 
        estebyte = Serial.read();
 
        if(estebyte == '1') // Digitou 1 no Monitor Serial
 
        {
 
          digitalWrite(10, HIGH);
 
          Serial.println(" LED ACESO!");
 
        }
 
      }//end if
 
  }//end while
 
}//end loop
 
 
 
</syntaxhighlight>
 
  
[2] Acende o LED se digitar 1 no monitor serial senão for 1 apaga.
+
No código abaixo vemos um exemplo de dois loops aninhados. Enquanto '''i''' conta as linhas '''j''' conta as colunas.
  
 
<syntaxhighlight lang=c>
 
<syntaxhighlight lang=c>
byte estebyte; // variável que vai receber o valor do monitor serial
+
int i,j; // i e j são variáveis inteiras
void setup() {
+
 
    pinMode(10, OUTPUT);
+
void setup( )  
    Serial.begin(9600);
+
{
 +
  Serial.begin(9600); // inicializa a porta serial
 
}
 
}
 
+
void loop( )  
void loop() {
+
{
    Serial.println("Digite 1 no Monitor para acender o LED e qualquer outro para apagar: ");
+
  for (i=0;i<13;i++) {
    while(true)
+
         for (j=0;j<=i;j++) {
    {  
+
           Serial.print('*'); // imprime um asterisco
      if(Serial.available() > 0)
+
           delay(100);  
      {  
 
         estebyte = Serial.read();
 
        if(estebyte == '1') // Digitou 1 no Monitor Serial
 
        {  
 
          digitalWrite(10, HIGH);
 
           Serial.println(" LED ACESO!");
 
        }
 
        else
 
        {
 
           digitalWrite(10, LOW);
 
          Serial.println(" LED APAGADO!");
 
 
         }
 
         }
      }//end if
+
        Serial.println(); // pula uma linha
   }//end while
+
        delay(50);
}//end loop
+
   }
 
+
}
 
</syntaxhighlight>
 
</syntaxhighlight>
  
[3] Acende o LED se digitar 1 no monitor serial senão se for 2 apaga.
+
=Referências=
 
 
<syntaxhighlight lang=c>
 
byte estebyte; // variável que vai receber o valor do monitor serial
 
void setup() {
 
    pinMode(10, OUTPUT);
 
    Serial.begin(9600);
 
}
 
 
 
void loop() {
 
    Serial.println("Digite 1 no Monitor para acender o LED e digite 2 para apagar o LED: ");
 
    while(true)
 
    {
 
      if(Serial.available() > 0)
 
      {
 
        estebyte = Serial.read();
 
        if(estebyte == '1') // Digitou 1 no Monitor Serial
 
        {
 
          digitalWrite(10, HIGH);
 
          Serial.println(" LED ACESO!");
 
        }
 
        else if(estebyte == '2') // Digitou 2 no Monitor Serial
 
        {
 
          digitalWrite(10, LOW);
 
          Serial.println(" LED APAGADO!");
 
        }
 
      }//end if
 
  }//end while
 
}//end loop
 
 
 
</syntaxhighlight>
 
  
[4] Desafio: Acrescente mais um LED no seu experimento e, utilizando o comando '''switch..case''', crie todas as possibilidades de acender e apagar os dois LEDs.
+
[1] http://linguagemc.com.br/comando-do-while/
  
  

Edição atual tal como às 16h45min de 19 de março de 2020

Objetivo

  • Aprender sobre o comando de repetição while controlado por condição;
  • Saber usar o comando while e do while.

Funções para Controle de Fluxo - Repetição

while( )

Uma das operações mais frequentes que os programas executam é repetir um grupo de instruções até que uma condição inicialmente verdadeira se torne falsa. É para isso que serve o comando while. A sua sintaxe é a seguinte:

while (expressão) {
   bloco de instruções;     
}

O bloco de instruções será executado enquanto o parâmetro expressão for verdadeiro. A Figura 1 mostra o comando while e do while.

Fig039 MCO018703.jpg

Figura 1 - Controle de Fluxo com os comandos while e do while.

Exemplo 1

O exemplo abaixo mostra como o comando while permite implementar loops com controle no início.

int contador;
void setup( ) 
{
   Serial.begin(9600); // inicializa a porta serial 
}
void loop( ) 
{
  contador=0;
  while (contador<5) {  
     Serial.print("valor do contador: "); // imprime o texto entre ""
     Serial.println(contador); // imprime o valor do contador
     contador=contador+1;
     delay(500);
  }
}

do...while

Para que o bloco de instruções seja executado ao menos uma vez, ele é deslocado para a entrada da caixa de decisões, antes do teste de validade:

do {
   bloco de instruções;                                
}
while (expressão);

Aqui o "bloco de instruções" será executado primeiro e só então o parâmetro "expressão" é avaliado. Veja na Figura 1.


Exemplo 2

Nesta variação do comando do while permite a repetição de uma ou mais instruções, com controle do loop no final. Isto permite que o bloco seja executado pelo menos uma vez.

int contador;
void setup( ) 
{
   Serial.begin(9600); // inicializa a porta serial 
}
void loop( ) 
{
  contador=0;
  do {  
     Serial.print("valor do contador: "); // imprime o texto entre ""
     Serial.println(contador); // imprime o valor do contador
     contador=contador+1;
     delay(500); 
  } while (contador<5);
}

for

Inserindo-se no loop do comando while um contador que registre cada execução do bloco de instruções cria-se o comando for. Esse contador deve ter uma variável de controle que deve ser previamente inicializada com um tipo e um valor. A sua sintaxe é a seguinte:

for (variável;expressão;incremento) {
   bloco de instruções; 
}

A variável é inicializada normalmente com 0 ou 1; o parâmetro expressão deve conter o valor máximo (ou mínimo) que o contador deve alcançar; e incremento é o valor que será incrementado (ou decrementado) da variável cada vez que o bloco de instruções é executado. Observe que cada parâmetro entre parênteses é separado por ponto e vírgula.

Fig040 MCO018703.jpg

Figura 2 - Controle de Fluxo com o comando for.

Exemplo 3

No código abaixo a variável de controle i do contador criada e inicializada com 0; o contador é testado e se o valor nele acumulado for menor que 10 seu valor é enviado para o Terminal, e depois de 1 segundo, o contador é incrementado e seu novo valor é testado novamente.

void setup( ) 
{
   Serial.begin(9600); // inicializa a porta serial 
}
void loop( ) 
{
   for (int i=0; i < 10; i++) {   
     Serial.println(i); // imprime o valor de i 
     delay(1000);    
   }
}
Exemplo 4

No código abaixo vemos um exemplo de dois loops aninhados. Enquanto i conta as linhas j conta as colunas.

int i,j; // i e j são variáveis inteiras

void setup( ) 
{
   Serial.begin(9600); // inicializa a porta serial 
}
void loop( ) 
{
  for (i=0;i<13;i++) {
        for (j=0;j<=i;j++) {
          Serial.print('*'); // imprime um asterisco 
          delay(100);    
        }
        Serial.println(); // pula uma linha
        delay(50);
   }
}

Referências

[1] http://linguagemc.com.br/comando-do-while/



Icone voltar.png Icone menu.png Icone prox.png