【数据结构】-大二数据结构与算法课程设计实训报告

采花生问题

1.1 需求分析
1.1.1 题目概要
给一矩阵,按贪心思路最多能采多少花生并在规定时间内返回。
1.1.2 题目要求
给定一块花生田的大小和花生的分布,在限定时间内,小Q最多可以采到多少个花生?只有部分植株下面长有花生,假设这些植株下的花生个数各不相同。
1.1.3 输入/输出格式
(1)输入:输入数据存放在peanut.txt文件中。
第1行数字表示矩阵的行数(M),列数(N),所给定的单位时间(K)
第2行至第M+1行,数字表示的是每个花田下面花生数值(value)
(2)输出
第一行输出的是矩阵的行数(M),列数(N),所要求的单位时间(K)
接下来输出M行,每1行数字表示的是每个花田下面花生数值(value)
最后一行输出的是最多采到了的花生数目(num)
1.2 概要设计
1.2.1 数据结构
使用结构体数组来存储有花生的格子的地址和数值:

typedef struct Node
{
    int x;//列数
    int y;//行数
    int num;//花生数值
}Peanut;

1.2.2 算法描述
① 从文件的第一行读取行、列、单位时间的要求
② 从文件中第2行到最后一行读取数组的数字,如果不为0就存入P数组中
③ 设置qsort函数,排序数组,能够使得数组降序排序
④ 设置O结构体初始数值,s0记录两个数值之间的距离和采摘的单位时间,s1记录回去的时间
⑤ 从P数组第一个开始计算,如果s0+s1小于要求的单位时间,单位时间减少,O结构体变成可满足的序列
⑥ 循环往复,到s0+s1大于要求的单位时间,循环结束,输出采摘的最多的花生。
1.3 详细设计
1.3.1 函数功能
(1)int cmp(const void *a, const void *b);函数功能:cmp是qsort的回调函数,用于比较使用,使得qsort是降序排序。
(2)qsort(P, lenP, sizeof(Peanut), cmp);函数功能,使得输入的数组P,在指定长度(lenP)中,以降序的方式进行排序。

舞会配对问题

2.1 需求分析
2.1.1 题目概要
在化妆舞会上,男士们和女士们各自排成一队从不同的方向进入舞池。跳舞开始时,依次从男队和女队的队头上各出一人配成舞伴。若两队初始人数不相同,则较长的那一队中未配对者等待下一轮舞曲。
2.1.2 题目要求
(1)依次从男队和女队的队头上各出一人配成舞伴,显示前三轮配对的男士和女士。
(2)测试数据存放在txt文件中。
2.1.3 输入/输出格式
(1)输入:输入数据存放在dancerA.txt文件中。
第1行数字n表示有n个人参加舞会。
第2行至第n+1行,分别表示这n个人的姓名和性别,M表示男士,F表示女士。
(2)输出
第一行输出“第1轮舞伴是:”。
接下来输出N行,每1行输出对应的舞伴即女士和男士姓名,姓名都左对齐,女士和男士姓名中间空出若干空格。
依次输出第2轮和第3轮舞伴。
2.2 概要设计
2.2.1 数据结构
使用结构体数组来存放参加舞会人员的姓名和性别:

typedef struct
{  char name[20];  //存放姓名,假设每位人员的姓名长度不超过20个字符
char sex;      //sex字符变量存放性别,M表示男士,F表示女士
}Person;

使用到的数据结构队列CirQueue定义如下:

typedef struct
{  
int count;          /* 计数器,记录队中元素总数 */
Person dancer[N];
}CirQueue;

定义队列变量Fdancers,用来存放女士信息;队列变量Mdancers用来存放男士信息。
2.2.2 算法描述
① 初始化总队列cirQueue,从文本文件中读取数据到数组dancer中,读取不成功程序结束。
② 初始化男女队列,遍历cirQueue判断男女性别并且分别放入Mdancer、Fdancer队列中
③ 判断男女队列中的最短长度(length),,设置初始计数count进入循环舞伴匹配
④ 每一轮循环中,count数加一,男女队列分别使用count对自己长度进行取余得出每次跳舞的姓名。
⑤ 输出每一轮跳舞的姓名,当count%length为0的时候,一轮跳舞结束
⑥ 结束程序
2.3 详细设计
2.3.1 函数功能
(1)void inputdata(CirQueue *cQ)函数功能:从文本文件中读取数据到数组dancer中,读取不成功程序结束。
(2)void AddPerson(CirQueue *cQ,CirQueue *mQ,CirQueue *fQ)函数功能:把全部数据进行分组,分为男队列和女队列。
(3)void match(CirQueue mQ,CirQueue fQ,int times)函数功能:进行舞伴匹配,得到相应的结果并且输出。
(4)void DancePartners(CirQueue *Q,int times)函数功能:初始化男女数组,从dancer数组中读取舞会人员进行配对输出。

会议安排问题

3.1 需求分析
3.1.1 题目概要
某公司的会议日益增多,以至于全公司唯一的会议室不够用了。现在给出这段时期的会议时间表,要求适当删除一些会议,使得剩余的会议在时间上互不冲突,要求删除的会议最少。
3.1.2 题目要求
(1)输入公司会议的个数、开始时间和结束时间,适当删除一些会议,使得剩余的会议在时间上不冲突且删除的会议最少。
(2)测试数据存放在txt文件中。
3.1.3 输入/输出格式
(1)输入:输入数据存放在meetA.txt文件中。
第1行数字表示有number个会议。
第2行至第number+1行,分别表示这会议的起始时间和结束时间。
(2)输出
第一行输出“会议安排如下:”。
接下来输出answernumber行,每1行输出对应会议的起始时间和结束时间。
最后一行为取消会议个数。
3.2 概要设计
3.2.1 数据结构
使用结构体数组来存放参加舞会人员的姓名和性别:

typedef struct{
	int start;  //存放开始时间
	int end;      //结束时间
	int decide;     //是否安排上
}Time;

3.2.2 算法描述
① 设置data数组存放内容数据。从meetA.txt读取所需要的会议个数number,和各个会议的起始时间和结束时间,把读取的内容存放到data数组中。
② 使用快速排序算法qsort对data数组按照结束时间升序排序。
③ 设置answer数组存放可以进行的会议。遍历data数组,对每个数组进行初始化,使得data数组中的decide都为0。
④ 循环遍历data数组,对data数组中的数值进行比较,当前开始时间比前面的结束时间晚或者就算早但是前面的没有被安排,则设置当前下标的decide为1。
⑤ 循环内,判断当前下标的decide是否为1,为1的时候加入answer数组。
⑥ 循环结束后,输出answer数组,即为安排的会议。
3.3 详细设计
3.3.1 函数功能
(1)void inputdata(Time *data,int *number)函数功能:从文本文件中读取数据到数组data中,读取不成功程序结束。
(2)void printTest(Time *answer,int number,int answernumber)函数功能:打印出结果的会议内容和取消会议的个数。
(3)int Arrange(Time *data,Time *answer,int number)函数功能:实现求出安排的会议,返回能有安排的会议个数。
(4)void ArrangeMeeting(Time *data,Time *answer,int number)函数功能:求出会议的安排结果并且输出结果。

全排列问题

4.1 需求分析
4.1.1 题目概要
以字符串的形式输入要全排列的字符输出1,2,3,4四个数的所有排列方法及排列总数。拓展:输出n(n<=10)个不同的字符的所有排列方法及排列总数。
4.1.2 题目要求
(1)输入要全排列的字符串。
(2)字符要求不相同且字符串长度小于10。
4.1.3 输入/输出格式
(1)输入:
输入要全排列的字符串。
(2)输出
输出全排列的字符串,以六个字符串为一行排列出来
最后一行是全排列的个数。
4.2 概要设计
4.2.1 数据结构
char string[]
4.2.2 算法描述
① 输入字符串,设置total统计方案数
② 定义solve函数,left是排列到第几位的坐标,right是数组的长度。
③ solve先进行left与right判断,如果相同则输出全排列的一种排列方式。
④ solve再进行for循环,交换string[i] 和 string[left] 的位置。
⑤ 在for循环中调用solve函数,但left往后移动一位。
⑥ 将一个有序序列全排列后,恢复原状,防止出现重复的结果。
⑦ 输出函数结果,结束程序
4.3 详细设计
4.3.1 函数功能
(1)solve(char string[],int left,int right,int *total)函数功能:递归函数,能够实现分治求全排列数组。
(2)void swap(char *i,char *j)函数功能:交换char类型的i j字符串的位置

背包装载问题

5.1 需求分析
5.1.1 题目概要
两只背包载重量分别为c1和c2,现有n本书要装入包中,每本书的重量用wi表示,并且满足∑wic1+c2,试找出合理的方法,将这n本书装入背包中。。
5.1.2 题目要求
(1)输入要全排列的字符串。
(2)字符要求不相同且字符串长度小于10。
(3)采用回溯法解决问题
5.1.3 输入/输出格式
(1)输入:
第一行输入bag0,bag1表示两个背包的装载量
第二行输入number表示书的重量
第三行输入book[i]表示number本书分别的重量。
(2)输出
第一行先输出book,后面为number本书的重量
第二行输入c1,后面为是否装入bag0,装入输出1,未装入输出0.
第二行输入c2,后面为是否装入bag1,装入输出1,未装入输出0.
若无解,输出Unsolvable
5.2 概要设计
5.2.1 数据结构

typedef struct{
    int c1;//记录背包一的实际装载容量
    int c1num;//记录背包一中书本的实际数量
    int flag[N];
}answer;

5.2.2 算法描述
① 输入背包容量bag0,bag1,输入书的数量和书的重量。
② 定义remain记录未装入书包的重量,初始化answer结构体用于放置结果。
③ 假设第i本书放入背包一中,remain减去此书的重量,若此书超载,进入④,否则更新背包一的装载重量,并进入递归③放入下一本书。
④ 如果剩余数量和背包一装载重量大于当前结构体的背包一装载重量,若超载则结束本轮递归,否则进入递归放入下一本书,进入③,remain加回第i本书的重量。
⑤ 递归过程中若放完了全部书本表示已经成功,否则不成功。
⑥ 把递归的结果传送给结构体answer,对比递归结果的背包一装入情况,在背包一装的最满的情况下,寻找到背包一书装的最少的情况。
⑦输出放书结果,结束程序。
5.3 详细设计
5.3.1 函数功能
(1)void solve(int cur,int c1num)函数功能:递归函数,记录放入书本的重量和背包一中放入书本的数量。
(2)void bagProblem()函数功能:去找到合理的方法来放置。若有合理的方法则输出合理的方法,没有则输出Unsolvable。

  • 0
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值