AULA 10 - Microcontroladores - Técnico

De IFSC
Revisão de 14h11min de 16 de novembro de 2016 por imported>Fargoud (→‎A INSTRUÇÃO IF-ELSE)
Ir para navegação Ir para pesquisar

Considera-se comando válido em C, qualquer expressão válida, seguida por um ponto-e-vírgula (;), ou expressão entre chaves ({}). Ex:

  a = 5; 

Neste capítulo, entretanto, trataremos de comandos de controle de fluxo.

Pode-se dividir os comandos de controle de fluxo do C, em três categorias:

  • instruções condicionais (if e switch),
  • comandos de controle de loop (while, for e do-while) e
  • instrução de desvio incondicional (goto).

A INSTRUÇÃO IF

A forma geral da declaração if é:

if(condição_de_teste)
 comando;

A interpretação é:

"Se a condição_de_teste for verdadeira (não-zero), executa comando". 

Caso contrário, a execução é transferida para a instrução seguinte ao comando if.

Ex:

   if (x==5)  y=3;   

Se comando contiver mais de uma instrução, o bloco deve ser colocado entre chaves ( {} ):

if(condição_de_teste)
{   comando1;
    comando2;
    comando3;
    ...
}


A INSTRUÇÃO IF-ELSE

A forma geral da declaração if-else é:

    if(condição_de_teste)   
       comando1;
   else	
       comando2;

A interpretação é: "Se a condição_de_teste for verdadeira (não-zero), executa comando1, Senão, executa comando2". Ex:

            if ( x < 6)   
                     y = 1;
            else
                     y = 2;     

Os comandos if e if-else podem ser aninhados!!! Isto ocorre quando uma série de testes sucessivos tem que ser feita, para fazer-se a escolha da instrução a ser executada. A sintaxe pode ser tal como:

if(condição1) if(condição2)

                		comando1;  //instrução executada quando condição1 e condição2 forem V
               	else
       			comando2;  //instrução executada quando condição1 for V e condição2 for F

else

if(condição3)

                		comando3;  //instrução executada quando condição1 for F e condição3 for V
               	else
       			comando4; //instrução executada quando condição1 e condição3 forem F


Exercício: Um professor de educação física especificou a tabela abaixo que define o tempo de treinamento para alunos do sexo feminino e masculino, jovens ou adultos. Escreva o programa que implementa a tabela abaixo, isto é, lê a idade e sexo do usuário e devolve o tempo de treinamento recomendado.

Sexo: Idade: Feminino Masculino  30 anos t = 15’ t = 45’ > 30 anos t = 25’ t = 60’


Mas há que se ter cuidado com o que é interno, o que é externo e a qual if pertence cada else e com a endentação!!!!! Ex: O algoritmo: é diferente de: e de: e de: ...

          if ( i > 2)                                                            
          if ( i > 2)                                                            
if (i > 2);

if (i > 2)

                if ( j == 3)              
          {        if( j == 3)
if( j == 3)

{ if( j == 3);

                        y = 4;                                                             
               y = 4;
       y = 4;
          y = 4;
                else  y = 5;                                                     
           } else y = 5;   
else y = 5;
} else y = 5;

No primeiro caso, o else refere-se ao if mais interno e no segundo caso, ao if externo, pelo uso das chaves. No terceiro caso e no quarto casos, o ponto-e-vírgula “terminou” a instrução if, antes que esta executasse qualquer comando interno.

Obs:

            if (a > b)   c = a;                                 
            else           c = b;           É equivalente a:        c = ( a > b ) ? a : b ;    

Obs2: Em expressões condição_de_teste não-relacionais deve-se tomar cuidado:

           if (i == 3)  y = 5;  		® se i for igual a 3, y igual a 5
           if (i = 3)    y = 5;  		® se i=3 for não zero , y igual a 5 (i=3 é TRUE).

Obs3:

           if ( i != 0)  y = 3;    é equivalente a       if (i) y = 3;  


Exercício:

Crie um programa de adivinhação, utilizando os comandos if e if-else. O programa pede um número ao usuário, verifica se este é igual ao número mágico (previamente definido) e imprime " ** Certo **", caso a pessoa tenha acertado ou " ** O número mágico é maior que .... ** " o número que a pessoa digitou, ou ainda " ** O número mágico é menor que ... ** " o número digitado.

Exemplos

/**********************************************************************/ /*** Programa 1: Exemplo de Conversão Automática **/ /**********************************************************************/

  1. include <stdio.h>

void main(void) {

      char ch;
      int i;
      float fl;
     fl = i = ch = 'A';                                                            // o caractere 'A' é armazenado 
     printf("ch = %c, i = %d, fl = %2.2f \n", ch, i, fl);         // como 65 (em i) e 65.00 (em fl)
     ch = ch + 1;                                                                // converte ch para int, soma 1 e reconverte para char
     i = fl + 2 * ch;      // converte ch para int, multiplica 2, transforma em float, soma a fl e  converte para int 
     fl = 2.0 * ch + i;                               // converte ch em float, multiplica por 2.0, i é convertido em float  e
     printf("ch = %c, i = %d, fl = %2.2f \n", ch, i, fl);          //somado a ch, o resultado é armazenado em fl
     ch = 5212205.17;                                                          // o valor excede 8 bits, portanto é truncado e o código 
     printf ("Agora ch = %c\n", ch);                                     //ASCII é armazenado em ch

}


/**********************************************************************/ /*** Programa 2: Demonstrar Conversão Forçada de Dados (Cast) ******/ /**********************************************************************/

  1. include <stdio.h>

void main(void) { int valor1, valor2;

        valor1 = 1.6 + 1.7;
   valor2 = (int) 1.6 + (int) 1.7;
   printf("valor1 = %d\n", valor1);
   printf("valor2 = %d\n", valor2);

}

/**********************************************************************/ /*** Programa 3: Demonstrar Estrutura IF - ELSE ****/ /**********************************************************************/ /* Este programa localiza a percentagem de dias abaixo gelados!! */

  1. include <stdio.h>
  2. define ESCALA "celsius"
  3. define GELANDO 0

int main(void) {

   float temperatura;
   int gelando = 0;
   int dias =0;
   
   printf("Entre com a relacao das temperatura dos dias gelados.\n");
   printf("Use escala %s, e entre s para sair.\n", ESCALA);
   while (scanf("%f", &temperatura) == 1)
   {     dias++;
          if(temperatura < GELANDO)
              gelando++;
   }
   if (dias!=0)
       printf("Do total de %d dias: %.1f\% foram abaixo de zero.\n", dias, 100.0*(float) gelando/dias);
   else
       printf("Nao foi fornecido nenhum dado!\n");
  return 0;

}


8.3 - O COMANDO WHILE

A forma geral da declaração while é:

while( expressão_de_teste) comando;

A interpretação é: "Enquanto expressão_de_teste for verdadeira; execute comando". No momento em que expressão_de_teste deixa de ser não-zero, a execução continua na linha de comando seguinte ao laço while. Se houver vários comandos internos ao loop while, estes devem estar entre chaves ({ }). Ex:

         i=0;

... while(i < 10)

         {   a = b * 2;
             chama_função( );
             i++;
          } 

É importante salientar que se a expressão_de_teste não for verdadeira já no primeiro teste do laço este não será executado nenhuma vez e que o comando while é mais apropriado para laços onde o número de interações não é conhecido de antemão. Por exemplo, como saber quantas vezes o usuário vai digitar caracteres para um número ou uma string de entrada? Ex:

  1. include <stdio.h>
  #include <conio.h>
   void main(void)
  { int cont=0;
    printf("Digite uma frase: \n");
    while(getche()!= 13)          /* O caractere com ASCII igual a 13 é a tecla enter (return) */
        cont++;
    printf("\nO numero de caracteres é %d", cont); } 

Ex2:

i = 0;                                                                 i = 5;

... while (i<5) É equivalente a ... while (i)

      i++; ...                                                           i--;  ...


8.4 - O COMANDO DO-WHILE

A forma geral da declaração do-while é:

           do 
                 comando;
             while(expressão_de_teste);   
   

A interpretação é: "Faça comando enquanto expressão_de_teste for verdadeira".O comando do-while faz quase o mesmo que o while, com a diferença que no primeiro, o loop é executado pelo menos uma vez, já que o teste da expressão é feito no final da interação. Ou seja, se expressão_de_teste for falsa já na primeira interação, comando é executado uma vez e em seguida a execução continua fora do loop, na próxima linha de comando. Caso expressão_de_teste seja verdadeira, comando será executado até que esta se torne falsa.

Exercício:

Adapte o programa do número mágico, para uso com estrutura do-while.


8.5 - O COMANDO FOR

A forma geral da declaração for é:

          for(inicialização;teste;incremento)
                   comando;

Em sua forma mais simples, inicialização é uma instrução de atribuição (p.e.: i = 0) e é sempre executada uma única vez antes do laço ser inicializado. O teste é uma instrução condicional que controla o laço. Comando será executado até que teste seja falso. A expressão de incremento (ou decremento) define a maneira como a variável de controle do laço será alterada a cada interação. Ex:

  for( i = 0; i < 5; i++)               ®   Para i de 0 até 4: 
       j++;                                               incrementa j a cada interação e incrementa i
  for(i = 5; i > 0; i--)	   ®   Para i de 5 até 0:

j = j * 2; novo valor de j é j * 2 e decrementa i

  for(;;)  { ... }                                ®   Loop eterno
  for(i = 0; i< 5; i++)                        É equivalente a           for (i = 0; i< 5; j++, i++);"
        j++; 

Exercícios

1 - Faça um programa que imprima os números de 1 a 10, utilizando:
     a)  comando while,
     b)  comando do-while,
     c)  comando for.

2 - Faça um programa que imprima os números de 0 a 9, de 2 em 2, utilizando o comando for. 3 - Faça um programa que imprima o fatorial de um número solicitado ao usuário, utilizando o comando while.


8.8 - O COMANDO SWITCH

A forma geral da declaração switch é:

switch (exp_int)

              {    case rot1: 
                                    cmd1    
                   case rot2: 
                                   cmd2
                   ...
                   default:
                                   cmdn
               }
  • Os comandos cmd1, cmd2, etc e a declaração default são opcionais no bloco.

Este comando testa o valor da expressão inteira exp_int, comparando-a com rot1, rot2, etc, até encontrar um rótulo que se iguale. Quando encontra, começa a executar de cima para baixo os comandos cmd1, cmd2, etc, até o final do bloco. Se não encontra, executa o comando do bloco default, cmdn.

Ex: switch (i)

           {   case 1:  j = j + 5;
                case 2:  
                case 3:  j = j + 3;   }  
   
             Valor de i                                Comandos executados
                  1                                            j = j + 5;   e  j = j + 3;
               2 ou 3                                        j = j + 3;
          qualquer outro                                 nenhum.

Utiliza-se a instrução break para que apenas o comando referente a cada rótulo seja executado. Ex: switch ( i )

          { case 1:   j = j + 5;
                         break;
            case 2:   
            case 3:   j = j + 3;
                          break;
             default:  j = j+ 1;    }
            Valor de i                               Comandos executados
                    1                                           j = j + 5;
                2 ou 3                                       j = j + 3;
          qualquer outro                                j = j + 1;


Exercícios

/*************************************************************************/ /**** Programa que imprime números de 1 a 10 utilizando laço while: *****/ /************************************************************************/

  1. include <stdio.h>

void main(void) { int contador = 1;

  while (contador <= 10)
  {    printf("%d\n", contador);
       contador++;
  }

}


/*************************************************************************/ /**** Programa que imprime números de 1 a 10 utilizando laço do-while ****/ /************************************************************************/

  1. include <stdio.h>

void main(void) { int contador = 1;

   do
   {  printf("%d\n", contador);
      contador++;
   }
   while (contador <= 10);

}

/*************************************************************************/ /*** Programa que imprime números de 1 a 10 utilizando laço for *****/ /*************************************************************************/

  1. include <stdio.h>

void main(void) { int contador;

    for( contador = 1; contador <= 10; contador++)
        printf("%d\n", contador);

}


/*************************************************************************/ /**** Programa que imprime números de 0 a 9, de 2 em 2 *****/ /************************************************************************/

  1. include <stdio.h>

void main(void) { int i;

     for ( i = 0; i <= 9; i+=2)
         printf("%d\n", i);

}


/*************************************************************************/ /***** Programa que calcula o fatorial de um número *******/ /************************************************************************/

  1. include <stdio.h>
  2. include <conio.h>

void main(void) { int numero, j;

     char ch;
     double fat=1;
     for(;;)
     { fat=1;
       printf("Entre com um número positivo:  \n");
       scanf("%d", &numero);
       if(numero== 0 || numero == 1)
           printf("O fatorial de %d é: %.0f\n", numero, fat);
       else
       {    j = numero; 
             while(j)
             {   fat  *=  j;
                   j--;
              }
              printf("O fatorial de %d é: %.0f\n", numero, fat);
       }
     }  

}

/*************************************************************************/ /*** Programa que gera a tabuada de 2 a 9 ******/ /************************************************************************/

  1. include <stdio.h>

void main(void) { int i, j, k;

    printf("\n");
    for (k = 0; k <= 1; k++)
    {   printf("\n");
         for( i = 1; i < 5; i++)
             printf("TABUADA DO %3d  ", i+4*k+1);
         printf("\n");
         for( i = 1; i <= 9; i++)
         {    for( j = 2 + 4 *k; j <= 5 + 4*k; j++)

printf("%3d x %1d = %3d\t", j, i, j*i);

              printf("\r");
          }
    }     

}


/*******************************************************************/ /**** Programa da feira de frutas ****/ /******************************************************************/

  1. include <stdio.h>
  2. include <conio.h>

void main(void) { int i, opcao;

     printf("\n");
     for(i = 1; i <= 53; i++)

printf("*");

     printf("\n*****\t\tPROGRAMA DA FEIRA!!\t\t*****\n");
     for(i = 1; i <= 53; i++)

printf("*");

     printf("\n\n\t\t Escolha sua opção: \n");
     printf("\n\n\t\t(1) Uva; \n");
     printf("\n\t\t(2) Maça; \n");
     printf("\n\t\t(3) Banana; \n");
     printf("\n\t\t(4) Laranja; \n");
     scanf("%d",&opcao);
     switch(opcao)
     {  case 1:  printf("O cacho de uvas custa R$1.00");
                      break;

case 2: printf("A unidade de maças custa R$0.50");

                      break;

case 3: printf("O kilo de bananas custa R$0.70"); break; case 4: printf("A duzia de laranjas custa R$0.90");

                      break;

default: printf("Desculpe, mas não temos esta fruta!!");

     }

}


Exercícios

1) Um certo Centro Acadêmico está tentando realizar um plebiscito para escolha do logotipo do curso, dentre 3 propostas. Faça o programa que implementa a “urna eletrônica”, a qual vai contabilizar os votos dos estudantes e professores em cada logotipo, os votos brancos e nulos; calcular os percentuais de votos válidos em cada logotipo e imprimir qual foi o logotipo vencedor.

2) Faça um programa-calculadora de 4 funções, ou seja, o usuário entra com dois números e estes são somados, subtraídos, multiplicados ou divididos.