• 每日一题——输入一个日期,输出它是该年的第几天


    哈喽大家好,我是保护小周ღ,本期为大家带来的是编程实现输入某年某月某日,输出它是这一年的第几天,一起来看看把~

     

    题目:

    多组输入,编程实现输入某年某月某日,输出它是这一年的第几天。

    (注意数据输入范围)

    实例1:

    输入:

    2021-5-1

    输出:

    It is not a leap year.

    Today is the 121 day of the year.

    实例2:

    输入:

    2000-5-1

    输出:

    It is a leap year.

    Today is the 122 day of the year.

    实例3:

    输入:

    2020-13-12

    输出:

    Input error, please re-enter the date.

    思路解析:

    首先我们输入一个日期,我们可以定义三个变量year,month,day,代表年月日,也可以用结构体描述一个日期。利用switch(month)函数判断该年月日有多少天,输入年份,如果该年是闰年,那么该年的2月有29天,否则2月只有28天。

    一个月有31天的月份有1 3 5 7 8 10 12

    一个月有30天的月份有4 6 9 11

    闰年的判断条件,年份能被4整除且不能被100整除,但是能够被400整除的才算闰年。

    题目还涉及到多组输入,这个问题我们就要了解一下scanf()函数;scanf()是针对标准输入流的格式化输入函数。

    怎样实现多组输入呢? scanf() 函数是有返回值的,scanf()的返回值是已经成功赋值的变量个数,且为整型。

    例如:

    int size=scanf("%d %d",&a,&b);

    键盘输入1 2时scanf()的返回值就是2,所以size==2;

    如果只有a或b其中一个被成功读入,那么scanf()的返回值为1;

    如果只有a和b 都未被成功读入,返回值为0;

    另外还有一种写法是多组输入的写法是要用到EOF,EOF 是 end of file的缩写,表示“文字流”的结尾(file),也可以是标准输入的结尾(stdin)。

    例如:

    int size=scanf("%d %d",&a,&b);

    如果 遇到错误或者是遇到了end of file 返回值就为EOF。

    所以我们多组输入可以这样写:

    1. while(scanf("%d %d",&a,&b)==2)
    2. {
    3. ……
    4. }

    还可以这样写:

    1. while(scanf("%d %d",&a,&b)!=EOF)
    2. {
    3. ……
    4. }

    代码实现:

    1. #include<stdio.h>
    2. //判断是否闰年,若是闰年则返回1,若不是闰年则返回0
    3. int IfLeapYear(int year)
    4. {
    5. if (year % 4 == 0 && year % 100 != 0 || year % 400 == 0)
    6. return 1;
    7. else
    8. return 0;
    9. }
    10. //Days函数:判断有多少天
    11. Days(int year, int month, int day)
    12. {
    13. int d, days = 0;
    14. //判断是否闰年
    15. int size = IfLeapYear(year);
    16. if (size == 0)
    17. {
    18. printf("It is not a leap year.\n");
    19. }
    20. else
    21. {
    22. printf("It is a leap year.\n");
    23. }
    24. //遍历已经完整过去的月份,并统计每个满月的天数
    25. for (int i = 1; i < month; i++)
    26. {
    27. switch (i)
    28. {
    29. case 2:
    30. if(size==1)
    31. {
    32. d = 29;
    33. }
    34. else
    35. {
    36. d = 28;
    37. }break;
    38. case 1:
    39. case 3:
    40. case 5:
    41. case 7:
    42. case 8:
    43. case 10:
    44. case 12:d = 31; break;
    45. case 4:
    46. case 6:
    47. case 9:
    48. case 11:d = 30; break;
    49. default:printf("error\n");
    50. }
    51. days += d;
    52. }
    53. //统计“残月”的天数
    54. days += day;
    55. return days;//返回总天数
    56. }
    57. int main()
    58. {
    59. int year, month, day;
    60. printf("请输入一个日期,判断他是一年的那一天。\n");
    61. while (scanf("%d-%d-%d", &year, &month, &day)==3)//scanf("%d-%d-%d", &year, &month, &day)!=EOF
    62. {
    63. //判断月份是否输入正确
    64. if (month < 1 || month>12)
    65. {
    66. printf("Input error, please re-enter the date:\n");
    67. }
    68. else
    69. printf("Today is the %d day of the year.\n",Days(year, month, day));
    70. }
    71. return 0;
    72. }

    用结构体描述日期:

    1. //定义日期类型
    2. typedef struct Date
    3. {
    4. int year;
    5. int month;
    6. int day;
    7. }Date;
    8. int main()
    9. {
    10. //定义日期类型的Date1变量
    11. Date Date1;
    12. printf("请输入一个日期,判断他是一年的那一天。\n");
    13. while (scanf("%d-%d-%d", &Date1.year, &Date1.month, &Date1.day) == 3)//scanf("%d-%d-%d", &year, &month, &day)!=EOF
    14. {
    15. if (Date1.month < 1 || Date1.month>12)
    16. {
    17. printf("Input error, please re-enter the date:\n");
    18. }
    19. else
    20. //这样我们就可以把Date类型的Date1变量作为一个整体传参,如果传地址就可以用Date* 的指针接收,通过指针访问Date1的各个成员
    21. printf("Today is the %d day of the year.\n", Days(&Date1);
    22. }
    23. return 0;
    24. }

    在结构体方面有什么不懂得,可以参考博主的另一篇博客,详细的介绍了

    1.结构体类型的声明

    2.结构体初始化

    3.结构体成员访问

    4.结构体传参

    http://t.csdn.cn/Uz3um

     感兴趣的朋友可以用博主的方法,或者是自己的方法做做这道题,优化一下代码,尝试怎样判断我们在正确输入月份后,输入的天数在正确的范围内呢?欢迎评论区留言。

    分享一个牛客网上类似的题目,大家也可以尝试着做一做。

    链接:一年中的第几天_哔哩哔哩笔试题_牛客网

    感谢每一个观看本篇文章的朋友,更多精彩敬请期待:保护小周ღ  *★,°*:.☆( ̄▽ ̄)/$:*.°★* 

      如有侵权请联系修改删除!

     

  • 相关阅读:
    10.正则表达式匹配
    SpringBoot整合第三方技术
    Perl连接mysql数据库
    第1章 HTML&第2章 CSS-JS
    10月面试js基础
    Word控件Spire.Doc 【页面背景】教程(9) ;C#/VB.NET:从 Word 文档中删除文本或图像水印
    jvm堆大小的设置
    Vim 项目重要维护者去世,Vim 之父以 Vim 9 悼念挚友
    C++作业2:类与类关系设计
    深入了解Elasticsearch的CRUD:ES Java API之增删改查
  • 原文地址:https://blog.csdn.net/weixin_67603503/article/details/125584568