抽签游戏

  • 格式:doc
  • 大小:309.50 KB
  • 文档页数:16
}
// 用来输出布局图的函数
void display(int ** &m,int row,int col)
{
m[i][j]=0;
}
}
调试程序截图如下:
五、
1、
#include<iostream>
#include<string>
#include<time.h>
using namespace std;
void display(int ** &m,int row,int col); //打印布局函数声明
void castlot(int ** &m,int * &b,int row,int col); //抽签函数声明
int r;
cout<<"请选择手动输入或者自动生成布局数组(输入1或2)"<<endl;
cout<<" 1.手动输入 "<<endl;
cout<<" 2.随机生成 "<<endl;
cin>>r;
if(r==1)
{
for(i=0;i<row;i++)
{
cout<<"请输入第"<<i+1<<"层的布局(由0和1组成的"<<col-1<<"个数,数与数之间用空格隔开):"<<endl;
(4) 当碰到某一横线跨在第i条和第i+1条竖线上时,如何交换数据?
解决:用一维数组B[n]来存放游戏过程中的中间结果和最终结果,通过交换B[i]和B[i+1]的值解决交换数据问题。
(5) 如何表示抽签游戏的竖线和横线布局?
解决:设计一个二维数组M[m][n],M[i][j]表示第i层上第j条和第j+1条竖线之间是否有横线,其值为0或1,1代表有横线,0代表没有横线。图3所述示例对应的数组M如图4所示。
算法设计要点如下:
(1) 按从上到下、由左到右的方式遍历数组M,若某元素值为1,则进行数据交换。
(2) 在数据交换的过程中,用一维数组B来存放游戏过程中的顺序和最终的顺序,即:
如果M[i][j]=1,则B[j]←→B[j+1];
(3) 最后B[n]即为所求;
3.
1)display(int ** &m,int row,int col);//根据生成的布局二维数组打印布局图
课程设计任务书
2010—2011学年第1学期
电子与信息工程系计算机科学与技术专业09级计算机1班级
课程设计名称:数据结构课程设计
设计题目:抽签游戏
完成期限:自2012年1月2日至2012年1月6日共1周
设计依据、要求及主要内容(可另加附页):
一、设计目的
熟悉各种数据结构和运算,会使用数据结构的基本操作解决一些实际问题。
(1) 抽签游戏可以多人参与,只要加上竖线和横线即可。那么,如何表示这些参与者呢?
解决:假设有n个人参加,可以用一个一维数组A[n]来记录n个抽签者。
(2) 签号如何存储?
解决:签号的存储也可设计成一个一维数组p[n]来记录n个签号。
(3) 如何存储游戏的最终结果?
解决:设计一维数组B[n]存储最终的对应结果,同时在执行过程中记载中间结果。
cout<<"/***************************抽签游戏**********************************/"<<endl;
cout<<"为抽签做准备,搭建抽签布局,先输入抽签共经过的层数和参加的人数:"<<endl;
int **m; //存储抽签布局的动态二维数组数组
(2) 设计算法实现抽签;
(3) 存储游戏的最终结果。
2
分析上面的抽签游戏的示例,遇到一条横线,代表这两个竖线的数据就要交换顺序,例如,原来的顺序为{A0, A1, A2, A3, A4},经过第0层横线后,顺序为{A1, A0, A3, A2, A4},再经过第1层横线后,顺序为{A1,A3,A0,A2,A4},以此类推,最后顺序为{A4, A1, A0, A2, A3},对应到{p0, p1, p2, p3, p4}。在该游戏中,需解决以下问题:
2.基本要求:
(1)设计存储结构存储抽签者、签号、游戏用横线、竖线等;
(2)设计算法实现抽签;
(3)存储游戏的最终结果。
四、参考文献
1.王红梅.数据结构.清华大学出版社
2.王红梅.数据结构学习辅导与实验指导.清华大学出版社
3.严蔚敏,吴伟民.数据结构(C语言版).清华大学出版社
一、
本课程设计的名称是抽签游戏,该设计主要是要通过设计存储结构存储抽签人,签号,中间结果,并通过设计抽签算法进行抽签,抽签以后中间结果数组的次序会发生改变,最后通过中间结果的改变将抽签人和 签号连接起来,实现每一个抽签人对应到一个签号,如果只有一个是奖品也只有一人能抽中。
cout<<"/**************************作者:罗远*********************************/"<<endl;
cout<<"/************************学号:09710103*******************************/"<<endl;
a=new string[col];
p=new string[col];
//输入抽签人编号
cout<<"请输入抽签人编号:"<<endl;
for(t=0;t<col;t++)
{
cin>>a[t];
}
//输入签号
cout<<"请输入签号:"<<endl;
for(t=0;t<col;t++)
{
cin>>p[t];
主函数通过将布局数组m以及抽签经过的层数和参加抽签的人数通过参数传递传进display函数,display函数根据传进来的这些参数,判断m[i][j]的值是否为1,如果为1则在第i行第j列输出一个竖线(“|”)和一个横杠(“一”),为0则输出一个竖线(“|”)和一个两个空格(“ ”),然后在最后的一列不上i行“|”,从而实现布局图的输出。display函数源代码如下:
for(j=0;j<col-1;j++)
{
cin>>m[i][j];
}
}
}
//使每次运行程序都会有不同的二维数组产生,且申明在for循环前减少等待时间
srand( (unsigned)time( NULL ) );
if(r==2)
{
for(i=0;i<row;i++)
{
for(j=0;j<col-1;j++)
void display(int ** &m,int row,int col)
{
for(int i=0;i<row;i++)
{
if(i!=0){cout<<"|"<<endl;} //输出最后一列的竖线
//判断布局数组,为1输出竖线横杠,为0输出竖线空格
for(int j=0;j<col-1;j++)
{
temp=b[s];
b[s]=b[s+1];
b[s+1]=temp;
//因为该抽签函数原形来源于鬼脚图,鬼脚图没一行中不存在相邻的横线,所以可以直接跳过该行的下一列
s+=2;
}else s++;
}
3)link(string * &a,string * &p,int * &b,int row,int col); //连接函数,将抽签人和签号连接起来
{
cout<<"|"<<"";
if(m[i][j]==1){cout<<"一";}else{cout<<" ";}
}
}
cout<<"|"<<endl; //输出最后一行最后一列的竖线
}
2)castlot(int ** &m,int * &b,int row,int col); //抽签函数
castlot函数是用来实现抽签而设计的算法,它的原理是通过调换中间数组各元素的次序,来实现抽签人和签号的不同对应的,每当检测到m[i][j]的值为1时即存在横杠时,则交换中间数组b[j]和b[j+1]的值,最终得到的b[col]数组可以传入link函数,从而实现抽签人和签号之间的一一对应。函数源代码如下:
}
//中间结果数组初始化
for(t=0;t<col;t++)
{
b[t]=t;
}
//动态二维数组的申请
m=new int *[row];
for(i=0;i<row;i++)
{
m[i]=new int[col-1];
}
cout<<"请输入抽签布局数组各行、列的值:"<<endl;