内容以借鉴为主,学习方法。本学生管理系统只有一组数据,多组数据时可借鉴。但较复杂,可采用数组等方法。这里不加描述,有时间以后再发。主要完成增删查改排序显示全部学生功能。任有缺陷,没有格式化输入,无登陆注册功能。
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <conio.h> #define h1 "===============数据如下==============\n" #define h2 "|姓名 |学号|c语言|英语|高数|总成绩|\n" #define h3 "=====|===========|=====|========\n" #define h4 "|%-4s|%-4s|%4d|%4d|%4d|%4d|\n" #define dataBase p->date.name,p->date.id,p->date.cResults,p->date.englishResults,p->date.mathematicsResults,p->date.total #define END "------------------------------------\n" int saveflog=0; struct Student { char name[10]; char id[10]; int cResults; int englishResults; int mathematicsResults; int total; }; typedef struct Record { struct Student date; struct Record *next; } record,*connect; void Query(connect pCur) ; void Alter(connect pCur); void keep(connect pCur); void Read(); void Sort(connect pCur); void Delete(connect pCur) ; void menu(); void Unfind(); void Wrong(); void Output(record *pp); void Header(); void Display(connect pCur); void Add(connect pCur) ; void Insert(connect pCur); void mima (); void chageMima (); int main() { connect pCur; record *p,*s; FILE *fp; pCur = (record *)malloc(sizeof(record)); s=pCur; if(!pCur) { printf("没有申请到空间\n"); } pCur->next=NULL; fp=fopen("student","ab+"); if(fp==NULL) { printf("无法打开文档\n"); exit(0); } while(!feof(fp)) { p=(record *)malloc(sizeof(record)); if(!p); { printf("没有申请成功\n"); } if(fread(p,sizeof(record),1,fp)==1) { p->next=NULL; s->next=p; s=p; } } fclose(fp); printf("\n ==========>打开文件成功==========\n"); char ch='z'; int a; while((ch!='m')&&(ch!='s')) { system("cls"); printf("************学生成绩管理系统***************\n"); printf("** 姓名: \n"); printf("** 班级: 软件172 \n"); printf("** 学号: \n"); printf("请选择进入系统的身份。\n"); printf("m, 管理员\ns, 学生\n"); printf("请选择:"); ch=getchar (); if(ch=='m') { system("cls"); while(pCur) { printf("输入任意键继续"); getchar(); system("cls"); menu(); printf("输入操作指令,0为可进行保存:"); scanf("%d",&a); if(a==0) { if(saveflog==1) { getchar(); printf("\n==是否要保存==\n"); char ch; scanf("%c",&ch); if(ch=='y'||ch=='Y') { keep(pCur); } printf("=====保存成功====="); getchar(); } } switch(a) { case 1: Add (pCur); break; case 2: Alter(pCur); break; case 3: Query(pCur); break; case 4: Delete(pCur); break; case 5: Sort(pCur); break; case 6: Insert(pCur); break; case 7: Display(pCur); break; default : system("cls"); printf("\n\n\n\n==========输入任意键返回菜单==========\n"); getchar(); menu(); break; } } } else if(ch=='s') { while(1) { char m; m=0; while((m!='a')&&(m!='b')) { system("cls"); printf("--------------欢迎你来到学生成绩管理系统------------------\n"); printf("a,查询成绩 b,学生成绩排名 c,退出系统\n"); printf("请你输入命令:"); m=getchar (); if(m=='a') { Query(pCur); getchar (); } else { if(m=='b') { Sort(pCur); getchar (); } else { if(m=='c') { } } } } } } } return 0; } void menu() { printf("\t***********************************\n"); printf("\t* 学生信息管理系统 * \n"); printf("\t************************************\n"); printf("\t************************************\n"); printf("\t* *1.添加信息 *2.修改信息 \n"); printf("\t* \n"); printf("\t* *3.查询信息 *4.删除信息 \n"); printf("\t* \n"); printf("\t* *5.数据排序 *6.插入信息 \n"); printf("\t* \n"); printf("\t* *7.打印数据 *8.教师密码修改\n"); printf("\t* \n"); printf("\t* *0.保存数据返回菜单 \n"); printf("\t************************************* \n"); printf("\t*************************************\n"); } void keep(connect pCur)//保存数据 { FILE *fp; record *p; int a=0; if((fp=fopen("student","wb"))==NULL) { printf("\t 打开文件失败..."); getch(); system("cls"); return; } p=pCur->next; while(p) { if( fwrite(p,sizeof(record),1,fp)==1) { p=p->next; a++; } else { break; } } if(a>0) { printf("\n\t 数据保存成功..."); getchar(); system("cls"); } else { system("cls"); printf("\n\t 数据保存失败..."); getchar(); } fclose(fp); } void Alter(connect pCur)//信息修改 { system("cls"); printf("\n----------------------------------------------------\n"); printf("\t ───修改信息───\n"); printf("\t *********************\n"); printf("\t *1.按学号修改 \n"); printf("\t * \n"); printf("\t *********************\n"); record *p=pCur->next; char findmess[20]; printf("输出学生信息"); Display(pCur); printf("输入要修改的学生学号:"); scanf("%s",findmess); while(p) { if(strcmp(p->date.id,findmess)==0) { printf("输入学生的学号为"); scanf("%s",p->date.id); printf("输入学生名字"); scanf("%s",p->date.name); printf("输入新的c语言的成绩"); scanf("%d",&p->date.cResults); printf("输入新的英语的成绩"); scanf("%d",&p->date.englishResults); printf("输入新的高数的成绩"); scanf("%d",&p->date.mathematicsResults); system("cls"); Display(p); printf("\n=====》修改成功《=====\n"); break; } p=p->next; } if(p==NULL) { getchar(); printf("没有此学生"); } } void Query(connect pCur) { system("cls"); printf("----------------------------------------------------\n"); printf("\t ───查询信息───\n"); printf("\t ┌─────────────┐\n"); printf("\t │1.按学号查询 \n"); printf("\t │ \n"); printf("\t └─────────────┘\n"); record *p=pCur->next; char id[20]; printf("输入要查询的学生学号:"); scanf("%s",id); while(p) { if(strcmp(p->date.id,id)==0) { Header(); Output(p); printf(END); getchar(); } p=p->next; } if(p==NULL) { getchar(); printf("无此学生"); } } void Delete(connect pCur) { system("cls"); printf("----------------------------------------------------\n"); printf("\t ───删除信息───\n"); printf("\t ********************\n"); printf("\t *1.按学号删除\n"); printf("\t *******************\n"); record *p=pCur->next; record *pre=pCur,*r=p,*rpre=pre; char findmess[20]; Display(pCur); printf("输入要删除的学号"); scanf("%s",findmess); if(p) { if(strcmp(p->date.id,findmess)==0) { r=p; rpre=pre; pre=p; p=p->next; rpre->next=r->next; free(r); getchar(); printf("删除成功\n"); saveflog=1; } else { getchar(); printf("无此学生"); } } } void Sort(connect pCur) { printf("----------------------------------------------------\n"); printf("\t ───数据排序───\n"); printf("\t ┌──────┐\n"); printf("\t │1.按总分排序│\n"); printf("\t │ │\n"); printf("\t │*************│\n"); printf("\t └──────┘\n"); connect pc; record *p,*r,*s; int i=0; if(pCur->next==NULL) { system("cls"); printf("=====无学生记录====="); getchar(); return ; }// 判断传入的链表是否为空 pc = (record *)malloc(sizeof(record));//给pc空间 if(!pc) { printf("\n申请空间错误"); return ; }//判断链表是否申请成功 pc->next=NULL;//完成链表申请 system("cls"); //进行清屏 Display(pCur);//显示排序前学生的信息 p=pCur->next;//将pCur->next的指针给p while(p!=NULL) { s=(record *)malloc(sizeof(record));//新建节点给s空间,用于保存从原链表中取出的节点信息 if(!s) { printf("\n申请空间错误"); return ;//返回 }//判断是否申请成功 s->date=p->date;//将pCur的数据域给s s->next=NULL;//指针域为空 r=pc;// 用于储存插入单个节点后保持排序的节点 //Pc为链表的头指针,每次插入从头开始 while(r->next!=NULL&&r->next->date.total>=p->date.total) { r=r->next; //指针移动到比p所指总分小的节点位置 } if(r->next==NULL) { //如果pc的所有节点的总分都比p->date.total大时,就将p指的节点加到尾部 r->next=s; } else {//否则将该节点插入至第一个总分比它小的节点前面 s->next=r->next; r->next=s; } p=p->next;//原链表的指针下移一个 } pCur->next=pc->next;//pc中储存的是已经排好序的头指针 p=pCur->next;//排好序的头指针赋给p进行名次的填写 while(p!=NULL) { i++;//节点序号 p->date.total=i;//名次的赋值 p=p->next;//指针后移 } Display(pCur); } void Insert(connect pCur) { connect p,n,newinsert; char id2[20]; char ch; int flog=0; n=pCur->next; system("cls"); Display(pCur); printf("输入要插入之前的学号:"); scanf("%s",id2); while(pCur) { flog=0; n=pCur->next; while(n) { if(strcmp(n->date.id,id2)==0); { flog=1; break; } n=n->next; } if(flog==1) break; else { getchar(); printf("学生学号不存在,输入y,Y继续,输入其他结束程序\n"); scanf("%c",&ch); if(ch=='y'||ch=='Y') { continue; } else { return ; } } } printf("输入要插入的学号"); char id3[20]; scanf("%s",id3); n=pCur->next; while(n) { if(strcmp(n->date.id,id3)==0) { printf("此学号已存在"); Header(); Output(n); printf("\n"); getchar(); return ; } n=n->next; } newinsert = (record *)malloc(sizeof(record)); if(newinsert==NULL) { printf("未申请到空间"); return ; } strcpy( newinsert->date.id,id3); printf("输入学生学号:%s\n",newinsert->date.id); printf("输入学生姓名:"); scanf("%s",newinsert->date.name); printf("输入学生c语言成绩:"); scanf("%d",&newinsert->date.cResults); printf("输入学生英语成绩:"); scanf("%d",&newinsert->date.englishResults); printf("输入学生高数成绩:"); scanf("%d",&newinsert->date.mathematicsResults); newinsert->date.total=newinsert->date.cResults+newinsert->date.englishResults+newinsert->date.mathematicsResults; newinsert->next=NULL; saveflog=1; p=pCur->next; while(pCur) { if(strcmp(p->date.id,id2)==0) { newinsert->next=p->next; p->next=newinsert; break; } p=p->next; } system("cls"); Display(pCur); } void Add(connect pCur) { record *p,*r,*s; char ch; int flog=0; char num[20]; r=pCur; s=pCur->next; system("cls"); Display(pCur); while(r->next!=NULL) { r=r->next; } while(pCur) { while(pCur) { printf("输入学号进行对比,没有则继续,有则重新输入,0为返回进行保存"); printf("\n"); scanf("%s",num); flog=0; if(strcmp(num,"0")==0) { system("cls"); return ; } s=pCur->next; while(s) { if(strcmp(s->date.id,num)==0) { flog=1; break; } s=s->next; } if(flog==1) { getchar(); printf("学号重复是否重新输入,重新输入y或Y"); scanf("%c",&ch); if(ch=='y'||ch=='Y') { continue; } else { menu(); } } else { break; } } p=(record *)malloc(sizeof(record)); if(!p) { printf("未申请到空间"); return ; } printf("输入学号:"); scanf("%s",p->date.id); printf("学生姓名:"); scanf("%s",p->date.name); printf("学生c成绩:"); scanf("%d",&p->date.cResults); printf("学生英语成绩:"); scanf("%d",&p->date.englishResults); printf("学生高数成绩:"); scanf("%d",&p->date.mathematicsResults); p->date.total=p->date.cResults+p->date.englishResults+p->date.mathematicsResults; p->next=NULL; r->next=p; r=p; saveflog=1; } return ; } void Display(connect pCur)//表格形式显示记录 { record *p; p=pCur->next; if(!p) { printf("\n***************没有学生被记录***************\n"); getchar(); return; } printf("\n\n"); Header(); while(p) { Output(p); p=p->next; printf(h3); } getchar(); } void Header() { printf(h1); printf(h2); printf(h3); } void Output(record *pp) { record* p; p=pp; printf(h4,dataBase); } void Unfind() { printf("\n=========>未查到此学生信息!<==========\n"); }