// 仅供参考
#include <stdio.h>
#include <windows.h>
#include <stdlib.h>
#include <string.h>
typedef struct Node{
int id;//学号
char name[50];//姓名
char sex[10];//性别
int age,room;
char tel[50];
char course[50];//选择课程
int pts;//分数
char cls[50];//班级
struct Node *next;
}node;
int readfile(node *L);//读取学生信息文件
void printStuInfo(node *L);//输出学生信息
void addStuInfo(node *L);//学生信息添加
void insertStuInfo(node *L,node e);//插入学生信息函数
int savefile(node *L);//学生文件信息保存(添加或删除后使用)
void printSearchCls(node *L);//按班级查找
void printSearchCourse(node *L);//按课程查找
void printsearchStu(node *L);//查询学生信息
node * searchStuInfo(int id,node *L);//查找学生信息函数 返回(前一个)指针
void printchangeStucourseInfo(node *L);//学生成绩录入
void printchangeStuInfo(node *L);//学生信息修改
void deleteStuInfo(node *ps);//ps 为删除节点的前一个
void sortInfo(node *L);//冒泡排序
void exitprogame();//退出
node list;
void menu()//主菜单
{
printf("**********************************************************************************************************************\n");
printf("* *\n");
printf("* 欢迎使用教务管理系统 *\n");
printf("* ...... *\n");
printf("* ...... *\n");
printf("**********************************************************************************************************************\n");
printf("* *\n");
printf("* -------------------------------------- *\n");
printf("* *| |* *\n");
printf("* *| |* *\n");
printf("* *| 1:个人信息查询 |* *\n");
printf("* *| |* *\n");
printf("* *| 2.学生信息录入 |* *\n");
printf("* *| |* *\n");
printf("* *| 3:班级信息总览 |* *\n");
printf("* *| |* *\n");
printf("* *| 4:学生信息修改 |* *\n");
printf("* *| |* *\n");
printf("* *| 5:学生信息删除 |* *\n");
printf("* *| |* *\n");
printf("* *| 6:课程成绩总览 |* *\n");
printf("* *| |* *\n");
printf("* *| 7:学生成绩录入<教师使用> |* *\n");
printf("* *| |* *\n");
printf("* *| 8:排序信息(学号) |* *\n");
printf("* *| |* *\n");
printf("* *| 9:退出 |* *\n");
printf("* *| |* *\n");
printf("* *| |* *\n");
printf("* -------------------------------------- *\n");
printf("* *\n");
printf("* *\n");
printf("**********************************************************************************************************************\n");
printf("请输入相关数字:");
}
int readfile(node *L)//读取文件信息
{
FILE *fp=fopen("studentInfo.txt","r");
node st;
node *s;
node *t=L;
if(fp==NULL)
{
return 0;
}
else
{
while(fscanf(fp,"%d %s %s %d %s %d %s %d %s",&st.id,st.name,st.sex,&st.age,st.tel,&st.room,st.course,&st.pts,st.cls)!=EOF)
{
s=(node*)malloc(sizeof(node));
*s=st;
t->next=s;
t=s;
t->next=NULL;
}
}
fclose(fp);
return 1;
}
void printStuInfo(node *L)//输出文件信息
{
node *p=L->next;
printf("___________________________________________________________________________________\n");
printf("|学号\t|姓名\t|性别\t|年龄\t|手机号\t\t|宿舍号\t|选课\t|分数\t|班级\t|\n");
if(p!=NULL)
{
while(p!=NULL)
{
printf("|%d\t|%s\t|%s\t|%d\t|%s\t|%d\t|%s\t|%d\t|%s\t|\n",p->id,p->name,p->sex,p->age,p->tel,p->room,p->course,p->pts,p->cls);
printf("_____________________________________________________________________________\n");
p=p->next;
}
}
}
void addStuInfo(node *L)//学生信息添加
{
node st;
printf("请输入新增学生的相关信息:\n");
printf("学号:\n");
scanf("%d",&st.id);
printf("姓名:\n");
scanf("%s",st.name);
printf("性别:\n");
scanf("%s",st.sex);
printf("年龄:\n");
scanf("%d",&st.age);
printf("手机号:\n");
scanf("%s",st.tel);
printf("宿舍号:\n");
scanf("%d",&st.room);
printf("班级:\n");
scanf("%s",st.cls);
int pts=-1;
st.pts=pts;
char course[50]="unknown";
strcpy(course,st.course);
insertStuInfo(&list,st);
}
void insertStuInfo(node *L,node e)//插入函数
{
//头插法
node *head=L;
node *p=(node*)malloc(sizeof(node));
*p=e;//存入信息
p->next=head->next;
head->next=p;
savefile(&list);
}
int savefile(node *L)//文件信息保存(添加或删除后使用)
{
FILE *fp=fopen("studentInfo.txt","w");
if(fp==NULL)
{
printf("ERROR2");
return 0;
}
node *p=L->next;
while(p!=NULL)
{
fprintf(fp,"%d %s %s %d %s %d %s %d %s\n",p->id,p->name,p->sex,p->age,p->tel,p->room,p->course,p->pts,p->cls);
p=p->next;
}
fclose(fp);
return 1;
}
void printsearchStu(node *L)//查询学生信息
{
printf("请输入查询学生的学号:");
int id;
scanf("%d",&id);
node *p;
p = searchStuInfo(id,L);
if(p==NULL)
{
printf("查无此人!\n");
}
else
{
p=p->next;
printf("___________________________________________________________________________________\n");
printf("|学号\t|姓名\t|性别\t|年龄\t|手机号\t\t|宿舍号\t|选课\t|分数\t|班级\t|\n");
printf("|%d\t|%s\t|%s\t|%d\t|%s\t|%d\t|%s\t|%d\t|%s\t|\n",p->id,p->name,p->sex,p->age,p->tel,p->room,p->course,p->pts,p->cls);
printf("______________________________________________________________________________\n");
}
}
void printSearchCls(node *L)//按班级查找
{
printf("请输入查询的班级:");
char cls[50];
int flag=0;
scanf("%s",cls);
node *p=L;
while(p!=NULL)
{
if(strcmp(cls,p->cls)==0)
{
flag=1;
printf("_____________________________________________________\n");
printf("|学号\t|姓名\t|性别\t|年龄\t|手机号\t\t|宿舍号\t|选课\t|分数\t|班级\t|\n");
printf("|%d\t|%s\t|%s\t|%d\t|%s\t|%d\t|%s\t|%d\t|%s\t|\n",p->id,p->name,p->sex,p->age,p->tel,p->room,p->course,p->pts,p->cls);
printf("__________________________________________________\n");
}
p=p->next;
}
if(flag==0) printf("无相关信息");
}
void printSearchCourse(node *L)//按课程查找
{
printf("请输入查询的课程:\n");
char course[50];
int flag=0;
scanf("%s",course);
node *p=L;
while(p!=NULL)
{
if(strcmp(course,p->course)==0)
{
flag=1;
printf("_____________________________________________________________________________________\n");
printf("|学号\t|姓名\t|性别\t|年龄\t|手机号\t\t|宿舍号\t|选课\t|分数\t|班级\t|\n");
printf("|%d\t|%s\t|%s\t|%d\t|%s\t|%d\t|%s\t|%d\t|%s\t|\n",p->id,p->name,p->sex,p->age,p->tel,p->room,p->course,p->pts,p->cls);
printf("______________________________________________________________________________________\n");
}
p=p->next;
}
if(flag==0) printf("无相关信息\n");
else
{
p=L;
printf("不及格名单如下:\n");
while(p!=NULL)
{
if((strcmp(course,p->course)==0)&&(p->pts<60)&&(p->pts>=0))
{
printf("%s\n",p->name);
}
p=p->next;
}
}
}
node * searchStuInfo(int id,node *L)//查找函数 返回指针
{
node *p=L;
while(p->next!=NULL)
{
if(p->next->id==id) {return p;}
p=p->next;
}
return NULL;
}
void printchangeStuInfo(node *L)
{
printf("请输入要修改的学生学号:\n");
int id;
scanf("%d",&id);
node *p =searchStuInfo(id,L);
if(p==NULL)
{
printf("查无此人!\n");
return;
}
p=p->next;
int choice=-1;
while(1)
{
printf("请输入需要修改的信息对应编号:");
printf("修改姓名----------1");
printf("修改性别----------2");
printf("修改年龄----------3");
printf("修改手机号-------4");
printf("修改宿舍号-------5");
printf("修改班级----------6");
scanf("%d",&choice);
switch(choice)
{
case 1:printf("请输入姓名:\n");
scanf("%s",p->name);
break;
case 2:printf("请输入性别:\n");
scanf("%s",p->sex);
break;
case 3:printf("请输入年龄:\n");
scanf("%d",&p->age);
break;
case 4:printf("请输入手机号:\n");
scanf("%s",p->tel);
break;
case 5:printf("请输入宿舍号:\n");
scanf("%d",&p->room);
break;
case 6:printf("请输入班级:\n");
scanf("%s",p->cls);
break;
}
printf("是否继续修改学生信息?(y-1 / n-0)\n");
scanf("%d",&choice);
if(choice == 0){
break;
}
}
printf("_____________________________________________________________________________________\n");
printf("|学号\t|姓名\t|性别\t|年龄\t|手机号\t\t|宿舍号\t|选课\t|分数\t|班级\t|\n");
printf("|%d\t|%s\t|%s\t|%d\t|%s\t|%d\t|%s\t|%d\t|%s\t|\n",p->id,p->name,p->sex,p->age,p->tel,p->room,p->course,p->pts,p->cls);
printf("______________________________________________________________________________\n");
savefile(L);
}
void printchangeStucourseInfo(node *L)
{
printf("请输入需要录入的学生学号:\n");
int id;
scanf("%d",&id);
node *p =searchStuInfo(id,L);
if(p==NULL)
{
printf("查无此人!\n");
return;
}
int choice=-1;
p=p->next;
while(1)
{
printf("请输入需要修改的信息对应编号:");
printf("录入课程名称----------1\n");
printf("录入成绩--------------2\n");
scanf("%d",&choice);
switch(choice)
{
case 1:printf("请输入课程名称:\n");
scanf("%s",p->course);
break;
case 2:printf("请输入成绩:\n");
scanf("%d",&p->pts);
break;
}
printf("是否继续修改学生信息?(y-1 / n-0)\n");
scanf("%d",&choice);
if(choice == 0){
break;
}
}
printf("____________________________________________________________________________________\n");
printf("|学号\t|姓名\t|性别\t|年龄\t|手机号\t\t|宿舍号\t|选课\t|分数\t|班级\t|\n");
printf("|%d\t|%s\t|%s\t|%d\t|%s\t|%d\t|%s\t|%d\t|%s\t|\n",p->id,p->name,p->sex,p->age,p->tel,p->room,p->course,p->pts,p->cls);
printf("______________________________________________________________________________\n");
savefile(L);
}
void printDeleteStuInfo(node *L)
{
printf("请输入要删除的学生学号:");
int id;
scanf("%d",&id);
node *p ;
p=searchStuInfo(id,L);//此函数获得所求节点的前一个结点
node *q;
q=p;
if(p==NULL)
{
printf("查无此人!");
return;
}
p=p->next;
printf("_______________________________________________________________________________________\n");
printf("|学号\t|姓名\t|性别\t|年龄\t|手机号\t\t|宿舍号\t|选课\t|分数\t|班级\t|\n");
printf("|%d\t|%s\t|%s\t|%d\t|%s\t|%d\t|%s\t|%d\t|%s\t|\n",p->id,p->name,p->sex,p->age,p->tel,p->room,p->course,p->pts,p->cls);
printf("_____________________________________________________________________________\n");
deleteStuInfo(q);
savefile(L);
}
void sortInfo(node *L)
{
int i,count = 0,num;//count=链表结点的个数,num内层循环,
node *p,*q,*tail;
p = L;
while(p->next != NULL)//结点个数
{
count++;
p = p->next;
}
for(i=0;i < count - 1;i++)
{
num = count - i - 1;
q=L->next;
p=q->next;
tail=L;//让tail始终指向q前一个结点
while(num--)//内层循环
{
if(q->id > p->id)//如果该结点的值大于后一个结点,则交换
{
q->next=p->next;
p->next=q;
tail->next=p;
}
tail = tail->next;
q=tail->next;
p=q->next;
}
}
}
void deleteStuInfo(node *ps)//ps 为删除节点的前一个
{
node * s =ps->next;
ps->next =s->next;
s->next=NULL;
free(s);
}
void exitprogame()
{
printf("退出程序\n");
exit(0);
}
int main()
{
readfile(&list);
int caozuoshu;
while(1)
{
menu();
scanf("%d",&caozuoshu);
switch(caozuoshu)
{
case 1:
{
system("cls");
printsearchStu(&list);
break;
}
case 2 :
{
system("cls");
addStuInfo(&list);
break;
}
case 3 :
{
system("cls");
printSearchCls(&list);
break;
}
case 4:
{
system("cls");
printchangeStuInfo(&list);
break;
}
case 5:
{
system("cls");
printDeleteStuInfo(&list);
break;
}
case 6:
{
system("cls");
printSearchCourse(&list);
break;
}
case 7:
{
system("cls");
int password;
printf("请输入密码:\n");
scanf("%d",&password);
if(password==20020903)
{
printchangeStucourseInfo(&list);
break;
}
else
{
printf("密码错误!\n");
break;
}
}
case 8:
{
sortInfo(&list);
break;
}
case 9:
{
system("cls");
exitprogame();
break;
}
}
printf("是否需要继续操作?(yes:1 / no:0 ):");
scanf("%d",&caozuoshu);
if(caozuoshu==0) break;
}
return 0;
}