/* 4.(****)反复校验用户输入的生日,包括年、月、日。直到年、月、日都合法。
提示:
(1)使用while循环实现反复校验
(2)使用switch实现校验
(3)只有闰年才有2月29日
(4)1、3、5、7、8、10、12,每个月有31天
(5)4、6、9、11,每个月有30天
*/
// 当时不会做
int year = 0,month = 0,day = 0;
//while的条件表达式使用YES,用于一直循环
while (YES) {
printf("请输入生日(包含年月日):");
scanf("%d %d %d",&year,&month,&day);
int daysForFeb = 28;
if (year % 400 == 0 || (year % 4 == 0 && year % 100 != 0)) {
daysForFeb = 29;
}
switch (month) {
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
case 12: {
if (day >= 1 && day <= 31) {
printf("%d-%d-%d是一个合法的生日\n",year,month,day);
}else{
printf("%d-%d-%d不是一个合法的生日,请重新输入生日\n",year,month,day);
continue;
}
break; // (1)
}
case 2: {
if (day >= 1 && day <= daysForFeb) {
printf("%d-%d-%d是一个合法的生日\n",year,month,day);
}else{
printf("%d-%d-%d不是一个合法的生日,请重新输入生日\n",year,month,day);
continue;
}
break;// (1)
}
case 4:
case 6:
case 9:
case 11: {
if (day >= 1 && day <= 30) {
printf("%d-%d-%d是一个合法的生日\n",year,month,day);
}else{
printf("%d-%d-%d不是一个合法的生日,请重新输入生日\n",year,month,day);
continue;
}
break;// (1)
}
default: {
printf("%d-%d-%d不是一个合法的生日,请重新输入生日\n",year,month,day);
continue;
break;// (1)
}
}
// 结束循环
break;//(2)
}
分析:如果输入的是一个合法的生日,他会利用case中的(1)break跳出switch...case语句,然后再利用后面的代码(2)break结束整个while循环。(1)break不能直接跳出整个while循环。
如果是输入的是一个不合法的生日,他会利用contiue不再之后其后面的所有代码,switch对continue是透明的,直接进入新一轮的while循环。,