2014秋C++ 第9周项目 循环程序设计

时间:2021-06-15 16:44:04

课程主页在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:输出星号图】自选以下的几个图案,编程序输出(自选两个完毕,其它的想想思路就可以)。

2014秋C++ 第9周项目 循环程序设计

【项目4:乘法口诀表】编程序。输出一个乘法口诀表,形如

2014秋C++ 第9周项目 循环程序设计

提示:一共要输出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个符号分别代表的数字。

2014秋C++ 第9周项目 循环程序设计

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvc3hoZWxpamlhbg==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="" />

提示:让计算机解奥数题。穷举"都、要、学、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菜鸟起飞铺跑道,和学生一起享受快乐和激情的大学 =====