深度学习探索者 2019-03-10 16:55
浏览 372

学生考勤系统的代码,修改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;
}
}
}
}

  • 写回答

0条回答 默认 最新

    报告相同问题?

    悬赏问题

    • ¥15 我想在一个软件里添加一个优惠弹窗,应该怎么写代码
    • ¥15 fluent的在模拟压强时使用希望得到一些建议
    • ¥15 STM32驱动继电器
    • ¥15 Windows server update services
    • ¥15 关于#c语言#的问题:我现在在做一个墨水屏设计,2.9英寸的小屏怎么换4.2英寸大屏
    • ¥15 模糊pid与pid仿真结果几乎一样
    • ¥15 java的GUI的运用
    • ¥15 Web.config连不上数据库
    • ¥15 我想付费需要AKM公司DSP开发资料及相关开发。
    • ¥15 怎么配置广告联盟瀑布流