第一次作业

前言

我在csdn上找到了通过c语言实现万年历的代码((13条消息) C语言实现简单万年历_plokday的博客-CSDN博客_c语言万年历),在对源代码进行分析后,我发现它的功能过于单一,而且缺少提示性语句,用户使用起来很困难,故我添加了一点新功能和提示性语句以方便用户使用。

源码分析

首先源码是建立了IsLeap函数来判断某一年是否是闰年,然后在把用户输入的年和月从1990年开始计算过了多少天,将天数和7求余得出该月第一天星期几,再输出这一整个月的日历

源码运行结果如下

 

 存在的问题

除了功能单一的问题外,还有一个问题就是用户不知道按照什么格式输入,而且从源码中我们不难看出,原作者只做了1990年之后的日历,虽然可能性不大,但是用户一旦输入1990以前的年份就会出现问题,而且用户并不知道出现了问题,如下图

 

 不难发现这是1990年1月的日历,但用户并不知道,因此有可能产生问题。

改进

在原来的基础上,首先我添加了一个表单来区分我添加的功能和原有的功能

 

 然后添加了一个可以查询某年某月某日为星期几的功能以方便用户使用,使用结果如下图

 

 值得一提的是,我不仅给用户了只支持1990年之后的提示,还给出了用户输入的格式,这样就不会因为用户不知道格式而不知道如何使用的情况

最后结果如下图

 

 心得体会

1、在写代码的时候在后面加上注释,方便自己阅读的同时也方便其他人理解自己的代码。

2、最后的结果是面向用户的,在显示框加上一些提示语句方便用户使用。

3、写代码的时候想想自己怎么使用会觉得最方便,即使是添加一些很细节的功能,也会有人因此感到方便了许多

修改后代码

#include <stdio.h>
#include<stdlib.h>
#include<stdbool.h>
int year, month,day;
int run[12] = { 31,29,31,30,31,30,31,31,30,31,30,31 };
int ping[12] = { 31,28,31,30,31,30,31,31,30,31,30,31 };
char week[7][10] = { "SUN","MON","TUE","WED","THU","FRI","SAT" };
 
bool IsLeap(int year)
{
    if (year % 400 == 0 || (year % 4 == 0 && year % 100 != 0))    //判断闰年
    {
        return true;
    }
    else
    {
        return false;
    }
}
void PrintStar()
{
    printf("\t\t\t万年历\t\t\t\n");
    printf("****************************************************\n");
    for (int i = 0; i < 7; i++)
    {
        printf("%s\t", week[i]);
    }
    printf("\n");
}
int DaySum(int year, int month)
{
    int sum = 0;
    int i; 
    for (int i = 1990; i < year; i++)
    {
        if (IsLeap(i))
        {
            sum += 366;
        }
        else
        {
            sum += 365;
        }
    }
    for (int i = 0; i < month - 1; i++)
    {
        if (IsLeap(year))
        {
            sum += run[i];
        }
        else
        {
            sum += ping[i];
        }
    }
    return sum;
}
int DaySumP(int year,int month,int day){
    int sum = 0;
    int i; 
    for (int i = 1990; i < year; i++)
    {
        if (IsLeap(i))
        {
            sum += 366;
        }
        else
        {
            sum += 365;
        }
    }
    for (int i = 0; i < month - 1; i++)
    {
        if (IsLeap(year))
        {
            sum += run[i];
        }
        else
        {
            sum += ping[i];
        }
    }
    sum+=day;
    return sum;
}
 
void PrintCal(int sum, int year, int month)
{
    int nRes, nTmp;
    nRes = sum % 7+1;//前面空几格
    nTmp = 7 - nRes;//从第几格开始打印
    for (int i = 0; i < nRes; i++)
    {
        printf("\t");
    }
    if (IsLeap(year))
    {
        for (int i = 1; i < run[month - 1]+1; i++)
        {
            printf("%d\t", i);
            if (nTmp == i || (i - nTmp) % 7 == 0)
            {
                printf("\n");
            }
        }
        printf("\n");
    }
    else
    {
        for (int i = 1; i < ping[month - 1]+1; i++)
        {
            printf("%d\t", i);
            if (nTmp == i || (i - nTmp) % 7 == 0)
            {
                printf("\n");
            }
        }
        printf("\n");
    }
 
}

void Print(){
    printf("                     万年历++\n\n");
    printf("****************************************************\n");
    printf("1 查询某年某月日历\n");
    printf("2 查询某年某月某天星期几\n"); 
    printf("****************************************************\n");
}
int main(void)
{ int p;Print();int k;
    while (1)
    { 
        scanf("%d",&p);
        switch(p
        ){
        case 1 : printf("仅支持查询1990年之后的日历\n");
        printf("请按格式输入:xxxx xx\n");
        scanf_s("%d %d", &year, &month);
        PrintStar();
        PrintCal(DaySum(year, month), year, month);
        printf("****************************************************\n");
        break;
        case 2: printf("仅支持查询1990年之后的日期\n");
        printf("请按格式输入:xxxx xx xx\n");
        scanf_s("%d %d %d",&year,&month,&day);
        k=DaySumP(year,month,day);
        k=k%7;
        printf("%s\n",week[k]);
        break;
        default:
        printf("输入错误,请重新输入\n");
        
        }
    }
    
    return 0;
 
 
}
修改后代码

 

posted @ 2022-02-25 13:13  whitece  阅读(82)  评论(0)    收藏  举报