您的位置:首页 > 其它

学生管理系统

2007-07-08 23:34 127 查看
学生管理系统

#include <stdio.h>
#include <iostream.h>
#include <string.h>
#include <malloc.h>
#include <conio.h>

typedef struct stu //学生资料
{
char _class[20]; //班级
int num; //学号(两位数)
char name[8]; //姓名

float elec; //电子技术
float C_prog; //c++程序设计
float media; //多媒体
float Eng; //大学英语
float math; //大学数学
float sport; //大学体育
float polity; //政治

float ave; //平均成绩
int order; //名次
stu *next; //记录下一结点的指针
}stuNode;

stuNode *Input(stuNode *link, int *pn); //录入
stuNode *Statistic(stuNode *link, int n); //统计
void Lookup(stuNode *link); //查询
stuNode *Modify(stuNode *link); //修改
stuNode *Delete(stuNode *link, int *pn); //删除
void Output(stuNode *link, int n); //输出班级学生成绩

stuNode *Create(char *pcha); //创建新结点
stuNode *Insert(stuNode *link, stuNode *s); //按平均成绩插入结点
stuNode *Search(stuNode *link, int number);
stuNode *Sort(stuNode *link, int n); //按平均成绩排序(排名)

// 录入函数:
// 输入学生各科成绩,并按平均成绩降序插入链表。
//
stuNode *Input(stuNode *link, int *pn)
{
stuNode *s; //指向新结点
char op;
char cla[20];

cout << "学生班级:";
cin >> cla;

do
{
s=Create(cla); //创建结点
if (s==NULL)
return NULL;
else
{
printf( "/n班级:%s/n",s->_class);
printf( "------------------------------------------------------------------------------/n" );
printf( "|学号| 姓名 |电子技术| C++ | 多媒体 | 英语 | 数学 | 体育 |政治经济|/n" );
printf( "------------------------------------------------------------------------------/n" );
printf( "| %2d |%-8s|%8.0f|%8.0f|%8.0f|%8.0f|%8.0f|%8.0f|%8.0f|/n", s->num,
s->name,
s->elec,
s->C_prog,
s->media,
s->Eng,
s->math,
s->sport,
s->polity );
printf( "------------------------------------------------------------------------------/n" );
fflush(stdin); //清空标准缓冲区
printf("确认信息是否正确:(正确:(Y);不正确:(N)/n");
scanf("%c", &op);
if (op=='N'||op=='n')
{
free(s);
Input(link, pn);
}
}
link=Insert(link, s);
*pn = *pn+1;

do
{
fflush(stdin); //清空标准缓冲区
cout << "/n继续录入吗?(录入:Y;退出:N)";
cin >> op;
}
while(op!='n' && op!='N' && op!='y' && op!='Y');

}
while(op=='Y'||op=='y');

return link;
}

// 统计函数
// 统计各科成绩的平均成绩、学生人数,并显示结果。
//
stuNode *Statistic(stuNode *link, int n)
{
stuNode *pstat; //指向统计结果
stuNode *t;
char i, *w=&i;
if(link==NULL)
{
cout << "/n没有学生/n";
return NULL;
}
;
if ((pstat = (stuNode *)malloc(sizeof(stuNode)))==NULL)
{
cout << "统计失败";
return NULL;
}

strcpy(pstat->_class, link->_class);

pstat->elec = link->elec;
pstat->C_prog = link->C_prog;
pstat->media = link->media;
pstat->Eng = link->Eng;
pstat->math = link->math;
pstat->sport = link->sport;
pstat->polity = link->polity;

for(t=link->next; t!=NULL; t=t->next)
{
pstat->elec = pstat->elec + t->elec;
pstat->C_prog = pstat->C_prog + t->C_prog;
pstat->media = pstat->media + t->media;
pstat->Eng = pstat->Eng + t->Eng;
pstat->math = pstat->math + t->math;
pstat->sport = pstat->sport + t->sport;
pstat->polity = pstat->polity + t->polity;
}
pstat->elec = pstat->elec / n;
pstat->C_prog = pstat->C_prog / n;
pstat->media = pstat->media / n;
pstat->Eng = pstat->Eng / n;
pstat->math = pstat->math / n;
pstat->sport = pstat->sport / n;
pstat->polity = pstat->polity / n;

printf( "/n 班级:%s /n",pstat->_class);
printf( "----------------------------------------------------------------/n" );
printf( "|电子技术| C++ | 多媒体 | 英语 | 数学 | 体育 |政治经济|/n" );
printf( "----------------------------------------------------------------/n" );
printf( "|%8.0f|%8.0f|%8.0f|%8.0f|%8.0f|%8.0f|%8.0f|/n", pstat->elec,
pstat->C_prog,
pstat->media,
pstat->Eng,
pstat->math,
pstat->sport,
pstat->polity );
printf( "----------------------------------------------------------------/n" );
printf( " 共%d人 /n", n);

cout << "输入任意字符继续";
cin >> *w;
free(w);
return pstat;
}

// 查询函数:
// 按指定学号查询
//
void Lookup(stuNode *link, int n)
{
int number;
stuNode *t;
char i, *w=&i;
cout << "请输入学号:";
cin >> number;
t=Search(link, number);
if(t!=NULL)
{
link=Sort(link, n);
printf( "/n班级:%s/n", t->_class);
printf( "-------------------------------------------------------------------------------/n" );
printf( "|学号| 姓名 |电子技术| C++ |多媒体| 英语 | 数学 | 体育 |政治经济|平均分|名次|/n" );
printf( "-------------------------------------------------------------------------------/n" );
printf( "| %2d |%-8s|%8.0f|%5.0f|%6.0f|%6.0f|%6.0f|%6.0f|%8.0f|%6.0f| %2d |/n", t->num,
t->name,
t->elec,
t->C_prog,
t->media,
t->Eng,
t->math,
t->sport,
t->polity,
t->ave,
t->order);
printf( "--------------------------------------------------------------------------------/n" );
}
else
{
cout << "/n没有这位学生/n";
}
cout << "输入任意字符继续";
cin >> *w;
free(w);
return;
}

//修改函数
//
stuNode *Modify(stuNode *link)
{
stuNode *t,*p;
char i,*w=&i;
int number;
cout << "/n请输入要修改的学生学号:";
cin >> number;
t=Search(link, number);
if(t==NULL)
{
cout << "没有这个学生";

}
else
{
printf( "/n班级:%s/n", t->_class);
printf( "-------------------------------------------------------------------------------/n" );
printf( "|学号| 姓名 |电子技术| C++ |多媒体| 英语 | 数学 | 体育 |政治经济|平均分|名次|/n" );
printf( "-------------------------------------------------------------------------------/n" );
printf( "| %2d |%-8s|%8.0f|%5.0f|%6.0f|%6.0f|%6.0f|%6.0f|%8.0f|%6.0f| %2d |/n", t->num,
t->name,
t->elec,
t->C_prog,
t->media,
t->Eng,
t->math,
t->sport,
t->polity,
t->ave,
t->order);
printf( "-------------------------------------------------------------------------------/n" );

cout << "/n请输入新信息:";
t->num=number;
cout << "/n姓名:";
cin >> t->name;
cout << "/n电子技术:";
cin >> t->elec;
cout << "/nC++:";
cin >> t->C_prog;
cout << "/n多媒体:";
cin >> t->media;
cout << "/n英语:";
cin >> t->Eng;
cout << "/n数学:";
cin >> t->math;
cout << "/n体育:";
cin >> t->sport;
cout << "/n政治:";
cin >> t->polity;
t->ave = (t->elec + t->C_prog + t->media
+ t->Eng + t->math + t->sport + t->polity) / 7;
p=link;
if(p==t)
link=t->next;
else
{
for (p=link; p->next!=t; p=p->next); //找t的前一个结点
p->next=t->next; //把t结点与链表分离
}
t->next=NULL;
cout << "/n/nyes/n";
link=Insert(link,t); //重新插入结点t
cout << "/n修改成功/n";
cout << "输入任意字符继续";
cin >> *w;
free(w);
}
cout <<"/n/n/n/n/n/n";
return link;
}

//删除
//
stuNode *Delete(stuNode *link, int *pn)
{
stuNode *t;
stuNode *p;
int number;
char i, *w=&i;
cout << "请选择要删除的学号:";
cin >> number;
t=Search(link, number);
if(t==NULL)
{

return link;
}
do
{
cout << "真的要删除?是(y);否(n):";
cin >> i;
}while(i!='y' && i!='Y' && i!='n' && i!='N');

if(i=='n' || i=='N')
return link;
else
{
if(t==link)
{
link=t->next;
}
else
{

for(p=link; p->next!=t; p=p->next); //找出t结点的前驱结点

p->next=t->next;
t->next;
}

free(t);
cout << "/n删除成功/n";
*pn=*pn-1;
cout << "输入一个任意字符结束操作";
cin >> *w;
free(w);
return link;
}
}

//输出函数
//
void Output(stuNode *link, int n)
{
stuNode *t;
char i, *w=&i;
if (link==NULL)
{
cout << "/n没有学生/n";

}
else
{
link=Sort(link,n);
printf( "/n班别:%s /n", link->_class);
printf( "-------------------------------------------------------------------------------/n" );
printf( "|学号| 姓名 |电子技术| C++ |多媒体| 英语 | 数学 | 体育 |政治经济|平均分|名次|/n" );
printf( "-------------------------------------------------------------------------------/n" );
for(t=link; t!=NULL; t=t->next)
{
printf( "| %2d |%-8s|%8.0f|%5.0f|%6.0f|%6.0f|%6.0f|%6.0f|%8.0f|%6.0f| %2d |/n", t->num,
t->name,
t->elec,
t->C_prog,
t->media,
t->Eng,
t->math,
t->sport,
t->polity,
t->ave,
t->order);
printf( "-------------------------------------------------------------------------------/n" );
}
}
cout << "/n输入任意字符结束操作/n";
cin >> *w;
free(w);
return;
}

//创建函数
// 创建学生结点
//
stuNode *Create(char *pcla)
{
stuNode *s;

s = (stuNode *)malloc(sizeof(stuNode));
if(s==NULL)
{
cout << "申请内存失败";
return (NULL);
}
else
{
fflush(stdin); //清空标准缓冲区
cout << "请输入学生资料:/n";
cout << "班级:" << pcla << '/n';
strcpy(s->_class, pcla);
cout << "/n学生学号:";
cin >> s->num;
cout << "/n学生姓名:";
cin >> s->name;

cout << "/n他的各科成绩:";

cout << "/n电子技术:";
cin >> s->elec;
cout << "/nC++程序设计:";
cin >> s->C_prog;
cout << "/n多媒体:";
cin >> s->media;
cout << "/n大学英语:";
cin >> s->Eng;
cout << "/n高等数学:";
cin >> s->math;
cout << "/n大学体育:";
cin >> s->sport;
cout << "/n马克思主义政治经济学:";
cin >> s->polity;

s->ave = (s->elec + s->C_prog + s->media
+ s->Eng + s->math + s->sport + s->polity) / 7;
cout << s->ave;
}
return s;
}

// 插入函数:
// 按平均成绩插入各结点
//
stuNode *Insert(stuNode *link, stuNode *s )
{
stuNode *p, *t;
t=link;

if (link==NULL)
{
link=s;
return link;
}
else
{
if (t->ave < s->ave)
{
link=s;
s->next=t;
}
else
{
while (t->ave >= s->ave)
{
if(t->next==NULL)
{
t->next=s;
s->next=NULL;
return link;
}
p=t;
t=t->next;
}
s->next = t;
p->next = s;
}
}
return link;
}

//查找函数
// 返回值是结果的结点
stuNode *Search(stuNode *link, int number)
{
stuNode *t;
if (link==NULL)
{
cout << "/n没有学生/n";
return NULL;
}
else
{
for (t=link; (t!=NULL)&&(t->num!=number); t=t->next);

if (t->num==number)
return t;
cout << "/n没有这位学生/n";
return t;
}
}

//排序函数
stuNode *Sort(stuNode *link, int n)
{
int i; //序号
stuNode *t;
if(link==NULL)
return NULL;
else
{
for(t=link,i=1; i<=n; t=t->next,i++)
t->order=i;
return link;
}
}

int main()
{
stuNode *link=NULL; //链表头指针
stuNode *pstat; //指向记录统计结果
char op; //记录操作选项
int n=0; //学生人数

while(1)
{

cout << "/n/n/n/n/n/n";
cout << " ************************************FOUND************************************/n"
<< " -----------------------------------------------------------------------------/n"
<< '/n'
<< " 请选择操作:1.录入学生成绩 2.统计学生各科成绩的平均成绩 /n"
<< " 3.查询学生成绩 4.修改学生科目分数 /n"
<< " 5.删除学生记录 6.输出全班成绩 /n"
<< '/n'
<< " 0.退出 /n"
<< '/n'
<< " 注意:本系统每次打开只能记录一个班的资料 /n"
<< '/n'
<< " -----------------------------------------------------------------------------/n"
<< " *************************************END*************************************/n";
cin >> op;
fflush(stdin);
switch(op)
{
case '0':
return 0;
break;
case '1':
link=Input(link, &n);
break;
case '2':
pstat=Statistic(link, n);
break;
case '3':
Lookup(link,n);
break;
case '4':
link=Modify(link);
break;
case '5':
Delete(link, &n);
break;
case '6':
Output(link, n);
break;
default:
cout << "错误输入!!";
break;
}
}
getch();
return 0;
}

四、运行环境

五、输入值:

六、运行结果:
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: