本程序对星座的计算是以公历为准,计算的方式多种多样,下面介绍一种计算星座的方法:
.以通过判断和计算得到数组对应的索引来找到星座
#import <Foundation/Foundation.h>
#define num(n) [NSNumber numberWithInt:n] /*一个宏,用来封装整型数为NSNumber类型的对象,方便存入NSArray的数组中*/
int main(int argc, const char * argv[])
{
@autoreleasepool {
// insert code here...
/*存放星座,0~11的索引分别存着1~12月的星座,算法的核心思想是怎么把他们对应起来,也就是进行映射*/
NSArray *array=[NSArray arrayWithObjects:@"摩羯座",@"水瓶座",@"双鱼座",@"白羊座",@"金牛座",@"双子座",@"巨蟹座",@"狮子座", @"处女座",@"天秤座",@"天蝎座",@"射手座",nil];
/*存放的是1~12月的每个月星座的判断界限,大于这个界限,是下个星座,小于这个界限是这个星座*/
NSArray *numb=[NSArray arrayWithObjects:num(19),num(18), num(20),num(19),num(20),num(21),num(22),num(22),num(22),num(23),num(22),num(21),nil];
/*存放的是1~12月每月的天数,主要是为了判断输入日期是否合法,例如你输入一个2013/01/70,如果不判断是否输入正确,可能就能进行正确输出结果水瓶座,但是这不符合实际情况*/
NSArray *numDay=[NSArray arrayWithObjects:num(31),num(28), num(31),num(30),num(31),num(30),num(31),num(31),num(30),num(31),num(30),num(31),nil];
char birthDate[14];/*用来获取输入的日期*/
NSString *date;/*用来进行日期分割*/
NSArray *arr;/*存放分割的年月日的数组*/
int m,d;
while (1) {
printf("请输入测试的出生日期(公历日期格式yyyy/mm/dd):");
scanf(" %s",birthDate);
date=[NSString stringWithFormat:@"%s",birthDate];
arr=[date componentsSeparatedByString:@"/"];
if ([arr count]==3) {/*如果分割后的数组刚好是3个索引,说明输入格式是正确的,能分割出年月日*/
m=[[arr objectAtIndex:1] intValue];
d=[[arr objectAtIndex:2] intValue];
int y=[[arr objectAtIndex:0] intValue];/*得到年份是为了防止出现输入2月29日这种情况*/
if (m>0&&d>0&&m<13&&d<32&&y>0) {
if (y%400==0||(y%400!=0&&y%4==0)) {//判断是否是闰年,进行2月29日这种情况的判断
if (m==2 &&d<=29) {//合法,跳出死循环,进行下步星座计算操作
break;
}
}
if (d<=[[numDay objectAtIndex:m-1] intValue]) {//合法,跳出死循环,进行下步星座计算操作
break;
}
}
}
NSLog(@"输入的日期格式不合法或含有非法字符!!!");
}
m=(m+11)%12;//现将月份转换成正常的索引形式1~0 ,...12~11
if (d>[[numb objectAtIndex:m] intValue]) {//大于这个月星座界限
m=(m+1)%12;//跳到下一个索引
NSLog(@"%@",[array objectAtIndex:m]);
}//小于就是这个月的星座
else NSLog(@"%@",[array objectAtIndex:m]);
}
return 0;
}
这个程序看着很庞大了一点,但是其实真正的算法并没有多少的东西,主要是用于对输入日期合法性的判断,也许有人认为这些判断是无用的,但是作为一个程序员我认为更应该有严谨的思路,这样编写的程序才会更健壮。当然有时候考虑到成本和运行速度的问题,一些低级的程序bug是可以忽略的,不过在平常的练习中,建议养成这样的好习惯.