Mudanças entre as edições de "MCO018703 2018 2 AULA04"

De MediaWiki do Campus São José
Ir para navegação Ir para pesquisar
 
(30 revisões intermediárias por 2 usuários não estão sendo mostradas)
Linha 2: Linha 2:
  
 
*Aprender sobre funções para controle de de fluxo;
 
*Aprender sobre funções para controle de de fluxo;
*Utilizar o comando de decisão ''if else if''.
+
*Utilizar o comando de decisão ''if else''.
  
=Funções para Controle de Fluxo=
+
=Funções para Controle de Fluxo - Decisão=
  
;if( ): é 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 { e } 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.
+
==if( )==
 +
 
 +
É 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'''.
  
 
<syntaxhighlight lang=c>
 
<syntaxhighlight lang=c>
Linha 15: Linha 17:
  
 
[[imagem:Fig037_MCO018703.jpg|600px|center]]
 
[[imagem:Fig037_MCO018703.jpg|600px|center]]
 +
<center>
 +
Figura 1 - Controle de Fluxo com os comandos '''if''' e '''if...else'''.
 +
</center>
  
;if( )...else: Ao se acrescentar mais um bloco de instruções no loop do comando '''if''' pode-se criar o comando '''if...else''', para fazer um teste novo quando o resultado da expressão for falsa.  
+
==if( )...else==
 +
 
 +
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.  
  
 
<syntaxhighlight lang=c>
 
<syntaxhighlight lang=c>
Linha 24: Linha 31:
 
else {
 
else {
 
   bloco de instruções2; // se "expressão" for falsa, "bloco de instruções2" é executado  
 
   bloco de instruções2; // se "expressão" for falsa, "bloco de instruções2" é executado  
 +
}
 +
</syntaxhighlight>
 +
 +
==if( )...else if( )==
 +
 +
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]]
 +
<center>
 +
Figura 2 - Controle de Fluxo usando os comandos '''if( )...else if( )''' e '''switch...case'''.
 +
</center>
 +
 +
 +
<syntaxhighlight lang=c>
 +
if (expressão1) {
 +
  bloco de comandos1;
 +
}
 +
else if (expressão2) {
 +
  bloco de instruções2;
 +
}
 +
else {
 +
  bloco de comandos3;
 +
}
 +
</syntaxhighlight>
 +
 +
==switch...case==
 +
 +
É 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. 
 +
 +
; switch..,case
 +
<syntaxhighlight lang=c>
 +
switch (expressão) {
 +
  case 1:  bloco de instruções1;
 +
          break;
 +
  case 2:  bloco de instruções2;
 +
          break;
 +
  case 3:  bloco de instruções3;
 +
          break;
 +
  default: bloco de instruções4;
 
}
 
}
 
</syntaxhighlight>
 
</syntaxhighlight>
Linha 29: Linha 75:
 
=Operadores Relacionais e Lógicos=
 
=Operadores Relacionais e Lógicos=
  
Os operadores relacionais e lógicos são os mesmos vistos na aula anterior.
+
Vamos recordar os principais operadores relacionais e lógicos vistos nas aulas anteriores.
  
 
;Relacionais
 
;Relacionais
Linha 73: Linha 119:
 
Ver [http://www.ead.cpdee.ufmg.br/cursos/C/c.html Operadores Relacionais e Lógicos]
 
Ver [http://www.ead.cpdee.ufmg.br/cursos/C/c.html Operadores Relacionais e Lógicos]
  
= Comandos de decisão ''if()'' e ''if() else'' =
+
=Exemplos=
  
Estes comandos são também chamados de <b>Comandos de controle de fluxo</b>.<br>
+
[1] Acender o LED se digitar 1 no monitor serial.
Possibilitam ao programador alterar a sequência de execução de um programa.<br>
 
  
O comando <b>if</b> representa uma tomada de decisão do tipo '''"SE isto ENTÃO aquilo"'''.<br>
+
<syntaxhighlight lang=c>
 
+
byte estebyte; // variável que vai receber o valor do monitor serial
Sua forma geral é:
+
void setup() {
 
+
    pinMode(10, OUTPUT);
<pre>
+
    Serial.begin(9600);
 
 
if (condição) declaração;
 
 
 
</pre>
 
 
 
ou
 
<pre>
 
 
 
if (condição)
 
{
 
  declaração1;
 
  declaração2;
 
 
}
 
}
else
 
{
 
  declaração3;
 
  declaração4;
 
};
 
 
</pre>
 
 
Note o uso das chaves sempre que houver mais de uma declaração e a utilização de identação (tecla TAB no teclado).
 
 
<syntaxhighlight lang=c>
 
 
#include <stdio.h>
 
 
main()
 
{
 
 
  int x; /* declaração de uma variável inteira */
 
  int y;  /* declaração de uma variável inteira */
 
 
  printf ("Entre com o valor de x ");
 
  scanf("%d",&x);
 
 
  printf ("Entre com o valor de y ");
 
  scanf("%d",&y);
 
 
  if (y>x)
 
    printf("MSG1:y é maior que x\n");
 
 
  
  if (y>x)
+
void loop() {
    printf("MSG2:y é maior que x\n");
+
    Serial.println("Digite 1 no Monitor para acender o LED: ");
  else
+
    while(true)
    printf("MSG3:y é igual ou menor que x\n");
+
    {
+
      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>
 
</syntaxhighlight>
  
Outro exemplo, usando blocos:
+
[2] Acende o LED se digitar 1 no monitor serial senão for 1 apaga.
  
<syntaxhighlight lang=c>  
+
<syntaxhighlight lang=c>
#include <stdio.h>
+
byte estebyte; // variável que vai receber o valor do monitor serial
 
+
void setup() {
main()
+
    pinMode(10, OUTPUT);
{
+
    Serial.begin(9600);
 
  int x,y,z; /* declaração de uma variável inteira */
 
 
 
  printf ("Entre com o valor de x ");
 
  scanf("%d",&x);
 
 
 
  printf ("Entre com o valor de y ");
 
  scanf("%d",&y);
 
 
 
  if (y>x)  
 
  {
 
    printf("MSG1: y é maior que x\n");
 
    z = y-x;
 
    printf("MSG2: Neste caso z =  %d\n", z);
 
  }
 
  else
 
  {
 
    printf("MSG3: y é igual ou menor que x\n");
 
    z = x-y;
 
    printf("MSG4: Neste caso z =  %d\n", z);
 
  }
 
 
 
}
 
}
</syntaxhighlight>
 
  
No C, qualquer expressão que resulta em 0 é considerada FALSA e qualquer expressão com valor diferente de 0 é VERDADEIRA.
+
void loop() {
 +
    Serial.println("Digite 1 no Monitor para acender o LED e qualquer outro para apagar: ");
 +
    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
 +
        {
 +
          digitalWrite(10, LOW);
 +
          Serial.println(" LED APAGADO!");
 +
        }
 +
      }//end if
 +
  }//end while
 +
}//end loop
  
Exemplo:
 
<syntaxhighlight lang=c>
 
  if (2)
 
      printf("expressão sempre VERDADEIRA");
 
  if ('2')
 
      printf("expressão sempre VERDADEIRA");     
 
  if (1-1)
 
      printf("expressão sempre FALSA");
 
  if (x=1) /* um erro comum - sinal de atribuição no lugar de == */
 
      printf("expressão sempre VERDADEIRA");
 
 
</syntaxhighlight>
 
</syntaxhighlight>
  
==Indentação==
+
[3] Acende o LED se digitar 1 no monitor serial senão se for 2 apaga.
 
 
É um recuo aplicado ao código fonte de um programa para ressaltar ou definir a estrutura do programa.
 
 
 
 
 
==Exemplo 1==
 
 
 
(sala de aula)
 
 
 
Um funcionário irá receber um aumento de acordo com o seu plano de trabalho (A,B,C e D). <br>
 
A tabela abaixo mostra o plano e o percentual de aumento:
 
 
 
{| border="1" cellpadding="5" cellspacing="0"
 
! style="color:white;background: #1E90FF;" | Plano
 
! style="color:white;background: #1E90FF;" | Percentual
 
|-
 
!style="text-align: center;" | A
 
!style="text-align: center;" | 5%
 
|-
 
!style="text-align: center;" | B
 
!style="text-align: center;" | 10%
 
|-
 
!style="text-align: center;" | C
 
!style="text-align: center;" | 15%
 
|-
 
!style="text-align: center;" | D
 
!style="text-align: center;" | 20%
 
|}
 
 
 
Faça um programa que leia o plano de trabalho e o salário atual de um funcionário<br>
 
em seguida calcule e imprima o seu novo salário. Use o comando ''switch''.
 
  
==Exemplo 2==
 
 
(sala de aula)
 
 
Suponha que você atrasou uma conta. A cada mês que você deixa de pagar, será cobrado 1% de juros no valor inicial.
 
Ou seja, se você atrasar um mês, irá pagar 1%. Se atrasar 3 meses, irá pagar 3%.
 
Vamos supor que você pode atrasar, no máximo, 5 meses.
 
 
O programa pede, como entrada, dois valores:
 
- um float: com o valor de sua dívida inicial (valor_i)
 
- um inteiro: de 0 até 5, que são o número de meses de atraso.
 
 
Faça um programa em C que calcule os juros (simples) de atraso.
 
 
=Exercícios propostos=
 
 
<!--
 
#Implementar um programa C que converte temperaturas de graus Fahrenheit para Celsius.
 
<syntaxhighlight lang=c>
 
#include <stdio.h>
 
float converter_fahreiheit_para_celsius (float temp_fahr)
 
{
 
  /* melhorar - retornar -1000 se o valor do parâmetro for inválido */
 
  return ((temp_fahr-32)/1.8);
 
}
 
 
main()
 
{
 
  float temperatura_fahre, resultado_celsius;
 
  printf("Entre com graus Fahrenheit -> ");
 
  scanf ("%f", &temperatura_fahre);
 
  resultado_celsius = converter_fahreiheit_para_celsius(temperatura_fahre);
 
  printf("Conversao = %f\n", resultado_celsius);
 
}
 
</syntaxhighlight>
 
-->
 
#Implementar um programa que lê um número inteiro e imprime se o número é par ou ímpar. SUGESTÃO: Usar o operador de módulo da divisão.
 
#Implementar um programa em C para ler dois números inteiros e imprimir uma mensagem indicando se os números lidos são iguais ou diferentes. Caso sejam diferentes, computar a média dos mesmos.
 
<!--
 
 
<syntaxhighlight lang=c>
 
<syntaxhighlight lang=c>
main()
+
byte estebyte; // variável que vai receber o valor do monitor serial
{
+
void setup() {
  int x,y;
+
    pinMode(10, OUTPUT);
  float media;
+
    Serial.begin(9600);
 
 
  printf("Entre com x\n");
 
  scanf("%d",&x);
 
  printf("Entre com y\n");
 
  scanf("%d",&y);
 
  if (x==y)
 
    printf("números iguais\n");
 
  else {
 
    printf("números diferentes\n");
 
    media = (x+y)/2.0;
 
  }
 
 
}
 
}
</syntaxhighlight>
 
-->
 
#Implementar um programa para ler 4 números inteiros e imprimir uma mensagem se a soma dos dois primeiros for igual ou menor a soma dos dois últimos.
 
<!--<syntaxhighlight lang=c>
 
main()
 
{
 
  int num1,num2,num3,num4;
 
  int soma1,soma2;
 
  
  printf("Entre com num1\n");
+
void loop() {
  scanf("%d", &num1);
+
    Serial.println("Digite 1 no Monitor para acender o LED e digite 2 para apagar o LED: ");
  printf("Entre com num2\n");
+
    while(true)
  scanf("%d", &num2);
+
    {
  printf("Entre com num3\n");
+
      if(Serial.available() > 0)
  scanf("%d", &num3);
+
      {
  printf("Entre com num4\n");
+
        estebyte = Serial.read();
   scanf("%d", &num4);
+
        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
  
  soma1 = num1+num2;
 
  soma2 = num3+num4;
 
 
 
  if(soma1<=soma2)
 
      printf("Soma dos dois primeiros <= que a soma dos dois últimos\n");
 
}
 
 
</syntaxhighlight>
 
</syntaxhighlight>
-->
 
#Implementar um programa para ler dois números reais e, na sequência, um número inteiro. Se o número inteiro for 1 os dois números iniciais deverão ser somados, se for 2 eles serão subtraídos, se for 3 eles serão multiplicados e se for 4 serão divididos. Mostrar mensagem de erro se o número inteiro não estiver na faixa de 1 a 4. Mostrar mensagem caso a divisão não seja possível.
 
<!--
 
<syntaxhighlight lang=c>
 
main()
 
{
 
  float num1,num2;
 
  int operacao;
 
 
  printf("Entre com num1\n");
 
  scanf("%f", &num1);
 
  printf("Entre com num2\n");
 
  scanf("%f", &num2);
 
 
  printf("Entre com a operacao\n");
 
  scanf("%d", &operacao); 
 
 
  /* Esta solução pode ser otimizada - veremos
 
      mais tarde */
 
  if (operacao>=1 && operacao <=4) {
 
      if (operacao==1)
 
        resultado = num1 + num2;
 
      if (operacao==3)
 
        resultado = num1 - num2;
 
      if (operacao==3)
 
        resultado = num1 * num2;
 
      if (operacao==4) {
 
        if (num2!=0)
 
            resultado = num1 / num2;
 
        else
 
            printf("Divisao por zero\n");
 
      }
 
      printf("O resultado da operacao %d é %f\n",operacao,resultado);
 
  } else {
 
      printf("Operacao inválida");
 
  }
 
}
 
</syntaxhighlight>
 
-->
 
#Um estudo sobre sensibilidade de pessoas a temperaturas da água identificou que a maioria das pessoas considera fria a água com temperaturas abaixo de 25 graus, morna entre 25 e 30 graus, e quente acima de 30 graus. Escreva um algoritmo na forma de fluxograma que mostre as palavras "fria", "morna" ou "quente" dependendo da temperatura da água que for informada. Implemente um programa C.
 
#Implementar um programa C para converter um ângulo em radianos para graus.
 
 
 
 
  
 +
[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.
  
 
-----
 
-----

Edição atual tal como às 19h37min de 27 de agosto de 2018

Objetivos

  • Aprender sobre funções para controle de de fluxo;
  • Utilizar o comando de decisão if else.

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

if( )

É 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.

if (expressão){
   bloco de instruções; // se "expressão" for verdadeira, "bloco de instruções" é executado
}
Fig037 MCO018703.jpg

Figura 1 - Controle de Fluxo com os comandos if e if...else.

if( )...else

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.

if (expressão) {
   bloco de instruções1; // se "expressão" for verdadeira, "bloco de instruções1" é executado
}
else {
   bloco de instruções2; // se "expressão" for falsa, "bloco de instruções2" é executado 
}

if( )...else if( )

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.

Fig038 MCO018703.jpg

Figura 2 - Controle de Fluxo usando os comandos if( )...else if( ) e switch...case.


if (expressão1) {
   bloco de comandos1; 
}
else if (expressão2) {
   bloco de instruções2; 
}
else {
   bloco de comandos3; 
}

switch...case

É 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.

switch..,case
switch (expressão) {
  case 1:  bloco de instruções1; 
           break;
  case 2:  bloco de instruções2; 
           break;
  case 3:  bloco de instruções3; 
           break;
  default: bloco de instruções4; 
}

Operadores Relacionais e Lógicos

Vamos recordar os principais operadores relacionais e lógicos vistos nas aulas anteriores.

Relacionais
Operador Significado
> maior que
>= maior ou igual que
< menor que
<= menor ou igual que
== igual a
!= diferente de


Lógicos
Operador Significado
&& AND (E)
|| OR (OU)
! NOT (NÃO)

Ver Operadores Relacionais e Lógicos

Exemplos

[1] Acender o LED se digitar 1 no monitor serial.

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: ");
    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

[2] Acende o LED se digitar 1 no monitor serial senão for 1 apaga.

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 qualquer outro para apagar: ");
    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
        {
          digitalWrite(10, LOW);
          Serial.println(" LED APAGADO!");
        }
      }//end if
   }//end while
}//end loop

[3] Acende o LED se digitar 1 no monitor serial senão se for 2 apaga.

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

[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.


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