C语言学生管理系统完整版,高手飞过!望对初学者有用!
先谢谢 论坛的同志帮我找到错误 不晓得为什么 自己总是很难发现自己的一些错误!!!另附上 我写的时候遇到错误的 地址:https://bbs.bccn.net/thread-404963-1-1.html
好了 废话 不说把 源码 和工程放上.
程序代码:
#include <stdio.h> #include <string.h> #include <stdlib.h> //设置个全局变量 用于在不同选择不同层次时显示不同的菜单 //定义一个 OBJ结构体 用于表示学生科目成绩 typedef struct OBJ { float math; float english; float chinese; }OBJ,* POBJ; //定义一个 STU结构体 用于表示学生的信息 typedef struct STUDENT { int number; //学号 char name[40]; //姓名 char sex; //性别 OBJ object; //科目 struct STUDENT* pNext; //指向下一个 }STU,* PSTU; PSTU Create(); //创建学生的数据 FILE* OpenFile(char Get_Choose,char* filename); //新建 打开 文件的函数 PSTU LoadFile(FILE* file,PSTU pHead); //读取文件 void SaveFile(FILE* file,PSTU pHead); //保存文件 第一个参数为要保存到哪个文件 第二个为要保存的数据 void View(PSTU pHead); //浏览学生信息 void Sort(PSTU pHead); //排序 void CopyData(PSTU p1,const PSTU p2); //复制数据 将P2的值复制进P1中 不过指向的pNext不变 bool Find(PSTU pHead); //查找学生信息 bool Insert(PSTU pHead,int pos); //插入学生信息 第一个参数是要插入的头节点所指向的链表结构 第二个是要插入的位置 bool Delete(PSTU pHead,int pos); //删除学生信息 从第几个位置开始删除pos个位置的学生信息 int GetLength(PSTU); //得到链表长度 //PSTU CleanUpList(PSTU pHead); //清空链表中的数据 /* 各函数 调用测试......................... */ int main() { system("cls"); system("color a"); FILE* file=NULL; PSTU pHead=NULL; char choose; char filename[40]=""; //加入后缀名.dat _RETURN_1: while(printf("新建(N)\\打开(O)\\退出(Q):"),choose=getchar()) { choose=toupper(choose); while(getchar()!='\n') continue; if ('N'==choose) { printf("文件名:"); scanf("%s",filename); while(getchar()!='\n') continue; if (file!=NULL) { fclose(file); } file=OpenFile(choose,filename); pHead=LoadFile(file,pHead); pHead=Create(); while(printf("保存文件(S) 浏览数据(V) 排序(P) 查找数据(F) 插入(I) 删除(D) 统计学生数量(N) 上一级菜单(R)\n退出(Q)\n"),choose=getchar()) { choose=toupper(choose); while(getchar()!='\n') continue; switch(choose) { case 'S': SaveFile(file,pHead); break; case 'F': if (!Find(pHead)) { printf("无结果\n"); } break; case 'V': View(pHead); break; case 'P': Sort(pHead); break; case 'I': if(!Insert(pHead,0)) printf("插入失败\n"); break; case 'D': if (!Delete(pHead,0)) printf("删除失败\n"); break; case 'N': printf("共有%d个学生的数据\n",GetLength(pHead)); break; case 'R': goto _RETURN_1; break; case 'Q': printf("感谢您的使用\n"); if (file!=NULL) { fclose(file); } exit(1); break; default: printf("输入错误请,重新输入\n"); continue; } } } else if ('O'==choose) { printf("文件名:"); scanf("%s",filename); while(getchar()!='\n') continue; if (file!=NULL) { fclose(file); } file=OpenFile(choose,filename); pHead=LoadFile(file,pHead); while(printf("保存文件(S) 浏览数据(V) 排序(P) 查找数据(F) 插入(I) 删除(D) 统计学生数量(N)\n上一级菜单(R)\n退出(Q)\n"),choose=getchar()) { choose=toupper(choose); while(getchar()!='\n') continue; switch(choose) { case 'S': SaveFile(file,pHead); break; case 'F': if (!Find(pHead)) { printf("无结果\n"); } break; case 'V': View(pHead); break; case 'P': Sort(pHead); break; case 'I': if(!Insert(pHead,0)) printf("插入失败\n"); break; case 'D': if (!Delete(pHead,0)) printf("删除失败\n"); break; case 'N': printf("共有%d个学生的数据\n",GetLength(pHead)); break; case 'R': goto _RETURN_1; break; case 'Q': printf("感谢您的使用\n"); if (file!=NULL) { fclose(file); } exit(1); break; default: printf("输入错误请,重新输入\n"); continue; } } } else if ('Q'==choose) { break; } else { printf("输入错误 重新输入\n"); continue; } } printf("感谢您的使用\n"); if (file!=NULL) { fclose(file); } return 0; } FILE* OpenFile(char Get_Choose,char* filename) { FILE* file=NULL; Get_Choose=toupper(Get_Choose); //加入后缀名.dat char mode[4]; if ('N'==Get_Choose) { strcpy(mode,"wb+"); } else if ('O'==Get_Choose) { strcpy(mode,"rb+"); } else { return NULL; } file = fopen(filename,mode); return file; } PSTU Create() { PSTU pHead=NULL; PSTU p=NULL,pNew=NULL; int n=0; //要创建的个数 int number; //学号 float grade=0.0f; //保存成绩 char name[40]; //姓名 char sex; //性别 pHead=(PSTU)malloc(sizeof(STU)); //创建头结点 pHead->pNext=NULL; p=pHead; printf("请输入您要创建的学生信息个数:"); scanf("%d",&n); for (int index=0;index<n;index++) { pNew=(PSTU)malloc(sizeof(STU)); printf("请输入第%d个学生学号:",index+1); scanf("%d",&number); pNew->number=number; printf("请输入第%d个学生姓名:",index+1); scanf("%s",name); while(getchar()!='\n') continue; strcpy(pNew->name,name); INPUT_ERROR_B: printf("请输入第%d个学生性别 男(B)女(G)",index+1); scanf("%c",&sex); sex=toupper(sex); if (sex!='B'&&sex!='G') { printf("输入错误,请重新输入\n"); goto INPUT_ERROR_B; } pNew->sex=sex; printf("请输入第%d个学生的数学成绩:",index+1); scanf("%f",&grade); pNew->object.math=grade; printf("请输入第%d个学生的英语成绩:",index+1); scanf("%f",&grade); pNew->object.english=grade; printf("请输入第%d个学生的语文成绩:",index+1); scanf("%f",&grade); while(getchar()!='\n') continue; pNew->object.chinese=grade; p->pNext=pNew; p=p->pNext; pNew->pNext=NULL; } return pHead; } PSTU LoadFile(FILE* file,PSTU pHead) { PSTU p=NULL; PSTU pSave=NULL; int index=0; int length=0; fread(&length,sizeof(int),1,file); //这里读取后 为什么为0? if (NULL==file||0==length) { return NULL; } if (NULL!=pHead) { for (p=pHead,index=0;p!=NULL;p=pSave) { pSave=p->pNext; free(p); } } pHead=(PSTU)malloc(sizeof(STU)); pHead->pNext=NULL; p=pHead; PSTU pNew=(PSTU)malloc(sizeof(STU)); pNew->pNext=NULL; index=0; while(fread(pNew,sizeof(STU),1,file),pNew!=NULL&&index<length) { index++; p->pNext=pNew; p=pNew; pNew=(PSTU)malloc(sizeof(STU)); } return pHead; } void SaveFile(FILE* file,PSTU pHead) { PSTU p; int length=0; if (file!=NULL) { length=GetLength(pHead->pNext); fwrite(&length,sizeof(int),1,file); for (p=pHead->pNext;p!=NULL;p=p->pNext) { fwrite(p,sizeof(STU),1,file); } fflush(file); } return; } void View(PSTU pHead) { float sum; if (NULL==pHead||NULL==pHead->pNext) { printf("数据为空,无法浏览\n"); return; } PSTU p=pHead->pNext; while(p!=NULL) { sum=p->object.math+p->object.english+p->object.chinese; printf("\n学号:%d 姓名:%s 性别:%s\n",p->number,p->name,p->sex=='B'?"男":"女"); printf("数学:%.1f 英语%.1f 语文%.1f\n",p->object.math,p->object.english,p->object.chinese); printf("总分:%.1f 平均分:%.1f\n\n",sum,sum/3); p=p->pNext; } return; } void Sort(PSTU pHead) { char ch; PSTU p; PSTU q; PSTU y=(PSTU)malloc(sizeof(STU)); float p_sum,q_sum; INPUT_ERROR_C: printf("请问您要按 总成绩(P) 学号(X):"); ch=getchar(); while(getchar()!='\n') continue; ch=toupper(ch); if (ch!='X'&&ch!='P') { printf("输入错误,请重新输入\n"); goto INPUT_ERROR_C; } if ('X'==ch) { for (p=pHead->pNext;p!=NULL;p=p->pNext) { for (q=p->pNext;q!=NULL;q=q->pNext) { if((p->number)>(q->number)) { CopyData(y,p); CopyData(p,q); CopyData(q,y); } } } } else { for (p=pHead->pNext;p!=NULL;p=p->pNext) { for (q=p->pNext;q!=NULL;q=q->pNext) { p_sum=p->object.math+p->object.english+p->object.chinese; q_sum=q->object.math+q->object.english+q->object.chinese; if(p_sum<=q_sum) { CopyData(y,p); CopyData(p,q); CopyData(q,y); } } } } return; } void CopyData(PSTU p1,const PSTU p2) //复制数据 pNext不变 { PSTU pNext; pNext=p1->pNext; *p1=*p2; p1->pNext=pNext; return; } bool Find(PSTU pHead) //查找 { bool isHave=false; PSTU p=pHead; char ch; char name[40]; int number; char sex; float sum; INPUT_ERROR_D: printf("查找方式\n学号(X) 姓名(N) 性别(S)\n"); ch=getchar(); while(getchar()!='\n') continue; ch=toupper(ch); if ('X'==ch) { printf("学号:"); scanf("%d",&number); } else if ('N'==ch) { printf("姓名:"); scanf("%s",name); } else if ('S'==ch) { printf("性别 男(B) 女(G):"); sex=getchar(); sex=toupper(sex); } else { printf("输如错误,请重新输入\n"); goto INPUT_ERROR_D; } while(getchar()!='\n') continue; for (p=pHead->pNext;p!=NULL;p=p->pNext) { sum=p->object.math+p->object.english+p->object.chinese; if ('X'==ch) { if (number==p->number) { isHave=true; printf("\n学号:%d 姓名:%s 性别:%s\n",p->number,p->name,p->sex=='B'?"男":"女"); printf("数学:%.1f 英语%.1f 语文%.1f\n",p->object.math,p->object.english,p->object.chinese); printf("总分:%.1f 平均分:%.1f\n\n",sum,sum/3); } } else if ('N'==ch) { if (strcmp(name,p->name)==0) { printf("\n学号:%d 姓名:%s 性别:%s\n",p->number,p->name,p->sex=='B'?"男":"女"); printf("数学:%.1f 英语%.1f 语文%.1f\n",p->object.math,p->object.english,p->object.chinese); printf("总分:%.1f 平均分:%.1f\n\n",sum,sum/3); } isHave=true; } else if ('S'==ch) { if (sex==p->sex) { printf("\n学号:%d 姓名:%s 性别:%s\n",p->number,p->name,p->sex=='B'?"男":"女"); printf("数学:%.1f 英语%.1f 语文%.1f\n",p->object.math,p->object.english,p->object.chinese); printf("总分:%.1f 平均分:%.1f\n\n",sum,sum/3); } isHave=true; } } return isHave; } bool Insert(PSTU pHead,int pos) //之前的位置插入 { int number; char name[40]; char sex; float grade; int index=0; PSTU p=pHead,pNew=NULL; printf("您要在第几个学生前面插入:"); scanf("%d",&pos); for (index=0;index<pos-1;index++) { p=p->pNext; } if (NULL==p||pos<1) { return false; } pNew=(PSTU)malloc(sizeof(STU)); printf("请输入插入学生的学号:",index+1); scanf("%d",&number); pNew->number=number; printf("请输入插入学生的姓名:",index+1); scanf("%s",name); while(getchar()!='\n') continue; strcpy(pNew->name,name); INPUT_ERROR_D: printf("请输入插入学生的性别 男(B)女(G)",index+1); scanf("%c",&sex); sex=toupper(sex); if (sex!='B'&&sex!='G') { printf("输入错误,请重新输入\n"); goto INPUT_ERROR_D; } pNew->sex=sex; printf("请输入插入学生的数学成绩:"); scanf("%f",&grade); pNew->object.math=grade; printf("请输入插入学生的英语成绩:"); scanf("%f",&grade); pNew->object.english=grade; printf("请输入插入学生的语文成绩:"); scanf("%f",&grade); pNew->object.chinese=grade; while(getchar()!='\n') continue; pNew->pNext=p->pNext; p->pNext=pNew; return true; } bool Delete(PSTU pHead,int pos) //删除数据 { PSTU p=pHead; PSTU pSave=NULL; int index=0; pSave=(PSTU)malloc(sizeof(STU)); printf("您要删除第几个学生的数据:"); scanf("%d",&pos); while(getchar()!='\n') continue; for (index=0;index<pos-1;index++) { p=p->pNext; } if (NULL==p||pos<1||NULL==pSave) { return false; } pSave=p->pNext; p->pNext=pSave->pNext; free(pSave); return true; } int GetLength(PSTU p) //利用递归 求出 长度 { if (p!=NULL) { return 1+GetLength(p->pNext); } return 0; }
学生管理系统.rar
(45.22 KB)
[ 本帖最后由 々NARUTO 于 2013-4-20 17:53 编辑 ]