#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <windows.h>
#include <math.h>
#define STRING_SIZE 20 /*字符串的最大长度*/
#define Init_SIZE 5 /*初始学生信息的人数*/
#define STU_MNG_FAIL 0 /*学生管理系统是否正常运行*/
#define STU_MNG_SUCCESS (!STU_MNG_FAIL)
#define ERR_WARNING() printf("\a") /*对错误信息作出警告*/
#define IG while(getchar()!='\n')
#define c 1 /*代表语文*/
#define m 2 /*代表数学*/
#define e 3 /*代表英语*/
/*
**学生信息的结构
*/
typedef struct sInfo_
{
char name[STRING_SIZE]; /*学生姓名*/
char sNum[STRING_SIZE]; /*学生学号*/
char sex; /*性别(t表示男生,v表示女生)*/
float cScore; /*语文成绩*/
float mScore; /*数学成绩*/
float eScore; /*英语成绩*/
struct sInfo_ *nextStu;
}sInfo;
/*
**学生管理系统的结构
*/
typedef struct sysDev_
{
unsigned stuNum; /*学生的人数*/
char pw[STRING_SIZE]; /*管理系统的密码*/
sInfo *theFirstPointer; /*学生系统指向第一个学生的指针*/
sInfo *theLastPointer; /*学生系统指向最后一个学生的指针*/
}sysDev;
sysDev sysDevMng; /*全局变量,定义一个学生管理系统*/
/*
**不及格学生的结构
*/
typedef struct
{
char name[STRING_SIZE]; /*不及格学生的姓名*/
char upSub[STRING_SIZE]; /*不及格学生的学科*/
float upScore; /*不及格学生的成绩*/
}upStuinfo;
/*
**不及格学生信息的结构
*/
struct
{
upStuinfo *ptrUpStu; /*指向不及格学生的指针*/
struct /*位字段*/
{
unsigned int sum:8;
unsigned int ch:8;
unsigned int ma:8;
unsigned int en:8;
}upSinfo;
}upStuDev;
#define UP_SUM upStuDev.upSinfo.sum /*不及格学生的总数*/
#define UP_CH upStuDev.upSinfo.ch /*语文不及格学生的人数*/
#define UP_MA upStuDev.upSinfo.ma /*数学不及格学生的人数*/
#define UP_EN upStuDev.upSinfo.en /*英语不及格学生的人数*/
#define UP_CH_MA_EN (UP_CH + UP_MA + UP_EN)
void sysDevInit(sysDev *); /*学生管理系统的初始化*/
void addStuInfo(const sInfo *); /*向系统添加已有学生的信息*/
void copyStuInfo(sInfo * ,const sInfo * ); /*复制学生信息*/
void sPasswordInput(); /*输入学生管理系统的密码*/
#define PRINT_LINE printf(" --------------------------------------------------------------------\n") /*打印分割线*/
#define PRINT_ITEMS printf(" name sNum sex cScore mScore eSocre sumScore avScore\n") /*打印表头信息*/
void disAllStuInfo(); /*显示所有学生的信息*/
void disStuInfo(const sInfo *); /*显示一个学生的信息*/
void showHomePage(); /*显示整个学生管理系统的界面*/
void showItems(); /*显示操作项目的信息*/
void runItems(); /*运行操作项目*/
void sortItems(); /*对于排序方法的显示*/
void runSortItems(); /*排序方法的执行*/
void sortByName(); /*按名字进行排序*/
sInfo **getPointerTab(); /*建立一个指向学生信息链表的指针数组*/
void disStuInfoByPtab(sInfo **,const int ); /*显示tab数组中的学生信息*/
void sortByNum(); /*按学号进行排序*/
void sortBySumScore(); /*按总分进行排序*/
int sortBySubjectItems(); /*显示按科目进行排序的items*/
void runSortBySubject(); /*执行按科目排序*/
void sortBySubject(int subject); /*按科目进行排序*/
int addStu(); /*向学生管理系统增加血神*/
void enterStuInfo(sInfo *); /*输入学生信息*/
/*学生信息的初始化*/
sInfo stuInitTab[Init_SIZE]={
{ "Jams", "2014243", 'B', 88.5, 92.0, 84.0 },
{ "Lily", "2014116", 'G', 92.0, 32.5, 60.0 },
{ "Tom", "2014503", 'B', 5.5, 88.0, 72.5 },
{ "Lynda", "2014423", 'G', 52.0, 7.0, 65.5 },
{ "Philips", "2014368", 'B', 45.0, 65.5, 5.0 }
};
/*
**输入学生管理系统的密码
*/
void sPasswordInput()
{
char pwTmp[STRING_SIZE];
puts("please input your password:");
gets(pwTmp);
while(strcmp(pwTmp,sysDevMng.pw)!=0)
{
fputs("wrong password!\n please input password again!",stderr);
ERR_WARNING();
gets(pwTmp);
}
strcpy(sysDevMng.pw,pwTmp);
}
/*
**加载学生信息的文件
*/
void loadFile()
{
int tmp,idx;
FILE *fp;
sInfo tmpStu;
if((fp=fopen("stu.dat","r"))==NULL)
{
fputs("can't load the file!\n",stderr);
ERR_WARNING();
return;
}
rewind(fp);
fread(&tmp,sizeof(int),1,fp);
fread(&sysDevMng.pw,sizeof(sysDevMng.pw),1,fp);
for(idx=0;idx<tmp;idx++)
{
fread(&tmpStu,sizeof(sInfo),1,fp);
addStuInfo(&tmpStu);
}
printf("there are %d students\n",tmp);
fclose(fp);
}
/*
**学生管理系统的初始化
*/
void sysDevInit(sysDev *s)
{
int index;
s->stuNum=0;
s->theFirstPointer=NULL;
s->theLastPointer=NULL;
for(index=0;index<Init_SIZE;index++)
addStuInfo(&stuInitTab[index]);
loadFile();
}
/*
**将一个已有学生的信息添加到系统
*/
void addStuInfo(const sInfo *s)
{
sInfo *tmp;
tmp=(sInfo *)malloc(sizeof(sInfo));
if(tmp==NULL)
{
fputs("error!",stderr);
ERR_WARNING();
}
/*
**判断指向系统的第一个指针是否为空。若为空,则将tmp作为
**指向系统的第一个指针和指向系统的最后一个指针;若不为空,
**则将tmp赋给系统的第一个指针(学生)的下一个学生,并将指向
**系统最后一个学生的指针,指向tmp。指向系统最后一个学生的指针
**的next指向NULL,将tmp学生的信息复制给theFirstPointe,stuNum
**加一。
*/
if(!sysDevMng.theFirstPointer)
{
sysDevMng.theFirstPointer=tmp;
sysDevMng.theLastPointer=tmp;
}
else
{
sysDevMng.theLastPointer->nextStu=tmp;
sysDevMng.theLastPointer=tmp;
}
sysDevMng.theLastPointer->nextStu=NULL;
copyStuInfo(sysDevMng.theLastPointer,tmp);
sysDevMng.stuNum++;
}
/*
**将src学生的信息复制到dst中
*/
void copyStuInfo(sInfo *dst,const sInfo *src)
{
strcpy(dst->name,src->name);
strcpy(dst->sNum,src->sNum);
dst->sex=src->sex;
dst->cScore=src->cScore;
dst->mScore=src->mScore;
dst->eScore=src->eScore;
}
/*
**打印一个学生的信息
*/
void disStuInfo(const sInfo *s)
{
printf(" %s %s %c %5.1f %5.1f %5.1f %5.1f %5.1f\n",s->name,s->sNum,s->sex,s->cScore,s->mScore,s->eScore,s->cScore+s->mScore+s->eScore,(s->cScore+s->mScore+s->eScore)/3.0);
}
/*
**打印所有学生的信息
**将tmp赋值为学生系统的theFirstPointer,只要tmp不为NULL,
**打印学生信息。
*/
void disAllStuInfo()
{
sInfo *tmp=sysDevMng.theFirstPointer;
PRINT_LINE;
PRINT_ITEMS;
PRINT_LINE;
while(tmp)
{
disStuInfo(tmp);
tmp=tmp->nextStu;
}
PRINT_LINE;
printf("the sum of student is %d",sysDevMng.stuNum);
PRINT_LINE;
Sleep(750);
showItems();
}
/*
**对于排序方法的显示
*/
void sortItems()
{
puts("please input the selection <1-4> of sorted information according to:");
PRINT_LINE;
puts(" 1>name 2>studentNum");
puts(" 3>sumScore 4>subject");
PRINT_LINE;
}
/*
**排序方法的执行
*/
void runSortItems()
{
/*
**用枚举建立排序方法的名称
*/
enum sortName{name=1,studentNum,sumScore,subject}index;
int tmp;
/*将枚举转化为int类型*/
scanf("%d",&tmp);
index=(enum sortName)tmp;
switch(index)
{
case name:
sortByName();
Sleep(750);
showItems();
break;
case studentNum:
sortByNum();
Sleep(750);
showItems();
break;
case sumScore:
sortBySumScore();
Sleep(750);
showItems();
break;
case subject:
//sortBySubjectItems();
runSortBySubject();
Sleep(750);
showItems();
break;
default:
fputs("input error!\n",stderr);
sortItems();
}
}
/*
**建立一个指向学生信息链表的指针数组
*/
sInfo **getPointerTab()
{
sInfo *tmp,**index,**tab;
index=tab=(sInfo **)malloc(sysDevMng.stuNum*(sizeof(sInfo)));
if(tab==NULL)
{
fputs("unknown error!\n",stderr);
ERR_WARNING();
}
else
{
tmp=sysDevMng.theFirstPointer;
while(tmp)
{
*(index++)=tmp;
tmp=tmp->nextStu;
}
}
return tab;
}
/*
**显示tab数组中的学生信息
*/
void disStuInfoByPtab(sInfo **tab,const int size)
{
int i;
PRINT_LINE;
PRINT_ITEMS;
PRINT_LINE;
for(i=0;i<size;i++)
{
disStuInfo(*tab++);
}
PRINT_LINE;
printf(" Now the SumStu is %d\n", sysDevMng.stuNum);
PRINT_LINE;
}
/*
**按名字进行排序
*/
void sortByName()
{
int i,j;
sInfo *tmp,**tab;
tab=getPointerTab();
if(tab==NULL)
{
fputs("unknown error!\n",stderr);
ERR_WARNING();
}else
{
for(i=0;i<sysDevMng.stuNum-1;i++)
{
for(j=i+1;j<sysDevMng.stuNum;j++)
{
if(strcmp(tab[i]->name,tab[j]->name)>0)
{
tmp=tab[i];
tab[i]=tab[j];
tab[j]=tmp;
}
}
}
puts("the sort by studentName is:");
disStuInfoByPtab(tab,sysDevMng.stuNum);
}
free(tab);
}
/*
**按学号进行排序
*/
void sortByNum()
{
int i,j;
sInfo *tmp,**tab;
tab=getPointerTab();
if(tab==NULL)
{
fputs("unknown error!\n",stderr);
ERR_WARNING();
}else
{
for(i=0;i<sysDevMng.stuNum-1;i++)
{
for(j=i+1;j<sysDevMng.stuNum;j++)
{
if(strcmp(tab[i]->sNum,tab[j]->sNum)>0)
{
tmp=tab[i];
tab[i]=tab[j];
tab[j]=tmp;
}
}
}
puts("the sort by studentNum is:");
disStuInfoByPtab(tab,sysDevMng.stuNum);
}
free(tab);
}
/*
**按总分进行排序
*/
void sortBySumScore()
{
int i,j;
sInfo *tmp,**tab;
tab=getPointerTab();
if(tab==NULL)
{
fputs("unknown error!\n",stderr);
ERR_WARNING();
}else
{
for(i=0;i<sysDevMng.stuNum-1;i++)
{
for(j=i+1;j<sysDevMng.stuNum;j++)
{
float sum1=tab[i]->cScore+tab[i]->eScore+tab[i]->mScore;
float sum2=tab[j]->cScore+tab[j]->eScore+tab[j]->mScore;
if(sum1>sum2)
{
tmp=tab[i];
tab[i]=tab[j];
tab[j]=tmp;
}
}
}
puts("the sort by studentsumScore is:");
disStuInfoByPtab(tab,sysDevMng.stuNum);
}
free(tab);
}
/*
**显示按科目进行排序的items
*/
int sortBySubjectItems()
{
int index;
puts("input <1-3> to select :");
PRINT_LINE;
puts(" 1>cScore 2>mScore 3>eScore");
PRINT_LINE;
while(!((1==scanf("%d",&index))&&(index>=1&&index<=3)))
{
fputs("input error!\nplease input <1-3> according to :",stderr);
ERR_WARNING();
}
return index;
}
#define sortBycScoe() sortBySubject(c)
#define sortBymScoe() sortBySubject(m)
#define sortByeScoe() sortBySubject(e)
/*
**执行按科目进行排序
*/
void runSortBySubject()
{
switch(sortBySubjectItems())
{
case c:
sortBycScoe();
break;
case m:
sortBycScoe();
break;
case e:
sortBycScoe();
break;
}
}
/*
**按科目成绩进行排序
*/
void sortBySubject(int subject)
{
int i,j;
sInfo *tmp,**tab;
tab=getPointerTab();
if(tab==NULL)
{
fputs("unknown error!\n",stderr);
ERR_WARNING();
}else
{
for(i=0;i<sysDevMng.stuNum-1;i++)
{
for(j=i+1;j<sysDevMng.stuNum;j++)
{
float sum1=0.0,sum2=0.0;
if(subject==1)
{
sum1=tab[i]->cScore;
sum2=tab[j]->cScore;
}else if(subject==2)
{
sum1=tab[i]->mScore;
sum2=tab[j]->mScore;
}else if(subject==3)
{
sum1=tab[i]->eScore;
sum2=tab[j]->eScore;
}
if(sum1>sum2)
{
tmp=tab[i];
tab[i]=tab[j];
tab[j]=tmp;
}
}
}
if(subject==1)
{
puts("the sort by studentcScore is:");
}else if(subject==2)
{
puts("the sort by studentmScore is:");
}else if(subject==3)
{
puts("the sort by studenteScore is:");
}
disStuInfoByPtab(tab,sysDevMng.stuNum);
}
free(tab);
}
/*
**向学生管理系统增加血神
*/
int addStu()
{
sInfo *tmp;
if(!(tmp=(sInfo *)malloc(sizeof(sInfo))))
{
fputs("malloc error!\n",stderr);
ERR_WARNING();
return STU_MNG_FAIL;
}
if(!sysDevMng.theFirstPointer)
{
sysDevMng.theFirstPointer=sysDevMng.theLastPointer=tmp;
}
else
{
sysDevMng.theLastPointer->nextStu=tmp;
sysDevMng.theLastPointer=tmp;
}
sysDevMng.theLastPointer->nextStu=NULL;
enterStuInfo(sysDevMng.theLastPointer);
sysDevMng.stuNum++;
puts("add student successfully!");
disAllStuInfo();
return STU_MNG_SUCCESS;
}
/*
**输入学生信息
*/
void enterStuInfo(sInfo *stu)
{
puts("please input your name:");
scanf("%s",stu->name);IG;
puts("please input your stunum(102117):");
scanf("%s",stu->sNum);IG;
puts("please input your sex(t or v):");
scanf("%c",&stu->sex);IG;
puts("please input your cScore:");
scanf("%f",&stu->cScore);IG;
puts("please input your mScore:");
scanf("%f",&stu->mScore);IG;
puts("please input your eScore:");
while(!scanf("%f",&stu->eScore))
{
fputs("input error!\n",stderr);
ERR_WARNING();
}
}
/*
**删除学生链表中的结点
*/
int deleteStustr(const char *str)
{
sInfo *headcur=NULL,*tailcur=sysDevMng.theFirstPointer;
while(tailcur&&(strcmp(tailcur->name,str)!=0&&strcmp(tailcur->sNum,str)!=0))
{
headcur=tailcur;
tailcur=tailcur->nextStu;
}
if(tailcur==NULL)
{
fputs("error!Stu not found.",stderr);
ERR_WARNING();
return STU_MNG_FAIL;
}
if(tailcur==sysDevMng.theFirstPointer)
{
sysDevMng.theFirstPointer=tailcur->nextStu;
free(tailcur);
}
else
{
headcur->nextStu=tailcur->nextStu;
free(tailcur);
}
sysDevMng.stuNum--;
return STU_MNG_SUCCESS;
}
/*
**删除学生
*/
int deleteStu()
{
int res;
char tmp[STRING_SIZE];
puts("please input delete Stu'name or Stu'num:");
gets(tmp);
res=deleteStustr(tmp);
if(res==STU_MNG_FAIL)
{
fputs("delete error!",stderr);
ERR_WARNING();
}
else
{
puts("delete successfully!");
}
disAllStuInfo();
return res;
}
/*
**加载不及格学生的信息
*/
void loadUpSinfo(const sInfo *stu)
{
UP_SUM=UP_CH=UP_MA=UP_EN=0;
if(stu==NULL)
{
upStuDev.ptrUpStu=NULL;
fputs("No stuInfo!",stderr);
ERR_WARNING();
return;
}
while(stu)
{
if(stu->cScore<60||stu->mScore<60||stu->eScore<60)
{
UP_SUM++;
if(stu->cScore<60)
{
upStuDev.ptrUpStu=(upStuinfo *)realloc(upStuDev.ptrUpStu,(UP_CH_MA_EN+1)*sizeof(upStuinfo));
if(upStuDev.ptrUpStu==NULL)
{
fputs("realloc error!",stderr);
ERR_WARNING();
}
else
{
strcpy((upStuDev.ptrUpStu+UP_CH_MA_EN)->name,stu->name);
strcpy((upStuDev.ptrUpStu+UP_CH_MA_EN)->upSub,"chinese");
(upStuDev.ptrUpStu+UP_CH_MA_EN)->upScore=stu->cScore;
}
UP_CH++;
}
if(stu->mScore<60)
{
upStuDev.ptrUpStu=(upStuinfo *)realloc(upStuDev.ptrUpStu,(UP_CH_MA_EN+1)*sizeof(upStuinfo));
if(upStuDev.ptrUpStu==NULL)
{
fputs("realloc error!",stderr);
ERR_WARNING();
}
else
{
strcpy((upStuDev.ptrUpStu+UP_CH_MA_EN)->name,stu->name);
strcpy((upStuDev.ptrUpStu+UP_CH_MA_EN)->upSub,"math");
(upStuDev.ptrUpStu+UP_CH_MA_EN)->upScore=stu->mScore;
}
UP_MA++;
}
if(stu->eScore<60)
{
upStuDev.ptrUpStu=(upStuinfo *)realloc(upStuDev.ptrUpStu,(UP_CH_MA_EN+1)*sizeof(upStuinfo));
if(upStuDev.ptrUpStu==NULL)
{
fputs("realloc error!",stderr);
ERR_WARNING();
}
else
{
strcpy((upStuDev.ptrUpStu+UP_CH_MA_EN)->name,stu->name);
strcpy((upStuDev.ptrUpStu+UP_CH_MA_EN)->upSub,"english");
(upStuDev.ptrUpStu+UP_CH_MA_EN)->upScore=stu->eScore;
}
UP_EN++;
}
}
stu=stu->nextStu;
}
}
/*
**显示不及格学生的信息
*/
void disUpassStu()
{
unsigned int i;
loadUpSinfo(sysDevMng.theFirstPointer);
if( upStuDev.ptrUpStu==NULL )
{
fputs("Not found unpassStu!",stderr);
ERR_WARNING();
}
else
{
printf("unpassStu information:\n");
printf(" UnPassesStu info: \n");
printf(" -----------------------------------------------\n");
printf(" UnpassSum UnpassCh UnpassMa UnpassEn \n");
printf(" -----------------------------------------------\n");
printf(" %d %d %d %d \n",UP_SUM,UP_CH,UP_MA,UP_EN);
printf(" -----------------------------------------------\n");
printf(" UnpassStuName UnpassSubj UnpassScore \n");
printf(" -----------------------------------------------\n");
for(i=0;i<(UP_CH_MA_EN);i++)
{
printf(" %10s %10s %.1f \n",(upStuDev.ptrUpStu)->name,(upStuDev.ptrUpStu+i)->upSub,(upStuDev.ptrUpStu+i)->upScore);
}
}
printf(" -----------------------------------------------\n\n");
showItems();
Sleep(750);
free(upStuDev.ptrUpStu);
}
/*
**修改密码
*/
void chPasswd()
{
int oldPasswd;
char temp1[STRING_SIZE],temp2[STRING_SIZE];
oldPasswd=strlen(sysDevMng.pw);
if(oldPasswd==0)
{
puts("please create a password!");
puts("please input password:");
LabelA:gets(temp1);
puts("please input the password again:");
gets(temp2);
if(strcmp(temp1,temp2)==0)
{
puts("create password successfully!");
}
else
{
fputs("The two passwords you entered do not match, please input again: ",stderr);
ERR_WARNING();
goto LabelA;
}
}
else
{
puts("please input a new password:");
LabelB:gets(temp1);
while(strcmp(temp1,sysDevMng.pw)==0)
{
fputs("\n The password you input already exists! Please input a new password again: \n", stderr);
ERR_WARNING();
gets(temp1);
}
puts("please input the password again:");
gets(temp2);
if(strcmp(temp1,temp2)==0)
{
puts("create password successfully!");
}
else
{
fputs("The two passwords you entered do not match, please input again: ",stderr);
ERR_WARNING();
goto LabelB;
}
}
strcpy(sysDevMng.pw,temp2);
Sleep(750);
showItems();
}
/*
**将信息已文件的方式保存
*/
void saveFile()
{
FILE *fp;
sInfo *pstu;
if((fp=fopen("stu.dat","wb"))==NULL)
{
fputs("can't save the file\n",stderr);
ERR_WARNING();
return;
}
rewind(fp);
fwrite(&sysDevMng.stuNum,sizeof(int),1,fp);
fwrite(&sysDevMng.pw,sizeof(sysDevMng.pw),1,fp);
for(pstu=sysDevMng.theFirstPointer;pstu!=sysDevMng.theLastPointer;++pstu)
{
fwrite(pstu,sizeof(sInfo),1,fp);
}
printf("there are %d student saved\n",sysDevMng.stuNum);
fclose(fp);
}
/*
**退出系统
*/
void quitSystem()
{
int cnt=3;
saveFile();
do
{
printf("the Sys will quit in %d\n",cnt);
Sleep(1000);
--cnt;
}while(cnt>1);
printf("the Sys will quit in %d\n",cnt);
exit(0);
}
/*
**显示学生管理系统的整个界面
*/
void showHomePage()
{
printf(" ========================================================== \n");
printf(" ** ** \n");
printf(" ** Student information Management System ** \n");
printf(" ** Copyright(C) of cyf ** \n");
printf(" ** TIME:%s %s **\n",__DATE__,__TIME__);
printf(" ** ** \n");
printf(" ========================================================== \n");
}
/*
**显示操作项目的信息
*/
void showItems()
{
puts("Please input <1-7> to select items:");
puts(" -----------------------------------------------------------------------");
puts(" 1>scan all student's information 2>sorted student's information");
puts(" 3>add student's information 4>delete student's information");
puts(" 5>scan unpass student's information 6>change password");
puts(" 7>quit from system");
puts(" -----------------------------------------------------------------------");
puts(" -----------------------------------------------------------------------");
}
/*
**运行操作的功能
*/
void runItems()
{
while(STU_MNG_SUCCESS)
{
/*用枚举类型表示选项的数字*/
enum itemsChoice{disAllInfo=1,sortedInfo,addStuInfo,deleteStuInfo,disUpStu,changePw,quitSys} index;
/*
**将枚举类型转换成int类型
*/
int t;
scanf("%d",&t);
while(getchar()!='\n');
index=(enum itemsChoice)t;
/*
**完成相应的操作
*/
switch(index)
{
case disAllInfo:
disAllStuInfo();
break;
case sortedInfo:
sortItems();
runSortItems();
break;
case addStuInfo:
addStu();
break;
case deleteStuInfo:
deleteStu();
break;
case disUpStu:
disUpassStu();
break;
case changePw:
chPasswd();
break;
case quitSys:
quitSystem();
break;
default:
fputs("input error!please input <1-7>to select items!\n",stderr);
ERR_WARNING();
showItems();
}
}
}
/*
**学生管理系统的运行
*/
void sysDevRun()
{
showHomePage();
sPasswordInput();
showItems();
runItems();
}
/*
**主函数
*/
int main()
{
sysDevInit(&sysDevMng);
sysDevRun();
return 0;
}
学生管理系统(c语言)
最新推荐文章于 2022-10-22 09:56:06 发布