这是源于王者荣耀战队微信群里的活动,队长让我处理一下cp随机配对的活儿,作为一名程序员,这种东西当然自己写一个简单的程序就能完成,于是有了下面的代码。
1.制作两份名单——一男一女的txt文件,放在解决方案的路径上
2.制作一个结构体,然后把男女名单分别从txt文件上拷贝到结构体数组中
3.制作随机函数(时间作为种子)
4.抽到一个人,分别从男或女的结构体数组中减去一个人,再在剩余的人数中进行随机
5.判断配对结果(1.男女均等。2.男多女少。3.男少女多)
// CpMatch.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//
#include <iostream>
#include <stdlib.h>
#include <time.h>
#include <windows.h>
using namespace std;
typedef struct Stack {
int num;
char name[20];
}Stack;
Stack boys[100];
Stack girls[100];
//char name[6][10];
void LoadBoysName() //读取.txt文件每一行的字符串
{
FILE* fp;
errno_t err; //C++写法
err = fopen_s(&fp, "man.txt", "r");
if (err)
{
perror("fail to read");
exit(1);
}
int i = 1;
while (!feof(fp))
{
fscanf_s(fp, "%s",boys[i].name,20);
boys[i].num = i;
i++;
}
fclose(fp);
}
void LoadGirlsName() //读取.txt文件每一行的字符串
{
FILE* fp1;
errno_t err; //C++写法
err = fopen_s(&fp1, "women.txt", "r");
if (err)
{
perror("fail to read");
exit(1);
}
int i = 1;
while (!feof(fp1))
{
fscanf_s(fp1, "%s", girls[i].name, 10);
girls[i].num = i;
i++;
}
fclose(fp1);
}
int RandNum(int i)
{
int num;
srand((unsigned)time(NULL));
num = rand() % i + 1;
// cout << num << '\t';
//Sleep(2000);
return num;
}
int main()
{
LoadGirlsName(); //导入名单
LoadBoysName(); //导入名单
boys[0].num = 0;
strcpy_s(boys[0].name , "Blue.蓝色");
girls[0].num = 0;
strcpy_s(girls[0].name, "小萌新");
/*
产生随机数1-3
//printf("%d. %s\n", boys[num].num, boys[num].name);
for (int k = 0; k < 10; k++)
{
int num;
srand((unsigned)time(NULL));
num = rand() % 10 + 1;
cout << num << '\t';
Sleep(4000);
}
*/
int boysTop = 1, girlsTop =1,i=1;
int randnumberBoy, randnumberGirl;
/*统计栈内元素的个数*/
while (NULL != boys[boysTop].num)
{
boysTop++;
}
while (NULL != girls[girlsTop].num)
{
girlsTop++;
}
boysTop = boysTop - 1; girlsTop = girlsTop - 1;
cout <<"男生总数:"<< boysTop+1 << "\t" << "女生总数:" << girlsTop+1 << endl;
printf("---------男生---------\n");
for (int l = 0; l <= boysTop; l++)
printf("%d.%s\n", boys[l].num, boys[l].name);
printf("---------女生---------\n");
for (int l = 0; l <= girlsTop; l++)
printf("%d.%s\n", girls[l].num, girls[l].name);
printf("---------开始配对---------\n");
while (boysTop != 0 || girlsTop != 0)
{
int kb, kg, kkb, kkg;
randnumberBoy = RandNum(boysTop);
Sleep(1500);
randnumberGirl = RandNum(girlsTop);
Sleep(1500);
printf("第%2d组cp:%-20s %-20s\n",i,boys[randnumberBoy].name,girls[randnumberGirl].name);
i++;
/*更新栈*/
kb = boysTop - randnumberBoy, kg=girlsTop - randnumberGirl, kkb = 1,kkg=1;
while (kkb<=kb)
{
boys[randnumberBoy].num = boys[randnumberBoy + kkb].num;
strcpy_s(boys[randnumberBoy].name, boys[randnumberBoy + kkb].name);
kkb++;
}
while (kkg <= kg)
{
girls[randnumberGirl].num = girls[randnumberGirl + kkg].num;
strcpy_s(girls[randnumberGirl].name, girls[randnumberGirl + kkg].name);
kkg++;
}
boysTop--;
girlsTop--;
if (boysTop == 0 && girlsTop != 0)
{
//printf("第%2d组cp:%-20s %-20s\n", i , girls[0].name, boys[0].name);
printf("\n");
printf("有多余的女生:\n");
while (girlsTop > 0)
{
cout << girls[girlsTop].num << "." << girls[girlsTop].name << endl;
girlsTop--;
}
break;
}
else if (boysTop != 0 && girlsTop == 0)
{
//printf("第%2d组cp:%-20s %-20s\n", i , girls[0].name, boys[0].name);
printf("\n");
printf("有多余的男生:\n");
while (boysTop > 0)
{
cout << boys[boysTop].num << "." << boys[boysTop].name << endl;
boysTop--;
}
break;
}
else if (boysTop == 0 && girlsTop == 0)
{
printf("全部匹配完毕"); break;
}
}
}