项目设计题目(学生成绩管理系统)
学号:
姓名:
自评成绩:
成绩:
1.选题意义、依据
学生成绩系统的设计从学生的应用中而来,学生了解该系统的组成和运行过程,它贴近学生的生活能使学生更加方便的使用各个语句、函数、结构体等。
依据学生期末成绩表的格式。
2.系统功能设计与分析(功能模块说明)
系统主要用于从一个文件夹读入学生信息 (101 张三
85 78 87 102 李斯
57 59 60 103 王红
84 79 87 104 赵子龙 72 75 76
105 李洪磊 88 98 89),包括学生学号、姓名、成绩(数学、英语、数据库),程序中引用了八个函数 void Cscore(int); void Rank(int ave); void Listnumber(int i);
void Listscore(int i); void Lookup(int); void Alter(int); void Dele(int &i); void Insert(int &i); 系统主要实现的功能有:查询、修改、删除、插入、成绩单(以学号排名)和成绩单(以名次排名)。
Cscore 函数主要是对学生进行排名。具有相同总分的学生具有相同的名次,例如:第三名和第四名具有相同的总分则在表中不会出现第四名,将出现两个第三名紧接着出现第五名学生的情况。
Rank 函数主要用于按平均分对学生进行备注。把学生分为四个等级:>90分为excellent,80—90分为medium,60—80分为qualified,
Listscore 函数是把学生的信息以总成绩排名的形式输出。
Lookup 函数主要运用学号或姓名形式查询单个学生信息,如果存在则输出该学生信息(学号 姓名 数学 英语 数据库 总分平均分 名次 备注),否则输出“Input meage is error.”。
Alter 函数是修改指定学号的学生信息。主要用于修改指定学号学生的各科成绩并输出修改后的学生信息(学号 姓名 数学 英语 数据库 总分平均分 名次 备注)。
Delete 函数用于删除指定学生的信息。可用两种方式删除:以学号形式删除学生信息,以姓名形式删除学生信息。若要删除了学生不存在则输出“meage error.”。
Insert 函数用来插入学生的信息,一次调用Insert 函数可以添加多个学生的信息。Insert 函数中还调用了Cscore 和Rank 函数。
3.涉及的主要知识点说明
(1)系统主要运用了函数的声明、定义、调用(值调用和地址调用)。
(2)对文件的读入操作。
(3)在平均分的求取上采用四舍五入的方式,运用了类型转换。 (4)多次运用if和for嵌套,在for嵌套中又运用了break语句。 (5)运用了switch。
(6)对字符数组的比较中运用了strcmp,还运用toupper把小写字母转换成大写。
(7)对学生信息进行的插入和有序删除操作。 (8)运用iomanip对输出进行美观。
4.创新性说明(怎么解决)
创新性:系统可以对具有相同总分学生的学生输出相同的名次。若存在三个相同的分数都为第二名,则在输出时出现三个第二名不会出现第
三、四名,紧接着出现第五名。
解决方法:(1)用一个数组记录具有相同分数的人数,数组下标和学生信息所具有的下标相同;(2)删除相同的总分只保留其中一个分数;(3)对删除相同总分的分数按从高到底进行排序;(4)对各个学生的总分进行排名。
5.源代码
//****************************************************************** //Student achievement program //This program has eight functions of students grade,including list //score ranking,lookup,alter,delete,insert and rank.From the file read in //student achievement.Scores of people have the same same place.//****************************************************************** #include #include #include #include #include #include
void Cscore(int); void Rank(int ave); void Listnumber(int i); void Listscore(int i); void Lookup(int); void Alter(int); void Dele(int &i); void Insert(int &i);
using namespace std; const int MAX=100;
struct student
//定义学生信息结构体 { int num; char name[8]; int math; int english; int database; int sum; int average; int score; }stu[MAX];
int main()
//主函数 {
int i,k; char ch; string filename; ifstream infile;
cout>filename; infile.open(filename.c_str()); if (!infile) {
cout
return 1; } for (i=0; i
infile>>stu[i].num>>stu[i].name>>stu[i].math>>stu[i].english>>stu[i].database;
stu[i].sum=stu[i].math+stu[i].english+stu[i].database;
stu[i].average=int(float(stu[i].sum)/3+0.5); } i=i-1; cout
学生成绩管理系统
"
cout>ch; ch=toupper(ch); while (ch=='Y') { cout
菜单:"
1)查 询"
2)修 改"
3)删 除"
4)插 入"
5)成绩单(以学号排名)"
6)成绩单(以名次排名)"
cout
cin>>k;
cout
switch (k) {
case 1:Lookup(i);break;
case 2:Alter(i);break;
case 3:Dele(i);break;
case 4:Insert(i);break;
case 5:Listnumber(i);break;
case 6:Listscore(i);break;
default :cout
cout
cin>>ch;
ch=toupper(ch); } cout
void Cscore(int i)
//对学生分数进行排名 { int h[MAX],b[MAX],score[MAX+1],n,k,j; int sum0[MAX],s; n=i; for (j=0; j
sum0[j]=stu[j].sum; } for (j=0; j
h[j]=0; for (k=0; k
h[j]++;
//具有同一分数的人数
} } //end for } //end for for (j=0; j
//删除多个同一分数只保留其中一个分数 { for(k=j+1; k
if(sum0[j]==sum0[k])
{
sum0[k]=sum0[i-1];
i--;
k--;
} } } //end for for (j=0; j
//按从高到底的顺序对总分进行排名 { for (k=j+1; k
if (sum0[j]
{
s=sum0[j];
sum0[j]=sum0[k];
sum0[k]=s;
} //end if } //end for } //end for b[0]=0; score[0]=1; for (j=0; j
//对学生成绩进行排名 { for(k=0; k
if(sum0[j]==stu[k].sum)
{
score[j+1]=score[j]+b[j];
stu[k].score=score[j+1];
b[j+1]=h[k];
} //end if
} //end for } //end for }
void Rank(int ave)
//对学生等级输出 { if(ave>=90)
{
cout
}
else if (ave>=80)
{
cout
}
else if (ave>=60)
{
cout
}
else
{
cout
}
cout
void Listnumber(int i) { int j; Cscore(i); cout
姓名
数学
英语
数据库
总分
平均分
名次
备注
"
cout
cout
cout
cout
Rank(stu[j].average); } }
void Listscore(int i) { int j,k; Cscore(i); cout
姓名
数学
英语
数据库
总分
平均分
名次
备注
"
for (k=0; k
{
if(stu[k].score==j)
{
cout
cout
cout
cout
Rank(stu[k].average);
}
} } }
void Lookup(int i)
//运用学号或姓名形式查询单个学生信息 { int j,k,n,numb; char name1[8];
cout>n; if (n)
//以学号形式查询学生信息
{
cout
cin>>numb;
for (j=0;j
{
if (numb==stu[j].num)
{
k=j;
break;
}
} } else
//以姓名形式查询学生信息
{
cout
cin>>name1;
for (j=0;j
if (strcmp(stu[j].name,name1)==0)
{
k=j;
break;
} } if (k==MAX) {
cout
//如果学生存在则输出学生信息
{
Cscore(i);
cout
姓名
数学
英语
数据库
总分
平均分
名次
备注
"
cout
cout
cout
cout
Rank(stu[j].average); } }
void Alter(int i) //修改指定学号的学生信息 { int numb,j;
cout
cout
cin>>numb; for (j=0;j
if (numb==stu[j].num)
{
cout
cout
cout
英语
数据库 "
cin>>stu[j].math>>stu[j].english>>stu[j].database;
stu[j].sum=stu[j].math+stu[j].english+stu[j].database;
stu[j].average=int(float(stu[j].sum)/3.0+0.5);
Cscore(i);
//输出修改后该学号学生的信息
cout
姓名
数学
英语
数据库
总分
平均分
名次
备注
"
cout
cout
cout
cout
Rank(stu[j].average);
break;
} } }
void Dele(int &i)
//删除指定学生的信息 { int numb,j,k; char name0[8]; cout
cout
[1]以学号形式删除学生信息"
[0]以姓名形式删除学生信息">k; if (k)
//以学号形式删除学生的信息
{
cout
cin>>numb;
for (j=0;j
{
if (numb==stu[j].num)
break;
} } else
//以姓名形式删除学生的信息
{
cout
cin>>name0;
for (j=0;j
{
if (strcmp(name0,stu[j].name)==0)
break;
}
}
void Insert(int &i)
//插入学生的信息 { int j,n; cout>n; i=i+n; cout
cin>>stu[j].num>>stu[j].name>>stu[j].math>>stu[j].english>>stu[j].database;
stu[j].sum=stu[j].math+stu[j].english+stu[j].database;
stu[j].average=int(float(stu[j].sum)/3.0+0.5); } Cscore(i); cout
姓名
数学
英语
数据库
总分
平均分
名次
备注
"
cout
cout
cout
stu[j].num=stu[j+1].num;
strcpy(stu[j].name,stu[j+1].name);
stu[j].math=stu[j+1].math;
stu[j].english=stu[j+1].english;
stu[j].database=stu[j+1].database;
stu[j].sum=stu[j+1].sum;
stu[j].average=stu[j+1].average; } i=i-1; Cscore(i); } else cout
cout
运行结果:
分析:
系统基本上能实现对成绩的查询、、修改、删除、插入、成绩单(以学号排名)和成绩单(以名次排名)等功能,并且可以插入多个学生的信息。但在插入学生后未不能成绩单以学号排名的形式输出。为了改进程序对Insert 函数进行了一下修改。
Insert 函数代码如下:
void Insert(int &i)
//插入学生的信息 {
int j,k,n,m,first,last,mid; int num0,math0,english0,database0; char name0[8]; cout>n; m=i+n; first=0; last=i-1; mid=(first+last)/2; cout>stu[j].num>>stu[j].name>>stu[j].math>>stu[j].english>>stu[j].database; while (first
if(stu[j].num
{
last=mid-1;
}
else if(stu[j].num>stu[mid].num)
{
first=mid+1;
}
else
{
break;
}
mid=(first+last)/2; } if(first>last) {
num0=stu[j].num;
strcpy(name0,stu[j].name);
math0=stu[j].math;
english0=stu[j].english;
database0=stu[j].database;
for (k=i-1; k>first; k--)
//进行有序插入
{
stu[k].num=stu[k-1].num;
strcpy(stu[k].name,stu[k-1].name);
stu[k].math=stu[k-1].math;
}
stu[k].english=stu[k-1].english;
stu[k].database=stu[k-1].database;
stu[k].sum=stu[k-1].sum;
stu[k].average=stu[k-1].average;
}
stu[first].num=num0;
strcpy(stu[first].name,name0);
stu[first].math=math0;
stu[first].english=english0;
stu[first].database=database0;
stu[first].sum=stu[first].math+stu[first].english+stu[first].database;
stu[first].average=int(float(stu[first].sum)/3.0+0.5); } else {
cout
last=i-1;
mid=(first+last)/2; } Cscore(i);
修改后程序经运行后结果如下:
结果发现修改后的程序运用了二分查找法、多重嵌套等,能较好的实现对学生的信息以学号为序进行了多个数据的有序插入。