Mudanças entre as edições de "Programação 1 - Engenharia - Comandos de Decisão no C"

De MediaWiki do Campus São José
Ir para navegação Ir para pesquisar
Linha 393: Linha 393:
  
 
<blockquote style="background: #DCF4CC; border: 1px solid black; padding: 1em;">
 
<blockquote style="background: #DCF4CC; border: 1px solid black; padding: 1em;">
O comando \textit{switch} permite controlar o fluxo de um programa de forma condicional através de cláusulas. O comando testa uma expressão que deve resultar em um número inteiro. Uma sequência de cláusulas case permite executar uma sequência de instruções conforme o valor da expressão. Note que esta sequência de instruções pode ser interrompida por um \textit{break}.   
+
O comando '''switch''' permite controlar o fluxo de um programa de forma condicional através de cláusulas. O comando testa uma expressão que deve resultar em um número inteiro. Uma sequência de cláusulas case permite executar uma sequência de instruções conforme o valor da expressão. Note que esta sequência de instruções pode ser interrompida por um '''break'''.   
 
</blockquote>
 
</blockquote>
  

Edição das 18h44min de 10 de novembro de 2021

Objetivos

Ao final deste tópico o aluno deverá:

  • saber utilizar os operadores relacionais e lógicos na programação C
  • saber utilizar o comando de decisão if else;
  • conhecer um pouco mais sobre variáveis: tipo char;
  • compreender e saber usar blocos (composição de instruções);
  • saber utilizar o comando switch.

Operadores Relacionais e Lógicos no C

Apresentação dos Operadores

Os operadores relacionais e lógicos são os mesmos vistos na aulas anteriores. Estes operadores serão amplamente usados em comandos de decisão. Entretanto, nada impede que tais operadores sejam usados diretamente em expressões com atribuição, como foi visto na aula de lógica.

Operadores Relacionais
Operador Significado
> maior que
>= maior ou igual que
< menor que
<= menor ou igual que
== igual a (se o operando a esquerda é igual ao da direita)
!= diferente de (se o operando a esquerda é diferente do da direita)


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


Exemplo de Uso dos Operadores em Expressão

#include <stdio.h>
 
int main()
{
 int x,y,resultado;
 
 printf("Entre com o valor de x => ");
 scanf ("%d", &x);
 printf("Entre com o valor de y => ");
 scanf ("%d", &y);
 resultado = (x > y); 
 printf("valor de x>y => %d \n", resultado);
 return 0;
}


Observe que ao executar este programa, quando x for maior que y o resultado será 1. Caso contrário 0. No C qualquer valor que resulte diferente de 0 será considerado como VERDADEIRO e qualquer valor 0 será FALSO. Isto será amplamente usado nos comandos de decisão.

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

Em muitos momentos, durante a execução de um programa, será necessário testar uma expressão para verificar se ela é VERDADEIRA ou FALSA. Dependendo desta condição, o programa seguirá um ou outro caminho (fluxo) de execução.

Veja o exemplo abaixo:

Exemplo: Problema Imprimir Maior

PROBLEMA: Desenvolver um algoritmo na forma de um fluxograma que recebe como entrada dois números inteiros. Ele deve imprimir uma mensagem SE o segundo número for maior que o primeiro número. Caso contrário (SENÃO), uma mensagem deve ser impressa indicando que o segundo número é igual ou menor que o primeiro número.

DADO DE ENTRADA: os dois números inteiros.

DADO DE SAÌDA: uma mensagem caso o segundo número seja maior que o primeiro.

 

#include <stdio.h>

int main()
{
 
  int x; 
  int y;  

  printf ("Entre com o valor de x ");
  scanf("%d",&x);

  printf ("Entre com o valor de y ");
  scanf("%d",&y);

  if (y>x)
     printf("MSG2:y é maior que x\n");
  else
     printf("MSG3:y é igual ou menor que x\n");
  
  return 0; 
}

Neste exemplo, caso o valor de y seja maior que o de x será impresso a MSG2, caso contrário ('else') será impressa a MSG3.


OBSERVE que 'if' e 'else' são PALAVRAS RESERVADAS do C. Não poderão ser usadas como nomes de variáveis ou de funções. OBSERVE também que os parênteses são OBRIGATÓRIOS após o 'if'.

Veja a relação com um fluxograma:

FluxogramaRelacaoIfElse.jpg

Observe que, dependendo da LÓGICA, NÃO é obrigatório o uso da parte 'else' !!! Veja o exemplo modificado abaixo.

 

#include <stdio.h>

int main()
{
 
  int x; 
  int y;

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

  printf("MSG_FINALx\n");

  return 0;
}

Confira o fluxograma correspondente a este código e a relação com o fluxograma anterior:

FluxogramaRelacaoIfSemElse.jpg

Uso de blocos de instruções

Um conjunto de instruções no C pode ser agrupada na forma de um bloco de instruções delimitado por '{' e '}' (chaves).

Veja um exemplo do uso de blocos com a instrução 'if else':

 
/* ATENÇÃO PROGRAMA MERAMENTE ILUSTRATIVO ... */
#include <stdio.h>

int main()
{
 
  int x,y,z;

  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);
  }
  return 0;
}

Veja a relação com um fluxograma no detalhe do comando de decisão:

FluxogramaRelacaoIfElseComBlocos.jpg

OBSERVAR que neste caso, no final de bloco não é necessário o "ponto e vírgula". Entretanto, com instrução sem bloco, o "ponto e vírgula" DEVE existir.

Reforçando o que é VERDADEIRO e o que é FALSO no C

Como já citado, 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");

O tipo char

Vamos fazer uma pausa no aprendizado de comandos de decisão, para aprender um pouco mais sobre variáveis do tipo char (caractere). Antes, pode ser interessante aprender o que é um bit, um byte e como podemos representar um caractere no computador.

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

Exemplo:

#include <stdio.h>

int 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");
    return 0;
}

SUJEIRA DO TECLADO: Muitas vezes a leitura de um caracter através do scanf pode causar problemas para a próxima leitura de dados. Veja este exemplo:

#include <stdio.h>

int main()
{
  int y;
  char x;

  printf("Ler um caracter => ");
  scanf ("%c", &x);
  printf("caracter lido %c \n", x);
  printf("Ler mais um caracter => ");
  scanf ("%c", &x);
  printf("caracter lido %c \n", x);
  return 0;
}

O como a leitura com %c é para ler um caracter e o usuário tecla ENTER normalmente para finalizar, este ENTER é visto como um caracter newline que fica no buffer de leitura acessado pelo scanf. Isto quer dizer que se for realizado um próximo scanf com %c, este NEWLINE será lido como um caracter. Uma solução é colocar um espaço no formato " %c"

#include <stdio.h>
 
int main()
{
  int y;
  char x;

  printf("Ler um caracter => ");
  scanf (" %c", &x);
  printf("caracter lido %c \n", x);
  printf("Ler mais um caracter => ");
  scanf (" %c", &x);
  printf("caracter lido %c \n", x);
  return 0;
}

Limpando sujeira do teclado Explicando a sujeira no teclado

Múltiplas Condições: "if else if ..."

Vamos voltar aos comandos de decisão...

Se for necessário testar múltiplas condições pode-se usar um comando com "else if" conforme mostrado abaixo. Note que um comando "if" se segue a um "else".

#include <stdio.h>
int main ()
{
  char x;
 
  printf("Entre com um caracter\n");
  scanf("%c",&x);

  if (x=='A')
      printf("Igual a A\n");
  else if(x>'F' && x < 'M')
      printf("Entre F e M\n");
  else if (x>='a' && x<='z')
      printf ("minúsculo entre a e z inclusive\n");
  else
      printf ("Outro...\n");
  return 0;
}


NOTAR que existe uma DIFERENÇA entre fazer o código acima em relação a :

#include <stdio.h>
 
int main ()
{
  char x;
 
  printf("Entre com um caracter\n");
  scanf("%c",&x);

  if (x=='A')
      printf("Igual a A\n");
  if(x>'F' && x < 'M')
      printf("Entre F e M\n");
  if (x>='a' && x<='z')
      printf ("minúsculo\n");
  else
      printf ("Outro...\n");

  return 0;
}
O código acima funcionará MAS é menos eficiente pois TODOS os ''ifs'' serão executados mesmo que x seja 'A'.


Exercício - Uma Calculadora simplificada em C

Considere o fluxograma abaixo que representa um algoritmo de uma calculadora simplificada. Implemente um programa C usando "if else if ,,,"

FluxogramaCalculadora.jpg


Indentação

Este momento é adequado para aprender um pouco mais sobre indentação e estilos. Veja os links abaixo:

Indentação

Estilos

É aconselhável que você estude, escolha e siga um estilo de programação em C.

Comando switch

O comando switch permite controlar o fluxo de um programa de forma condicional através de cláusulas. O comando testa uma expressão que deve resultar em um número inteiro. Uma sequência de cláusulas case permite executar uma sequência de instruções conforme o valor da expressão. Note que esta sequência de instruções pode ser interrompida por um break.

#include <stdio.h>
 
int x=1;
 
int 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=x+1;  /* 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 */
  }
  return 0;
}

Referência: ver link sobre switch Exemplo1 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>
 
 
int 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 da diferença = %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;
  }
  return 0;
}

Exercício em sala

Modifique o programa anterior para que a multiplicação seja efetuada com o caracter '*' e com os caracteres 'x' ou 'X'.

Aplicações: Maior e Menor entre 3 números

A fazer: listar opções...

Ver opção avançada aqui.

Exercícios

1. Implementar um programa que lê um número inteiro e imprime se o número é par ou ímpar. SUGESTÃO: Usar o operador de resto.

Solução - Exercício 01
#include <stdio.h>

int main ()
{
    int x,y;

    printf("Entre com um numero\n");
    scanf("%d",&x);

    y = x%2;
    //se a divisao por 2 tiver resto, é impar, caso contrario é par
    if (y==0)
        printf("O numero é par\n");
    else 
        printf("O numero é impar\n");
    return 0;
}

ou simplesmente:

#include <stdio.h>

int main ()
{
    int x;

    printf("Entre com um numero\n");
    scanf("%d",&x);

    //se a divisao por 2 tiver resto, é impar, caso contrario é par
    if ((x%2)==0)
        printf("O numero é par\n");
    else 
        printf("O numero é impar\n");
    return 0;
}

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

Solução - Exercício 02
#include <stdio.h>

int main ()
{
    float x,y,media;

    printf("Entre com o primeiro numero\n");
    scanf("%f",&x);
    printf("Entre com o segundo numero\n");
    scanf("%f",&y);
    //se x igual a y
    if (x==y) {
        printf("Os numeros são iguais\n");
    } else { //senao
        printf("Os numeros são diferentes\n");
        media = (x+y)/2;
        printf("Media dos numeros = %f\n",media);
    }
   return 0;
}

3. Implementar um programa para ler 4 números inteiros e imprimir uma mensagem caso a soma dos dois primeiros seja igual ou menor que a soma dos dois últimos.

Solução - Exercício 03
#include <stdio.h>

int main ()
{
    float a,b,c,d;
    float soma1,soma2;

    printf("Entre com o primeiro numero\n");
    scanf("%f",&a);
    printf("Entre com o segundo numero\n");
    scanf("%f",&b);
    printf("Entre com o terceiro numero\n");
    scanf("%f",&c);
    printf("Entre com o quarto numero\n");
    scanf("%f",&d);
    soma1 = a+b;
    soma2 = c+d;
    //se x igual a y
    if (soma1 <= soma2)
        printf("A soma é menor ou igual\n");
 
    return 0;
}

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

Solução - Exercício 04

ATENÇÂO: A solução abaixo é INEFICIENTE. Melhor seria usar "if else if..."

#include <stdio.h>

int main ()
{
    float x,y;
    float result;
    int i;

    printf("Entre com o primeiro numero real\n");
    scanf("%f",&x);
    printf("Entre com o segundo numero real\n");
    scanf("%f",&y);
    printf("Entre com o numero inteiro\n");
    scanf("%d",&i);
    //se x igual a y
    if (i>4 || i<1) {
        printf("O Numero inteiro só pode ser entre 1 e 4\n");
    } else { //utilizei if, porem pode-se utilizar switch case.
        if(i==1) {
            result = x+y;
            printf("Soma: %f\n",result);
        }
        if(i==2) {
            result = x-y;
            printf("Subtração: %f\n",result);
        }
        if(i==3) {
            result = x*y;
            printf("Multiplicacao: %f\n",result);
        }
        if(i==4) {
            if(y==0) {
                printf("Não é possivel dividir por zero\n");
            } else {
                result = x/y;
                printf("Divisao: %f\n",result);
            }
        }
    }
}

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

Solução - Exercício 05
#include <stdio.h>

int main ()
{
    float temp;


    printf("Entre com a temperatura\n");
    scanf("%f",&temp);

    //se x igual a y
    if (temp >30)
        printf("Quente\n");
    else if(temp <= 30 && temp >= 25)
        printf("Morna\n");
    else if(temp < 25)
        printf("Fria\n");
    return 0;
}

6. 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 pseudocódigo abaixo).

ALGORITMO triangulo
VARIAVEIS
  lado1,lado2,lado3: real
INICIO
  Ler lado1
  Ler lado2
  Ler lado3
  SE lado1>(lado2+lado3) OU lado2>(lado1+lado3) OU lado3>(lado1+lado2) ENTÃO
      MOSTRAR "não é triângulo"
  SENÃO
      SE lado1==lado2 E lado1==lado3 ENTÃO
         MOSTRAR "equilatero"
      SENAO
         SE lado1==lado2 OU lado1==lado3 OU lado2==lado3 ENTÃO
             MOSTRAR "isósceles"
         SENÃO
             MOSTRAR "escaleno"
         FIMSE
      FIMSE
  FIMSE
FIM
Solução - Exercício 06

A solução abaixo usao blocos de código. É realmente necessário???

#include<stdio.h>

int main(){
  float lado1,lado2,lado3;

  printf("Insira o valor do lado 1 do triangulo\n");
  scanf("%f",&lado1);
  printf("Insira o valor do lado 2 do triangulo\n");
  scanf("%f",&lado2);
  printf("Insira o valor do lado 3 do triangulo\n");
  scanf("%f",&lado3);	 
 
  if(lado1>(lado2+lado3) || lado2>(lado1+lado3) || lado3>(lado1+lado2)){
      printf("não é triângulo\n");
  }else if(lado1==lado2 && lado1==lado3){
      printf("equilatero\n");
  }else if(lado1==lado2 || lado1==lado3 || lado2==lado3){
       printf("isósceles\n");
  }else{
       printf("escaleno\n");       
  }
  return 0;
}

7. Implementar um programa C para converter um ângulo em radianos para graus.

Solução - Exercício 07
#include <stdio.h>
 
main ()
{
  float rad,graus;
  
 
  printf("Entre com o angulo em rad\n");
  scanf("%f",&rad);
 
  graus = rad*(180/3.1415);
  printf("O angulo em graus = %f\n",graus);
  
}

8. 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. Usar a função sqrtf (ver http://en.cppreference.com/w/c/numeric/math/sqrt).

Solução - Exercício 08

9. Uma empresa irá ajustar o salário de seus funcionários de acordo com a categoria de trabalho dos funcionários: CAT A (10% de aumento), CAT B (15% de aumento) e CAT C (20% de aumento). Faça um programa que leia o plano de trabalho e o salário atual de um funcionário e calcula e imprime o seu novo salário. Use o comando switch.

Solução - Exercício 09
#include <stdio.h>


int main ()
{
    float salario,novosalario;
    char cargo;


    printf("Entre com o salario do funcionario\n");
    scanf ("%f",&salario);
    printf("Entre com o cargo do funcionario(A,B,C):");
    scanf (" %c",&cargo);
    printf("%c\n",cargo);

    switch(cargo) {
    case 'A':
            novosalario = (salario*0.1)+salario;
            printf("Novo salario do funcionario = %f\n", novosalario);
            break;
    case 'B':
            novosalario = (salario*0.15)+salario;
            printf("Novo salario do funcionario = %f\n", novosalario);
            break;
    case 'C':
            novosalario = (salario*0.2)+salario;
            printf("Novo salario do funcionario = %f\n", novosalario);
            break;
    default: print("Cargo não existe\n");
   }
   return 0;
}

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

Solução - Exercício 10
#include <stdio.h>

main ()
{
    int numero;

    printf("Entre com o numero de 0 ate 10\n");
    scanf ("%d",&numero);
    //para nao acontecer erros, verifica-se se o numero é exatamente o solicitado, se sim, o programa executa normalmente.
    if(numero > 0 || numero < 10) {
        switch(numero) {
        case 0:
            printf("Zero\n");
            break;
        case 1:
            printf("Um\n");
            break;
        case 2:
            printf("Dois\n");
            break;
        case 3:
            printf("Tres\n");
            break;
        case 4:
            printf("Quatro\n");
            break;
        case 5:
            printf("Cinco\n");
            break;
        case 6:
            printf("Seis\n");
            break;
        case 7:
            printf("Sete\n");
            break;
        case 8:
            printf("Oito\n");
            break;
        case 9:
            printf("Nove\n");
            break;
        case 10:
            printf("Dez\n");
            break;
        }
    }
}

11. Tente inferir as saídas do programa abaixo e depois o execute para conferir os resultados.

#include <stdio.h>
 
main ()
{
  int x;
  x = !( 1 || 0 );   
  printf ("x=%d\n",x);      
  x = !( 0 || 1 && 0 );
  printf ("x=%d\n",x);
  x = !( 0 || 1 && 1 );
  printf ("x=%d\n",x);     
  x = !( ( 0 || 1 ) && 1 );
  printf ("x=%d\n",x);  
}

Exercícios extras

1. Escreva um algoritmo que calcule as raízes de uma equação de 2o grau. Assuma que existam duas raízes reais.

Solução para o calculo de raízes - Exercício 1

2. Um radar de trânsito faz a medição de velocidade de veículos e, dependendo do valor, calcula a multa a ser aplicada. Em uma determinada via esse radar foi configurado da seguinte forma:

  • Se a velocidade for maior que 80 km/h, a multa é de R$ 360;
  • Se a velocidade for maior que 60 km/h, a multa é de R$ 180;
  • Se a velocidade for menor ou igual a 60 km/h, não há multa.

Escreva um algoritmo que calcule a multa de acordo com a velocidade de um veículo.

Solução - Exercício 2

3. Faça um programa em C que leia três números e no final informe o maior e o menor valor informado pelo usuário.

Solução para encontrar o Maior valor - Exercício 3

4. 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 que mostre as palavras "fria", "morna" ou "quente" dependendo da temperatura da água que for informada.

5. Faça um algoritmo que converta um número de 1 a 7 para o respectivo dia da semana (ex: 1 = domingo, 2 = 2a feira, e assim por diante).

Solução - Exercício 5

EXERCÍCIOS TAREFA

QUESTÃO 1

Implementar um programa C que recebe cinco números reais. O algoritmo deve mostrar a (1) a média destes números; (2) o desvio padrão deste conjunto de números (ver exercícios anteriores) e (3) a quantidade de números (dentre estes cinco números) que estão acima da média. Não usar arranjos ou repetições (ainda não tivemos).

QUESTÃO 2

Implementar um programa C que recebe a as três cores de um resistor e imprime o valor do mesmo em ohms. Não usar arranjos ou repetições (ainda não tivemos). USAR comando switch e variáveis do tipo char para receber a cor. Fazer somente para as cores preto, marrom, vermelho e amarelo. Usar caracteres 'p','m','v' e 'a' para identificar as cores.

ADENDO: Uso da função sqrtf() para solução do exercício acima:

ATENÇÃO: "Linkar" com a biblioteca matemática:

 gcc ex1.c -o ex1 -lm
#include <stdio.h>
#include <math.h>

int main()
{

    float x,y;
    printf("Entre com o valor de x\n");
    scanf("%f", &x);
    y = sqrtf(x);
    return 0;
}