资源描述
摘 要
“学生成绩管理系统”主要用于完成日常教育工作中对学生成绩档案的数字化管理。该系统可使学校教职员工减轻工作压力,系统地对教务、学生选课、教学和学生成绩等各项服务和信息进行管理。同时,可以有效减少学生成绩管理工作量、提高查询速度和方便分析。
本论文从系统分析、系统设计、系统实施和使用等几个方面对学生成绩管理系统的功能需求、体系结构和开发等进行了介绍,较好实现了该系统的一个原型系统。
关键字:原型系统;需求分析;系统设计;系统实施;系统使用;C#
目录
1引言 1
1.1开发背景 1
1.2开发前景 2
1.3开发目的 3
2系统需求分析 4
2.1系统问题的提出 4
2.2系统必要性 5
3 系统总体设计 6
3.1系统主要功能 6
3.2系统流图和主要界面展示 6
3.2.1系统流图 6
3.2.2 系统主界面 8
3.3 系统的主要模块 8
3.3.1增加学生记录: 8
3.3.2修改学生记录模块 10
3.3.3保存文件模块 13
3.3.4学生记录排序 14
3.3.5结束语提示模块 17
4 系统测试 19
4.1 增加学生记录测试 19
4.2 打开文件测试 19
4.3 学生成绩排序 20
4.4 查询学生成绩记录 22
4.5 退出学生成绩查询系统 23
5 课程设计总结 25
参考文献 27
附录 28
1引言
1.1开发背景
随着计算机应用的日益普及,数据库技术已成为越来越重要的技术基础。数据库即使是保证应用软件质量的重要环节,专业化、高效的应用系统对于数据库技术的要求也越来越高。数据库是数据管理的最新技术,是计算机学科的重要分支。十余年来,数据库管理系统已从专用的应用的程序包发展成为通用的系统软件。由于数据库具有数据结构化、最低冗余度、较高的程序与数据独立性、易于扩充、易于编制应用程序等优点,较大的信息系统都是建立在数据库设计之上的。
数据库技术是计算机领域中最为活跃的技术之一,是计算机科学的重分支,它的出现对于许多企事业单位提高科学管理水平都起到举足轻重的作用。对于一个企事业单位来说,数据库的建设规模、数据库信息量的大小和使用频度已成为衡量这个机构信息化程度的重要标志。数据库技术是计算机科学与技术中发展最快的领域之一,也是应用最广的技术之一,它已成为计算机信息系统与应用系统的核心技术和重要基础。数据库在一个信息管理系统中占有非常重要的地位,数据库结构设计的好坏将直接对应用系统的效率以及实现的效果产生影响。合理的数据库结构设计可以提高数据存储效率,保证数据的完整和一致。
数据库是数据管理的最新技术,是计算机科学的重要分支。今天,信息资源已成为各个部门的重要财富和资源。建立一个满足各级部门信息处理要求的行之有效的信息系统也成为一个企业生存和发展的重要条件。因此,作为信息系统核心和基础的数据库技术得到越来越广泛的应用,从小型单项事务处理系统到大型信息系统,越来越多新的应用领域采用数据库技术来存储和处理信息资源。
数据库设计是建立数据库及其应用系统的技术,是信息系统开发和建设中的核心技术,具体说,是指对于一个给定的应用环境,构造最优的数据库模式,建立数据库及其应用系统,使之能够有效地存储数据,满足各种用户的应用需求(信息要求和处理要求)。数据库一个信息系统的各个部分能否紧密地结合在一起以及如何结合,关键在数据库。
学生成绩管理系统是一个单位不可缺少的部分,它的内容对于单位的决策者和管理者来说都至关重要,所以学生成绩管理系统应该能够为用户提供充足的信息和快捷的的查询手段。
1.2开发前景
在我国,各大中小学校的各类信息管理系统并非一个新的课题,但也有的学校所有的工作几乎还是手工操作来完成。计算机技术在日新月异的发展,但是有很多学校,,学校的各种业务管理都依然由手工操作来完成,十分落后,效率极低,成本很大。随着社会的发展,信息化是社会进程的必然趋势,学校管理只有快,准,精和公平才能更好地发挥其社会价值。
所以机器代替人力是必然的历史发展趋势,只有领导的重视和支持才能从人工操作改为计算机的自动化系统。人工操作必将被计算机代替。
1.3开发目的
学生成绩管理系统如果可以为学校所使用,将会改变以往靠手工管理学生成绩的状况,可以树立良好的办学形象,提高工作效率,节省人力和物力。
2系统需求分析
2.1系统问题的提出
随着计算机技术的发展,特别是计算机网络技术与数据库技术的发展,使人们的生活与工作方式发生了很大的变化。网络技术的应用使得计算机之间通信和信息共享成为可能,而数据库技术的应用则为人们奠定了数据存储、信息检索和数据分析等应用功能的基础,使得各项业务工作通过信息化技术高效运转和被处理。
数据库始于20世纪60年代,经过40多年的发展,现在已经形成了理论体系,成为计算机软件的一个重要分支。数据库技术体现了当代先进的数据管理方法,使计算机的应用真正渗透到国民经济各个部门,在数据处理领域发挥着越来越大的作用。而互联网技术的出现,更是进一步丰富的人类生活,数字化生存已经一步步走进人们日常的生活与工作。互联网技术与数据库技术的结合为计算的在人类生活中的应用带来了巨大的影响。产业信息化,管理现代化,科学化已经成为行业发展的重要课题,这不仅是企业提高自身竞争力,甚至是国家提高综合国力,走向国民富强的重要手段。
在我国,教育是一个影响着国富民强的重要行业,随着改革开放和市场经济的发展根据中国特有的国情发展,教育得到了国家的大力扶持与社会各界的高度重视,从而使教育业向现代规范化的方向高速发展,但是同发达国家相比,我国的教育行业的信息技术的应用程度还很低,只有在大城市中发展较早、规模较大的院校中才使用计算机进行教学管理,从教学和学生管理等方面提高工作效率,取得良好的社会和经济效益。而一些边远地区传统的、规模较小的教育机构还没有全部具备通过计算机和信息化技术全面进行教学管理的能力。因此可见,随着我国教育的迅速发展,信息技术在其上的应用会更加地广泛和深入。
2.2系统必要性
在信息技术迅速发展的今天,网络对于大对数人已经不再陌生,并且其应用在人们的工作、学习和生活中越来越多地发挥着不可替代的作用。很多学校纷纷根据自身的需要,采用了先进的信息技术来加强教学管理、提高教学质量。网上考试作为网络教育不可缺少的组成部分,它与传统的考试方式相比较而言,减少了教师出题,组织考试、批改试卷等工作量,提高了教师的工作效率,并且使考试更客观公正。但是目前很多考试系统都是由软件开发公司来开发并销售的,多数考试系统力求功能全面,从而存在着设置参数过多、操作较难、成本较高等问题。所以开发一个实用够用、操作简单、使用方便、成本较低的考试系统是很必要的。
3 系统总体设计
3.1系统主要功能
一个基于系统开发的总体任务是实现学生成绩管理,主要完成的功能有:保存学生成绩记录、修改学生成绩记录、统计学生信息和查询学生记录。其中查询学生记录还包括对全体学生所有科目成绩进行查询,也能单独对某个学生某一科进行查询并能实现添加、删除记录。成绩表包括的字段:学号、姓名、课程号、课程名、成绩。
3.2系统流图和主要界面展示
学生成绩管理系统主要包括增加学生记录以及查询记录、修改学生记录以及删除记录、保存文件以及打开文件和统计信息以及显示记录;
3.2.1系统流图
学生学生成绩管理系统的主要流程:学生成绩管理系统
增加学生记录
查询学生记录
修改学生记录
学生记录排序
统计信息
打开文件
保存文件
显示记录
图3.1系统的主要结构
其中查询学生记录排序中还分别按姓名、学号和名次进行升序和降序排列图3.2
记录排序
按姓名排序
按学号排序
按名次排序
升序排列
降序排序
升序排列
降序排序
升序排列
降序排序
图3.2学生记录排序方法
3.2.2 系统主界面
程序运行直接进入主界面,主界面是系统的菜单所有的功能都能在界面展示
图3.3主界面
图3.3是学生成绩管理系统的主界面;它主要包括增加学生记录、查询学生记录、修改学生记录、学生记录排序、统计信息、打开文件、保存文件、显示记录和退出系统。
3.3 系统的主要模块
3.3.1增加学生记录:
增加学生记录包括:
增加学生人数、输入学号、输入姓名、输入性别、输入各科成绩;
其主要函数为:
void addrecord(student stud[]) /*增加记录*/
{
int i=0,j,num;
char str[5];
if(numstus!=0)
{
printf("已有记录存在是否覆盖?(y/n)\n");
gets(str);
if(str[0]=='Y'||str[0]=='y')
i=0;
else i=numstus;
}
printf("请输入增加的学生信息条目数:");
scanf("%d",&num);
if(i==0)
numstus=num;
else numstus+=num;
if(numstus>lens)
{
lens+=50;
pointer=(student *)realloc(pointer,lens*LEN);
}
printf(":\n");
for(;i<numstus;i++)
{
getchar();
printf("请输入学号:");
gets(pointer[i].number);
printf("请输入姓名:");
gets(pointer[i].name);
printf("请输入性别(男/女 1/0):");
gets(pointer[i].sex);
if(pointer[i].sex[0]=='0') strcpy(pointer[i].sex,"女");
else strcpy(pointer[i].sex,"男");
printf("请输入各科成绩:(按\"线代,高数,英语,C语言,物理\"的顺序):");
stud[i].score=0;
for(j=0;j<numsubs;j++)
{
scanf("%f",&stud[i].subject[j]); /*计算总分*/
stud[i].score+=stud[i].subject[j];
}
stud[i].average=stud[i].score/numsubs; /*计算平均分*/
}
count(stud); /*附名次*/
display(stud,0,numstus-1);
getchar();
}
3.3.2修改学生记录模块
修改学生记录主要包括有删除学生记录、修改学生记录
其主要函数为:
void amendrecord(student stud[])
{
char str[5]; /*供用户输入*/
int i=-1,j;
if(numstus==0) /*没有记录返回*/
printf("没有可供修改的记录!");
while(i<0)
{
i=findrecord(stud);
if(i>=0)
{
printf("要删除这个学生的信息吗?(y/n)");
gets(str);
if(str[0]=='y'||str[0]=='Y')
{
deleterecord(stud,i);
count(stud);
}
else
{
printf("确定要修改这个学生的信息吗?(y/n)");
gets(str);
if(str[0]=='y'||str[0]=='Y')
{
printf("下面请重新输入学生的信息:\n");
printf("请输入学号:");
gets(stud[i].number);
printf("请输入姓名:");
gets(stud[i].name);
printf("请输入性别(男/女 1/0):");
gets(str);
if(str[0]=='0')
strcpy(stud[i].sex,"女");
else
strcpy(stud[i].sex,"男");
stud[i].score=0;
printf("请按顺序输入成绩:");
for(j=0;j<numsubs;j++)
{
scanf("%f",&stud[i].subject[j]);
stud[i].score+=stud[i].subject[j];
}
getchar();
stud[i].average=stud[i].score/numsubs;
}
count(stud);
}
display(stud,0,numstus-1);
}
printf("是否继续进行其他修改?(y/n)\n");
gets(str);
if(str[0]=='y'||str[0]=='Y')
i=-1;
else i=1;
}
}
void deleterecord(student stu[],int i) /*删除信息*/
{
int j;
if(i>=0)
{
for(j=i;j<numstus;j++)
stu[j]=stu[j+1];
numstus--;
printf("删除成功!\n");
getchar();
menu_select();
}
}
图3.4是修改记录界面
图3.4即修改学生记录的主要界面,它是在主界面中按“3”号键进入修改界面
3.3.3保存文件模块
主要函数为:
int writetotext(student stud[]) /*将所有记录写入文件*/
{
int i=0,j;
FILE *fp;
char filename[20];
printf("输入文件名称:");
gets(filename);
fp=fopen(filename,"w");
fprintf(fp,"%d\n",numstus);
while(i<numstus)
{
fprintf(fp,"%s %s %s ",stud[i].number,stud[i].name,stud[i].sex);
for(j=0;j<numsubs;j++)
fprintf(fp,"%f ",stud[i].subject[j]);
fprintf(fp,"%f %f %d ",stud[i].score,stud[i].average,stud[i].index);
i++;
}
fclose(fp);
printf("已成功存储!\n");
display(stud,0,numstus-1);
numstus=0;
return 0;
}
3.3.4学生记录排序
学生记录排序是将学生的的成绩分别按学号、姓名和名次进行升序排列或降序排列
其主要函数为:
void sort(student stud[]) /*将学生排序*/
{
int i,j=0;
char str[5];
student *p;
p=stud;
if(numstus==0)
{
printf("没有可供查询的记录!");
}
while(1)
{
for(i=0;;i++)
{
printf(" 请输入查询方式:");
printf("(直接输入回车则结束查询操作)\n");
printf("1.按照学号\t");
printf("2.按照姓名\t");
printf("3.按照名次\n");
gets(str);
if(strlen(str)==0) break;
if(str[0]=='1')
{
printf("请输入排序次序:\n");
printf("1.升序排列\t");
printf("2.降序排列\n");
gets(str);
if(str[0]=='1')
sortnum2(p);
else
sortnum(p);
display(stud,0,numstus-1);
}
else if(str[0]=='2')
{
printf("请输入排序次序:\n");
printf("1.升序排列\t");
printf("2.降序排列\n");
gets(str);
if(str[0]=='1')
sortname2(p);
else
sortname(p);
display(stud,0,numstus-1);
}
else if(str[0]=='3')
{
printf("请输入排序次序:\n");
printf("1.升序排列\t");
printf("2.降序排列\n");
gets(str);
if(str[0]=='1')
sortcount2(p);
else
sortcount(p);
display(stud,0,numstus-1);
}
else printf("请输入1~3");
printf("是否退出排序?(y/n)");
gets(str);
if(str[0]=='y'||str[0]=='Y') break;
}
return;
}
}
图3.5为按照名次进行降序排列
在图3.5中为按照名次排列,它是在学生记录排序中按“3”号键进行选择。另外在对学生记录排序中还有按照姓名进行排序,它是在学生记录排序中按“2”号键进行选择.如图3.6即是按照姓名进行降序排列
图3.6 按照姓名进行降序排列
3.3.5结束语提示模块
结束语提示是在退出系统后的提示语主要包括欢迎语句、制作班级和制作人员列表
其主要函数为:
void display1()
{
printf("\t\t☆☆本系统由计科二班制作☆☆\n\n");
printf(" \t\t☆☆制作人员列表:☆☆ \n\n");
printf(" \t\t☆☆☆李世正☆☆☆");
printf("\n\n");
getchar();
}
结束语提示是在退出程序时对制作人的显示,它可以在主界面里按“0”键退出如图3.7
图3.7系统退出时的结束语展示
4 系统测试
测试分析主要是对学生成绩管理系统的一次运行,从中找出漏洞,让程序更加完美。
4.1 增加学生记录测试
测试学生记录增加时,随机选取几个姓名和成绩进行测试,程序运行正常如图4.1
图4.1 增加学生记录
4.2 打开文件测试
打开文件测试是将以前保存好的文件打开,经过测试,程序能正常打开文件如图4.2
图4. 2 打开文件
4.3 学生成绩排序
学生排序测试时,成绩能正常排列 如图4.3和图 4.4
图4.3 按照名次排序
图4.4 按照学号排序
4.4 查询学生成绩记录
查询学生成绩测试时,成绩能正常显示如图4.5和4.6
图4.5为按照学号查找学生记录
图4.6 按照学生姓名查找
4.5 退出学生成绩查询系统
退出系统是,结束语正常显示如图4.7 程序能正常退出
图4.7 退出学生查询系统测试
5 课程设计总结
这个系统提供了便捷的操作,让管理者可以方便的记载学生的成就,信息,数据。这是一个综合性较强,较实际的一个编程软件 。通过一周的编程及调试程序,感觉自己对C的知识有加深了一层,在这个科技飞速发展的时代,掌握电脑的应用是如今每一位大学生所必须掌握的,掌握电脑知识对于现代人来说都有很重要的作用,掌握电脑知识也是一种本领,也是一种生存技能,可以在以后的工作铺好坚实的道路。
刚开始的时候程序出现很多问题,有时候感觉很苦恼、很烦躁,到那时我并没有放弃,我知道学计算机的就是很枯燥无味,需要耐心,我还是坚持了下来。
本系统的重点就是要理清思路,如何实现想要的结果,所以分成了几大类模块,我做的学生成绩管理系统主要包括这几个模块,增加、查询、排序、修改、删除、统计、显示等几大类模块,其他我感觉还比较容易,但就是排序这一块,我参考了很多资料,有冒泡法排序、选择法排序、交换法排序等等,其他的我都不太熟悉,所以这里我用了选择法排序,实现想要的结果。后想说的是,调试程序真的很关键。调试程序需要较大的耐心。可能调试程序的时间比自己编写整个程序的时间还要长,下的工夫还要深,但这是一个程序员必须了解、接受的事实。通过这个实训的练习,我也学到了很多东西,特别是加深了C的理解和应用。但是为了更好的发展,我还是会好好学习,更深层的掌握专业知识。
并且在这两周的实训期间,当在课程设计过程中遇到模棱两可的问题时,同学们能过各抒己见,尊重他人见解,使我能够综合各种观点,取长补短,虚心借鉴,使程序做得更尽人意;当遇到我们都无法解决的问题时,有辅导老师耐心讲解,详细地指出了程序中的错误,不仅帮我解决了当前编程中的问题,而且使我加深了对C语言的认识,为以后的学习铺平了道路。感谢他们,他们不仅是我收获了更多的知识,丰富了学习经验,而且使我养成了“严谨治学”的学习态度,使我拥有了面对困难的勇气,并且体会到了浓浓的师生情。这必定是我人生中一笔宝贵的财富,再次感谢他们!
另外,关于删除,这个系统提供了普通的按照学号来删除该学生的个人信息及相关成绩的功能。当然,再不知道学号的情况下,这个系统还提供了按照姓名来删除的条件。(这样一来,有同名的就会有点麻烦,在这方面还需要改进)
参考文献
[1]谭浩强.C 程序设计.北京:清华大学出版社,2011,4;
[2]C语言程序设计实例精编;
[3]C语言程序设计课本;
附录
系统源代码:
#ifndef H_STUDENT_HH
#define H_STUDENT_HH
#include "stdio.h"
#include "string.h"
#include "malloc.h"
#define LEN sizeof(struct message_student) /*一个结构体数组元素的长度*/
#define numsubs 5 /*学科数目*/
typedef struct message_student /*结构体定义*/
{
char number[6];
char name[20];
char sex[4];
float subject[numsubs];
float score;
float average;
int index;
}student;
extern int numstus; /*学生数目*/
extern student *pointer; /*指向结构体数组*/
extern int lens;
int menu_select(); /*函数声明*/
int openfile(student stu[]); /*打开文件*/
int findrecord(student stud[]);/*查找信息*/
int writetotext(student stud[]);/*将所有记录写入文件*/
void welcome();/*欢迎界面*/
void display1(); /*展示制作人信息*/
void showtable(); /*展示在桌面*/
void sort(student stu[]); /*将学生排序*/
void deleterecord(student stu[],int i); /*删除信息*/
void addrecord(student stud[]);/*增加记录*/
void display(student stud[],int n1,int n2); /*显示数据*/
void amendrecord(student stud[]); /*修改记录*/
void count(student stud[]); /*计算名次*/
void sortnum(student stud[]);
void sortnum2(student stud[]);
void sortname(student stud[]);
void sortname2(student stud[]);
void sortcount(student stud[]);
void sortcount2(student stud[]);
void statistic(student stud[]); /*输出统计信息*/
void display1();
#endif
int menu_select() /*展示在桌面上*/
{
char c;
printf("\n\n");
printf(" ◇ ◇ ◇ ◇ ◇ ◇ ◇ ◇ ◇ ◇ ◇ ◇ ◇ \n");
printf(" ☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆ \n");
printf(" ┏━━━━━━━━━┳━━━━━━━━┓ \n");
printf(" ☆┃1. 增加学生记录 ┃5.统计信息 ┃☆ \n");
printf(" ┣━━━━━━━━━╋━━━━━━━━┫ \n");
printf(" ☆┃2. 查询学生记录 ┃6.打开文件 ┃☆ \n");
printf(" ┣━━━━━━━━━╋━━━━━━━━┫ \n");
printf(" ☆┃3. 修改学生记录 ┃7.保存文件 ┃☆ \n");
printf(" ┣━━━━━━━━━╋━━━━━━━━┫ \n");
printf(" ☆┃4. 学生纪录排序 ┃8.显示记录 ┃☆ \n");
printf(" ┣━━━━━━━━━┻━━━━━━━━┫ \n");
printf(" ☆┃ ☆☆ 0. 退出系统 ☆☆ ┃☆ \n");
printf(" ┗━━━━━━━━━━━━━━━━━━┛ \n");
printf(" ☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆ \n");
printf(" ◇ ◇ ◇ ◇ ◇ ◇ ◇ ◇ ◇ ◇ ◇ ◇ ◇\n");
printf("\n\n");
printf("请选择(0-8):");
c=getchar();
getchar(); /*让程序停留*/
return (c-'0');
}
//#include "head.h"
int findrecord(student stud[]) /*查找信息*/
{
char str[2];
int i,num;
if(numstus==0)
{
printf("没有可被查找的记录\n");
return -1;
}
else
{
printf("以何种方式查找?\n1.学号\t2.姓名\t3.名次\n");
gets(str);
if(str[0]=='1') /*按学号查找*/
{
printf("请输入学号:");
gets(str);
for(i=0;i<=numstus;i++)
if(strcmp(str,stud[i].number)==0)
{
display(stud,i,i);
break;
}
else continue;
}
else if(str[0]=='2') /*按姓名查找*/
{
printf("请输入姓名:");
gets(str);
for(i=0;i<=numstus;i++)
if(strcmp(str,stud[i].name)==0)
{
display(stud,i,i);
break;
}
else continue;
}
else if(str[0]=='3') /*按名次查找*/
{
printf("请输入名次:");
scanf("%d",&num);
getchar(); /*让程序停留*/
for(i=0;i<=numstus;i++)
if(num==stud[i].index)
{
display(stud,i,i);
break;
}
else continue;
}
if(i>numstus)
{
printf("没有查找所要的信息。\n");
return -1;
}
return i;
}
}
//#include"head.h"
int openfile(student stu[]) /*打开文件*/
{
int i=0,j;
FILE *fp;
char filename[20],str[2];
if(numstus!=0)
{
printf("已经有记录存在,是否保存?(y/n)");
gets(str);
if(str[0]=='y'||str[0]=='Y')
writetotext(stu);
}
printf("请输入文件名:");
gets(filename);
numstus=0;
if((fp=fopen(filename,"rb+"))==NULL)
{
printf("无法打开该文件\n");
return(-1);
}
fscanf(fp,"%d",&numstus);
fgetc(fp);
while(i<numstus) /*读取文件显示在桌面*/
{
fscanf(fp,"%s",stu[i].number);
fscanf(fp,"%s",stu[i].name);
fscanf(fp,"%s",stu[i].sex);
for(j=0;j<numsubs;j++)
fscanf(fp,"%f",&stu[i].subject[j]);
fscanf(fp,"%f",&stu[i].score);
fscanf(fp,"%f",&stu[i].average);
fscanf(fp,"%d",&stu[i].index);
i++;
}
fclose(fp);
printf("文件读取成功\n");
printf("是否显示纪录?(y/n)");
gets(str);
if(str[0]=='y'||str[0]=='Y')
display(stu,0,numstus-1);
return(0);
}
//#include "head.h"
void sort(student stud[]) /*将学生排序*/
{
int i,j=0;
char str[5];
student *p;
p=stud;
if(numstus==0)
{
printf("没有可供查询的记录!");
}
while(1)
{
for(i=0;;i++)
{
printf(" 请输入查询方式:");
printf("(直接输入回车则结束查询操作)\n");
printf("1.按照学号\t");
printf("2.按照姓名\t");
printf("3.按照名次\n");
gets(str);
if(strlen(str)==0) break;
if(str[0]=='1')
{
printf("请输入排序次序:\n");
printf("1.升序排列\t");
printf("2.降序排列\n");
gets(str);
if(str[0]=='1')
sortnum2(p);
else
sortnum(p);
display(stud,0,numstus-1);
}
else if(str[0]=='2')
{
printf("请输入排序次序:\n");
printf("1.升序排列\t");
printf("2.降序排列\n");
gets(str);
if(str[0]=='1')
sortname2(p);
else
sortname(p);
display(stud,0,numstus-1)
展开阅读全文