假设收集到了一个班学生的所有C语言成绩信息(不低于20人),要求编写一个简单的成绩管理系统,对成绩信息进行管理,有进行录入、浏览、查询、修改、排序、统计的功能。信息内容包含:(1)学生的学号 (2)学生的姓名(3)学生的C语言成绩。
1.录入、浏览功能:
按学号顺序录入学生的学号、姓名和成绩,显示所有的学生成绩信息。
2.查询功能:
查询某个学号(由用户输入)的学生的成绩信息并显示。
3.修改功能:
修改某个学号(由用户输入)的学生的成绩信息并显示。
4.排序功能:
按成绩排序,由高到低显示所有学生的信息。
5.统计功能:
统计全班学生的平均成绩、最高分、最低分并输出。
一、设计思路
1、该程序的功能较多,如果直接写的话思路上就会有很多阻碍,另外就是在查漏洞上工作量是非常大,所以首先应该想到的是怎样将问题简化,拆分成小的问题进行解决。常用的一种思想是分而治之,即将大的复杂的问题进行简单化,最后再由简单的进行拼接,就可以很轻松完成一个大问题,在此程序多用函数调用来实现。
2、将此设计进行简单地拆分解决:
(1)、首先进行定义一个结构体:
typedef struct//定义结构体
{
/*学号*/
/*姓名*/
/*C语言分数*/
}STUDENT;
(2)、将主函数的框架写出来,留下相应的空格进行函数的调用:
int main()
{
.....//函数的调用
return 0;
}
(3)、具体写出相应的函数实现过程:
void InputData(STUDENT s[],int n);//输入n个学生信息
void Search(STUDENT s[],int n);//查询功能
void Change(STUDENT s[],int n);//修改学生信息
void OutputData(STUDENT s[],int n);//输出n个学生信息
void Sort(STUDENT s[],int n);//按成绩降序排序
double MaxScore(STUDENT s[],int n);//找出最高分
double MinScore(STUDENT s[],int n);//找出最低分
double AverageScore(STUDENT s[],int n);//找出平均分
//最后三个函数可以用其他的方法,可以通过一个函数完成三个功能
(4)、在main函数中进行相应的调用完成相关操作。
二、代码展示
/* 标题:单科成绩管理系统 */
/* 作者: 李 */
/* 日期: 2020-4-4 */
#include
#define N 100
typedef struct//定义结构体
{
int number;//学号
char name[16];//姓名
double C;//C语言分数
}STUDENT;
void InputData(STUDENT s[],int n);//输入n个学生信息
void Search(STUDENT s[],int n);//查询功能
void Change(STUDENT s[],int n);//修改学生信息
void OutputData(STUDENT s[],int n);//输出n个学生信息
void Sort(STUDENT s[],int n);//按成绩降序排序
double MaxScore(STUDENT s[],int n);//找出最高分
double MinScore(STUDENT s[],int n);//找出最低分
double AverageScore(STUDENT s[],int n);//找出平均分
int main()//主函数体
{
STUDENT s[N];//声明结构体
int n;
printf("请输入学生人数:\n");//输入学生的人数
scanf("%d",&n);
printf("\n");
printf("请输入%d个学生的学号、姓名和成绩:\n",n);//输入学生的学号和成绩
InputData(s,n);//调用“输入n个学生信息”
/*查询学生信息函数调用*/
Search(s,n);
/*修改学生信息函数的调用*/
Change(s, n);
/*按成绩降序排序函数的调用*/
Sort(s,n);
printf("按成绩排序,并由高到低输出学生信息结果是:\n");
OutputData(s,n);//输出n个学生信息函数的调用
printf("学生成绩更改后的平均分、最高分、最低分分别是:\n");
printf("平均分是 :%6.2lf\n",AverageScore(s,n));//求平均分函数的调用
printf("最高分是 :%5.2lf\n",MaxScore(s,n));//求最高分函数的调用
printf("最低分是 :%5.2lf\n",MinScore(s,n));//求最低分函数的调用
return 0;
}//函数体结束
/*下面是各功能函数的具体实现过程*/
void InputData(STUDENT s[],int n)//输入n个学生信息
{
for(int i = 0;i < n;i++)
{
scanf("%d %s%lf",&s[i].number,&s[i].name,&s[i].C);//存入到两个变量
}
printf("\n");
}
void Search(STUDENT s[],int n)//查询功能
{
int number;
printf("请输入要查询的学号:\n");
scanf("%d",&number);
printf("\n");
for(int i=0;i<n;i++)
{
if(s[i].number == number)
printf("查询结果后输出:\n%d %s %6.2lf\n",s[i].number,s[i].name, s[i].C);
}
printf("\n");
}
void Change(STUDENT s[],int n)//修改学生信息
{
int number;
printf("请输入要修改学生信息的学号:");
scanf("%d",&number);
printf("请输入要修改学生的C语言成绩:");
double score;
scanf("%lf",&score);
printf("\n");
for(int i = 0;i < n;i++)
{
if(s[i].number == number)
{
s[i].C = score;
printf("修改后的学生成绩信息是:\n%d %s %6.2lf",s[i].number,s[i].name, s[i].C);
}
}
printf("\n");
}
void Sort(STUDENT s[],int n)//按成绩降序排序
{
int i,j;
for(i = 0;i < n-1;i++)
{
for(j = 1+i;j < n;j++)
if(s[j].C > s[i].C)
{
STUDENT temp;
temp = s[i];
s[i] = s[j];
s[j] = temp;
}
printf("\n");
}
}
void OutputData(STUDENT s[],int n)//输出n个学生信息
{
printf("%s %s %s\n","学号","姓名" ,"成绩");
for(int i = 0;i < n;i++)
{
printf("%d %s %6.2lf\n",s[i].number,s[i].name, s[i].C);
}
printf("\n");
}
double MaxScore(STUDENT s[],int n)//找出最高分
{
double maxScore;
for(int i = 0;i < n;i++)
{
maxScore = s[0].C;
if(s[i].C > s[0].C)
{
maxScore = s[i].C;
}
}
return maxScore;
}
double MinScore(STUDENT s[],int n)//找出最低分
{
double minScore;
for(int i = 0;i < n;i++)
{
minScore = s[0].C;
if(s[i].C < s[0].C)
{
minScore = s[i].C;
}
}
return minScore;
}
double AverageScore(STUDENT s[],int n)//找出平均分
{
double averageScore;
double sumScore;
sumScore = 0.0;
for(int i = 0;i < n;i++)
{
sumScore +=s[i].C;
}
averageScore = sumScore / n;
return averageScore;
}
三、运行结果展示(举5人为例):
四、总结
1、首先在完成的过程中出现许多语法错误以及一些自己也不明白的逻辑错误,针对写函数时,尽量多次检查,写完就检查,不要等到最后运行时才找漏洞,对于那些逻辑错误,感觉都在摸索,就不断更改程序进行调试,所以,你需要足够的耐心进行有限次的调试。
2、至于最后三个函数的实现感觉麻烦了不少,虽然也写出了另外两种实现方法,但就运行不过,也不知道哪有问题,还需要继续研究学习。