A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

/*

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");
    }
}

24 个回复

倒序浏览
谢谢分享!
回复 使用道具 举报
谢谢分享
回复 使用道具 举报
看起来很复杂的样子
回复 使用道具 举报
加油 加油哦 等候藏了
回复 使用道具 举报
谢谢分享
回复 使用道具 举报
豆子 中级黑马 2015-3-29 22:55:29
7#
谢谢分享
回复 使用道具 举报
sydie 中级黑马 2015-3-29 22:59:43
8#
确定要这么复杂。。。感觉不太好。。
回复 使用道具 举报
好东西。当练习了。
回复 使用道具 举报
董zhx 来自手机 中级黑马 2015-3-29 23:29:23
10#
多谢分享,学习了
回复 使用道具 举报
你这代码写的太长了吧~~
回复 使用道具 举报
先收藏了,不久我也得参加基础测试了
回复 使用道具 举报
我就是这道题。
回复 使用道具 举报
感谢分享
回复 使用道具 举报
又见这道题,楼主的代码写的不错哦
回复 使用道具 举报
感谢楼主分享,果断拷走
回复 使用道具 举报
LZ不错,我也要准备基础测试了
回复 使用道具 举报
谢谢 分享
回复 使用道具 举报
感觉融会贯通很不容易啊。大概要敲五遍至少吧
回复 使用道具 举报
sydie 发表于 2015-3-29 22:59
确定要这么复杂。。。感觉不太好。。

恩,怎么说呢,对于日期输入有判断,保证输入吧,感觉会严谨一些,当然,没有应该也是可以的,其他的其实不算复杂,本人能力有限,希望大家一起来交流学习
回复 使用道具 举报
12下一页
您需要登录后才可以回帖 登录 | 加入黑马