ImageVerifierCode 换一换
格式:DOC , 页数:55 ,大小:440KB ,
资源ID:7655285      下载积分:10 金币
验证码下载
登录下载
邮箱/手机:
图形码:
验证码: 获取验证码
温馨提示:
支付成功后,系统会自动生成账号(用户名为邮箱或者手机号,密码是验证码),方便下次登录下载和查询订单;
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

开通VIP
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.zixin.com.cn/docdown/7655285.html】到电脑端继续下载(重复下载【60天内】不扣币)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

开通VIP折扣优惠下载文档

            查看会员权益                  [ 下载后找不到文档?]

填表反馈(24小时):  下载求助     关注领币    退款申请

开具发票请登录PC端进行申请。


权利声明

1、咨信平台为文档C2C交易模式,即用户上传的文档直接被用户下载,收益归上传人(含作者)所有;本站仅是提供信息存储空间和展示预览,仅对用户上传内容的表现方式做保护处理,对上载内容不做任何修改或编辑。所展示的作品文档包括内容和图片全部来源于网络用户和作者上传投稿,我们不确定上传用户享有完全著作权,根据《信息网络传播权保护条例》,如果侵犯了您的版权、权益或隐私,请联系我们,核实后会尽快下架及时删除,并可随时和客服了解处理情况,尊重保护知识产权我们共同努力。
2、文档的总页数、文档格式和文档大小以系统显示为准(内容中显示的页数不一定正确),网站客服只以系统显示的页数、文件格式、文档大小作为仲裁依据,个别因单元格分列造成显示页码不一将协商解决,平台无法对文档的真实性、完整性、权威性、准确性、专业性及其观点立场做任何保证或承诺,下载前须认真查看,确认无误后再购买,务必慎重购买;若有违法违纪将进行移交司法处理,若涉侵权平台将进行基本处罚并下架。
3、本站所有内容均由用户上传,付费前请自行鉴别,如您付费,意味着您已接受本站规则且自行承担风险,本站不进行额外附加服务,虚拟产品一经售出概不退款(未进行购买下载可退充值款),文档一经付费(服务费)、不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
4、如你看到网页展示的文档有www.zixin.com.cn水印,是因预览和防盗链等技术需要对页面进行转换压缩成图而已,我们并不对上传的文档进行任何编辑或修改,文档下载后都不会有水印标识(原文档上传前个别存留的除外),下载后原文更清晰;试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓;PPT和DOC文档可被视为“模板”,允许上传人保留章节、目录结构的情况下删减部份的内容;PDF文档不管是原文档转换或图片扫描而得,本站不作要求视为允许,下载前可先查看【教您几个在下载文档中可以更好的避免被坑】。
5、本文档所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用;网站提供的党政主题相关内容(国旗、国徽、党徽--等)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
6、文档遇到问题,请及时联系平台进行协调解决,联系【微信客服】、【QQ客服】,若有其他问题请点击或扫码反馈【服务填表】;文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“【版权申诉】”,意见反馈和侵权处理邮箱:1219186828@qq.com;也可以拔打客服电话:4009-655-100;投诉/维权电话:18658249818。

注意事项

本文(编程之美随书源代码-中文注释.doc)为本站上传会员【xrp****65】主动上传,咨信网仅是提供信息存储空间和展示预览,仅对用户上传内容的表现方式做保护处理,对上载内容不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知咨信网(发送邮件至1219186828@qq.com、拔打电话4009-655-100或【 微信客服】、【 QQ客服】),核实后会尽快下架及时删除,并可随时和客服了解处理情况,尊重保护知识产权我们共同努力。
温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载【60天内】不扣币。 服务填表

编程之美随书源代码-中文注释.doc

1、55 第1章 游戏之乐 ——游戏中碰到的题目 代码清单1-1 1. int main() { for(; ; { for(int i = 0; i < 9600000; i++) ; Sleep(10); } return 0; } 代码清单1-2 int busyTime = 10; // 10 ms int idleTime = busyTime; // same ratio will lead to 50% cpu

2、 usage Int64 startTime = 0; while(true) { startTime = GetTickCount(); // busy loop while((GetTickCount() - startTime) <= busyTime) ; // idle loop Sleep(idleTime); } 代码清单1-3 2. // C# code static void MakeUsage(float level) { PerformanceC

3、ounter p = new PerformanceCounter("Processor", "%Processor Time", "_Total"); if(p==NULL) { return } while(true) { if(p.NextValue() > level) System.Threading.Thread.Sleep(10); } } 代码清单1-4 // C++ code to

4、make task manager generate sine graph #include "Windows.h" #include "stdlib.h" #include "math.h" const double SPLIT = 0.01; const int COUNT = 200; const double PI = 3.14159265; const int INTERVAL = 300; int _tmain(int argc, _TCHAR* argv[]) { DWORD busySpan[COUNT]; // array of bus

5、y times DWORD idleSpan[COUNT]; // array of idle times int half = INTERVAL / 2; double radian = 0.0; for(int i = 0; i < COUNT; i++) { busySpan[i] = (DWORD)(half + (sin(PI * radian) * half)); idleSpan[i] = INTERVAL - busySpan[i]; radi

6、an += SPLIT; } DWORD startTime = 0; int j = 0; while(true) { j = j % COUNT; startTime = GetTickCount(); while((GetTickCount() - startTime) <= busySpan[j]) ; Sleep(idleSpan[j]); j++; } re

7、turn 0; } 代码清单1-5 _PROCESSOR_POWER_INFORMATION info; CallNTPowerInformation(11, // query processor power information NULL, // no input buffer 0, // input buffer size is zero &info, // output buffer Size

8、of(info)); // outbuf size __int64 t_begin = GetCPUTickCount(); // do something __int64 t_end = GetCPUTickCount(); double millisec = ((double)t_end –(double)t_begin) /(double)info.CurrentMhz; 代码清单1-6 #define HALF_BITS_LENGTH 4 // 这个值是记忆存储单元长度的一半,

9、在这道题里是4bit #define FULLMASK 255 // 这个数字表示一个全部bit的mask,在二进制表示中,它是11111111。 #define LMASK (FULLMASK << HALF_BITS_LENGTH) // 这个宏表示左bits的mask,在二进制表示中,它是11110000。 #define RMASK (FULLMASK >> HALF_BITS_LENGTH) // 这个数字表示右bits的mask,在二进制表示中,它表示00001111。 #define RSET(b, n) (b = ((LMASK & b) ^ n)) // 这个

10、宏,将b的右边设置成n #define LSET(b, n) (b = ((RMASK & b) ^ (n << HALF_BITS_LENGTH))) // 这个宏,将b的左边设置成n #define RGET(b) (RMASK & b) // 这个宏得到b的右边的值 #define LGET(b) ((LMASK & b) >> HALF_BITS_LENGTH) // 这个宏得到b的左边的值 #define GRIDW 3 // 这个数字表示将帅移动范围的行宽度。 #include #define HALF_BITS_LENGTH 4 #def

11、ine FULLMASK 255 #define LMASK (FULLMASK << HALF_BITS_LENGTH) #define RMASK (FULLMASK >> HALF_BITS_LENGTH) #define RSET(b, n) (b = ((LMASK & b) ^ n)) #define LSET(b, n) (b = ((RMASK & b) ^ (n << HALF_BITS_LENGTH))) #define RGET(b) (RMASK & b) #define LGET(b) ((LMASK & b) >> HALF_BITS_LENGTH)

12、define GRIDW 3 int main() { unsigned char b; for(LSET(b, 1); LGET(b) <= GRIDW * GRIDW; LSET(b, (LGET(b) + 1))) for(RSET(b, 1); RGET(b) <= GRIDW * GRIDW; RSET(b, (RGET(b) + 1))) if(LGET(b) % GRIDW != RGET(b) % GRIDW) printf("A = %d,

13、 B = %d\n", LGET(b), RGET(b)); return 0; } 代码清单1-7 struct { unsigned char a:4; unsigned char b:4; } i; for(i.a = 1; i.a <= 9; i.a++) for(i.b = 1; i.b <= 9; i.b++) if(i.a % 3 != i.b % 3) printf(“A = %d, B = %d\n”, i.a, i.b); 代码清单1-8 /*

14、/ // // 烙饼排序实现 // /****************************************************************/ class CPrefixSorting { public: CPrefixSorting() { m_nCakeCnt = 0; m_nMaxSwap = 0; } ~CPrefix

15、Sorting() { if( m_CakeArray != NULL ) { delete m_CakeArray;  } if( m_SwapArray != NULL ) { delete m_SwapArray;  } if( m_ReverseCakeArray != NULL ) { delete m

16、ReverseCakeArray;  } if( m_ReverseCakeArraySwap != NULL ) { delete m_ReverseCakeArraySwap;  } } // // 计算烙饼翻转信息 // @param // pCakeArray 存储烙饼索引数组 // nCakeCnt 烙饼个数 // void Run(int* pCakeArra

17、y, int nCakeCnt) { Init(pCakeArray, nCakeCnt); m_nSearch = 0; Search(0); } // // 输出烙饼具体翻转的次数 // void Output() { for(int i = 0; i < m_nMaxSwap; i++) { printf("%d ", m_arrSwap[i]);

18、 } printf("\n |Search Times| : %d\n", m_nSearch); printf("Total Swap times = %d\n", m_nMaxSwap); } private: // // 初始化数组信息 // @param // pCakeArray 存储烙饼索引数组 // nCakeCnt 烙饼个数 // void Init(int* pCakeArray, int nCakeCnt)

19、 { Assert(pCakeArray != NULL); Assert(nCakeCnt > 0); m_nCakeCnt = nCakeCnt; // 初始化烙饼数组 m_CakeArray = new int[m_nCakeCnt]; Assert(m_CakeArray != NULL); for(int i = 0; i < m_nCakeCnt; i++) {

20、 m_CakeArray[i] = pCakeArray[i]; } // 设置最多交换次数信息 m_nMaxSwap = UpBound(m_nCakeCnt); // 初始化交换结果数组 m_SwapArray = new int[m_nMaxSwap + 1]; Assert(m_SwapArray != NULL); // 初始化中间交换结果信息 m_ReverseCakeArray = ne

21、w int[m_nCakeCnt]; for(i = 0; i < m_nCakeCnt; i++) { m_ReverseCakeArray[i] = m_CakeArray[i]; } m_ReverseCakeArraySwap = new int[m_nMaxSwap]; } // // 寻找当前翻转的上界 // // int UpBound(int nCakeCnt)

22、 { return nCakeCnt*2; } // // 寻找当前翻转的下界 // // int LowerBound(int* pCakeArray, int nCakeCnt) { int t, ret = 0; // 根据当前数组的排序信息情况来判断最少需要交换多少次 for(int i = 1; i < nCakeCnt; i++) { // 判

23、断位置相邻的两个烙饼,是否为尺寸排序上相邻的 t = pCakeArray[i] - pCakeArray[i-1]; if((t == 1) || (t == -1)) { } else { ret++; } } return ret; } // 排序的主函

24、数 void Search(int step) { int i, nEstimate; m_nSearch++; // 估算这次搜索所需要的最小交换次数 nEstimate = LowerBound(m_ReverseCakeArray, m_nCakeCnt); if(step + nEstimate > m_nMaxSwap) return; // 如果已经排好序,即翻转完成,输出结果

25、 if(IsSorted(m_ReverseCakeArray, m_nCakeCnt)) { if(step < m_nMaxSwap) { m_nMaxSwap = step; for(i = 0; i < m_nMaxSwap; i++) m_arrSwap[i] = m_ReverseCakeArraySwap[i];

26、} return; } // 递归进行翻转 for(i = 1; i < m_nCakeCnt; i++) { Revert(0, i); m_ReverseCakeArraySwap[step] = i; Search(step + 1); Revert(0, i); } } // //

27、 true : 已经排好序 // false : 未排序 // bool IsSorted(int* pCakeArray, int nCakeCnt) { for(int i = 1; i < nCakeCnt; i++) { if(pCakeArray[i-1] > pCakeArray[i]) { return false; } }

28、 return true; } // // 翻转烙饼信息 // void Revert(int nBegin, int nEnd) { Assert(nEnd > nBegin); int i, j, t; // 翻转烙饼信息 for(i = nBegin, j = nEnd; i < j; i++, j--) { t = m_ReverseCakeAr

29、ray[i]; m_ReverseCakeArray[i] = m_ReverseCakeArray[j]; m_ReverseCakeArray[j] = t; } } private: int* m_CakeArray; // 烙饼信息数组 int m_nCakeCnt; // 烙饼个数 int m_nMaxSwap; // 最多交换次数。根据前面的推断,这里最多为 // m_nCakeCn

30、t * 2 int* m_SwapArray; // 交换结果数组 int* m_ReverseCakeArray; // 当前翻转烙饼信息数组 int* m_ReverseCakeArraySwap; // 当前翻转烙饼交换结果数组 int m_nSearch; // 当前搜索次数信息 }; 代码清单1-9 int Cal(int V, int T) { opt[0][T] = 0; // 边界条件,T为所有饮料种类 for(int i = 1;

31、 i <= V; i++) // 边界条件 { opt[i][T] = -INF; } for(int j = T - 1; j >= 0; j--) { for(int i = 0; i <= V; i++) { opt[i][j] = -INF; for(int k = 0; k <= C[j]; k++) // 遍历第j种饮料选取数量k {

32、 if(i < k * V[j]) { break; } int x = opt[i - k * V[j]][j + 1]; if(x != -INF) { x += H[j] * k; if(x > op

33、t[i][j]) { opt[i][j] = x; } } } } } return opt[V][0]; } 代码清单1-10 int[V + 1][T + 1] opt; // 子问题的记录项表,假设从i到T种饮料中, // 找出容量总

34、和为V'的一个方案,满意度最多能够达到 // opt(V',i,T-1),存储于opt[V'][i], // 初始化时opt中存储值为-1,表示该子问题尚未求解。 int Cal(int V, int type) { if(type == T) { if(V == 0) return 0; else return -INF; }

35、 if(V < 0) return -INF; else if(V == 0) return 0; else if(opt[V][type] != -1) return opt[V][type]; // 该子问题已求解,则直接返回子问题的解; // 子问题尚未求解,则求解该子问题 int ret = -INF; for(int i = 0; i <= C[type]; i++) {

36、 int temp = Cal(V – i * C[type], type + 1); if(temp != -INF) { temp += H[type] * i; if(temp > ret) ret = temp; } } return opt[V][type] = ret; } 代码清单1-11 int nPerson[]; // nPerson[i]表示到第i层的乘客数目 i

37、nt nFloor, nMinFloor, nTargetFloor; nTargetFloor = -1; for(i = 1; i <= N; i++) { nFloor = 0; for(j = 1; j < i; j++) nFloor += nPerson[j] * (i - j); for(j = i + 1; j <= N; j++) nFloor += nPerson[j] *(j - i); if(nTargetFloor == -1 || nMinFloor > nF

38、loor) { nMinFloor = nFloor; nTargetFloor = i; } } return(nTargetFloor, nMinFloor); 代码清单1-12 int nPerson[]; // nPerson[i]表示到第i层的乘客数目 int nMinFloor, nTargetFloor; int N1, N2, N3; nTargetFloor = 1; nMinFloor = 0; for(N1 = 0, N2 = nPerson[1], N3 = 0, i =

39、2; i <= N; i++) { N3 += nPerson[i]; nMinFloor += nPerson[i] * (i - 1); } for(i = 2; i <= N; i++) { if(N1 + N2 < N3) { nTargetFloor = i; nMinFloor += (N1 + N2 - N3); N1 += N2; N2 = nPerson[i]; N3 -= nPerson[i]; }

40、 else break; } return(nTargetFloor, nMinFloor); 代码清单1-13 int nMaxColors = 0, i, k, j; for(i = 0; i < N; i++) { for(k = 0; k < nMaxColors; k++) isForbidden[k] = false; for(j = 0; j < i; j++) if(Overlap(b[j], e[j], b[i], e[i]))

41、 isForbidden[color[j]] = true; for(k = 0; k < nMaxColors; k++) if(!isForbidden[k]) break; if(k

42、组的元素有两个成员,一个是val,表示这个元素代表的时间点的数值,另一个是type,表示这个元素代表的时间点是一个时间段的开始(B[i]),还是结束(E[i])。*/ int nColorUsing = 0, MaxColor = 0; for(int i = 0; i < 2 * N; i++) { if(TimePoints[i].type == “Begin”) { nColorUsing++; if(nColorUsing > MaxColor) MaxColor = nColor

43、Using; } else nColorUsing--; } 代码清单1-15 while(true) { bool isDownloadCompleted; isDownloadCompleted = GetBlockFromNet(g_buffer); WriteBlockToDisk(g_buffer); if(isDownloadCompleted) break; } 代码清单1-16 class Thread { public:

44、 // initialize a thread and set the work function Thread(void (*work_func)()); // once the object is destructed, the thread will be aborted ~Thread(); // start the thread void Start(); // stop the thread void Abort(); }; class Semaphore { public

45、 // initialize semaphore counts Semaphore(int count, int max_count); ~Semaphore(); // consume a signal (count--), block current thread if count == 0 void Unsignal(); // raise a signal (count++) void Signal(); }; class Mutex { public: // block

46、thread until other threads release the mutex WaitMutex(); // release mutex to let other thread wait for it ReleaseMutex(); }; 代码清单1-17 #define BUFFER_COUNT 100 Block g_buffer[BUFFER_COUNT]; Thread g_threadA(ProcA); Thread g_threadB(ProcB); Semaphore g_seFull(0, BUFFER_C

47、OUNT); Semaphore g_seEmpty(BUFFER_COUNT, BUFFER_COUNT); bool g_downloadComplete; int in_index = 0; int out_index = 0; void main() { g_downloadComplete = false; threadA.Start(); threadB.Start(); // wait here till threads finished } void ProcA() { while(true)

48、 { g_seEmpty.Unsignal(); g_downloadComplete = GetBlockFromNet(g_buffer + in_index); in_index = (in_index + 1) % BUFFER_COUNT; g_seFull.Signal(); if(g_downloadComplete) break; } } void ProcB() { while(true)

49、 { g_seFull.Unsignal(); WriteBlockToDisk(g_buffer + out_index); out_index = (out_index + 1) % BUFFER_COUNT; g_seEmpty.Signal(); if(g_downloadComplete && out_index == in_index) break; } } 代码清单1-18:C#自底向上的解法 static b

50、ool nim(int x, int y) { // speical case if(x == y) { return true; // I win } // swap the number if(x > y) { int t = x; x = y; y = t; } // basic cases if(x == 1 && y == 2) { return false; // I l

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        抽奖活动

©2010-2025 宁波自信网络信息技术有限公司  版权所有

客服电话:4009-655-100  投诉/维权电话:18658249818

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :微信公众号    抖音    微博    LOFTER 

客服