程序设计基础实训题目.docx
《程序设计基础实训题目.docx》由会员分享,可在线阅读,更多相关《程序设计基础实训题目.docx(21页珍藏版)》请在冰豆网上搜索。
程序设计基础实训题目
程序设计基础实训手册
西安电子科技大学软件学院程序设计课程组
2010年9月
前言
1.程序设计基础实训的教学目的和要求
程序设计基础实践是完成C程序设计和数据结构课程的理论和实验后,需要进行的一个程序设计实践训练。
目的是巩固和提高同学们的程序设计能力。
要求同学们认真完成实验要求,并提交实验报告。
目前的实验内容分为单元实验和综合实验两部分,具体要求如下:
(1)单元实验要求每个学生独立完成。
单元实验共需提交4份实验报告,其中单元实验一和二中选择一题书写并提交报告,实验三~六中选择三题书写并提交实验报告,报告模板见附录I。
(2)综合实验分组实施。
从综合实验题目选择一题,由小组成员分工合作完成问题的分析、设计、编程调试及实验报告的书写,报告模板见附录II。
2.实验前的准备工作
回顾并复习实验中涉及的相关内容,上机实验前完成程序的设计工作,准备好调试和运行时所需的测试数据,包括各类输入数据及正确的输出数据。
3.关于实验报告的说明
(1)按照附录中的模板书写实验报告;
(2)报告主体只有程序清单的实验报告以不及格报告评分并登记成绩;
(3)认定为内容雷同的实验报告(包括内容完全相同、个别句子作少量修改等情况),以不及格报告评分并登记成绩。
程序设计基础实训单元实验
单元实验一
实验目的:
熟悉C语言的文件操作
【问题描述】
需要长期保存的数据可以文件方式存储在外存上,C语言提供了一组文件操作函数:
fopen、fclose、fgets、fputs、fgetc、fputc、fscanf、fprintf、fread、fwrite、rewind、fseek、feof等,应了解这些函数的用法并加以应用。
【基本要求】
1.用随机函数产生1000个整数,保存在文件(intfile.dat)中,然后将文件中的数据读取出来显示。
(1)用fprintf函数写入数据,要注意整数之间需要有分隔符号,所有数据写入后关闭文件;(%d\t)
(2)重新打开文件,用fscanf函数逐个读取并显示数据;
(3)用fseek函数对文件指针进行定位,仅读取需要的数据。
例如,分别将文件指针定位到第5个整数、第10个整数,读取这两个整数并显示;分别将文件指针定位到倒数第5个整数、倒数第10个整数,读取这两个整数并显示。
2.建立一个由5名学生信息组成的文件(studinfo.dat),其中,每个学生都有学号、姓名、性别和三门课程的成绩。
(1)用结构体类型描述学生的基本信息,其中:
学号和姓名用字符串表示,其长度定义参照本校的情况,课程名自行定义,成绩采用百分制;
(2)学生信息由键盘输入,先存入结构体变量;
(3)用fwrite函数将结构体变量的值写入文件studinfo.dat;
(4)用fread函数从文件studinfo.dat中读取数据并按一定格式显示在屏幕上(例如,每行显示一个学生信息,各项信息之间要有一定的间隔,所有学生的所有信息对齐显示等)
【测试数据】
用随机函数或自行输入数据进行测试。
单元实验二
实验目的:
掌握常用的排序算法
【问题描述】
简单排序算法主要包括冒泡排序、简单选择排序和直接插入排序,它们都是时间复杂度为
的排序方法,需要熟练掌握。
快速排序算法是由C.A.R.Hoare在1961年发明的一种内排序算法。
一般来说,快速排序算法要显著的快于其他的
算法,其最坏情况发生的概率也可以通过改进设计(三者取中选取枢轴元素、分区较小时改用直接插入排序等)尽量减小。
堆排序算法(HeapSort)是由斯坦福大学计算机科学系教授罗伯特·弗洛伊德(RobertW.Floyd,1991年计算机先驱奖获得者)和威廉姆斯(J.Williams)在1964年共同发明。
堆排序是一树形选择排序。
其特点是:
在排序过程中,将R[l..n]看成是一棵完全二叉树的顺序存储结构,利用完全二叉树中双亲结点和孩子结点之间的内在关系(参见二叉树的顺序存储结构),在当前无序区中选择关键字最大(或最小)的记录。
堆排序的时间,主要由建立初始]堆和反复重建堆这两部分的时间开销构成,其最坏时间复杂度为
,其平均性能较接近于最坏性能。
由于建初始堆所需的比较次数较多,所以堆排序不适宜于记录数较少的文件。
归并排序算法是建立在归并操作上的一种有效的排序算法。
该算法是采用分治法(DivideandConquer)的一个非常典型的应用。
归并(Merge)排序法是将两个(或两个以上)有序表合并成一个新的有序表,即把待排序序列分为若干个子序列,每个子序列是有序的。
然后再把有序子序列合并为整体有序序列。
将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。
若将两个有序表合并成一个有序表,称为2-路归并。
【基本要求】
1.用随机函数产生1000个整数,保存在文件(intfile.dat)中,然后将文件的前300个整数读入数组A,接下来的400个整数读入数组B,最后的300个整数读入数组C,用简单排序算法中的冒泡法对数组A、简单选择排序方法对数组B和直接插入排序方法对数组C中的元素分别排序并输出排序结果到文件;
2.将问题1中所有1000个整数读入数组A,用快速排序算法、堆排序算法和归并排序算法对数组A中的元素排序并输出排序结果到文件;
【选做要求】
1.产生两个已经排序的整数数据文件,将两个文件的数据归并成一个有序序列存入文件保存。
2.选用任意一种排序算法,对单元实验一所产生的学生信息文件studinfo.dat,读取其中的所有学生信息:
3.
(1)按学号排序输出学生信息;
4.
(2)按姓名排序输出学生信息;
5.(3)按三门课程的平均分从高到低排序输出学生信息(除了学生基本信息外,还要输出每个学生的平均成绩),最后再加一行输出信息:
每门课程的平均成绩。
单元实验三
实验目的:
掌握栈和队列的基本结构及应用
一、后缀表达式求值
【问题描述】
表达式可以采用后缀式表示。
例如,表达式“46+5*(120-37)”的后缀式为“46512037-*+”。
计算后缀表达式时,从左至右扫描:
若遇到运算对象,则压入栈中;遇到运算符,则从栈中弹出相关运算对象进行计算,并将运算结果压入栈中,重复以上过程,直到后缀表达式扫描结束。
例如,后缀表达式“46512037-*+”的计算过程为:
a.依次将46、5、120、37压入栈中;
b.遇到“-”,取出37、120,计算120–37,得83,将其压入栈中;
c.遇到“*”,取出83、5,计算5*83,得415,将其压入栈中;
d.遇到“+”,取出415、46,计算46+415,得461,将其压入栈中;
e.表达式结束,则计算过程完成。
【基本要求】
写一个程序,利用栈计算一个后缀表达式的值。
【测试数据】
后缀表达式以字符串方式读入,运算对象(整数)和运算符号间均以空格字符间隔。
二、离散事件模拟
【问题描述】
假设某银行有三个窗口对外接待客户,从早晨银行开门起就不断有客户进入银行。
由于每个窗口在每个时刻只能接待一位客户,因此在客户比较多的时候,需要排队。
对于刚进入银行的客户,如果某个窗口的业务员正空闲,则可上前办理业务;反之,若三个窗口前均有客户,他便会排在人数最少的队伍后面。
试设计程序模拟客户在银行的这种活动并计算一天中客户在银行的平均逗留时间。
【基本要求】
用链表实现队列。
【实现提示】
为了计算所有客户在银行的平均逗留时间,需要掌握每个客户到达银行和离开银行的时间,后者减去前者即为每个客户在银行的逗留时间。
用当天的客户数除以所有客户的逗留时间之和便是所求的平均逗留时间。
称客户到达银行和离开银行这两个时刻发生的事情为“事件”,则整个模拟程序将按照事件发生的先后顺序进行处理。
程序中要处理的事件有两类:
一类是客户到达事件,另一类是客户离开事件。
前一类事件发生的时刻随客户到来自然形成;后一类事件发生的时刻则由客户办理事务所需时间和等待时间而定。
由于程序按事件发生时刻的先后顺序进行处理,则事件表应该是有序表,其主要操作是插入和删除事件。
模拟程序中需要有表示客户排队的队列,由于前面假设银行有3个客户窗口,因此程序中需要3个队列,队列中存储有关客户的主要信息:
客户到达的时刻和客户办理业务所需的时间。
每个队列的队头客户即为正在办理业务的客户,该客户办完业务离开队列时就是即将发生的客户离开的事件的时刻,也就是说,每个队头客户都存在一个将要驱动的客户离开事件。
因此,在任何时刻即将发生的事件只有下面4种可能:
一是新的客户到达,二是1号窗口客户离开,三是2号窗口客户离开,四是3号窗口客户离开。
客户到达事件的处理:
在实际的银行中,客户到达的时刻和办理业务所需的时间都是随机的,因此在模拟程序中用随机数来代替。
不失一般性,假设第一个客户到达的时刻为0,即为模拟程序处理的第一个事件,之后每个客户到达的时刻在前一客户到达时设定。
因此,在客户到达事件发生时需产生两个随机数;一为该时刻达到的客户办理业务所需要的时间durtime;二为下一客户将要到达的时间间隔interval,假设当前事件的发生事件为occurTime,则下一个客户到达事件发生的时刻为occurTime+interval。
由此应产生一个新的客户到达事件表,刚到达的客户则应插入到长度最短的队列中;若该队列在插入前为空,则还应产生一个客户离开事件的事件表。
客户离开事件的处理:
首先计算要离开的客户在银行的逗留时间,然后从队列中删除该客户,同时查看队列是否为空,若不空则设定一个新的客户离开事件。
单元实验四
实验目的:
掌握图的基本存储结构及图的遍历运算
一、深度优先遍历图
【问题描述】
邻接矩阵和邻接表是图(网)的两种基本存储结构。
深度优先遍历图是图结构上的一种基本运算,其主要操作为查找顶点的邻接顶点。
对于n个顶点、e条边的图,若图采用邻接矩阵存储,则遍历运算的时间复杂度为
;若采用邻接表存储,则遍历运算的时间复杂度为
。
广度优先遍历图是图结构上的一种基本运算,与深度优先遍历图相同,其主要操作为查找顶点的邻接顶点。
【基本要求】
从键盘输入图的信息,包括顶点数、边数以及各条边。
1.用邻接矩阵存储图,输出深度优先遍历的顶点序列;
2.用邻接表存储图,输出深度优先遍历的顶点序列。
【选作要求】
文件存储图的信息。
1.用邻接矩阵存储图,输出广度优先遍历的顶点序列;
2.用邻接表存储图,输出广度优先遍历的顶点序列。
【测试数据】
可采用多种方式输入数据。
1.输入数据的第一行有两个整数,分别表示顶点数n和边数e,接下来n行、每行n个整数表示图的邻接矩阵。
例1
712
0000000
1000000
1100000
0110100
0100000
0011000
0001110
2.输入数据的第一行有两个整数,分别表示顶点数n和边数e,接下来分e行、每行3个整数的方式给出图中的边的信息,每行上的三个整数分别表示一条边关联的第一个顶点(起始顶点)、第二个顶点(终止顶点)、边上的权值。
例2
69
0120
0216
1413
1215
1528
5412
4312
2314
5312
单元实验五
实验目的:
掌握图的最小生成树求解方法
【问题描述】
对于给定的连通图,将生成树各边的权值总和称为生成树的权,把权值最小的生成树称为最小生成树。
求解最小生成树有许多实际的应用。
普里姆算法构造最小生成树的过程是以一个顶点集合U={u0}作初态,不断寻找与U中顶点相邻且代价最小的边的另一个顶点,扩充U集合直至U=V时为止。
克鲁斯卡尔算法求最小生成树的思想为:
假设连通网N=(V,E),令最小生成树的初始状态为只有n个顶点而无边的非连通图T=(V,{}),图中每个顶点自成一个连通分量。
在E中选择代价最小的边,若该边依附的顶点落在T中不同的连通分量上,则将此边加入到T中,否则舍去此边而选择下一条代价最小的边。
依次类推,直至T中所有顶点都在同一连通分量上为止。
【基本要求】
从键盘输入(或从文件读入)图的信息,用普里姆算法求解给定无向连通图的最小生成树,最后输出最小生成树中的权值和所有的边,图的存储结构自行设定。
【测试数据】
输入数据的形式可自行设计。
图例如下。
例1例2
输出结果如下所示:
weight:
15
(v1,v3)(v3,v6)(v6,v4)(v3,v2)(v2,v5)
【选作要求】
从键盘输入(或从文件读入)图的信息,用克鲁斯卡尔算法求解给定无向连通图的最小生成树,最后输出最小生成树中的权值和所有的边。
单元实验六
实验目的:
掌握图的最短路径求解方法
【问题描述】
所谓单源点最短路径是指:
给定带权有向图G和源点v0,求从v0到G中其余各顶点的最短路径。
迪杰斯特拉(Dijkstra)提出了按路径长度递增的次序产生最短路径的算法。
【基本要求】
从键盘输入(或从文件读入)图的信息,用迪杰斯特拉算法求解给定图、指定源点到其余各顶点的最短路径,以顶点序列方式输出各条最短路径信息,图的存储结构自行设定。
【测试数据】
输入数据的形式可自行设计。
图例如下:
输出结果如下所示:
v0v5
v0v3
v0v3v4
v0v3v4v2
程序设计基础实训综合实验
题目一图书管理信息系统
【问题描述】
图书管理一般包括:
图书采编、图书编目、图书查询与图书流通(借、还书)等。
要求设计一个图书管理信息系统,用计算机实现上述系统功能。
【基本要求】
1.能够实现图书查询功能:
支持按照书号、书名、作者及出版社进行图书查询;
2.能够实现图书流通功能:
支持在馆图书的借出和借出图书的归还操作。
【选做要求】
实现图书管理信息系统中除基本要求外的任意其他功能;
【实现提示】
建立一个图书信息数据库,由下面几个文件构成。
输入若干种书的记录,建立一个以书号为关键字的索引文件,如表1所示;在主数据库文件中建立以书名、作者以及出版社作为关键字的索引以及对应的索引链头文件,如表2、3、4所示。
表1.图书主索引文件内容示例
记录号
书号
书名
指针1
作者
指针2
出版社
指针3
分类
藏书量
借出数
1
1021
数据库
0
李小云
0
人民邮电
0
021
8
0
2
1041
数据结构
0
刘晓阳
0
中国科学
0
013
6
0
3
1106
操作系统
0
许海平
0
人民邮电
1
024
7
0
4
1108
数据结构
2
孙华英
0
清华大学
0
013
5
0
5
1203
程序设计
0
李小云
1
中国科学
2
035
6
0
6
2105
数据库
1
孙海平
3
清华大学
4
021
6
0
7
1012
数据结构
4
李小云
5
人民邮电
3
013
5
0
8
0109
程序设计
5
刘晓阳
2
清华大学
6
035
7
0
表2.书名索引链头文件
书名
链头地址
长度
数据库
6
2
数据结构
7
3
操作系统
3
1
程序设计
8
2
表3.作者索引链头文件
作者
链头地址
长度
李小云
7
3
刘晓阳
8
2
许海平
6
2
孙华英
4
1
表4.出版社索引链头文件
出版社
链头指针
长度
人民邮电
7
3
中国科学
5
2
清华大学
8
3
题目二简单文本编辑器
【问题描述】
参照TurboC编辑器或Windows的记事本等文本编辑器,使用串的技术设计实现一个功能简单的文本编辑器。
【基本要求】
1.具备字符录入、删除、光标移动等基本功能;
2.能够保存和打开编辑的文本文件;
【选做要求】
1.支持字符串查找功能;
2.支持“undo”功能;
【实现提示】
实现对串的基本操作(插入、删除、查找)函数,并在此基础上,建立以串为结点单元的单链表,屏幕的每行对应单链表的每个串结点,通过光标的上、下、左、右、翻页移动,进行链表的结点的定位,实现一个简单文本编辑器的基本功能。
存储结构使用链表和串,分别用几个子函数实现相应的功能。
输入数据的形式和范围:
可以输入大写、小写的英文字母、任何数字及标点符号。
题目三五子棋游戏
【问题描述】
五子棋是起源于中国古代的传统黑白棋种之一,五子棋专用棋盘为十五路(15*15),盘面上横竖各15条、平行线、纵横、线路为黑色,构成225个交叉点。
国际规则为:
(1)对局人数:
2人。
一人持黑子,一人持白子。
(2)对局方式:
2人轮流一子一子的将棋子置於棋盘的点上。
先着者持黑,后着者持白。
(3)胜利条件:
先下出连五者则为胜利。
试用相应的数据结构描述五子棋游戏并编程实现。
【基本要求】
程序运行时,可以选择电脑和人对弈或者人人对弈,可设定先下者,通过一些简单的输入进行对弈。
在屏幕上绘制出横纵15*15的白线以表示棋盘,并显示横纵坐标值。
以○表示白棋子,以⊕表示黑棋子。
玩家通过光标的上、下、左、右移动来选择棋子放置的位置,按回车键确认位置。
系统确保玩家只能把棋子放在没有棋子的空闲点上,同时判断是否连五及胜出。
人-人对弈时,要明确地提示当前是该置白子还是黑子。
该程序的基本要求为上面所述,如有其他问题,自行规定,将其设计到程序中,并在报告中声明。
【实现提示】
以矩阵作五子棋的存储结构,以0,1,2分别表示某个具体的横纵坐标点上为:
空闲、白棋子或者黑棋子。
根据每一次下子设计判断胜负的算法。
在人机对弈中,根据当前的下子情况,设计算法计算所有可以下子点的价值,电脑选则最有价值的点下子。
【选作要求】
(1)为程序提供单步悔棋等功能;
(2)如果条件允许,可以为程序增加更丰富的界面,但是不要因为界面,而延误了程序基本的功能实现。
题目四全国交通咨询模拟
【问题描述】
出于不同目的的旅客对交通工具有不同的要求。
例如,因公出差的旅客希望在旅途中的时间尽可能短,出门旅游的游客则期望旅费尽可能的少,而老年旅客则要求中转次数最少。
编制一个全国城市间的交通咨询程序,为旅客提供最优决策的交通咨询。
【基本要求】
1.提供对城市信息进行编辑(如:
添加功删除)的功能。
2.城市之间有两面种交通工具:
火车和飞机。
提供对列车时间表和飞机航班进行编辑(增设或删除)的功能。
3.提供两种最优决策:
最快到达或最省钱到达。
全程只考虑一种交通工具。
4.旅途中耗费的总时间应该包括中转站的等候时间。
5.咨询以用户和计算机的对话方式进行。
由用户输入起始站、终点站、最优决策原则和交通工具,输出信息:
最快需要多长时间才能到达或者最少需要多少旅费才能到达,并详细说明依次于何时坐哪一趟列车哪一次班机到何地。
6.提供对全国城市交通图和列车时刻表及飞机航班表的编辑(键盘输入)。
飞机航班表的信息包括:
起始站台票出发时间、终点站的到达时间和票价;列车时刻表则根据交通图给出各个路段的详细信息。
7.学生可以上网查找相关的算法,但是严禁不加思考和修改,直接拷贝使用,最后的文档中必须包含对本程序使用的核心数据结构的评价(优缺点等),若有,应包含改进的地方。
【实现提示】
以邻接表作交通图的存储结构,表示边的结点内除了含有邻接点的信息外,还应包括交通工具、路程中消耗的时间和花费以及出发和到达的时间等多项属性。
【选作要求】
1.对全国城市交通图和列车时刻表及飞机航班表的编辑,使用文件形式输入;
2.可以为旅客提供两种以上的最优决策选择;
3.可以为程序增加简单的界面,但是不要因为界面,而延误了程序基本的功能实现。
题目五订票系统
【问题描述】
航空客运订票的业务活动包括:
查询航线、客票预定和办理退票等。
每条航线所涉及的信息有:
起点站名、中转站名、终点站名、航班号、起降时间、飞机号、飞行周日(星期几)、票价、票价折扣、乘员定额、余票量、已订票的客户名单(包括姓名、证件类型、证件号码、订票数量、航班情况、舱位等级1,2或3,订单要有编号)以及等候替补的客户名单(包括姓名、所需票量)。
试设计并实现一个航空客运订票系统。
【基本要求】
1.航班信息修改功能:
可以录入,修改航班情况(数据可以存储在一个数据文件中,数据结构、具体数据自定)
2.查询功能:
对飞机航班信息进行排序和查询,可按航班的航班号、起点站、到达站、起飞时间以及到达时间等信息查询某个航线的情况。
(可以输入一个或多个信息进行查询。
当客户不清楚航班的信息情况时,能通过输入起点站和终点站,输出费用最小的航线。
(若无直达航线,可输出中转航线。
若有直达航线,但费用并不是最小,则同时输出费用最小的直达航线(在直达航线中费用最小的航线)和费用最小的中转航线(在所有的航线中费用最小的航线))
3.订票功能:
可以订票,如果该航班已经无票,可以提供相关可选择航班。
4.退票功能:
在航班开始前可退票,退票后修改相关数据文件。
【实现提示】
1.航班所涉及的城市在包含4个直辖市,五个自治区首府,两个特别行政区和23个省会城市,航线设计不少于50条,其中一半以上的航线需要包含中转站。
2.可采用基数排序方法对一组具有结构特征的飞机航班号进行排序,利用二分查找的方法对排好序的航班记录按照航班号实现快速查找,而其他次关键字的查找则采用最简单的顺序查找方法进行。
3.订票情况可以存在一个数据文件中,结构自行设定。
相关可选择航班应包括进行中转的航班,比如输入西安-杭州,相关可选择航班包括西安-重庆-杭州。
【选作要求】
有人退票后若有等候替补的客户名单,则要及时通知这些客户并修改已订票客户名单。
可自行考虑添加系统的个性化功能。
题目六年级成绩管理系统
【问题描述】
在年级成绩管理系统中,希望处理各班信息及每个学生的学习情况信息,其中班级信息包括班号和名称,学生学习情况信息包括学号,姓名,班号等,及已学课程的课程号及成绩,并能使管理人员通过操作界面完成对班级,学生信息的录入及对数据的查找,浏览。
试设计一个年级学生管理系统。
【基本要求】
1.按照教师,学生,管理员三种角色设计系统功能,提供用户曹组界面。
一个年级分为4个班,每个班50名学生。
2.班级管理功能(管理员):
班级的添加,修改,删除班级功能。
3.学生管理功能(管理员):
登记,修改,删除某班某个学生的基本信息,可以一次导入某班全部学生信息。
4.成绩管理功能(教师):
登记,修改某个学生某门课的成绩,可以一次导入某班全体学生成绩。
5.成绩查询功能(全部用户):
每个学生可以查询自己所有课程的成绩。
教师可以查询所带班级的成绩,可以对成绩进行排序和统计。
管理员可以查询全年级所有学生所有课程的成绩并进行排序和统计,所有人都可以浏览各个班级的公共信息,如:
教室位置,人数等。
【实现提示】
1.登记各班的学生基本情况(学号,姓名,性别,年龄,电话等)
2.插入某班某个学生的基本情况
3.修改各班学生基本情况
4.删除某班某个学生或某班所有学生基本情况
5.登记各班所有学生各门课的成绩
6.