谁能帮我精简下??!!!!!!!!!!!!!!

Mafias 2008-04-17 01:13:19
题目要求:用C语言编写一个程序实现学员成绩管理,每个学员包括3门课的成绩.从键盘输入学员信息,包括学员、姓名、三门课的成绩,计算出学员的平均成绩,按照学员平均成绩由大到小排序。另外需要增加下面的管理功能。
(1)插入功能:在排序后的学员成绩表中插入一个学员的信息,要求插入后仍然保持成绩表原有排序。
(2)删除功能:要求输入指定的学号,从学员的信息表中删除该学员,删除后的成绩表保持原有排序。

#include<stdio.h>
#include<string.h>
#define N 99
struct a
{
int chinese;
int english;
int math;//数学
int even;//evenness 平均成绩
};
struct student
{
int taxis;
char name[N];
struct a score;//科目成绩
};
void input(int,struct student *);//输入
void taxis1(int,struct student *);//按学号排序
void taxis2(int,struct student *);//按平均成绩排序
void extend(int,struct student *);//(扩充)插入
void demand(int,struct student *);//查询
void shanchu(int,struct student *);//删除
void display(int ,struct student *);//(显示)输出
void main()
{
struct student stu[N],*ps;
int choose;//选择菜单
char in,a;
int i,j,b;
ps=stu;
printf("\n请输入学生信息:");
for(i=0;i<N;i++)
{
input(i,ps);

printf("\n\n是否需要继续输入?(y or n)");
fflush(stdin);
in=getchar();
if(in!='y'&&in!='Y')
break;
}
printf("信息输入完毕,输入信息如下:请核对!");
display(i,ps);
printf("\n\n如果信息输入有误,请登陆管理员帐号进行修改!");
printf("\n\n *注意 客户权限只可查询与访问*!");
do{
printf("\n\n1.管理员 \t2.普通客户\t3.退出\n\n请选择登陆方式:");

scanf("%d",&a);
if(a==1)
{
for(j=0;j<3;j++){
printf("\n请输入密码:");

scanf("%d",&b);//fflush(stdin);
if(b==1234){
do
{
printf("\n\n1.显示学生信息:\n2.按学号输出:\n3.按平均成绩输出:\n4.插入学生信息:\n5.查询学生信息:\n6.删除学生信息:\n0.返回上一菜单;");
printf("\n\n请选择");
scanf("%d",&choose);
if(choose==1)
display(i,ps);
else if(choose==2)
taxis1(i,ps);
else if(choose==3)
taxis2(i,ps);
else if(choose==4){
extend(i+1,ps);
++i;}
else if(choose==5)
demand(i,ps);
else if(choose==6){
shanchu(i,ps);
--i;}
else if(choose==0)
break;
else
printf("输入错误,请重新选择:\n");
}while(1);//choose!=0&&choose!=1&&choose!=2&&choose!=3&&choose!=4
break;
}
else
printf("\n密码不正确,请重新输入!");
}
if(j==3)
printf("\n输入错误密码次数已达三次,自动退出管理员登陆界面");
}
else if(a==2)
{
do
{
printf("\n\n1.显示学生信息:\n2.按学生学号输出\n3.按学生平均成绩大小输出:\n4.查询学生信息;\n0.返回上一菜单;");
printf("\n\n请选择");
scanf("%d",&choose);
if(choose==1)
display(i,ps);
else if(choose==2)
taxis1(i,ps);
else if(choose==3)
taxis2(i,ps);
else if(choose==4)
demand(i,ps);
else if(choose==0)
break;
else
printf("\n输入错误,请重新选择:");
}while(1);//choose!=0&&choose!=1&&in!=2&&choose!=3
}
else if(a==3)
break;
else
printf("\n选择出错,请重新选择:");
}while(1);
}
void input(int i,struct student *ps)//输入函数
{
printf("\n\n学号:");
scanf("%d",&(ps+i)->taxis);
printf("\n姓名:");
fflush(stdin);
gets((ps+i)->name);
printf("\n三门成绩:");
printf("\n语文:");
scanf("%d",&((ps+i)->score.chinese));
printf("数学:");
scanf("%d",&(ps+i)->score.math);
printf("英语:");
scanf("%d",&(ps+i)->score.english);
(ps+i)->score.even=((ps+i)->score.chinese+(ps+i)->score.english+(ps+i)->score.math)/3;
}
void display(int i,struct student *ps)//输出
{
int j;
printf("\n学号\t姓名\t语文\t数学\t英语\t平均成绩\t");

for(j=0;j<=i;j++,ps++)
{
printf("\n%d\t%s\t%d\t%d\t%d\t%d\t",ps->taxis,&(ps->name),ps->score.chinese,ps->score.math,ps->score.english,ps->score.even);
}
}
void taxis1(int i,struct student *ps)//按学号排序
{
int k,j;
struct student temp;
for(j=0;j<=i;j++)
{
for(k=0;k<i-j;k++)
{
if((ps+k)->name>(ps+k+1)->name)
{
temp=*(ps+k);
*(ps+k)=*(ps+k+1);
*(ps+k+1)=temp;
}

}
}
display(i,ps);
}
void taxis2(int i,struct student *ps)//按平均成绩排序
{
int k,j;
struct student temp;
for(j=0;j<=i;j++)
{
for(k=0;k<i-j;k++)
{
if((ps+k)->score.even<(ps+k+1)->score.even)
{
temp=*(ps+k);
*(ps+k)=*(ps+k+1);
*(ps+k+1)=temp;
}

}
}
display(i,ps);
}
void extend(int i,struct student *ps)//(扩充)插入函数
{
struct student end,*pe;
int k=0,j;
pe=&end;
input(0,pe);

for(j=0;j<i+1;j++)
{
if((ps+j)->score.even<pe->score.even)
break;
}
for(k=i;k>j;k--)
{
*(ps+k)=*(ps+k-1);
}
*(ps+j)=*(pe);
display(0,pe);
printf("\n插入完成,请继续\n");

}
void demand(int i,struct student *ps)//查询功能
{
char de[N];
int k;
printf("\n请输入要查询的姓名或学号:");
fflush(stdin);
gets(de);
for(k=0;k<i+1;k++)
{
if((strcmp(de,(ps+k)->name)==0)||(strcmp(de,"k+1")==0))
break;
}
if(k<i+1)
display(0,ps+k);
else
printf("\n没有你要查询的资料");
}
void shanchu(int i,struct student *ps)
{
char del[N];
int k,j;
printf("\n请输入要删除的学号或名字:");
fflush(stdin);
gets(del);
for(k=0;k<i+1;k++)
{
if((strcmp(del,(ps+k)->name)==0)||(strcmp(del,"k+1")==0))
break;
}
if(k<i+1)
{
display(0,ps+k);
if(k<i)
{
for(j=k;j<i+1;j++)
{
*(ps+j)=*(ps+j+1);
}
}
printf("\n删除完成,请继续:");
}
else
printf("\n没有你要查询的资料");

}


会的帮我精简一下星期六答辩用。。。。。


...全文
208 32 打赏 收藏 转发到动态 举报
写回复
用AI写文章
32 条回复
切换为时间正序
请发表友善的回复…
发表回复
Mafias 2008-04-17
  • 打赏
  • 举报
回复
[Quote=引用 30 楼 red_berries 的回复:]
引用 24 楼 Mafias 的回复:
引用 6 楼 clhposs 的回复:
引用 4 楼 tgh621 的回复:
不会是毕业答辩把。。。。。。。。。


如果是毕业辩答 那么也太......

如果是建议楼主换个吧!

俺个高中生小菜都可以写出来 -_-!


不是毕业答辩的.....是C++课程结束的答辩


你用这个做C++课程结束的答辩 ?连一个class也没,并且这么明显的用class解决的问题你不用class
[/Quote]

为什么要用class呢? 给个理由先
myullian 2008-04-17
  • 打赏
  • 举报
回复
好长啊
red_berries 2008-04-17
  • 打赏
  • 举报
回复
[Quote=引用 24 楼 Mafias 的回复:]
引用 6 楼 clhposs 的回复:
引用 4 楼 tgh621 的回复:
不会是毕业答辩把。。。。。。。。。


如果是毕业辩答 那么也太......

如果是建议楼主换个吧!

俺个高中生小菜都可以写出来 -_-!


不是毕业答辩的.....是C++课程结束的答辩
[/Quote]

你用这个做C++课程结束的答辩 ?连一个class也没,并且这么明显的用class解决的问题你不用class
red_berries 2008-04-17
  • 打赏
  • 举报
回复
[Quote=引用 18 楼 Mafias 的回复:]
引用 15 楼 qiucp 的回复:
用C写很麻烦,如果可以的话用C++的类来写,这样就比较方便了。



我这个就是要求用VC++6.0做...
[/Quote]

...............
red_berries 2008-04-17
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 Chiyer 的回复:]
...........
[/Quote]
Mafias 2008-04-17
  • 打赏
  • 举报
回复
必须要用的结构体......
Mafias 2008-04-17
  • 打赏
  • 举报
回复
[Quote=引用 25 楼 helin561 的回复:]
哇塞
干吗非得用结构体啊
可以搞个类啊
我来试试
[/Quote]
哥们看你的了
helin561 2008-04-17
  • 打赏
  • 举报
回复
哇塞
干吗非得用结构体啊
可以搞个类啊
我来试试
Mafias 2008-04-17
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 clhposs 的回复:]
引用 4 楼 tgh621 的回复:
不会是毕业答辩把。。。。。。。。。


如果是毕业辩答 那么也太......

如果是建议楼主换个吧!

俺个高中生小菜都可以写出来 -_-!
[/Quote]

不是毕业答辩的.....是C++课程结束的答辩
Mafias 2008-04-17
  • 打赏
  • 举报
回复
[Quote=引用 20 楼 chuengchuenghq 的回复:]
大学都干什么去了哦
[/Quote]
偶不是大学生哈.....
skyful123 2008-04-17
  • 打赏
  • 举报
回复
我邮箱是skyful2@163.com
skyful123 2008-04-17
  • 打赏
  • 举报
回复
我也做过 不晓得你有兴趣不 功能要强大一点
只是以前的期末作业而已

有兴趣联系我 下班回去我寻找一下我的计算机历史
再发你
chuengchuenghq 2008-04-17
  • 打赏
  • 举报
回复
大学都干什么去了哦
rodney1983 2008-04-17
  • 打赏
  • 举报
回复
mark
Mafias 2008-04-17
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 qiucp 的回复:]
用C写很麻烦,如果可以的话用C++的类来写,这样就比较方便了。
[/Quote]


我这个就是要求用VC++6.0做...
Mafias 2008-04-17
  • 打赏
  • 举报
回复
16楼 如果不修改的话 你会怎么做?? 看出来你的水平很强 给我做一个吧....我发的那个是同学的....如果被看出来相同的话那麻烦大了.....拜托你给我发你做的吧 不要改的....我看这分就给你了 要用VC++6.0做哈.....题目要求的
YFY 2008-04-17
  • 打赏
  • 举报
回复
还有那个插入根本没有必要按平均成绩找位置(程序根本不知道有没有按平均成绩拍过序,起不到作用),直接插入最后就行了,简单很多。要排序,也是插入到最后,然后再调用排序函数。
qiucp 2008-04-17
  • 打赏
  • 举报
回复
用C写很麻烦,如果可以的话用C++的类来写,这样就比较方便了。
YFY 2008-04-17
  • 打赏
  • 举报
回复
我给你改了一个版本,修正了几个错误:符号、按学号查询不能实现,简单调整了格式,合并了2个查询函数:

/*************************************************************
// 版本:0.0.0.1
// 时间:2008-04-17
// 作者:
// 描述:简单功能实现,不考虑输入错误,不考虑异常,不考虑结构优化
// 更新历史
//
*************************************************************/

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

#define MAX_STUDENT_NUMBER 99 //输入最多学生信息数
#define MAX_NAME_LENGTH 200 //输入最长名字长度

struct a
{
int chinese; //语文
int english; //英语
int math; //数学
int even; //平均成绩
};

struct student
{
int taxis; //学号
char name[MAX_NAME_LENGTH]; //姓名
struct a score; //科目成绩
};

void InputStuInfo(int,struct student *); //输入
void SortStuInfo(int,struct student *,int); //排序
void InsertStuInfo(int,struct student *); //(扩充)插入
void SearchStuInfo(int,struct student *); //查询
void DeleteStuInfo(int,struct student *); //删除
void ShowStuInfo(int ,struct student *); //(显示)输出

void main()
{
struct student stu[MAX_STUDENT_NUMBER],*ps;
int choose;//选择菜单
char in,a;
int i,j,b;
int bKeepRunning = 1;

ps = stu;
printf("\n请输入学生信息:");
for(i=0; i<MAX_STUDENT_NUMBER; i++)
{
InputStuInfo(i,ps);

printf("\n\n是否需要继续输入?(y or n)");

fflush(stdin);
in = getchar();
if ((in != 'y') && (in != 'Y'))
break;
}
printf("信息输入完毕,输入信息如下:请核对!");
printf("\n输入信息i=%d\n",i);
ShowStuInfo(i,ps);

printf("\n\n如果信息输入有误,请登陆管理员帐号进行修改!");
printf("\n\n *注意 客户权限只可查询与访问*!");
do
{
printf("\n\n1.管理员 \t2.普通客户\t3.退出\n\n请选择登陆方式:");
scanf("%d",&a);
if(a == 1) //管理员
{
for(j=0; j<3; j++)
{
printf("\n请输入密码:");
scanf("%d",&b); //fflush(stdin);
if(b == 1234) //管理员登录密码:1234
{
bKeepRunning = 1;
do
{
fflush(stdin);
printf("\n\n1.显示学生信息:\n2.按学号输出:\n3.按平均成绩输出:\n4.插入学生信息:\n5.查询学生信息:\n6.删除学生信息:\n0.返回上一菜单;");
printf("\n\n请选择");
scanf("%d",&choose);
switch (choose)
{
case 1:
ShowStuInfo(i,ps);
break;
case 2:
//SortByTaxis(i,ps);
SortStuInfo(i,ps,0);
break;
case 3:
//SortByAveScore(i,ps);
SortStuInfo(i,ps,1);
break;
case 4:
InsertStuInfo(i+1,ps);
++i;
break;
case 5:
SearchStuInfo(i,ps);
break;
case 6:
DeleteStuInfo(i,ps);
--i;
break;
case 0:
bKeepRunning = 0; //退出while循环
break;
default:
printf("输入错误,请重新选择:\n");
break;
}
} while(bKeepRunning);
break; //for(j=0; j<3; j++)
}
else
printf("\n密码不正确,请重新输入!");
}

if(j == 3)
printf("\n输入错误密码次数已达三次,自动退出管理员登陆界面");
}
else if(a == 2) //普通客户
{
bKeepRunning = 1;
do
{
printf("\n\n1.显示学生信息:\n2.按学生学号输出\n3.按学生平均成绩大小输出:\n4.查询学生信息;\n0.返回上一菜单;");
printf("\n\n请选择");
scanf("%d",&choose);
switch (choose)
{
case 1:
ShowStuInfo(i,ps);
break;
case 2:
//SortByTaxis(i,ps);
SortStuInfo(i,ps,0);
break;
case 3:
//SortByAveScore(i,ps);
SortStuInfo(i,ps,1);
break;
case 4:
SearchStuInfo(i,ps);
break;
case 0:
bKeepRunning = 0; //退出while循环
break;
default:
printf("输入错误,请重新选择:\n");
break;
}
} while(bKeepRunning);
}
else if(a == 3) //退出
break;
else //输入错误
printf("\n选择出错,请重新选择:");
}while(1);
}

void InputStuInfo(int i,struct student *ps) //输入函数
{
printf("\n\n学号:");
scanf("%d",&(ps+i)->taxis);

printf("\n姓名:");
fflush(stdin);
gets((ps+i)->name);

printf("\n三门成绩:");
printf("\n语文:");
scanf("%d",&((ps+i)->score.chinese));
printf("数学:");
scanf("%d",&(ps+i)->score.math);
printf("英语:");
scanf("%d",&(ps+i)->score.english);
(ps+i)->score.even = ((ps+i)->score.chinese+(ps+i)->score.english+(ps+i)->score.math)/3;
}

void ShowStuInfo(int i,struct student *ps) //输出
{
int j;
printf("\n学号\t姓名\t语文\t数学\t英语\t平均成绩\t");

for(j=0; j<=i; j++,ps++)
{
printf("\n%d\t%s\t%d\t%d\t%d\t%d\t",ps->taxis,&(ps->name),ps->score.chinese,ps->score.math,ps->score.english,ps->score.even);
}
}

void SortStuInfo(int i,struct student *ps,int iType) //排序
{
int k,j;
struct student temp;
switch (iType)
{
case 0: //按学号排序
for(j=0; j<=i; j++)
{
for(k=0; k<i-j; k++)
{
if ((ps+k)->taxis > (ps+k+1)->taxis)
{
temp = *(ps+k);
*(ps+k) = *(ps+k+1);
*(ps+k+1) = temp;
}
}
}
break;
case 1: //按平均成绩排序 大->小
for(j=0; j<=i; j++)
{
for(k=0; k<i-j; k++)
{
if((ps+k)->score.even < (ps+k+1)->score.even)
{
temp = *(ps+k);
*(ps+k) = *(ps+k+1);
*(ps+k+1) = temp;
}
}
}
break;
default: //不排序
printf("\n错误的排序类型iType=%d\n",iType);
break;
}
ShowStuInfo(i,ps);
}

void InsertStuInfo(int i,struct student *ps) //(扩充)插入函数
{
struct student end,*pe;
int k=0,j;
pe = &end;
InputStuInfo(0,pe);

for (j=0; j<i+1; j++)
{
if((ps+j)->score.even < pe->score.even)
break;
}

for(k=i; k>j; k--)
{
*(ps+k) = *(ps+k-1);
}
*(ps+j) = *(pe);

ShowStuInfo(0,pe);
printf("\n插入完成,请继续\n");
}

void SearchStuInfo(int i,struct student *ps) //查询功能
{
char de[MAX_STUDENT_NUMBER];
int k;

printf("\n请输入要查询的姓名或学号:");
fflush(stdin);
gets(de);
for(k=0; k<i+1; k++)
{
if((strcmp(de,(ps+k)->name) == 0) || (atoi(de) == (ps+k)->taxis))
break;
}
if (k < i+1)
ShowStuInfo(0,ps+k);
else
printf("\n没有你要查询的资料");
}

void DeleteStuInfo(int i,struct student *ps)
{
char del[MAX_STUDENT_NUMBER];
int k,j;

printf("\n请输入要删除的学号或名字:");
fflush(stdin);
gets(del);
for(k=0; k<i+1; k++)
{
if((strcmp(del,(ps+k)->name) == 0) || (atoi(del) == (ps+k)->taxis))
break;
}

if(k < i+1)
{
ShowStuInfo(0,ps+k);
if(k < i)
{
for(j=k; j<i+1; j++)
{
*(ps+j) = *(ps+j+1);
}
}
printf("\n删除完成,请继续:");
}
else
printf("\n没有你要查询的资料");
}
Mafias 2008-04-17
  • 打赏
  • 举报
回复
我想做个副本形式的 用户只能对副本文件进行修改\删除\插入 原文件只能是管理员使用
而且所有数据不需要用户再一个一个的输入 全部改成内置的 用户只需要输入学号就可以查询出学员的三课成绩和平均数
有会做的没?? 帮我做出来的再加100分 明天急用.... 麻烦各位高手了 按照我的思路帮我遍一个.....要带注释啊...别到时候我答辩再忘了...那就麻烦了...
加载更多回复(12)

64,654

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧