面向过程综合设计课程设计-保龄球计分管理系统 (1).docx_第1页
面向过程综合设计课程设计-保龄球计分管理系统 (1).docx_第2页
面向过程综合设计课程设计-保龄球计分管理系统 (1).docx_第3页
面向过程综合设计课程设计-保龄球计分管理系统 (1).docx_第4页
面向过程综合设计课程设计-保龄球计分管理系统 (1).docx_第5页
已阅读5页,还剩27页未读 继续免费阅读

下载本文档

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

文档简介

合肥学院计算机科学与技术系课程设计报告2016 2017 学年第 1 学期课程面向过程综合设计课程设计名称保龄球计分管理系统学生姓名学号专业班级 软件工程(2)班指导教师2016 年 9 月一、需求分析1、问题描述打保龄球是用一个滚球去撞击10个站立的瓶,将瓶击倒。一局分10 轮,每轮可滚球1次或多次,以击到的瓶数为依据计分,一局得分为10轮得分之和,而每轮的得分不仅与本轮的滚球情况有关,还可能与后一轮或两轮的滚球情况有关,即:某轮某次滚球击倒的瓶数不仅要计入本轮得分,还可能会计入前一轮或两轮得分。计分规则如下:(1)若某一轮的第一次滚球就击倒全部10个瓶,则本轮不再滚球(若是第10轮还需加2次滚球),该轮得分为本次击倒瓶数10与以后2次滚球所击倒瓶数之和。(2)若某一轮的第一次滚球未击倒全部10个球,则对剩下未击倒的瓶再滚球一次,如果这2次滚球击倒全部10个瓶,则本轮不再滚球(若是第10轮还需加1次滚球),该轮得分为这2次击倒瓶数10与以后1次滚球所击倒瓶数之和。(3)若某一轮2次滚球未击倒全部10个瓶,则本轮不再滚球,该轮得分为这2次滚球所击倒瓶数之和。 2、程序有如下几个功能(1)从键盘录入比赛数据(2)计算总分排名并向屏幕输出排名信息(3)向自定义文件写入比赛数据保存到指定目录(4)退出系统二、算法设计1、设计思想因为这是一个计分系统所以在主函数中采用switch结构来达到输入数字来进行选项操作。然后通过定义大量的函数然后在swtich中来一个个调用函数来进行运算和处理。由于要使得系统能一次输入多个人比赛记录并保存,读写文件时先把每局每个人数据存入一个能存放比赛数据的结构体链表中然后将整个结构体链表存入文件file中,读写文件一律采用字符读写方式读写。 输入比赛数据以及输出比赛最终数据时利用链表遍历依次输出,对于保龄球第十格击球的特殊性再加入if语句判断然后根据不同情况进行输入计算总分。显示部分先定义Menu函数用来在程序开始前构造菜单,定义Star_Entering函数得到比赛数据后进行录入计算积分,然后利用Score_Ranking指针函数计算比分结果后直接显示比赛排名,最后可以保存数据到文件file中以备下次查看。在程序中,充分运用清屏函数可以使程序显得直观简洁。同时在不退出程序的时候,如不进行将比赛总得分数据存入文件的选项,每局每个人比赛数据都存在一个结构体链表中,然后可以选择是否把整个结构体链表读入文件并存储以便下次直接读取并显示。 (1)程序流程图根据需求作出系统程序流程图如图1所示:开始登陆输入密码输入正确?菜单输入operand1?2?3?N退出系统NNYYYWrite_File()信息写入文件Score_Ranking()排名输出Star_Entering()录入得分NYNY输入验证码验证码正确?图1 系统流程图(2)重要的数据结构本程序中采用了链表和结构体以及少量数组存储的数据类型,提高了程序的运行效率。(3)主要算法的思想 1)本程序在数据的录入时采用了结构体链表存储数据的算法,在运行上极大的提高了效率,同时在函数之间采用了链表传递数据算法,其次程序融合了许多容错机制,保障了程序的稳定性,和健壮性,以便在用户进行非法操作时程序不会意外终止。 2)本程序在计算排名时采用了快速排序算法,极大的提高了程序的运行速率,保障了本程序在运行上的高效性。2、设计表示本系统主要包括七个函数功能模块(1)login()登录模块 函数原型: void login(); 功 能: 输入用户名和密码登录系统。输入参数: 用户名(szUser)XXX。输出参数: 输入密码同时 屏幕回显“*”。(2)menu()菜单模块 函数原型: int menu (); 功 能: 在显示屏上输出菜单选项,供用户操作。输入参数: operand操作数 。输出参数: 对应的功能。(3)Star_Entering()信息录入模块 函数原型: Bowls * Star_Entering(); 功 能: 按保龄球比赛规则录入比赛得分。输入参数: Bowls *p;用链表来记录比赛数据。输出参数无输出。(4)Score_Ranking()信息排名模块 函数原型: Bowls * Score_Ranking(Bowls *phead);功 能: 按格式输出比赛最终总成绩排名信息输入参数: 无输入。输出参数: Bowls *p;已经赋值了链表 包含比赛数据以及最终总得分并排名。(5)Write_File()写入文件模块 函数原型: Bowls * Write_File(Bowls *phead);功 能: 将比赛排名后的总成绩写入自定义文件名中 便于后期查看输入参数: Bowls *p; 已经赋值的结构体链表输出参数: 无输出 将比赛最终排名和总得分信息写入文件。(6)Quicksort()排序模块 函数原型: void Quicksort(ball *a ,int low ,int hight);功 能: 快速排序函数 将录入的比分信息进行计算总得分排序输入参数: ball *a ,int low ,int hight已经赋值了a结构体链表包含比赛数据以及每格所得分数。输出参数: ball *a 结构体链表输出到显示屏包含比赛数据以及最终得分排名信息。(7)Quit_System() 退出系统模块 函数原型: void Quit_System();功 能: 系统使用完毕 退出系统输入参数: operand操作数选择退出。 输出参数: 输出退出系统提示信息。3、实现注释(1)在本保龄球计分管理系统中模拟10个人各打一局保龄球比赛过程,统计每局各轮得分和累计总分在程序中已经实现,在此功能实现的基础上还增加了在之前提供给用户一个登陆功能模块,即从键盘读入字符串数组用户名szUser20,密码chPwd20,与程序内置的用户名PUser20,密码Pword20进行比较,如果相等则登录成功,同时在登录的基础上还实现了验证码模块,密码输入正确进入系统,否则错误三次则进入验证码输出模块。(2)在本保龄球计分管理系统中逐人逐轮逐次输入一次滚球击倒的瓶数功能已经实现,运行测试结果完好,符合设计要求,同时在实现基本信息录入的基础上还增加了程序的容错机制,通过利用do while来改写scanf函数来实现,即用户输入错误的数据不会出现系统崩溃问题。(3)在本保龄球计分管理系统中对10人的得分由低到高排序并显示功能已经实现,且运行效果很好,这里本程序在原先传统冒泡排序算法的基础上采用了其他算法,快速排序算法,通过把从结构体传递过来的信息,按照结构体中的得分信息为依据进行排序,排序利用快速排序算法,即先找到数组中某个元素的位置,然后以该元素位置为依据,对后面的元素分块定位,最终找到其他元素位置。使得本程序在排序上更加高效,相比原先的冒泡等其他排序方法在时间复杂度上较低,有利于程序的高效性。(4)在本保龄球计分管理系统中把排序的存入文件中功能已经实现,且运行效果很好,完全符合设计要求,同时在实现基本文件读写操作的基础上还增加了自定义文件名功能,即用户在保存第一次得分记录后,在下一次计分时只要定义另外一个文件名就不会覆盖第一次的保存数据,从而实现了文件信息的永久保存。4、算法设计中一些新的想法: (1)本程序在scanf函数输入得分时加入了do while语句,提高了程序的容错性,容错机制也非常强大,支持用户基本所有输入错误。比如不慎输入字符或字符串不兼容等问题 。 (2)本程序虽然在排序上采用了快速排序法,有效的降低了程序的时间复杂度,但是在排序前对于链表和结构体数组之间进行了两次转化,显得有些麻烦,还有待更好的算法对其进行优化处理。 (3)本程序在功能上还可以额外增加一些功能,比如对选手信息的查找,修改和删除等一些操作,但是由于课程设计要求并无此要求,所以对于这些功能没有对其实现,所以作为扩展,本程序还有很大的优化空间。三、用户手册用户在使用本系统时,这里有几点说明要解释和使用过程中的注意事项 ,以便用户更好和正确的使用本系统。1、 初始用户名: swd ,初始用户登录密码:123456 如下图2所示:图2 登录示例2、输入数据要求,如图3所示:第一轮滚球第一次滚球得分:第二次滚球得分:第二轮滚球第一次滚球得分:第二次滚球得分:.图3 登录示例每次输入的得分数据都为1-10内的整型数字,不能输入其他大于10或小于0的数字,当然本系统自带容错机制,如若不慎输入了其他不符合条件的数字,系统提示无法继续执行,用户需要再次输入得分数据,直到输入的数据正确才继续往下执行,本程序的容错机制非常强大,基本输入错误均不会导致程序崩溃,用户可放心使用。3、操作过程通过选择功能前对应的数字,按回车键确定,用户必须严格按照操作顺序执行相应操作,例如必须在录入得分后才能进行排名操作。4、文件名为自定义名字,存储该程序所在当前目录下,不能改变存储位置。四、调试及测试1、在本次程序设计中主要遇到了如下问题并给出解决方案 (1)在计分录入的函数中,数据录入链表过程中,输出信息总是会出现乱码问题,开始不清楚为什么,在整个链表数据节点地址指向方面均无问题,就是输出的结果总是会出现大量的乱码,并且程序会陷入死循环。最终经过一系列的排查发现是链表的为节点忘记置空所致(r-next = NULL),这样之所以会导致问题的原因我也做了一些分析,由于链表的尾节点没有置空,所以在输出的时候无法判断循环是否结束,所以会一直输出,开始的数据是正确的,后面全是乱码,最终导致程序意外终止,如下图4所示。图4 程序意外停止 (2)在计分录入函数中,由于第十组数据特殊,关系到是否追加两次滚球还是追加一次滚球。在开始的系统编写时,我把第十组数据在循环中用if对其进行操作,后来发现还是有很多情况if无法全部解决,录入的数据会出现很多不符合实际情况的数据,从而最终导致这个算法无法实现功能上的要求。最终想到了另外的一种算法解决了问题,就是把第十组数据单独拿出来进行讨论,考虑追加一次还是两次滚球或是不追加滚球,修改后程序运行正常,截图如下图5所示。图5 修改后程序运行正常 (3)在计分排名函数中,开始运用了冒泡排序的算法,基本的功能也实现了,后来考虑到这样写还是有些繁琐,最主要的还是在算法上不太好,时间复杂度较高,如果运行的数据较多时会降低运算速率,不太利于程序的高效性。最终思考了很久,想起了曾经学习过的快速排序算法,就对快速排序算法做一些修改,最终用在本程序,取代了原有的冒泡排序算法,算是功能上的一次小规模的优化操作。 (4)在排名信息写入文件的操作中,开始采用传统的文件操作方式,即实现在程序中定义好文件名。后来的测试发现,这样写的算法不太好,因为从程序的实际意义上考虑,这样写默认了用户只能保存一组数据,在下一次使用本系统就会将第一次的数据进行覆盖,实用性能不高。如果用户在一次使用完毕后需要再次使用本系统时,便会出现问题,从而导致本系统无法满足用户实际需求。所以后来我对其进行了优化操作,使得文件名可以进行自定义,所以用户每次的数据都可以存放在不同的文件中,从而实现了文件信息的永久保存,如下图6所示。图6 文件信息保存2、对设计和编码的回顾讨论和分析 在本次设计中在计算比分排名时,印象深刻,开始运用了冒泡排序的算法,基本的功能也实现了,for(int t = j ; t pnumt+1)maxnum = pnumt;pnumt = maxnum;maxnum = pnumt+1;strcpy(maxname,pnamet+1);pnumt+1 = pnumj;strcpy(pnamet+1,pnamej);pnumj = maxnum;strcpy(pnamej,maxname);后来考虑到这样写还是有些繁琐,最主要的还是在算法上不太好,时间复杂度较高,如果运行的数据较多时会降低运算速率,不太利于程序的高效性。最终考虑决定采用新的算法替换此算法,于是采用了数据结构中的快速排序算法,就对快速排序算法做一些修改,最终得以用在本程序,取代了原有的冒泡排序算法,算是功能上的一次小规模的优化操作。3、程序运行的时空效率分析开始程序采用了冒泡排序算法,但是进过大量的数据测试发现例如在数据达到6000个时,排序算法就会显得有时间速率上的缺陷,6000个数据冒泡排序需要72毫秒。测试截图如下:图7 冒泡排序时间测试截图而采用快速排序后极大的缩短了运行时间,同样的6000个数据,只需要1毫秒,比常用的冒泡排序大约快了72倍,测试截图如下:图8 快速排序测试截图 经过大量的运行数据测试发现,程序的运行效率始终保持很好的运行状态,运行的速率也很快,运行时间也很短,但是很多地方或许还有更好的算将其进行优化操作。4、测试数据集通过测试了很多数据,最后一次测试数据如下:人数:10张三 10 10 10 10 2 5 4 2 10 10 10 2 1李四 2 5 1 4 10 4 1 4 2 1 2 10 3 6 10 5 2小黄 10 10 10 10 10 10 10 10 10 2 3小张 10 10 10 10 10 10 10 10 10 4 5小智10 10 10 10 10 10 10 10 10 10 1 10小龙10 10 10 10 10 10 10 10 10 10 10 1小李 10 10 10 10 10 10 10 10 10 10 10 4小明 10 10 10 10 10 10 10 10 10 10 10 6王五 2 1 4 2 5 2 3 2 10 5 4 5 5 10 5 4 4 2张四 10 10 10 10 10 10 10 10 10 10 10 105、运行实例运行测试发现所有的数据均无错误,其中最后一次运行测试截图如下:图9 录入成绩截图图10 计算并输出排名截图图11 排名信息写入文件截图6、本课程设计经验和体会通过本次保龄球管理系统程序设计让我学会了一个项目程序从拿到问题后,先分析问题,然后设计解决方案,解决方案通过一些算法实现,再到程序中遇到错误进行排错,学会了一些程序的调试方法和如何查找错误发生的具体位置,最后到运行测试,编写用户手册的一系列过程等等。还学会了在一套解决算法实现后再改进程序算法从而使程序的高效性和健壮性得到很大的提高。同时,在设计了保龄球计分管理系统后我对C语言有了更加熟练地掌握,巩固了C语言很多知识,也加强了我的很多应用能力,运用了函数的知识来给我的系统完善功能,并且学会在主函数中调用他们。用了函数的嵌套调用,来循环使用同一个功能,让用户不必再重新使用时重新打开程序。这次的课程设计加强了我对结构体及链表的掌握,本系统运用了文件操作,使我的文件操作掌握更加熟练,在处理数据时又提高了我的数据处理能力及数组的使用能力。这次课程设计使我感受到了编程的魅力,也让我理解了开发软件的难度,同时也增强了我对今后软件开发的激情,触发了我对编程的热情,我会更加努力的学习编程知识,能够早日的更加完善我的系统,弥补我技术上的不足以及功能上的不完善。五、小结 通过本次程序设计让我学会了一个项目程序从拿到问题后,先分析问题,然后设计解决方案,解决方案通过一些算法实现,再到程序中遇到错误进行排错,学会了一些程序的调试方法和如何查找错误发生的具体位置,最后到运行测试,编写用户手册的一系列过程等等。还学会了在一套解决算法实现后再改进程序算法从而使程序的高效性和健壮性得到很大的提高。同时,在设计了保龄球计分管理系统后我对C语言有了更加熟练地掌握,巩固了C语言很多知识,也加强了我的很多应用能力,在写菜单界面时我使用了switch语句来实现调用各个功能。我运用了函数的知识来给我的系统完善功能,并且在主函数中调用他们。我是用了函数的嵌套调用,来循环使用同一个功能,让用户不必再重新使用时重新打开程序。这次的课程设计加强了我对结构体及链表的掌握,本系统运用了文件操作,使我的文件操作掌握更加熟练,在处理数据时又提高了我的数据处理能力及数组的使用能力。但本系统还有很多的不足之处,在下面会有提及。这次课程设计使我感受到了编程的魅力,也让我理解了开发软件的难度,同时也增强了我对今后软件开发的激情,触发了我对编程的热情,我会更加努力的学习编程知识,能够早日的更加完善我的系统,弥补我技术上的不足以及功能上的不完善。在进行保龄球计分管理系统的编写时,我觉得最重要的是要切合实际,考虑要周全,要了解你所编写的系统的所有要求,遇到问题不仅要思考解决方案,还需要考虑更加简单高效的算法,这样才能完善你的系统。另外虽然在scanf函数输入得分时加入了do while语句,提高了程序的容错性,健壮性和稳定性,但是C语言知识有限,可能很多算法还有待优化。本程序虽然在排序上采用了快速排序法,有效的降低了程序的时间复杂度,但是在排序前对于链表和结构体数组之间进行了两次转化,显得代码的可读性有些差,还有待更好的算法对其进行优化处理。本程序在功能上还可以额外增加一些功能,比如对选手信息的查找,修改和删除等一些操作,但是由于课程设计要求并无此要求,所以对于这些功能没有对其实现,所以作为扩展,本程序还有很大的优化空间。六、参考文献1黄明等编著.C语言课程设计M.北京:电子工业出版社,20062郭翠英编著.C语言课程设计案例精编M.北京:中国水利水电出版社,20043 严蔚敏等.数据结构(c语言版)M.北京:清华大学出版社,20114 谭浩强编著.C程序设计(第4版) M.北京:清华大学出版社,20105 王卓等编著.C语言工程实训教程M.北京:人民邮电出版社,20136 WIRTH N.算法+数据结构=程序M.北京:科学出版社,19907 王全明编著. C语言程序设计M.北京:中国铁道出版社,2015七、附 录 1、源程序清单#includestdio.h#includestdlib.h#includestring.h#include #include #include /sleep函数 #include#includectype.h/*结构体变量和链表指针定义*/typedef struct bowls /保龄球计分系统变量 /变量;char name10; /名字int sum_score; /总得分int score10; /每轮的得分 ball;typedef struct nodeball date; /数据域struct node * next; /指针域Bowls , *Pbowls;/*函数声明*/void Login(); /系统登陆函数int Menu();void Quit_System(); /退出系统Bowls * Star_Entering(); /计分录入Bowls * Score_Ranking(Bowls *phead); /计分排名输出Bowls * Write_File(Bowls *phead); /信息写入文件保存 void Quicksort(ball *a ,int low ,int hight); /快速排序int post (ball *a ,int low ,int hight); /快速排序Pbowls phead;Bowls * p;/*主函数*/int main(void)system(color A); /设置字体颜色/system(color 10f); /调节背景颜色函数 char operand20; /功能选择变量int m;printf(t* * * * * * * * * * n); printf(t* * * * * * * * * * * * * n); printf(t* * * * * * * * * * * * * * *n); printf(t* * * * * * * * * * * * * * * n); printf(t* * * * * * * * * * * * n);printf(t欢迎使用保龄球计分管理系统n);printf(t请先登陆:n);Login();Menu();/*菜单*/while(true)p:scanf(%s,&operand); m = atoi(operand);if(m4|m=2&v5) a=(rand() % (10000-1000)+ 1000 + 1; /随机生成一个四位数验证码,当用户名或密码连续输入错误两次时调用 printf(请输入验证码:n); printf(%dn,a);p:scanf(%d,&d);if(a=d)getchar();goto g;elseprintf(输入有误!请重新输入:n);goto p; if(v=5) printf(操作不合法,程序关闭!n); exit(0); g : char *PUser3=swd,admin,00000000000; /预定义用户名char *Pword3=123456,123321,00000000000; /预定义密码char chPwd6; /待输入的用户密码int flag_u=0,i=0,flag_p=0,num=0;printf(t请输入用户名:);gets(szUser);/printf(szUser=%sn,szUser);while(i2) if(strcmp(szUser,PUseri)=0) /判断输入的用户名是否与预定义的用户名相同flag_u=1;break; else flag_u=0;i+; num=i;/printf(num=%d,flag_u=%dn,num,flag_u);printf(t请输入密码:);i=0;while (i10)chPwdi=getch(); /获取键盘输入的密码if(chPwdi=13)break;printf(%c, chPwdi);Sleep(100);printf(b*); /每输入一个密码字符就在屏幕回显一个*i+;chPwd6=0;/printf(chPwd=%dn,Pwordnum);printf(n);if(strcmp(chPwd,Pwordnum)=0)flag_p=1;elseflag_p=0;if(flag_u=1)&(flag_p=1)printf(正在验证密码);for(int c=0;c3;c+)printf(.);Sleep(150);printf(n);printf(登录成功!n);printf(正在进入系统);for(int b=0;b3;b+)printf(.);Sleep(300);printf(n);system(cls); /清屏函数elseprintf(您输入的账号或密码错误,请重新输入!n);v+;goto s; /输入错误返回s位置重新输入return ;/int Menu() /系统菜单printf(t* * * * * * * * * * n); printf(t* * * * * * * * * * * * * n); printf(t* * * * * * * * * * * * * * * n); printf(t* * * * * * * * * * * * * * * n); printf(t* * * * * * * * * * * * n);printf(t-n);printf(t*请选择需要的操作:*n);printf(t*1.计分录入开始*n);printf(t*2.计算计分结果牌排名*n);printf(t*3.保存计分信息到文件中*n);printf(t*4.退出系统*n); printf(tn);printf(t-n);return 0;/void Quit_System() /退出系统printf(谢谢使用!n);printf(再见!n);exit(-1);return ;/Bowls * Star_Entering() /计分录入char num120;int a3;char a120;int n = 1;int k = 0;int num;Bowls *phead = (Bowls*)malloc(sizeof(Bowls); /为头结点动态分配一块内存if(NULL = phead) /判断动态内存分配是否成功 printf(动态内存分配失败! 程序终止!n);exit(-1);Bowls *p =NULL , *r = NULL;r = phead;k:printf(请输入计分人数:n);scanf(%s,&num1);num = atoi(num1); /将输入的num1字符串转化为整型数据if(num=0) /*此处为程序的容错机制,当输入的数据不合法时,if语句中的goto k,会使上面的输入语句重新执行,程序不会报错意外停止 */printf(输入数据不合法,请重新输入(整型数字)!: );printf(32);Sleep(600);system(cls);Menu();goto k;for( int j = 0 ; j );for( int o = 0 ; o date.scoreo = 0; /首先为每一个选手的每轮成绩初始化,便于后面的累加操作p-date.sum_score = 0;/为每一个选手的总成绩初始化for( int i = 0 ; i 9 ; +i ) /每位选手的前九轮比赛得分记录printf(第%d轮滚球:n , i+1);for(k = 0 ; k 10)printf(输入数据不合法,请重新输入(整型数字1-10): );Sleep(600);printf(r);printf( r);if(ak10 | p-date.scorei+ak10) | (akdate.scorei+ak10)|ak=0);if(ak = 10)p-date.scorei = ak + p-date.scorei;break;else if(ak date.scorei = ak + p-date.scorei;printf(第10轮滚球:n); /第十轮滚球计分printf(请输入第1次滚球得分: );doscanf(%s,&a1);ak = atoi(a1);if(ak=0)printf(输入数据不合法,请重新输入(整型数字1-10): );Sleep(600);printf(r);printf( r);if(ak10)printf(输入数据不合法,请重新输入(整型数字1-10): );Sleep(600);printf(r);printf( r);if(ak10 | p-date.scorei+ak10) | (akdate.scorei+ak10)|ak=0);p-date.score9 = ak + p-date.score9;if(p-date.score9 10)printf(输入数据不合法,请重新输入(整型数字1-10): );Sleep(600);prin

温馨提示

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

评论

0/150

提交评论