当前位置:首页 » 编程语言 » c语言的点名程序

c语言的点名程序

发布时间: 2023-12-07 09:27:35

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;
}

上面的代码,我留下几个细节问题留给你自己学着解决,都是很简单的:

  1. 上面的代码,我没有对重复的学号作判断。

  2. 上面的代码,我没有把点名存放到另一个文件,而是用数组替代(可以实现的也很简单)。我怕写得代码太多,网络限制提交。

  3. 上面的代码,是测试数据,stu.dat目标文件并没有64个学生,我只写入了12条数据。

  4. 上面的代码,我没有对数据数量(最多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]);

}

运行效果截图:


另外多说一句,你所说的公正性,是不是指被点名过的同学不会再次被随机点名到。如果是这个意思,那么你可以通过数组来设置它,即把点名过的同学的学号或姓名保存到一维数组里,随机判断时只需循环检查下该同学是否已被点名过。这里就留给你做了。

热点内容
pspfifa无缓存 发布:2025-01-24 16:45:13 浏览:164
androidhandler机制 发布:2025-01-24 16:41:10 浏览:935
安卓系统如何下载aov 发布:2025-01-24 16:29:53 浏览:572
iptables允许ip访问 发布:2025-01-24 16:19:58 浏览:931
安卓80如何识别存储卡权限 发布:2025-01-24 16:19:54 浏览:231
存储介质价格 发布:2025-01-24 16:19:18 浏览:150
删除多个表sql 发布:2025-01-24 16:10:57 浏览:595
安卓设备版本哪里看 发布:2025-01-24 16:06:00 浏览:549
编译错误参数不可选 发布:2025-01-24 16:00:51 浏览:289
仓储软件用什么服务器 发布:2025-01-24 16:00:03 浏览:626