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
 
(139 revisões intermediárias por 4 usuários não estão sendo mostradas)
Linha 1: Linha 1:
===Objetivos===
+
<blockquote style="background: #DCF4CC; border: 1px solid black; padding: 1em;">
 +
<center>
 +
=Objetivos=
  
*Utilizar os operadores relacionais e lógicos na programação C
+
Ao final deste tópico o aluno deverá:
*um pouco mais sobre variáveis: tipo char
 
*Utilizar o comando de decisão ''if else''
 
*comando switch
 
  
====Operadores Relacionais e Lógicos====
+
*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.
 +
</center>
 +
</blockquote>
  
Os operadores relacionais e lógicos são os mesmos vistos na aula anterior.
+
=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.
  
 
{| border="1" cellpadding="2"
 
{| border="1" cellpadding="2"
 +
|+Operadores Relacionais
 
  !Operador
 
  !Operador
 
  !Significado
 
  !Significado
Linha 35: Linha 45:
  
 
{| border="1" cellpadding="2"
 
{| border="1" cellpadding="2"
 +
|+Operadores Lógicos
 
  !Operador
 
  !Operador
 
  !Significado
 
  !Significado
Linha 52: Linha 63:
 
-->
 
-->
  
=== Comandos de decisão ''if()'' e ''if() else'' ===
+
==Exemplo de Uso dos Operadores em Expressão==
 +
 
 +
<syntaxhighlight lang=c>
 +
#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;
 +
}
 +
</syntaxhighlight>
 +
 
 +
 
 +
<blockquote style="background: #DCF4CC; border: 1px solid black; padding: 1em;">
 +
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.
 +
</blockquote>
 +
 
 +
= Comandos de decisão ''if()'' e ''if() else'' =
 +
 
 +
<blockquote style="background: #DCF4CC; border: 1px solid black; padding: 1em;">
 +
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.
 +
</blockquote>
 +
 
 +
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.
  
'''Atenção''': preste atenção quando é necessário usar blocos!!!
 
 
<syntaxhighlight lang=c>  
 
<syntaxhighlight lang=c>  
  
 
#include <stdio.h>
 
#include <stdio.h>
  
main()
+
int main()
 
{
 
{
 
   
 
   
   int x; /* declaração de uma variável inteira */
+
   int x;  
   int y;  /* declaração de uma variável inteira */
+
   int y;   
  
 
   printf ("Entre com o valor de x ");
 
   printf ("Entre com o valor de x ");
Linha 70: Linha 121:
 
   printf ("Entre com o valor de y ");
 
   printf ("Entre com o valor de y ");
 
   scanf("%d",&y);
 
   scanf("%d",&y);
 
  if (y>x)
 
    printf("MSG1:y é maior que x\n");
 
 
  
 
   if (y>x)
 
   if (y>x)
Linha 79: Linha 126:
 
   else
 
   else
 
     printf("MSG3:y é igual ou menor que x\n");
 
     printf("MSG3:y é igual ou menor que x\n");
 +
 
 +
  return 0;
 +
}
 +
 +
</syntaxhighlight>
 +
 +
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.
 +
 +
 +
<blockquote style="background: #DCF4CC; border: 1px solid black; padding: 1em;">
 +
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'.
 +
</blockquote>
 +
 +
Veja a relação com um fluxograma:
 +
 +
[[imagem:FluxogramaRelacaoIfElse.jpg |700px]]
 +
 +
<blockquote style="background: #DCF4CC; border: 1px solid black; padding: 1em;">
 +
Observe que, dependendo da LÓGICA, NÃO é obrigatório o uso da parte 'else' !!!  Veja o exemplo modificado abaixo.
 +
</blockquote>
 +
<syntaxhighlight lang=c>
 +
 +
#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;
 
}
 
}
  
 
</syntaxhighlight>
 
</syntaxhighlight>
  
Outro exemplo, usando blocos:
+
Confira o fluxograma correspondente a este código e a relação com o fluxograma anterior:
 +
 
 +
[[imagem:FluxogramaRelacaoIfSemElse.jpg |310px]]
 +
 
 +
=Uso de blocos de instruções=
 +
 
 +
<blockquote style="background: #DCF4CC; border: 1px solid black; padding: 1em;">
 +
Um conjunto de instruções no C pode ser agrupada na forma de um bloco de instruções delimitado por '{' e '}' (chaves).
 +
</blockquote>
 +
 
 +
Veja um exemplo do uso de blocos com a instrução 'if else':
  
 
<syntaxhighlight lang=c>  
 
<syntaxhighlight lang=c>  
 +
/* ATENÇÃO PROGRAMA MERAMENTE ILUSTRATIVO ... */
 
#include <stdio.h>
 
#include <stdio.h>
  
main()
+
int main()
 
{
 
{
 
   
 
   
   int x,y,z; /* declaração de uma variável inteira */
+
   int x,y,z;
  
 
   printf ("Entre com o valor de x ");
 
   printf ("Entre com o valor de x ");
Linha 109: Linha 208:
 
     printf("MSG4: Neste caso z =  %d\n", z);
 
     printf("MSG4: Neste caso z =  %d\n", z);
 
   }
 
   }
+
  return 0;
 
}
 
}
 
</syntaxhighlight>
 
</syntaxhighlight>
  
  No C, qualquer expressão que resulta em 0 é considerada FALSA e qualquer expressão com valor diferente de 0 é VERDADEIRA.
+
Veja a relação com um fluxograma no detalhe do comando de decisão:
 +
 
 +
[[imagem:FluxogramaRelacaoIfElseComBlocos.jpg |700px]]
 +
 
 +
<blockquote style="background: #DCF4CC; border: 1px solid black; padding: 1em;">
 +
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.
 +
</blockquote>
 +
 
 +
=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:
 
Exemplo:
Linha 127: Linha 236:
 
</syntaxhighlight>
 
</syntaxhighlight>
  
===Tipo Char===
+
=O 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.
+
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.
  
Exemplo
+
*[https://drive.google.com/file/d/1BJ6SAfGHqanSRbttaUwHqEHZzqRPZ5lI/view?usp=sharing  Bit, Byte e a variável char]
 +
 
 +
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:
 +
 
 +
<syntaxhighlight lang=c>
 +
#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;
 +
}
 +
</syntaxhighlight>
 +
 
 +
<blockquote style="background: pink; 1px solid black; padding: 1em;">
 +
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:
 +
 
 +
<syntaxhighlight lang=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;
 +
}
 +
</syntaxhighlight>
 +
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"
  
 
<syntaxhighlight lang=c>
 
<syntaxhighlight lang=c>
 
#include <stdio.h>
 
#include <stdio.h>
 
   
 
   
main ()
+
int main()
 
{
 
{
   char x='A',y=65,w=0x41,z;
+
  int y;
+
   char x;
   scanf("%c",&z);
+
 
   printf("Caracter lido = %c\n",z);
+
   printf("Ler um caracter => ");
   printf("Caracter lido = %d\n",z);
+
   scanf (" %c", &x);
   printf("Caracter lido = %x\n",z);
+
   printf("caracter lido %c \n", x);
   if (z==x)
+
   printf("Ler mais um caracter => ");
      printf("Iguais 1\n");
+
   scanf (" %c", &x);
   if (z==y)
+
   printf("caracter lido %c \n", x);
      printf("Iguais 2\n");
+
   return 0;
   if (z==w)
 
      printf("Iguais 3\n");
 
 
}
 
}
 
</syntaxhighlight>
 
</syntaxhighlight>
 +
</blockquote>
  
 +
[http://www.vivaolinux.com.br/dica/Limpando-a-sujeirinha-no-buffer-do-teclado Limpando sujeira do teclado]
 +
[https://gsamaras.wordpress.com/code/caution-when-reading-char-with-scanf-c/ Explicando a sujeira no teclado]
  
[http://www.vivaolinux.com.br/dica/Limpando-a-sujeirinha-no-buffer-do-teclado Limpando sujeira do teclado]
+
=Múltiplas Condições: "if else if ..."=
  
===Múltiplas Condições===
+
Vamos voltar aos comandos de decisão...
  
Se for necessário testar múltiplas condições pode-se usar um "else if" da forma:
+
<blockquote style="background: #DCF4CC; border: 1px solid black; padding: 1em;">
 +
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". 
 +
</blockquote>
  
 
<syntaxhighlight lang=c>
 
<syntaxhighlight lang=c>
 
#include <stdio.h>
 
#include <stdio.h>
+
int main ()
main ()
 
 
{
 
{
 
   char x;
 
   char x;
Linha 175: Linha 334:
 
       printf("Entre F e M\n");
 
       printf("Entre F e M\n");
 
   else if (x>='a' && x<='z')
 
   else if (x>='a' && x<='z')
 +
      printf ("minúsculo entre a e z inclusive\n");
 +
  else
 +
      printf ("Outro...\n");
 +
  return 0;
 +
}
 +
</syntaxhighlight>
 +
 +
 +
<blockquote style="background: pink; 1px solid black; padding: 1em;">
 +
NOTAR que existe uma DIFERENÇA entre fazer o código acima em relação a :
 +
<syntaxhighlight lang=c>
 +
#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");
 
       printf ("minúsculo\n");
 
   else
 
   else
 
       printf ("Outro...\n");
 
       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'.
 
</syntaxhighlight>
 
</syntaxhighlight>
  
===Indentação===
+
 
 +
</blockquote>
 +
 
 +
==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 ,,,"
 +
 
 +
[[imagem:FluxogramaCalculadora.jpg|550px]]
 +
 
 +
 
 +
==Indentação==
 +
 
 +
Este momento é adequado para aprender um pouco mais sobre indentação e estilos. Veja os links abaixo:
 +
 
 
[http://pt.wikipedia.org/wiki/Indenta%C3%A7%C3%A3o Indentação]
 
[http://pt.wikipedia.org/wiki/Indenta%C3%A7%C3%A3o Indentação]
 +
 
[http://en.wikipedia.org/wiki/Indent_style Estilos]
 
[http://en.wikipedia.org/wiki/Indent_style Estilos]
  
===Comando switch===
+
É 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. 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 style="background: #DCF4CC; border: 1px solid black; padding: 1em;">
 +
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>
  
 
<syntaxhighlight lang=c>
 
<syntaxhighlight lang=c>
Linha 194: Linha 401:
 
int x=1;
 
int x=1;
 
   
 
   
main ()
+
int main ()
 
{
 
{
 
   int opcao;
 
   int opcao;
Linha 205: Linha 412:
 
   case 2:
 
   case 2:
 
           printf("opcao 2\n");
 
           printf("opcao 2\n");
           x++;  /* instrução demonstrativa apenas */
+
           x=x+1;  /* instrução demonstrativa apenas */
 
           printf("Note que pode existir ums lista de instruções\n");
 
           printf("Note que pode existir ums lista de instruções\n");
 
           break;
 
           break;
Linha 220: Linha 427:
 
           break;    /* a opção default é opcional */
 
           break;    /* a opção default é opcional */
 
   }
 
   }
 +
  return 0;
 
}
 
}
 
</syntaxhighlight>
 
</syntaxhighlight>
Linha 232: Linha 440:
 
   
 
   
 
   
 
   
main ()
+
int main ()
 
{
 
{
 
   float operando1, operando2, res;
 
   float operando1, operando2, res;
Linha 254: Linha 462:
 
           break;
 
           break;
 
   case '*':
 
   case '*':
  res = operando1 * operando2;
+
          res = operando1 * operando2;
 
           printf("Valor da diferença = %f\n", res);    
 
           printf("Valor da diferença = %f\n", res);    
 
           break;
 
           break;
 
   case '/':
 
   case '/':
 
           if (operando2 != 0) {
 
           if (operando2 != 0) {
res = operando1 / operando2;
+
                res = operando1 / operando2;
          printf("Valor da divisão = %f\n", res);
+
                printf("Valor da divisão = %f\n", res);
 
           } else  
 
           } else  
          printf("Divisão por zero não permitida!\n");    
+
                printf("Divisão por zero não permitida!\n");    
 
           break;   
 
           break;   
 
   default:
 
   default:
Linha 268: Linha 476:
 
           break;
 
           break;
 
   }
 
   }
 +
  return 0;
 
}
 
}
 
</syntaxhighlight>
 
</syntaxhighlight>
  
===Exercícios===
+
====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 [https://www.programiz.com/c-programming/examples/largest-number-three aqui].
 +
 +
=Exercícios=
 
<!--
 
<!--
 
#Implementar um programa C que converte temperaturas de graus Fahrenheit para Celsius.  
 
#Implementar um programa C que converte temperaturas de graus Fahrenheit para Celsius.  
Linha 295: Linha 513:
 
-->
 
-->
 
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.
 
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.
{{collapse top|Solução - Exercicio 01}}
+
{{collapse top|Solução - Exercício 01}}
 +
<!--
 
<syntaxhighlight lang=c>
 
<syntaxhighlight lang=c>
 
#include <stdio.h>
 
#include <stdio.h>
  
main ()
+
int main ()
 
{
 
{
 
     int x,y;
 
     int x,y;
Linha 310: Linha 529:
 
     if (y==0)
 
     if (y==0)
 
         printf("O numero é par\n");
 
         printf("O numero é par\n");
     else printf("O numero é impar\n");
+
     else  
 +
        printf("O numero é impar\n");
 +
    return 0;
 +
}
 +
</syntaxhighlight>
 +
 
 +
ou simplesmente:
 +
<syntaxhighlight lang=c>
 +
#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;
 
}
 
}
 
</syntaxhighlight>
 
</syntaxhighlight>
 +
-->
 +
 
{{collapse bottom}}
 
{{collapse bottom}}
 +
 
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.
 
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.
{{collapse top|Solução - Exercicio 02}}
+
{{collapse top|Solução - Exercício 02}}
 +
<!--
 
<syntaxhighlight lang=c>
 
<syntaxhighlight lang=c>
 
#include <stdio.h>
 
#include <stdio.h>
  
main ()
+
int main ()
 
{
 
{
 
     float x,y,media;
 
     float x,y,media;
Linha 336: Linha 580:
 
         printf("Media dos numeros = %f\n",media);
 
         printf("Media dos numeros = %f\n",media);
 
     }
 
     }
 +
  return 0;
 
}
 
}
 
</syntaxhighlight>
 
</syntaxhighlight>
 +
-->
 
{{collapse bottom}}
 
{{collapse bottom}}
 
<!--
 
<!--
Linha 360: Linha 606:
 
-->
 
-->
 
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.
 
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.
{{collapse top|Solução - Exercicio 03}}
+
{{collapse top|Solução - Exercício 03}}
 
<syntaxhighlight lang=c>
 
<syntaxhighlight lang=c>
 +
<!--
 
#include <stdio.h>
 
#include <stdio.h>
  
main ()
+
int main ()
 
{
 
{
 
     float a,b,c,d;
 
     float a,b,c,d;
Linha 382: Linha 629:
 
     if (soma1 <= soma2)
 
     if (soma1 <= soma2)
 
         printf("A soma é menor ou igual\n");
 
         printf("A soma é menor ou igual\n");
 
+
 +
    return 0;
 
}
 
}
 +
-->
 
</syntaxhighlight>
 
</syntaxhighlight>
 
{{collapse bottom}}
 
{{collapse bottom}}
<!--<syntaxhighlight lang=c>
+
<!--
 +
<syntaxhighlight lang=c>
 
main()
 
main()
 
{
 
{
Linha 410: Linha 660:
 
-->
 
-->
 
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.
 
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.
{{collapse top|Solução - Exercicio 04}}
+
{{collapse top|Solução - Exercício 04}}
 +
ATENÇÂO: A solução abaixo é INEFICIENTE. Melhor seria usar "if else if..."
 +
 
 
<syntaxhighlight lang=c>
 
<syntaxhighlight lang=c>
 
#include <stdio.h>
 
#include <stdio.h>
  
main ()
+
int main ()
 
{
 
{
 
     float x,y;
 
     float x,y;
Linha 492: Linha 744:
 
-->
 
-->
 
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.
 
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.
{{collapse top|Solução - Exercicio 05}}
+
{{collapse top|Solução - Exercício 05}}
 +
<!--
 
<syntaxhighlight lang=c>
 
<syntaxhighlight lang=c>
 +
 
#include <stdio.h>
 
#include <stdio.h>
  
main ()
+
int main ()
 
{
 
{
 
     float temp;
 
     float temp;
Linha 511: Linha 765:
 
     else if(temp < 25)
 
     else if(temp < 25)
 
         printf("Fria\n");
 
         printf("Fria\n");
 
+
    return 0;
 
}
 
}
 
</syntaxhighlight>
 
</syntaxhighlight>
 +
-->
 
{{collapse bottom}}
 
{{collapse bottom}}
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).<code>
+
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
+
<syntaxhighlight>
 +
ALGORITMO triangulo
 
VARIAVEIS
 
VARIAVEIS
 
   lado1,lado2,lado3: real
 
   lado1,lado2,lado3: real
Linha 538: Linha 794:
 
FIM
 
FIM
 
</syntaxhighlight>
 
</syntaxhighlight>
{{collapse top|Solução - Exercicio 06}}
+
 
 +
{{collapse top|Solução - Exercício 06}}
 +
A solução abaixo usao blocos de código. É realmente necessário???
 
<syntaxhighlight lang=c>
 
<syntaxhighlight lang=c>
 
#include<stdio.h>
 
#include<stdio.h>
  
main(){
+
int main(){
 
   float lado1,lado2,lado3;
 
   float lado1,lado2,lado3;
  
Linha 561: Linha 819:
 
       printf("escaleno\n");       
 
       printf("escaleno\n");       
 
   }
 
   }
 
+
  return 0;
 
 
 
}
 
}
 
</syntaxhighlight>
 
</syntaxhighlight>
 
{{collapse bottom}}
 
{{collapse bottom}}
 +
 
7. Implementar um programa C para converter um ângulo em radianos para graus.
 
7. Implementar um programa C para converter um ângulo em radianos para graus.
{{collapse top|Solução - Exercicio 07}}
+
{{collapse top|Solução - Exercício 07}}
 
<syntaxhighlight lang=c>
 
<syntaxhighlight lang=c>
 
#include <stdio.h>
 
#include <stdio.h>
Linha 585: Linha 843:
 
</syntaxhighlight>
 
</syntaxhighlight>
 
{{collapse bottom}}
 
{{collapse bottom}}
 +
 
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).
 
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).
{{collapse top|Solução - Exercicio 08}}
+
{{collapse top|Solução - Exercício 08}}
 +
<!--
 
<syntaxhighlight lang=c>
 
<syntaxhighlight lang=c>
 
#include <stdio.h>
 
#include <stdio.h>
Linha 615: Linha 875:
 
     }
 
     }
 
}
 
}
 +
 
</syntaxhighlight>
 
</syntaxhighlight>
 +
-->
 
{{collapse bottom}}
 
{{collapse bottom}}
 +
 
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.
 
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.
{{collapse top|Solução - Exercicio 09}}
+
 
 +
{{collapse top|Solução - Exercício 09}}
 
<syntaxhighlight lang=c>
 
<syntaxhighlight lang=c>
 
#include <stdio.h>
 
#include <stdio.h>
  
 +
/* ATENÇÃO: A SOLUÇÃO ABAIXO PODE SER OTIMIZADA: salario_novo = salario *1.1; */
  
main ()
+
int main ()
 
{
 
{
 
     float salario,novosalario;
 
     float salario,novosalario;
Linha 635: Linha 900:
 
     printf("%c\n",cargo);
 
     printf("%c\n",cargo);
  
     //para nao acontecer erros, verifica-se se o caracter é exatamente o solicitado, se sim, o programa executa normalmente.
+
     switch(cargo) {
    if(cargo== 'A' || cargo=='B' || cargo=='C') {
+
    case 'A':
        switch(cargo) {
 
        case 'A':
 
 
             novosalario = (salario*0.1)+salario;
 
             novosalario = (salario*0.1)+salario;
 
             printf("Novo salario do funcionario = %f\n", novosalario);
 
             printf("Novo salario do funcionario = %f\n", novosalario);
 
             break;
 
             break;
        case 'B':
+
    case 'B':
 
             novosalario = (salario*0.15)+salario;
 
             novosalario = (salario*0.15)+salario;
 
             printf("Novo salario do funcionario = %f\n", novosalario);
 
             printf("Novo salario do funcionario = %f\n", novosalario);
 
             break;
 
             break;
        case 'C':
+
    case 'C':
 
             novosalario = (salario*0.2)+salario;
 
             novosalario = (salario*0.2)+salario;
 
             printf("Novo salario do funcionario = %f\n", novosalario);
 
             printf("Novo salario do funcionario = %f\n", novosalario);
 
             break;
 
             break;
        }
+
    default: print("Cargo não existe\n");
    }
+
  }
 +
  return 0;
 
}
 
}
 
</syntaxhighlight>
 
</syntaxhighlight>
 
{{collapse bottom}}
 
{{collapse bottom}}
 +
 
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.
 
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.
{{collapse top|Solução - Exercicio 10}}
+
{{collapse top|Solução - Exercício 10}}
 
<syntaxhighlight lang=c>
 
<syntaxhighlight lang=c>
 
#include <stdio.h>
 
#include <stdio.h>
 
  
 
main ()
 
main ()
 
{
 
{
 
     int numero;
 
     int numero;
 
 
  
 
     printf("Entre com o numero de 0 ate 10\n");
 
     printf("Entre com o numero de 0 ate 10\n");
Linha 710: Linha 972:
 
</syntaxhighlight>
 
</syntaxhighlight>
 
{{collapse bottom}}
 
{{collapse bottom}}
 +
 
11. Tente inferir as saídas do programa abaixo e depois o execute para conferir os resultados.
 
11. Tente inferir as saídas do programa abaixo e depois o execute para conferir os resultados.
 
<syntaxhighlight lang=c>
 
<syntaxhighlight lang=c>
Linha 728: Linha 991:
 
</syntaxhighlight>
 
</syntaxhighlight>
  
===Exercícios extras===
+
=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.
 
1. Escreva um algoritmo que calcule as raízes de uma equação de 2o grau. Assuma que existam duas raízes reais.
{{collapse top | Solução para o calculo de raízes - Exercício 1 (solução Layza}}
+
{{collapse top | Solução para o calculo de raízes - Exercício 1}}
 +
<!--
 
<syntaxhighlight lang=c>
 
<syntaxhighlight lang=c>
 
//Exercício resolvido pela aluna Layza
 
//Exercício resolvido pela aluna Layza
Linha 761: Linha 1 025:
 
   // Quando o delta é menor que zero, as raízes não são reais.
 
   // Quando o delta é menor que zero, as raízes não são reais.
 
   else if (delta < 0) {
 
   else if (delta < 0) {
     printf("Esta equação não possui raizes reais.\n");
+
     printf("Esta equação não possui raízes reais.\n");
 
   }
 
   }
 
   // Caso final, quando o delta dá um número positivo, existem duas raízes iguais.
 
   // Caso final, quando o delta dá um número positivo, existem duas raízes iguais.
Linha 771: Linha 1 035:
 
}
 
}
 
</syntaxhighlight>
 
</syntaxhighlight>
 +
-->
 
{{collapse bottom}}
 
{{collapse bottom}}
  
2. Faça um programa que leia um número e então informe se ele é par ou ímpar.
+
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:
 
 
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 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 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.
 
*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.
 
Escreva um algoritmo que calcule a multa de acordo com a velocidade de um veículo.
 +
{{collapse top | Solução - Exercício 2}}
 +
<!--
 +
<syntaxhighlight lang=c>
 +
//Autor: Victor Cesconetto De Pieri
  
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.  
+
#include<stdio.h>
{{collapse top | Solução para encontrar o Maior valor - Exercício 4}}
+
int main ()
 +
{
 +
 +
    float veloc;
 +
    printf("Digite a velocidade: ");
 +
    scanf("%f", &veloc);
 +
   
 +
   
 +
    if (veloc > 80)
 +
        printf("Sua multa é de 360R$\n");
 +
    if (veloc > 60 && veloc <= 80)
 +
        printf("Sua multa é de 180R$\n");
 +
    if (veloc <= 60)
 +
printf("Voce nao recebeu multa\n");
 +
}
 +
</syntaxhighlight>
 +
-->
 +
{{collapse bottom}}
 +
 
 +
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.  
 +
{{collapse top | Solução para encontrar o Maior valor - Exercício 3}}
 +
<!--
 
<syntaxhighlight lang=c>
 
<syntaxhighlight lang=c>
 
#include<stdio.h>
 
#include<stdio.h>
Linha 809: Linha 1 097:
 
}
 
}
 
</syntaxhighlight>
 
</syntaxhighlight>
 +
-->
 
{{collapse bottom}}
 
{{collapse bottom}}
  
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.
+
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.
  
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).
+
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).
 +
{{collapse top | Solução - Exercício 5}}
 +
<!--
 +
<syntaxhighlight lang=c>
 +
//Autor: Victor Cesconetto De Pieri
 +
 
 +
#include <stdio.h>
 +
  int main() {
 +
 
 +
    int n;
 +
    printf("Digite o numero do dia da semana: ");
 +
    scanf("%d", &n);
 +
 
 +
    switch (n) {
 +
    case 1:
 +
      printf("Domingo\n");
 +
      break;
 +
    case 2:
 +
      printf("Segunda-Feira\n");
 +
      break;
 +
    case 3:
 +
      printf("Terça-Feira\n");
 +
      break;
 +
    case 4:
 +
      printf("Quarta-Feira\n");
 +
      break;
 +
    case 5:
 +
      printf("Quinta-Feira\n");
 +
      break;
 +
    case 6:
 +
      printf("Sexta-Feira\n");
 +
      break;
 +
    case 7:
 +
      printf("Sabado\n");
 +
      break;
 +
    default:
 +
      printf("Operação inválida!\n");
 +
      break;
 +
    }
 +
 
 +
  }
 +
</syntaxhighlight>
 +
-->
 +
{{collapse bottom}}
 +
 
 +
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
 +
 
 +
<syntaxhighlight lang=c>
 +
#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;
 +
}
 +
</syntaxhighlight>

Edição atual tal como às 13h14min de 15 de fevereiro de 2023

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

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

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

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>

/* ATENÇÃO: A SOLUÇÃO ABAIXO PODE SER OTIMIZADA: salario_novo = salario *1.1; */

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