抽象一下 int week[9] = {0, 2, 3, 0, 1, 0, 0, 2 }; // 从周一到周日每天播放的集数 int HowManyHaveDone(int nCount, // 总共多少集 int nDays, // 到截止日总共多少天 int nStart) // 从周几开始计算 { int nWholeWeek = 2 + 3 + 1 + 2; // 整周播放多少集 int nLeft = 7 - nStart + 1; // 开始日所在周剩余几天(含本日) int nWeeks = (nDays - nLeft) / 7; // 从下周一计算总共有多少个整周 int nRet = nWeeks * nWholeWeek; // 所有的整周播放的集数 if (nRet >= nCount) return nCount; // 不用这么多天就播完喽 下面把整周前后两段分别计算出来 int nIndex = 0; for (nIndex = nStart; nIndex < 7; nIndex++) { nRet += week[nIndex]; } if (nRet >= nCount) return nCount; // 不用这么多天就播完喽 int nTail = (nDays - nLeft) % 7; // 整周后面剩多少天(这肯定是从周一开始的) for (nIndex = 1; nIndex < nTail; nIndex++) { nRet += week[nIndex]; } return nRet > nCount ? nCount : nRet; }
从某日开始到某日结束总共多少天,这可以抽象成另外一个接口函数。 其实有现成的类可以用,就是mfc的CTimeCTime timeHead(1999, 3, 19, 0, 0, 0 ); //1999年3月19号 CTime timeTail(2002, 3, 28, 0, 0, 0 ); //2002年3月28号 CTime timeRet = timeTail - timeHead; //结果就是总共几年几月几天 //如果想折合成天数,那么再计算就容易了。CTime还可以返回这一天是星期几,copy一段代码吧 UINT DayOfWeek[] = { LOCALE_SDAYNAME7, // Sunday LOCALE_SDAYNAME1, LOCALE_SDAYNAME2, LOCALE_SDAYNAME3, LOCALE_SDAYNAME4, LOCALE_SDAYNAME5, LOCALE_SDAYNAME6 // Saturday };TCHAR strWeekday[256]; CTime time(CTime::GetCurrentTime()); // Initialize CTime with current time ::GetLocaleInfo(LOCALE_USER_DEFAULT, // Get string for day of the week from system DayOfWeek[time.GetDayOfWeek()-1], // Get day of week from CTime strWeekday, sizeof(strWeekday));TRACE("%s\n", strWeekday); // Print out day of the week
1)从网上肯定能够找到历史上那一天是星期几
2)利用人的思维惯式可以一天天的计算出道某一天播放了多少集
不过这肯定不是你想问的
upup。
thinking.........
请用C描述出来!
抽象一下
int week[9] = {0, 2, 3, 0, 1, 0, 0, 2 }; // 从周一到周日每天播放的集数
int HowManyHaveDone(int nCount, // 总共多少集
int nDays, // 到截止日总共多少天
int nStart) // 从周几开始计算
{
int nWholeWeek = 2 + 3 + 1 + 2; // 整周播放多少集
int nLeft = 7 - nStart + 1; // 开始日所在周剩余几天(含本日)
int nWeeks = (nDays - nLeft) / 7; // 从下周一计算总共有多少个整周
int nRet = nWeeks * nWholeWeek; // 所有的整周播放的集数
if (nRet >= nCount)
return nCount; // 不用这么多天就播完喽 下面把整周前后两段分别计算出来
int nIndex = 0;
for (nIndex = nStart; nIndex < 7; nIndex++)
{
nRet += week[nIndex];
}
if (nRet >= nCount)
return nCount; // 不用这么多天就播完喽 int nTail = (nDays - nLeft) % 7; // 整周后面剩多少天(这肯定是从周一开始的)
for (nIndex = 1; nIndex < nTail; nIndex++)
{
nRet += week[nIndex];
} return nRet > nCount ? nCount : nRet;
}
从某日开始到某日结束总共多少天,这可以抽象成另外一个接口函数。
其实有现成的类可以用,就是mfc的CTimeCTime timeHead(1999, 3, 19, 0, 0, 0 ); //1999年3月19号
CTime timeTail(2002, 3, 28, 0, 0, 0 ); //2002年3月28号
CTime timeRet = timeTail - timeHead; //结果就是总共几年几月几天
//如果想折合成天数,那么再计算就容易了。CTime还可以返回这一天是星期几,copy一段代码吧
UINT DayOfWeek[] = {
LOCALE_SDAYNAME7, // Sunday
LOCALE_SDAYNAME1,
LOCALE_SDAYNAME2,
LOCALE_SDAYNAME3,
LOCALE_SDAYNAME4,
LOCALE_SDAYNAME5,
LOCALE_SDAYNAME6 // Saturday
};TCHAR strWeekday[256];
CTime time(CTime::GetCurrentTime()); // Initialize CTime with current time
::GetLocaleInfo(LOCALE_USER_DEFAULT, // Get string for day of the week from system
DayOfWeek[time.GetDayOfWeek()-1], // Get day of week from CTime
strWeekday, sizeof(strWeekday));TRACE("%s\n", strWeekday); // Print out day of the week
然后算到今天共过了多少整周(CTimeSpan::GetDay()/7),
每周8集,乘以8,
再算今天星期几(比如星期五),
然后根据你所说的算星期二到星期五共放了几集,
加起来就ok
CTime t( 2002,5,3,0,0,0);
CTime today = CTime::GetCurrentTime();
int cur = 0; while( t < today )
{
switch( t.GetDayOfWeek() )
{
case 1:
cur += 2;
break;
case 2:
cur += 4;
break;
case 4:
cur += 1;
break;;
case 7:
cur += 2;
break;
}
t += ( 24 * 60 * 60 );
if( cur > 245 )
{
AfxMessageBox( "over" );
return;
}
}
sprintf( c, "%d", cur );
AfxMessageBox( c );
环境 xp .net
CTime t( 2002,5,3,0,0,0);
CTime today = CTime::GetCurrentTime();
int cur = 0; while( t <= today )
{
switch( t.GetDayOfWeek() )
{
case 1:
cur += 2;
break;
case 2:
cur += 4;
break;
case 4:
cur += 1;
break;;
case 7:
cur += 2;
break;
}
t += ( 24 * 60 * 60 );
if( cur > 245 )
{
AfxMessageBox( "over" );
return;
}
}
sprintf( c, "%d", cur );
AfxMessageBox( c );
已经播出171集啦
参数说明
int HowManyHaveDone(int nCount, // 总共多少集
int nDays, // 到截止日总共多少天
int nStart) // 从周几开始计算,周一是1,周七是7,依此类推这个函数的实现思路其实跟siphonelee(sifone)说的一样,嘿嘿
调用参数是 howmanyhavedone( 245,**,2 ) ???