课程设计报告

发布 2022-10-01 03:36:28 阅读 2667

试验一约瑟夫问题

一、实验目的。

1、 熟悉c或vc++语言上机环境。

2、 熟悉单循环链表的一些基本操作和应用。

3、 加深单循环链表的理解,逐步培养解决实际问题的编程能力。

二、实验要求。

利用单向循环链表存储结构模拟此过程,按照出列的顺序输出个人的编号。

三,设计思路。

采用单循环链表,先构造一个有n个节点的单循环链表,再给出一个报数的上限值m(假设m>1),在链表的首节点开始从1计数,计到m是时,对应的节点从链表中删除,然后再被删除节点的下一个节点又从1开始计数,直到最后一个节点从链表中删除算法结束。

单循环链表中节点的结构如下:

typedef struct

int num;

int sipher;

struct node *next;

linklist;

该问题有两部分组成,分别由一下算法完成:

算法一:建立一个由头指针head指示的有n个节点的约瑟夫单循环链表creat.

算法二:寻找、输出和删除head所指的单循环链表的第m个节点select。该算法有以下具体步骤组成:

1、 在head中的第一个节点起循环计数找第m个节点;

2、 输出该节点的num值,把该节点的cipher(密码)值赋给m;

3、 删除该节点;

4、 转去1,知道所有节点被删除为止。

四、程序**#include<>

#include<>

#define size 100输入人数的上限 */

void main()

int person[size];

int i, j循环修正变量 */

int arraylen数组长度 */

int start, overnum开始位置各跨过位置 */

int delenum出列人所在数组中的下标 */

int name, total输入时,人的信息以及人的总数 */

printf( "请输入圆桌的总人数 "

scanf( "d", arraylen );

printf( "n" )

if( (arraylen > size ) arraylen < 0 )

printf( "请输入各个人的信息(整数): n" )

for( i = 0; i < arraylen; i++

printf( "你输入的数据的顺序为: " )

for( i = 0; i < arraylen - 1; i++

printf( "d ==person[i] )

printf( "d ", person[arraylen - 1] )

printf( "你打算从第几个人开始? 请输入开始号: "

scanf( "d", start );

printf( "n" )

start = start - 1;

printf( "请输入相邻两出列人之间的间隔: "

scanf( "d", overnum );

printf( "n" )

total = arraylen;

printf( "程序运行后,出列人的顺序为:" )

for( i = 0; i < total; i要打印total个人的情况,故做total次 */

printf( "n" )

五、运行结果

实验二分布计数排序算法的设计。

一、实验目的。

1熟悉c或vc++语言上机环境。

2熟悉分布计数排序算法的一些基本操作和应用。

3加深分布计数排序算法的理解,逐步培养解决实际问题的编程能力。

二、实验要求。

1)用c语言实现,要求运行时间尽可能少。

2)分析该算法的比较次数和使用的辅助空间数。

三,设计思路。

1 计数排序:(采用非递减排序)设有n个关键字不同的记录,对每个记录r[i],求出在其它n-1个记录中,小于该记录关键字的记录个数c,则c+1就是排序后该记录的位置。

2 分布计数排序:这是当关键字的取值范围比较小,并且重复的关键字较多时的一种排序方法。

3(1)计数排序分析:设在r[0...n-1]中有n个关键字不同的记录。

数组count[i]存放小于r[i]的记录个数。 对于0 ≤ j < i ≤ n-1 , 比较r[j].key 和r[i].

key, 若r[j].key < r[i].key, 则count[i] +1, 否则count[j] +1; 算法结束时, count[i] 就是r[i]应处的位置。

2)算法: ①清count] 把count[0]至count[n-1]都置0 。

②[对i进行循环] 对i = n-1,n-2,……1,执行第3步。

③[对j进行循环] 对j = i-1, i-2,……0,执行第4步。

④ [比较r[j].key和r[i].key] 若 r[j].key < r[i].key, 则count[i] +1, 否则count[j] +1。

⑤ [复制] 对i=0, …n-1, 把r[i]写到s[ count[i] ]中。

4(1)分布计数排序法分析:设关键字的取值范围u≤r[i]≤v,并且(v-u)很小。这些假定看起来十分苛刻,但事实上这一思想有不少应用。

例如,若把这个算法应用于关键字的头几位数字,而不是整个关键字,则这个文件被部分的排序,完成这项任务是相当简单的。

2)算法: ①清count] 把count[u]到count[v]清为0。

②.[求关键字的重复数] 对i=1,2,…,n, 执行: count[r[i]]+1。

③.[累加] (此时count[i]的值是关键字i的个数) 对i=u+1,u+2,……v,执行 count[i] =count[i] +count[i-1]。

输出](此时的count[i]是小于或等于i的关键字的个数,特别地count[v]=n)

对j=n,n-1,…,1, 执行: s[count[r[j]]]r[j]和count[r[j]]-1。

四算法的c语言描述如下:

1计数排序。

typedef struct rectype

keytype key;

datatype otherinfo;

rectype;

void countsort1(rectype r,int n)

{ int count[n];

for ( i =0; i<=n-1; i++)count[i] =0;

for ( i = n-1; i>=1; i--)

for ( j = i-1; j>=0; j--)

if r[j].key < r [i].key count[i] +

else count[j] +

for ( i =0; i<=n-1; i++)

s[count[i]]=r[i];

说明:由算法可以看出, 对于n个元素, 比较次数为: (n-1)+(n-2)+…1= n(n-1)/2, 另外,还需要2n个辅助单元, 当n很大时, 这不是一个有效的算法。

在上述讨论中, 我们假设关键字互不相同, 若允许存在相同关键字的记录时,该算法也能正确工作,并且是稳定的。若允许存在相同关键字的记录,且在第4步中,把“r[j].key < r [i].

key”改成“r[j].key <=r [i].key”,仍能正确工作,但是不稳定了。

2分布计数排序。

程序为了符合程序设计的习惯, 把count定义成从count[1]到count[v-u+1].

程序如下:void countsort2(int r,n,u,v)

int m=v-u+1;

for(i=1; i<=m; i置初值*/

count[i]=0;

for(i=1; i<=n; i求各键的重复次数*/

count[r[i]-u+1]++

for(i=2; i<=m; i累加*/

count[i]= count[i]+count[i-1];

for(j=n; j>=1; j输出*/

i=r[j]-u+1;

课程设计报告格式 课程设计

洛阳理工学院。课程设计说明书。课程名称。设计课题。专业。班级。学号。姓名。完成日期2014年12月26日。问题描述 小四宋体,行间距单倍行距,每段缩进两个字符。叙述一下设计的内容要求。基本要求 小四宋体,行间距单倍行距,每段缩进两个字符。叙述一下设计的基本要求。测试数据 小四宋体,行间距单倍行距,每...

课程设计总结,课程设计报告

课程设计总结,课程设计报告。3.尝试应用项目管理软件进行项目进程的规划管理 绘制甘特图,不作硬性要求 二 选题说明。人事管理是企业信息管理的重要部分,面对大量的人事工资信息,财务部门采用人力处理将浪费大量的时间 人力和物力,且数据的准确性低。因此,开发一个界面友好,易于操作的人事工资管理软件进行自动...

课程设计 课程设计报告格式

学校名。课程设计报告。课程名称 c语言程序设计 系别 专业班级 学号。姓名。课程题目 企业人事管理系统 完成日期 指导老师 年月日。附件。课程设计的内容。企业人事管理系统 本项目的目标是开发一个功能实用,操作简便,简单明了的人事管理系统。能够录入人事的基本资料,在操作上能够完成诸如添加 修改 删除 ...