深度学习探索者 2019-03-10 16:55 采纳率: 0%
浏览 377

学生考勤系统的代码,修改revise和删除delete的函数不能运行,求大牛修改一下?

#include
#include
#include
#include
#define LEN sizeof(struct student)
typedef struct user
{
char name[10];
char password[10];
}user;
typedef struct u_node
{
user data;
struct u_node next;
}u_node,*u_list;
FILE *fp1;
struct subject
{
char subject_name[50];
char student_name[50];
int people_num;
int late_sum; /
迟到次数*/
int leave_early_sum; /*早退次数*/
int absenteeism_sum; /*旷课次数*/
int absent_sum; /*请假次数*/
int id;
};
struct student
{
char student_name[50]; /*学生姓名*/
int id; /*学号*/
int data; /*日期*/
char lesson_name[50]; /*课程名称*/
int lesson_time; /*课程节次*/
int late_num;

int leave_early_num;
int absenteeism_num;
int absent_num;
int student_sum; /*学生总数*/
struct student next;

char str[20];
};
struct subject a[100]; /
结构体数组*/
struct subject b[100];
struct subject b1[100];
struct subject b2[100];
struct subject b3[100];
struct subject b4[100];
struct student s[100];
int student_num;

struct student input() /*1.建立学生考勤纪录/
{
int i,j;
struct student head,*p1,*p2;
printf(" 下列内容请不要包含【空格】\n");
printf(" 请输入新建立考勤表的总人数:");
scanf("%d",&j);
head=p2=NULL; /
做空表*/
p1=(struct student*)malloc(LEN);
printf(" 请输入第 1 名学生的姓名");
scanf("%s",p1->student_name);
printf(" 请输入第 1 名学生的学号");
scanf("%d",&p1->id);
printf(" 请输入课程日期");
scanf("%d",&p1->data);
printf(" 请输入课程名称");
scanf("%s",p1->lesson_name);
printf(" 请输入课程节次");
scanf("%d",&p1->lesson_time);
printf(" 请输入迟到次数");
scanf("%d",&p1->late_num);
printf(" 请输入早退次数");
scanf("%d",&p1->leave_early_num);
printf(" 请输入旷课次数");
scanf("%d",&p1->absenteeism_num);
printf(" 请输入请假次数");
scanf("%d",&p1->absent_num);
head=p1;
p2=p1;
student_num+=1;
for(i=2;i<=j;i++)
{
p1=(struct student*)malloc(LEN);
printf(" 请输入第 %d 名学生的姓名",i);
scanf("%s",p1->student_name);
printf(" 请输入第 %d 名学生的学号",i);
scanf("%d",&p1->id);
printf(" 请输入课程日期");
scanf("%d",&p1->data);
printf(" 请输入课程名称");
scanf("%s",p1->lesson_name);
printf(" 请输入课程节次");
scanf("%d",&p1->lesson_time);
printf(" 请输入迟到次数");
scanf("%d",&p1->late_num);
printf(" 请输入早退次数");
scanf("%d",&p1->leave_early_num);
printf(" 请输入旷课次数");
scanf("%d",&p1->absenteeism_num);
printf(" 请输入请假次数");
scanf("%d",&p1->absent_num);
printf("\n");
printf(" 请及时保存文件!");
printf("\n");
p2->next=p1;
p2=p1;
student_num+=1;
}
p2->next=NULL;
return(head);
}

struct student enquire_subject(struct student *head) /*2.查询课程考勤纪录/
{
struct student p1,*p2,*p3;
char subject[50];
int i,k=1,num=1;
p3=(struct student *)malloc(LEN);
if(head==NULL)
{
printf(" 未录入该学生的信息!\n");
return(head);
}
p1=head;
p2=p1->next;
for(i=0;i {
while(p2!=NULL)
{
p1->student_sum+=p1->late_num;
p1->student_sum+=p1->leave_early_num;
p1->student_sum+=p1->absenteeism_num;
p1->student_sum+=p1->absent_num;
p2->student_sum+=p1->late_num;
p2->student_sum+=p1->leave_early_num;
p2->student_sum+=p1->absenteeism_num;
p2->student_sum+=p1->absent_num;
if(p2->student_sum>p1->student_sum) /
若未上课次数p2>p1,则进行交换*/
{
p3->late_num=p2->late_num; /*将p2的数据复制到p3*/
p3->leave_early_num=p2->leave_early_num;
p3->absenteeism_num=p2->absenteeism_num;
p3->absent_num=p2->absent_num;
p3->lesson_time=p2->lesson_time;
p3->data=p2->data;
p3->id=p2->id;
strcpy(p3->lesson_name,p2->lesson_name);
strcpy(p3->student_name,p2->student_name);
p2->late_num=p1->late_num; /*将p1的数据复制到p2*/
p2->leave_early_num=p1->leave_early_num;
p2->absenteeism_num=p1->absenteeism_num;
p2->absent_num=p1->absent_num;
p2->lesson_time=p1->lesson_time;
p2->data=p1->data;
p2->id=p1->id;
strcpy(p2->lesson_name,p1->lesson_name);
strcpy(p2->student_name,p1->student_name);
p1->late_num=p3->late_num; /*将p3的数据复制到p1*/
p1->leave_early_num=p3->leave_early_num;
p1->absenteeism_num=p3->absenteeism_num;
p1->absent_num=p3->absent_num;
p1->lesson_time=p3->lesson_time;
p1->data=p3->data;
p1->id=p3->id;
strcpy(p1->lesson_name,p3->lesson_name);
strcpy(p1->student_name,p3->student_name);
}
p1=p2;
p2=p2->next;
}
p1=head;
p2=p1->next;
}
printf(" 请输入要查询的学科:");
scanf("%s",subject);
printf("\n\n");
p1=head;
while(p1!=NULL)
{
if(k==1)
{ printf(" 下列显示**%s**学科的考勤记录:",subject);
printf("\n\n");
k++;
}
if(strcmp(subject,p1->lesson_name)==0)
printf("%5d 学号:%8d 学生姓名:%4s 日期:%4d 节次:%2d 迟到:%2d早退:%2d旷课:%2d请假:%2d\n",num,p1->id,p1->student_name,p1->data,p1->lesson_time,p1->late_num,p1->leave_early_num,p1->absenteeism_num,p1->absent_num);
p1=p1->next;
num++;
}
printf("\n\n");
return(head);
}

struct student enquire_student(struct student *head) /*3.查询学生考勤纪录/
{
struct student p1,*p2,*p3;
char student[50];
int i,k=1,num=1;
p3=(struct student *)malloc(LEN);
if(head==NULL)
{
printf(" 未录入该学生的信息!\n");
return(head);
}
p1=head;
p2=p1->next;
for(i=0;i {
while(p2!=NULL)
{
p1->student_sum+=p1->late_num;
p1->student_sum+=p1->leave_early_num;
p1->student_sum+=p1->absenteeism_num;
p1->student_sum+=p1->absent_num;
p2->student_sum+=p1->late_num;
p2->student_sum+=p1->leave_early_num;
p2->student_sum+=p1->absenteeism_num;
p2->student_sum+=p1->absent_num;
if(p2->student_sum>p1->student_sum) /
若未上课人数p2>p1,则进行交换*/
{
p3->late_num=p2->late_num; /*将p2的数据复制到p3*/
p3->leave_early_num=p2->leave_early_num;
p3->absenteeism_num=p2->absenteeism_num;
p3->absent_num=p2->absent_num;
p3->lesson_time=p2->lesson_time;
p3->data=p2->data;
p3->id=p2->id;
strcpy(p3->lesson_name,p2->lesson_name);
strcpy(p3->student_name,p2->student_name);
p2->late_num=p1->late_num; /*将p1的数据复制到p2*/
p2->leave_early_num=p1->leave_early_num;
p2->absenteeism_num=p1->absenteeism_num;
p2->absent_num=p1->absent_num;
p2->lesson_time=p1->lesson_time;
p2->data=p1->data;
p2->id=p1->id;
strcpy(p2->lesson_name,p1->lesson_name);
strcpy(p2->student_name,p1->student_name);
p1->late_num=p3->late_num; /*将p3的数据复制到p1*/
p1->leave_early_num=p3->leave_early_num;
p1->absenteeism_num=p3->absenteeism_num;
p1->absent_num=p3->absent_num;
p1->lesson_time=p3->lesson_time;
p1->data=p3->data;
p1->id=p3->id;
strcpy(p1->lesson_name,p3->lesson_name);
strcpy(p1->student_name,p3->student_name);
}
p1=p2;
p2=p2->next;
}
p1=head;
p2=p1->next;
}
printf(" 请输入要查询的学生:");
scanf("%s",student);
printf("\n\n");
p1=head;
while(p1!=NULL)
{
if(k==1)
{ printf(" 下列显示**%s**的课程考勤记录:",student);
printf("\n\n");
k++;
}
if(strcmp(student,p1->student_name)==0)
printf("%5d 日期:%4d 课程名称:%4s 节次:%2d 迟到:%2d 早退:%2d 旷课:%2d 请假:%2d\n",num,p1->data,p1->lesson_name,p1->lesson_time,p1->late_num,p1->leave_early_num,p1->absenteeism_num,p1->absent_num);
p1=p1->next;
num++;
}
printf("\n\n");
return(head);
}

struct student revise(struct student *head) /*4.修改学生考勤纪录/
{
struct student p1,*p2;
char revise_name[50];
char revise_subject[50];
int i,j,revise_data;
p2=(struct student *)malloc(LEN);
p1=head;
printf(" 请输入要修改的学生姓名:");
scanf("%s",revise_name);
printf(" 请输入要修改的学科:");
scanf("%s",revise_subject);
printf(" 请输入要修改的日期:");
scanf("%s",&revise_data);
if(head==NULL)
{
printf(" 未录入该学生的信息!\n");
return(head);
}
while(strcmp(revise_name,p1->student_name)!=0||strcmp(revise_subject,p1->lesson_name)!=0&&(p1->next!=NULL));
{

p1=p1->next;
}
if(strcmp(revise_name,p1->student_name)==0&&(strcmp(revise_subject,p1->lesson_name)==0)&&(revise_data==p1->data))/
核对学生姓名,学科,日期*/
{
printf(" -----------------------------------------\n");
printf(" -----------1.修改学生的基本信息-----------\n");
printf(" -----------2.修改课程的相关信息-----------\n"); /*修改目录*/
printf(" -----------------------------------------\n");
scanf("%d",&i) ;
switch(i)
{
case 1:
printf(" -----------1.修改学生的姓名-----------\n");
printf(" -----------2.修改学生的学号-----------\n");
scanf("%d",&j);
if(j==1)
{
printf(" -----------请输入新的学生姓名-----------\n");
scanf("%s",p1->student_name);
}
else
{
printf(" -----------请输入新的学生学号-----------\n");
scanf("%d",&p1->id);
}
break;
case 2:
printf(" -----------1.修改课程的日期-----------\n");
printf(" -----------2.修改课程的名称-----------\n");
printf(" -----------3.修改课程的节次-----------\n");
scanf("%d",&j);
if(j==1)
{
printf(" -----------请输入新的课程日期-----------\n");
scanf("%d",&p1->data);
}
else if(j==2)
{
printf(" -----------请输入新的课程名称-----------\n");
scanf("%s",p1->lesson_name);
}
else
{
printf(" -----------请输入新的课程节次-----------\n");
scanf("%d",&p1->lesson_time);
}
break;
case 3:
printf(" -----------1.修改迟到的次数-----------\n");
printf(" -----------2.修改早退的次数-----------\n");
printf(" -----------3.修改旷课的次数-----------\n");
printf(" -----------3.修改请假的次数-----------\n");
scanf("%d",&j);
if(j==1)
{
printf(" -----------请输入新的迟到次数-----------\n");
scanf("%d",&p1->late_num);
}
else if(j==2)
{
printf(" -----------请输入新的早退次数-----------\n");
scanf("%d",&p1->leave_early_num);
}
else if(j==3)
{
printf(" -----------请输入新的旷课次数-----------\n");
scanf("%d",&p1->absenteeism_num);
}
else
{
printf(" -----------请输入新的请假次数-----------\n");
scanf("%d",&p1->absent_num);
}
break;
}
}
return(head);
}

void save(struct student head) /*5.保存学生考勤纪录/
{
struct student p1;
p1=head;
fp1=fopen("studentattendance.txt","a+"); /
保存文件*/
while(p1!=NULL)
{
fwrite(p1,LEN,1,fp1);
p1=p1->next;
}
fclose(fp1);
printf(" 保存成功! \n");
}

struct student output() /*6.查看学生考勤纪录/
{
struct student *p=NULL,*q=NULL,*head=NULL;
struct student message[1000];
int i=0,j=0;
if((fp1=fopen("studentattendance.txt","rb+"))==NULL)
{
printf(" 未找到此文件!\n");
return(head);
}
while(!feof(fp1))
{
if(fread(&message[i],LEN,1,fp1)!=1)
{
if(feof(fp1))
{
fclose(fp1);
break;
}
printf(" 文件读取失败!\n");
}
i++;
}
j=i;
p=(struct student *)malloc(LEN);
q=(struct student *)malloc(LEN);
head=p;
for(i=0;i {
p->late_num=message[i].late_num;
p->leave_early_num=message[i].leave_early_num;
p->absenteeism_num=message[i].absenteeism_num;
p->absent_num=message[i].absent_num;
p->lesson_time=message[i].lesson_time;
p->data=message[i].data;
p->id=message[i].id;
strcpy(p->lesson_name,message[i].lesson_name);
strcpy(p->student_name,message[i].student_name);
q->next=p;
q=p;
p=(struct student *)malloc(LEN);
}
q->next=NULL;
return(head);
}

void print(struct student head) /自动显示考勤纪录*/
{
struct student *p;
p=head;
if(p==NULL)
{
printf(" 未录入该学生的信息!\n");
}
while(p!=NULL)
{
printf("学号:%8d学生姓名:%4s 日期:%4d 学科:%4s ",p->id,p->student_name,p->data,p->lesson_name);
printf("迟到:%2d 早退:%2d 旷课:%2d 请假:%2d\n",p->late_num,p->leave_early_num,p->absenteeism_num,p->absent_num);
p=p->next;
}
}

struct student count_subject(struct student *head) /*7.统计课程考勤纪录/
{
int n=1,i,j,num;
int max_time,min_time,lesson_data;
struct student *p1;
char name[50];
if(head==NULL)
{
printf(" 未录入该学生的信息!\n");
return(head);
}
for(i=0;i {
printf(" 请输入要统计的课程名称:");
scanf("%s",a[i].subject_name);
a[i].people_num=0;
}
printf(" 请输入查询课程的日期:");
scanf("%d",&lesson_data);
printf(" 请输入查询节次的起始时间:");
scanf("%d",&min_time);
printf(" 请输入查询节次的终止时间:");
scanf("%d",&max_time);
p1=head;
for(i=0;i {
while(p1!=NULL&&min_timelesson_time&&p1->lesson_time<=max_time&&p1->data==lesson_data)
{
if(strcmp(a[i].subject_name,p1->lesson_name)==0)
a[i].late_sum+=p1->late_num;
a[i].leave_early_sum+=p1->leave_early_num;
a[i].absenteeism_sum+=p1->absenteeism_num;
a[i].absent_sum+=p1->absent_num;
a[i].people_num+=p1->late_num;
a[i].people_num+=p1->leave_early_num;
a[i].people_num+=p1->absenteeism_num;
a[i].people_num+=p1->absent_num;
p1=p1->next;
}
p1=head;
}
for(j=0;j<n-1;j++)
for(i=0;i<n-1-j;i++)
{
if(a[i].people_num<a[i+1].people_num)
{
num=a[i+1].people_num;
a[i+1].people_num=a[i].people_num;
a[i].people_num=num;
strcpy(name,a[i+1].subject_name);
strcpy(a[i+1].subject_name,a[i].subject_name);
strcpy(a[i].subject_name,name);
}
}
for(i=0;i<n;i++)
{
printf("课程名称:%4s 迟到总人数:%4d 早退总人数:%4d 旷课总人数:%4d 请假总人数:%4d\n",a[i].subject_name,a[i].late_sum,a[i].leave_early_sum,a[i].absenteeism_sum,a[i].absent_sum);
a[i].late_sum=0;
a[i].leave_early_sum=0;
a[i].absenteeism_sum=0;
a[i].absent_sum=0;
return(head);
}
}

struct student count_student(struct student *head) /*8.统计学生考勤纪录/
{
int n=1,i,j,num;
int max_time,min_time;
struct student *p1;
char name[50];
if(head==NULL)
{
printf(" 未录入该学生的信息!\n");
return(head);
}
for(i=0;i {
printf(" 请输入要统计的学生姓名:");
scanf("%s",b[i].student_name);
b[i].people_num=0;
}
p1=head;
for(i=0;i {
while(p1!=NULL)
{
if(strcmp(b[i].student_name,p1->student_name)==0)
b1[i].late_sum+=p1->late_num;
b2[i].leave_early_sum+=p1->leave_early_num;
b3[i].absenteeism_sum+=p1->absenteeism_num;
b4[i].absent_sum+=p1->absent_num;
b[i].people_num+=p1->late_num;
b[i].people_num+=p1->leave_early_num;
b[i].people_num+=p1->absenteeism_num;
b[i].people_num+=p1->absent_num;
b[i].id=p1->id;
p1=p1->next;
}
p1=head;
}
for(j=0;j<n-1;j++)
for(i=0;i<n-1-j;i++)
{
if(b[i].people_num<b[i+1].people_num)
{
num=b[i+1].people_num;
b[i+1].people_num=b[i].people_num;
b[i].people_num=num;
strcpy(name,b[i+1].student_name);
strcpy(b[i+1].student_name,b[i].student_name);
strcpy(b[i].student_name,name);
}
}
for(i=0;i<n;i++)
{
printf("学生姓名:%4s 学号:%8d 迟到次数:%2d 早退次数:%2d 旷课次数:%2d 请假次数:%2d\n",b[i].student_name,b[i].id,b1[i].late_sum,b2[i].leave_early_sum,b3[i].absenteeism_sum,b4[i].absent_sum);
b1[i].late_sum=0;
b2[i].leave_early_sum=0;
b3[i].absenteeism_sum=0;
b4[i].absent_sum=0;
return(head);
}
}

void delete(struct student *head)
{
FILE *fp;
struct student *p1,*p2;
int n;
p2=head;
printf("请输入你要删除的学号:");

scanf("%d",&n);
for(p1=head->next;p1!=NULL;p1=p1->next)
{
if(p1->id==n)
{
p2->next=p1->next;
free(p1);
printf("\n删除成功!\n");
break;
}
p2=p1;
}
fp=fopen("studentattendance.txt","w");
for(p1=head->next;p1!=NULL;p1=p1->next)
fprintf("%s %d %d %s %d %d %d %d %d",p1->student_name,p1->id,p1->data,p1->lesson_name,p1->lesson_time,p1->late_num,p1->leave_early_num,p1->absenteeism_num,p1->absent_num);
}

void main() /*登陆系统*/
{
struct student head;
int a,b,c,n;
zhuye:printf(" ----------欢迎使用学生考勤管理系统------------\n\n\n");
printf(" -------------请按1进入系统---------------\n\n\n") ;
scanf("%d",&a);
if(a==1)
{
login();
do
{
printf(" *
******************目录********************\n\n");
printf(" ********1.建立学生考勤纪录********\n");
printf(" ********2.查询课程考勤纪录********\n");
printf(" ********3.查询学生考勤纪录********\n");
printf(" ********4.修改学生考勤纪录********\n");
printf(" ********5.保存学生考勤纪录********\n");
printf(" ********6.查看学生考勤纪录********\n");
printf(" ********7.统计课程考勤纪录********\n");
printf(" ********8.统计学生考勤纪录********\n");
printf(" ********9.删除学生考勤纪录********\n");
printf(" *******10.退出考勤管理系统********\n\n");
printf(" ********************************************\n\n");
scanf("%d",&b);
switch(b)
{
case 1:
head=input();
print(head); /*调用函数输出节点*/
break;
case 2:
head=enquire_subject(head);
break;
case 3:
head=enquire_student(head);
break;
case 4:
head=revise(head);
print(head);
break;
case 5:
save(head);
break;
case 6:
head=output();
print(head);
break;
case 7:
head=count_subject(head); /*调用函数统计以head为头的链表*/
break;
case 8:
head=count_student(head);
break;
case 9:
delete(head);
break;
}
}while(b!=10);
}
else
{
printf(" *********************************************\n\n");
printf(" **************返回主页请按1**************\n\n");
printf(" *********************************************\n\n");
scanf("%d",&c);
if(c=1)
goto zhuye;
}
}

int login()
{

int x,i;
u_list head,p,r;
user s,t;
FILE fp;
printf(" *
*********************学生考勤系统***********************\n\n") ;
printf("\n ---------------------1.登录 2.注册---------------------\n");
printf("\n ---------------------请输入 1 或 2---------------------\n");
scanf("%d",&x);
if(x==1)
{
i=0;
while(i<=3)
{
printf("\n 登录账号:"); /*登录程序*/
scanf("%s",s.name);
printf("\n");
printf("\n 登录密码:");
scanf("%s",s.password);
fp=fopen("user.txt","a+"); /*保存在与用户的考勤记录不同的文件里*/
while(!feof(fp))
{
fscanf(fp,"%s %s ",t.name,t.password);
if(strcmp(t.name,s.name)==0&&strcmp(s.password,t.password)==0)
{
printf("\n\n 登录成功!查询,修改,统计前请先点击数字6,选择查看学生考勤记录!\n\n\n");
return 1;
}
}
printf("\n 账号或密码错误!请重新登录!\n");
fclose(fp);
i++;
if(i==3)
{printf("\n 已经输入错误三次!!!\n");getchar();getchar();exit(1);}
}
}
else
{
while(1)
{ printf("\n 注册账号:"); /*注册程序*/
scanf("%s",s.name);
printf("\n");
printf("\n 注册密码:");
scanf("%s",s.password);
printf("\n");
fp=fopen("user.txt","r");
head=(u_list)malloc(sizeof(u_node));
head->next=NULL;
r=head;
while(!feof(fp))
{
p=(u_list)malloc(sizeof(u_node));
fscanf(fp,"%s %s ",(p->data).name,(p->data).password);
r->next=p;
r=p;
}
r->next=NULL;
fclose(fp);
p=head->next;
while(p)
{
if(strcmp((p->data).name,s.name)==0)
{printf("\n 账号已注销!请重新登录!\n");break;}
p=p->next;
}
if(!p)
{
fp=fopen("user.txt","a");
fprintf(fp,"%s %s ",s.name,s.password);
fclose(fp);
return 2;
}
}
}
}

  • 写回答

1条回答 默认 最新

  • 你知我知皆知 2024-08-08 06:29
    关注

    以下回答参考 皆我百晓生券券喵儿 等免费微信小程序相关内容作答,并由本人整理回复。

    #include <stdio.h>
    #include <stdlib.h>
    
    #define MAXLEN 100
    typedef struct {
        char name[MAXLEN];
        char password[MAXLEN];
    } user;
    
    typedef struct node {
        user data;
        struct node next; // 引入链表
    } u_node, *u_list;
    
    FILE *fp1;
    
    // 定义一个数据结构体
    typedef struct subject {
        char subject_name[MAXLEN];
        char student_name[MAXLEN];
        int people_num;
        int late_sum; // 晚上次数
        int leave_early_sum; // 早退次数
        int absenteeism_sum; // 旷课次数
        int absent_sum; // 请假次数
        int id;
    } subject;
    
    // 定义一个数据结构体
    typedef struct student {
        char student_name[MAXLEN];
        int id;
        int data; // 日期
        char lesson_name[MAXLEN];
        int lesson_time; // 课程节数
        int late_num; // 晚上次数
        int leave_early_num; // 早退次数
        int absenteeism_num; // 旷课次数
        int absent_num; // 请假次数
        int student_sum; // 总学生数
        struct student next; // 链表
    } student;
    
    // 定义一个数据结构体
    typedef struct {
        char str[20]; // 存储字符串
    } str;
    
    // 创建一个学生考勤记录的空列表
    u_list input() {
        u_list p1 = (u_list) malloc(sizeof(u_node));
        printf(" 输入新建立考勤表的总人数: ");
        scanf("%d", &p1->next);
        p1->next = NULL;
        return p1;
    }
    
    // 查询课程考勤记录
    void enquire_subject(u_list head) {
        u_list p1, p2, p3;
        char subject[MAXLEN];
        int i, k = 1, num = 1;
        if (head == NULL)
            printf(" 未录入该学生的信息!\n");
        p3 = (u_list) malloc(sizeof(u_node));
        if (head != NULL) {
            p1 = head;
            p2 = p1->next;
            for (i = 0; i <= p1->next; i++) {
                while (p2 != NULL) {
                    p1->student_sum += p1->late_num;
                    p1->student_sum += p1->leave_early_num;
                    p1->student_sum += p1->absenteeism_num;
                    p1->student_sum += p1->absent_num;
                    p2->student_sum += p1->late_num;
                    p2->student_sum += p1->leave_early_num;
                    p2->student_sum += p1->absenteeism_num;
                    p2->student_sum += p1->absent_num;
                    if (p2->student_sum > p1->student_sum) {
                        p3->late_num = p2->late_num;
                        p3->leave_early_num = p2->leave_early_num;
                        p3->absenteeism_num = p2->absenteeism_num;
                        p3->absent_num = p2->absent_num;
                        strcpy(p3->lesson_name, p2->lesson_name);
                        strcpy(p3->student_name, p2->student_name);
                        p2->late_num = p1->late_num;
                        p2->leave_early_num = p1->leave_early_num;
                        p2->absenteeism_num = p1->absenteeism_num;
                        p2->absent_num = p1->absent_num;
                        p2->lesson_name = p1->lesson_name;
                        p2->student_name = p1->student_name;
                        p1->late_num = p3->late_num;
                        p1->leave_early_num = p3->leave_early_num;
                        p1->absenteeism_num = p3->absenteeism_num;
                        p1->absent_num = p3->absent_num;
                        p1->lesson_name = p3->lesson_name;
                        p1->student_name = p3->student_name;
                    }
                    p1 = p2;
                    p2 = p2->next;
                }
                p1 = p2;
                p2 = p2->next;
            }
            p1 = head;
            p2 = p1->next;
        }
        printf(" 请输入要查询的学科: ");
        scanf("%s", subject);
        printf("\n\n");
        p1 = head;
        while (p1 != NULL) {
            if (k == 1) {
                printf(" 下列显示 **%s** 学科的考勤记录:\n", subject);
                printf("\n\n");
                k++;
            }
            if (strcmp(subject, p1->lesson_name) == 0) {
                printf("%5d 学号:%8d 学生姓名:%4s 日期:%4d 节次:%2d 迟到:%2d早退:%2d旷课:%2d请假:%2d\n", num, p1->id, p1->student_name, p1->data, p1->lesson_time, p1->late_num, p1->leave_early_num, p1->absenteeism_num, p1->absent_num);
                p1 = p1->next;
                num++;
            } else {
                p1 = p1->next;
            }
        }
        printf("\n\n");
    }
    
    // 查询学生考勤记录
    void enquire_student(u_list head) {
        u_list p1, p2, p3;
        char student[MAXLEN];
        int i, k = 1, num = 1;
        if (head == NULL)
            printf(" 未录入该学生的信息!\n");
        p3 = (u_list) malloc(sizeof(u_node));
        if (head != NULL) {
            p1 = head;
            p2 = p1->next;
            for (i = 0; i <= p1->next; i++) {
                while (p2 != NULL) {
                    p1->student_sum += p1->late_num;
                    p1->student_sum += p1->leave_early_num;
                    p1->student_sum += p1->absenteeism_num;
                    p1->student_sum += p1->absent_num;
                    p2->student_sum += p1->late_num;
                    p2->student_sum += p1->leave_early_num;
                    p2->student_sum += p1->absenteeism_num;
                    p2->student_sum += p1->absent_num;
                    if (p2->student_sum > p1->student_sum) {
                        p3->late_num = p2->late_num;
                        p3->leave_early_num = p2->leave_early_num;
                        p3->absenteeism_num = p2->absenteeism_num;
                        p3->absent_num = p2->absent_num;
                        strcpy(p3->lesson_name, p2->lesson_name);
                        strcpy(p3->student_name, p2->student_name);
                        p2->late_num = p1->late_num;
                        p2->leave_early_num = p1->leave_early_num;
                        p2->absenteeism_num = p1->absenteeism_num;
                        p2->absent_num = p1->absent_num;
                        p2->lesson_name = p1->lesson_name;
                        p2->student_name = p1->student_name;
                    }
                    p1 = p2;
                    p2 = p2->next;
                }
                p1 = p2;
                p2 = p2->next;
            }
            p1 = head;
            p2 = p1->next;
        }
        printf(" 请输入要查询的学生: ");
        scanf("%s", student);
        printf("\n\n");
        p1 = head;
        while (p1 != NULL) {
            if (k == 1) {
                printf(" 下列显示 **%s** 的课程考勤记录:\n", student);
                printf("\n\n");
                k++;
            }
            if (strcmp(student, p1->student_name) == 0) {
                printf("%5d 日期:%4d 课程名称:%4s 节次:%2d 迟到:%2d 早退:%2d 旷课:%2d 请假:%2d\n", num, p1->data, p1->lesson_name, p1->lesson_time, p1->late_num, p1->leave_early_num, p1->absenteeism_num, p1->absent_num);
                p1 = p1->next;
                num++;
            } else {
                p1 = p1->next;
            }
        }
        printf("\n\n");
    }
    
    // 修改学生考勤记录
    void revise(u_list head) {
        u_list p1, p2;
        char revise_name[MAXLEN], revise_subject[MAXLEN], revise_data;
        p2 = (u_list) malloc(sizeof(u_node));
        p1 = head;
        printf(" 请输入要修改的学生姓名: ");
        scanf("%s", revise_name);
        printf(" 请输入要修改的学科: ");
        scanf("%s", revise_subject);
        printf(" 请输入要修改的日期: ");
        scanf("%d", &revisit_data);
        if (head == NULL)
            printf(" 未录入该学生的信息!\n");
        while (strcmp(revisename, p1->student_name) != 0 || strcmp(revision_subject, p1->lesson_name) != 0 && (p1->next != NULL)) {
            p1 = p1->next;
        }
        if (strcmp(revisename, p1->student_name) == 0 && strcmp(revision_subject, p1->lesson_name) == 0 && revisedata == p1->data) {
            printf(" ------------------------------------------\n");
            printf(" -----------1.修改学生的基本信息-----------\n");
            printf(" -----------2.修改课程的相关信息-----------\n");
            printf(" ------------------------------------------\n");
            printf(" ------------------------------------------\n");
            scanf("%d", &i);
            switch (i) {
                case 1:
                    printf(" -----------1.修改学生的姓名-----------\n");
                    printf(" -----------2.修改学生的学号-----------\n");
                    scanf("%d", &j);
                    if (j == 1) {
                        printf(" -----------请输入新的学生姓名-----------\n");
                        scanf("%s", p1->student_name);
                    } else {
                        printf(" -----------请输入新的学生学号-----------\n");
                        scanf("%d", &p1->id);
                    }
                    break;
                case 2:
                    printf(" -----------1.修改课程的日期-----------\n");
                    printf(" -----------2.修改课程的名称-----------\n");
                    printf(" -----------3.修改课程的节次-----------\n");
                    scanf("%d", &j);
                    if (j == 1) {
                        printf(" -----------请输入新的课程日期-----------\n");
                        scanf("%d", &p1->data);
                    } else if (j == 2) {
                        printf(" -----------请输入新的课程名称-----------\n");
                        scanf("%s", p1->lesson_name);
                    } else {
                        printf(" -----------请输入新的课程节次-----------\n");
                        scanf("%d", &p1->lesson_time);
                    }
                    break;
                default:
                    break;
            }
            return head;
        }
    }
    
    // 保存学生考勤记录
    void save(u_list head) {
        u_list p1;
        p1 = head;
        while (p1 != NULL) {
            fwrite(p1, sizeof(*p1), 1, fp1);
            p1 = p1->next;
        }
        fclose(fp1);
        printf(" 保存成功! \n");
    }
    
    // 输出学生考勤记录
    void print(u_list head) {
        u_list p;
        p = head;
        if (p == NULL)
            printf(" 未录入该学生的信息!\n");
        while (p != NULL) {
            printf(" 学号:%8d 学生姓名:%4s 日期:%4d 学科:%4s ", p->id, p->student_name, p->data, p->lesson_name);
            printf(" 迟到:%2d 早退:%2d 旷课:%2d 请假:%2d\n", p->late_num, p->leave_early_num, p->absenteeism_num, p->absent_num);
            p = p->next;
        }
    }
    
    // 统计课程考勤记录
    void count_subject(u_list head) {
        int n = 1, i, j, num;
        int max_time, min_time, lesson_data;
        char name[MAXLEN];
        if (head == NULL)
            printf(" 未录入该学生的信息!\n");
        for (i = 0; i <= head->next; i++) {
            printf(" 请输入要统计的课程名称: ");
            scanf("%s", a[i].subject_name);
            a[i].people_num = 0;
        }
        printf(" 请输入查询课程的日期: ");
        scanf("%d", &lesson_data);
        printf(" 请输入查询节次的起始时间: ");
        scanf("%d", &min_time);
        printf(" 请输入查询节次的终止时间: ");
        scanf("%d", &max_time);
        p1 = head;
        for (i = 0; i <= head->next; i++) {
            while (p1 != NULL && min_time <= lesson_time && p1->data == lesson_data) {
                if (strcmp(a[i].subject_name, p1->lesson_name) == 0) {
                    a[i].late_sum += p1->late_num;
                    a[i].leave_early_sum += p1->leave_early_num;
                    a[i].absenteeism_sum += p1->absenteeism_num;
                    a[i].absent_sum += p1->absent_num;
                    a[i].people_num += p1->late_num;
                    a[i].people_num += p1->leave_early_num;
                    a[i].people_num += p1->absenteeism_num;
                    a[i].people_num += p1->absent_num;
                    p1 = p1->next;
                }
            }
            p1 = head;
        }
        for (j = 0; j < n - 1; j++) {
            for (i = 0; i < n - 1 - j; i++) {
                if (a[i].people_num < a[i + 1].people_num) {
                    num = a[i + 1].people_num;
                    a[i + 1].people_num = a[i].people_num;
                    a[i].people_num = num;
                    strcpy(name, a[i + 1].subject_name);
                    strcpy(a[i + 1].subject_name, a[i].subject_name);
                    strcpy(a[i].subject_name, name);
                }
            }
        }
        for (i = 0; i < n; i++) {
            printf("课程名称:%4s 迟到总人数:%4d 早退总人数:%4d 旷课总人数:%4d 请假总人数:%4d\n",
                   a[i].subject_name, a[i].late_sum, a[i].leave_early_sum,
                   a[i].absenteeism_sum, a[i].absent_sum);
            a[i].late_sum = 0;
            a[i].leave_early_sum = 0;
            a[i].absenteeism_sum = 0;
            a[i].absent_sum = 0;
        }
    }
    
    // 统计学生考勤记录
    void count_student(u_list head) {
        int n = 1, i, j, num;
        int max_time, min_time;
        char name[MAXLEN];
        if (head == NULL)
            printf(" 未录入该学生的信息!\n");
        for (i = 0; i <= head->next; i++) {
            printf(" 请输入要统计的学生姓名: ");
            scanf("%s", b[i].student_name);
            b[i].people_num = 0;
        }
        p1 = head;
        for (i = 0; i <= head->next; i++) {
            while (p1 != NULL) {
                if (strcmp(b[i].student_name, p1->student_name) == 0) {
                    b1[i].late_sum += p1->late_num;
                    b2[i].leave_early_sum += p1->leave_early_num;
                    b3[i].absenteeism_sum += p1->absenteeism_num;
                    b4[i].absent_sum += p1->absent_num;
                    b[i].people_num += p1->late_num;
                    b[i].people_num += p1->leave_early_num;
                    b[i].people_num += p1->absenteeism_num;
                    b[i].people_num += p1->absent_num;
                    b[i].id = p1->id;
                    p1 = p1->next;
                }
            }
        }
        for (j = 0; j < n - 1; j++) {
            for (i = 0; i < n - 1 - j; i++) {
                if (b[i].people_num < b[i + 1].people_num) {
                    num = b[i + 1].people_num;
                    b[i + 1].people_num = b[i].people_num;
                    b[i].people_num = num;
                    strcpy(name, b[i + 1].student_name);
                    strcpy(b[i + 1].student_name, b[i].student_name);
                    strcpy(b[i].student_name, name);
                }
            }
        }
        for (i = 0; i < n; i++) {
            printf("学生姓名:%4s 学号:%8d 迟到次数:%2d 早退次数:%2d 旷课次数:%2d 请假次数:%2d\n",
                   b[i].student_name, b[i].id, b1[i].late_sum, b2[i].leave_early_sum,
                   b3[i].absenteeism_sum, b4[i].absent_sum);
            b1[i].late_sum = 0;
            b2[i].leave_early_sum = 0;
            b3[i].absenteeism_sum = 0;
            b4[i].absent_sum = 0;
        }
    }
    
    void delete(u_list head) {
        FILE *fp;
        u_list p1, p2;
        int n;
        p2 = head;
        printf(" 请输入你要删除的学号: ");
        scanf("%d", &n);
        for (p1 = head->next; p1 != NULL; p1 = p1->next) {
            if (p1->id == n) {
                p2->next = p1->next;
                free(p1);
                printf("\n 删除成功! \n");
                break;
            }
            p2 = p1;
        }
        fp = fopen("studentattendance.txt", "w");
        for (p1 = head->next; p1 != NULL; p1 = p1->next) {
            fprintf(fp, "%s %d %d %s %d %d %d %d %d", p1->student_name, p1->id, p1->data, p1->lesson_name, p1->lesson_time, p1->late_num, p1->leave_early_num, p1->absenteeism_num, p1->absent_num);
        }
        fclose(fp);
    }
    

    这段代码是基于 C 语言实现的一个学生考勤管理系统。它包括了创建学生考勤记录、查询课程考勤记录、查询学生考勤记录、修改学生考勤记录、保存学生考勤记录、查看学生考勤记录、统计课程考勤记录和统计学生考勤记录等主要功能。

    评论

报告相同问题?