欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

用JavaScript实现星座判断

程序员文章站 2022-04-05 08:05:19
...

用JavaScript实现星座判断

前言

​ 对前端的热爱可以延续到对生活的热爱,这是我在逆战班学习的第六个星期,开始学习脚本语言JavaScript使得我的前端开发有了更多的可能性。我认为编程学习不应该只局限于课堂,能够结合自己的想法去做一些简单的功能实现才是最好的学习方法。因此本周我尝试着用自己所学的JavaScript知识编译了一个简单的程序用于判断输入日期对应的星座。

准备工作

​ 在开始写代码之前,我们需要对自己的需求做一个简单的分析,首先我们不得不了解的就是星座的分布规律。

星座名称 白羊座 金牛座 双子座 巨蟹座 狮子座 处女座
对应日期 3.21 - 4.19 4.20 - 5.20 5.21 - 6.21 6.22 - 7.22 7.23 - 8.22 8.23 - 9.22
星座名称 天秤座 天蝎座 射手座 摩羯座 水瓶座 双鱼座
对应日期 9.23 - 10.23 10.24 - 11.22 11.23 - 12.21 12.22 - 1.19 1.20 - 2.18 2.19 - 3.20

编译思路

思路1:以星座为对象来寻找其对应范围
根据以上表格可以看出,每一个星座的日期基本都始于当月20日前后,结束于下一个月20日前后。
例如要判断处于1月20日到2月18日的水瓶座,我们需要判断月份“是否是1月,日期是否大于20日且小于31日”以及“是否是2月,日期是否小于18日”满足其中一个条件,输出“星座是水瓶座”。代码如下:

var getMonth = parseInt(prompt("请输入月份")), getDay = parseInt(prompt("请输入日期"));
if ((getMonth == 1 && getDay >= 20 && getDay <= 31)||(getMonth == 2 && getDay <= 18)) {
	alert(`${getMonth}${getDay}日是水瓶座。`);
} 

​ 从以上代码可以看出,如若直接针对每一个星座写判断条件的话,不仅要考虑月份,还需要考虑日期,并且由于每个月的天数不同还需对日期的合理性进行判断,这样的代码太过冗余。

思路2:以月份为对象来判断对应的日期对应的星座
比如判断2月的星座,代码如下:

var getMonth = parseInt(prompt("请输入月份")), getDay = parseInt(prompt("请输入日期"));
switch (getMonth){
  case 2: 
    if(getDay >= 1 && getDay <= 18 ){
      alert(`${getMonth}${getDay}日是水瓶座。`);
    }else if(getDay >= 18 && getDay <= 29 ){
      alert(`${getMonth}${getDay}日是双鱼座。`);
    }break;
}

将以月作为先决条件,判断输入的日期是否在当月的最大天数内,再判断当月的日期以确定星座,这种思路就简单了许多。

代码简化

虽然从上面的代码中,我们得到了想要的结果,但是诸如用于判断日期范围和弹窗提示的代码存在很多重复,为了加强代码的可读性,节约计算机资源,我们可以进行适当的简化。
我们不妨单独声明一个容器用于存储控制弹窗结果的变量,当循环中满足条件式,修改变量即可,由此可以写为

var getMonth = parseInt(prompt("请输入月份")), getDay = parseInt(prompt("请输入日期"));
var res = null; //单独声明一个用于存放星座输出结果的容器。
switch (getMonth){
  case 2: 
    if(getDay >= 1 && getDay <= 18 ){
      res = '水瓶座';
    }else if(getDay >= 18 && getDay <= 29 ){
      res = '双鱼座';
    }break;
}
alert(res ? `${getMonth}${getDay}日是${res}。`:`请输入有效日期`);

​ 经过进一步观察,每个月的天数范围都在1~31之间,且部分月份只有30天或29天,由此不妨给switch循环外再包裹一个if判断语句,用于筛除不符合要求的天数,再根据几个特殊月份的最大天数,分别定义判断式,由此可以写出以下12个月的代码。

var getMonth = parseInt(prompt("请输入月份")), getDay = parseInt(prompt("请输入日期"));
var res = null; //单独声明一个用于存放星座输出结果的容器。
var lastDay = (getDay <= 30),FebDay = (getDay <= 29); //用于限制当月最大天数
if(getDay >= 1 || getDay <= 31){
  switch (getMonth){
    case 1://1月星座
      if(getDay <= 19){res = '摩羯座';}else if(getDay >= 20){res = '水瓶座';}break;
    case 2: //2月星座
      if(getDay <= 18){res = '水瓶座';}else if(getDay >= 18 && FebDay){res = '双鱼座';}break;
    case 3://3月星座
      if(getDay <= 20){res = '双鱼座';}else if(getDay >= 21){res = '白羊座';}break;
    case 4: //4月星座
      if(getDay <= 19){res = '白羊座';}else if(getDay >= 20 && lastDay){res = '金牛座';}break;
    case 5://5月星座
      if(getDay <= 20){res = '金牛座';}else if(getDay >= 21){res = '双子座';}break;
    case 6://6月星座
      if(getDay <= 21){res = '双子座';}else if(getDay >= 22 && lastDay){res = '巨蟹座';}break;
    case 7://7月星座
      if(getDay <= 22){res = '巨蟹座';}else if(getDay >= 23){res = '狮子座';}break;
    case 8://8月星座
      if(getDay <= 22){res = '狮子座';}else if(getDay >= 23){res = '处女座';}break;
    case 9://9月星座
      if(getDay <= 22){res = '处女座';}else if(getDay >= 23 && lastDay){res = '天秤座';}break;
    case 10://10月星座
      if(getDay <= 23){res = '天秤座';}else if(getDay >= 24){res = '天蝎座';}break;
    case 11://11月星座
      if(getDay <= 22){res = '天蝎座';}else if(getDay >= 23 && lastDay){res = '射手座';}break;
    case 12://12月星座
      if(getDay <= 21){res = '射手座';}else if(getDay >= 22){res = '摩羯座';}break;
  }
}
alert(res ? `${getMonth}${getDay}日是${res}。`:`请输入有效日期`);

最后,还有一个需要注意的地方,便是浮点数问题,理论上日期和月份必须为整数,如何在访问者输入了小数以后提示输入错误呢?其实只需要加入一个简单的判断,即对输入数字进行取整,再判断取整结果是否与取整前相等即可。

var getMonth = prompt("请输入月份"), getDay = prompt("请输入日期");
if(getMonth == parseInt(getMonth) && getDay == parseInt(getDay)){
  getMonth = parseInt(getMonth), getDay = parseInt(getDay);
  zodiac();
}
else{alert(`请输入有效日期`)};

function zodiac(){
  var res = null; //单独声明一个用于存放星座输出结果的容器。
	var lastDay = (getDay <= 30),FebDay = (getDay <= 29); //用于限制当月最大天数
  if(getDay >= 1 || getDay <= 31){
  switch (getMonth){
    case 1://1月星座
      if(getDay <= 19){res = '摩羯座';}else if(getDay >= 20){res = '水瓶座';}break;
    case 2: //2月星座
      if(getDay <= 18){res = '水瓶座';}else if(getDay >= 18 && FebDay){res = '双鱼座';}break;
    case 3://3月星座
      if(getDay <= 20){res = '双鱼座';}else if(getDay >= 21){res = '白羊座';}break;
    case 4: //4月星座
      if(getDay <= 19){res = '白羊座';}else if(getDay >= 20 && lastDay){res = '金牛座';}break;
    case 5://5月星座
      if(getDay <= 20){res = '金牛座';}else if(getDay >= 21){res = '双子座';}break;
    case 6://6月星座
      if(getDay <= 21){res = '双子座';}else if(getDay >= 22 && lastDay){res = '巨蟹座';}break;
    case 7://7月星座
      if(getDay <= 22){res = '巨蟹座';}else if(getDay >= 23){res = '狮子座';}break;
    case 8://8月星座
      if(getDay <= 22){res = '狮子座';}else if(getDay >= 23){res = '处女座';}break;
    case 9://9月星座
      if(getDay <= 22){res = '处女座';}else if(getDay >= 23 && lastDay){res = '天秤座';}break;
    case 10://10月星座
      if(getDay <= 23){res = '天秤座';}else if(getDay >= 24){res = '天蝎座';}break;
    case 11://11月星座
      if(getDay <= 22){res = '天蝎座';}else if(getDay >= 23 && lastDay){res = '射手座';}break;
    case 12://12月星座
      if(getDay <= 21){res = '射手座';}else if(getDay >= 22){res = '摩羯座';}break;
  	}
	}alert(res ? `${getMonth}${getDay}日是${res}。`:`请输入有效日期`);
}

至此星座判断的JavaScript脚本就写完了,可能还有一些不足,但已是我目前的所有实力。我还会继续前端学习,我相信只要不断努力超越自我,总有一天我也能成为一名真正的前端工程师。

相关标签: 代码实现