用C语言编写一个程序,将给定的名字随机分为AB两组
时间: 2024-05-14 17:14:23 浏览: 8
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#define MAX_NAME_LEN 20
int main()
{
char name[MAX_NAME_LEN];
int n, i, j, k;
printf("请输入人数:");
scanf("%d", &n);
char **groupA = (char **)malloc(n * sizeof(char *));
char **groupB = (char **)malloc(n * sizeof(char *));
for (i = 0; i < n; i++) {
groupA[i] = (char *)malloc(MAX_NAME_LEN * sizeof(char));
groupB[i] = (char *)malloc(MAX_NAME_LEN * sizeof(char));
}
printf("请输入每个人的名字:\n");
for (i = 0; i < n; i++) {
scanf("%s", name);
strcpy(groupA[i], name);
}
srand(time(NULL)); // 初始化随机数生成器
for (i = 0; i < n; i++) {
j = rand() % n; // 随机分组
if (groupB[j][0] == '\0') { // 如果groupB[j]还没有分到人
strcpy(groupB[j], groupA[i]); // 把groupA[i]分到groupB[j]
} else { // 如果groupB[j]已经分到了人
// 找到下一个没有分到人的位置
for (k = j + 1; k != j; k++) {
if (k == n) k = 0;
if (groupB[k][0] == '\0') {
strcpy(groupB[k], groupA[i]);
break;
}
}
}
}
printf("A组:\n");
for (i = 0; i < n; i++) {
printf("%s\n", groupA[i]);
}
printf("B组:\n");
for (i = 0; i < n; i++) {
printf("%s\n", groupB[i]);
}
for (i = 0; i < n; i++) {
free(groupA[i]);
free(groupB[i]);
}
free(groupA);
free(groupB);
return 0;
}
```
说明:
1. 首先,根据人数 n,动态分配两个二维字符数组 groupA 和 groupB。groupA 用来存储输入的名字,groupB 用来存储随机分组后的结果。
2. 从标准输入中读取每个人的名字,并将其存储到 groupA 数组中。
3. 使用 srand(time(NULL)) 初始化随机数生成器,然后使用 rand() 函数生成一个 0 到 n-1 之间的随机整数 j,将 groupA[i] 分到 groupB[j] 中。如果 groupB[j] 已经存储了一个名字,则寻找下一个没有存储名字的位置,直到找到一个位置可以存储 groupA[i]。
4. 最后,输出分组结果,并释放动态分配的内存。