首页 > 代码库 > 2014秋C++ 第9周项目 循环程序设计
2014秋C++ 第9周项目 循环程序设计
课程主页在http://blog.csdn.net/sxhelijian/article/details/39152703,课程资源在云学堂“贺老师课堂”同步展示,使用的帐号请到课程主页中查看。
阅读程序
程序分析题,阅读下列程序,写出程序的运行结果,建议在上机时进行验证(云学堂将给出代码,直接复制到C4droid或CodeBlocks中运行即可),如果与自己的预期有出入,尤其注意对照找出问题。
读这些小程序,可以见识不少处理技巧。读程序,也是一种非常非常重要的学习方式,应该给予重视!
1.
#include<iostream> using namespace std; int main() { char c1,c2; for(c1=‘0‘,c2=‘9‘;c1<c2;c1++,c2--) cout<<c1<<c2; cout<<endl; return 0; }
2.
#include<iostream> using namespace std; int main( ) { int x=0; while(x<=5) { cout<<"B"; x+=2; } return 0; }
3.
#include<iostream> using namespace std; int main ( ) { int i , j, s=0; for (i=1; i<=4; i++) { for( j=1; j<=i; j++) s=s+1; } cout<<"s="<<s<<endl; return 0; }
4.
#include<iostream> using namespace std; int main() { int number=7239,digit; do { digit=number%10; number=number/10; cout<<digit; } while(number>0); cout<<endl; return 0; }
5.
#include <iostream> #include <windows.h> //使用Sleep()函数必须包含windows.h,这种方法只适用于windows using namespace std; int main( ) { int i; for(i=1; i<=10; i++) { Sleep(200); //等待200毫秒 cout<<"■"; } cout<<endl; return 0; }
说明:在Linux下,有sleep函数,但头文件不是windows.h(请自行查阅资料)。这个程序不能在C4droid下运行,因为C4droid基于安卓平台,底层是Linux。
6.
#include <iostream> #include <windows.h> using namespace std; int main( ) { int i; cout<<"安装进度:"<<0<<‘%‘; for(i=1; i<100; i++) { Sleep(100); if(i<=10) cout<<"\b\b"; else cout<<"\b\b\b"; cout<<i<<‘%‘; } cout<<"\b\b\bdone!"<<endl; return 0; }
重要技能体验
单步执行,是程序运行的另外一种形式,是对程序进行调试的时候使用的一种非常非常非常有用的的手段。请用CodeBlocks的单步执行方式,运行上面阅读程序部分的2和4,对程序进行单步执行,并观察变量的值的变化。请选取其中的一个程序发表博文,截屏中能够看到代码、当前观察变量的值以及输出窗口中的中间结果。
单步执行的指导文档和视频,请到云学堂第5讲和第6讲的材料中找。
C++课程新玩法
完成本周实践项目的过程中,请思考用刚刚学过的知识,能解决什么样的有应用价值的问题,或者完成什么好玩的事情。将你的想法写成一个编程题目,并写出参考解答(自己解答不了的,也可以只写个思路,让兄弟们补充),通过你的博客、我们的QQ群分享。
如果你将题目和参考解答发给老贺(sxhelijian@163.com),你编制的题目将有机会成为我们的学期中间的练习题,甚至是期末考试的题目!期待好题,期待原创!
上机实践项目
【项目1:利用循环求和】求1000以内所有偶数的和
要求:请编出3个程序来,分别用三种循环语句完成,注意体会各种循环语句的执行过程及语法特点。
【项目2:分数的累加】编程序,输出1/3-3/5+5/7-7/9…+19/21的结果
提示:关注效率,要求用单重循环完成,累加项目一正一负交替,不能用pow(-1,i)(pow()是C++中求幂的函数,但效率低)。处理一正一负交替的技巧是:专门设置一个变量s表示累加项的符号,初值为1,每次循环乘以-1,从而在+1、-1之间交替变化,再将待加项与s相乘后再相加。
【项目3:输出星号图】自选下面的几个图案,编程序输出(自选两个完成,其他的想想思路即可)。
【项目4:乘法口诀表】编程序,输出一个乘法口诀表,形如
提示:一共要输出9行,每一行……
【项目5:程序填充题】在程序中横线上填上恰当的成分,使完成题目要求的功能:
1.输出1000以内能被3整除且个位数为6的所有整数。
#include <iostream> using namespace std; int main() { int i, j; for (i=0;_________; i++) // (1) { j=i*10+6; if (j%3==0) ____________; // (2) } cout<<endl; return 0; }
2.输入10个整数,找出最大数。
#include <iostream> using namespace std; int main() { int k,x,max; cin>>x; max=______; // (1) for(k=2; k<=___ ; k++) // (2) { cin>>x; if (_______) max=x; // (3) } cout<<"Max="<<max<<endl; return 0; }
3.从键盘输入20个整数,输出它们的和。
#include <iostream> using namespace std; int main() { int a,sum=0; for (int i=1;i<=20;________) // (1) { cin>>a; sum=______; // (2) } cout<<"sum="<<sum<<endl; return 0; }
【项目6:穷举法解决组合问题】(自选两题完成,其他的想一想即可。当然,全做完收效更好)
先阅读例题,领会穷举法(意为“穷尽式列举”,也称枚举)的思想,然后自行选题进行解决,掌握这种程序设计的一般方法。
例题:小明有五本新书,要借给A,B,C三位小朋友,若每人每次只能借一本,则可以有多少种不同的借法?
问题分析与算法设计:本问题实际上是一个排列问题,即求从5个中取3个进行排列的方法的总数。首先对五本书从1至5进行编号,然后使用穷举的方法。假设三个人分别借这五本书中的一本,当三个人所借的书的编号都不相同时,就是满足题意的一种借阅方法。
下面是程序及其注释,要注意利用三重循环“穷举”:
#include <iostream> using namespace std; int main() { int a,b,c,count=0; cout<<"小明借书给三位小朋友书的方案有:"<<endl; for(a=1;a<=5;a++) //穷举a借5本书中的1本的全部情况 for(b=1;b<=5;b++) //穷举b借5本书中的一本的全部情况 for(c=1;c<=5;c++) //穷举c借5本书中的1本的全部情况 if(a!=b&&c!=a&&c!=b) //判断三个人借的书是否不同,(a-b)*(b-c)*(c-a)!=0更好 { ++count; cout<<count<<": "<<a<<", "<<b<<", "<<c<<endl;//输出方案 } return 0; }
任务:利用穷举的方法解决下面的问题(选做一道即算完成任务,其他可以抽时间自由安排,多做会使你更聪明。)
(1)百钱百鸡问题:中国古代数学家张丘建在他的《算经》中提出了著名的“百钱买百鸡问题”:鸡翁一,值钱五,鸡母一,值钱三,鸡雏三,值钱一,百钱买百鸡,问翁、母、雏各几何?
提示:设鸡翁、鸡母、鸡雏的个数分别为x,y,z,题意给定共100钱要买百鸡,若全买公鸡最多买20只,显然x的值在0~20之间;同理,y的取值范围在0~33之间,可得到下面的不定方程:
5x+3y+z/3=100
x+y+z=100
所以此问题可归结为求这个不定方程的整数解。
由程序设计实现不定方程的求解与手工计算不同。在分析确定方程中未知数变化范围的前提下,可通过对未知数可变范围的穷举,验证方程在什么情况下成立,从而得到相应的解。
引申:这类求解不定方程的实现,各层循环的控制变量直接与方程未知数有关,且采用对未知数的取值范围上穷举和组合的方法来复盖可能得到的全部各组解。如果要采取技巧,往往是根据题意,更合理地设置循环控制条件来减少这种穷举和组合的次数,提高程序的执行效率,需要具体问题具体分析。
(2)换分币:用一元人民币兑换成1分、2分和5分硬币,有多少种不同的兑换方法?请输出所有可能的方案。
提示:根据题意设i,j,k分别为兑换的1分、2分、5分硬币的枚数,则i,j,k的值应满足:i+j*2+k*5=100,根据取值范围构造循环解题即可。
(3)年龄几何:张三、李四、王五、刘六的年龄成一等差数列,他们四人的年龄相加是26,相乘是880,求以他们的年龄为前4项的等差数列的前20项。
提示:设数列的首项为n,项差为a,则前4项之和为n+(n+a)+(n+a+a)+(n+a+a+a)=4*n+6*a",前4 项之积为n*(n+a)*(n+a+a)*(n+a+a+a)。同时有1<=a<=4和1<=n<=6。可采用穷举法求出此数列。
(3)三色球问题:若一个口袋中放有12个球,其中有3个红的。3个白的和6个黒的,问从中任取8个共有多少种不同的颜色搭配?
提示:设任取的红球个数为i,白球个数为j,则黒球个数为8-i-j,根据题意红球和白球个数的取值范围是0~3,在红球和白球个数确定的条件下,黒球个数取值应为8-i-j<=6。
(4)委派任务:某侦察队接到一项紧急任务,要求在A、B、C、D、E、F六个队员中尽可能多地挑若干人,但有以下限制条件:
l A和B两人中至少去一人;
l A和D不能一起去;
l A、E和F三人中要派两人去;
l B和C都去或都不去;
l C和D两人中去一个;
l 若D不去,则E也不去。
问应当让哪几个人去?
提示:用a、b、c、d、e、f六个变量表示六个人是否去执行任务的状态,变量的值为1,则表示该人去;变量的值为0,则表示该人不参加执行任务,根据题意可写出表达式:
l a+b>1 //A和B两人中至少去一人;
l (a+d)!=2 //A和D不能一起去;
l a+e+f==2 // A、E、F三人中要派两人去;
l b+c==0或b+c==2 // B和C都去或都不去;
l c+d==1 //C和D两人中去一个;
l d+e==0或d==1 //若D不去,则E也不去(都不去;或D去E随便)。
上述各表达式之间的关系为“与”关系。穷举每个人去或不去的各种可能情况,代入上述表达式中进行推理运算,使上述表达式均为“真”的情况就是正确的结果。
(5)在下面的加法算式中,不同的符号代表不同的数字,相同的符号代表相同的数字。请设计程序求出"都、要、学、C"4个符号分别代表的数字。
提示:让计算机解奥数题。穷举"都、要、学、C"4个符号分别代表的数字(从0到9),然后进行组合,如果组合起来符合规则(不同的符号代表不同的数字,相同的符号代表相同的数字,且使等式成立),则为正解。
(6)警察局抓住了A、B、C、D四名盗窃嫌疑犯,其中只有一人是小偷。在审问时,A说:“我不是小偷”;B说:“C是小偷”;C说:“小偷肯定是D”;D说:“C在冤枉好人”。现在已经知道这四人中有三人说的是真话,一人说的是假话。请问到底谁是小偷?
提示:设4个变量a,b,c,d,为0时表示不是小偷,为1时表示是小偷,用四重循环穷举a,b,c,d可能的取值的组合,对每一种组合判断其是否符合题目中给出的约束。最后结论:C是小偷。
(7)有等式[※×(※3+※)]2=8※※9,其中※处为1个数字,滴上了墨水无法辨认。请编程找出※表示哪个数字。
拓展:有等式[※×(※3○※)]2=8※※9,其中※处为1个数字,○处为+、-、×、÷四个运算符之一,现滴上了墨水无法辨认。请编程找出※表示哪个数字,○表示哪个运算符。
=================== 迂者 贺利坚 CSDN博客专栏================= |== IT学子成长指导专栏 专栏文章的分类目录(不定期更新) ==| |== C++ 课堂在线专栏 贺利坚课程教学链接(分课程年级) ==| |== 我写的书——《逆袭大学——传给IT学子的正能量》 ==| ===== 为IT菜鸟起飞铺跑道,和学生一起享受快乐和激情的大学 ===== |
2014秋C++ 第9周项目 循环程序设计