约瑟夫环

1、  课程设计的目的

(1) 熟练编写程序,解决实际问题;

(2) 了解并掌握数据结构与算法的设计方法,具备初步的独立分析和设计能力;

(3) 初步掌握软件开发过程的问题分析、系统设计、程序编码、测试等基本方法和技能;

(4) 提高综合运用所学的理论知识和方法独立分析和解决问题的能力;

2、  需求分析

*问题描述:编号是1,2,……,n的n个人按照顺时针方向围坐一圈,每个人只有一个密码(正整数)。一开始任选一个正整数作为报数上限值m,从第一个仍开始顺时针方向自1开始顺序报数,报到m时停止报数。报m的人出列,将他的密码作为新的m值,从他在顺时针方向的下一个人开始重新从1报数,如此下去,直到所有人全部出列为止。设计一个程序来求出出列顺序。

*要求:利用不带表头结点的单向循环链表存储结构模拟此过程,按照出列的顺序输出各个人的编号。

*测试数据

m的初值为20,n=7 ,7个人的密码依次为3,1,7,2,4,7,4,

*输入数据:建立输入处理输入数据,输入m的初值,n ,输入每个人的密码,建立单循环链表。

*输出形式:建立一个输出函数,将正确的输出序列

3、课程设计报告内容

   概要设计

(1)在分析题目要求的基础上,我首先设计了一个结构体,定义如下

struct JosephNode{

int num;

int key;

JosephNode*next; 

};

(2)基本操作:

      JosephNode*Creat_Node(int numbers);

      voidDelist(JosephNode *tail,int m);

2、本程序分为2个模块

3、    调试分析

4、    用户手册

1. 本程序的运行环境为DOS操作系统,执行文件为约瑟夫.exe。

2. 进入演示程序后,即显示文本方式的用户界面。

3.输入初始密码值和总人数后相继输入每个人所持密码值,即可得到输出序列。

 

4、小结

一、这次课程设计的心得体会通过实践我的收获如下:

 

1、巩固和加深了对数据结构的理解,提高综合运用本课程所学知识的能力。

2、培养了我选用参考书,查阅手册及文献资料的能力。培养独立思考,深入研究,分析问题、解决问题的能力。

3、通过实际编译系统的分析设计、编程调试,掌握应用软件的分析方法和工程设计方法。

4、通过课程设计,培养了我严肃认真的工作作风,逐步建立正确的生产观念、经济观念和全局观念。

二、根据我在实习中遇到得问题,我将在以后的学习过程中注意以下几点:

   1、认真上好专业实验课,多在实践中锻炼自己。

2、写程序的过程中要考虑周到,严密。

3、在做设计的时候要有信心,有耐心,切勿浮躁。

4、认真的学习课本知识,掌握课本中的知识点,并在此基础上学会灵活运用。

5、在课余时间里多写程序,熟练掌握在调试程序的过程中所遇到的常见错误,以便能节省调试程序的时间。            

5、程序清单

/*约瑟夫环*/

#include<iostream>
using namespace std;
 
struct JosephNode{
       int num;
       int key;
       JosephNode *next; 
};
 
JosephNode *Creat_Node(int numbers)//创建约瑟夫环
{
       int i,KEY;
       JosephNode*head,*tail,*p,*q;
       head=tail=NULL;
       for(i=1;i<=numbers;i++)
       {
              p=new JosephNode;
              p->num=i;
              cout<<"请输入第"<<i<<"个人的密码: ";
              cin>>KEY;
              p->key=KEY;
              if(head==NULL)
              {
                     head=p;
                     q=p;
              }
              else
              {
                     q->next=p;
                     q=p;
              }
       }
       p->next=head;
       tail=p;
       return tail;
}
 
void Delist(JosephNode *tail,int m)//出列并输出约瑟夫数
{
       JosephNode *p,*q;
       int i;
       p=NULL;
       cout<<"输出顺序为:" ;
       while(tail->next!=tail)
       {
              p=tail->next;
              for(i=1;i<m;i++)
              {
                     p=p->next;
                     tail=tail->next;             
              }
              cout<<(tail->next)->num<<"";
              m=(tail->next)->key;
              q=p;
              tail->next=p->next;
              p=p->next;
              delete q;
       }
       cout<<tail->num<<endl;
       delete p;
}
 
int main()
{
       JosephNode *tail;
       int m,numbers;
       cout<<"--------约瑟夫环----------"<<endl;
       cout<<"|请输入初始密码值和总人数|"<<endl;
       cout<<"--------------------------"<<endl;
       cout<<endl;
       cin>>m>>numbers;
       tail=Creat_Node(numbers);
       Delist(tail,m);
       return 0;
}


6、参考文献

[1] 严蔚敏,吴伟民 编著. 数据结构(C语言版)——北京: 清华大学出版社,2007.

[2] 严蔚敏,吴伟民 米 宁 编著. 数据结构题集(C语言版)——北京: 清华大学出版社,2007.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值