c語言的點名程序
1. 用c語言編寫一個自動點名系統,具體要求如下一、具體題目: 設計一個供教師上課使用的
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<time.h>
//---------------data structure----------------
struct student{
 char id[30];
 char name[30];
 int called_times;
};
struct node{
 struct node *next;
 struct student student;
};
//------------end of data structure----------------
//------------global data-----------------------
static struct node *list_entry;
static int num_called, num_uncalled;
//------------end of global data-------------------
//------------list functions----------------------
static struct node *newnode(struct student *student){
 struct node *node;
 if((node = (struct node *)malloc(sizeof(struct node))) == NULL)
  exit(-1);
 memcpy(&node->student, student, sizeof(struct student));
 return node;
}
static void append(struct node *node){
 node->next = list_entry;
 list_entry = node;
}
//------------end of list functions--------------
//------------file operations------------------
static void read_data(FILE *file){
 rewind(file);
 while(1){
  struct student buf;
  struct node *node;
  int res = fread(&buf, sizeof(struct student), 1, file);
  if(res != 1){
   break;
  }else{
   if((node =  newnode(&buf)) == NULL)
    exit(-1);
   append(node);
   if(buf.called_times == 1)
    ++num_called;
   else
    ++num_uncalled;
  }
 }
}
static void save_data(FILE *file){
 rewind(file);
 struct node *node;
 int cnt = 0;
 for(node = list_entry; node;)
  if(fwrite(&node->student, sizeof(struct student), 1, file) != 1)
   break;
  else{
   list_entry = node; 
   node = node->next;
   free(list_entry);
   ++cnt;
  }
 printf("%d students saved!\n", cnt);
}
//------------end of file operations------------
//------------cmd functions---------------------
static void show_menu(void){
printf("\n\t-------welcome to rolling system---------\
  \n\t you can  press the CAPITAL charactor or item number to operate.\
  \n\t other charactor are not recognized.\
  \n\t1.show_(A)ll\
  \n\t2.show_(C)alled\
  \n\t3.show_(U)ncaled\
  \n\t4.add_(I)tem\
  \n\t5.(D)el_item\
  \n\t6.call_a_(N)ame\
  \n\t7.(Q)uit\
  \n\t--------------------------------------\
  \n\tenter your choice:");
}
static void show_title(void){
 printf("%-30s%-30s\n", "ID", "NAME");
}
static void show_item(struct student *student){
 printf("%-30s%-30s\n", \
   student->id, \
   student->name \
   );
}
static void show_all(void){
 struct node *node;
 show_title();
 for(node = list_entry; node; node = node->next)
  show_item(&node->student);
}
static void show_called(void){
 struct node *node;
 show_title();
 for(node = list_entry; node; node = node->next)
  if(node->student.called_times == 1)
   show_item(&node->student);
}
static void show_uncalled(void){
 struct node *node;
 show_title();
 for(node = list_entry; node; node = node->next)
  if(node->student.called_times == 0)
   show_item(&node->student);
}
static void refresh(void){
 struct node *node;
 num_uncalled += num_called;
 num_called = 0;
 for(node = list_entry; node; node = node->next)
  node->student.called_times = 0;
 
}
static void call_a_name(void){
 struct node *node;
 int index;
 srand(time(0));
 if(num_uncalled == 0)
  refresh(); // all called_times reset to 0
 show_title();
 index = rand() % num_uncalled;
 for(node = list_entry; node; node = node->next)
  if(node->student.called_times == 0){
   if(index-- == 0)
    break;
  }
 show_item(&node->student);
 node->student.called_times = 1;
 ++num_called;
 --num_uncalled;
}
void add_item(void){
 struct node *node;
 struct student student; 
 student.called_times = 0;
 printf("pls enter new item as follows\n");
 show_title();
 scanf("%s %s",\
   student.id,
   student.name
   );
 node = newnode(&student);
 append(node);
 ++num_uncalled;
}
void del_item(void){
 char id[30];
 struct node *node, *ahead;
 printf("Pls enter the ID you want to delete:");
 scanf("%s", id);
 for(ahead = node = list_entry; node; ahead = node, node = node->next){
  if(strcmp(id, node->student.id)) //id unmatched
   continue;
  else{ //matched
   ahead->next = node->next; //del node;
   node->student.called_times == 0? --num_uncalled : --num_called;
   free(node);
   node = ahead->next;
  }
 }
}
//------------end of cmd functions--------------
int main(void){
 FILE *file;
 char *filename = "student.txt";
 if((file = fopen(filename, "r")) == NULL)
  printf("cannot open %s\n", filename), exit(-2);
 
 read_data(file);
 fclose(file);
 while(1){
  char cmd;
  int select_quit_sign = 0;
  printf("total %d students, called %d, uncalled %d.\n", num_called + num_uncalled, num_called, num_uncalled);
  show_menu();
  scanf("%c", &cmd);
  printf("you cmd is:%c\n", cmd);
  switch(cmd){
   case '1':case 'a':case 'A':
    show_all();
    break;
   case '2':case 'c':case 'C':
    show_called();
    break;
   case '3':case 'u':case 'U':
    show_uncalled();
    break;
   case '4':case 'i':case 'I':
    add_item();
    break;
   case '5':case 'd':case 'D':
    del_item();
    break;
   case '6':case 'n':case 'N':
    call_a_name();
    break;
   case '7':case 'q':case 'Q':
    select_quit_sign = 1;
    break;
   default:
    printf("unknown command!\n");
    break;
  }
  printf("--------"); //bottom of output
  if(select_quit_sign == 1)
   break;
  scanf("%*c"); //clear input buffer
 }
 
 if((file = fopen(filename, "w")) == NULL)
  printf("cannot open %s\n", filename), exit(-2);
 save_data(file);
 
 fclose(file);
 return 0;
}
2. c語言課堂隨機點名
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<time.h>
#defineMAXSTUDENT100
charName[MAXSTUDENT][16];
//讀文件內保存的學生姓名
intreadName(constchar*fileName)
{
intpos,slen;
FILE*fp=fopen(fileName,"r");
if(fp==NULL)return0;
memset(Name,0,sizeof(Name));
pos=0;
while(!feof(fp)&&pos<MAXSTUDENT)
{
fgets(Name[pos],16,fp);
slen=strlen(Name[pos]);
if(slen>0)
{
slen--;
while(Name[pos][slen]==10||Name[pos][slen]==13)Name[pos][slen--]=0;//去掉字元串後的換行符
pos++;
}
}
printf("讀入%d人姓名 ",pos);
fclose(fp);
returnpos;
}
voidmain()
{
charfileName[32];
intn,pos,loop;
charflag[100];
srand(time(NULL));
printf("請輸入學生姓名文件名:");
scanf("%s",fileName);
n=readName(fileName);
if(n==0)
{
printf("讀取錯誤,請確認文件%s是否名是否正確,文件的格式是否正確! ",fileName);
return;
}
getchar();
memset(flag,0,sizeof(flag));
while(1)
{
pos=rand()%n;
loop=0;
while(flag[pos])//可以保證每個人都點到一次
{
if(++loop>n)memset(flag,0,sizeof(flag));
pos=rand()%n;
}
flag[pos]=1;
printf("點%s",Name[pos]);
if(getchar()!=10)break;
}
}
3. 求C語言做的學生點名程序(急......~!!!!!)
#include<stdio.h>
#include<string.h>
main()
{
int a=0,b=0,c=0,d=0;
char chr='O';
char t[]="noEnd";
//char *m[]={"20013011001杜永寧","20013011002王傳華","20013011003殷泳","20013011004楊柳青"};
printf("........... A 開始點名.........end 結束點名...........\n");
printf("........... B 顯示顯示所有同學點名情況 ...........\n");
printf("........... C 保存點名 ...........\n");
printf("........... D 退出點名系統 ...........\n");
FILE *ft;
//fp=fopen("myfile.dat","r");
ft=fopen("baochun.txt","w");
// fscanf(fp,"%s,%s,%s,%s",m[0],m[1],m[2],m[3]);
while(chr!='x')
{
scanf("%c",&chr);
switch(chr)
{
case 'A':
while(strcmp(t,"over")!=0)
{
if(a+b+c+d==12) {a=b=c=d=0; printf ("清零!\n");}
scanf("%s",&t);
if(strcmp(t,"20013011001杜永寧")==0)
{
a++;
if(a<=3) printf("杜永寧已被點%d次\n",a);
if(a>3)
{ a=3;
printf("杜永寧已被點完三次\n");
}
}
else if(strcmp(t,"20013011002王傳華")==0) {
b++;
if(b<=3) printf("王傳華已被點%d次\n",b);
if(b>3)
{b=3;
printf("王傳華已被點完三次\n");}
}
else if(strcmp(t,"20013011003殷泳")==0){
c++;
if(c<=3) printf("殷泳已被點%d次\n",c);
if(c>3)
{c=3;
printf("殷泳已被點完三次\n");
}
}
else if(strcmp(t,"20013011004楊柳青")==0) {
d++;
if(d<=3) printf("楊柳青已被點%d次\n",d);
if(d>3)
{d=3;
printf("楊柳青已被點完三次\n");
}
}
}break;
case 'B': {
printf("20013011001杜永寧已被點過名的次數為%d\n20013011002王傳華已被點過名的次數為%d\ n20013011003殷泳已被點過名的次數為%d\n20013011004楊柳青已被點過名的次數為%d\n",a,b,c,d);}break;
case 'C':{ printf("保存成功\n");
fprintf(ft,"20013011001 杜永寧 已被點過名的次數為%d\n,20013011002 王傳華已被點過名的次數為%d\n,20013011003 殷泳 已被點過名的次數為%d\n,20013011004 楊柳青已被點過名的次數為%d\n",a,b,c,d);}break;
default:break;
}
}//while(chr!='x');
}
4. 求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;
}
這可是我一個字一個字的打出來的,專門為你寫的!~
5. c語言 隨機點名
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#defineSTU_NUM_MAX64//假設最多有64個學生
structStudent
{
charname[10];
intstuID;
}stu[STU_NUM_MAX];
intexist[STU_NUM_MAX];//用以保存被點過名
staticintindex=0;//記住點名的次數
voidIitialize(){
for(inti=0;i<STU_NUM_MAX;i++)exist[i]=0;
}
boolIsExist(intid){
for(inti=0;i<STU_NUM_MAX;i++)
if(exist[i]==id)returntrue;//已存在
returnfalse;//不存在
}
voidAdd()//添加數據
{
FILE*fp;
intstu_num;
printf(" ?:");
scanf("%d",&stu_num);
for(inti=0;i<stu_num;i++){
printf(" ");
printf(" PleaseinputstudentID:");
scanf("%d",&stu[i].stuID);
printf(" Pleaseinputstudentname:");
scanf("%s",stu[i].name);
fflush(stdin);
}
if((fp=fopen("stu.dat","ab"))==NULL) {
printf("Can'topenfile ");
exit(1);
}
for(intj=0;j<stu_num;j++)
{
if(fwrite(&stu[j],sizeof(structStudent),1,fp)!=1)
printf("Errorwritingfile. ");
}
fclose(fp);
}
voidrollcall()//隨機點名
{
FILE*fp;
if((fp=fopen("stu.dat","rb"))==NULL)
{
printf("Can'topenfile. ");
exit(1);
}
srand((unsigned)time(NULL));
inti=0;
intrandID=rand()%(64-1+1)+1;//1~64
printf(" 隨機點到的學號為:%d %s %s ",randID,"StuID","StuName");
do
{
fseek(fp,i*sizeof(structStudent),SEEK_SET);
if(fread(&stu[i],sizeof(structStudent),1,fp))
{
if(stu[i].stuID==randID&&!IsExist(randID)){
printf(" %4d %5s ",stu[i].stuID,stu[i].name);
exist[index++]=randID;
break;}
}
i++;
}while(!feof(fp));
fclose(fp);
}
intmain()
{
intselect=0;
charanswer='y';
Iitialize();
do
{
printf("1.添加數據2.隨機點名3.退出 請選擇:");
fflush(stdin);
scanf("%d",&select);
switch(select)
{
case1:
Add();
break;
case2:
rollcall();
break;
case3:
return0;
}
fflush(stdin);
printf("Youwanttocontinue?:");
scanf("%c",&answer);
}while(answer=='y'||answer=='Y');
return0;
}

上面的代碼,我留下幾個細節問題留給你自己學著解決,都是很簡單的:
上面的代碼,我沒有對重復的學號作判斷。
上面的代碼,我沒有把點名存放到另一個文件,而是用數組替代(可以實現的也很簡單)。我怕寫得代碼太多,網路限制提交。
上面的代碼,是測試數據,stu.dat目標文件並沒有64個學生,我只寫入了12條數據。
上面的代碼,我沒有對數據數量(最多64條)作判斷。
6. 怎麼用C語言編寫隨機點名
使用系統函數 int rand(void)產生偽隨機數,先用void srand(unsigned int seed)函數設置隨機種子,這樣就會產生真正的隨機函數
7. 跪求c語言上課隨機點名程序設計
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#defineSTU_NUM_MAX4
structStudentInfo//學生信息結構
{
charname[15];
intstu_id;
}stu[STU_NUM_MAX];
voidWriteData()//寫入學生信息
{
FILE*fp;
intstu_num=4;
for(inti=0;i<stu_num;i++)
{
printf("請輸入第%d個學生的姓名:",i+1);
scanf("%s",stu[i].name);
printf("請輸入第%d個學生的學號:",i+1);
scanf("%d",&stu[i].stu_id);
}
if((fp=fopen("myfile.dat","ab"))==NULL)
{
printf("Can'topenfile ");
exit(1);
}
for(intj=0;j<stu_num;j++)
{
if(fwrite(&stu[j],sizeof(structStudentInfo),1,fp)!=1)
printf("Errorwritingfile. ");
}
fclose(fp);
}
voidTeacherDM(intstuID)//教師點名
{
FILE*fp;
boolfind_mark=false;
printf(" %s %s ","學號","姓名");
if((fp=fopen("myfile.dat","rb"))==NULL)
{
printf("Can'topenfile ");
exit(1);
}
inti=0;
do
{
fseek(fp,i*sizeof(structStudentInfo),SEEK_SET);
fread(&stu[i],sizeof(structStudentInfo),1,fp);
if(stu[i].stu_id==stuID)
{
printf(" %4d %s ",stu[i].stu_id,stu[i].name);
printf(" 請【%s】同學回答某某問題. ",stu[i].name);
find_mark=true;
break;
}
i++;
}while(!feof(fp));
if(!find_mark)printf(" 未能找到學生號為:%d的記錄! ",stuID);
fclose(fp);
}
voidmain(void)
{
intstuID[4]={2013011001,2013011002,2013011003,2013011004};
//WriteData();
srand((unsigned)time(NULL));//隨機種子
TeacherDM(stuID[rand()%(3-0+1)+0]);
}
運行效果截圖:

另外多說一句,你所說的公正性,是不是指被點名過的同學不會再次被隨機點名到。如果是這個意思,那麼你可以通過數組來設置它,即把點名過的同學的學號或姓名保存到一維數組里,隨機判斷時只需循環檢查下該同學是否已被點名過。這里就留給你做了。
