Programação 1 - Engenharia - Comandos de Decisão no C

De MediaWiki do Campus São José
Ir para navegação Ir para pesquisar

Objetivos

  • Utilizar os operadores relacionais e lógicos na programação C
  • um pouco mais sobre variáveis: tipo char
  • 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.

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)


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


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

Atenção: preste atenção quando é necessário usar blocos!!!

 

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

Tipo Char

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 1 byte.

Exemplo

#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

Múltiplas Condições

Se for necessário testar múltiplas condições pode-se usar um "else if" da forma:

#include <stdio.h>
 
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\n");
  else
      printf ("Outro...\n");
}

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 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;
 
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 */
  }
}

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>
 
 
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;
  }
}

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 - Exercicio 01
#include <stdio.h>

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

}

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 - Exercicio 02
#include <stdio.h>

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

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 - Exercicio 03
#include <stdio.h>

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

}

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 - Exercicio 04
#include <stdio.h>

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 - Exercicio 05
#include <stdio.h>

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

}

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 trangulo 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 </syntaxhighlight>

Solução - Exercicio 06
#include<stdio.h>

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

}

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

Solução - Exercicio 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 - Exercicio 08
#include <stdio.h>
#include <math.h> //precisa incluir para usar a função sqrt()
//Alem disso na hora da compilação precisa-se utilizar o comando "-lm" para linkar a biblioteca math.h com seu aplicativo.
//ficaria assim "gcc 'nome_do_arquivo' -o 'nome_de_saida_do_app' -lm"

main ()
{
    float a,b,c;
    float x1,x2;


    printf("Entre com o 'a'\n");
    scanf("%f",&a);
    printf("Entre com o 'b'\n");
    scanf("%f",&b);
    printf("Entre com o 'c'\n");
    scanf("%f",&c);

    if(a!=0) {
        x1 = ( -b + (sqrtf((b*b)-4*a*c)) )/(2*a);
        x2 = ( -b - (sqrtf((b*b)-4*a*c)) )/(2*a);
        printf("Raiz x1 : %f\n",x1);
        printf("Raiz x2 : %f\n",x2);
    } else {
        printf("O 'a' precisa ser diferente de zero\n");
    }
}

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 - Exercicio 09
#include <stdio.h>


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

    //para nao acontecer erros, verifica-se se o caracter é exatamente o solicitado, se sim, o programa executa normalmente.
    if(cargo== 'A' || cargo=='B' || cargo=='C') {
        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;
        }
    }
}

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 - Exercicio 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
#include <stdio.h>
#include <math.h>

main () {
  // Declarando as variáveis
  float r1, r2, a, b, c, delta;

  printf("Calculador de raízes de uma equação de segundo grau.\n");

  printf("Insira o valor de a:\n");
  scanf ("%f",&a);
  printf("Insira o valor de b:\n");
  scanf ("%f",&b);
  printf("Insira o valor de c:\n");
  scanf ("%f",&c);

  // Calculando o delta separadamente, para fazer as próximas etapas de acordo com o seu resultado.
  delta = (b*b)-(4*a*c);

  // Quando o delta é igual a zero, a equação possui duas raízes iguais.
  if (delta == 0) {
    r1 = (-b)/(2*a);
    r2 = r1;
    printf("A equação possui duas raízes iguais: %f\n", r2);
  }
  // Quando o delta é menor que zero, as raízes não são reais.
  else if (delta < 0) {
    printf("Esta equação não possui raizes reais.\n");
  }
  // Caso final, quando o delta dá um número positivo, existem duas raízes iguais.
  else {
    r1 = ((-b)+sqrt(delta))/(2*a);
    r2 = ((-b)-sqrt(delta))/(2*a);
    printf("As raízes da equação são %f (r1) e %f (r2)\n", r1, r2);
  }
}

2. Faça um programa que leia um número e então informe se ele é par ou ímpar.

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

4. 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 4
#include<stdio.h>
int main ()
{

     int a,b,c,maior,menor;
     printf("Digite o primeiro numero: ");
     scanf("%d", & a);
     printf("Digite o segundo numero: ");
     scanf("%d", & b);
     printf("Digite o terceiro numero: ");
     scanf("%d", & c);
     maior = a;
     menor = a;
     if (b < menor)
        menor = b;
     if (b > maior)
        maior = b;
     if (c < menor)
        menor = c;
     if (c > maior)
        maior = c;
     printf ("\nO maior numero e : %d", maior);
     printf ("\nO menor numero e : %d\n", menor);
}

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

6. 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).