C语言学生成绩管理系统课程设计_第1页
C语言学生成绩管理系统课程设计_第2页
C语言学生成绩管理系统课程设计_第3页
C语言学生成绩管理系统课程设计_第4页
C语言学生成绩管理系统课程设计_第5页
已阅读5页,还剩39页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、 课程设计说明书设计名称: C语言课程设计 题 目: 学生成绩管理系统 学生姓名: 专 业: 网络工程 班 级: 12级1班 学 号: 2012394108 指导教师: 日 期: 年 月 日课程设计任务书 网络工程 专业 12 年级 1 班 孙璐 一、 设计题目学生成绩管理系统二、 主要内容数据库的数据项主要数据包括:学号、姓名、年级、专业、成绩1、成绩2、成绩3、平均成绩、总成绩。要求具有以下功能:(1) 系统以菜单方式工作。(2) 显示、保存记录;添加、删除、修改任意个记录。(3) 排序功能:打开学生数据库,计算每个学生的平均成绩和总成绩,用冒泡法或选择排序法将平均成绩和总成绩排序后生成两

2、个新文件(从大到小),存盘并显示这两个文件的全部记录。(4) 查询功能:打开总成绩排序文件,用折半查找法统计出给定分数的人数并显示。并能按学号或姓名查找并显示某个学生的各科成绩。(5) 统计功能:对各科成绩统计分析(平均分、最高分、最低分、及格率等);统计各科各分数段人数。 三、 具体要求围绕课程设计的目的和意义,基本要求如下:1、认真阅读C语言课程设计指导书,明确课程设计的目的、意义和要求;2、快速总结C程序设计语言的精髓,如:函数的概念、函数的设计和函数的调用;3、快速熟悉Tuber C 或C+的上机环境。能熟练进行高级编辑操作(特别是字块操作);熟悉步进式、断点跟踪的程序调试方法,提高工

3、作效率。4、根据“课程设计题目”,采用结构化的程序设计思想,确定系统的总体设计方案、确"定时间进度。如果是多人共一题,则要首先完成小组内的人员分工及安排,不允许重题现象。5学习并了解良好的程序设计风格。按质、按量、并按时间完成课程设计的任务。6提供可运行的课程设计系统,参加上机面试答辩。本次课程设计的重点是:学会设计并编写函数,掌握好各函数之间的调用关系;利用文件操作函数,建立数据库并完成对数据库的各种操作;掌握几种典型算法的应用(如:冒泡法、选择排序法和折半查找法)。同时锻炼学生根据题目进行分析、设计、编码、调试程序和书写必要文档的综合处理能力,从实践中学习并体会程序设计的结构化思

4、想和设计方法。四、 进度安排依照教学计划,课程设计时间为3周。按照软件工程的思想,软件系统的分析设计至关重要,并要充分重视书写“文档”。避免甚至杜绝“拿到题目就编码”的现象。建议将时间分为三个阶段:第一阶段,根据题目要求,拿出系统的总体设计方案:即构思各程序模块的算法,并画出相应的N-S图,同时编写相应的文档;第二阶段,根据N-S图编写程序代码并单独调试,再将调试通过的各个子模块进行集成调试;第三阶段,归纳文档资料,按要求填写在课程设计说明书上,并参加答辩。三个阶段时间分配的大概比例是: 35:45:20。五、 完成后应上交的材料1课程设计的题目、系统的总功能和各子模块的功能;2题目的设计思想

5、(或算法)简述;3主要程序的框图(要求用N-S图);4源程序代码(要求在关键的位置有注释,从而增加程序的可读性);5课程设计的总结报告,主要包括以下内容:(1)课程设计中遇到的主要问题和解决方法;(2)你的创新和得意之处;(3)设计中存在的不足及改进的设想;(4)本次课程设计的感想和心得体会。以上完成的源程序及相关文档,填写在课程设计说明书上,要求干净整洁,符合课程设计的要求和规范。六、 总评成绩课程设计的成绩根据学生在课程设计期间的态度,课程设计的完成情况和难易程度,文档的质量及系统演示情况综合评定。不符合要求的设计报告,抄袭的设计报告或者在设计中完全未参与者将按不及格处理。课程设计的成绩采

6、用百分制记分,成绩评定标准是:90至100分:能独立完成设计工作,在设计中体现出较强的综合运用知识能力和一定的创新能力。设计符合规范要求,说明书叙述透彻,体现一定的创新能力。设计过程中表现好,无违纪现象。80分至89分:能独立完成设计工作,在设计中体现出较强的综合运用知识的能力。设计符合规范要求,说明书叙述清楚。设计过程中表现较好,无违纪现象。70至79分:能完成设计工作,在设计中体现出一定的综合运用知识的能力,设计符合规范要求,说明书叙述比较清楚。设计过程中表现较好,无违纪现象。 60至69分:能基本完成设计工作,结果基本正确,设计符合规范要求,说明书叙述基本清楚,设计过程表现一般,无违纪现

7、象。60分以下:达不到上述水平。其中,程序设计占65%,文档占20%,面试答辩占15%。指导教师 签名日期 年 月 日系 主 任 审核日期 年 月 日目录1、 系统功能分析 .7 1.系统总功能分析 .72. 系统总框架 .73. 设计思想简述 .72、 子模块功能的描述(N-S框图 ).81. 数据结构模块 .82. 总流程图模块 .83. 建立数据库模块 .94. 增加学生的数据模块 .10 5.删除指定学号的学生的数据模块 .106.修改学生的数据模块 .117.保存函数模块 .118.显示函数模块 .119.排序函数模块 .1210.折半查找模块 .1311.统计分析学生分数模块 .1

8、4三、源程序 .151.函数声明 .15 2.建立数据库 .15 3.增加并保存学生的数据 .17 4.删除指定学号的学生的数据 .205.修改保存学生的数据 .216.保存函数 .257.显示函数 .268.按平均分或总分排序函数 .279.折半查找学生数据 .3210.统计分析学生分数 .3311.查找指定学号学生数据 .3612.主函数 .37四、课程设计总结报告 .40 1.课程设计中遇到的主要问题和解决方法 .402.你的创新和得意之处 .413.设计中存在的不足及改进的设想 .414.本次课程设计的感想和心得体会.4142佛山科学技术学院课程设计用纸一、系统功能分析1.系统总功能分

9、析本系统的功能包括了密码验证功能,录入、输出学生成绩功能,对成绩进行增、删、改的功能,保存进文件、读取文件的功能,根据平均分排序以及根据总成绩查找人数和对各科成绩进行分析统计的功能。 2.系统总框架 主程序密码进入建立数据库增加并保存学生的数据删除并保存学生的数据修改并保存学生的数据显示记 录排 序 分 数查询人数统 计 分 析查找信息3.设计思想简述本学生信息管理系统是以动态链表为基础,加上C语言的文件写法等编成的一个综合系统程序。二、子模块功能的描述(N-S框图) 1.数据结构学生信息定义为结构体,它包括学号、姓名、年级、专业、成绩1、成 绩2、成绩3、平均成绩、总成绩。结构体说的定义如下

10、:struct student /链表的数据结构int num;/记录学号 char name5;/记录姓名 int grade;/记录年级 char major2;/记录专业 float score3;/记录三科成绩分数float aver,sum;/记录平均分、总成绩struct student *next;/指向下一结点的指针 ; stu; 2.总流程图用户口令:HELLO真(strcmp(a,a_1)= =0 ) 假(strcmp(a,a_1)!=0菜单用户口令输入小于三次错误时,会提示:“对不起,您输入的口令有误!请重新输入。”输入第三次仍然口令错误时,会提示:“您的口令三次输入错误

11、,退出系统!” 输入操作序号nn=1建立数据库n=2增加保存学生数据n=3删除保存学生数据n=4修改保存学生数据n=5显示数据库的记录n=6把平均分,总分排序n=7查询指定成绩人数n=8对各科成绩统计析n=9查找指定学号信息 调用子函数后再次选择1.返回菜单2.退出系统3. struct student *creat(void) 建立数据库建立数据库是一个建立动态链表的应用。先是创立存储空间,然后输入要创立的数据库的学生的人数,按照指针的指向作用,把这些学生的数据一一录入数据库。创建存储空间p=(structstudent*)malloc(sizeof(structstudent) 输入学生的

12、学号、姓名、年级、专业、三科成绩 s->next=p;s=p; 正确 错误 输入学生的个数 要求 重新 输入 学生 学号。计算每个学生总分和平均分p->aver=(p->score0+p->score1+p->score2)/3p->sum=p->score0+p->score1+p->score2调用主函数中的save(p)4. struct student *in()增加并保存学生的数据 增加数据简单来说就是在所建立的动态链表中利用指针的 作用进行插入结点的操作。 if(fp=fopen("stud.txt",&qu

13、ot;rb")=NULL) no 打开文件 yes创建存储空间p=(structstudent*)malloc(sizeof(structstudent) 不能打开stud.txt文件,读取已储存的学生的信息。请输入需要增加的学生的个数 逐项输入学生信息 正确 错误 计算学生总分和平均分 请重新输入学号 统计结点个数判断插入在第几个结点后调用主函数中的save(p) 5.struct student *del()删除指定学号的学生的数据 删除数据是利用一个链表的一个指针的变化去“删除”(不 再指向)需要的信息和指向要删除的结点后需要的信息。 判断是否为空表if(above=0) 是

14、否输出:“数据库为空!” if(fp=fopen("stud.txt","rb")=NULL) no 打开文件 yesp=head不能打开文件读取已储存的学生的信 息。while(num!=p->num&&p->next!=NULL) 向后寻找另一数据 q=p;p=p->next; if(num=p->num) 是 否 if(p=head) 是 否 找不到学号 删除头结点head=p->next;free(p);删除一个节点q->next=p->next; -above; 6.struct stu

15、dent *searchnum()修改保存学生的数据 修改数据利用指针的指向功能,找到需要修改的学号的学 生信息,通过改变指针所指向信息的内容来修改学生的信息。 判断是否为空表if(above=0) 是 否输出:“数据库为空!” if(fp=fopen("stud.txt","rb")=NULL) no 打开文件 yesp=head不能打开stud.txt文件,读取已储存的学生的信息。while(num!=p->num&&p->next!=NULL) 向后寻找另一数据 q=p;p=p->next; if(num=p-&g

16、t;num) 是 否 修改该学号的学生信息(根据菜单switch(m)找不到 学号选择要执行的内容 1.返回上一菜单2.打开文件,显示学生数据 7.void save(struct student *head) 保存函数 if(fp=fopen("stud.txt","wb")=NULL) no 打开文件 yes用fwrite函数写入fwrite(p,sizeof(struct student),1,fp); p=p->next;不能打开stud.txt文件,读取已储存的学生的信息。保存到文件关闭文件fclose(fp) 8.void read()

17、 显示函数 显示记录是将所写入的学生的信息从之前存入的文件中读出。 if(fp=fopen("stud.txt","rb")=NULL) no 打开文件 yes用fread函数读出fread(p,sizeof(struct student),1,fp)p=p->next;不能打开stud.txt文件,读取已储存的学生的信息。输出相应学生信息关闭文件fclose(fp) 9.void scoresort(struct student *head)排序函数 排序分数是先比较两个指针指向的学生成绩的大小,如果不符合要排序的方式,则把它们的数据一一交换。由

18、此,从第一个学生到最后一个学生,即可使它们按照从大到小排列。选择排序类型b(冒泡)b=1,按平均分排序b=2,按总分排序if(q->aver>s->aver)if(q->aver>s->aver)交换数据交换数据if(fp=fopen("stud_1.txt"," wb+")=NULL) no yesif(fp=fopen("stud_2.txt", "wb+")=NULL) no yesfwrite(p,sizeof(struct student),1,fp);p=p->

19、next;不能打开文件。fwrite(p,sizeof(struct student),1,fp);p=p->next;不能打开读出排序文件中的内容读出排序文件中的内容 10.void binsearch()用折半查找法统计出给定分数的人数 if(fp=fopen("stud_1.txt","rb")=NULL) no yes用fread函数读出fread(p,sizeof(struct student),1,fp)score_1i=p->sum;不能打开该文件。输入要查询的总分数重新计算mid=(low+high)/2; if(score_

20、1mid<score) 是 否high=mid-1;low=mid+1;while(low<=high)for(i=high+1;score_1i=score&&i<k;i+) a+;for(i=high;score_1i=score&&i>0;i-) b+;输出该总成绩的人数11. void stascore()统计学生成绩for j = 0 to 2把最高分,最低分,平均分及各分数段的人数都置0for i=0 to n-1 if(maxscore < stui.scorej) 是 否 把此值赋给maxscore不交换 if(mi

21、nscore > stui.scorej) 是 否把此值赋给minscore不交换 avescore=sumscore/i计算平均值用if判断统计各科成绩在各分数段的人数循环输出上述所有数据 统计分析是利用数组,计算最高分和最低分时,和排序成绩类似;统计成绩的分数段人数时,是将学生成绩依次比较,和如果学生的分数在不小于0、小于60的范围内,则该分数段的人数加1(其他范围的类似)。三、源程序1.函数声明 struct student *creat(void);/创建一个动态链表 struct student *in(void);/增加学生数据 struct student *del(voi

22、d);/删除学生数据 struct student *searchnum();/修改学生数据 void save(struct student *head);/保存记录 void read();/显示记录 void scoresort(struct student *head);/把分数排序 void binsearch();/用折半法查找某一分数的总分人数 void stascore();/对各科成绩进行统计 struct student *search(); /查找指定学号的学生数 struct student *head;int above=0;2.建立动态链表struct studen

23、t *creat(void)/录入学生数据(学号、姓名、年级、专业、成绩1、2、3)struct student *p,*q,*s; int i,n;head=NULL;printf("n输入学生的个数:");scanf("%d",&n);for(i=0;i<n;i+)above+;p=(struct student*)malloc(sizeof(struct student);if(head=NULL)head=p;else s->next=p;s=p;p->next=NULL;q=head;printf("请输入第

24、%d个学生的信息(学号、姓名、年级、专业、成绩1、2、3):n",i+1);scanf("%d %s %d %s %f %f %f",&p->num,&p->name,&p->grade,&p->major,&p->score0,&p->score1,&p->score2); printf("n"); while(q->next!=NULL) if(q->num=p->num) printf("您输入的学生号错误,请重新

25、输入学生学号:"); scanf("%d",&p->num); continue; q=q->next; p->aver=(p->score0+p->score1+p->score2)/3;/平均成绩 p->sum=p->score0+p->score1+p->score2; /总成绩 return(head);3.增加并保存学生的数据 struct student *in() /添加学生数据 int i,j,m,n=0;FILE *fp;struct student *p,*q,*temp,*t

26、ail;if(above=0) head=NULL;elseif(fp=fopen("stud.txt","rb")=NULL) printf("打开stud.txt文件失败n"); exit(0); p=(struct student*)malloc(sizeof(struct student); fread(p,sizeof(struct student),1,fp); head=p;tail=p; while(p->next!=NULL) p=(struct student*)malloc(sizeof(struct st

27、udent); fread(p,sizeof(struct student),1,fp); tail->next=p;tail=p;tail->next=NULL;fclose(fp);printf("nn请输入需要增加的学生的个数:");scanf("%d",&j);for(i=0;i<j;i+) above+;p=(struct student*)malloc(sizeof(struct student); printf("请输入要增加的学生的信息(学号、姓名、年级、专业、成绩1、2、3):n"); sc

28、anf("%d %s %d %s %f %f %f", &p->num,&p->name,&p->grade,&p->major, &p->score0,&p->score1,&p->score2);temp=head;while(temp!=NULL) if(temp->num=p->num) printf("输入的学生号错误请重新输入学生学号:"); scanf("%d",&p->num); continue

29、; temp=temp->next; p->aver=(p->score0+p->score1+p->score2)/3; p->sum=p->score0+p->score1+p->score2; if(head=NULL) head=p;p->next=NULL;else q=head;n=1; while(q->next!=NULL) q=q->next;n+; printf("n该链表一共有%d个结点.n",n); printf("您要将新增结点插入第几个结点后?n"); s

30、canf("%d",&m); if(m<0|m>n) printf("n您的输入有误,请重新输入.n"); continue; q=head; if(m=0) p->next=head;head=p; else while(m-1)!=0) q =q->next;m-; p->next=q->next;q->next=p; return(head);4. 删除并保存学生的数据struct student *del() /删除指定学号的学生数据 int num;struct student *p,*q;FI

31、LE *fp;if(above=0) printf("n数据库为空!n"); exit(0);p=(struct student *)malloc(sizeof(struct student);if(fp=fopen("stud.txt","rb")=NULL) printf("打开stud.txt文件失败n"); exit(0); printf("nn请输入要删除的学生数据的学号:"); scanf("%d",&num);p=head;while(num!=p-&g

32、t;num&&p->next!=NULL) q=p;p=p->next;if(num=p->num)if(p=head) head=p->next;free(p); else q->next=p->next; -above; printf("删除成功!n");else printf("找不到学号:%d!n",num); q=p;return(head);5. 修改并保存学生数据struct student *searchnum() /修改指定学号的学生的数据 int m,num,gra,n;char m

33、aj10,name10;float score3;struct student *p;FILE *fp;if(above=0) printf("n数据库为空!n"); head=NULL; return(head);if(fp=fopen("stud.txt","rb")=NULL) printf("打开stud.txt文件失败n"); exit(0);p=(struct student*)malloc(sizeof(struct student);fread(p,sizeof(struct student),1,

34、fp);p=head;printf("n请输入要修改的学生的学号:");scanf("%d",&num);while(num!=p->num) p=p->next;if(p=NULL) printf("找不到该学号的学生的数据。n"); return(head);if(num=p->num) printf("已经找到该学号的学生的数据:n"); printf("学号:%-4d 姓名:%-6s 年级:%-7d 专业:%-7sn", p->num,p->name

35、,p->grade,p->major); printf("三门课程成绩:%-9.2f %-9.2f %-9.2f 平均分: %-6.2f 总分:%-7.2fn",p->score0,p->score1,p->score2,p->aver,p->sum);loop:printf("* * * * * * * * * * * * * * * * * * * * n"); printf("* * * * * * * 修改学生数据 * * * * * * * n"); printf("* *

36、 * * 1.姓名 2.年级 * * * * n"); printf("* * * 3.专业 4.第一科成绩 * * * n"); printf("* * * 5.第二科成绩 6.第三科成绩 * * * n"); printf("* * * * * * * * * * * * * * * * * * * * n"); printf("n请输入您要选择的操作号(16):"); scanf("%d",&m);printf("n"); while(m<1|m

37、>6) printf("n您输入的选择有误,请重新输入:"); scanf("%d",&m); continue; switch(m) case 1:printf("n将此学生的姓名改为:"); scanf("%s",&name);strcpy(p->name,name); break; case 2:printf("n将此学生的年级改为:"); scanf("%d",&gra);p->grade=gra; break; case 3

38、:printf("n将此学生的专业改为:"); scanf("%s",&maj);strcpy(p->major,maj); break; case 4:printf("将此学生的第一科成绩改为:"); scanf("%f",&score0);p->score0=score0; p->aver=(p->score0+p->score1+p->score2)/3; /新的平均成绩 p->sum=p->score0+p->score1+p->s

39、core2; /新的总成绩 break; case 5:printf("将此学生的第二科成绩改为:"); scanf("%f",&score1);p->score1=score1; p->aver=(p->score0+p->score1+p->score2)/3; /新的平均成绩 p->sum=p->score0+p->score1+p->score2; /新的总成绩 break; case 6:printf("将此学生的第三科成绩改为:"); scanf("%

40、f",&score2);p->score2=score2; p->aver=(p->score0+p->score1+p->score2)/3; /新的平均成绩 p->sum=p->score0+p->score1+p->score2; /新的总成绩 break; printf("n请选择您要执行的内容:n 1.返回上一菜单n 2.打开stud.txt文件,显示修改后的学生数据nnn"); scanf("%d",&n); while(n<1|n>3) printf

41、("您的输入的选择有误,请重新输入:"); continue; switch(n) case 1:goto loop;break; case 2:break;return(head);6. 保存函数void save(struct student *head) /保存函数 FILE *fp ;struct student *p;if(fp=fopen("stud.txt","wb")=NULL) printf("无法打开文件!") ;exit(0);p=head;while(p!=NULL) fwrite(p,si

42、zeof(struct student),1,fp);p=p->next;printf("n成功保存到stud.txt!");fclose(fp);7.显示函数void read() /显示函数struct student *p;FILE *fp;if(fp=fopen("stud.txt","rb")=NULL) printf("打开文件失败。n");exit(0);p=(struct student *)malloc(sizeof(struct student);fread(p,sizeof(struct

43、 student),1,fp);head=p;printf("n打开stud.txt文件的学生数据。n");while(p!=NULL) printf("学生的数据为:"); printf(" 学号:%-4d 姓名:%-6s 年级:%-7d 专业:%-7s n",p->num,p->name,p->grade,p->major); printf("三门课程成绩:%-9.2f %-9.2f %-9.2f 平均分:%-6.2f 总分:%-7.2fn", p->score0,p->sc

44、ore1,p->score2,p->aver,p->sum); p=p->next;fclose(fp);8. 把平均分,总分排序void scoresort(struct student *head)/排序函数int temp,b=0;char temp_110;float temp_2;FILE *fp; struct student *p,*q,*s;p=head; printf("请选择要排序的学生的成绩类型:n");printf("1.平均分 2.总分 :n"); scanf("%d",&b)

45、; if(b=1) /对学生的平均分进行排序 while(p->next!=NULL) s=p; q=p->next; while(q!=NULL) if(q->aver>s->aver) s=q; q=q->next; if(s!=p) temp=p->num;p->num=s->num;s->num=temp; strcpy(temp_1,p->name);strcpy(p->name,s->name); strcpy(s->name,temp_1); temp=p->grade;p->grad

46、e=s->grade;s->grade=temp; strcpy(temp_1,p->major);strcpy(p->major,s->major); strcpy(s->major,temp_1); temp_2=p->score0;p->score0=s->score0; s->score0=temp_2; temp_2=p->score1;p->score1=s->score1; s->score1=temp_2; temp_2=p->score2;p->score2=s->score

47、2; s->score2=temp_2; temp_2=p->aver;p->aver=s->aver;s->aver=temp_2;temp_2=p->sum;p->sum=s->sum;s->sum=temp_2;p=p->next;if(fp=fopen("stud_1.txt","wb+")=NULL) printf("打开stud_1.txt文件失败n");exit(0);p=head;while(p!=NULL) fwrite(p,sizeof(struct st

48、udent),1,fp);p=p->next;p=head;rewind(fp);printf("nn读出由平均成绩排序出来的文件stud_1.txt。n");printf(" list num name grade major score0 score1 score2 aver sumn");while(p!=NULL) read(p,sizeof(struct student),1,fp); printf("student %-4d %-6s %-7d %-7s %-9.2f %-9.2f %-9.2f %-6.2f %-7.2f n

49、", p->num,p->name,p->grade,p->major,p->score0,p->score1,p->score2,p->aver,p->sum); p=p->next;fclose(fp);if(b=2) /对学生的总分进行排序 while(p->next!=NULL)s=p;q=p->next;while(q!=NULL) if(q->aver>s->aver)s=q;q=q->next; if(s!=p) if(s!=p) temp=p->num;p->n

50、um=s->num;s->num=temp; strcpy(temp_1,p->name);strcpy(p->name,s->name); strcpy(s->name,temp_1); temp=p->grade;p->grade=s->grade;s->grade=temp; strcpy(temp_1,p->major);strcpy(p->major,s->major); strcpy(s->major,temp_1); temp_2=p->score0;p->score0=s->score0; s->score0=temp_2; temp_2=p-&g

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论