上机作业实验一
1、首先,所有参加游戏的日本人按顺序编号为1、2、3…N;
2、接下来每个日本人心里产生一个数字,这个数字称为序号为 N的人的密码P;
3、所有参加游戏的人按照编号站成一个圈,长老为游戏设置初始密码K,从编号为 1的人这里开始报数,报到 K的人退出队伍,然后将自己心中的密码 K2说出来,由下一个人继续从 1开始报数,报到 K2的人退出队伍,以此类推;
4、当队伍中剩下一个人的时候,这个人就是今天要出去采摘的日本人,他可能回不来了!
请各位同学在C++环境中设计程序,在用户输入了人数N、每个人的密码P和初始密码K的情况下,自动完成上面的游戏过程,输出先后离开队伍的人的序号序列,最后输出要去采摘的日本人,输出他的编号。请尽量采用更为形象的方式输出游戏过程。
#include"pch.h"
#include<iostream>
using namespace std;
struct JanMan //设置janman结构体,存储密码与对应的编号
{
JanMan* m_pNext;//下一个人
int m_nPassword;//自己想的密码
int m_nNumber; //编号
};
void PrintExitMan(JanMan* pPreMan, JanMan* pStartMan, int nPassword) //打印采摘者编号
{
if (pPreMan == pStartMan)//如果第一个人就是密码匹配
{
cout << "要出去采摘的日本人的编号为:" << pStartMan->m_nNumber << endl;
delete pStartMan;
return;
}
for (int i = 0; i < nPassword - 1; i++)//循环直至密码遍历至采摘者
{
pPreMan = pStartMan;
pStartMan = pStartMan->m_pNext;
}
pPreMan->m_pNext = pStartMan->m_pNext;
cout << "编号为" << pStartMan->m_nNumber << "人退出队伍!" << "其密码为:" << pStartMan->m_nPassword << endl;
nPassword = pStartMan->m_nPassword;
delete pStartMan;
PrintExitMan(pPreMan, pPreMan->m_pNext, nPassword);//递归调用自己
}
int main(int argc, char* argv[])
{
int nNumber = 0;
int nInitPassword = 1;
cout << "请输入人数:";
cin >> nNumber;
cout << "请输入初始密码:";
cin >> nInitPassword;
JanMan* pStartMan = NULL;
JanMan* pHead = NULL;
//////////////////////////////////////////////////////////////////////////
//初始化数据
for (int i = 1; i <= nNumber; i++)
{
if (NULL == pStartMan)
{
pStartMan = new JanMan();
pHead = pStartMan;
}
else
{
JanMan* pTmp = new JanMan();
pStartMan->m_pNext = pTmp;
pStartMan = pStartMan->m_pNext;
}
pStartMan->m_nNumber = i;
cout << "请输入第" << i << "个日本人的密码:";
cin >> pStartMan->m_nPassword;
pStartMan->m_pNext = pHead;
}
//////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////
//显示初始数据
cout << "====================显示初始化数据==========================" << endl;
pStartMan = pHead;
for (int j = 1; j <= nNumber; j++)
{
cout << "编号为" << pStartMan->m_nNumber << "的人密码为:" << pStartMan->m_nPassword << endl;
pHead = pStartMan;
pStartMan = pStartMan->m_pNext;
}
cout << "=============================================================" << endl;
cout << "==========================游戏开始===========================" << endl;
cout << "初始密码为:" << nInitPassword << endl;
//////////////////////////////////////////////////////////////////////////
PrintExitMan(pHead, pHead->m_pNext, nInitPassword);//递归调用
//////////////////////////////////////////////////////////////////////////
cout << "=============================================================" << endl;
return 0;
}