编写一个随机点名系统

道亦无名
博客专家认证
2014-11-23 11:17:33
1、 编写一个随机点名系统,运行该系统后,按空格键可以显示出一名同学,以前被选中的同学,将不会再次被选中
2、采用C语言 数据结构 数组指针 随机数 文件读写的方式 不必使用服务器的情况不适用数据库技术进行编程
3、求代码如何实现
...全文
1295 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
starytx 2014-11-24
  • 打赏
  • 举报
回复
主要功能已实现,思路就是利用随机函数,交换int数组中的值,已达到“洗牌”效果,然后利用打乱的索引值来访问字符串数组。仅供参考
// 交换两个int值
void change(int *a, int *b)
{
	int n = *a;
	*a = *b;
	*b = n;
}

#define STUDENT_NUM 7		// 定义学生总数
int main()
{

	const char * name[STUDENT_NUM] = 
	{
		"张三",
		"李四",
		"王五",
		"赵六",
		"路人甲",
		"路人乙",
		"无名氏"
	};

	int nIndex[STUDENT_NUM] ={0};
	srand((UINT)time(0));	// 设置随机种子
	for (int i =0; i != STUDENT_NUM; i++)		 // 初始化索引数组
	{
		nIndex[i] = i;
	}
	for (int i =0; i != STUDENT_NUM; i++)	// 打乱索引数组中的值
	{
		change(&(nIndex[i]) , &(nIndex[rand()%STUDENT_NUM]));
	}
	for (int i = 0; i != STUDENT_NUM; i++)		// 打印打乱值的索引对应的字符串
	{
		printf("%s\n" ,name[nIndex[i]]);
	}
	
	return 0;
}
赵4老师 2014-11-24
  • 打赏
  • 举报
回复
随机必然有重复。 所谓“不重复的随机”实际上是洗牌。 洗牌算法参考下面:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int d[6];
int i,n,a,b,t;
int c,j;
void main() {
    srand(time(NULL));
    printf("shuffle 0..n-1 demo\n");
    for (n=1;n<=5;n++) {/* 测试1~5个元素 */
        printf("_____n=%d_____\n",n);
        j=1;
        for (c=1;c<=n;c++) j=j*c;/* j为n! */
        j*=n*2;
        for (c=1;c<=j;c++) {/* 测试n*2*n!次 */
            for (i=0;i<n;i++) d[i]=i;/* 填写0~n-1 */
            for (i=n;i>0;i--) {/* 打乱0~n-1 */
                a=i-1;b=rand()%i;
                if (a!=b) {t=d[a];d[a]=d[b];d[b]=t;}
            }
            printf("%04d:",c);
            for (i=0;i<n;i++) printf("%d",d[i]);
            printf("\n");
        }
    }
    printf("shuffle 1..n demo\n");
    for (n=1;n<=5;n++) {/* 测试1~5个元素 */
        printf("_____n=%d_____\n",n);
        j=1;
        for (c=1;c<=n;c++) j=j*c;/* j为n! */
        j*=n*2;
        for (c=1;c<=j;c++) {/* 测试n*2*n!次 */
            for (i=1;i<=n;i++) d[i]=i;/* 填写1~n */
            for (i=n;i>1;i--) {/* 打乱1~n */
                a=i;b=rand()%i+1;
                if (a!=b) {t=d[a];d[a]=d[b];d[b]=t;}
            }
            printf("%04d:",c);
            for (i=1;i<=n;i++) printf("%d",d[i]);
            printf("\n");
        }
    }
}

69,369

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧