高手指导一下,怎样用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语言编写一个简单的可以进行加减乘除运算混合运算的计算器?