C#数组与if-else实现星座识别程序的问题排查与简化需求
问题排查与简化代码
问题原因
输入7月5日得到双子座(Gemini)而非巨蟹座(Cancer),核心问题是日期范围的判断逻辑错误:
- 巨蟹座的正确区间是6月22日-7月22日,双子座是5月21日-6月21日
- 原代码大概率误将双子座的结束日期设为7月5日,或是把巨蟹座的起始日期设为7月6日之后,导致7月5日被错误归类到双子座区间。
简化后的代码(仅用数组+if-else)
using System; class ZodiacIdentifier { static void Main() { Console.Write("输入月份:"); if (!int.TryParse(Console.ReadLine(), out int month) || month < 1 || month > 12) { Console.WriteLine("无效月份"); return; } Console.Write("输入日期:"); if (!int.TryParse(Console.ReadLine(), out int day) || day < 1 || day > DateTime.DaysInMonth(2024, month)) { Console.WriteLine("无效日期"); return; } // 统一存储星座名称与对应日期边界 string[] zodiacs = { "Capricorn", "Aquarius", "Pisces", "Aries", "Taurus", "Gemini", "Cancer", "Leo", "Virgo", "Libra", "Scorpio", "Sagittarius" }; int[] startMonths = { 12, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 }; int[] startDays = { 22, 20, 19, 21, 20, 21, 22, 23, 23, 23, 24, 23 }; int[] endMonths = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12 }; int[] endDays = { 19, 18, 20, 19, 20, 21, 22, 22, 22, 23, 22, 21 }; string zodiac = "未知星座"; // 用if-else依次匹配每个星座的日期区间 if ((month == startMonths[0] && day >= startDays[0]) || (month == endMonths[0] && day <= endDays[0])) zodiac = zodiacs[0]; else if ((month == startMonths[1] && day >= startDays[1]) || (month == endMonths[1] && day <= endDays[1])) zodiac = zodiacs[1]; else if ((month == startMonths[2] && day >= startDays[2]) || (month == endMonths[2] && day <= endDays[2])) zodiac = zodiacs[2]; else if ((month == startMonths[3] && day >= startDays[3]) || (month == endMonths[3] && day <= endDays[3])) zodiac = zodiacs[3]; else if ((month == startMonths[4] && day >= startDays[4]) || (month == endMonths[4] && day <= endDays[4])) zodiac = zodiacs[4]; else if ((month == startMonths[5] && day >= startDays[5]) || (month == endMonths[5] && day <= endDays[5])) zodiac = zodiacs[5]; // Gemini:5.21-6.21 else if ((month == startMonths[6] && day >= startDays[6]) || (month == endMonths[6] && day <= endDays[6])) zodiac = zodiacs[6]; // Cancer:6.22-7.22 else if ((month == startMonths[7] && day >= startDays[7]) || (month == endMonths[7] && day <= endDays[7])) zodiac = zodiacs[7]; else if ((month == startMonths[8] && day >= startDays[8]) || (month == endMonths[8] && day <= endDays[8])) zodiac = zodiacs[8]; else if ((month == startMonths[9] && day >= startDays[9]) || (month == endMonths[9] && day <= endDays[9])) zodiac = zodiacs[9]; else if ((month == startMonths[10] && day >= startDays[10]) || (month == endMonths[10] && day <= endDays[10])) zodiac = zodiacs[10]; else if ((month == startMonths[11] && day >= startDays[11]) || (month == endMonths[11] && day <= endDays[11])) zodiac = zodiacs[11]; Console.WriteLine($"星座:{zodiac}"); } }
代码说明
- 输入校验:新增了月份和日期的有效性判断,避免非法输入导致的错误
- 数组管理:将星座名称、起始/结束月日统一存入数组,减少重复代码,便于维护日期边界
- 逻辑修正:明确了巨蟹座(6.22-7.22)和双子座(5.21-6.21)的区间,确保7月5日能正确匹配到巨蟹座
- if-else逻辑:按顺序逐个匹配星座区间,逻辑直观且符合要求
内容的提问来源于stack exchange,提问作者Shinobu
相关产品推荐
相关产品推荐

