c语言编程问题,紧急求助,如果能得到帮助万分感谢

请教高手,如何实现随机选题

我参考了知道里面的学生信息管理还是做不出来,希望高手指点

我要实现的是程序可以添加题目,修改题目,随机查看一个题目。
要求是,可以设置多少次,以内不要查看到重复的题目,如果没有了就提示没有了
开始我考虑用两个结构体,同时给题目多增加个字段(用来控制重复),每次查看了某个题目就把它从现有的结构体里面删除,然后加到另外一个去,,剩下的下次可以继续随机选择
用增加的控制字段控制重复,当被选择一次,就给这个字段赋值100(假设设定的是100次不重复),下次不参与随机选择但是这个值减小1

不知道有没有高手可以给点函数提示或者实现,如果能帮助实现真是万分感谢。总之无论有无结果有关注愿意帮助的朋友都谢谢你们了。
可以给个代码吗,各位大哥??

感谢人太懒没取名字和一位匿名的大哥,

哦,这样啊,我程序不是很熟,谢谢啊

#include"stdio.h"
#include "string.h"
#include "time.h"
#include "stdlib.h"
#include "windows.h"
#define N 50
//定义最大信息量
struct Course
{
char CourseName[20];
int flag;
};
int CreateCourse(Course My_Course[])
{
int i,sum=0;
printf("输入#表示输入结束!\n");
printf("输入题目名称:");
for(i=0;i<N;i++)
{
scanf("%s",My_Course[i].CourseName);
My_Course[i].flag=0;
sum++;
if(strcmp(My_Course[i].CourseName,"#")==0)
{
sum--;
break;
}

}
return sum;
}
//添加记录
int AddCourse(Course My_Course[],int n)
{
if(n>=N)
{
printf("已经达到最大的题目数!");
return n;
}
else
{
printf("输入题目名称:");
scanf("%s",My_Course[n].CourseName);
My_Course[n].flag=0;
n++;
}
return n;
}
//重命名
void Reneme(Course My_Course[],int n)
{
int i;
char OldName[20],NewName[20];
printf("输入原名:");
scanf("%s",OldName);
printf("输入新名:");
scanf("%s",NewName);
for(i=0;i<n;i++)
{
if(strcmp(My_Course[i].CourseName,OldName)==0)
{
strcpy(My_Course[i].CourseName,NewName);
printf("修改成功!\n");
return;
}
}
printf("你的输入有误,重命名失败!\n");
return;
}

//随机查看
void SJChoise(Course My_Course[],int n,int m)
{
int b[N],i,k,j,flag;
if(m>n)
{
printf("要查看的记录数大于当前的记录总数!\n");
return;
}
for(i=0;i<N;i++) b[i]=-1;
i=0;
flag=0;
while(i<m)
{
while(flag==0)
{
//调用Sleep函数使srand生成不同的种子
Sleep(50);
flag=1;
srand(time(0));
k=rand()%n;
for(j=0;j<i;j++)
if(k==b[j])
{
flag=0;
break;
}

}
My_Course[k].flag=1;
printf("%s\n",My_Course[k].CourseName);
b[i]=k;
i++;
flag=0;
}
}

void main()
{
int n,i,sum,m;
Course My_Course[N];
n=CreateCourse(My_Course);
for(i=0;i<n;i++)
printf("%s ",My_Course[i].CourseName);
printf("\n");
printf("**************简单菜单选择**************\n");
printf("0 推出系统\n");
printf("1 添加题目\n");
printf("2 重命名\n");
printf("3 随机查看记录\n");
printf("****************************************\n");
while(1)
{
printf("输入操作编号:");
scanf("%d",&m);
switch(m)
{
case 0: return;
case 1: n=AddCourse(My_Course,n);
printf("当前记录为:\n");
for(i=0;i<n;i++)
printf("%s ",My_Course[i].CourseName);
printf("\n");
break;
case 2: Reneme(My_Course,n);
printf("当前记录为:\n");
for(i=0;i<n;i++)
printf("%s ",My_Course[i].CourseName);
printf("\n");
break;
case 3: printf("输入你要随机查看的记录数:");
scanf("%d",&sum);
SJChoise(My_Course,n,sum);
break;
}
}

}

注:1.程序是在VC++6.0下编写并调试通过。
2.程序中允许输入汉字。
不是不能解决,你把#define N 50改成#define N 150 或者更大,在把参数sum初始化成100 就成了 你说的“随机选择在100次内不重复的问题”。
在程序调试中,不可能先输入100 数据后再来验证。#define N 就是用来灵活处理问题规模的一个宏。写程序对输入的限制越少越好,程序要能解决一类问题,而不是一个问题。
温馨提示:答案为网友推荐,仅供参考
第1个回答  2009-04-06
题目总数N,把每道题目的首指针存到数组a[N]里。
再用rand()%N生成随机序列号,放到数组b[N]里。
for i=0 to N-1,输出a[b[i]],就好了。
相似回答