Mudanças entre as edições de "PR1022804 2024 1 AULA06"

De MediaWiki do Campus São José
Ir para navegação Ir para pesquisar
(Criou página com '=Estruturas de Repetição= ;OBJETIVOS :O aluno será capaz de: :* Implementar estruturas de repetição em linguagem C; :*Criar fluxogramas ou pseudo-código na forma de es...')
 
 
(3 revisões intermediárias pelo mesmo usuário não estão sendo mostradas)
Linha 1: Linha 1:
=Estruturas de Repetição=
+
=Estruturas de Decisão=
  
 
;OBJETIVOS
 
;OBJETIVOS
  
:O aluno será capaz de:
+
:O aluno terá que:
:* Implementar estruturas de repetição em linguagem C;
 
:*Criar fluxogramas ou pseudo-código na forma de estruturas em linguagem C;
 
:*Implementar ''loops'' infinitos; e
 
:*Utilizar o comando ''break'' associado ao comando ''for'', ''do'', ''while''.
 
  
 +
:*Conhecer os operadores relacionais e lógicos na programação C;
 +
:*Saber utilizar o comando de decisão "''if – else''";
 +
:*Saber utilizar o comando "''switch – case''"; e
 +
:*Conhecer o tipo ''char''.
  
 
;METODOLOGIA
 
;METODOLOGIA
  
:A aula será expositiva e dialogada, utilizando apresentação de texto base na Internet, onde serão mostrados exemplos testados programas no microcomputador do laboratório de informática.  
+
:A aula será expositiva e dialogada, utilizando apresentação de texto base na Internet, onde serão mostrados exemplos E testados programas no microcomputador do laboratório de informática.  
  
  
 
;INTRODUÇÃO
 
;INTRODUÇÃO
  
:Dentro da lógica de programação é uma estrutura que permite executar mais de uma vez o mesmo comando ou conjunto de comandos, de acordo com uma condição ou com um contador. Na linguagem C existem 4 estruturas/comandos que permitem implementar ''loops'' ou repetições de blocos de código:
+
:Estruturas de decisão são utilizadas, em linguagens de programação modernas, para verificar um comando e efetuar decisão sobre o mesmo.  
 +
:Em linguagem C podemos usar estruturas "''if – else''" e também "''switch – case''" para construir o código equivalente.
  
:*''while()''
 
:*''do – while()''
 
:*''for()''
 
:*''goto – label''
 
  
 +
==Operadores Relacionais e Lógicos==
  
<blockquote style="background:#E6E6FA; border: 2px solid #8A2BE2; margin-left: 100px; margin-right: 100px; padding: 2em;">
+
Os operadores relacionais e lógicos são os mesmos vistos na aula anterior.
;Nota: Observe que repetir o código significa voltar a executá-lo, normalmente sobre o controle de uma expressão lógica.
 
</blockquote>
 
  
==Comando ''while()'': teste da repetição no começo==
+
{| class="wikitable" style="background-color:#ffffff; text-align: center;"
 +
|+Relacionais
 +
! style="background:#0000CD; color:white;" | Operador
 +
! style="background:#0000CD; color:white;" | Significado
 +
! style="background:#0000CD; color:white;" | Exemplo
 +
|-
 +
!style="text-align: center;" | >
 +
| maior que
 +
!style="text-align: center;" | A > B
 +
|-
 +
!style="text-align: center;" | >=
 +
|maior ou igual que
 +
!style="text-align: center;" | A >= -1
 +
|-
 +
!style="text-align: center;" | <
 +
| menor que
 +
!style="text-align: center;" | B < 2
 +
|-
 +
!style="text-align: center;" | <=
 +
| menor ou igual que
 +
!style="text-align: center;" | A <= B
 +
|-
 +
!style="text-align: center;" | ==
 +
| igual a
 +
!style="text-align: center;" | B == 0
 +
|-
 +
!style="text-align: center;" | !=
 +
|diferente de
 +
!style="text-align: center;" | B != A
 +
|}
 +
 
 +
 
 +
{| class="wikitable" style="background-color:#ffffff; text-align: center;"
 +
|+Lógicos
 +
! style="background:#0000CD; color:white;" | Operador
 +
! style="background:#0000CD; color:white;" | Significado
 +
! style="background:#0000CD; color:white;" | Exemplo
 +
|-
 +
!style="text-align: center;" |&&
 +
|AND (E)
 +
!style="text-align: center;" |(A<B) && (B!=0)
 +
|-
 +
!style="text-align: center;" |<nowiki>||</nowiki>
 +
|OR (OU)
 +
!style="text-align: center;" |(B>1)<nowiki>||</nowiki>(A==0)
 +
|-
 +
!style="text-align: center;" |!
 +
|NOT (NÃO)
 +
!style="text-align: center;" |!(A<=B)
 +
|}
 +
* Atenção para o uso dos parênteses.
 +
 
 +
Ver [http://www.ead.cpdee.ufmg.br/cursos/C/c.html Operadores Relacionais e Lógicos]
  
 +
== Comandos de decisão ''if()'' e ''if() – else'' ==
  
;O comando '''while''' tem a seguinte forma geral
+
Estes comandos são também chamados de <b>Comandos de controle de fluxo</b>.<br>
 +
Possibilitam ao programador alterar a sequência de execução de um programa.<br>
  
while (condição) declaração;
+
O comando <b>if</b> representa uma tomada de decisão do tipo '''"SE isto ENTÃO aquilo"'''.<br>
  
ou
+
Sua forma geral é:
  
while (condição)
+
<syntaxhighlight lang=c>
{
+
 
   declaração1;
+
if (condição) declaração;
 +
 
 +
if (condição){
 +
   declaração1;
 
   declaração2;
 
   declaração2;
}
+
}
 +
else {
 +
  declaração3;
 +
  declaração4;
 +
}
 +
</syntaxhighlight>
  
  
Podemos ver que a estrutura ''while'' testa uma condição. Se esta for verdadeira<br>
+
[[imagem:Fig037_MCO018703.jpg|600px|center]]
a declaração é executada e faz-se o teste novamente, e assim por diante.<br>
+
<center>
 +
Figura 1 - Controle de Fluxo com os comandos '''if''' e '''if...else'''.
 +
</center>
  
O comando ''while'' permite implementar ''loops'' com controle no início:
 
  
<syntaxhighlight lang=c>
+
Note o uso das chaves sempre que houver mais de uma declaração.
 +
<syntaxhighlight lang=c>  
 
#include <stdio.h>
 
#include <stdio.h>
void main()  
+
 
 +
void main()
 
{
 
{
   int contador;
+
    
+
   int x; /* declaração de uma variável inteira */
   contador=0;
+
   int y;  /* declaração de uma variável inteira */
   while (contador<5)
+
 
    printf("valor do contador =  %d\n", contador);
+
   printf ("Entre com o valor de x ");
    contador=contador+1;
+
   scanf("%d",&x);
  }
+
 
}
+
  printf ("Entre com o valor de y ");
</syntaxhighlight>
+
  scanf("%d",&y);
  
 +
  if (y>x)
 +
    printf("MSG1:y é maior que x\n");
  
Variação do exemplo anterior:
 
  
<syntaxhighlight lang=c>
+
  if (y>x)
#include <stdio.h>
+
    printf("MSG2:y é maior que x\n");
void main()  
+
  else
{
+
    printf("MSG3:y é igual ou menor que x\n");
  int contador;
 
 
   
 
   
  contador=0;
 
  while (contador<5) { 
 
printf("valor da expressão =  contador < 5 é %d\n", contador<5); 
 
        printf("valor do contador =  %d\n", contador);
 
        contador=contador+1;
 
  }
 
  printf("NO FINAL a expressão  contador < 5 é %d\n", contador<5);
 
 
}
 
}
 
</syntaxhighlight>
 
</syntaxhighlight>
  
 +
Outro exemplo, usando blocos:
  
Vamos ver a correspondência do comando ''while'' com um fluxograma:
+
<syntaxhighlight lang=c>
 +
#include <stdio.h>
  
{| class="wikitable" style="background-color:#ffffff; text-align: center;"
+
void main()
! style="background:#8A2BE2; color:white;" | Fluxograma
+
{
! style="background:#8A2BE2; color:white;" | C
+
   
! style="background:#8A2BE2; color:white;" | Comentário
+
  int x,y,z; /* declaração de uma variável inteira */
|-
 
  | |[[imagem:fluxo5.jpg|300px]]
 
||<syntaxhighlight lang=c>while(contador<5) {
 
  printf("Entre com x\n");
 
  scanf("%f",&x);
 
  soma=soma+x;
 
  contador = contador + 1;
 
}</syntaxhighlight>|| O comando ''while()'' aplicado sobre um bloco de instruções.<br>Note que se for uma instrução simples,<br>as chaves podem ser omitidas.
 
|}
 
  
'''NOTE''' que no exemplo anterior o contador inicialmente DEVE conter um valor válido.
+
  printf ("Entre com o valor de x ");
 +
  scanf("%d",&x);
  
==Comando ''do – while()'': controle do ''loop'' no final==
+
  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);
 +
  }
 +
 +
}
 +
</syntaxhighlight>
  
;O comando ''do while'' tem a seguinte forma geral
+
No C, qualquer expressão que resulta em 0 é considerada FALSA e qualquer expressão com valor diferente de 0 é VERDADEIRA. Veja o exemplo:
  
do {
 
    declaração1;
 
    declaração2;
 
} while (condição);
 
 
Nesta variação o comando ''do while()'' permite a repetição de uma ou <br>
 
mais instruções, com controle do ''loop'' no final. <br>
 
Isto permite que o bloco seja executado pelo menos uma vez.
 
  
 
<syntaxhighlight lang=c>
 
<syntaxhighlight lang=c>
#include <stdio.h>
+
  if (2)
void main()  
+
      printf("expressão sempre VERDADEIRA");
{
+
   if ('2')
  int contador;
+
      printf("expressão sempre VERDADEIRA");    
    
+
   if (1-1)
  contador=0;
+
      printf("expressão sempre FALSA");
   do { 
+
  if (x=1) /* um erro comum - sinal de atribuição no lugar de == */
    printf("valor do contador =  %d\n", contador);
+
      printf("expressão sempre VERDADEIRA");
    contador=contador+1;
 
  } while (contador<5);
 
}
 
 
</syntaxhighlight>
 
</syntaxhighlight>
  
 
+
;INDENTAÇÃO
{| class="wikitable" style="background-color:#ffffff; text-align: center;"
+
 
! style="background:#8A2BE2; color:white;" | Fluxograma
+
[http://pt.wikipedia.org/wiki/Indenta%C3%A7%C3%A3o Indentação]
! style="background:#8A2BE2; color:white;" | C
+
[http://en.wikipedia.org/wiki/Indent_style Estilos]
! style="background:#8A2BE2; color:white;" | Comentário
 
|-
 
| |[[imagem:fluxoDoWhile-Eraldo.jpg|300px]]
 
||<syntaxhighlight lang=c>
 
contador = 0;
 
do {
 
        scanf("%d",&x);
 
        soma=soma+x;
 
        if (soma>150)
 
          y=z+x;
 
        contador++;
 
} while(contador<5);
 
</syntaxhighlight>|| Note que instruções ''while'' e ''if'' são tratadas <br>como instruções normais
 
que podem ser aninhadas <br>normalmente em outros comandos.
 
|}
 
  
==Comando ''for()''==
+
==Comando ''switch – case''==
  
O comando ''for()'' permite uma forma mais elaborada de ''loop'', com controle no início do bloco de repetição.
+
O comando '''switch''' permite controlar o fluxo de um programa de forma condicional.
 +
O comando testa uma expressão que deve resultar em um número inteiro.
 +
Uma sequência de cláusulas ''case'' permite executar um conjunto de instruções conforme o valor da expressão.
  
;Sua forma geral é
+
*É uma forma de reduzir a complexidade de vários ''if...else'' encadeados.
 +
*É muito utilizado em estruturas de menu.
  
for(inicialização;condição;incremento) declaração;
 
  
;ou
+
;PSEUDOCÓDIGO
  
for(inicialização;condição;incremento){
+
Em português estruturado o comando ''escolha…caso'' equivale ao ''switch…case''.
  declaração1;
 
  declaração2;
 
}
 
  
 +
Veja estrutura ''escolha...caso'':
  
 +
<pre>
 +
Escolha (Variável)
 +
Inicio
 +
  Caso (Valor1):
 +
      Instruções;
 +
 
 +
  Caso (Valor2):
 +
    Instruções;
 +
 
 +
  Caso (ValorN):
 +
    Instruções;
 +
Fim;
 +
</pre>
  
[[arquivo:ComandoFor.gif|thumb|right| Estrutura de Repetição]]
+
Sintaxe do comando ''switch...case'' em linguagem C
  
 
<syntaxhighlight lang=c>
 
<syntaxhighlight lang=c>
#include <stdio.h>
+
switch (variável)
 
 
void main()
 
 
{
 
{
  int i;
+
  case constante1:
 
+
    Instruções;
  for (i=0;i<10;i=i+1)
+
  break;
      printf("i =%d\n",i);
 
}
 
</syntaxhighlight>
 
  
 +
  case constante2:
 +
    Instruções;
 +
  break;
  
{| class="wikitable" style="background-color:#ffffff; text-align: center;"
+
  default
! style="background:#8A2BE2; color:white;" | Fluxograma
+
    Instruções;
! style="background:#8A2BE2; color:white;" | C
 
! style="background:#8A2BE2; color:white;" | Comentário
 
|-
 
| |[[imagem:FluxogramaComandoFor-Eraldo.jpg|400px]]
 
||<syntaxhighlight lang=c>
 
for(i=0; i<10; i++) {
 
  printf("Laço de número %d\n", i);
 
  if (i==5)
 
      printf("Este é o laço 5\n");
 
 
}
 
}
</syntaxhighlight>|| Observe que a expressão ''i=0'' é executada SEMPRE e <br>uma única VEZ, no início do comando.
+
</syntaxhighlight>
A expressão ''i<10'' é o controle do ''loop''. <br>Se FALSA o ''loop'' é encerrado. <br>Ela é executada após a expressão
 
de inicialização e,<br> na sequência,  no início de cada ''loop''. <br>A expressão i++ é executada no final de cada ''loop''.
 
|}
 
 
 
==Comando ''goto – label'' ==
 
 
 
O comando ''goto'' é um dos mais antigos da programação. A ideia é comandar um salto para um determinado ponto específico do programa marcado por um rótulo (LABEL). Para utilizá-lo deve-se, portanto, marcar o ponto para onde será feito o salto usando um LABEL.
 
  
Exemplo:
+
Note que esta sequência de instruções pode ser interrompida por um ''break''.
  
 
<syntaxhighlight lang=c>
 
<syntaxhighlight lang=c>
 
#include <stdio.h>
 
#include <stdio.h>
 
+
void main()
+
int x=1;
 +
 +
void main ()
 
{
 
{
  int i;
+
  int opcao;
 
+
  printf("Entre com uma opção (número inteiro)\n");
  i=0;
+
  scanf ("%d",&opcao);
 
+
  switch(opcao) {
PONTO1:
+
  case 1:
  printf("Laço de número %d\n", i);
+
          printf("opcao 1\n");
  i++;
+
          break; /* o break força o encerramento da instrução*/
  if (i<10)
+
  case 2:
      goto PONTO1;
+
          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 */
 +
  }
 
}
 
}
 
</syntaxhighlight>
 
</syntaxhighlight>
  
:Devido a ser uma instrução "desestruturante", em geral NÃO se recomenda o uso deste comando.
 
  
Em alguns casos de tratamento de erro pode ser interessante o uso do [http://julipedia.meroh.net/2005/08/using-gotos-in-c.html goto].
+
[[imagem:Fig038_MCO018703.jpg|600px|center]]
 +
<center>
 +
Figura 2 - Controle de Fluxo usando os comandos '''if( )...else if( )''' e '''switch...case'''.
 +
</center>
  
Leia um pouco mais sobre o goto [http://en.wikipedia.org/wiki/Goto aqui].
 
  
=Aninhamento de loops=
+
;EXEMPLO 1
 +
 
 +
Implementar um programa de calculadora onde são fornecidos via ''scanf'' dois <br>
 +
operandos reais e uma operação que pode ser uma das 4 operações. <br>
 +
Com auxílio de um ''switch'' deve ser computado e mostrado o resultado da operação.<br>
 +
Solução:
  
 
<syntaxhighlight lang=c>
 
<syntaxhighlight lang=c>
 
#include <stdio.h>
 
#include <stdio.h>
void main()
+
 +
void main ()
 
{
 
{
   int i,j;
+
   float operando1, operando2, res;
 +
  char operador;
 
   
 
   
   for (i=0;i<3;i++) {
+
   printf("Entre com operando 1\n");
    for (j=0;j<4;j++) {
+
  scanf ("%f",&operando1);
        printf("valor de j = %d\n", j);
+
  printf("Entre com operando 2\n");
    }
+
  scanf ("%f",&operando2); 
    printf("valor de i = %d\n", i);
+
  printf("Entre com operador\n");
 +
  scanf (" %c",&operador);
 +
 +
  switch(operador) {
 +
  case '+':
 +
          res = operando1 + operando2;
 +
          printf("Valor da soma = %f\n", res);
 +
          break;
 +
  case '-':
 +
          res = operando1 - operando2;
 +
          printf("Valor da diferença = %f\n", res);
 +
          break;
 +
  case '*':
 +
          res = operando1 * operando2;
 +
          printf("Valor do produto= %f\n", res);  
 +
          break;
 +
  case '/':
 +
          if (operando2 != 0) {
 +
        res = operando1 / operando2;
 +
          printf("Valor da divisão = %f\n", res);
 +
          } else
 +
          printf("Divisão por zero não permitida!\n");  
 +
          break; 
 +
  default:
 +
          printf("Operação inválida!\n");
 +
          break;
 
   }
 
   }
 
}
 
}
 
</syntaxhighlight>
 
</syntaxhighlight>
  
==Loop Infinito==
 
  
É possível implementar loops infinitos com qualquer uma das instruções acima.
+
;EXEMPLO 2
  
Exemplo com comando ''for'':
+
Elaborar uma função que recebe como parâmetro um número inteiro de 1 a 7. <br>
 +
A função deve imprimir Domingo se o número é 1, Segunda se 2, ...<br>
 +
A função deve retornar -1 caso o parâmetro esteja fora da faixa e 0 caso contrário.<br>
 +
Solução:
  
 
<syntaxhighlight lang=c>
 
<syntaxhighlight lang=c>
 +
/* contribuição do aluno Iago */
 +
#include <stdio.h>
 +
 +
int operar(int x)
 +
{
 +
  switch(x) {
 +
    case 1:
 +
          printf("Domingo\n");
 +
          break;
 +
    case 2:
 +
          printf("Segunda\n");
 +
          break;
 +
    case 3:
 +
          printf("Terça\n");
 +
          break;
 +
    case 4:
 +
          printf("Quarta\n");
 +
          break;
 +
    case 5:
 +
          printf("Quinta\n");
 +
          break;
 +
    case 6:
 +
          printf("Sexta\n");
 +
          break;
 +
    case 7:
 +
          printf("Sábado\n");
 +
          break;       
 +
    default:
 +
            printf("-1\n");
 +
            return -1;
 +
    }
 +
    return 0;
 +
}
 +
 
void main()
 
void main()
 
{
 
{
  for(;;) {
+
        /* Este bloco se executará infinitamente */
+
int num;
  }
+
printf("Entre com um número:\n");
 +
scanf("%d",&num);
 +
num=operar(num);
 +
printf("%d\n",num);
 +
 
}
 
}
 
</syntaxhighlight>
 
</syntaxhighlight>
  
ou com o comando ''while'':
+
;EXERCÍCIO 1
 +
 
 +
Um funcionário irá receber um aumento de acordo com o seu plano de trabalho (A,B,C e D). <br>
 +
A tabela abaixo mostra o plano e o percentual de aumento:
 +
 
  
<syntaxhighlight lang=c>
+
{| class="wikitable" style="background-color:#ffffff; text-align: center;"
void main()
+
! style="background:#778899; color:white;" | Plano
{
+
! style="background:#778899; color:white;" | Percentual
  while(1) {
+
|-
        /* Este bloco se executará infinitamente */
+
!style="text-align: center;" | A
  }
+
!style="text-align: center;" | 5%
}
+
|-
</syntaxhighlight>
+
!style="text-align: center;" | B
 +
!style="text-align: center;" | 10%
 +
|-
 +
!style="text-align: center;" | C
 +
!style="text-align: center;" | 15%
 +
|-
 +
!style="text-align: center;" | D
 +
!style="text-align: center;" | 20%
 +
|}
 +
 
 +
Faça um programa que leia o plano de trabalho e o salário atual de um funcionário<br>
 +
em seguida calcule e imprima o seu novo salário. Use o comando ''switch''.
  
 +
;EXERCÍCIO 2
  
;EXEMPLO: Usando o comando '''for''' aninhado, construa um programa que implemente a figura abaixo.  
+
Faça um programa que leia um número entre 0 e 10, e escreva este número por extenso.<br>
 +
Use o comando ''switch''.
  
 +
==O switch sem o break==
  
  x
+
Nos exemplos passados, você viu que somente um dos ''case'' era selecionado para cada operação com o uso do  
xx
+
''break''. Se você tirar o break, o switch identifica o case que é igual a 'operacao' e todos os que estão
xxx
+
abaixo até o fim, ou até encontrar um novo break.
xxxx
 
xxxxx
 
xxxxxx
 
xxxxxxx
 
xxxxxxxx
 
xxxxxxxxx
 
xxxxxxxxxx
 
xxxxxxxxxxx
 
xxxxxxxxxxxx
 
xxxxxxxxxxxxx
 
  
 +
Execute o exemplo a seguir:
  
 
<syntaxhighlight lang=c>
 
<syntaxhighlight lang=c>
 
#include <stdio.h>
 
#include <stdio.h>
void main()
+
 
 +
int main()
 
{
 
{
  int i,j;
+
    int continuar=1;
  printf("\n"); /* deixa uma linha em branco */
+
    char opcao;
 +
 
 +
    while(continuar)
 +
    {
 +
        system("clear || cls");
 +
        printf("Repetir? (S/s)im (N/n)ao\n");
 +
        scanf(" %c",&opcao);
 +
        switch(opcao)
 +
        {
 +
            case 's':
 +
            case 'S':
 +
                break;
  
  for (i=0;i<13;i++) {
+
            case 'n':
        for (j=0;j<=i;j++) {
+
            case 'N':
          printf("*");
+
                continuar = 0;
 
         }
 
         }
  printf("\n"); /* deixa uma linha em branco */
+
    }
  }
 
 
 
 
}
 
}
 
</syntaxhighlight>
 
</syntaxhighlight>
  
==Uso de ''BREAK'' para sair de ''loops''==
+
O comando system("clear") serve para limpar a tela em sistemas operacionais do tipo Linux, e system("cls")
 +
limpa a tela caso você use Windows. Então system("clear || cls") limpa a tela, independente de qual sistema
 +
você esteja usando.
  
Em exercícios anteriores, a finalização de um ''loop'' normalmente se dá pela expressão de controle de ''loop'' associado a instrução usada.<br>
+
Nota-se que, enquanto continuar=1, o laço WHILE continua a ocorrer e só termina quando 'continuar' receber valor 0.
É possível sair de um ''loop'' na "força bruta" usando a instrução ''break'':
+
Se digitarmos 's' o primeiro case é selecionado. Como ele não tem break, o próximo também ocorre, que é o case caso
 +
opcao='S'. Esse tem break. Ou seja, pra continuar a repetir basta digitar 'S' ou 's'.
  
<syntaxhighlight lang=c>
+
Se digitar 'n', vai cair no case onde opcao='n' e onde opcao='N', pois não tem break no opcao='n'.
#include <stdio.h>
+
Então, 'continuar' recebe valor 0 e o laço WHILE termina.
void main()
 
{
 
  int i,j;
 
 
 
  for (i=0;i<10;i++) {
 
    if (i==5)
 
      break;
 
  }
 
  printf("valor de i=%d\n", i);
 
}
 
  
</syntaxhighlight>
+
;EXEMPLO 1
  
 +
Suponha que você atrasou uma conta. A cada mês que você deixa de pagar, será cobrado 1% de juros no valor inicial.
 +
Ou seja, se você atrasar um mês, irá pagar 1%. Se atrasar 3 meses, irá pagar 3%.
 +
Vamos supor que você pode atrasar, no máximo, 5 meses.
  
Note que o ''break'' sempre sai do ''loop'' mais próximo a ele. Muitas vezes rodamos um looping, através de um laço (como FOR ou WHILE), para encontrar alguma informação. O break serve para terminar o laço a qualquer momento sem esperar que o ''loop'' termine.
+
O programa pede, como entrada, dois valores:
 +
- um float: com o valor de sua dívida inicial (valor_i)
 +
- um inteiro: de 0 até 5, que são o número de meses de atraso.
  
 +
Faça um programa em C que calcule os juros (simples) de atraso usando switch e case acumulados.
  
 +
{{collapse top|bg=#E6E6FA|Solução}}
 
<syntaxhighlight lang=c>
 
<syntaxhighlight lang=c>
 
#include <stdio.h>
 
#include <stdio.h>
void main()
+
 
 +
int main(void)
 
{
 
{
   int i,j;
+
        float valor_i,
 +
              valor_f;
 +
        int   juros=0;
  
  for (i=0;i<3;i++) {
+
        int meses;
    for (j=0;j<4;j++) {
+
 
        if (j==1) {
+
        printf("Qual o valor inicial da dívida: ");
            break;
+
        scanf("%f", &valor_i);
        }
+
 
        printf("valor de j = %d\n", j);
+
        printf("Você vai atrasar quantos meses [1-5]?: ");
    }
+
        scanf("%d", &meses);
    if (i==2)
+
 
        break;
+
        switch( meses )
    printf("valor de i = %d\n", i);
+
        {
  }
+
            case 5:
 +
                juros++;
 +
            case 4:
 +
                juros++;
 +
            case 3:
 +
                juros++;
 +
            case 2:
 +
                juros++;
 +
            case 1:
 +
                juros++;
 +
                break;
 +
            default:
 +
                printf("Você não digitou um valor válido de meses\n");
 +
 
 +
        }
 +
        printf("Juros: %d%\n",juros);
 +
        valor_f=( (1 + (juros/100.0))*valor_i);
 +
        printf("Valor final da dívida: R$ %.2f\n", valor_f);
  
 
}
 
}
 
 
</syntaxhighlight>
 
</syntaxhighlight>
 +
{{collapse bottom}}
  
;DESAFIO 1
+
Caso tenha atrasado 5 meses, o valor da variável 'juros' é incrementado 5 vezes.
 +
Se atrasou 4 meses, o 'juros' é incrementado 4 vezes, e assim por diante.
  
Encontre o primeiro número, entre 1 e 1 milhão que é divisível por 11, 13 e 17. Isso significa dizer que temos que encontrar o menor número que, dividido por 11, 13 e 17, dê resto da divisão nulo (igual a zero).
+
;EXEMPLO 2
  
 +
Crie um programa que receba um inteiro, de 1 até 12, representando os meses do ano e retorne o número de dias do mês.
 +
Use switch e não use break. Acumule os case.
  
 
{{collapse top|bg=#E6E6FA|Solução}}
 
{{collapse top|bg=#E6E6FA|Solução}}
Linha 364: Linha 529:
 
int main()
 
int main()
 
{
 
{
     int count,
+
     while(1)
        numero=0;
 
 
 
    for(count=1 ; count<=1000000 ; count++)
 
 
     {
 
     {
        if(numero == 0)
+
        int mes,dias=27;
            if((count%11==0) && (count%13==0) && (count%17==0))
+
        printf("\nDigite o numero do mes: ");
            {
+
        scanf("%d",&mes);
                numero=count;
+
        switch (mes)
                break;
+
        {
            }
+
            case 1:
 +
            case 3:
 +
            case 5:
 +
            case 7:
 +
            case 8:
 +
            case 10:
 +
            case 12: dias++;
 +
            case 4:
 +
            case 6:
 +
            case 9:
 +
            case 11: dias=dias+2;
 +
            case 2: dias++;
 
         }
 
         }
         printf("O numero e: %d\n", numero);
+
         printf("\nMes: %d  Dias: %d",mes,dias);
 +
 
 +
    }
 
}
 
}
 
</syntaxhighlight>
 
</syntaxhighlight>
 
{{collapse bottom}}
 
{{collapse bottom}}
  
==Uso do ''CONTINUE'' para prosseguir no início do ''loop''==
+
=Tipo Char=
 +
 
 +
Os caracteres são um tipo de dado chamado de '''char'''. O C trata os caracteres ('a','b','c',...) como sendo variáveis de um ''byte'' (8 ''bits''). Um ''bit'' é a menor unidade de informação que pode ser armazenada num computador. Os inteiros ('''int''') e os reais ('''float''') têm um número de ''bytes'' maior. Podem ter 2 ''bytes'' (16 ''bits''), 4 ''bytes'' (32 ''bits'') ou<br>
 +
até mais.
 +
 
 +
 
 +
[http://pt.wikipedia.org/wiki/ASCII Consulte a tabela ASCII]
 +
 
 +
 
 +
Uma variável do tipo '''caracter''' é tratada como um número inteiro e declarada com o tipo ''char'', que na prática é um número inteiro de ''byte''.
 +
 
 +
 
 +
;EXEMPLO
  
 
<syntaxhighlight lang=c>
 
<syntaxhighlight lang=c>
 
#include <stdio.h>
 
#include <stdio.h>
void main()
+
 +
void main ()
 
{
 
{
   int i,j;
+
   char x='A',y=65,w=0x41,z;
 
+
   for (i=0;i<3;i++) {
+
   scanf("%c",&z);
    if (i==1) {
+
  printf("Caracter lido = %c\n",z);
        continue;
+
  printf("Caracter lido = %d\n",z);
    }
+
  printf("Caracter lido = %x\n",z);
    printf("valor de i = %d\n", i);
+
  if (z==x)
    for (j=0;j<4;j++) {
+
      printf("Iguais 1\n");
        if (j==1) {
+
  if (z==y)
            continue;
+
      printf("Iguais 2\n");
        }
+
   if (z==w)
        printf("valor de j = %d\n", j);
+
      printf("Iguais 3\n");
    }
 
   }
 
 
 
 
}
 
}
 
</syntaxhighlight>
 
</syntaxhighlight>
  
  
O comando CONTINUE, quando inserido dentro de algum laço, faz com que a iteração atual seja cancelada, e o laço prossegue na próxima iteração. Ou seja, o BREAK faz todo o laço parar enquanto o CONTINUE, faz somente com que a iteração pule pra próxima.
+
[http://www.vivaolinux.com.br/dica/Limpando-a-sujeirinha-no-buffer-do-teclado Limpando sujeira do teclado]
  
;DESAFIO 2
 
  
Faça um programa em C que some todos os números, de 1 até 100, exceto os múltiplos de 3. Faça o laço ''for'' percorrer de 1 até 100 e teste se cada número deixa resto 0 quando dividido por 3. Caso deixe, é porque é múltiplo de 3 e não devemos somar. Para que isso ocorra, simplesmente pulamos essa iteração. Porém, se não for múltiplo de 3, é porque a iteração não foi pulada, ela continua, e vamos somar esse número na soma total.
+
;Como gerar os caracteres ASCII imprimíveis na Linguagem C
  
 
{{collapse top|bg=#E6E6FA|Solução}}
 
 
<syntaxhighlight lang=c>
 
<syntaxhighlight lang=c>
 
#include <stdio.h>
 
#include <stdio.h>
 
+
 
void main()
 
void main()
 
{
 
{
     int count,
+
     int i;
        soma;
+
 
+
     for (i = 32; i <= 126; i++)
     for(count=1, soma=0 ; count<=100 ; count++)
 
 
     {
 
     {
         if( count%3 ==0)
+
         printf("%c [%d]\n", i, i);
                continue;
 
 
 
        soma = soma + count;
 
 
     }
 
     }
    printf("Soma %d", soma);
 
 
}
 
}
 
</syntaxhighlight>
 
</syntaxhighlight>
{{collapse bottom}}
 
  
 +
=Exercícios=
 +
 +
Para os exercícios abaixo, fazer o algorítimo na forma de '''pseudo-código''' e '''fluxograma''':
 +
 +
#Implementar um programa C que converte temperaturas de graus Fahrenheit para Celsius.
 
<!--
 
<!--
 
 
<syntaxhighlight lang=c>
 
<syntaxhighlight lang=c>
 
#include <stdio.h>
 
#include <stdio.h>
 
+
float converter_fahreiheit_para_celsius (float temp_fahr)
void imp_linha_cheia(int margem, int num_caracteres, char car1)
 
 
{
 
{
   int i;
+
   /* melhorar - retornar -1000 se o valor do parâmetro for inválido */
 
+
   return ((temp_fahr-32)/1.8);
  for(i=0;i<margem;i++)
 
printf(" ");
 
   for(i=0;i<num_caracteres;i++)
 
printf("%c", car1);
 
  printf("\n");
 
 
}
 
}
  
void imp_linha_vazada(int margem, int num_vazados, char car1)
+
main()
 
{
 
{
   int i;
+
   float temperatura_fahre, resultado_celsius;
 
+
   printf("Entre com graus Fahrenheit -> ");
   for(i=0;i<margem;i++)
+
   scanf ("%f", &temperatura_fahre);
printf(" ");
+
   resultado_celsius = converter_fahreiheit_para_celsius(temperatura_fahre);
   printf("%c", car1);
+
   printf("Conversao = %f\n", resultado_celsius);
   for(i=0;i<num_vazados;i++)
 
printf(" ");
 
   printf("%c\n", car1);  
 
 
}
 
}
 
+
</syntaxhighlight>
void plot_ret(int margem, int num_vazados, int num_linhas_vazado, char car1)
+
-->
 +
#Implementar um programa que lê um número inteiro e imprime se o número é par ou ímpar. SUGESTÃO: Usar o operador de módulo da divisão.
 +
#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.
 +
<!--
 +
<syntaxhighlight lang=c>
 +
main()
 
{
 
{
   int i;
+
   int x,y;
 +
  float media;
  
   imp_linha_cheia(margem, num_vazados+2, car1);
+
   printf("Entre com x\n");
   for(i=0;i<num_linhas_vazado;i++)
+
  scanf("%d",&x);
     imp_linha_vazada(margem, num_vazados, car1);
+
  printf("Entre com y\n");
   imp_linha_cheia(margem, num_vazados+2, car1);
+
  scanf("%d",&y);
 +
   if (x==y)
 +
     printf("números iguais\n");
 +
   else {
 +
    printf("números diferentes\n");
 +
    media = (x+y)/2.0;
 +
  }
 
}
 
}
 
</syntaxhighlight>
 
</syntaxhighlight>
 
+
-->
 
+
#Implementar um programa para ler 4 números inteiros e imprimir uma mensagem se a soma dos dois primeiros for igual ou menor a soma dos dois últimos.
{{collapse bottom}}
+
<!--<syntaxhighlight lang=c>
 
+
main()
 
 
 
 
{{collapse top|bg=#E6E6FA|AULA 6 DIA 28/02/2014}}
 
 
 
Exercícios
 
 
 
1.Usando o comando for aninhado, construa um programa que implemente a figura abaixo. A margem esquerda (margem de espaços), o caracter do desenho, o número de linhas vazadas e o tamanho horizontal da figura deve ser lido pelo teclado.
 
  aaaaaaaaaa
 
  a       a
 
  aaaaaaaaaa
 
 
 
<syntaxhighlight lang=c>
 
#include <stdio.h>
 
 
 
void main()
 
 
{
 
{
  int i, j,num_linhas, num_colunas, margem;
+
  int num1,num2,num3,num4;
 +
  int soma1,soma2;
  
 +
  printf("Entre com num1\n");
 +
  scanf("%d", &num1);
 +
  printf("Entre com num2\n");
 +
  scanf("%d", &num2);
 +
  printf("Entre com num3\n");
 +
  scanf("%d", &num3);
 +
  printf("Entre com num4\n");
 +
  scanf("%d", &num4);
  
  printf("Entre com linhas\n");
+
  soma1 = num1+num2;
  scanf ("%d",&num_linhas);
+
  soma2 = num3+num4;
 
+
 
  printf("Entre com colunas\n");
+
  if(soma1<=soma2)
  scanf ("%d",&num_colunas);
+
      printf("Soma dos dois primeiros <= que a soma dos dois últimos\n");
 
 
  printf("Entre com margem\n");
 
  scanf ("%d",&margem);
 
 
 
 
 
  /* subproblema 1 */
 
 
 
  for (i=0;i<margem;i=i+1)
 
        printf(" ");
 
  for (i=0;i<num_colunas;i=i+1)
 
printf("A");
 
  printf("\n");
 
 
 
  /*subproblema 3 */
 
  for(j=0;j<num_linhas-2;j++) {
 
 
 
        /*subproblema 2 */
 
 
 
  for (i=0;i<margem;i=i+1)
 
printf(" ");
 
 
 
  printf("A");
 
 
 
  for(i=0;i<num_colunas-2;i=i+1)
 
printf(" ");
 
 
 
  printf("A");
 
        printf("\n");
 
  }
 
 
 
  /* subproblema 1 */
 
 
 
  for (i=0;i<margem;i=i+1)
 
        printf(" ");
 
  for (i=0;i<num_colunas;i=i+1)
 
printf("A");
 
  printf("\n");
 
 
 
 
}
 
}
 
</syntaxhighlight>
 
</syntaxhighlight>
 
+
-->
2.Construa um programa para desenhar a seguinte figura de forma parametrizável:
+
#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.
 
+
<!--
  AAAAAAAAAAAAAAAA
 
  AAAAAAAAAAAAAA
 
  AAAAAAAAAAAA
 
  AAAAAAAAAA
 
  AAAAAAAA
 
  AAAAAA
 
  AAAA
 
  AA
 
  BB
 
  BBBBB
 
  BBBBBBBB
 
  BBBBBBBBBBB
 
  BBBBBBBBBBBBBB
 
  BBBBBBBBBBBBBBBBB
 
  BBBBBBBBBBBBBBBBBBBB
 
  BBBBBBBBBBBBBBBBBBBBBBB
 
 
 
3.#Estude o programa ([http://stackoverflow.com/questions/5743678/how-to-generate-random-number-between-0-and-10-in-c referência]) abaixo:
 
 
<syntaxhighlight lang=c>
 
<syntaxhighlight lang=c>
/* rand example: guess the number */
+
main()
#include <stdio.h>
 
#include <stdlib.h>
 
#include <time.h>
 
 
 
int main ()
 
 
{
 
{
      int iSecret, iGuess;
+
  float num1,num2;
 +
  int operacao;
  
      /* initialize random seed: */
+
  printf("Entre com num1\n");
        srand ( time(NULL) );
+
  scanf("%f", &num1);
 +
  printf("Entre com num2\n");
 +
  scanf("%f", &num2);
  
      /* generate secret number: */
+
  printf("Entre com a operacao\n");
      iSecret = rand() % 10 + 1;
+
  scanf("%d", &operacao);  
  
       do {
+
  /* Esta solução pode ser otimizada - veremos
          printf ("Guess the number (1 to 10): ");
+
       mais tarde */
          scanf ("%d",&iGuess);
+
  if (operacao>=1 && operacao <=4) {
          if (iSecret<iGuess)  
+
      if (operacao==1)  
              printf ("The secret number is lower\n");
+
        resultado = num1 + num2;
          else {
+
      if (operacao==3)  
              if (iSecret>iGuess)  
+
        resultado = num1 - num2;
                printf ("The secret number is higher\n");
+
      if (operacao==3)  
          }
+
        resultado = num1 * num2;
       } while (iSecret!=iGuess);
+
      if (operacao==4) {
 
+
        if (num2!=0)
      printf ("Congratulations!\n");
+
            resultado = num1 / num2;
      return 0;
+
        else
 +
            printf("Divisao por zero\n");
 +
      }
 +
       printf("O resultado da operacao %d é %f\n",operacao,resultado);
 +
  } else {
 +
      printf("Operacao inválida");
 +
  }
 
}
 
}
</syntaxhighlight> Estude também o significado das instruções:
+
</syntaxhighlight>
  srand ( time(NULL) );
 
  iSecret = rand() % 10 + 1;
 
 
 
4.Sobre o exercício 3, implemente uma versão usando o comando while().
 
 
 
5.Elabore um programa que lê um número inteiro e imprime todos os números pares entre 1 e este número.
 
 
 
 
 
 
-->
 
-->
 +
#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.
 +
#Implementar um programa que recebe três números reais e então o programa testa se estes números podem formar um triângulo EQUILÁTERO, ISÓSCELES, ESCALENO ou NÃO pode ser triângulo. (ver aula anterior).
 +
#Implementar um programa C para converter um ângulo em radianos para graus.
 +
#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.
  
  

Edição atual tal como às 10h37min de 6 de março de 2024

Estruturas de Decisão

OBJETIVOS
O aluno terá que:
  • Conhecer os operadores relacionais e lógicos na programação C;
  • Saber utilizar o comando de decisão "if – else";
  • Saber utilizar o comando "switch – case"; e
  • Conhecer o tipo char.
METODOLOGIA
A aula será expositiva e dialogada, utilizando apresentação de texto base na Internet, onde serão mostrados exemplos E testados programas no microcomputador do laboratório de informática.


INTRODUÇÃO
Estruturas de decisão são utilizadas, em linguagens de programação modernas, para verificar um comando e efetuar decisão sobre o mesmo.
Em linguagem C podemos usar estruturas "if – else" e também "switch – case" para construir o código equivalente.


Operadores Relacionais e Lógicos

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

Relacionais
Operador Significado Exemplo
> maior que A > B
>= maior ou igual que A >= -1
< menor que B < 2
<= menor ou igual que A <= B
== igual a B == 0
!= diferente de B != A


Lógicos
Operador Significado Exemplo
&& AND (E) (A<B) && (B!=0)
|| OR (OU) (B>1)||(A==0)
! NOT (NÃO) !(A<=B)
* Atenção para o uso dos parênteses.

Ver Operadores Relacionais e Lógicos

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

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

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

Sua forma geral é:

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

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


Fig037 MCO018703.jpg

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


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

 
#include <stdio.h>

void 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>

void 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. Veja o exemplo:


  if (2)
      printf("expressão sempre VERDADEIRA");
  if ('2')
      printf("expressão sempre VERDADEIRA");      
  if (1-1)
      printf("expressão sempre FALSA");
  if (x=1) /* um erro comum - sinal de atribuição no lugar de == */
      printf("expressão sempre VERDADEIRA");
INDENTAÇÃO

Indentação Estilos

Comando switch – case

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

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


PSEUDOCÓDIGO

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

Veja estrutura escolha...caso:

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

Sintaxe do comando switch...case em linguagem C

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

   case constante2:
     Instruções;
   break;

   default
     Instruções;
}

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

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


Fig038 MCO018703.jpg

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


EXEMPLO 1

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

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


EXEMPLO 2

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

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

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


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

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

EXERCÍCIO 2

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

O switch sem o break

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

Execute o exemplo a seguir:

#include <stdio.h>

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

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

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

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

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

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

EXEMPLO 1

Suponha que você atrasou uma conta. A cada mês que você deixa de pagar, será cobrado 1% de juros no valor inicial. Ou seja, se você atrasar um mês, irá pagar 1%. Se atrasar 3 meses, irá pagar 3%. Vamos supor que você pode atrasar, no máximo, 5 meses.

O programa pede, como entrada, dois valores: - um float: com o valor de sua dívida inicial (valor_i) - um inteiro: de 0 até 5, que são o número de meses de atraso.

Faça um programa em C que calcule os juros (simples) de atraso usando switch e case acumulados.

Solução
#include <stdio.h>

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

        int meses;

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

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

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

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

}

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

EXEMPLO 2

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

Solução
#include <stdio.h>

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

    }
}

Tipo Char

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


Consulte a tabela ASCII


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


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


Limpando sujeira do teclado


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

Exercícios

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

  1. Implementar um programa C que converte temperaturas de graus Fahrenheit para Celsius.
  2. Implementar um programa que lê um número inteiro e imprime se o número é par ou ímpar. SUGESTÃO: Usar o operador de módulo da divisão.
  3. Implementar um programa em C para ler dois números inteiros e imprimir uma mensagem indicando se os números lidos são iguais ou diferentes. Caso sejam diferentes, computar a média dos mesmos.
  4. Implementar um programa para ler 4 números inteiros e imprimir uma mensagem se a soma dos dois primeiros for igual ou menor a soma dos dois últimos.
  5. Implementar um programa para ler dois números reais e, na sequência, um número inteiro. Se o número inteiro for 1 os dois números iniciais deverão ser somados, se for 2 eles serão subtraídos, se for 3 eles serão multiplicados e se for 4 serão divididos. Mostrar mensagem de erro se o número inteiro não estiver na faixa de 1 a 4. Mostrar mensagem caso a divisão não seja possível.
  6. Um estudo sobre sensibilidade de pessoas a temperaturas da água identificou que a maioria das pessoas considera fria a água com temperaturas abaixo de 25 graus, morna entre 25 e 30 graus, e quente acima de 30 graus. Escreva um algoritmo na forma de fluxograma que mostre as palavras "fria", "morna" ou "quente" dependendo da temperatura da água que for informada. Implemente o algoritmo na forma de um programa C.
  7. Implementar um programa que recebe três números reais e então o programa testa se estes números podem formar um triângulo EQUILÁTERO, ISÓSCELES, ESCALENO ou NÃO pode ser triângulo. (ver aula anterior).
  8. Implementar um programa C para converter um ângulo em radianos para graus.
  9. Implementar um programa C que recebe os 3 coeficientes de uma equação do segundo grau e então determina as raízes da mesma.




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