黑马程序员技术交流社区

标题: 给大家发一个之前基础测试的题,赚技术分 [打印本页]

作者: 流风124    时间: 2015-3-29 16:55
标题: 给大家发一个之前基础测试的题,赚技术分
/*

10、 小明从2006年1月1日开始,每三天结识一个美女两天结识一个帅哥,编程实现当输入2006年1月1日之后的任意一天,输出小明那天是结识美女还是帅哥(注意润年问题)(C语言)
*/
#include <stdio.h>

//全局变量:输入日期的闰年标志
int rnflag;

//定义日期的结构体变量类型
struct DATE
{
    int year;
    int month;
    int day;
};

//日期输入函数声明
void InputDate(struct DATE base,struct DATE *input);
//闰年判断函数声明
int RunNian(int year);
//当月天数判断函数声明
int RiQi(int month,int flag);
//计算相差天数函数声明
int ComputeTS(struct DATE base,struct DATE *input);
//判断函数声明
void BoyOrGirl(int tianshu);

int main(int argc, const char * argv[])
{
    printf("第10题开始:\n");
    //定义基准年月日
    struct DATE base = {2006,1,1};
    struct DATE input = {0};
    int result = 0;
    //调用输入日期函数
    InputDate(base,&input);
    //调用计算相差天数函数
    result = ComputeTS(base,&input);
    //调用函数判断,小明当前日期是结识帅哥还是美女
    BoyOrGirl(result);
    printf("第10题结束\n");
    return 0;
}
//函数:输入日期
void InputDate(struct DATE base,struct DATE *input)
{
    int date = 0;
    int rcode=0;
    //静态变量:输入次数变量(统计输入的次数)
    static int ics=0;
    while (rcode != 3)
    {
        if (ics > 0)
        {
            //清除缓存
            rewind(stdin);
            printf("输入有误(可能是日期输入的格式有误或者是输入日期的年月日有误),请重新输入!\n");
        }
        printf("请输入日期(%d年%d月%d日之后),以'-'分隔(例:2006-2-1):\n",base.year,base.month,base.day);
        rcode = scanf("%d-%d-%d",&(*input).year,&(*input).month,&(*input).day);
        ics++;
    }

    //输入日期的年与月的合法性判断
    if ((*input).year < base.year || (*input).month < 1 || (*input).month > 12)
    {
        InputDate(base,input);
    }
    //输入的年份是否是闰年的判断
    rnflag = RunNian((*input).year);
    //输入日期的日子的合法性判断
    date = RiQi((*input).month,rnflag );
    if ((*input).day < 1 || (*input).day > date)
    {
        InputDate(base,input);
    }
}

//函数:闰年的判断
int RunNian(int year)
{
    int flag = 0;
    if ((year % 4 == 0 && year % 100 != 0) || (year % 400 == 0) )
    {
        flag = 1;
    }
    return flag;
}
//当月天数判断函数
int RiQi(int month,int flag)
{
    int ts31[7] = {1,3,5,7,8,10,12};
    int ts30[4] = {4,6,9,11};
    for (int i = 0; i < 7; i++)
    {
        if (month == ts31[i])
        {
            return  31;
        }
    }
    for (int i = 0; i < 4; i++)
    {
        if (month == ts30[i])
        {
            return 30;
        }
    }
    if (flag == 1)
    {
        return 29;
    }
    else{
        return 28;
    }
}
//计算相差天数函数
int ComputeTS(struct DATE base,struct DATE *input)
{
    int tianshu[3] = {0};
    int sum = 0;
   
    //计算相差年份天数
    if (base.year < (*input).year)
    {
        for (int y = base.year; y < (*input).year; y++)
        {
            if (RunNian(y))
            {
                tianshu[0] = tianshu[0] + 366;
            }else
            {
                tianshu[0] = tianshu[0] + 365;
            }
        }
    }
    //计算月份相差天数
    if (base.month < (*input).month)
    {
        for (int m = base.month; m < (*input).month; m++)
        {
            tianshu[1] = tianshu[1] + RiQi(m, rnflag);
        }
    }
   
    //计算日子相差天数
    if (base.day < (*input).day)
    {
        tianshu[2] = tianshu[2] + ((*input).day - base.day);
    }
   
    for (int s = 0; s < 3; s++)
    {
        sum = sum + tianshu[s];
    }
    return sum + 1;
}

//函数判断,小明当前日期是结识帅哥还是美女
void BoyOrGirl(int tianshu)
{
    if (tianshu % 5 == 0 || tianshu % 5 == 4)
    {
        printf("小明今天结识的是帅哥!\n");
    }
    else
    {
        printf("小明今天结识的是美女!\n");
    }
}
作者: wzboy    时间: 2015-3-29 17:02
谢谢分享!
作者: 游戏龙    时间: 2015-3-29 18:33
谢谢分享
作者: oucding    时间: 2015-3-29 19:02
看起来很复杂的样子
作者: 老树    时间: 2015-3-29 19:38
加油 加油哦 等候藏了
作者: kim55666    时间: 2015-3-29 22:53
谢谢分享
作者: 豆子    时间: 2015-3-29 22:55
谢谢分享
作者: sydie    时间: 2015-3-29 22:59
确定要这么复杂。。。感觉不太好。。
作者: 梦想中前行    时间: 2015-3-29 23:15
好东西。当练习了。
作者: 董zhx    时间: 2015-3-29 23:29
多谢分享,学习了
作者: wupeng756    时间: 2015-3-30 01:31
你这代码写的太长了吧~~
作者: 弥风冻雪    时间: 2015-3-30 07:55
先收藏了,不久我也得参加基础测试了
作者: 约瑟翰庞麦郎    时间: 2015-3-30 08:30
我就是这道题。
作者: JRayln    时间: 2015-3-30 09:23
感谢分享
作者: 圜圉鲤    时间: 2015-3-30 09:35
又见这道题,楼主的代码写的不错哦
作者: 龙瑞麟    时间: 2015-3-30 13:48
感谢楼主分享,果断拷走
作者: 傲弛天下    时间: 2015-3-30 14:35
LZ不错,我也要准备基础测试了
作者: Wall·E    时间: 2015-3-30 15:02
谢谢 分享
作者: 夜空中的花火    时间: 2015-3-30 15:07
感觉融会贯通很不容易啊。大概要敲五遍至少吧
作者: 流风124    时间: 2015-3-31 16:41
sydie 发表于 2015-3-29 22:59
确定要这么复杂。。。感觉不太好。。

恩,怎么说呢,对于日期输入有判断,保证输入吧,感觉会严谨一些,当然,没有应该也是可以的,其他的其实不算复杂,本人能力有限,希望大家一起来交流学习
作者: 流风124    时间: 2015-3-31 16:43
圜圉鲤 发表于 2015-3-30 09:35
又见这道题,楼主的代码写的不错哦

谢谢夸奖,之前算有一点基础啦
作者: 流风124    时间: 2015-3-31 16:45
夜空中的花火 发表于 2015-3-30 15:07
感觉融会贯通很不容易啊。大概要敲五遍至少吧

我做这题是是拆成了3大块来做的,一块一块的写,然后调试,感觉思路就很清晰
作者: chensc    时间: 2015-3-31 19:00
学习学习!
作者: 非我,非非我    时间: 2015-3-31 19:54
看着好累啊,谢谢分享
作者: 帅哥    时间: 2015-3-31 21:21
谢谢分享




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2