杭电算法与编程实习习题集无答案.docx
《杭电算法与编程实习习题集无答案.docx》由会员分享,可在线阅读,更多相关《杭电算法与编程实习习题集无答案.docx(62页珍藏版)》请在冰豆网上搜索。
杭电算法与编程实习习题集无答案
杭州电子科技大学通信工程学院
算法与编程
习题集
(第1版)
2012年4月
目录
基础训练题目部分2
题1.统计字母的使用频率2
题2.指示灯控制4
题3.进制转换6
题4.鸽笼原理9
题5.四则运算11
题7.数字游戏14
题8.寻找基数15
专业训练题目部分16
题9.信号处理初步16
题10.背包问题19
题11.噪声调幅干扰的C语言实现21
题12.图像处理及缩放24
题13.判断点是否位于三角形内26
题14.符号编解码28
题15.双向循环链表31
题16.利用矩阵变换实现加解密33
题17.大数的素性检测35
题18.大整数的加减法运算38
题19.处理文件40
题20.单词开头大写41
题21.数位排序问题43
附:
VisualC++6.0集成开发环境简介…………………………………………………………45
基础训练题目部分
题1.统计字母的使用频率
一、题目:
统计字母的使用频率
二、目的与要求
1.目的:
通过编写程序统计字母的使用频率,培养学生综合利用C语言进行程序设计的能力,熟悉字符串的操作方法,加强函数的运用,提高软件系统分析能力和程序文档建立、归纳总结的能力。
2.基本要求:
1)要求用C语言编程,在VisualC++环境下调试完成;
2)要求按照程序功能分成几个功能模块来实现,各个功能模块分别使用函数来完成;
3)要求应用本课所讲授的程序设计语言知识来解决问题
三、设计方法和基本原理
1.课题功能描述
本程序的功能,就是要统计英文字母的使用频率。
2.问题详细描述
为统计英文字母的使用频率,输入一个不包括空格的由英文字母组成的字符串,长度不超过200个字符。
统计26个英文字母的使用频率,不区分大小写。
最后按使用频率从大到小输出字母(小写字母)和使用频率(出现的次数)。
3.问题的解决方案
按照程序要求,本程序应采用模块化设计方法,设计几个功能模块。
例如(仅供参考):
◆将字符串中的大写字母转换为小写字母
◆统计输入的字符串中字母的使用频率
◆按使用频率从大到小进行排序
主函数中控制输入、函数调用和输出。
四、主要技术问题的描述
根据三的分析,主要问题在于:
1)为统计字母的使用频率,定义一个长度为26的int数组存放所统计的各个字母的使用频率。
2)在统计字母的使用频率时,不要使用if语句或switch语句,利用字母的ASCII码与数组元素下标之间的关系来求得。
3)按使用频率从大到小进行排序时,建议使用指针数组更为方便。
五、创新要求
实现程序功能后,可进行创新设计:
1)使用多文件,即主函数和各个函数分别存放在不同的.c文件中,在头文件中进行函数原型声明。
2)读入一篇英文文档,并对其进行字母频率分析。
题2.指示灯控制
问题描述:
N盏灯排成一排,从1到N按顺序依次编号。
有N个人也从1到N依次编号。
第一个人(1号)将灯全部关闭。
第二个人(2号)将凡是2和2的倍数的灯打开。
第三个人(3号)将凡是3和3的倍数的灯做相反的处理(如果该灯为打开的,则将它关闭;如果该灯为关闭的,则将它打开)。
以后的人都和3号一样,将凡是与自己编号相同的灯,以及是自己编号倍数的灯做相反处理。
请编写程序实现。
要求:
程序中要显示每一个人所做工作的过程,例如:
当第i个人操作时,则显示将i和i的倍数的灯做相反的处理过程;当第N个人操作之后,显示灯的最后状态。
(建议:
采用图形法,显示每一盏灯,并为每一盏灯加边框,用不同的颜色显示开灯或关灯)。
例如:
当输入N为7时;
当第一个人操作时
则输出结果为:
第1盏灯是黑的
第2盏灯是黑的
第3盏灯是黑的
第4盏灯是黑的
第5盏灯是黑的
第6盏灯是黑的
第7盏灯是黑的
当第二个人操作时
则输出结果为:
第1盏灯是黑的
第2盏灯是亮的
第3盏灯是黑的
第4盏灯是亮的
第5盏灯是黑的
第6盏灯是亮的
第7盏灯是黑的
当第三个人操作时
则输出结果为:
第1盏灯是黑的
第2盏灯是亮的
第3盏灯是亮的
第4盏灯是亮的
第5盏灯是黑的
第6盏灯是黑的
第7盏灯是黑的
………
当第七个人操作时
则输出结果为:
第1盏灯是黑的
第2盏灯是亮的
第3盏灯是亮的
第4盏灯是黑的
第5盏灯是亮的
第6盏灯是亮的
第7盏灯是亮
题3.进制转换
一、题目:
自然数的进制转换
二、目的与要求
1.目的:
通过编写对自然数进行不同进制转换程序,培养学生综合利用C语言进行程序设计的能力,熟悉字符串的操作方法,加强函数的运用,提高软件系统分析能力和程序文档建立、归纳总结的能力。
2.基本要求:
1)要求用C语言编程,在VisualC++环境下调试完成;
2)要求按照程序功能分成几个功能模块来实现,各个功能模块分别使用函数来完成;
3)要求应用本课所讲授的程序设计语言知识来解决问题.
三、设计方法和基本原理
1.课题功能描述
本程序的功能,就是实现自然数的十进制、二进制、八进制、十六进制转换。
即根据用户选择的进制和输入的数据,转换得到该数所对应的十进制、二进制、八进制和十六进制数。
2.问题详细描述
程序运行时,首先由用户选择输入数据所使用的进制,如:
欢迎使用进制转换程序!
1.十进制
2.二进制
3.八进制
4.十六进制
0.退出
请选择输入数据的进制:
用户选择后,再输入数据,如选择3(八进制),则显示:
请输入八进制数据:
输入数据后,程序进行转换,最后输出该数所对应的十进制、二进制、八进制和十六进制数。
如输出:
转换结果:
十进制21809
二进制101010100110001
八进制52461
十六进制5531
3.问题的解决方案
实际上,C语言在输入输出时可直接输入或输出各种进制的数,本题目是为了提高学生的编程能力,所以要自己编程来实现数制的转换。
根据问题的描述,使用字符数组来存放输入的数据,转换后的数据也存放到字符数组中,按字符串进行输入和输出。
注意:
问题的解决方案有很多,下面给出的仅供同学们参考。
按照程序要求,每次要将数据转换成各种进制,因此将输入数据(字符数组中)先转换成十进制数(long),再将其转换成各种进制并存入相应的字符数组中,最后输出。
本程序应采用模块化设计方法,设计几个功能模块。
例如(仅供参考):
◆检验输入数是否合法(例八进制数中只能出现0~7)
◆将数据(字符数组中)转换成十进制数(long)
◆将十进制数(long)转换成某种进制数据(字符数组中)
还可以把这几个模块中都使用的字符与数字之间的转换作为独立模块,供上面的模块调用。
例如(仅供参考):
◆字符转数字
◆数字转字符
主函数中控制输入、函数调用和输出。
四、主要技术问题的描述
根据三的分析,主要问题在于:
1)单个字符与数字的转换
在字符转数字时,’0’~’9’只需减去’0’即可,要考虑到’a’~’f’和’A’~’F’的转换(十六进制数)。
同样的,数字转字符时,要考虑到10~15的转换与0~9不同。
2)将数据(字符数组中)转换成十进制数(long)时,采用的算法是:
按当前数制的位权进行多项式展开相加,即得到对应的十进制数。
3)将十进制数(long)转换成某种进制数据(字符数组中)时,采用除留余数法:
将十进制数除以转换进制的位权,保留余数(存到字符数组中),商继续除,直到商为零;然后将字符数组中的内容求头逆序,即得到转换数据。
其中求逆序也可用一个独立模块来实现。
五、创新要求
实现程序功能后,可进行创新设计:
1)使用多文件,即主函数和各个函数分别存放在不同的.c文件中,在头文件中进行函数原型声明;
2)本程序实现的是自然数的不同进制的转换,可进一步实现带小数的转换;
3)实现负数的转换
题4.鸽笼原理
一、题目:
序列小游戏
二、目的与要求
1.目的:
(1)让学生体会到鸽巢原理(或抽屉原理)的乐趣并使学生更加系统地理解和掌握C语言的函数间参数传递方法、数组和指针的应用等编程技巧。
培养学生综合利用C语言进行科学计算,使学生将所学知识转化为分析和设计简单实际问题的能力,学会查资料和工具书。
(2)提高学生建立程序文档、归纳总结的能力。
2.基本要求:
(1)要求用C语言编程,在VisualC++环境下调试完成;
(2)要求按照程序功能分成几个功能模块来实现,各个功能模块分别使用函数来完成;
(3)要求应用本课所讲授的程序设计语言知识来解决问题.
三、设计方法和基本原理
1.课题功能描述
任意给定5个数字,其中必定存在3个数字已经有序(或者升序,或者降序),找出这5个数字中最长的升序或降序序列。
例如:
1,7,5,3,9。
则{1,7,9},{1,5,9},{1,3,9}都是最长的升序序列;
而{7,5,3}是最长的降序序列。
再如:
1,3,2,5,7。
最长的升序序列为{1,3,5,7}和{1,2,5,7}。
2.问题的解决方案:
自动生成各种可能的序列,对于5个数字所有可能的序列为:
{0,1,2,3}、{0,1,2,4}、{0,1,3,4}、{0,2,3,4}、{1,2,3,4}
{0,1,2}、{0,1,3}、{0,2,3}、{1,2,3}
{0,1,4}、{0,2,4}、{1,2,4}
{1,3,4}
{2,3,4}、{0,3,4}
考察各种可能的序列是否升序或是降序,若是则打印;
四、创新要求
在基本要求达到后,进行创新设计,10个数据,必定会有至少4个数据已经有序(或升序或降序),找出最长的升序或降序序列。
题5.四则运算
一、题目:
四则运算
二、目的与要求
1.目的:
通过编写四则运算程序,培养学生综合利用C语言进行程序设计的能力,熟悉字符串的操作方法,加强函数的运用,提高软件系统分析能力和程序文档建立、归纳总结的能力。
2.基本要求:
1)要求用C语言编程,在VisualC++环境下调试完成;
2)要求按照程序功能分成几个功能模块来实现,各个功能模块分别使用函数来完成;
3)要求应用本课所讲授的程序设计语言知识来解决问题.
三、设计方法和基本原理
1.课题功能描述
本程序的功能,就是实现数的加减乘除四则运算,如自动计算3+5*8的结果。
2.问题详细描述
程序运行时,首先提示用户输入四则运算表达式(表达式中最多有3个运算符,数据范围为1-100的整数);
输入结束后,程序自动进行计算并给出结果。
如:
输入13-10+5/8时输出3.625。
3.问题的解决方案
注意:
问题的解决方案有很多,下面给出的仅供同学们参考。
该问题主要注意四则运算的优先级问题:
乘除运算比加减运算优先级高,同级运算按从左到右的顺序运算。
本程序应采用模块化设计方法,设计几个功能模块。
例如(仅供参考):
◆字符串解析函数(将输入字符串分解成数和运算符)
◆将数据(字符数组中)转换成十进制数(long)
◆判读是否存在高优先级运算符,若存在首先计算其运算结果并保存。
◆同级运算按先后顺序进行。
四、创新要求
实现程序功能后,可进行创新设计:
1)使用多文件,即主函数和各个函数分别存放在不同的.c文件中,在头文件中进行函数原型声明;
2)在程序中增加自动出题功能及自动批卷功能
3)不限定运算符个数
4)允许括号运算的存在。
题6.约瑟夫问题
[基本要求]
有1至N编号的N个人按顺时针方向围坐一圈,每人持有一个密码(正整数),一开始以正整数m作为报数上限值,从第一个人开始顺时针方向自1开始顺序报数,报到m时停止报数,报m的人出列,将他的密码作为新的报数上限值,从他的顺时针方向上的下一个人开始重新报数,如此下去,直至所有的人全部出列为止,要求产生记录出列顺序的表。
如N=7,每个人的密码依次是:
3,1,7,2,4,8,4,m的值为20,则出列顺序为6,1,4,7,2,3,5。
所有人用一个循环单链表表示,表中每个结点代表一个人,按出列次序依次将结点从循环单链表中删除,并按顺序存放在一个单链表中,链表的每个结点包括三个字段:
code代表密码,no代表人的编号,link是指向下一个结点的指针。
在主函数中,用堆分配的方法建立Josephus对象。
循环展开对问题的求解。
扩展:
在n个人的Josephus问题中,如果事先知道每个人的密码,求处于哪个位置,获胜的概率最大?
题7.数字游戏
玲玲喜欢通过玩数字游戏的方式来加深别人对她的印象。
她最喜欢的一个数字游戏是让人给出一个数N,然后她会立即说出N的阶乘最末尾有多少个连续的零。
很显然,这会让别人会对她印象深刻,因为,一般来说N!
是一个非常大的数。
例如,N为100时,100!
会比地球上所有原子的数目还要大,但玲玲可以很快说出100!
末尾有连续24个0。
但是,她的一些朋友通常不是以10为进制的。
这时,玲玲却不知道该怎么修改她的技巧来适应这些朋友了。
问题:
给出一个进制b和一个数n,计算当采用b进制时,n!
末尾有多少个连续的0。
例如,当b=2和n=5时,由于5!
=120=1111000
(2),结果应该为3.
输入:
第一行包含了总的计算次数。
接下来的每一行给出了不同情况下的问题中的两个数b(2≤b≤1000)和n(1≤n≤1000000),这两个数都是10进制的。
输出:
输出结果中,对每一次计算都以"Scenario#i:
"开始,其中的i是从1开始的第i次计算。
然后打印一行,输出:
当采用b进制时,n!
末尾有多少个连续的0(以十进制形式)。
对每一次计算都以一个空白行结束。
输入样例:
3
25
10100
4510000
对样例的正确输出:
Scenario#1:
3
Scenario#2:
24
Scenario#3:
2498
题8.寻找基数
问题描述:
同一个数会由于采用不同的基数而使得其表现的形式是完全不一样的,在我们的学习中,我们熟悉的基数有10进制、12进制、60进制、2进制、8进制和16进制。
比如数据12,如果我们用2进制表示,则它就是1100;如果用3进制表示就是110;如果用8进制表示则是14。
我们的编程任务就是与数的进制(也就是基数)有关。
程序中我们会给大家很多个数对(假设每个数对的数用X和Y表示),程序需要解决的问题就是为X和Y各选择一个最小的基数,以使得这两个数在其选择的基数上是一对相等的数。
例如,12和5这个数对,我们可以为12选择基数3,为5选择基数6,这样一来12(base3)=5(base6),因为12(base3)就是10进制数5,而5(base6)也是10进制数中的5。
输入:
程序的输入是通过文件完成的。
理想中文件的每一行都包含一个数对X和Y,两个数通过一个或多个空格符分割,与X和Y相关联的有效基数值范围为2~36。
X和Y的合理数值表示字符包括0—9和A-Z(表示数值10-35),但是要注意处理不合法的数据表示形式。
文件的最后一行用一个数字0表示输入的结束。
样例输入文件(base.in)
125
10A
1234
123456
ab&e123
12
102
0
输出:
结果应该存放在一个文件中,该文件中的每一行对应为输入文件中相应的那行数对,输出的格式按照下面的示例文件即可。
样例输出文件(base.out)
12(base3)=5(base6)
10(base10)=A(base11)
12(base17)=34(base5)
123isnotequalto456inanybase2..36
ab&eisillegalnumberexpression
1isnotequalto2inanybase2..36
10(base2)=2(base3)
专业训练题目部分
题9.信号处理初步
一、题目:
信号处理初步
二、目的与要求
1.目的:
通过编写程序对信号做简单变换,培养学生综合利用C语言进行程序设计的能力,熟悉信号处理方法,加强函数的运用,提高软件系统分析能力和程序文档建立、归纳总结的能力。
2.基本要求:
1)要求用C语言编程,在VisualC++环境下调试完成;
2)要求按照程序功能分成几个功能模块来实现,各个功能模块分别使用函数来完成;
3)要求应用本课所讲授的程序设计语言知识来解决问题
三、设计方法和基本原理
1.课题功能描述
本程序的功能,就是要对一维和二维信号做变换。
2.问题详细描述
当信号的特征不明显时,常用的一种方法是将信号从其所在的空间变换到另一个空间。
本节介绍一种常用的变换方法。
(i)一维信号处理
设有一个离散时间信号x(n),n的取值为0到N-1的正整数,它可以通过式
(1)将其变换到另一个空间X。
(1)
式
(1)中k是整数,由欧拉公式
。
若要从X空间反变换回x空间,可采用式
(2)来实现。
(2)
试用C语言实现上述变换。
并对下列两个信号进行变换:
(a)
,N=4
(b)
,N=12
(ii)二维信号处理
上述方法可以推广到二维信号。
设有一个二维离散信号f(n,m),n的取值为0到N-1的正整数,m的取值为0到M-1的正整数,它可以通过式(3)将其变换到另一个空间F。
(3)
式(3)中u和v是整数。
若要从F空间反变换回f空间,可采用式(4)来实现。
(4)
试用C语言实现上述变换。
这里,二维离散信号的变换表达式(3)可以表示成式(5)。
(5)
式(5)中“[]”内的表达式可以看成是对n固定m变化的一维信号做变换,如式(6)所示。
因此,式(5)可以看成是对式(6)做一维变换,如式(7)所示,即式(5)相当于是对f(n,m)做了两次一维变换。
同理,式(4)也可以看作是两次一维变换的结果。
(6)
(7)
试用C语言实现上述变换。
并对下列两个信号进行变换:
(a)
N=M=15
(b)
,N=12,M=14
3.问题的解决方案
按照程序要求,本程序应采用模块化设计方法,设计几个功能模块。
例如(仅供参考):
(1)欧拉公式展开
(2)复数乘法、加法、减法
(3)对任意长度的一维离散信号做变换
主函数中控制输入、函数调用和输出。
四、主要技术问题的描述
根据三的分析,主要问题在于:
(1)欧拉公式展开的C语言实现,把复指数转换成复数;
(2)复数乘法、加法、减法运算的实现,它们是变换过程中主要涉及的运算;
(3)一维离散信号的变换。
五、创新要求
实现程序功能后,可进行创新设计:
(1)使用多文件,即主函数和各个函数分别存放在不同的.c文件中,在头文件中进行函数原型声明。
(2)对二维信号的变换可看作是对二维信号分别做了两次变换,试比较其和直接变换的效率。
题10.背包问题
一、题目:
背包问题
二、目的与要求
1.目的:
(1)掌握背包问题模型及其解决算法;
(2)培养C语言编程能力;
(3)培养学生解决实际问题的能力。
2.基本要求:
(1)掌握背包问题模型及至少一种解决算法;
(2)采用C语言编程,在VisualC++环境下调试完成;
三、设计方法和基本原理
1.课题功能描述
背包问题是一类问题的总称,本程序主要解决下面的背包问题。
2.问题详细描述
有N件物品和一个容量为V的背包。
第i件物品的重量是c[i],价值是w[i]。
求解将哪些物品装入背包可使这些物品的重量总和不超过背包容量,且价值总和最大。
3.问题的解决方案
为解决上面问题,可以按如下的方式思考(仅供参考):
(1)分析上面背包问题的特点,每种物品仅有一件,可以选择放或不放;
(2)利用数学知识将上面问题建模,得到目标函数;
(3)利用C语言按题目要求随机生成一个具体的背包问题,并利用第2步得到的数学模型思考解决方法;
(4)将解决方法利用C语言实现,验证是否正确;
四、主要技术问题的描述
该问题的主要难点在于解决方法,可以采用下面三种方法(仅供参考):
(1)采用0/1整数线性规划算法解决;
(2)采用动态规划算法解决;
(3)蛮力搜索。
五、创新要求
(1)联系实际生活中的例子,提出一个具体的背包问题,并利用上面的程序得到结果。
(2)分析算法的时间复杂度和空间复杂度。
题11.噪声调幅干扰的C语言实现
一、题目:
噪声调幅干扰的C语言实现
二、目的与要求
1.目的:
通过编写程序实现通信干扰中的噪声调幅干扰,并画出其时域波形。
培养学生综合利用C语言进行程序设计的能力,熟悉随机变量的产生方法和C语言画图方法,加强函数的运用,提高软件系统分析能力和程序文档建立、归纳总结的能力。
2.基本要求:
1)要求用C语言编程,在VisualC++环境下调试完成;
2)要求按照程序功能分成几个功能模块来实现,各个功能模块分别使用函数来完成;
3)要求应用本课所讲授的程序设计语言知识来解决问题
三、设计方法和基本原理
1.课题功能描述
本程序的功能,就是要实现通信干扰中的噪声调幅干扰,并画出其时域波形。
2.问题详细描述
噪声调幅干扰是一种常用的干扰样式,它利用基带噪声作为调制信号,对正弦载波信号进行调制,使载波信号的振幅随基带噪声作随机变化。
其定义如下:
式中,
是载波振幅;
是干扰中心频率;
是基带噪声,服从均值为0,方差为
的高斯分布,在
分布的平稳随机过程;
在
内均匀分布,且与
独立的随机变量。
其信号波形如图1所示:
图1噪声调幅干扰示意图
3.问题的解决方案
按照程序要求,本程序应采用模块化设计方法,设计几个功能模块。
例如(仅供参考):
(1)产生服从均匀分布的初相
;
(2)产生服从高斯分布
的基带噪声;
(3)产生中心频率为
且初相为
的正弦波。
主函数中控制输入、函数调用和输出。
四、主要技术问题的描述
根据三的分析,主要问题在于:
(1)产生服从均匀分布
的随机数需要用到混合同余法,即由给定的初值
,根据
产生(0,1)区间上的随机数
。
其中
。
然后,通过变换
产生
区间上的随机数。
(2)高斯分布
的概率密度函数为
其中
为均值,
为方差。
产生服从高斯分布
随机数的方法为:
设
是(0,1)上n个相互独立的服从均匀分布的随机数,由于
,
,根据中心极限定理可知,当n充分大时,
的分布近似于高斯分布
。
通常取n=12,此时有
。
最后,通过变换
,便可得到均值为
,方差为
的高斯分布随机数
。
(3)C语言画波形图,需要用到graphics.h头文件。
其中主要用到的函数有:
画线函数:
line()、lineto()
设置线型函数:
setlinestyle()
设置画线模式:
setwitemode()
返回象素