#include <stdio.h> #include <stdlib.h> #include <string.h> #include <conio.h>
//课程结构体 typedef struct cou { char name[40];//课程名 float sco;//成绩 struct cou* next; }cou;
//学生结构体 typedef struct stu { int num;//学号 char name[40];//姓名 float ave;//平均分 int cnum;//课程数目 cou *chead;//课程结构体的头指针 cou *ctail;//课程结构体的尾指针 struct stu *next; }stu;
//全局指针 stu *head=NULL;//指向学生链表的第一个结构体 stu *tail=NULL;//指向学生链表的最后一个
/*************************************************************************** 功能:用于加载文件内容到结构体链表: void ini(); ***************************************************************************/ void ini() { FILE *fp; fp=fopen("stu.txt","r");
if (fp==NULL) { printf("/n提示:学生文件不存在!"); return ; }
int n=0; fread(&n,sizeof(int),1,fp);
for (int i=0; i<n; i++) { stu *p=(stu*)malloc(sizeof(stu)); fread(p,sizeof(stu),1,fp); p->next=NULL; p->chead=NULL; p->ctail=NULL; // printf("/n初始化学生%s信息成功!",p->name); //----------------------- for (int j=0;j<p->cnum;j++) { cou *q=(cou*)malloc(sizeof(cou)); fread(q,sizeof(cou),1,fp); q->next=NULL; if (p->chead==NULL) { p->chead=q; p->ctail=q; } else { p->ctail->next=q; p->ctail=q; } // printf("/n |--->初始化学生%s的%s课程信息成功!",p->name,q->name); } //-------------------------- if (head==NULL) { head=p; tail=p; } else { tail->next=p; tail=p; }
} fclose(fp);
} /****************************************************************************** 功能:增加一个学生到学生结构体链表 : void addstu() ******************************************************************************/ void addstu() { printf("/n/n/n[ 增 加 学 生 ] "); printf("/n/n请输入学号(整数): ");
loop:
int num=0; scanf("%d",&num);
//--------------------- //检查学号是否重复 stu *h=head; while (h) { if (h->num==num) { printf("/n提示:学号已存在!/n请重新输入学号: "); goto loop; } h=h->next; } //--------------------- stu *p=(stu*)malloc(sizeof(stu)); p->ave=0.0; p->cnum=0; p->chead=NULL; p->ctail=NULL; p->next=NULL; p->num=num; printf("/n请输入学生姓名: "); scanf("%s",p->name); if (head==NULL) { head=p; tail=p; } else { tail->next=p; tail=p; } printf("/n增加学生信息成功!"); }
/****************************************************************************** 功能: 从学生链表中删除一个学生结构体 :void delstu() ******************************************************************************/ void delstu() { printf("/n/n/n[ 删 除 学 生 ] ");
if (head==NULL) { printf("/n/n提示:学生信息为空! "); return ; }
printf("/n/n请输入要删除学号: "); int num=0; scanf("%d",&num); bool y=1; stu *tem=NULL;
if (head->num==num) { y=0; tem=head; head=head->next; } else { stu *p=head; while (p->next) { if (p->next->num==num) { y=0; tem=p->next; p->next=p->next->next; break; } p=p->next; } }
if (y) { printf("/n/n错误:删除学生的学号不存在!"); } else { printf("/n/n删除学号%d的学生成功 !",tem->num); //--------------------- cou *q=tem->chead; cou *qq=NULL; while (q) { qq=q->next; printf("/n |--->删除课程%s成功 !",q->name); delete q; q=qq; } //--------------------- delete tem; }
}
/****************************************************************************** 功能: 从一个学生结构体中删除一个或者所有课程 :void delcou() ******************************************************************************/ void delcou() { printf("/n/n/n[ 删 除 课 程 ] ");
if (head==NULL) { printf("/n/n提示:学生信息为空! "); return ; }
printf("/n/n请输入要删除学号: "); int num=0; scanf("%d",&num); bool y=1; stu *tem=NULL;
stu *p=head; while (p) {//1---------- if (p->num==num) {//2----------
y=0; if (p->chead==NULL) { printf("/n错误:该学生并没有选修课程!"); } else//3------------- {
printf("/n请输入删除的课程名(全部删除请输入all): "); char a[40]; scanf("%s",a);
if (strcmp(a,"all")==0)//如果是删除所有 { cou *q=p->chead,*t; while (q) { t=q->next; printf("/n删除学号%d删除课程%s成功 !",p->num,q->name); delete q; q=t; } p->chead=NULL; p->ctail=NULL; p->cnum=0;//课程数为0 } else//删除单个课程 { //4---------------------- bool b=0; cou *q=p->chead,*t;
if (strcmp(q->name,a)==0)//如果第一个就是 { b=1; t=q; p->chead=p->chead->next; } else { while (q->next) { if (strcmp(q->next->name,a)==0) { b=1; t=q->next; if (t->next==NULL)//如果是最后一个 { p->ctail=q;//改变尾指针 } q->next=q->next->next; break; } q=q->next; } }
if (b) { printf("/n删除学号%d的课程%s成功 !",p->num,t->name); --(p->cnum);//课程数减1 delete t; } else { printf("/n错误,您没有选修该课程!"); }
}//4-------
} //3------
break;
}//2----------- p=p->next; }//1-------
if (y) { printf("/n/n错误:删除学生的学号不存在!"); }
} /****************************************************************************** 功能: 修改学生结构体的信息 :void modifystu() ******************************************************************************/ void modifystu() { printf("/n/n/n[ 修 改 学 生 ] ");
if (head==NULL) { printf("/n/n提示:学生信息为空! "); return ; }
printf("/n/n请输入要修改的学号: "); int num=0; scanf("%d",&num); bool y=1; stu *tem=NULL;
stu *p=head; while (p) { if (p->num==num) { y=0; printf("/n|-------------------------------------------------------------------|"); printf("/n 学号:%-4d 姓名:%-8s 平均分:%5.2f 课程数:%4d",p->num,p->name,p->ave,p->cnum); printf("/n|-------------------------------------------------------------------|"); printf("/n请输入新姓名: "); scanf("%s",p->name); printf("/n修改成功,新的学生信息如下:"); printf("/n|-------------------------------------------------------------------|"); printf("/n 学号:%-4d 姓名:%-8s 平均分:%5.2f 课程数:%4d",p->num,p->name,p->ave,p->cnum); printf("/n|-------------------------------------------------------------------|"); break; } p=p->next; } if (y) { printf("/n/n错误:修改学生的学号不存在!"); } }
/****************************************************************************** 功能: 从一个学生结构体中修改课程信息 :void modifycou() ******************************************************************************/ void modifycou() { printf("/n/n/n[ 修 改 课 程 ] ");
if (head==NULL) { printf("/n/n提示:学生信息为空! "); return ; }
printf("/n/n请输入要修改的学号: "); int num=0; scanf("%d",&num); bool y=1; stu *tem=NULL;
stu *p=head; while (p) {//1---------- if (p->num==num) {//2----------
y=0; if (p->chead==NULL) { printf("/n错误:该学生并没有选修课程!"); } else//3------------- {
printf("/n请输入要修改的课程名: "); char a[40]; scanf("%s",a); bool b=1; cou *q=p->chead; while (q) { if (strcmp(q->name,a)==0) { b=0; printf("/n|--------------------------------------------|"); printf("/n 课程名:%5s 成绩: %5.2f ",q->name,q->sco); printf("/n|--------------------------------------------|"); printf("/n请输入新的课程名:"); scanf("%s",q->name); printf("/n请输入新的成绩:"); scanf("%f",&q->sco);
printf("/n修改成功,新的课程信息如下:"); printf("/n|--------------------------------------------|"); printf("/n 课程名:%5s 成绩: %5.2f ",q->name,q->sco); printf("/n|--------------------------------------------|"); break; } q=q->next; } if (b) { printf("/n错误,您没有选修该课程!"); } } //3------
break;
}//2----------- p=p->next; }//1-------
if (y) { printf("/n/n错误:修改学生的学号不存在!"); }
}
/****************************************************************************** 功能: 为一个学生结构体录入课程成绩 :void setsco() ******************************************************************************/ void setsco() { printf("/n/n/n[ 录 入 成 绩 ] ");
if (head==NULL) { printf("/n/n提示:学生信息为空! "); return ; }
printf("/n/n请输入要录入成绩的学生的学号: "); int num=0; scanf("%d",&num); bool y=1; stu *tem=NULL;
stu *p=head;
while (p) {//1---------- if (p->num==num) {//2---------- y=0; if (p->chead==NULL && p->cnum==0) { printf("/n错误:该学生并没有选修课程!"); } else//3------------- { printf("/n该学生选修了如下%d门课程:",p->cnum);
cou *q=p->chead ; int n=0; float sum=0; while (q) { printf("/n|--------------------------------------------|"); printf("/n [%d]课程名:%5s 成绩: %5.2f ",++n,q->name,q->sco); printf("/n|--------------------------------------------|"); printf("/n请录入成绩:"); scanf("%f",&q->sco); printf("/n课程%s录入成绩%.2f成功!",q->name,q->sco); sum+=q->sco; q=q->next; } p->ave=sum/n; } //3------
break;
}//2----------- p=p->next; }//1-------
if (y) { printf("/n/n错误:学生的学号不存在!"); }
}
/****************************************************************************** 功能:加入N个课程结构体到一个学生结构体中: void addcou() ******************************************************************************/ void addcou() { printf("/n/n/n[ 学 生 选 课 ] "); printf("/n/n请输入你的学号: "); int num=0; bool y=1; scanf("%d",&num);
stu *p=head; while (p) { if (p->num==num) { y=0; printf("/n|------------------------------------------------------|"); printf("/n 学号:%5d 姓名:%8s 已选课程数:%4d",p->num,p->name,p->cnum); printf("/n|------------------------------------------------------|"); if (p->cnum>=10) { printf("/n您已经修满了10门课程,请不要选课! "); return ; } printf("/n请输入选修的课程的数目(每个学生最多选10门课程): "); loop: int n=0; scanf("%d",&n); if (n<0 || p->cnum+n>10) { printf("/n错误:请重新输入课程的数目: "); goto loop; }
for (int j=0;j<n;j++) { cou *q=(cou*)malloc(sizeof(cou)); q->next=0; q->sco=0; printf("/n请输入选修第%d门课程名: ",j+1); scanf("%s",q->name); if (p->chead==NULL) { p->chead=q; p->ctail=q; } else { p->ctail->next=q; p->ctail=q; } }
p->cnum+=n; printf("/n选修%d门课程成功! ",p->cnum); break; } p=p->next; } if (y) { printf("/n你输入的学号不存在,选课失败 !"); } }
/****************************************************************************** 功能:显示学生信息及课程结构体 :void show() ******************************************************************************/
void show() { if (head==NULL) { printf("/n提示:学生信息为空!"); return ; } stu *p=head; printf("/n/n/n 学生选课情况信息总表 "); printf("/n|---------------------------------------------------------------------|"); while (p) { printf("/n 学号:%-4d 姓名:%-8s 平均分:%5.2f 课程数:%4d",p->num,p->name,p->ave,p->cnum); printf("/n|---------------------------------------------------------------------|"); //------------------------------ cou *q=p->chead; int n=0; while (q) { printf("/n |-->课程名%d:%5s 成绩: %5.2f ",++n,q->name,q->sco); printf("/n |--------------------------------------------|"); q=q->next; } //------------------------------ printf("/n|---------------------------------------------------------------------|"); p=p->next; }
}
/****************************************************************************** 功能:排序显示学生信息 :void order() ******************************************************************************/
void order() { if (head==NULL) { printf("/n提示:学生信息为空!"); return ; }
//计算出结构体个数 stu *p=head; int n=0; while (p) { n++; p=p->next; }
stu **pp=new stu *[n]; p=head; for (int i=0;i<n;i++) { pp[i]=p; p=p->next; }
//下面用冒泡法进行排序 for (i=0;i<n-1;i++) for (int j=0;j<n-1-i;j++) { if (pp[j]->ave<pp[j+1]->ave) { stu *tem; tem=pp[j] ; pp[j]= pp[j+1]; pp[j+1]=tem; }
}
printf("/n/n 学生成绩排名一览表"); printf("/n|---------------------------------------------------------------------|"); for (i=0;i<n;i++) { printf("/n [%d]平均分:%5.2f 学号:%-4d 姓名:%-8s 课程数:%4d",i+1,pp[i]->ave,pp[i]->num,pp[i]->name,pp[i]->cnum); printf("/n|---------------------------------------------------------------------|"); }
}
/****************************************************************************** 功能:查找学生信息及课程结构体 :void look() ******************************************************************************/
void look() { if (head==NULL) { printf("/n提示:学生信息为空!"); return ; }
printf("/n/n请输入要查找的学号: "); int num=0; scanf("%d",&num); bool y=1; stu *p=head; while (p) { if (p->num==num) { y=0; printf("/n查找成功,信息如下:"); printf("/n|---------------------------------------------------------------------|"); printf("/n 学号:%-4d 姓名:%-8s 平均分:%5.2f 课程数:%4d",p->num,p->name,p->ave,p->cnum); printf("/n|---------------------------------------------------------------------|"); //------------------------------ cou *q=p->chead; int n=0; while (q) { printf("/n |-->课程名%d:%5s 成绩: %5.2f ",++n,q->name,q->sco); printf("/n |--------------------------------------------|"); q=q->next; } //------------------------------
} p=p->next; } if (y) { printf("/n错误:查找学生的学号不存在!"); }
}
/****************************************************************************** 功能:保存学生信息及课程结构体 :void save() ******************************************************************************/ void save() { FILE *fp; fp=fopen("stu.txt","w"); stu *p=head; int n=0; while (p) { n++; p=p->next; } fwrite(&n,sizeof(n),1,fp); p=head; while(p) { //printf("/n保存学生%s信息成功!",p->name); fwrite(p,sizeof(stu),1,fp); cou*q=p->chead; while (q) { // printf("/n |--->保存课程%s信息成功!",q->name); fwrite(q,sizeof(cou),1,fp); q=q->next; } p=p->next;
}
fclose(fp); }
/****************************************************************************** 功能: 清空所有信息 :void release() ******************************************************************************/ void release() { printf("/n/n/n[ 清 空 信 息 ] ");
if (head==NULL) { printf("/n/n提示:文件信息为空! "); return ; } stu *p=head; stu *pp; while (p) { pp=p->next; //-------------------------------- cou *q=p->chead; cou *qq=NULL; while (q) { qq=q->next; delete q; q=qq; } //-------------------------------- delete p; p=pp; } head=NULL; tail=NULL; printf("/n清空系统成功!"); }
/******************************************************************** 以下为菜单显示函数 ********************************************************************/
void show1() { printf("/n/n|-----------------------|"); printf("/n| 主 菜 单 |"); printf("/n|-----------------------|"); printf("/n| A 增 加 学 生 |"); printf("/n|-----------------------|"); printf("/n| B 学 生 选 课 |"); printf("/n|-----------------------|"); printf("/n| C 成 绩 录 入 |"); printf("/n|-----------------------|"); printf("/n| D 信 息 查 询 |"); printf("/n|-----------------------|"); printf("/n| E 系 统 维 护 |"); printf("/n|-----------------------|"); printf("/n| F 退 出 系 统 |"); printf("/n|-----------------------|"); }
void show2() { printf("/n/n|---------------------|"); printf("/n| 查询菜单 |"); printf("/n|---------------------|"); printf("/n| A 所有学生信息 |"); printf("/n|---------------------|"); printf("/n| B 单个学生信息 |"); printf("/n|---------------------|"); printf("/n| C 成绩排名信息 |"); printf("/n|---------------------|"); printf("/n| D 退 出 菜 单 |"); printf("/n|---------------------|"); }
void show3() { printf("/n/n|---------------------|"); printf("/n| 维护菜单 |"); printf("/n|---------------------|"); printf("/n| A 修改学生信息 |"); printf("/n|---------------------|"); printf("/n| B 修改课程信息 |"); printf("/n|---------------------|"); printf("/n| C 删除学生信息 |"); printf("/n|---------------------|"); printf("/n| D 删除课程信息 |"); printf("/n|---------------------|"); printf("/n| E 清 空 系 统 |"); printf("/n|---------------------|"); printf("/n| F 退 出 菜 单 |"); printf("/n|---------------------|"); }
void main(int argc, char *argv[]) { ini(); printf("/n 欢迎进入学生选课系统!!!");
char c1; do { show1(); c1=getch(); putchar(c1);
switch (c1) { case 'A': case 'a':addstu(); break;
case 'B': case 'b':addcou(); break;
case 'C': case 'c':setsco(); break;
case 'D': case 'd': {
char c2; do { show2(); c2=getch(); putchar(c2);
switch (c2) { case 'A': case 'a':show(); break; case 'B': case 'b':look(); break; case 'C': case 'c':order(); break; }
} while (c2!='D' && c2!='d');
} break;
case 'E': case 'e': { char c3; do { show3(); c3=getch(); putchar(c3); switch (c3) { case 'A': case 'a':modifystu(); break; case 'B': case 'b':modifycou(); break; case 'C': case 'c':delstu(); break;
case 'D': case 'd':delcou(); break; case 'E': case 'e':release(); break; }
} while (c3!='F' && c3!='f'); } break;
default:break; } save();
} while (c1!='F' && c1!='f'); printf("/n谢谢您的使用!"); }
|