针对某些机器环境不允许将测试数据粘贴到console中(黑黑的窗口里),为减少重复性输入,而采用从文件中读取输入.(建议在统一目录创建输入文件)
 可以编写对应的编译预处理来切换输入模式
/*
帮助小明写一个程序,算出一个人的生日是星期几,
输入
输入多组测试数据,每组数据一行,包括三个整数:年(1个空格)月(1个空格)日。
输入0(1个空格)0(1个空格)0表示结束。
输出
请输出星期几的英文。就用1,2,3,4,5,6,7表示星期几.
2013 12 18
2010 2 1
1999 7 24
2008 1 13
0 0 0
样例输出
3
1
6
7
*/
/*用这个宏作开关,切换模式*/
int is_leap_year(int year);
int days_after_0(int year, int month, int day, int(*monthdays)[13]);
int main()
{
  int ty, tm, td, tw;/*今天当天的参数*/
  int year, month, day;/*以前某天的参数*/
  int delta;
  int sum_pre = 0, sum_now = 0;
  int year_month[2][13] = {
    {0,31,28,31,30,31,30,31,31,30,31,30,31},/*平年year_month[0]*/{0,31,29,31,30,31,30,31,31,30,31,30,31}/*闰年year_month[1]*/ };
  /*从文件中获取输入(文件名变量)*/
  char path[] = "test_data.txt";
  FILE* fp=0;/*文件指针,保存文件流地址*/
  if (read_from_console){ }
  else
  {
    /*不要反复打开文件,所以没有放在循环里*/
    fp = fopen(path, "r");
    if (fp == NULL)
    {
      printf("读取出错!\n");
      exit(1);
    }
    /*从文件中读入输入数据:*/
    
  }
  while (1)
  {//利用同起点相减法求解
    printf("输入想要查询的年/月/日:\n");
    if (read_from_console )
    {
      scanf_s("%d %d %d", &year, &month, &day);/*用scanf()也可scanf_s()在从键盘读取输入时可以不用第三个参数*/
      
    }
    else
    {
      fscanf(fp, "%d %d %d", &year, &month, &day);
    }
    printf("今天的日期:年/月/日,以及星期几:\n");
    //scanf("%d%d%d%d", &ty, &tm, &td, &tw);  
    printf("内部设定为2020 9 7 星期1\n");
    ty = 2020; tm = 9; td = 7; tw = 1;
    /*判断是否离开循环:*/
    if (year || month || day) {}
    else
      break;
    sum_pre = days_after_0(year,year, month, day, year_month);
    sum_now = days_after_0(year,ty, tm, td, year_month);
    //printf("%d %d %d->sum = %d\n", year, month, day, sum_pre);/*测试用句*/
    delta = sum_now - sum_pre;
    printf("%d %d %d -> sum_now=%d\n%d %d %d -> sum_pre=%d\n", ty, tm, td, sum_now, year, month, day, sum_pre);
    printf("delta:%d\n", delta);
    /*打印结果:*/
    int result = (tw - delta % 7 + 7) % 7;
    if (result == 0)
    {
      result = 7;
    }
    printf("%d\n", result);
  }
  /*记得在用完后关闭文件连接*/
  if (!read_from_console)
  {
    fclose(fp);
  }
}
int is_leap_year(int year)
{
  if (year % 4 == 0 && year % 100 != 0 || year % 400 == 0)
  {
    return 1;
  }
  return 0;
}
int days_after_0(int year_pre, int year,int month, int day, int(*monthdays)[13])
{
  int sum = 0;
  if (year > year_pre)
    for (int i = year_pre/*从1优化为year*/; i < year; i++)
    {
      if (is_leap_year(i))/*小心参数别写作year了(很容易错)*/
      {
        sum += 366;
      }
      else
      {
        sum += 365;
      }
    }
  /*加上当年的月加天:*/
  for (int i = 1; i < month; i++)
  {
    if (is_leap_year(year))
    {
      sum += monthdays[1][i];
    }
    else
    {
      sum += monthdays[0][i];
    }
  }
  sum += day;
  return sum;
}“test_data.txt”
2013 12 18
 2010 2 1
 1999 7 24
 2008 1 13
 0 0 0
                
                










