nunolevezinho Posted October 16, 2012 at 09:17 AM Report #479309 Posted October 16, 2012 at 09:17 AM 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"); }
mundo Posted October 16, 2012 at 09:38 AM Report #479313 Posted October 16, 2012 at 09:38 AM 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")
pmg Posted October 16, 2012 at 09:42 AM Report #479315 Posted October 16, 2012 at 09:42 AM (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 October 16, 2012 at 09:43 AM by pmg 1 Report 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!
nunolevezinho Posted October 20, 2012 at 05:49 PM Author Report #479874 Posted October 20, 2012 at 05:49 PM (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 October 20, 2012 at 05:49 PM by nunolevezinho
polska Posted October 20, 2012 at 06:52 PM Report #479876 Posted October 20, 2012 at 06:52 PM 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.
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now