计算星座算法解析

      本程序对星座的计算是以公历为准,计算的方式多种多样,下面介绍一种计算星座的方法:

.以通过判断和计算得到数组对应的索引来找到星座

#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是可以忽略的,不过在平常的练习中,建议养成这样的好习惯.

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值