欢迎来到天天文库
浏览记录
ID:42672177
大小:30.01 KB
页数:7页
时间:2019-09-19
《阮籍技术基础课设》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、实验一:约瑟夫斯问题实验报告一、问题描述约瑟夫斯(Josephus)问题的一种描述是:编号为1,2,…,n的n个人按顺时针方向围坐一圈,每人持有一个密码(正整数)。一开始任选一个正整数作为报数上限值m,从第一个人开始按顺时针方向自1开始报数,报到m时停止报数。报m的人出列,将他的密码作为新的m值,从他在顺时针方向下一个人开始重新从1报数,如此下去,直至所有的人全部出列为止。试设计一个程序,按出列顺序印出各人编号。2)基本要求利用单向循环链表存储结构模拟此过程,按照出列的顺序印出各人的编号。3)测试数据m的初值为20;n=7,7个人的密码依次为:3,1
2、,7,2,4,8,4。m初值为6(正确的出列顺序应为6,1,4,7,2,3,5)。二、需求分析1.该程序所能实现的功能:将n个数字按照某一特定序列输出,直至全部输出为止。2.输入的形式及输入值范围:依次输入人数n、每个人的密码及报数上限m值。3.输出的形式:按照报数上限m及每个人的密码依次输出每个人的编号。4.测试数据要求:m的初值为20;n=7,7个人的密码依次为:3,1,7,2,4,8,4。m初值为6(正确的出列顺序应为6,1,4,7,2,3,5)。三、概要设计1.主程序流程获取每个人的密码,选定m的初值,调用函数,按照特定要求完成输出操作。2.
3、核心模块的算法伪码主程序:voidmain(void){intm;people*s;s=GetData();cout<<"请输入m的初值:"<>m;DealData(s,m);}预编译代码:#include四、详细设计1.实现每个操作的伪码,重点语句加注释(1)建立“人”的结构体structpeople{intdata;intnum;people*next;};(2)获取每个人的相关数据people*GetData(){intn;people*p1,*p2,*head;head=NULL;cout<<"请输
4、入人数:";cin>>n;cout<<"请依次输入每个人的密码:"<>p1->data;p1->num=i+1;if(head==NULL){head=p2=p1;}else{p2->next=p1;p2=p1;//中间结点//建立首结点}}if(head!=NULL)p2->next=head;return(head);}2.函数调用关系图//循环链表Main()voidDealData(people*s,intm)people*GetData()五、调试分析
5、1.设计与调试过程中遇到的问题分析、体会.在调试过程中遇到了死循环的情况,自己反复看了很久也未能查找到错误,直到请同学帮忙看,才终于发现原来是一个在循环条件中,写丢了一个条件。后来回想,觉得当初自己检查的时候不够仔细,大概也有些主观思想——认为不可能出错——掺杂其中,导致有此结果。以后写程序要更认真才行。2.主要算法的时间主程序:循环算法。六、使用说明打开此程序,点击运行,按照屏幕输出显示依次输入所需数据即可——首先输入参与的人数;然后依次输入每个人手中的密码;最后输入m的初值,即可得到输出结果。七、测试结果八、附录源程序#include6、eam.h>structpeople{intdata;intnum;people*next;};people*GetData(){intn;people*p1,*p2,*head;head=NULL;cout<<"请输入人数:";cin>>n;cout<<"请依次输入每个人的密码:"<>p1->data;p1->num=i+1;if(head==NULL){head=p2=p1;}else{p2->next=p1;p2=p1;}}if(head!=NULL)p27、->next=head;return(head);}//循环链表//中间结点//建立首结点voidDealData(people*s,intm){people*p1,*p2,*q;p1=s;while(p1!=NULL){for(inti=1;inext;}if(p1!=p1->next)//重新获取m值并删除已读取的结点{m=p1->data;cout<num;p2->next=p1->next;q=p1;p1=p1->next;deleteq;}else{cout<num;delete8、p1;p1=NULL;}}}voidmain(void){intm;people*s;s=GetData()
6、eam.h>structpeople{intdata;intnum;people*next;};people*GetData(){intn;people*p1,*p2,*head;head=NULL;cout<<"请输入人数:";cin>>n;cout<<"请依次输入每个人的密码:"<>p1->data;p1->num=i+1;if(head==NULL){head=p2=p1;}else{p2->next=p1;p2=p1;}}if(head!=NULL)p2
7、->next=head;return(head);}//循环链表//中间结点//建立首结点voidDealData(people*s,intm){people*p1,*p2,*q;p1=s;while(p1!=NULL){for(inti=1;inext;}if(p1!=p1->next)//重新获取m值并删除已读取的结点{m=p1->data;cout<num;p2->next=p1->next;q=p1;p1=p1->next;deleteq;}else{cout<num;delete
8、p1;p1=NULL;}}}voidmain(void){intm;people*s;s=GetData()
此文档下载收益归作者所有