高手指导一下,怎样用C语言编写一个计算单双周的程序,并能显示这是第几周,输入一个日期定为单周,然后自

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了高手指导一下,怎样用C语言编写一个计算单双周的程序,并能显示这是第几周,输入一个日期定为单周,然后自相关的知识,希望对你有一定的参考价值。

动给出以后每天是单周还是双周,并且可以知道已经过了几周,我现成的程序更好,或是完整的代码给小弟研究一下,感激不尽!!!!

#include <stdio.h>

const char WEEK_DAYS_NAME[7][10]="星期日","星期一","星期二","星期三","星期四","星期五","星期六";

/*
设定一个最小的系统日期,并且指定改天是星期几
*/
/*最小的系统日期年份,默认是 2000 年*/
const int START_YEAR = 2000;
/*日最小的系统日期月份,默认是 1 月*/
const int START_MONTH = 1;
/*最小的系统日期,默认是 1 号*/
const int START_DAY = 1;
/*最小的系统日期所在的星期,默认是星期六(2000年1月1日是星期六)*/
const int START_WEEK_DAY = 6;

/*
功能:
计算指定的 year 年 month 月的天数
*/
int getDaysOfMonth(int year ,int month)

const int daysOfMonth[] = 0,31,28,31,30,31,30,31,31,30,31,30,31;

// 闰年的二月份
if( month == 2 && ( (year%4==0 && year%100!=0) || year %400==0 ))

return daysOfMonth[month] +1;

else

return daysOfMonth[month];



/*
功能:
计算 year 年 month 月 day 日
距离
START_YEAR 年 START_MONTH 月 START_DAY 日
的天数
*/

int getDiffDays(int year ,int month , int day)

int diffDays = 0 ;
int y,m,d;

if(year == START_YEAR)

if(month == START_MONTH)

diffDays = day - START_DAY;

else

/*加上当月剩余天数*/
diffDays += getDaysOfMonth(START_YEAR,START_MONTH) - START_DAY + 1;
/*加上整月的天数*/
for(m = START_MONTH + 1 ; m < month ; m ++)

diffDays += getDaysOfMonth(START_YEAR,m);

/*加上当月剩余天数*/
diffDays += day -1;


else

/*加上当月剩余天数*/
diffDays += getDaysOfMonth(START_YEAR,START_MONTH) - START_DAY + 1;
/*加上整月的天数*/
for(m = START_MONTH + 1 ; m <= 12 ; m ++)

diffDays += getDaysOfMonth(START_YEAR,m);

/*加上整年的天数*/
for(y = START_YEAR+1 ; y < year ; y ++)

/*如果是闰年*/
if((y%4==0%y%100!=0) || y%400==0)

diffDays += 366;

else

diffDays += 365;


/*加上整月的天数*/
for(m = 1 ; m < month ; m ++)

diffDays += getDaysOfMonth(year,m);

/*加上当月的天数*/
diffDays += ( day - 1 );


return diffDays;


/*
功能:
计算 year 年 month 月 day 日
距离
START_YEAR 年 START_MONTH 月 START_DAY 日
已经过了多少周
*/
int getDiffWeeks(int year ,int month , int day)

int diffDays ,diffWeeks;
// 距离系统最小时间已经过去的天
diffDays= getDiffDays(year,month,day);
diffWeeks = diffDays/7;
// 修正已经过去的周
if((START_WEEK_DAY + diffDays % 7 )> 7)

diffWeeks++;

// debug
//printf("%d %d %d\n",diffDays,diffWeeks,(START_WEEK_DAY + diffDays % 7 ) % 7);
return diffWeeks;


/*
功能:
计算 year 年 month 月 day 日 是星期几
星期一 = 1
星期二 = 2
...
星期六 = 6
星期天 = 0
*/
int getWeekDay(int year ,int month , int day)

int diffDays= getDiffDays(year,month,day);

return (START_WEEK_DAY + diffDays % 7 ) % 7;


int main(int argc, char *argv[])

// 设定的开始计算单双周的第一天
int firstWeekYear,firstWeekMonth,firstWeekDay;
// 要查询天
int queryYear,queryMonth,queryDay;
// 相差的天数
int diffDays;
// 相差的周数
int diffWeeks;
printf("输入要设为第一周的日期:");
scanf("%d-%d-%d",&firstWeekYear,&firstWeekMonth,&firstWeekDay);
// 输入要查询的天,按 ctrl + z 退出
printf("输入要查询所在周的日期:");
while(scanf("%d-%d-%d",&queryYear,&queryMonth,&queryDay)!=EOF)

diffDays = getDiffDays(queryYear,queryMonth,queryDay) - getDiffDays(firstWeekYear,firstWeekMonth,firstWeekDay);
diffWeeks = getDiffWeeks(queryYear,queryMonth,queryDay) - getDiffWeeks(firstWeekYear,firstWeekMonth,firstWeekDay) + 1;

printf("%4d-%02d-%02d【%s】 是【%s周,第%3d周】。距离 %4d-%02d-%02d【%s】 已经过去了【%3d天】!\n",
queryYear,queryMonth,queryDay,
WEEK_DAYS_NAME[getWeekDay(queryYear,queryMonth,queryDay)],
(diffWeeks%2==1)?"单":"双",
diffWeeks,
firstWeekYear,firstWeekMonth,firstWeekDay,
WEEK_DAYS_NAME[getWeekDay(firstWeekYear,firstWeekMonth,firstWeekDay)],
diffDays
);

return 0;

/*
输入要设为第一周的日期:2011-9-1
输入要查询所在周的日期:2011-9-1
2011-09-01【星期四】 是【单周,第 1周】。距离 2011-09-01【星期四】 已经过去了【 0天】!
输入要查询所在周的日期:2011-9-2
2011-09-02【星期五】 是【单周,第 1周】。距离 2011-09-01【星期四】 已经过去了【 1天】!
输入要查询所在周的日期:2011-9-3
2011-09-03【星期六】 是【单周,第 1周】。距离 2011-09-01【星期四】 已经过去了【 2天】!
输入要查询所在周的日期:2011-9-4
2011-09-04【星期日】 是【单周,第 1周】。距离 2011-09-01【星期四】 已经过去了【 3天】!
输入要查询所在周的日期:2011-9-5
2011-09-05【星期一】 是【双周,第 2周】。距离 2011-09-01【星期四】 已经过去了【 4天】!
输入要查询所在周的日期:2011-9-11
2011-09-11【星期日】 是【双周,第 2周】。距离 2011-09-01【星期四】 已经过去了【 10天】!
输入要查询所在周的日期:2011-9-15
2011-09-15【星期四】 是【单周,第 3周】。距离 2011-09-01【星期四】 已经过去了【 14天】!
输入要查询所在周的日期:2011-10-1
2011-10-01【星期六】 是【单周,第 5周】。距离 2011-09-01【星期四】 已经过去了【 30天】!
输入要查询所在周的日期:2011-10-15
2011-10-15【星期六】 是【单周,第 7周】。距离 2011-09-01【星期四】 已经过去了【 44天】!
输入要查询所在周的日期:2011-10-30
2011-10-30【星期日】 是【单周,第 9周】。距离 2011-09-01【星期四】 已经过去了【 59天】!
输入要查询所在周的日期:2011-11-1
2011-11-01【星期二】 是【双周,第 10周】。距离 2011-09-01【星期四】 已经过去了【 61天】!
输入要查询所在周的日期:2011-12-1
2011-12-01【星期四】 是【双周,第 14周】。距离 2011-09-01【星期四】 已经过去了【 91天】!
*/追问

代码写的很好,我会采纳的,还有一个小问题:编译成功后运行,界面一下字没了,getchar();和system("pause");都不好使,怎样是出结果的界面停留一会儿?还有否告诉我你的Q号,百度交流不是很方便,加Q好友后可以更好的交流,我的Q1517018420,再次感谢你的帮助!!!!

追答

不知道为什么你界面一下字没了,这个程序要输入的,没有按 CTRL键+C键应该不会退出程序的。你用的什么编译器编译的?我是用C-free的。QQ不常用,还是百度hai我吧,我一般都在。

追问

我用的是Win-TC,好的以后Hi你

参考技术A 有万年历的程序 很多的 参考技术B 。。。你连哪一周是第一周都不说=。=追问

自己输入啊,任意选第一周

用基姆拉尔森计算公式做一个课表

因为最近上网课,我大部分时间是用电脑上课,课程APP得在手机上打开,我觉得麻烦,就写了一个可以看当天有什么课的程序。

既然要写课表,我们就得创建一个7天循环,并每7天更改一次单双周的判断。这里我用的是基姆拉尔森公式(你不必纠结他的原理,只有能合理的使用就行),用它来获取年月日。

然后我设定了开学的那一天为起始天,每过7天改变单双周课表,这样就完成了啦!。

 

 大概可以实现的功能就是这样,当然也可以用QT再去写一些界面来美化程序,或者用easyX可以,但是代码就是这些了。

写完发现这个根本没什么卵用。。。。。。又丑又臭,也是我闲着无聊。

最后,修改图标,注入灵魂,就可以了

 

 

#include<iostream>
#include<time.h>
#include<fstream>
#include<string>
#include<windows.h> 
using namespace std;
int year,month,day,weeks,yday,result;
int CaculateWeekDay(int y, int m, int d)
{
    if (m == 1 || m == 2) {
        m += 12;
        y--;
    }
    //基姆拉尔森计算公式:
    int iWeek = (d + 2 * m + 3 * (m + 1) / 5 + y + y / 4 - y / 100 + y / 400) % 7;
    switch (iWeek)
    {
    case 0: return 0;break;
    case 1: return 1;break;
    case 2: return 2;break;
    case 3: return 3;break;
    case 4: return 4;break;
    case 5: return 5;break;
    case 6: return 6;break;
    }
}

void search(int weeks,int danshuang)
{
    HANDLE hout = GetStdHandle(STD_OUTPUT_HANDLE);//句柄
    SetConsoleTextAttribute(hout, 64 + 15);
    ifstream fin;
    char buf[100]; 
    int chose;
    cout<<"今天是北京时间:"<<year<<""<<month<<""<<day<<""<<"星期"<<weeks+1<<endl;
      if(danshuang==1)cout<<"本周是单周"<<endl;
      else cout<<"本周是双周"<<endl;
      while(chose!=-1)
{ 
      SetConsoleTextAttribute(hout, FOREGROUND_INTENSITY | FOREGROUND_GREEN | FOREGROUND_BLUE);
    if(weeks==0) fin.open("monday.txt");
    if(weeks==1) fin.open("tuesday.txt");
    if(weeks==2) fin.open("wednesday.txt");
    if(weeks==3) fin.open("thurday.txt");
    if(weeks==4) fin.open("friday.txt");
    if(weeks==5) cout<<"周末啦,好好休息啦,怎么想上课?"<<endl;
    if(weeks==6) cout<<"这么想上课?明天周一有你上的"<<endl;
     string s;
    while(getline(fin,s)) //逐行读取,直到结束
    {
        if(danshuang==0)
        {
        
        for(int i=0;i<s.length();i++)
        {
            if(s[0]==\'2\'||s[0]==\'3\')
            {cout<<s[i+1];    
            }
        }
        if(s[0]==\'2\')
        cout<<endl<<endl;
        if(s[0]==\'3\')
        cout<<endl;
    }
    else{
        for(int i=0;i<s.length();i++)
        {
            cout<<s[i+1];
        }
        cout<<endl;
    }
    }
    
    fin.close();
    cout<<"输入:"<<endl; 
    cout<<"1.查看前一天课表"<<" "<<"2.查看后一天课表"<<" "<<"<<3.退出"<<endl;
    cin>> chose;
    if(chose==1) {if(weeks>0) weeks--;
                    if(weeks==0) {(weeks+7)-1;danshuang=(danshuang-1)%2;}
    }
    if(chose==2) {
        if(weeks<6) weeks++;
        if(weeks==6) {weeks=(weeks-7)+1; danshuang=(danshuang+1)%2;}
    }
    if(chose==3) chose=-1;
}

}

int main()
{
      time_t tt = time(NULL);//这句返回的只是一个时间cuo
      tm* t= localtime(&tt);
      yday=t->tm_yday+1;
      year=t->tm_year + 1900;
      month=t->tm_mon + 1;
        day=t->tm_mday;
      weeks=CaculateWeekDay(year, month, day);//获取今天星期几
      //判断单双周
      int begining=48;//开学第一天是本年的多少天
      result=yday-begining;//得到差值
      if(result==0){result=(yday+1)-begining;}
      result/=7;
      if(result%2!=0){result=0;}//
      else {result=1;} //单周 
          if(weeks==0) search(0,result);
          if(weeks==1) search(1,result);
          if(weeks==2) search(2,result);
          if(weeks==3) search(3,result);
          if(weeks==4) search(4,result);
          if(weeks==5) search(5,result);
          if(weeks==6) search(6,result);
      system("pause");
      return 0;
}

 

以上是关于高手指导一下,怎样用C语言编写一个计算单双周的程序,并能显示这是第几周,输入一个日期定为单周,然后自的主要内容,如果未能解决你的问题,请参考以下文章

怎样用C语言编写这个程序

用C语言编写的这个链表程序可以运行,但是在运行中查找不到给定值的节点, 求高手帮忙改一下,谢谢

怎样用C语言编写一个简单的可以进行加减乘除运算混合运算的计算器?

麻烦哪位高手解释一下这个C语言程序中,那个word 有啥用?

高手求教!!!c语言中怎样读取命令行参数?

C语言程序设计编写一个交通红绿灯的控制,各位高手帮帮忙急!