Mudanças entre as edições de "PR1022804 2020 2 AULA05"

De MediaWiki do Campus São José
Ir para navegação Ir para pesquisar
(Criou página com '=Objetivos= *Utilizar os operadores relacionais e lógicos na programação C. *Utilizar o comando de decisão ''if else''. *Comando ''switch''. =Operadores Relacionais e L...')
 
Linha 1: Linha 1:
=Objetivos=
+
=Estruturas de Decisão=
 +
 
 +
Estruturas de decisão são utilizado em linguagem de programação para verificar um comando e efetuar decisão sobre o mesmo. Em linguagem C podemos usar estruturas ''if – else'' para construir o código equivalente.
 +
 
 +
 
 +
==Objetivos==
  
 
*Utilizar os operadores relacionais e lógicos na programação C.
 
*Utilizar os operadores relacionais e lógicos na programação C.
Linha 5: Linha 10:
 
*Comando ''switch''.
 
*Comando ''switch''.
  
=Operadores Relacionais e Lógicos=
+
==Operadores Relacionais e Lógicos==
  
 
Os operadores relacionais e lógicos são os mesmos vistos na aula anterior.
 
Os operadores relacionais e lógicos são os mesmos vistos na aula anterior.

Edição das 13h36min de 28 de outubro de 2020

Estruturas de Decisão

Estruturas de decisão são utilizado em linguagem de programação para verificar um comando e efetuar decisão sobre o mesmo. Em linguagem C podemos usar estruturas if – else para construir o código equivalente.


Objetivos

  • Utilizar os operadores relacionais e lógicos na programação C.
  • Utilizar o comando de decisão if else.
  • Comando switch.

Operadores Relacionais e Lógicos

Os operadores relacionais e lógicos são os mesmos vistos na aula anterior.

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

Comandos de decisão if() e if() else

Estes comandos são também chamados de Comandos de controle de fluxo.
Possibilitam ao programador alterar a sequência de execução de um programa.

O comando if representa uma tomada de decisão do tipo "SE isto ENTÃO aquilo".

Sua forma geral é:

if (condição) declaração;

if (condição){
   declaração1;  
   declaração2;
}
else {
   declaração3;
   declaração4;
}


Fig037 MCO018703.jpg

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


Note o uso das chaves sempre que houver mais de uma declaração.

 
#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)
     printf("MSG2:y é maior que x\n");
  else
     printf("MSG3:y é igual ou menor que x\n");
 
}

Outro exemplo, usando blocos:

 
#include <stdio.h>

main()
{
 
  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);
  }
 
}

No C, qualquer expressão que resulta em 0 é considerada FALSA e qualquer expressão com valor diferente de 0 é VERDADEIRA.

Exemplo:

  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");
Indentação

Indentação Estilos

Comando switch

O comando switch permite controlar o fluxo de um programa de forma condicional.
O comando testa uma expressão que deve resultar em um número inteiro.
Uma sequência de cláusulas case permite executar um conjunto de instruções
conforme o valor da expressão.

  • É uma forma de reduzir a complexidade de vários if … else encadeados.
  • É muito utilizado em estruturas de menu.
Pseudocódigo

Em português estruturado o comando escolha…caso equivale ao switch…case

Veja estrutura escolha … caso

Escolha (Variável)
Inicio
   Caso (Valor1): 
      Instruções;
   
   Caso (Valor2): 
     Instruções;
   
   Caso (ValorN): 
     Instruções;
Fim;

Sintaxe do comando switch case em linguagem C

switch (variável)
{
   case constante1:
     Instruções;
   break;

   case constante2:
     Instruções;
   break;

   default
     Instruções;
}

Note que esta sequência de instruções pode ser interrompida por um break.

#include <stdio.h>
 
int x=1;
 
main ()
{
  int opcao;
  printf("Entre com uma opção (número inteiro)\n");
  scanf ("%d",&opcao);
  switch(opcao) {
  case 1:
          printf("opcao 1\n");
          break; /* o break força o encerramento da instrução*/
  case 2:
          printf("opcao 2\n");
          x++;  /* instrução demonstrativa apenas */
          printf("Note que pode existir ums lista de instruções\n");
          break;
  case 3:
          printf("opcao 3\n"); /* note o efeito de não ter o break */
  case 4:
          printf("opcao 4\n");
          break;
  case 5:
          printf("opcao 5\n");
          break;
  default:
          printf("opcao default\n");
          break;    /* a opção default é opcional */
  }
}


Fig038 MCO018703.jpg

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


Exemplo 1

Implementar um programa de calculadora onde são fornecidos via scanf dois
operandos reais e uma operação que pode ser uma das 4 operações.
Com auxílio de um switch deve ser computado e mostrado o resultado da operação.
Solução:

#include <stdio.h>
 
 
main ()
{
  float operando1, operando2, res;
  char operador;
 
  printf("Entre com operando 1\n");
  scanf ("%f",&operando1);
  printf("Entre com operando 2\n");
  scanf ("%f",&operando2);  
  printf("Entre com operador\n");
  scanf (" %c",&operador);
 
  switch(operador) {
  case '+':
          res = operando1 + operando2;
          printf("Valor da soma = %f\n", res);
          break; 
  case '-':
          res = operando1 - operando2;
          printf("Valor da diferença = %f\n", res);
          break;
  case '*':
 		  res = operando1 * operando2;
          printf("Valor do produto= %f\n", res); 		  
          break;
  case '/':
          if (operando2 != 0) {
 		res = operando1 / operando2;
          	printf("Valor da divisão = %f\n", res);
          } else 
          	printf("Divisão por zero não permitida!\n"); 		  
          break;  
  default:
          printf("Operação inválida!\n");
          break;
  }
}
Exemplo 2

Elaborar uma função que recebe como parâmetro um número inteiro de 1 a 7.
A função deve imprimir Domingo se o número é 1, Segunda se 2, ...
A função deve retornar -1 caso o parâmetro esteja fora da faixa e 0 caso contrário.
Solução:

/* contribuição do aluno Iago */
#include <stdio.h>
 
int operar(int x)
{
  switch(x) {
    case 1:
           printf("Domingo\n");
           break; 
    case 2:
           printf("Segunda\n");
           break;
    case 3:
           printf("Terça\n");
           break;
    case 4:
           printf("Quarta\n");
           break;
    case 5:
           printf("Quinta\n");
           break;
    case 6: 
           printf("Sexta\n");
           break;
    case 7: 
           printf("Sábado\n");
           break;        
    default:
            printf("-1\n");
            return -1; 
    }
    return 0;
} 
 
main()
{
 
 int num;
 printf("Entre com um número:\n");
 scanf("%d",&num);
 num=operar(num);
 printf("%d\n",num); 
 
}
Exercício 1

Um funcionário irá receber um aumento de acordo com o seu plano de trabalho (A,B,C e D).
A tabela abaixo mostra o plano e o percentual de aumento:

Plano Percentual
A 5%
B 10%
C 15%
D 20%

Faça um programa que leia o plano de trabalho e o salário atual de um funcionário
em seguida calcule e imprima o seu novo salário. Use o comando switch.

Exercício 2

Faça um programa que leia um número entre 0 e 10, e escreva este número por extenso.
Use o comando switch.

O switch sem o break

Nos exemplos passados, você viu que somente um dos case era selecionado para cada operação com o uso do break. Se você tirar o break, o switch identifica o case que é igual a 'operacao' e todos os que estão abaixo até o fim, ou até encontrar um novo break.

Execute o exemplo a seguir:

#include <stdio.h>

int main(void)
{
    int continuar=1;
    char opcao;

    while(continuar)
    {
        system("clear || cls");
        printf("Repetir? (S/s)im (N/n)ao\n");
        scanf(" %c",&opcao);
        switch(opcao)
        {
            case 's':
            case 'S':
				break;

            case 'n':
            case 'N':
                continuar = 0;
            }

        }

}

O comando system("clear") serve para limpar a tela em sistemas operacionais do tipo Linux, e system("cls") limpa a tela caso você use Windows. Então system("clear || cls") limpa a tela, independente de qual sistema você esteja usando.

Nota-se que, enquanto continuar=1, o laço WHILE continua a ocorrer e só termina quando 'continuar' receber valor 0. Se digitarmos 's' o primeiro case é selecionado. Como ele não tem break, o próximo também ocorre, que é o case caso opcao='S'. Esse tem break. Ou seja, pra continuar a repetir basta digitar 'S' ou 's'.

Se digitar 'n', vai cair no case onde opcao='n' e onde opcao='N', pois não tem break no opcao='n'. Então, 'continuar' recebe valor 0 e o laço WHILE termina.

Exemplo 1

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 usando switch e case acumulados.

Solução
#include <stdio.h>

int main(void)
{
        float valor_i,
              valor_f;
        int   juros=0;

        int meses;

        printf("Qual o valor inicial da dívida: ");
        scanf("%f", &valor_i);

        printf("Você vai atrasar quantos meses [1-5]?: ");
        scanf("%d", &meses);

        switch( meses )
        {
            case 5:
                juros++;
            case 4:
                juros++;
            case 3:
                juros++;
            case 2:
                juros++;
            case 1:
                juros++;
                break;
            default:
                printf("Você não digitou um valor válido de meses\n");

        }
        printf("Juros: %d%\n",juros);
        valor_f=( (1 + (juros/100.0))*valor_i);
        printf("Valor final da dívida: R$ %.2f\n", valor_f);

}

Caso tenha atrasado 5 meses, o valor da variável 'juros' é incrementado 5 vezes. Se atrasou 4 meses, o 'juros' é incrementado 4 vezes, e assim por diante.

Exemplo 2

Crie um programa que receba um inteiro, de 1 até 12, representando os meses do ano e retorne o número de dias do mês. Use switch e não use break. Acumule os case.

Solução
#include <stdio.h>

int main()
{
    while(1)
    {
        int mes,dias=27;
        printf("\nDigite o numero do mes: ");
        scanf("%d",&mes);
        switch (mes)
        {
            case 1:
            case 3:
            case 5:
            case 7:
            case 8:
            case 10:
            case 12: dias++;
            case 4:
            case 6:
            case 9:
            case 11: dias=dias+2;
            case 2: dias++;
        }
        printf("\nMes: %d   Dias: %d",mes,dias);

    }
}

Tipo Char

Os caracteres são um tipo de dado chamado de char. O C trata os caracteres
('a','b','c',...) como sendo variáveis de um byte (8 bits).
Um bit é a menor unidade de informação que pode ser armazenada num
computador. Os inteiros (int) e os reais (float) têm um número de
bytes maior. Podem ter 2 bytes (16 bits), 4 bytes (32 bits) ou
até mais.

Consulte a tabela ASCII

Uma variável do tipo caracter é tratada como um número inteiro e declarada
com o tipo char, que na prática é um número inteiro de byte.

Exemplo 1
#include <stdio.h>
 
main ()
{
  char x='A',y=65,w=0x41,z;
 
  scanf("%c",&z);
  printf("Caracter lido = %c\n",z);
  printf("Caracter lido = %d\n",z);
  printf("Caracter lido = %x\n",z);
  if (z==x)
      printf("Iguais 1\n");
  if (z==y)
      printf("Iguais 2\n");
  if (z==w)
      printf("Iguais 3\n");
}


Limpando sujeira do teclado


Como gerar os caracteres ASCII imprimíveis na Linguagem C
#include <stdio.h>
 
main()
{
    int i;
 
    for (i = 32; i <= 126; i++)
    {
        printf("%c [%d]\n", i, i);
    }
}



Exercícios

Para os exercícios abaixo, fazer o algorítimo na forma de pseudo-código e fluxograma:

  1. Implementar um programa C que converte temperaturas de graus Fahrenheit para Celsius.
  2. 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.
  3. 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.
  4. 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.
  5. 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.
  6. 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 o algoritmo na forma de um programa C.
  7. Implementar um programa que recebe três números reais e então o programa testa se estes números podem formar um triângulo EQUILÁTERO, ISÓSCELES, ESCALENO ou NÃO pode ser triângulo. (ver aula anterior).
  8. Implementar um programa C para converter um ângulo em radianos para graus.
  9. Implementar um programa C que recebe os 3 coeficientes de uma equação do segundo grau e então determina as raízes da mesma.




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