




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、#大学数据结构课程设计报告题目: 宿舍管理查询软件 院(系): 学生姓名: 班级: 学号: 起迄日期: 2011.6.20-2011.7.1指导教师: 指导教师评语: 成绩: 签名: 年 月 日20102011年度 第 2 学期 一、需求分析1. 问题描述: 程序设计要求:为宿舍管理人员编写一个宿舍管理查询软件 (1)采用交互工作方式 (2)建立数据文件,数据文件按关键字(姓名、学号、放号)进行排序(冒泡、选择、插入排序等任选一种) (3) 查询菜单:(用二分查找实现以下操作) 按姓名查询按学号查询按放号查询 (4)打印任一查询结果(可以连续操作) 程序分析: (1)程序采用交互工作方式,也就
2、是说要有一个人性化的操作界面。将每一 种操作赋给一个数字,通过输入不同的数字来实现不同的操作。这样使人一看就能明白如何实现不同的操作。全部使用提示选择方式,只需要输入你要使用方式的代号即可。 (2)本系统无数据信息,在使用的时候首先创建一个数据文件,开发一个录入数据的功能,使得所需要的数据存储到软件中,并暂时存在内存中,以便使用。 (3)录入和修改函数:建立相应的函数,在主函数中得到调用,以便于对学生信息的增加和修改。 (4)查询:以不同的关键字分别使用二分查找实现。 (5)为了使用方便和安全,增加了密码登录、密码锁定、退出、删除、全部删除、修改、存储为文本文档信息等功能。 2.基本功能 (1
3、)录入学生信息 (2)显示学生信息(分别按学号、宿舍号、姓名进行排序后显示并在磁盘上以“.txt”格式保存显示的信息) (3)查询学生信息(分别按学号、宿舍号、姓名进行查询并显示) (4)修改学生信息(可进行单个删除、全部删除和修改学生信息) (5)存储学生信息(存储到磁盘上,保存为“.txt”格式) (6)锁定管理系统(进入密码登录界面,以确保安全) (7)退出管理系统 3.输入输出 各种功能之间的选择采用了数字提示方式,只需要根据提示进行选择相应的数字,在录入学生信息功能中姓名为长度30以内的任意字符,学生学号和宿舍号控制住15个数字以内。 二、 概要设计1. 设计思路: 所有的程序从主函
4、数void main()开始,首先调用了load()函数进行密码登录,然后调用Menu()主菜单函数。然后在Menu()函数中又依次增加了各种功能,然后通过switch语句分别选择录入、显示、查询、修改、存储、锁定、退出功能。选择录入功能时调用Add()录入信息函数;选择显示功能时,首先调用showhead()表头显示函数,然后分别调用Sort_S_number(Student SM),Sort_D_number(Student SM),Sort_S_name(Student SM)函数根据学生学号、学生宿舍号、学生姓名关键字进行冒泡或者直接插入排序方法排序,然后显示;选择查询功能时,首先调用
5、searchheader(),表头显示函数,然后分别调用searh_S_number(Student SM);searh_D_number(Student SM);searh_S_name(Student SM);以学生学号、学生宿舍号、学生姓名为关键字进行查找,然后调用Display_All(Student SM);显示函数;选择修改功能,在通过switch语句进行选择删除、全部删除、修改功能;存储功能进行磁盘文本文档信息存储;锁定功能调用load()登录函数进行锁定;退出功能。 大体框架设计以后,然后依次对每个功能进行详细的设计。 2.数据结构设计: 逻辑结构:线性 存储结构:链式/-线性
6、表的静态单链表表示存储结构- /定义一个存储学生相关信息的结构体 #define M 100 /链表的最大长度 typedef struct char S_name31; /学生姓名 char S_number16; /学生学号 char S_sex15;/学生性别 char D_number15; /学生所在寝室的宿舍号 int Total; /学生总数 Student,StM; 这种描述方法避免了“指针”类型的使用,在上述描述的链表中,数组的一个分量表示一个结点,同时用游标(总数Total)代替指针指示结点在数组中的相对位置。数组的第零分量可以看成头结点,其指针域指示链表的第一个结点。定义
7、程序中用到的抽象数据类型:ADT List 数据对象:D=ai| ai ElemSet,i=1,2,3,n,n0数据关系:R1=| ai-1,ai D,i=1,2,3,,n基本操作:Add(Student *S)初始条件:链表不存在。操作结果:录入信息进行创建新的链表 Display_All(S)初始条件:链表S已存在操作结果:打印所有S的数据searh_S_name(Student *S)初始条件:链表S已存在。操作结果:按照名字查找指定的某元素。searh_S_number(Student *S)初始条件:链表S已存在。操作结果:按照学生学号查找指定的某元素。searh_D_number(
8、Student *S)初始条件:链表S已存在。操作结果:按照学生宿舍号查找指定的某元素。Sort_D_number(Student *S)初始条件:链表S已存在。操作结果:对链表S按照宿舍号的大小进行排序。Sort_S_name(Student *S)初始条件:链表S已存在。操作结果:对链表S按照学生姓名的先后进行排序。Sort_S_number(Student *S)初始条件:链表S已存在。操作结果:对链表S按照学生学号的大小进行排序。3. 软件结构设计:(1)模块划分 录入学生信息 void Add(Student *S) 显示学生信息 void Display_All(Student *
9、S) 查询学生信息 void search(Student *S) 修改学生信息 void Exchange(Student *S) 存储学生信息 锁定管理系统 void load() 退出管理系统 (2)函数原型 Void main();/主函数void Add(Student SM);/声明录入学生信息函数void Display_All(Student SM); /声明显示函数void Exchangehead();/声明修改学生信息表头函数(删除和修改)void Clear();/声明清屏函数void load();/声明登录函数(密码登录和密码锁定)void Menu();/声明主菜
10、单函数void searchheader();/声明查询表头函数void showhead();/声明显示方式表头函数void Sort_S_number(Student SM);/声明学生学号按从小到大的排序函数(冒泡法/直接插入法) void Sort_D_number(Student SM);/声明排序函数按照宿舍号从小到大排序(冒泡法/直接插入法)void Sort_S_name(Student SM);/按姓名排序(冒泡法/直接插入法) void searh_S_number(Student SM);/声明查询函数以学号为关键字进行查询(折半查找)void searh_D_numbe
11、r(Student SM);/声明查询函数以宿舍号为关键字进行查询(折半查找)void searh_S_name(Student SM);/查询函数以姓名为关键字进行查询(折半查找) (3)关系图 (见详细设计)三、 详细设计 1. 所有用到的数据结构的基本操作实现 (1)录入学生信息 void Add(Student *S) /定义录入函数 do cout请输入第S0.Total+1SS0.Total+1.S_number;/输入学生学号cinSS0.Total+1.S_name;/输入学生姓名cinSS0.Total+1.S_sex;/输入学生性别cinSS0.Total+1.D_numb
12、er;/输入学生宿舍号S0.Total+;/每增加一个学生信息,总数+cout按数字“0”退出,任意键继续录入ch; while(strcmp(ch,ch1)!=0); (2)显示所学生信息 void Display_All(Student *S) /定义显示函数 if(S0.Total0) for(i=1;i=S0.Total;i+) coutSi.S_nameSi.S_numberSi.S_sexSi.D_numberendl; else Cout无任何学生信息endl; (3)按姓名查找(折半查找)void searh_S_name(Student *S)/查询函数以姓名为关键字进行查询
13、(折半查找) coutname;Sort_S_name(S);/调用学生姓名按从小到大的冒泡排序函数 while(low=high) mid=(low+high)/2; if(strcmp(name,Smid.S_name)=0) /如果中间值和要查找的值匹配 int i=mid;j=1;for(i=mid+1;i=high;i+) /因为姓名有可能是相同的,所以继续在midhigh区间进行顺序查找 if(strcmp(name,Si.S_name)=0) coutSi.S_nameSi.S_numberendl; coutSi.S_sexSi.D_number=low;i-) /因为姓名有可
14、能是相同的,所以继续在low-mid区间进行顺序查找if(strcmp(name,Si.S_name)=0)coutSi.S_nameSi.S_numberendl; coutSi.S_sexSi.D_number0) low=mid+1; else high=mid-1; if(j!=1)/判断是否查到学生信息 (4) 按学号为关键字进行查询(折半查找)void searh_S_number(Student *S)/查询函数以学号为关键字进行查询(折半查找) cinnumber;/输入要查找的学生学号Sort_S_number(S);/调用学生学号按从小到大的冒泡排序函数 if(strcmp
15、(number,S1.S_number)=0)/如果要查找的和链表中的第一个相同就直接输入j=1;/判断是否查找到 Coutendl;else if(strcmp(number,S(S0.Total).S_number)=0) /如果要查找的和链表中的最后一个信息相同就直接输出j=1;/判断是否查找到 Coutendl;else while(low0) low=mid+1; /要查找的学号大于MID的学号else high=mid-1; /要查找的学会小于mid的学号 if(j!=1)/判断是否查找到 (5) 按宿舍号为关键字查找 void searh_D_number(Student *S)
16、/查询函数以宿舍号为关键字进行查询(折半查找) cinnumber;/输入要查找的宿舍号Sort_D_number(S);/调用学生学号按从小到大的冒泡排序函数while(low=high) mid=(low+high)/2; if(strcmp(number,Smid.D_number)=0) /要查找的宿舍号和mid的信息相同j=1;/判断是否查找到for(i=mid+1;i=high;i+)/宿舍号有可能相同,所以在查到一个所需的信息后仍需要继续查找,所以在剩下mid-high的区间里继续查找 if(strcmp(number,Si.D_number)=0)Cout=low;i-)/在l
17、ow-mid区间进行顺序查找if(strcmp(number,Si.D_number)=0)cout0) low=mid+1; else high=mid-1; if(j!=1)/判断是否查找到 (6) 按学号直接插入排序void Sort_S_number(Student *S)本算法是利用监视哨对num1进行直接插入排序 for(i=2;i=n;i+) 假定第一个记录有序 strcpy(num1,Si.S_number);将待排序记录放进监视哨strcpy(num2,Si.D_number);strcpy(name,Si.S_name);j=i-1; 从后向前查找插入位置,将大于待排序记录
18、向后移动 while (R0.key Sj.key) strcpy(Sj+1.S_name,Sj.S_name);strcpy(Sj+1.S_number,Sj.S_number); strcpy(Sj+1.D_number,Sj.D_number); j-; 记录后移 while strcpy(Sj+1.S_name,name);strcpy(Sj+1.S_number,num1); strcpy(Sj+1.D_number,num2); 将待排序记录放到合适位置 (7) 按宿舍号冒泡排序 void Sort_D_number(Student *S)/排序函数按照宿舍号从小到大排序(冒泡法)
19、 for(i=1;i=S0.Total;i+) for(j=i;jSj.D_number) SiSj; /将Si和Sj的信息进行交换 (8)按学生姓名进行冒泡排序 void Sort_S_name(Student *S)/按姓名排序(冒泡法)for(i=1;i=S0.Total;i+) for(j=i;j0) SiSj; /将Si和Sj的信息进行交换 2. 其他函数的实现(1)主函数void main()load();/调用登录函数 Menu();/调用主菜单函数(2) 登录函数 void load()/登录函数/本函数是把登录密码变为“*”system(color 2);/控制台字体颜色为绿
20、色coutn1;cout 密码:;char a40,b10=200907161;/初始化原密码for(i=0;i+)ai=getch();/输入一个字符,不在屏幕回显,并将输入的字符赋给ai if(ai!=r)/如果没遇到回车符则在屏幕显示“*”Cout*;/在屏幕上显示“*”elseai=0;/遇到回车符则结束输入if(strcmp(a,b)=0&n1=200907161)/进行帐号和密码匹对coutnn 登录成功。nendl;elsecoutnn 用户名或密码错误。nnumber;/要删除的学生学号for(i=1;i=S0.Total;i+) if(strcmp(Si.S_number,n
21、umber)=0)flag=i; if(!flag)coutn你所要删除的学生在表中不存在!nendl;elsefor(i=flag;iTotal;i+)j=i+1; Si Sj;/交换Si和Sj的信息S0.Total-;/链表长度减少1 (4)全部删除 S0.Total=0;/将链表长度置为0 (5)修改信息 Void exchange2() int flag=0; /用来判断表中是否存在所要修改的学生的信息cinnumber;/要修改的学生学号for(i=1;i=S0.Total;i+) if(strcmp(Si.S_number,number)=0)flag=i; if(!flag)co
22、utn你所要修改的学生在表中不存在!nSflag.S_number;/修改后的学号 cinSflag.S_name;/修改后的姓名cinSflag.S_sex;/修改后的性别cinSflag.D_number;/修改后的学号3.录入函数 插入排序4. 函数之间的调用关系图四、 调试分析 1. 实际完成的情况说明 完成密码登陆、录入学生信息、显示学生信息(分别按学号、宿舍号、姓名排序后显示)、查询学生信息(按学号、宿舍号、姓名查找)、修改学生信息(单个删除、全部删除、修改信息)、存储学生信息、锁定管理系统、退出管理系统等功能。2. 程序的性能分析 1.void Sort_D_number(Stu
23、dent *S)/按照宿舍号从小到大排序(冒泡法) 时间复杂度T(n)=O(n),空间复杂度S(n)=O(1),稳定(只进行元素间的顺序移动)。 2.void Sort_S_name(Student *S)/按姓名排序(冒泡法)时间复杂度T(n)=O(n),空间复杂度S(n)=O(1),稳定(元素间的顺序移动)。 3.void Sort_S_number(Student *S) /按照学号从小到大排序(冒泡法) 时间复杂度T(n)=O(n),空间复杂度S(n)=O(1),稳定(元素间的顺序移动)。 4.void Sort_S_number(Student *S) /直接插入法按照学号从小到大排
24、序 时间复杂度T(n)=O(n),空间复杂度S(n)=O(1),稳定(元素间的顺序移动)3. 上机过程中出现的问题及其解决方案 (1)首先在登录函数时使得密码变为“*”时,使用getch()函数时,输入密码时并不是一个一个的显示*,而是等全部输完后一起显示*。为了解决此问题上网查询了很多资料,原来getch并不是标准的C+库函数,根据提示,加入了回车符的判断,使得密码以*显示出来。 (2)调用显示函数不显示以录入的学生信息,通过同学的帮忙和自己的调试以后发现,在调用函数的时候把链表的总数S0.Total重新初始化为0,使得每次调用的时候链表中的信息全部删除。后来在Menu()函数中使用了loo
25、p环,使其避免了调用S0.Total初始化为0。 (3)修改函数一开始为独立的函数,而这样的话又重新出现了显示函数把链表初始化为0的错误,而且使用loop环过多,使得独立函数和Menu()函数中的loop不能统一起来,无法使得程序连续操作,所以将修改函数在Menu()中使用switch语句调用。4. 程序中可以改进的地方说明(1)本程的显示函数有待改进,当按宿舍号进行排序时,如果宿舍号相同的,显示的时候不能在按其他的次关键字进行排序。(2) 本程序密码和帐号有待改进,进行帐号和密码的修改。(3) 本程序的宿舍录入管理中还和现实有差距,没有对宿舍人员的限制,还需要进一步判断宿舍中是否注满人。5.
26、程序中可以扩充的功能及设计实现假想(1)现在的宿舍管理软件宿舍可以无限制住人,应该进行限制,并且可以当录入信息时,如果入住的宿舍住满可以提供其他宿舍选择。(2)修改学生信息时也应该进行宿舍提供信息,当学生搬出宿舍或者换宿舍时,软件中应该有相应的记录。五、测试结果1. 登录测试(合法数据)(非法数据)2.录入学生信息 3.按学号大小显示4. 按宿舍号大小显示5. 按学生姓名排序显示6. 按学生查找(冯帅)查找(风)7. 按学号查找(200907161)8. 按宿舍查找(427)查找(428)9. 当个删除10. 修改函数11. 存储信息12. 锁定系统13. 全部删除14. 全部删除后再显示6、
27、 用户手册1. 录入学生信息2. 修改学生信息七、体会与自我评价 在刚拿到课题的时候,浏览了很多的题目,感觉哪个都不知道怎么下手,本来想选一个通讯录的软件制作,因为感觉比较实用,但是晚了一步,被别的同学“抢”走了,然后选择了这个宿舍管理查询软件。刚拿到这个课题,虽然这个课题的要求挺少看着也挺简单,可真不知道怎么下手。后来仔细想了想,写了写提纲,然后在网上搜集了相关的资料,看了看别人的软件如何实现的,比较了几个类似的程序,然后心里有了点头绪。然后按网上的程序的步骤,一点点添加自己的东西。首先确立了程序的界面框架,在纸上把节目设计出来,将基本的功能写上。然后一点一点用程序语言写出来。开始的时候把功
28、能列出来以后感觉挺容易的了,把就是相当于写几个小程序合并起来吗,写单独功能的程序很简单,可是把界面和所有的功能联系起来就出问题了,不是这里显示不正确就是那里出现了问题。印象很深的问题就是显示函数,一个显示函数很快就写出来了,而且也没有错误,可是当放进整个程序的时候就是不显示正确的结果,后来经过一上午的调试终于搞定了,原来就是定义的时候把链表的长度始终初始化为0了,所以不管怎么显示都是没有任何信息的。调试了整整一上午,可是晚上又出问题了,是在查询函数上。当录入信息后,在没有进行查询功能时可以显示所有的信息,可是当进行查询功能后,再次进行显示时又出来“无任何信息”,虽然吸取了上次的错误,可是还是经
29、过了艰难的调试过程才发现,每次进行查询功能后,返回主菜单时,因为我在主菜单的开头就“S0.Total=0”初始化了链表长度,所以每次返回主菜单时都使得链表的长度初始化为0,所以显示才有错误。所以,为了解决这个问题,我在主菜单中利用了loop环,直接跳回初始化下边的菜单函数,而这么做却是程序显得复杂了,本来有些函数是独立,而现在却成了主菜单的一部分,失去了简洁感 。经过这次的课程设计,更加了解了数据结构,有了更新的认识。其实从这次实验中认识到,我距离高手还很远,编程有很多的乐趣也有很多的技巧性和知识性。我将在从以后的日子里继续认真的学习知识,积累经验,让自己的编程能力提高。源代码#include
30、#include#include#includeusing namespace std;#include#define M 100 /定义一个存储学生相关信息的结构体 typedef struct char S_name31; /学生姓名 char S_number16; /学生学号 char S_sex15;/学生性别char D_number15; /学生所在寝室的宿舍号 int Total; /学生总数Student,St;void Add(Student SM);/声明录入学生信息函数void Clear();/声明清屏函数void load();/声明登录函数void Menu();
31、/声明主菜单函数void searchheader();/声明查询函数void Display_All(Student SM); /声明显示函数void Sort_S_number(Student SM);/声明学生学号按从小到大的冒泡排序函数 void showhead();/声明显示方式表头函数void Sort_D_number(Student SM);/声明排序函数按照宿舍号从小到大排序(冒泡法)void Sort_S_name(Student SM);/按姓名排序(冒泡法) void searh_S_number(Student SM);/声明查询函数以学号为关键字进行查询(折半查找
32、)void searh_D_number(Student SM);/声明查询函数以宿舍号为关键字进行查询(折半查找)void searh_S_name(Student SM);/查询函数以姓名为关键字进行查询(折半查找)void Exchangehead();/定义修改学生信息表头函数/*主函数开始*void main()load();/调用登录函数 Menu();/调用主菜单函数/*主函数结束*void Menu()/主菜单函数Student SM; S0.Total=0; int choice;loop1:couttnendl;cout 欢迎使用宿舍管理系统 n endl;couttnne
33、ndl;cout 主菜单 n endl;cout 录入学生信息nendl;cout 显示学生信息nendl;cout 查询学生信息nendl;cout 修改学生信息nendl;cout 存储学生信息nendl;cout 锁定管理系统nendl;cout 退出管理系统nendl;couttnendl;coutchoice;system(cls);/清屏函数;switch(choice)case 1:/录入学生信息 Add( S);/调用录入学生信息函数system(cls);/清屏函数goto loop1;case 2:/显示学生信息int choice2;loop2:showhead();ci
34、nchoice2;if(choice2=1) Sort_S_number(S);/调用按学号大小冒泡排序函数system(cls);/清屏函数cout 按学号大小显示信息endl;Display_All(S) ;/调用显示学生信息函数/*学生信息按学号大小保存文件开始*int i;ofstream output(宿舍学生信息按学号大小记录.txt);/初始化输出流对象outputnnendl;outputendl;output 学号大小显示信息 endl;outputendl;output 学生姓名 学生学号 学生性别 宿舍号 endl;for(i=1;i=S0.Total;i+)output
35、endl;outputsetw(10)Si.S_namesetw(14)Si.S_numbersetw(10)Si.S_sexsetw(8)Si.D_numberendl; output endl; /*学生信息按学号大小保存文件结束*Clear();goto loop2;system(cls);/清屏函数else if(choice2=2)Sort_D_number(S);/调用按宿舍号大小冒泡排序函数 system(cls);/清屏函数cout 按宿舍大小显示信息endl;Display_All(S) ;/调用显示学生信息函数 /*学生信息按宿舍大小保存文件开始*ofstream outp
36、ut(宿舍学生信息按宿舍大小大小记录.txt);/初始化输出流对象int i;outputnnendl;outputendl;output 宿舍大小显示信息 endl;outputendl;output 学生姓名 学生学号 学生性别 宿舍号 endl;for(i=1;i=S0.Total;i+)outputendl;outputsetw(10)Si.S_namesetw(14)Si.S_numbersetw(10)Si.S_sexsetw(8)Si.D_numberendl; output endl;/*学生信息按宿舍号大小保存文件结束* Clear();goto loop2;system(c
37、ls);/清屏函数else if(choice2=3) Sort_S_name(S);/按姓名排序(冒泡法)system(cls);/清屏函数cout 按姓名先后显示信息endl;Display_All(S) ;/调用显示学生信息函数/*学生信息按姓名先后保存文件开始*ofstream output(宿舍学生信息按姓名先后小记录.txt);/初始化输出流对象int i;outputnnendl;outputendl;output 按姓名先后显示信息 endl;outputendl;output 学生姓名 学生学号 学生性别 宿舍号 endl;for(i=1;i=S0.Total;i+)outputendl;outputsetw(10)Si.S_namesetw(14)Si.S_numbersetw(10)Si.S_sexsetw(8)Si.D_numberendl; output endl;/*学生
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 专项学习 像工程师那样 教学设计-2024-2025学年科学一年级上册苏教版
- 抗衰老面霜项目立项备案申请报告
- 专题21 写作(任务驱动类)- 2025年高考复习近十年之语文真题分项汇编 (解析卷)
- 租借道具行业深度研究报告
- 2025年度地产项目智能家居系统承包合同
- 2025年中国婴儿奶瓶行业市场深度分析及投资策略研究报告
- 2025年抗肝片吸虫病药合作协议书
- 2019-2025年中国医疗器械制造市场供需预测及投资战略研究咨询报告
- 2025年软件工程师职务行为规范及保密合同
- 商贸综合服务中心项目可行性实施报告
- WS 400-2023 血液运输标准
- 银行业金融机构监管数据标准化规范(2021版)数据结构一览表
- 电子商务基础与实务(第四版)高职PPT完整全套教学课件
- 信息论与编码(第4版)完整全套课件
- 施工吊篮工程监理实施细则
- 自动扶梯与自动人行道调试作业指导书(通用版)
- 2023年全国卷英语甲卷讲评课件-2024届高考英语复习
- 现代通信原理与技术(第五版)PPT全套完整教学课件
- 《战胜抑郁 走出抑郁症的30天自我康复训练》读书笔记思维导图
- 幼儿园课件:时钟国王
- 最值问题-阿氏圆
评论
0/150
提交评论