点名零碎分为两种,一种为反复点名,一种为不反复点名
反复点名:顾名思义,随机点到后,下次兴许还会点到
反复点名
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include<string.h>
#include <stdlib.h>
#include <time.h>
#include<conio.h>
#define N 57 // 同学人数
int main()
{
int num = 0;
void menu();
scanf("%d", &num);
switch (num)
{
case 1:
void chongfu();
break;
case 2:
void buchongfu();
break;
default:
}
return 0;
}
void menu()
{printf("请输出数字,进入不同模式");
printf("1. 反复点名");
printf("2. 不反复点名");
}
void chongfu()
{int list[N], i, j, r, k;
const char* s[N] = {“aa".......57 个同学名字,define 定义数雷同,否则报错};// 人名单
printf("随机点名, 输出'0'退出。\n");
while (1) {printf("请问想点几个:");
scanf("%d", &k); // 输出人数
if (k == 0)
break;
if (k > N)
{printf("输出谬误 \n");
continue;
}
else
{srand(time(NULL));
for (i = 0; i < k; i++) // 生成不反复的随机数组
{while (1) {r = rand() % N;
for (j = 0; j < i; j++)
{if (list[j] == r)
break;
}
if (j == i)
{list[i] = r;
break;
}
}
}
// 输入人名
for (i = 0; i < k; i++) {printf("%s\n", s[list[i]]);
}
}
}
return;
}
不反复点名
// 随机点名零碎 不反复
#include <stdio.h>
#include <time.h>
#define STUDENT_NUM 57 // 定义学生总数
void Exchange(int* a, int* b) // 替换两个 int 值
{
int n = *a;
*a = *b;
*b = n;
}
int main()
{const char* name[STUDENT_NUM] =
{与宏定义数量统一即可};
srand((unsigned int)time(NULL));// 设置随机种子
int Index[STUDENT_NUM] = {0};// 定义索引数组
for (int i = 0; i != STUDENT_NUM; i++) // 初始化索引数组
{Index[i] = i;
}
for (int i = 0; i != STUDENT_NUM; i++)// 打乱索引数组中的值
{Exchange(&(Index[i]), &(Index[rand() % STUDENT_NUM]));
}
printf("请按回车开始点名 \n");
for (int i = 0; i != STUDENT_NUM; i++)// 输入打乱值的索引对应的字符串
{getch();
printf("%s\n", name[Index[i]]);
}
return 0;
}