课程设计题目Word文档下载推荐.docx
《课程设计题目Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《课程设计题目Word文档下载推荐.docx(25页珍藏版)》请在冰豆网上搜索。
而后通过使用“rand()%10”或“rand()%100”来获得一个0到9的一位整数随机值或得到0到99的两位整数随机值来为用户出题。
还可进一步对用户所做算术题的对错次数进行记录,结束程序时给出一个某种形式的成绩。
3.数的进制转换
(1)将输入的2进制数(一个非“0”即“1”的字符串)化为10进制数。
用字符数组a盛放所输入的二进制数;
而后从后往前逐一计算每一位的“位权”w(2的0次方、2的1次方、...),再计算“位权”乘以“位值”并累加到一个初值为0的变量value上,最后输出该value。
(2)如何把8进制数或16进制数化为10进制数。
(3)如何把某一个k进制的数化为10进制数呢?
4.编程序,输入正整数m,它代表一个人民币钱数(元数)。
求取这样一个方案,使用最少张数的人民币纸币,凑成上述的钱数m,并输出求取结果。
注意,现在共有7种元以上面值的人民币纸币,分别为:
100,50,20,10,5,2,1。
5.在体育、文艺比赛及选举等打分类项目中,为了公平起见,往往n个评委打出分数后,要去掉一个最高分和一个最低分,然后求取平均得分。
当n较大时(本题设为9),则应取掉两个最高分和两个最低分,然后求取平均分。
编程实现该算法。
6.用户任意输入一个年份以及该年的1月1日是星期几,而后再输入该年的任意一个月份,由程序负责在屏幕上按照你所设计的格式显示出这一个月的月历。
思考:
利用元年元月元日(即1年1月1日)是星期一的已知事实,可对程序进行改造,让用户仅输入任意一个年份和一个月份,则程序就应按格式显示出该年那一个月的月历。
7.有n人围坐成一圈(假设他们的编号沿顺时针方向依次为1到n)。
编程序,使用数组来存放各数据(人员编号),而后从1号人员开始数起(沿顺时针方向),当数到k时(其中k>
1由用户通过cin输入指定),则该号人员被“淘汰出局”;
接着仍沿顺时针方向从被淘汰出局者的下一人员又重新从1开始数起,数到k后,淘汰第2个人;
如此继续,直到最后剩下一个人时停止。
请输出先后被“淘汰”的人的编号。
8.编制具有如下原型的函数prime,用来判断整数n是否为素数:
boolprime(intn);
而后编制主函数,任意输入一个大于4的偶数d,找出满足d=d1+d2的所有数对,其中要求d1与d2均为素数(通过调用prime来判断素数)。
如偶数18可以分解为11+7以及13+5;
而偶数80可以分解为:
43+37、61+19、67+13、73+7。
i与d-i的和恰为偶数d,而且只有当i与d-i均为奇数时才有可能成为所求的“数对”。
9.编一通用排序程序,程序可以对任意类型的数值常数或字符串构成的行进行排序,通过人机对话选择程序是按数值进行排序还是按字符顺序进行排序。
排序是针对数据文件的。
例如
初识数据为:
12,24,9,128,3,76,345
按数值大小排序应为:
3,9,12,24,76,128,345
按字符串大小排序应为:
12,128,24,3,345,76,9
10.编一程序对至少三个排序方法进行比较,比较方法是生成一组数据(≥400),用选定的排序方法进行排序。
输出每种方法数据比较或交换的次数。
最后输出所花费的时间。
注:
此题要用到VC++函数库中time()函数
time_ttime(time_t*timeptr)
参数说明:
time_t*timeptr指向存放自格林威治标准时间1970年1月1日00:
00:
00:
至现在经过多少秒数,类型为time_t的指针变量。
功能描述:
函数读取当前时间,然后计算自格林威治标准时间1970年1月1日00:
至现在经过多少秒数,结果被放在类型为time_t的指针变量所指向的地址变量中。
函数返回值:
返回自格林威治标准时间1970年1月1日00:
至现在经过多少秒数
头文件:
time.h
11.编一函数(过程)集,可分别将整数、实数、布尔值转换成相应的字串,及将以字串表示的整数、实数、布尔值转换成相应类型的值。
(整数->字串,实数->字串均应规定位宽)。
12.输入一批学生某门课程考试的各题的分数,计算每个人的总分,统计各分数段0~49,50~59,60~69,70~79,80~89,90~100的人数及占总人数的百分比。
要求输入:
课程名称,考试日期,学生班号,学生姓名,学号,课程考试得分。
输出要求:
课程名称,考试日期,学生班号;
各分数段的人数及百分比。
13.验证卡布列克运算
任意一个四位数,只要它们各个位置上的数字是不全相同的,就有这样的规律:
(1)将组成这个四位数的四个数字由大到小排列,形成由这四个数字构成的最大的四位数;
(2)将组成这个四位数的四个数字由小到大排列,形成由这四个数字构成的最小的四位数(如果四个数字中含有0,则得到的数不足四位);
(3)求两个数之差,得到一个新的四位数。
(4)重复以上过程,最后得到的结果总是6174。
14.100!
的末尾有多少个零
由于计算机所能表示的整数范围有限,不可能用求出100!
之后再数其尾数有多少个零的方法。
必须从数学上分析100!
末尾出产生零的条件。
不难看出:
一个整数若含有一个5的因子则必然会在求100!
时产生一个零。
因此原问题转换为求1到100这100个整数中包含了多少5的因子。
15.高次方数的尾数
求13的13次方的尾数。
乘法的规律:
乘积的最后三位的值只与乘数和被乘数的后三位有关,与乘数和被乘数的高位无关。
16.输出正六边型
编写程序输出边长为N的空心正六边型(N由用户输入),其边由’*”组成。
输出边长为N的空心正M边型(N,M由用户输入)。
17.输出空心圆
编写程序在屏幕上输出一个由”*”围成的空心圆。
由于屏幕是25行×
80列,故将园心定在屏幕中心40列的位置,将半径定为10行,这样可保证整个图形显示在一屏中。
利用圆的方程X2+Y2=R2(R=10)可求出坐标(X,Y),然后用对称性算出右侧对应点的坐标。
18.横向绘制余弦曲线
在屏幕上用”*”横向显示0~360度的cos(x)曲线。
此题关键在于余弦曲线在0~360度的范围内,一行要显示两个点。
考虑到cos的对称性,将屏幕的行方向定义为x,列方向定义为y,则0~180度的图形是左右对称的。
若将图形的总宽度定义为62列,计算出x行0~180度时y点的坐标m,那么在同一行与之对称的180~360度的y点的坐标就应为62-m。
程序中利用反余弦函数acos计算坐标(x,y)的对应关系。
19.绘制余弦曲线和直线
在屏幕上显示0~360度的cos(x)曲线与直线f(x)=45*(x-1)+31的迭加图形。
其中cos图形”*”表示,f(x)用”+”表示,在两个图形交叉点处则用f(x)图形的符号。
图形迭加的关键是要在分别计算出同一行中两个图形的列方向点坐标后,正确判断相互的位置关系。
为此,可以先判定图形的交点,再分别控制打印不同的图形。
20.模拟人工洗牌
编写一个模拟人工洗牌的程序,将洗好的牌分别发给四个人。
使用结构card来描述一张牌,用随机函数来模拟人工洗牌的过程,最后将洗好的52张牌顺序分别发给四个人。
对每个人的牌要按桥牌的规则输出。
即一个人的牌要先按牌的花色(顺序为梅花、方块、红心和黑桃)进行分类,同一类的牌要再按A、K、Q、J、…、3、2牌的大小顺序排列。
另发牌应按四个人的顺序依次分发。
C++随机数函数有:
voidsrand(unsignedseed)
功能:
函数可以设置rand函数所用得到随机数产生算法的种子值。
任何大于1的种子值都会将rand随机数产生函数所产生的虚拟随机数序列重新设置一个起始点。
intrand(void)
此函数可以产生介于0到32767间的虚拟随机数,所谓虚拟随机数的意思就是因为当只设置相同的启动种子值,所产生的数值序列都是可预测的。
要产生不可预测的数值序列,必须通过srand函数不断改变随机数的启始种子值,已产生最佳的随机数。
stdlib.h
21.用户猜测藏物位置:
计算机在n行n列(行号为0到n-1,列号为0到n-1)的“棋盘”的某一位置处“藏放一物件”(具体位置通过使用“rand()%10”来随机产生);
用户通过输入行列号来“寻找”该物件;
若没猜对时计算机要告诉用户与藏放物件的位置有多远(取整后的近似距离)。
若没猜对时也可增加告诉用户藏物的方向信息;
另外在猜对结束时,还可告诉用户共猜了几次。
22.编写具有如下函数原型的递归与非递归两种函数f,负责判断数组a的前n个元素是否从大到小完全有序了,是则返回true,否则返回false。
并编制主函数对它们进行调用,以验证其正确性。
boolf(inta[],intn);
(1)非递归函数中只需逐对地判断各a[i]与a[i+1]是否都已从大到小有序排列(i=0,1,…,n-2)。
(2)递归函数中将问题分解处理为:
若n=1(即只有1个元素时)则返回true而递归出口;
n>
1时,若最后一对元素不顺序则返回false,否则进行递归调用(传去实参a与n-1,去判断前n-1个元素的顺序性),并返回递归调用的结果(与前n-1个元素的是否顺序性相同)。
23.编写具有如下函数原型的递归与非递归两种函数equ,负责判断数组a与b的前n个元素值是否按下标对应完全相同,是则返回true,否则返回false。
boolequ(inta[],intb[],intn);
递归函数中可按如下方式来分解并处理问题,先判断最后一个元素是否相同,不同则返false;
相同则看n是否等于1,是则返回true,否则进行递归调用(传去实参a、b与n-1,去判断前n-1个元素的相等性),并返回递归调用的结果(与前n-1个元素的是否相等性相同)。
24.编程序,让计算机来猜测用户“暗记”的某张扑克牌:
计算机从一副扑克牌(54张)中任意抽出27张,摆放在不同的三行上(每行9张),用户“暗记”某张纸牌,而后告诉计算机所“暗记”的那张纸牌处于哪一行中;
之后计算机再两次将纸牌重新摆放,并让用户再回答两次相同的提问(那张纸牌在重新摆放后又处在哪一行上);
此时计算机会将用户所“暗记”的那张纸牌给挑出来。
例如,程序执行后的屏幕显示结果可设计为(其中的前缀a、b、c、d代表四种不同的花色):
-------------------------------------------------------------
Line1:
c-9
d-3
a-7
d-9
a-9
c-3
b-8
a-A
d-7
Line2:
b-10
a-Q
d-6
b-4
a-3
b-9
b-K
c-A
d-8
Line3:
KING2
d-A
b-A
a-4
a-2
b-7
d-5
c-7
a-8
Rememberacard,andtellmewhatlineitresidein(1/2/3):
3
d-6KING2
b-A
b-7
d-7
d-8
Whatlinethecardyourememberedresideinnow(1/2/3):
1
b-10KING2
d-5
c-7
Yourrememberedcardis:
KING2
提示:
(1)要从一副54张的扑克牌中任意抽出27张,可通过“rand()%54”所产生的随机值来确定。
但注意,一旦随机抽走哪张,下次牌中就没有这张了。
(2)程序总按照一种策略将三行纸牌重新“摆放”,而后进一步让用户进行指定。
上述所谓的策略指的是,总将纸牌“一分为三”:
第一次要将每一行的9张分散到不同的3行上(每行仅“剩”3张),而第二次则要将上次“确定”出的某3张进一步分散到不同的3行上(每行只“剩”1张。
此时靠用户再指定一次行号则可唯一确定所“暗记”的那张纸牌)。
25.编写程序求解骑士巡游问题:
在n行n列的棋盘上(如n=5),假设一位骑士(按象棋中“马走日”的行走法)从初始坐标位置(x1,y1)出发,要遍访(巡游)棋盘中的每一个位置一次。
请编一个程序,为骑士求解巡游“路线图”(或告诉骑士,从某位置出发时,无法遍访整个棋盘—问题无解)。
当n=5时,意味着要在5行5列的棋盘的25个“点”处,按骑士行走规则,依次将1至25这25个“棋子”(数码)分别摆放到棋盘上(摆满25个位置则成功,否则失败问题无解)。
例如,当n=5且初始坐标位置定为(1,1)—即最左上角的那个点时,如下是一种巡游“路线图”。
程序执行后的输出结果为:
(x1,y1)?
=>
(1=>
5,1=>
5):
11
1
6
15
10
21
14
9
20
5
16
19
2
7
22
11
8
13
24
17
4
25
18
3
12
23
(1)“棋盘”可用二维数组B表示。
(2)编制一个具有如下原型的递归函数solve,用于完成任务:
从(i,j)点出发,做第k至第n*n(即n的平方)次的移动—将k直到n的平方这些数码按规则分别摆放到棋盘即数组B中,若成功则通过引用参数ok返回true,否则返回false。
voidsolve(inti,intj,intk,bool&
ok);
(3)编制主函数,让用户输入作为巡游起点的初始坐标位置(x1,y1),在该处摆放“棋子”(数码)1,而后进行调用“solve(x1,y1,2,ok);
”来完成所求任务。
欲处理的初始问题为:
从某点(x1,y1)出发,按所给行走规则,作24次移动,遍访棋盘中没被访问过的各点(或发现无路可走)。
可分解化简为如下两个子问题(正是形成递归函数的基础):
①由点(x1,y1)出发,按所给行走规则作1次移动到达(g,h)(或发现无路可走);
②从(g,h)点出发,按所给行走规则,作23次移动,遍访棋盘中没被访问过的各点(或发现无路可走)。
solve函数具体实现时,若由(i,j)点出发已“无路可走”,则将引用参数ok置为false而递归出口;
否则,先“迈一步”到达(g,h)点,而后再进行递归调用:
solve(g,h,k+1,ok);
以实现从新点(g,h)出发,将k+1直到25这些“棋子”(数码)分别摆放到棋盘上,若成功则通过引用参数ok返回true(否则返回false)。
点评:
(1)也可编制第二种解法的主函数:
将棋盘上的n平方个点依次作为巡游起点的初始坐标位置(x1,y1),判断从每一位置出发是否有解或无解(输出“OK!
”或“NO!
”,但并不输出“路线图”)。
(2)若更改程序中的n值(如改为4或6等),便可求解其他阶数的巡游“路线图”。
(3)可改用非递归方法设计并编写solve函数,那样的话,通常要增加一个记录摆放“棋子”信息的数组,可记录下是沿着什么方向到达了当前的什么位置(在那儿摆放了“棋子”)等,而且对上述数组可按照栈(stack)的方式来使用(栈总是采用FILO即所谓的先进后出使用方式),以便在“无路可走”的情况下,回退(回溯)到上一个位置,接着按照另外的方向去寻找其他的“行走”方法。
26.设计程序在棋盘上放尽可能多的马,以使相互间不能被吃掉。
最后给出最大可放置的马的数量及其放置方法。
27.编写程序对八皇后问题进行求解:
在8行8列的棋盘上放置8个皇后,使任一个皇后都不能吃掉其他的7个皇后(注:
皇后可吃掉与她处于同行或同列或同一对角线上的其他棋子),并将结果以某种方式显示出来。
例如,当求出下述的一个解时,可输出如下信息来表示该解(输出了表示摆放皇后的坐标位置以及“棋盘状态”—棋盘中有皇后的位置放一个“Q”字符,其他位置为“+”字符)。
(1,1)(5,2)(8,3)(6,4)(3,5)(7,6)(2,7)(4,8)
Q+++++++
++++++Q+
++++Q+++
+++++++Q
+Q++++++
+++Q++++
+++++Q++
++Q+++++
提示:
(1)通过“intLineNum[9];
boola[9],b[15],c[15];
”说明具有全局作用域的4个数组。
其中的:
LineNum[i]表示第i列的皇后要放的行位置(只用其中的列号1到8);
a[i]为true(i=1,2,…,8)表示第i行上尚未放皇后;
b[i]为true(i=0,1,2,…,14)表示第i条斜对角线上尚未放皇后(斜对角线指的是“/”状对角线,该对角线上各点的行列号之和i+j为一个常数);
c[i]为true(i=0,1,2,…,14)表示第i条反斜对角线上尚未放皇后(反斜对角线指的是“\”状对角线,该对角线上各点的行列号之差i-j为一个常数)。
从而当使用语句“if(a[j]&
&
b[i+j-2]&
c[i-j+7])LineNum[i]=j;
”时,可用于判断并实现:
如果在第j行的第i列上放置皇后安全的话,则将一枚皇后放置到那儿。
(2)编制一个具有如下原型的递归函数solve,它负责往第i列开始的连续8-i+1列上均放上皇后,若成功则通过引用参数ok返回true(否则返回false)。
voidsolve(inti,bool&
ok);
摆放皇后之后,若i=8即已放满时则递归出口;
否则通过solve(i+1,ok);
进行递归调用。
(3)编制主函数,首先初始化一个“空棋盘”,即将a、b、c数组的各元素均置为true(表示当前棋盘的8个行、15条斜对角线以及15条反斜对角线上都尚未摆放皇后)。
而后执行调用语句“solve(1,ok);
”,它负责往第1列开始的连续8列上均放上皇后,若成功则通过引用参数ok返回true(否则返回false)。
(1)可改用非递归方法设计并编写solve函数,那样的话,通常要设置数组来记录皇后的摆放位置信息,还要记录这些皇后所产生的“影响面”(所建立的“势力范围”)—使得哪些行列位置不可再摆放皇后。
当在新的行列位置摆放了皇后、但此时又无法进一步摆放其他的皇后时,要回退(回溯)到上一个位置接着去考虑另外的“行走”方法(若还有的话)等等。
但注意,“回退”一步后,要同时“撤销”由于该步的回退而关联的那些“影响面”(释放“势力范围”)。
(2)本程序只是找到了某一种“摆放方案”而终止,还可进一步考虑寻找其他各种不同的“摆放方案”(实际上共有92种)。
(3)也可用同样的方法去处理其他“阶数”的皇后问题,如求解四皇后问题等。
28.八车问题。
设计程序在棋盘上放八个车,以使相互间不能被吃掉。
29.编一迷宫游戏程序,迷宫生成有用户输入和程序自动生成两种方式(迷宫以矩阵表示),要求输出迷宫和走出迷宫的路径。
30.编一棋盘游戏程序,人为一方,计算机为一方,人下时字符*将放在所指定的位置,而计算机下时字符@将放在某一空格位置。
行、列、或两对角线有连续三个相同字符一方为胜方,也有平局情况。
要求能动态演示。
*
@
31.一个人带有一只羊,一框菜和一只狼要过河,但船上除了载一人以外,最多每次只能再带一样东西。
而当人不在场的情况下,羊和菜在一起,羊要吃菜,狼和羊在一起,狼会吃羊。
问怎样安排,人才可以安全地把三样东西都运过河去。
32.Hanoi(汉诺)塔问题。
据说这是古代印度布拉玛神庙里的僧侣玩的一种游戏。
游戏的装置是一块铜板,上面有3根金刚石的针,在其中一根针上放着从大到小的64个盘子。
游戏的目标是把所有盘子从以根针上移到另一根针上,还有一根针作为中间过渡。
游戏规定每次只能移动一