求c语言班级点名程序,高手们来帮帮忙啊

读入一个班级名单,然后键盘输入点名人数,随机抽取学生。
在屏幕上输出抽到的学生学号和名字。
注意所有输出的名字不能重复!(并要处理点名人数超过班级人数的情况)在基础要求上,每次在屏幕上只输出一个学号和名字,即输出一个学生的信息后要停顿,等用户按下一个回车后,再输出下一个学生的信息。

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
typedef struct Student
{
char name[20];
bool IsRead;
}Student;
int main()
{
int i;
int select;
int mark=1;
//下面中你还可以加入一些学生,记得初始化的IsRead都是false
Student student[]=
{
{"张三",false},
{"李四",false},
{"王五",false},
{"刘六",false},
{"赵七",false}
};

printf("欢迎进入点门系统,以下是全班的花名册:\n");
for (i=0;i<sizeof(student)/sizeof(Student);i++)
printf("%s ",student[i].name);
printf("\n");

do
{
printf("请选择:\n1.点名\n2.显示没有点到的学生名字\n3.退出点名系统\n");
scanf("%d",&select);
system("cls");//如果是Linux系统,把cls改成clear。如果是其他系统请把这行注释掉,清频
if(1==select)
{
mark = 1;
while (1)
{
for(i=0;i<sizeof(student)/sizeof(Student);i++)
mark=mark*(student[i].IsRead? 1:0);
if(mark)
{
printf("你已经把全班点了个遍\n");
break;
}
srand(time(NULL));
i = rand()%(sizeof(student)/sizeof(Student));
if(!student[i].IsRead)
{
printf("点名:%s\n",student[i].name);
student[i].IsRead = true;
break;
}
}
}
else if (2==select)
{
for(i=0;i<sizeof(student)/sizeof(Student);i++)
{
if(!student[i].IsRead)
printf("%s ",student[i].name);
}
printf("\n");
}
else if(3==select)
{
printf("谢谢使用\n");
return 0;
}
}while(true);

return 0;
}

这可是我一个字一个字的打出来的,专门为你写的!~
温馨提示:答案为网友推荐,仅供参考
第1个回答  2012-04-09
//data.txt中内容如下
0001 赵一
0002 钱二
0003 孙三
0004 李四
0005 周五
0006 吴六
0007 郑七
0008 王八
0009 冯九
0010 陈十
0011 楚大
0012 魏二

//运行情况如下
读入数据后这个班有12个学生
请输入抽取学生个数:22
这个班没有这么多学生
请输入抽取学生个数:4

0007 郑七

0012 魏二

0009 冯九

0003 孙三
Press any key to continue

//代码如下
#include <stdio.h>
#include <stdlib.h>
#include<string.h>
#include <time.h>
struct Student
{
int stdno;
char name[20];
};

main()
{
int i,j,chou,stucnt=0,tmp,sel[100]={0},flag;
char line[100]="\0",stubuff[100][100];
FILE *fp;
struct Student *st;
fp=fopen("data.txt","r");
while (fgets(line,99,fp)!=NULL)
{
strcpy(stubuff[stucnt++],line);
}
printf("读入数据后这个班有%d个学生\n",stucnt);

srand((unsigned)time(NULL));

do
{
printf("请输入抽取学生个数:");
scanf("%d",&chou);
if (chou>stucnt)
{
printf("这个班没有这么多学生\n");
}
} while(chou>stucnt ||chou<0);

for (i=0;i<chou;i++)
{
flag=0;
tmp=rand()%stucnt+1;
for (j=0;j<i;j++)
{
if (sel[j]==tmp)
{
flag=1;
break;
}
}
if (flag==1)
{
i--;
}else
{
sel[i]=tmp;
}
}
for (i=0;i<chou;i++)
{
fflush(stdin);
getchar();
printf("%s",stubuff[sel[i]-1]);
}
}本回答被提问者和网友采纳
第2个回答  2012-04-09
我帮你看了一下,思路给你缕一下,我不能帮你全写完,希望你能自己完成剩下的,提高自己,不是从看代码中,而是不断尝试
#include <stdio.h>

typedef struct student
{
int num;
char name[10];
int sign;//标记学生是否被点名随机到
}Stu;

int random(void);//返回一个随机值,可以设计不重复
int initList();//初始化列表到文件,将学生信息以结构体形式录入 list.txt 并返回节点数目nNum

void main()
{
Stu stu[20];
int nNum;
int nCount;

nNum = initList();
printf("Input Chick nCount:");

scanf("%d",&nCount);

if(nCount > nNum)//如果点名人数超过 全班人数,我啥也不说了
{
printf("teacher ,are you stupid?");
}
else
for(int i = 0;i<nCount;i++)
{
if(stu[i].sign == 0)
{
if(stu[i].num == random())
{
printf("%d %s",stu[i].num,stu[i].name);
getchar();//等待输入 回车继续
stu[i].sign = 1;
}
}
}

}
int random()
{
return 0;
}
int initList()
{
return 0;
}
相似回答