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;
}
[ 本帖最后由 々NARUTO 于 2013-4-20 17:53 编辑 ]









