C语言课程设计报告参考题目.docx
- 文档编号:12518397
- 上传时间:2023-04-19
- 格式:DOCX
- 页数:21
- 大小:54.62KB
C语言课程设计报告参考题目.docx
《C语言课程设计报告参考题目.docx》由会员分享,可在线阅读,更多相关《C语言课程设计报告参考题目.docx(21页珍藏版)》请在冰豆网上搜索。
C语言课程设计报告参考题目
《C语言课程设计》参考课题
第1题破译密码
问题:
据说最早的密码来自于罗马的凯撒大帝。
消息加密的办法是:
对消息原文中的每个字母,分别用该字母之后的第5个字母替换(例如:
消息原文中的每个字母A都分别替换成字母F)。
而你要获得消息原文,也就是要将这个过程反过来。
密码字母:
ABCDEFGHIJKLMNOPQRSTUVWXYZM
原文字母:
VWXYZABCDEFGHIJKLMNOPQRSTU
(注意:
只有字母会发生替换,其他非字母的字符不变,并且消息原文的所有字母都是大写的。
)
输入:
最多不超过100个数据集组成,每个数据集之间不会有空行,每个数据集由3部分组成:
1.起始行:
START
2.密码消息:
由1到200个字符组成一行,表示凯撒发出的一条消息.
3.结束行:
END
在最后一个数据集之后,是另一行:
ENDOFINPUT。
输出:
每个数据集对应一行,是凯撒的原始消息。
⏹SampleInput
START
NSBFW,JAJSYXTKNRUTWYFSHJFWJYMJWJXZQYTKYWNANFQHFZXJX
END
START
NBTZQIWFYMJWGJKNWXYNSFQNYYQJNGJWNFSANQQFLJYMFSXJHTSINSWTRJ
END
START
IFSLJWPSTBXKZQQBJQQYMFYHFJXFWNXRTWJIFSLJWTZXYMFSMJ
END
ENDOFINPUT
⏹SampleOutput
INWAR,EVENTSOFIMPORTANCEARETHERESULTOFTRIVIALCAUSES
IWOULDRATHERBEFIRSTINALITTLEIBERIANVILLAGETHANSECONDINROME
DANGERKNOWSFULLWELLTHATCAESARISMOREDANGEROUSTHANHE
解题思路
凯撒编码,判断字符是否是字母,并循环-5即可,记得要循环哦,非常简单的题目哦
第2题方阵填数
第3题
第4题进制转换问题
1.问题描述
实现将N进制到M进制数的转换(1 对于11到36进制数,其基数使用从A到Z的英文字母(全部为大写)代替。 例如对于11进制,其基数10(十进制)使用"A"表示;对于36进制,其基数35(十进制)使用"Z"表示。 被转换的数全部为正数且小于2147483647(long型的最大值)。 下表为十进制数100对应的各进制数: 进制 10 11 16 27 35 数值 100 91 64 3J 2U 2.要求: (1).实现10进制数到M进制数的转换。 (2).程序具有较强的容错能力(例如对错误的输入数字串的处理)。 (3).N进制到M进制数(1 3.输入: 输入文件名为convert.in,文件内容格式为第一列为被转换数的进制数,第二列为被转换数,第三列为转换后的进制。 这三列内容均为字符串形式。 每列之间使用一个空格隔开。 4.输出: 输出文件名为convert.out,文件内容为转换后的数。 对于一切错误,则输出“error”字符串。 5.输入输出文件样例: 样例1 convert.in convert.out 1010027 3J 样例2 convert.in convert.out 314027 error 第5题打鱼还是晒网 中国有句俗语叫“三天打鱼两天晒网”。 某人从1990年1月1日起开始“三天打鱼两天晒网”,问这个人在以后的某一天中是“打鱼”还是“晒网”。 *问题分析与算法设计 根据题意可以将解题过程分为三步: 1)计算从1990年1月1日开始至指定日期共有多少天; 2)由于“打鱼”和“晒网”的周期为5天,所以将计算出的天数用5去除; 3)根据余数判断他是在“打鱼”还是在“晒网”; 若余数为1,2,3,则他是在“打鱼” 否则是在“晒网” 在这三步中,关键是第一步。 求从1990年1月1日至指定日期有多少天,要判断经历年份中是否有闰年,二月为29天,平年为28天。 闰年的方法可以用伪语句描述如下: 如果((年能被4除尽且不能被100除尽)或能被400除尽) 则该年是闰年; 否则不是闰年。 C语言中判断能否整除可以使用求余运算(即求模) 第6题素数幻方 求四阶的素数幻方。 即在一个4X4的矩阵中,每一个格填入一个数字,使每一行、每一列和两条对角线上的4个数字所组成的四位数,均为可逆素数。 *问题分析与算法设计 有了前面的基础,本题应当说是不困难的。 最简单的算法是: 采用穷举法,设定4X4矩阵中每一个元素的值后,判断每一行、每一列和两条对角线上的4个数字组成的四位数是否都是可逆素数,若是则求出了满足题意的一个解。 这种算法在原理是对的,也一定可以求出满足题意的全部解。 但是,按照这一思路编出的程序效率很低,在微机上几个小时也不会运行结束。 这一算法致命的缺陷是: 要穷举和判断的情况过多。 充分利用题目中的“每一个四位数都是可逆素数”这一条件,可以放弃对矩阵中每个元素进行的穷举的算法,先求出全部的四位可逆素数(204个),以矩阵的行为单位,在四位可逆素数的范围内进行穷举,然后将穷举的四位整数分解为数字后,再进行列和对角线方向的条件判断,改进的算法与最初的算法相比,大大地减少了穷举的次数。 考虑矩阵的第一行和最后一行数字,它们分别是列方向四位数的第一个数字和最后一个数字,由于这些四位数也必须是可逆素数,所以矩阵的每一行和最后一行中的各个数字都不能为偶数或5。 这样穷举矩阵的第一行和最后一行时,它们的取值范围是: 所有位的数字均不是偶数或5的四位可逆数。 由于符合这一条件的四位可逆素数很少,所以这一范围限制又一次减少了穷举的次数。 对算法的进一步研究会发现: 当设定了第一和第二行的值后,就已经可以判断出当前的这种组合是否一定是错误的(尚不能肯定该组合一定是正确的)。 若按列方向上的四个两位数与四位可逆数的前两位矛盾(不是其中的一种组合),则第一、二行的取值一定是错误的。 同理在设定了前三行数据后,可以立刻判断出当前的这种组合是否一定是错误的,若判断出矛盾情况,则可以立刻设置新的一组数据。 这样就可以避免将四个数据全部设定好以后再进行判断所造成的低效。 根据以上分析,可以用伪语言描述以上改进的算法: 开始 找出全部四位的可逆素数; 确定全部出现在第一和最后一行的四位可逆素数; 在指定范围内穷举第一行 在指定范围内穷举第二行 若第一、第二、三行已出现矛盾,则继续穷举下一个数; 在指定范围内穷举第四行 判断列和对角方向是否符合题意 若符合题意,则输出矩阵; 否则继续穷举下一个数; 结束 在实际编程中,采用了很多程序设计技巧,假如设置若干辅助数组,其目的就是要最大限度的提高程序的执行效率,缩短运行时间。 下面的程序运行效率是比较高的。 第7题乘式还原 (1) A代表数字0到9中的前五个数字,Z代表后五个数字,请还原下列乘式。 AZA ×AAZ ------------ AAAA AAZZ ZAA ------------ ZAZAA *问题分析与算法设计 问题本身并不复杂,可以对乘式中的每一位使用穷举法,最终可以得到结果。 本题的关键在于怎样有效的判断每个部分积的每一位是否满足题意,这一问题处理不好,编写的程序会很长。 程序实现中可采用了一个判断函数,通过传入函数的标志字符串对所有的数进行统一的判断处理。 乘式还原 (2) 有乘法算式如下: ○○○ ×○○ ------------ ○○○○ ○○○○ ------------ ○○○○○ 18个○的位置上全部是素数(1、3、5或7),请还原此算式。 *问题分析与算法设计 问题中虽然有18数位,但只要确定乘数和被乘数后经过计算就可确定其它的数位。 乘数和被乘数共有5个数位,要求每个数都是质数。 完全可以采用穷举的方法对乘数和被乘数进行穷举,经过判断后找出答案。 但是这种方法给人的感觉是“太笨了”,因为组成的数字只是质数(4个),完全没有必要在那么大的范围内进行穷举,只需要试探每一位数字为质数时的情况即可。 采用五重循环的方法实现对于5个数字的穷举,前面的许多例题中都已见过。 循环实现简单易行,但嵌套的层次太多,需要穷举的变量的数量直接影响到循环嵌套的层数,这种简单的实现方法缺少技巧性。 本例的程序中给出了另外一种同样功能的算法,该算法的实现思想请阅读程序。 程序中并没有直接对质数进行穷举,而是将每个质数与1到4顺序一一对应,在穷举时为处理简单仅对1到4进行穷举处理,待要判断产生的乘积是否满足条件时再利用一个数组完成向对应质数的转换。 请体会程序中的处理方法。 程序中使用的算法实际上是回朔法。 第8题除式还原 (1) 给定下列除式,其中包含5个7,其它打×的是任意数字,请加以还原。 ×7×--------------商 -------------- 除数------××|×××××-------------被除数 ×77 -------------- ×7× ×7× ---------- ×× ×× ---------- ○ *题目分析与算法设计 首先分析题目,由除式本身尽可能多地推出已知条件。 由除式本身书已知: 1、被除数的范围是10000到99999,除数的范围是10到99,且可以整除; 2、商为100到999之间,且十位数字为7; 3、商的第一位与除数的积为三位数,且后两位为77; 4、被除数的第三位一定为4; 5、7乘以除数的积为一个三位数,且第二位为7; 6、商的最后一位不能为0,且与除数的积为一个二位数。 由已知条件就可以采用穷举的方法找出结果。 除式还原 (2) 下列除式中仅在商中给定了一个7,其它打×的位置全部是任意数字,请还原。 ×7×××-------------商 ------------------ 除数-------------------×××|××××××××-------------被除数 ××××-------------1) --------------- ×××-------------2) ×××-------------3) --------------- ××××-------------4) ×××-------------5) ----------------- ××××-------------6) ××××-------------7) ----------------- 0 *题目分析与算法设计 这道题是不可能用单纯的穷举法求解的,一则计算时间太长,二则难于求出除式中各部分的值。 对除式进行分析,改可能多地推出限制条件: 由3)可以看出,商的第二位7乘除数得一个三位数,所以除数<=142。 由除数乘商的第一位为一个四位数可知,商的第一位只能为8或9且除数>=112。 同时商的第五位也为8或9数的前四位一定<=142*9+99且>=1000+10。 由4)、5)、6)可以看出,4)的前两位一定为“10”;5)的第一位一定为“9”;6)的前两位一定在10到99之间;商的第四位一定为为0。 由5)的第一位一定是“9”和“112”<=除数<=142可知: 商的第三位可能为7或8。 由除式本身可知: 商的第四位为0。 由1)可知: 除数X商的第一位应当为一个四位数。 由5)可知: 除数X商的第三位应当为一个三位数。 编程时为了方便,将被除数分解: 前四位用a[0]表示,第五位用a[1],第六位用a[2],第七八两位用a[3];除数用变量b表示;分解商: 第一位用c[0],第五位用c[2];其它的部分商分别表示为: 2)的前两位为d[0],4)的前三位为d[1],6)的前二位为d[2]。 将上述分析用数学的方法综合起来可以表示为: 被除数: 1010<=a[0]<=13770<=a[1]<=9 0<=a[2]<=90<=a[3]<=99 除数: 112<=b<=142 商: 8<=c[0]<=97<=c[1]<=88<=c[2]<=9 2)的前两位: 10<=d[0]<=99 4)的前三位: 100<=d[1] 6)的前两位: 10<=d[2]<=99 1)式部分积: b*c[0]>1000 5)式部分积: 100 第9题约瑟夫问题 这是17世纪的法国数学家加斯帕在《数目的游戏问题》中讲的一个故事: 15个教徒和15个非教徒在深海上遇险,必须将一半的人投入海中,其余的人才能幸免于难,于是想了一个办法: 30个人围成一圆圈,从第一个人开始依次报数,每数到第九个人就将他扔入大海,如此循环进行直到仅余15个人为止。 问怎样排法,才能使每次投入大海的都是非教徒。 *问题分析与算法设计 约瑟夫问题并不难,但求解的方法很多;题目的变化形式也很多。 这里给出一种实现方法。 题目中30个人围成一圈,因而启发我们用一个循环的链来表示。 可以使用结构数组来构成一个循环链。 结构中有两个成员,其一为指向下一个人的指针,以构成环形的链;其二为该人是否被扔下海的标记,为1表示还在船上。 从第一个人开始对还未扔下海的人进行计数,每数到9时,将结构中的标记改为0,表示该人已被扔下海了。 这样循环计数直到有15个人被扔下海为止。 第10题卡布列克常数 验证卡布列克运算。 任意一个四位数,只要它们各个位上的数字是不全相同的,就有这样的规律: 1)将组成该四位数的四个数字由大到小排列,形成由这四个数字构成的最大的四位数; 2)将组成该四位数的四个数字由小到大排列,形成由这四个数字构成的最小的四位数(如果四个数中含有0,则得到的数不足四位); 3)求两个数的差,得到一个新的四位数(高位零保留)。 重复以上过程,最后得到的结果是6174,这个数被称为卡布列克数。 *问题分析与算法设计 题目中给出的处理过程很清楚,算法不需要特殊设计,可按照题目的叙述直接进行验证。 第11题自动发牌 一副扑克有52张牌,打桥牌时应将牌分给四个人。 请设计一个程序完成自动发牌的工作。 要求: 黑桃用S(Spaces)表示;红桃用H(Hearts)表示;方块用D(Diamonds)表示;梅花用C(Clubs)表示。 *问题分析与算法设计 按照打桥牌的规定,每人应当有13张牌。 在人工发牌时,先进行洗牌,然后将洗好的牌按一定的顺序发给每一个人。 为了便于计算机模拟,可将人工方式的发牌过程加以修改: 先确定好发牌顺序: 1、2、3、4;将52张牌顺序编号: 黑桃2对应数字0,红桃2对应数字1,方块2对应数字2,梅花2对应数字3,黑桃3对应数字4,红桃3对应数字5,...然后从52张牌中随机的为每个人抽牌。 这里采用C语言库函数的随机函数,生成0到51之间的共52个随机数,以产生洗牌后发牌的效果。 第12题黑白子交换 有三个白子和三个黑子如下图布置: ○○○.●●● 游戏的目的是用最少的步数将上图中白子和黑子的位置进行交换: ●●●.○○○ 游戏的规则是: (1)一次只能移动一个棋子; (2)棋子可以向空格中移动,也可以跳过一个对方的棋子进入空格,但不能向后跳,也不能跳过两个子。 请用计算机实现上述游戏。 *问题分析与算法设计 计算机解决胜这类问题的关键是要找出问题的规律,或者说是要制定一套计算机行动的规则。 分析本题,先用人来解决问题,可总结出以下规则: (1)黑子向左跳过白子落入空格,转(5) (2)白子向右跳过黑子落入空格,转(5) (3)黑子向左移动一格落入空格(但不应产生棋子阻塞现象),转(5) (4)白子向右移动一格落入空格(但不应产生棋子阻塞现萌),转(5) (5)判断游戏是否结束,若没有结束,则转 (1)继续。 所谓的“阻塞”现象就是: 在移动棋子的过程中,两个尚未到位的同色棋子连接在一起,使棋盘中的其它棋子无法继续移动。 例如按下列方法移动棋子: 0 ○○○.●●● 1○○.○●●● 2△○○●○.●● 3 ○○●.○●● 4两个●连在一起产生阻塞 ○○●●○.● 或4两个白连在一起产生阻塞 ○.●○○●● 产生阻塞的现象的原因是在第2步(△状态)时,棋子○不能向右移动,只能将●向左移动。 总结产生阻塞的原因,当棋盘出现“黑、白、空、黑”或“白、空、黑、白”状态时,不能向左或向右移动中间的棋子,只移动两边的棋子。 按照上述规则,可以保证在移动棋子的过程中,不会出现棋子无法移动的现象,且可以用最少的步数完成白子和黑子的位置交换。 第13题抢30 这是中国民间的一个游戏。 两人从1开始轮流报数,每人每次可报一个数或两个连续的数,谁先报到30,谁就为胜方。 *问题分析与算法设计 本题与上题类似,算法也类似,所不同的是,本谁先走第一步是可选的。 若计算机走第一步,那么计算机一定是赢家。 若人先走一步,那么计算机只好等待人犯错误,如果人先走第一步且不犯错误,那么人就会取胜;否则计算机会抓住人的一次错误使自己成为胜利者。 第14题搬山游戏 设有n座山,计算机与人为比赛的双方,轮流搬山。 规定每次搬山的数止不能超过k座,谁搬最后一座谁输。 游戏开始时。 计算机请人输入山的总数(n)和每次允许搬山的最大数止(k)。 然后请人开始,等人输入了需要搬走的山的数目后,计算机马上打印出它搬多少座山,并提示尚余多少座山。 双方轮流搬山直到最后一座山搬完为止。 计算机会显示谁是赢家,并问人是否要继续比赛。 若人不想玩了,计算机便会统计出共玩了几局,双方胜负如何。 *问题分析与算法设计 计算机参加游戏时应遵循下列原则: 1)当: 剩余山数目-1<=可移动的最大数k时计算机要移(剩余山数目-1)座,以便将最后一座山留给人。 2)对于任意正整数x,y,一定有: 0<=x%(y+1)<=y 在有n座山的情况下,计算机为了将最后一座山留给人,而且又要控制每次搬山的数目不超过最大数k,它应搬山的数目要满足下列关系: (n-1)%(k+1) 如果算出结果为0,即整除无余数,则规定只搬1座山,以防止冒进后发生问题。 第15题人机猜数游戏 由计算机“想”一个四位数,请人猜这个四位数是多少。 人输入四位数字后,计算机首先判断这四位数字中有几位是猜对了,并且在对的数字中又有几位位置也是对的,将结果显示出来,给人以提示,请人再猜,直到人猜出计算机所想的四位数是多少为止。 例如: 计算机“想”了一个“1234”请人猜,可能的提示如下: 人猜的整数计算机判断有几个数字正确有几个位置正确 112221 334421 331230 412340 124342 123444 游戏结束 请编程实现该游戏。 游戏结束时,显示人猜一个数用了几次。 *问题分析与算法设计 问题本身清楚明了。 判断相同位置上的数字是否相同不需要特殊的算法。 只要截取相同位置上的数字进行比较即可。 但在判断几位数字正确时,则应当注意: 计算机所想的是“1123”,而人所猜的是“1576”,则正确的数字只有1位。 程序中截取计算机所想的数的每位数字与人所猜的数字按位比较。 若有两位数字相同,则要记信所猜中数字的位置,使该位数字只能与一位对应的数字“相同”。 当截取下一位数字进行比较时,就不应再与上述位置上的数字进行比较,以避免所猜的数中的一位与对应数中多位数字“相同”的错误情况。 人机猜数游戏 (2) 将以上游戏双方倒一下,请人想一个四位的整数,计算机来猜,人给计算机提示信息,最终看计算机用几次猜出一个人“想”的数。 请编程实现。 *问题分析与算法设计 解决这类问题时,计算机的思考过程不可能象人一样具完备的推理能力,关键在于要将推理和判断的过程变成一种机械的过程,找出相应的规则,否则计算机难以完成推理工作。 基于对问题的分析和理解,将问题进行简化,求解分为两个步聚来完成: 首先确定四位数字的组成,然后再确定四位数字的排列顺序。 可以列出如下规则: 1)分别显示四个1,四个2,......,四个0,确定四位数字的组成。 2)依次产生四位数字的全部排列(依次两两交换全部数字的位置)。 3)根据人输入的正确数字及正确位置的数目,进行分别处理: (注意此时不出现输入的情况,因为在四个数字已经确定的情况下,若有3个位置正确,则第四个数字的位置必然也是正确的) 若输入4: 游戏结束。 判断本次输入与上次输入的差值 若差为2: 说明前一次输入的一定为0,本次输入的为2,本次交换的两个数字的位置是正确的,只要交换另外两个没有交换过的数字即可结束游戏。 若差为-2: 说明前一次输入的一定为2,本次的一定为0。 说明刚交换过的两个数字的位置是错误的,只要将交换的两个数字位置还原,并交换另外两个没有交换过的数字即可结束游戏。 否则: 若本次输入的正确位置数<=上次的正确位置数 则恢复上次四位数字的排列,控制转3) 否则: 将本次输入的正确位置数作为“上次输入的正确位置数”,控制转3)。 第16题选美比赛 在选美大奖赛的半决胜赛现场,有一批选手参加比赛,比赛的规则是最后得分越高,名次越低。 当半决决赛结束时,要在现场按照选手的出场顺序宣布最后得分和最后名次,获得相同分数的选手具有相同的名次,名次连续编号,不用考虑同名次的选手人数。 例如: 选手序号: 1,2,3,4,5,6,7 选手得分: 5,3,4,7,3,5,6 则输出名次为: 3,1,2,5,1,3,4 请编程帮助大奖赛组委会完成半决赛的评分和排名工作。 *问题分析与算法设计 问题用程序设计语言加以表达的话,即为: 将数组A中的整数从小到大进行连续编号,要求不改变数组中元素的顺序,且相同的整数要具有相同的编号。 普通的排序方法均要改变数组元素原来的顺序,显然不能满足要求。 为此,引入一个专门存放名次的数组,再采用通常的算法: 在尚未排出名次的元素中找出最小值,并对具有相同值的元素进行处理,重复这一过程,直到全部元素排好为止。 第17题满足特异条件的数列 输入m和n(20>=m>=n>0)求出满足以下方程的正整数数列i1,i2,...,in,使得: i1+i1+...+in=m,且i1>=i2...>=in。 例如: 当n=4,m=8时,将得到如下5个数列: 51114211331132212222 *问题分析与算法设计 可将原题抽象为: 将M分解为N个整数,且N个整数的和为M,i1>=i2>=...>=in。 分解整数的方法很低多,由于题目中有"i1>=i2>=.....>=i
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 语言 课程设计 报告 参考 题目