纸牌游戏
一.需求分析
1.编号为1-52张牌,正面向上
2. 从第2张开始,以2为基数,是2的倍数的牌翻一次,直到最后一张牌;然后,从第3张开始,以3为基数,是3的倍数的牌翻一次,直到最后一张牌;然后从第4张开始,以4为基数,是4的倍数的牌翻一次,直到最后一张牌;...再依次5的倍数的牌翻一次,6的,7的直到以52为基数的翻过
3. 输出:这时正面向上的牌;
4.测试数据
52张牌
二.概要设计
1.数组抽象数据类型定义:
ADT SqList{
数据对象:ji=0,…,bi-1,i=1,2,…,n,
D= {aj1j2…jn|n(>0)称为数组的维数,bi是数组第i维的长度, ji是数组第i 维的下标, aj1j2…jn∈ElemSet}
数据关系:R={R1,R2,…,Rn}
Ri={<aj1…ji…jn,aj1,…ji+1,…jn>|0≤jk≤bk-1,1≤k≤n且k≠I, 0≤ji≤bk-2, aj1…ji…jn,aj1,…ji+1,…jn∈D,i=2,…,n}
基本操作:
faceringt(L):
操作结果:对纸牌进行翻转
}ADT SqList
2.本程序包含两个模块:
(1)主程序模块
void main()
{定义一个二叉树;
for(i=1;i<=52;i++)
{ L.r[i].num=i;
L.r[i].visit=0;//用0来记正面
}
}
(2)纸牌翻转模块——翻转纸牌
各模块之间的调用关系如下:
主程序模块
纸牌翻转模块
三.详细设计
1.根据题目要求的数组存储结构
#define MAXSIZE 100//给数组定义一个空间
typedef struct
{
int num; //牌号
int visit; //牌的正反面
}RedType; //纸牌的信息
typedef struct
{
RedType r[MAXSIZE+1]; //纸牌数组
int length;
}SqList;
2.对纸牌进行翻转
void faceringt(SqList L)
{
for(i=2;i<=52;i++) //从第二张开始往后
{
for(j=i;j<=52;j++)
if(L.r[j].num%i==0) //当是i的倍数时翻转
{
if(L.r[j].visit==0) //正面翻反面
L.r[j].visit=1;
else
L.r[j].visit=0;
}
}
for(i=1;i<=52;i++) //显示正面号
{
if(L.r[i].visit==0)
cout<<L.r[i].num<<" ";
}
cout<<endl;
}
3. 主函数
void main()
{
for(i=1;i<=52;i++)
{
L.r[i].num=i;
L.r[i].visit=0;//用0来记正面
}
cout<<"这时是正面的编号为:"<<endl;
faceringt(L);
}
4. 函数的调用关系反映了演示程序的层次结构
主程序
faceringt
四. 调试分析
1.用一个数组来存储52张牌
2. 定义数组时由于每张牌要记录两个东西,就让每个数据包括两个数据项----纸牌号和记录纸牌正反面
五.测试结果
六. 附录(源代码)
#include<iostream>
#include<string>
using namespace std;
#define MAXSIZE 100//给数组定义一个空间
typedef struct
{
int num; //牌号
int visit; //牌的正反面
}RedType; //纸牌的信息
typedef struct
{
RedType r[MAXSIZE+1]; //纸牌数组
int length;
}SqList;
//对纸牌进行翻转
void faceringt(SqList L)
{int i,j;
for(i=2;i<=52;i++) //从第二张开始往后{for(j=i;j<=52;j++)
if(L.r[j].num%i==0) //当是i的倍数时翻转{if(L.r[j].visit==0) //正面翻反面
L.r[j].visit=1;
else
L.r[j].visit=0;
}
}
for(i=1;i<=52;i++) //显示正面号
{if(L.r[i].visit==0)
cout<<L.r[i].num<<" ";
}
cout<<endl;
}
void main()
{int i;
SqList L;
for(i=1;i<=52;i++)
{L.r[i].num=i;
L.r[i].visit=0;//用0来记正面
}
cout<<"这时是正面的编号为:"<<endl; faceringt(L);
}
七. 心得体会。