AULA 10 - Microcontroladores - Técnico: mudanças entre as edições
imported>Fargoud |
imported>Fargoud |
||
| Linha 36: | Linha 36: | ||
} | } | ||
===Exemplo:=== | |||
#include <stdio.h> | |||
int main () | |||
{ | |||
int num; | |||
printf ("Digite um numero: "); | |||
scanf ("%d",&num); | |||
if (num>10) printf ("\n\nO numero e maior que 10"); | |||
if (num==10) | |||
{ | |||
printf ("\n\nVoce acertou!\n"); | |||
printf ("O numero e igual a 10."); | |||
} | |||
if (num<10) printf ("\n\nO numero e menor que 10"); | |||
return (0); | |||
} | |||
=A INSTRUÇÃO IF-ELSE= | =A INSTRUÇÃO IF-ELSE= | ||
Edição das 14h15min de 16 de novembro de 2016
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;
...
}
Exemplo:
#include <stdio.h>
int main ()
{
int num;
printf ("Digite um numero: ");
scanf ("%d",&num);
if (num>10) printf ("\n\nO numero e maior que 10");
if (num==10)
{
printf ("\n\nVoce acertou!\n");
printf ("O numero e igual a 10.");
}
if (num<10) printf ("\n\nO numero e menor que 10");
return (0);
}
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 **/ /**********************************************************************/
- 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) ******/
/**********************************************************************/
- 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!! */
- include <stdio.h>
- define ESCALA "celsius"
- 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:
- 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: *****/ /************************************************************************/
- 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 ****/
/************************************************************************/
- 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 *****/ /*************************************************************************/
- 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 *****/
/************************************************************************/
- 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 *******/
/************************************************************************/
- include <stdio.h>
- 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 ******/ /************************************************************************/
- 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 ****/
/******************************************************************/
- include <stdio.h>
- 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.