C/C++课程设计题目(2022版)[2023-02-05]
课程设计题目(2022版)
必做题1-6:
1、菜鸟智慧系统(必做)(线性表)
[问题描述]
使用双向链表模拟快递驿站的系统运作:
- 假设快递驿站的货架分小、中、大3种类型,容量分别为500、100、50个包裹;该快递站关联的社区人员为MAX_PERSON人(例如,限定为30人,每人唯一手机号)。
- 驿站每天都会来一批新的包裹。包裹根据大小类型分别上对应的货架,加入对应链表表尾,并使用该货架当前可用的最小编号。用N[1]、N[2]、N[3]分别表示每天随机来的大、中、小包裹数量,保证N[i]在货架的承受能力之内。
- 包裹信息包括:包裹编号(生成的取件码,分别为1-x(小),2-x(中), 3-x(大))、取件人姓名、取件人手机号、包裹大小(小1、中2、大3)、到达日期。
- 包裹上架时,按照包裹编号从小到大的顺序排列。
- 包裹取出后就从对应链表中删除。用M表示每天随机来取包裹的人数,且M≤MAX_PERSON。
- 包裹最多在驿站存放两天,逾期则退还寄件人(从货架上清除)。
- 当一人来取包裹时,可通过提供其任一取件码或手机号查询包裹并取出该人员所有关联的包裹。
- 设计相应的分析、统计功能(自定义),例如当天收包裹数量最多的人,当天有包裹人的平均包裹数量,一周内与其被退回的包裹数量等。
- 可根据需要做功能拓展,使得模拟系统更接近实用或在现有商用快递系统的基础上有针对性的创新(*)
- 该问题需有较好的展示性,能够演示快递收发过程。
[基本要求]
(1) 所有事件均随机生成
(2) 用文件存储货架状态,所有变更均应反应在文件中。存储形式自行设计,但务必清晰、直观
源码
https://pan.baidu.com/s/1pq1Nwwo0hlc_J84F93HM4A?pwd=1111
2、算术表达式求值 (必做)(栈)
[问题描述]
一个算术表达式是由操作数(operand)、运算符(operator)和界限符(delimiter)组成的。假设操作数是正实数,运算符只含加减乘除等四种运算符,界限符有左右括号和表达式起始、结束符“#”,如:#6+15(21-8/4)#。引入表达式起始、结束符是为了方便。编程利用“运算符优先法”求算术表达式的值。
[基本要求]
(1)从键盘或文件读入一个合法的算术表达式,输出正确的结果。
(2)显示输入序列和栈的变化过程。
(3)考虑算法的健壮性,当表达式错误时,要给出错误原因的提示。
(4)实现非整数的处理()。
3、特殊路径统计(必做)(树和图)
[问题描述]
给定一颗有N个节点(编号为1-N)的树。
两个节点a,b(a<b)之间的简单路径上若所有节点编号i均在a,b之间(a≤i≤b),则该路径可标记为特殊路径。
试统计树上一共有多少条特殊路径。
[输入格式]
- 第一行包含一个整数N,代表节点数
- 第二行包含N个整数p1,p2,…,pn,代表每个节点的父节点编号。若pi=0,则该节点为树的根节点
[输出数据]
输出树上一共有多少条特殊路径
[补充说明]
- 0≤pi≤N
- 有且仅有一个pi=0
- 输入的图是一棵树
[样例1]
输入:
7
0 5 5 1 4 1 4
输出:
10
[样例2]
输入:
5
2 3 0 2 2
输出:
7
其中样例1的图形示例:
4、【4】公交线路提示 (必做)(图)
[问题描述]
根据真实南京公交线路图,建立南京主要公交线路图的存储结构。
[基本要求]
(1)输入任意两站点,给出转车次数最少的乘车路线。
(2)输入任意两站点,给出经过站点最少的乘车路线。
5、Huffman编码与解码(必做)(Huffman编码、二叉树)
[问题描述]
对一篇不少于5000字符的英文文章(source.txt),统计各字符出现的次数,实现Huffman编码(code.dat),以及对编码结果的解码(recode.txt)。
[基本要求]
(1) 输出每个字符出现的次数和编码,并存储文件(Huffman.txt)。
(2) 在Huffman编码后,英文文章编码结果保存到文件中(code.dat),编码结果必须是二进制形式,即0 1的信息用比特位表示,不能用字符‘0’和‘1’表示(*)。
(3) 实现解码功能。
6、排序算法比较(必做)(排序)
[问题描述]
利用随机函数产生10个样本,每个样本有50000个随机整数(并使第一个样本是正序,第二个样本是逆序),利用直接插入排序、希尔排序,冒泡排序、快速排序、选择排序、堆排序,归并排序、基数排序8种排序方法进行排序(结果为由小到大的顺序),并统计每一种排序算法对不同样本所耗费的时间。
[基本要求]
(1)原始数据存在文件中,用相同样本对不同算法进行测试;
(2)屏幕显示每种排序算法对不同样本所花的时间;
选做题7-20:
类型一:CSP类型选做题(最多计4分)
7、【1】火车购票 (选做)(线性表)
[问题描述]
请实现一个铁路购票系统的简单座位分配算法,来处理一节车厢的座位分配。
假设一节车厢有20排、每一排5个座位。为方便起见,我们用1到100来给所有的座位编号,第一排是1到5号,第二排是6到10号,依次类推,第20排是96到100号。
购票时,一个人可能购一张或多张票,最多不超过5张。如果这几张票可以安排在同一排编号相邻的座位,则应该安排在编号最小的相邻座位。否则应该安排在编号最小的几个空座位中(不考虑是否相邻)。
假设初始时车票全部未被购买,现在给了一些购票指令,请你处理这些指令。
[输入格式]
对于所有评测用例,1 ≤ n ≤ 100,所有购票数量之和不超过100。
输入的第一行包含一个整数n,表示购票指令的数量。
第二行包含n个整数,每个整数p在1到5之间,表示要购入的票数,相邻的两个数之间使用一个空格分隔。
[输出格式]
输出n行,每行对应一条指令的处理结果。
对于购票指令p,输出p张车票的编号,按从小到大排序。
[样例]
输入:
4
2 5 4 2
输出:
1 2
6 7 8 9 10
11 12 13 14
3 4
8、【2】棋局评估(选做)(图)
[问题描述]
Alice和Bob正在玩井字棋游戏。 井字棋游戏的规则很简单:两人轮流往3*3的棋盘中放棋子,Alice放的是“X”,Bob放的是“O”,Alice执先。当同一种棋子占据一行、一列或一条对角线的三个格子时,游戏结束,该种棋子的持有者获胜。当棋盘被填满的时候,游戏结束,双方平手。
Alice设计了一种对棋局评分的方法:
- 对于Alice已经获胜的局面,评估得分为(棋盘上的空格子数+1);
- 对于Bob已经获胜的局面,评估得分为 -(棋盘上的空格子数+1);
- 对于平局的局面,评估得分为0;
例如上图中的局面,Alice已经获胜,同时棋盘上有2个空格,所以局面得分为2+1=3。
由于Alice并不喜欢计算,所以他请教擅长编程的你,如果两人都以最优策略行棋,那么当前局面的最终得分会是多少?
[输入格式]
输入的第一行包含一个正整数T,表示数据的组数。
每组数据输入有3行,每行有3个整数,用空格分隔,分别表示棋盘每个格子的状态。0表示格子为空,1表示格子中为“X”,2表示格子中为“O”。保证不会出现其他状态。
保证输入的局面合法。(即保证输入的局面可以通过行棋到达,且保证没有双方同时获胜的情况)
保证输入的局面轮到Alice行棋。
[输出格式]
对于每组数据,输出一行一个整数,表示当前局面的得分。
[样例]
输入:
3
1 2 1
2 1 2
0 0 0
2 1 1
0 2 1
0 0 2
0 0 0
0 0 0
0 0 0
输出 :
3
-4
0
说明:
第一组数据:
Alice将棋子放在左下角(或右下角)后,可以到达问题描述中的局面,得分为3。
3为Alice行棋后能到达的局面中得分的最大值。
第二组数据:
Bob已经获胜(如图),此局面得分为-(3+1)=-4。
第三组数据:
井字棋中若双方都采用最优策略,游戏平局,最终得分为0。
9、【3】通信管理系统(选做)(图)
[问题描述]
你负责管理一个计算机通信系统。
有n台计算机接入了该系统,编号为1~n,它们之间可以互相发送数据。
由于设备条件限制,机器之间不能任意多地发送数据。每两台机器之间均有一个“每日可用额度”的限制,单位为MB/day,表示这两台机器每日可以互相发送的数据量(双方各自向对方发送的数据量之和)的最大值。
最初,任意两台机器的每日可用额度均为0。为了能发送数据,机器管理者需要向你申请额度。每个申请形如u v x y的格式,表示机器u和v的每日可用额度增大x MB/day,持续y天(即从申请当天开始至申请后第y-1天内有效,从第y天开始失效)。不同申请的效果是可以叠加的。
定义每台机器的“通信主要对象”为当前时刻与该机器的每日可用额度最大的机器(如果有并列,则取其中编号最小的机器);如果一台机器与任何机器的每日可用额度均为0,则称其为“通信孤岛”,并认为其没有“通信主要对象”;如果两台机器x和y互为“通信主要对象”,则称它们是一个“通信对”。
每天开始时,你都会先接受若干个额度申请,你需要依次处理这些申请;而后,你将接收到若干个查询某台机器的“通信主要对象”的请求;最后,你可能还希望求出此时的“通信孤岛”和“通信对”各有多少。
请你编写一段程序来实现上述任务。
[输入格式]
第一行:2个正整数n,m,表示机器数和天数。
接下来3m行,每两行描述一天中的事件,格式如下:
- 第1行:首先是一个非负整数ki,表示当天额度申请的数量。接下来有4ki个非负整数,依次描述每一个额度申请,格式如题面中所述。
- 第2行:首先是一个非负整数li,表示当天查询“通信主要对象”的数量。接下来有li个正整数,依次表示查询的机器编号,保证编号在[1,n]范围内。
- 第3行:2个整数pi,qi,取值均为0或1,分别表示当天是否要查询“通信孤岛”和“通信对”的数量。其中pi=1表示需要查询“通信孤岛”的数量,pi=0表示不需要查询;qi的含义同理。
[输出格式]
对于每个查询分别输出一行,一个非负整数表示该查询的答案。
查询按照天数顺序输出,对于同一天内的查询,先按照输入顺序输出所有查询“通信主要对象”的答案,再依次输出查询“通信孤岛”和“通信对”的答案(如果当天需要查询的话)。
如果某台被查询“通信主要对象”的机器是“通信孤岛”,认为查询结果为0。
[样例]
输入:
3 3
2 1 2 2 3 1 3 3 2
1 1
0 0
1 2 3 3 1
2 1 2
0 1
0
2 1 3
1 1
输出:
3
3
3
1
2
0
1
1
10、【2】URL映射(选做)(字符串)
[问题描述]
URL 映射是诸如 Django、Ruby on Rails 等网页框架 (web frameworks) 的一个重要组件。对于从浏览器发来的 HTTP 请求,URL 映射模块会解析请求中的 URL 地址,并将其分派给相应的处理代码。现在,请你来实现一个简单的 URL 映射功能。
本题中 URL 映射功能的配置由若干条 URL 映射规则组成。当一个请求到达时,URL 映射功能会将请求中的 URL 地址按照配置的先后顺序逐一与这些规则进行匹配。当遇到第一条完全匹配的规则时,匹配成功,得到匹配的规则以及匹配的参数。若不能匹配任何一条规则,则匹配失败。
本题输入的 URL 地址是以斜杠 / 作为分隔符的路径,保证以斜杠开头。其他合法字符还包括大小写英文字母、阿拉伯数字、减号 -、下划线 _ 和小数点 .。例如,/person/123/ 是一个合法的 URL 地址,而 /person/123? 则不合法(存在不合法的字符问号 ?)。另外,英文字母区分大小写,因此 /case/ 和 /CAse/ 是不同的 URL 地址。
对于 URL 映射规则,同样是以斜杠开始。除了可以是正常的 URL 地址外,还可以包含参数,有以下 3 种:
字符串 :用于匹配一段字符串,注意字符串里不能包含斜杠。例如,abcde0123。
整数 :用于匹配一个不带符号的整数,全部由阿拉伯数字组成。例如,01234。
路径 :用于匹配一段字符串,字符串可以包含斜杠。例如,abcd/0123/。
以上 3 种参数都必须匹配非空的字符串。简便起见,题目规定规则中 和 前面一定是斜杠,后面要么是斜杠,要么是规则的结束(也就是该参数是规则的最后一部分)。而 的前面一定是斜杠,后面一定是规则的结束。无论是 URL 地址还是规则,都不会出现连续的斜杠。
[输入格式]
输入第一行是两个正整数 n 和 m,分别表示 URL 映射的规则条数和待处理的 URL 地址个数,中间用一个空格字符分隔。
第2行至第 n+1 行按匹配的先后顺序描述 URL 映射规则的配置信息。第 i+1 行包含两个字符串 pi 和 ri,其中 pi 表示 URL 匹配的规则,ri 表示这条 URL 匹配的名字。两个字符串都非空,且不包含空格字符,两者中间用一个空格字符分隔。
第n+2行至第 n+m+1 行描述待处理的 URL 地址。第 n+1+i 行包含一个字符串 qi,表示待处理的 URL 地址,字符串中不包含空格字符。
[样例]
输入:
5 4
/articles/2003/ special_case_2003
/articles/<int>/ year_archive
/articles/<int>/<int>/ month_archive
/articles/<int>/<int>/<str>/ article_detail
/static/<path> static_serve
/articles/2004/
/articles/1985/09/aloha/
/articles/hello/
/static/js/jquery.js
输出:
year_archive 2004
article_detail 1985 9 aloha
404
static_serve js/jquery.js
说明:
对于第 1 个地址 /articles/2004/,无法匹配第 1 条规则,可以匹配第 2 条规则,参数为 2004。
对于第 2 个地址 /articles/1985/09/aloha/,只能匹配第 4 条规则,参数依次为 1985、9(已经去掉前导零)和 aloha。
对于第 3 个地址 /articles/hello/,无法匹配任何一条规则。
对于第 4 个地址 /static/js/jquery.js,可以匹配最后一条规则,参数为 js/jquery.js。
数据规模和约定:
1 ≤ n ≤ 100,1 ≤ m ≤ 100。
所有输入行的长度不超过 100 个字符(不包含换行符)。
保证输入的规则都是合法的。
类型二:系统设计型(无上限)
11、【2】词梯(选做)(综合)
[问题描述]
词梯:给定两个长度相等的单词,一个作为起点,一个作为终点。每次只改变一个字母,最终,作为起点的单词可以转变为终点的单词。
例如:code->cade->cate->date->data
词梯不是唯一的,如work->play:
work fork form foam flam flay play
work pork perk peak pean plan play
work pork perk peak peat plat play
work pork perk pert peat plat play
work pork porn pirn pian plan play
work pork port pert peat plat play
work word wood pood plod ploy play
work worm form foam flam flay play
work worn porn pirn pian plan play
work wort bort boat blat plat play
work wort port pert peat plat play
work wort wert pert peat plat play
[基本要求]
(1)从https://github.com/dwyl/english-words中下载words.txt作为词汇表;
(2)给定两个长度相等的单词,一个作为起点,一个作为终点,寻找长度最短的词梯。
12、【2】连连看(选做)(图)
[问题描述]
建立一个10*20的矩形方格图,其中有10种不同的图案,每种图案个数为偶数,填满矩形方格图。
[基本要求]
(1)随机产生原始数据;
(2)输入两个位置,如果两者图案相同,并且可以用小于等于3条直线相连,即可消除该两个图案。
13、【2】基于角色的访问控制(选做)(综合)
[问题描述]
基于角色的访问控制(Role-based access control, RBAC),是一种较新且广为使用的资源访问控制机制,本题是对该控制机制的简化。简化版的RBAC有用户和用户组两个核心概念,通过将用户添加到用户组中,并将所需的访问权限赋予用户组,从而实现快速灵活地对大量用户进行权限管理。
[基本要求]
(1)要求从文本文件中输入;
(2)用户信息包含以下内容:用户编号、姓名。用户组信息包含以下内容:用户组编号、用户组称呼、用户组职责。特别注意,用户组可以拥有不止一种权限;
(3)按照姓名查询,输出用户信息(包括其本人所属的所有用户组);
(4)显示某特定用户组中的所有用户;
(5)对某用户组添加用户;
(6)对某用户组删除用户;
(7)修改某用户或用户组的信息;
(8)两个用户组之间允许通过继承的方式共享用户和职责;
[继承举例]
系统中有“组长”和“组员”两个用户组。其中“组长”继承了“组员”的所有职责。将某用户加入到“组长”用户组中,在输出该用户所拥有的职责时,需要输出“组长”和“组员”的所有职责。同时输出“组员”用户组的成员时,也需要输出该用户。
14、【2】Hash表应用(选做)(查找)
[问题描述]
设计散列表实现VIP客户发掘。对身份证号进行Hash, 通过对乘客某时间段内的乘机频率、里程数统计,发掘VIP客户。
[基本要求]
(1)设每个记录有下列数据项:身份证号码(虚构,位数和编码规则与真实一致即可)、姓名、航班号、航班日期、里程。
(2)从文件输入各记录,以身份证号码为关键字建立散列表。
(3)分别采用开放定址(自行选择和设计定址方案)和链地址两种方案解决冲突;显示发生冲突的次数、每次中解决冲突进行重定位的次数。
(4)记录条数至少在100条以上。
(5)从记录中实现乘客乘机频率、里程数统计,从而发掘VIP客户。
15、【2】迷宫问题(选做)(栈与队列)
[问题描述]
利用栈操作实现迷宫问题求解。
[基本要求]
(1)从文件中读取数据,生成模拟迷宫地图,不少于20行20列。
(2)给出任意入口和出口,显示输出迷宫路线。
16、【3】城市巡游赛(选做)(树和图)
[问题描述]
有N个城市正在举办厨艺大赛,这些城市的编号为1~N,城市之间有N-1条道路相连,并且城市之间两两可达。每个城市i都有一个里程值Ai:从城市X出发,要达到城市Y的必要条件是存在一条从X到Y的简单路径,且该路径恰好有Ax条边。
为了尽可能多地参加各地比赛,假设你可以从任意城市出发,且可以访问任意城市多次,求最多可以参加多少场比赛。
严格来说,给定一棵树,其中每个节点有权值Ai,如果我们可以从任意节点出发,并经过任意节点多次,你需要求出最多可以到达的城市数量,唯一条件是从i移动到j当且仅当i到j的简单路径上恰好有Ai条边。
[输入格式]
- 第一行包含N
- 接下来N-1行包含u,v表示一条边
- 接下来一行包含N个整数Ai
[输出格式]
输出最多可以访问多少不同的城市
[补充说明] - 1≤ui≤N,1≤vi≤N,且ui≠vi
- 保证输入是树
[样例1]
输入:
5
1 3
3 5
1 4
4 2
1 2 3 3 1
输出:
5
[样例2]
输入:
6
1 2
1 3
2 4
2 5
3 6
1 1 1 1 1 1
输出:
6
[样例3]
输入:
8
1 5
1 6
1 7
1 8
1 2
2 3
3 4
1 2 3 4 5 6 7 8
输出:
4
17、【3】家谱管理系统(选做)(树)
[问题描述]
实现具有下列功能的家谱管理系统。
[基本要求]
(1)输入文件以存放最初家谱中各成员的信息,成员的信息中均应包含以下内容:姓名、出生日期、婚否、地址、健在否、死亡日期(若其已死亡),也可附加其它信息、但不是必需的。
(2)实现数据的文件存储和读取。
(3)以图形方式显示家谱。
(4)显示第n 代所有人的信息。
(5)按照姓名查询,输出成员信息(包括其本人、父亲、孩子的信息)。
(6)按照出生日期查询成员名单。
(7)输入两人姓名,确定其关系。
(8)某成员添加孩子。
(9)删除某成员(若其还有后代,则一并删除)。
(10)修改某成员信息。
(11)要求建立至少40个成员的数据,以较为直观的方式显示结果,并提供文稿形式以便检查。
(12)界面要求:有合理的提示,每个功能可以设立菜单,根据提示,可以完成相关的功能要求。
(13)存储结构:根据系统功能要求自行设计,但是要求相关数据要存储在数据文件中。测试数据:要求使用1、全部合法数据;2、局部非法数据。进行程序测试,以保证程序的稳定。
18、【3】电子小字典(选做)(查找)
[问题描述]
利用键树结构,建立一个微型电子字典。
[基本要求]
实现生词的加入,单词的查找、删除,修改等操作。
19、【4】B-树应用(选做)(查找)
[问题描述]
设计并实现B-树的动态查找。
[基本要求]
(1) 从文件读取数据
(2)实现B-树的三种基本功能:查找、插入和删除。
(3)以可验证的方式输出结果
20、【4】平衡二叉树操作的演示(选做)(查找)
[问题描述]
利用平衡二叉树实现一个动态查找表。
[基本要求]
(1)从文件读取数据
(2)实现动态查找表的三种基本功能:查找、插入和删除。
(3)以可验证的方式输出结果
注:选做题中标注,为该题分值。如【3】,表示分值为3。
成绩评定细则:
- 正确性、功能的完备性和总程序量:程序是否可以运行,结果是否正确,是否实现要求的所有子功能,是否达到足够的程序代码 (50分)
程序代码>=3000 && 必做题 && 选做题分值12以上 (40分-50分)(优秀)
程序代码>=2500 && 必做题 && 选做题分值6以上 (30分-39分)(良好)
程序代码>=2000 && 必做题 && 选做题分值3以上 (20分-29分)(中等)
程序代码>=1500 && 必做题 (10分-19分)(及格) - 课程设计报告中的算法说明的清晰程度,课程设计报告中总结的深刻程度(20分)
- 独立完成情况( 30分)
总计:100分 以五分制(优、良、中、及格、不及格)对应。
4.根据完成情况,符合要求,提出申请,才可参评优秀。
加分项目:
1.健壮性:异常处理的情况
2.可读性:代码编写是否规范,是否便于阅读。如函数、变量命名,‘{ }’的缩进,关键位置适量注释等
3.功能的完善:除要求实现的功能外,完成了其它的功能,实现了功能的完善
4.界面的设计:良好交互的界面
编程语言:C、C++ 等
检查方式:
- 总体上检查程序的代码量,正确性,可读性,健壮性,功能的完备性,程序的结构是否合理;局部检查三个以上函数块
- 检查程序的运行情况
- 检查时间:每个学生的检查时间10分钟左右
时间安排包括:
1 上机时间安排
2 课程设计报告电子文档上交时间
3 课程设计检查时间
课程设计报告要求:
1.所有的课程设计报告,均要有封面,包括:数据结构课程设计、班级、学号、姓名、和指导教师;
2.目录;
3.对每一题,给出自己采用的数据结构;
4.给出算法设计思想;
5.给出实现的源程序,并在必要的代码处给出注释;
6.给出测试数据和结果;
7.给出算法的时间复杂度、另外可以提出算法的改进方法;
8.结束语:说明总体完成情况,每一题的程序代码行,总代码行,心得体会;
源码
https://pan.baidu.com/s/1pq1Nwwo0hlc_J84F93HM4A?pwd=1111
标签:02,输出,课程设计,选做,05,URL,用户组,输入,描述 From: https://www.cnblogs.com/codewriter/p/17093441.html