AULA 5 - Programação 1 - Engenharia

De MediaWiki do Campus São José
Ir para: navegação, pesquisa

Objetivos

Ao final deste tópico o aluno deverá:

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

Operadores Relacionais e Lógicos no C

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.

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)


Exemplo

#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 fluxo de execução. Seja o exemplo abaixo:

Exemplo: Problema Imprimir Maior

PROBLEMA: Desenvolver um algoritmo na forma de um fluxograma que recebe dois números inteiros. Ele deve imprimir uma mensagem SE o segundo número for maior que o primeiro número. SENÃO (caso contrário) 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>

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("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 NÃO é obrigatório a parte 'else' !!!

 

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

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

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>

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>

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

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

Limpando sujeira do teclado Explicando a sujeira no teclado

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

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


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

#include <stdio.h>
 
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");
}
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

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;
 
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'.

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>

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 - Exercício 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 - Exercício 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 - Exercício 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 - Exercício 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 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 </syntaxhighlight>

Solução - Exercício 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 - 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
#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 - Exercício 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 - 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;
}