Jump to content

[Resolvido] Switch - case label value has already appeared in this switch


Recommended Posts

Posted

Boas, estou a fazer um programa em que o utilizador insere a data actual e o programa irá dar a data do dia seguinte.

Estou com um erro no meu switch.

Quando faço o 'case 4 ||..', ele dá erro no 4. case label value has already appeared in this switch

Pelo que li, eu supostamente já usei o 4 em outro case, mas não o fiz.

O que está mal?

#include <stdio.h>
#include <stdlib.h>
int dia, mes, ano;
void main()
{
printf("Introduza o ano em que se encontra: ");
scanf("%d", &ano);
printf("\nIntroduza o mes em que se encontra: ");
scanf("%d", &mes);
if (mes > 0 && mes < 12)
{
 /* Coincide com um mês válido*/
 switch (mes)
 {
  case 1 || 3 || 5 || 7 || 8 || 10 || 12:
   /* Meses com 31 Dias */
   printf("\nIntroduza o dia: ");
   scanf("%d", &dia);
   if (dia > 0 && dia < 32)
   {
 dia = dia + 1;
 if(dia > 31)
 {
  dia = 1;
  mes = mes + 1;
  if (mes > 12)
  {
   mes = 12;
   ano = ano +1;
  }
 }
 printf("Data: %d-%d-%d \n", dia, mes, ano);
   }
   else
   {
 printf("\n Esse dia nao e valido! \n");
   }
   break;
  case 4 || 6 || 9 || 11:
   /* Meses com 30 Dias */
   break;
  case 2:
   /* Mes de Fevereiro - 28 Dias */
   break;

 }
}
else
{
 printf("\nO mes inserido nao existe \n");
}
system("PAUSE");
}
Posted

Em primeiro lugar a tua condição

 if(mes > 0 && mes < 12) 

está incorreta pois assim nao chega a entrar no mês de dezembro, sendo entao deve ser

 if(mes > 0 && mes <= 12 

,

Quanto ao teu erro, ou muito me engano ou nao podes colocar os cases no switch como colocas-te, (corrijam-me se estiver errado)

o teu switch deve ser algo como:


#include <stdio.h>
#include <stdlib.h>
int dia, mes, ano;

int main(void) {
   printf("Introduza o ano em que se encontra: ");
   scanf("%d", &ano);
   printf("\nIntroduza o mes em que se encontra: ");
   scanf("%d", &mes);
   if (mes > 0 && mes <= 12) {
       /* Coincide com um mês válido*/
       switch (mes) {
           case 1:
           case 3:
           case 5:
           case 7:
           case 8:
           case 10:
           case 12:
               /* Meses com 31 Dias */
               printf("\nIntroduza o dia: ");
               scanf("%d", &dia);
               if (dia > 0 && dia < 32) {
                   dia = dia + 1;
                   if (dia > 31) {
                       dia = 1;
                       mes = mes + 1;
                       if (mes > 12) {
                           mes = 12;
                           ano = ano + 1;
                       }
                   }
                   printf("Data: %d-%d-%d \n", dia, mes, ano);
               } else {
                   printf("\n Esse dia nao e valido! \n");
               }
               break;
           case 4:
           case 6:
           case 9:
           case 11:
               /* Meses com 30 Dias */
               break;
           case 2:
               /* Mes de Fevereiro - 28 Dias */
               break;

       }
   } else {
       printf("\nO mes inserido nao existe \n");
   }
   return 0;
}

Caso queiras o teu código mais "portável" nao uses

system("PAUSE")
Posted (edited)

Quando o compilador vê

case 1 || 3 || 5 || 7 || 8 || 10 || 12:

é como se visse

case (1 || 3 || 5 || 7 || 8 || 10 || 12):

e o operador binário || (OR) devolve 0 ou 1, por isso aquele case é como se fosse

case 1:

O teu case seguinte

case 4 || 6 || 9 || 11:

é como se fosse

case (4 || 6 || 9 || 11):

ou

case 1:

que é uma repetição do anterior.

Usa o "fall-through" dos cases

case 1: /* fall-through */
case 3: /* fall-through */
case 5: /* fall-through */
case 7: /* fall-through */
case 8: /* fall-through */
case 10: /* fall-through */
case 12: /* meses com 31 dias */
        /* ... */
        break;

case 4: /* fall-through */
case 6: /* fall-through */
case 9: /* fall-through */
case 11: /* meses com 30 dias */
        /* ... */
        break;
Edited by pmg
  • Vote 1

What have you tried?

Não respondo a dúvidas por PM

A minha bola de cristal está para compor; deve ficar pronta para a semana.

Torna os teus tópicos mais atractivos e legíveis usando a tag CODE para colorir o código!

Posted (edited)

Desculpa pela demora na resposta, mas agradeço desde já a ajuda.

Já resolvi o problema como disseste e funcionou 100% 😉

Quanto ao

system("PAUSE");

como resolvo para o programa não fechar imediatamente após aparecer o resultado pretendido?

Edited by nunolevezinho
Posted

Desculpa pela demora na resposta, mas agradeço desde já a ajuda.

Já resolvi o problema como disseste e funcionou 100% 😉

Quanto ao

system("PAUSE");

como resolvo para o programa não fechar imediatamente após aparecer o resultado pretendido?

A mim também me disseram isso uma vez, para não usar o system("PAUSE") caso quisesse o programa mais portável, então coloco um getchar(); no final .. Mas não sei se será essa a melhor maneira, mas também não me lembro de outra..

Corrige um sábio e ele mais sábio ficará. Corrige um ignorante e um inimigo ganharás.

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.