毕业设计(论文)-C语言源码评判系统设计与实现.doc_第1页
毕业设计(论文)-C语言源码评判系统设计与实现.doc_第2页
毕业设计(论文)-C语言源码评判系统设计与实现.doc_第3页
毕业设计(论文)-C语言源码评判系统设计与实现.doc_第4页
毕业设计(论文)-C语言源码评判系统设计与实现.doc_第5页
已阅读5页,还剩60页未读 继续免费阅读

下载本文档

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

文档简介

北京邮电大学 C语言源码评判系统设计与实现 摘要 C语言源码评判系统是智能信息处理技术的具体应用,系统可以自动完成选择题、 填空题、简答题的自动评判,并自动编译、运行用户提交的源代码。实现的C语言源码 评判系统,采用MySQL数据库保存用户身份信息,实现用户创建与删除,主要包括管理 员、教师和学生三种身份。同时,在数据库中,还保存有学生的考试成绩与试卷提交 时间,最重要的是数据库中保存有C语言试题库。Qt界面通过MySQL数据库API,访问并 管理数据库中的相关数据信息,包括用户身份信息、成绩和C语言题库等。它通过Qt界 面的方式提交用户针对特定问题设计的源代码,然后进行自动评判,立即反馈信息, 给计算机专业数据结构、算法等课程的教学和学习带来极大的方便。本文在研究了当 前流行的源代码自动评判系统后,针对源代码自动评判系统受时间地点限制、并发处 理能力差、可伸缩性差等问题,完成改进的设计方案,并在Linux和Windows环境下用C /C+开发实现。系统遵循软件工程设计规范,针对提高系统可用性作了设计,并进行 了性能测试和优化设计。 关键词:多线程,高可用性,自动阅卷 北京邮电大学 C Program Automatic Judge System Abstract The C program automatic judge system is intelligent information processing technology, specific application, the system Call automatically compile and run the riser to submit the source code and system time consumed by user programsJudging system of implementation of the C language source code, using MySQL database to store the user identity information, realizes the user to create and delete, including administrators, teachers and students of three kinds of identity. At the same time, in the database, but also hold the students test scores and test submission time, database is the most important mediator with C language test. Qt interface through the MySQL database API, access and management of the related data in the database information, including user identity information, grades and C language test, etc.It is submitted via a Qt UI designed for users to issue-specific source code,and then automatically judged immediately feedback to the computer science data structures,algorithms such source from the teaching and learning has brought great convenienceThis paper studies the source code for the popular automatic judge system,the source code for the automatic judge system by the time and place constraints,concurrent processing capability is poor,and poor scalability issues,the completion of an improved design,and in Linux 2、数据库初始化 创建项目数据库: mysqlcreate database c_test_system CHARACTER SET utf8; 切换到项目数据库: mysql use c_test_system; 创建管理员信息表: mysql create table administrator (id int auto_increment primary key, user varchar(30) not null, pass varchar(30) not null); 添加管理员: mysql insert into administrator values(,admin,admin); 创建教师信息表: mysql create table teacher (id varchar(30), name varchar(30), user varchar(30) not null, pass varchar(30) not null); 添加教师: mysql insert into teacher values(001,赵老师, teacher_01, teacher_01); mysql insert into teacher values(002,钱老师, teacher_02, teacher_02); 创建学生信息表: mysql create table student ( id varchar(30), name varchar(30), user varchar(30) not null, pass varchar(30) not null, last_score int, last_time varchar(30) not null, question_ans_1 varchar(1024) not null, question_ans_2 varchar(1024) not null, 北京邮电大学 19 question_ans_3 varchar(1024) not null, question_ans_4 varchar(1024) not null, question_ans_5 varchar(1024) not null, question_ans_6 varchar(1024) not null, question_ans_7 varchar(1024) not null, question_ans_8 varchar(1024) not null, question_ans_9 varchar(1024) not null, question_ans_10 varchar(1024) not null ); 添加学生: mysql insert into student values(001,张三, student_01, student_01, 0, , , , , , , , , , , ); mysql insert into student values(002,李四, student_02, student_02, 0, , , , , , , , , , , ); 创建试题列表: mysql create table question (id int auto_increment primary key, content varchar(1024) not null, answer varchar(1024) not null); 添加选择题(5题,1题10分,共50分): mysql insert into question values(,在C语言中,每个语句必须以_结束。 A. 回车符, B. 冒号, C. 逗号, D. 分号, D); mysql insert into question values(,标识符和关键字间,要用_隔开。 A. 回车符, B. 冒号, C. 空格, D. 分号, C); mysql insert into question values(,用C语言编写的源文件经过编译,若没有产生编译错误,则系统将_ 。 A. 生成可执行目标文件 B. 生成目标文件 C. 输出运行结果 D. 自动保存源文件, B); mysql insert into question values(,下列说法中正确的是_。 A. C语言程序由主函数和0个或多个函数组成 B. C语言程序由主程序和子程序组成 C. C语言程序由子程序组成 D. C语言程序由过程组成, A); mysql insert into question values(,下列说法中错误的是_。 A. 主函数可以分为两个部分:主函数说明部分和主函数体 B. 主函数可以调用任何非主函数的其他函数 C. 任何非主函数可以调用其他任何非主函数 D. 程序可以从任何非主函数开始执行 , D); 北京邮电大学 20 添加填空题(2题,1题10分,共20分): mysql insert into question values(,每个源程序有且只有一个_函数,系统总是从该函数开始执行C语言 程序。, 主); mysql insert into question values(,在C语言程序中允许出现的字符集是_字符集。, ASCII码); 添加简答题(2题,1题10分,共20分): mysql insert into question values(,试描述Static的特点?, 1.局部变量在函数内定义 2.局部变量的生存期虽然为整个源程序,但是其作用域仍域自变量相同 3.允许对构造类静态局部量赋初值 4.对基本类型的静态局部变量若在说明未赋予初值,则系统自动赋予0值); mysql insert into question values(,文件的操作顺序是什么?, 1. 定义文件指针 2. 打开文件,判断是否成功打开,若打开失败,程序退出运行状态 3. 对文件进行读写操作 4. 关闭文件); 添加编程题(1题,共10分): mysql insert into question values(,将正整数123456789,逆序打印出各位数字。,987654321); 5.2 Qt界面设计 Qt界面通过MySQL数据库API,访问并管理数据库中的相关数据信息,包括用户身 份信息、成绩和C语言题库等。 Qt界面主要包括登录窗口、管理员管理窗口、教师管理窗口和学生考试窗口,各 个窗口的功能说明如下所示: 1) 登录窗口:完成用户登录,可以选择管理员、教师和学生; 2) 管理员窗口:可以完成教师和学生的身份信息添加与删除; 3) 教师管理窗口:教师可以通过该窗口获取学生的考试成绩; 4) 学生考试窗口:学生通过该窗口可以完成C语言考试,并获取成绩。 北京邮电大学 21 程序架构: 登录界面 (管理员、教师或学生) 管理员窗口教师窗口学生窗口 添加 与删 除用 户 获取 身份 信息 获取 成绩 显示 用户 信息 获取 成绩 进入 考试 MySQL数据库 图5.1 程序架构 5.3 C语言考试题型分析 C语言考试有其自身的特点,大多C语言考试一般通过以下几种题型考察学生对编 程能力的综合掌握程度: 1)选择题:考察学生对基本概念的掌握程度,覆盖知识点较多; 2)填空题:考察学生对知识掌握的精确度; 3)简答题:要求考生对问题进行合适回答; 4)编程题:编制一个源程序,并进行编译、调试、连接及运行,得到正确结果。 5.4功能实现 5.4.1 密码修改 void studentform:on_btnOk_2_clicked() if(ui-leOldPwd_2-text()=|ui-leNewPwd_2-text()=|ui- leNewPwd2_2-text()=) QMessageBox:about(this,Message,item with * cant not be empty!);return ; if(ui-leNewPwd_2-text()!=ui-leNewPwd2_2-text() QMessageBox:about(this,Message,tr(新密码和确认新密码不统一!);re 北京邮电大学 22 turn ; QSqlQuery query; query.exec(update student set pass=+ui-leNewPwd_2-text()+ WHERE user=+stdName+); if(query.isActive() query.numRowsAffected(); QMessageBox:about(this,message,success); 5.4.2 随机选题 /从两套题中随机选题 srand( time( NULL ) ); int question_select = rand(); if (question_select % 2) = 0) question_name = question; ui-label-setText(A卷题号); else question_name = question1; ui-label-setText(B卷题号); timer-start(1000); ui-btnPrevious_3-setEnabled(true); ui-btnNext_3-setEnabled(true); ui-btnSubmit_3-setEnabled(true); ui-btnStart_3-setEnabled(false); QSqlQuery query; query.exec(select COUNT(*) from + question_name +;); if(query.next() num = query.value(0).toInt(); for(int i=0;i 5) ui-rBtnA_3-setDisabled(true); ui-rBtnB_3-setDisabled(true); ui-rBtnC_3-setDisabled(true); ui-rBtnD_3-setDisabled(true); ui-textEdit_ans-setDisabled(false); ui-pushButton-setDisabled(false); ui-pushButton_2-setDisabled(false); 北京邮电大学 23 ui-pushButton_3-setDisabled(false); if (currentNum rBtnA_3-setDisabled(false); ui-rBtnB_3-setDisabled(false); ui-rBtnC_3-setDisabled(false); ui-rBtnD_3-setDisabled(false); ui-textEdit_ans-setDisabled(true); ui-pushButton-setDisabled(true); ui-pushButton_2-setDisabled(true); ui-pushButton_3-setDisabled(true); query.exec(select * from +question_name+ where id=+QString:number(questionId0)+); ui-leQuestionID_3-setText(QString:number(currentNum); if(query.next() ui-textEdit_3-append(query.value(1).toString(); get_current_question_ans(); 5.4.3 计算成绩 /计算最终成绩 void studentform:on_btnSubmit_3_clicked() score = 0; QString student_ans; QString teacher_ans; QSqlQuery query; QString column_name; for (int i = 1; i textEdit-insertPlainText(n= 考试结果 =n); 北京邮电大学 24 if (i != 10) if (student_ans= teacher_ans) score += 10; ui-textEdit-insertPlainText(第+QString:number(i, 10)+题:正确n); else ui-textEdit-insertPlainText(第+QString:number(i, 10)+题:错误!n); else if (run_output = teacher_ans) score += 10; ui-textEdit-insertPlainText(第+QString:number(i, 10)+题:正确n); else ui-textEdit-insertPlainText(第+QString:number(i, 10)+题:错误!n); teacher_ans.clear(); student_ans.clear(); column_name.clear(); 5.4.4 检测抄袭 /检测编程题是否抄袭 if (currentNum = 10) int count=0; QString other_ans; query.exec(select count(*) from student;); if(query.next() count = query.value(0).toInt(); for (int i = 0; i textEdit_ans-document()-toPlainText() QMessageBox:about(this,警告,tr(编程题涉嫌抄袭!n); ui-btnSubmit_3-setDisabled(true); return; 5.4.5 加载源文件 void studentform:on_pushButton_3_clicked() 北京邮电大学 25 ui-btnSubmit_3-setDisabled(false); QString SendFileName = QFileDialog:getOpenFileName(this, tr(选择源文件), 0, tr(*); /添加更多的文件类型 QFile file(SendFileName); /如果取消打开则退出函数 if(file.fileName().isEmpty() return; /如果打开失败则提示并退出函数 if(!file.open(QFile:ReadOnly | QIODevice:Text) QMessageBox:warning(this, tr(打开失败), tr(抱歉! 未能打开此文件, 这可能是由于没有足够的权限造成的.), QMessageBox:Ok); return; 5.4.6 下一题 /切换到下一道题 void studentform:on_btnNext_3_clicked() if(currentNum=questionNum) QMessageBox:warning(this,tr(Warning),tr(这已经是最后一道题了!); return; ui-textEdit_3-clear(); currentNum = currentNum+1; if (currentNum 5) ui-rBtnA_3-setDisabled(true); ui-rBtnB_3-setDisabled(true); ui-rBtnC_3-setDisabled(true); ui-rBtnD_3-setDisabled(true); ui-textEdit_ans-setDisabled(false); ui-pushButton-setDisabled(false); ui-pushButton_2-setDisabled(false); ui-pushButton_3-setDisabled(false); if (currentNum rBtnA_3-setDisabled(false); ui-rBtnB_3-setDisabled(false); ui-rBtnC_3-setDisabled(false); ui-rBtnD_3-setDisabled(false); 北京邮电大学 26 ui-textEdit_ans-setDisabled(true); ui-pushButton-setDisabled(true); ui-pushButton_2-setDisabled(true); ui-pushButton_3-setDisabled(true); ui-leQuestionID_3-setText(QString:number(currentNum); QSqlQuery query; query.exec(select * from +question_name+ where id=+QString:number(questionIdcurrentNum-1)+); if(query.next() ui-textEdit_3-append(query.value(1).toString(); get_current_question_ans(); 5.4.7 数据库连接 /与数据库连接 bool createConnection() QSqlDatabase db(QSqlDatabase:addDatabase(QMYSQL); db.setHostName(localhost); db.setUserName(DATABASE_USER); db.setPassword(DATABASE_PASSWARD); db.setDatabaseName(c_test_system) if (!db.open() QMessageBox:warning(0, QObject:tr(Database Error), db.lastError().text(); return false; /初始化数据库 QSqlQuery query; /创建项目数据库: query.exec(create database c_test_system CHARACTER SET utf8;); /切换到项目数据库 query.exec(use c_test_system;); /创建管理员信息表 query.exec(create table administrator (id int auto_increment primary key, user varchar(30) not null, pass varchar(30) not null);); /添加管理员 query.exec(insert into administrator values(,admin,admin);); /创建教师信息表 query.exec(create table teacher (id varchar(30), name varchar(30), user 北京邮电大学 27 varchar(30) not null, pass varchar(30) not null);); /创建学生信息表 query.exec(create table student (id varchar(30), name varchar(30), user varchar(30) not null, pass varchar(30) not null, last_score int, last_time varchar(30) not null);); return true; 5.4.8 获取值 /获取当前列 的索引 scoreInfoModel-setHeaderData(0,Qt:Horizontal,tr(学生学号); scoreInfoModel-setHeaderData(1,Qt:Horizontal,tr(学生姓名); scoreInfoModel-setHeaderData(2,Qt:Horizontal,tr(考试成绩); scoreInfoModel-setHeaderData(3,Qt:Horizontal,tr(考试时间); ui-tvScore_2- setEditTriggers(QAbstractItemView:NoEditTriggers);/使其不可编辑 ui-tvScore_2-setModel(scoreInfoModel); ui-tabWidget-setCurrentIndex(0); 北京邮电大学 28 6 系统测试 6.1 测试方案 鉴于本系统的目的是用于评判教学中学生编写的C源程序文件,程序的复杂度不 是很高,输入输出数据也相对较为简单。为了测试出各种质量的程序的评判结果是否 正确,选取各文件夹中的一个程序修改使之存在语法错误而无法通过编译链接,一个 完全正确的程序,另两个修改程序使之语法正确能够通过编译链接但输出内容与正确 输出不同。在运行这两个题目正确的C源程序得到正确的,开始进入测试。 6.2 运行界面 6.2.1 登录系统 用户可以选择三种角色登录C语言源码评判系统,包括学生、教师、和管理员所示 : 学生登录界面: 图6.1 学生登录界面 管理员登录界面: 北京邮电大学 29 图6.2 管理员登录界面 教师登录界面: 图6.3 教师登录界面 6.2.2 管理员窗口 管理员登录系统后,可以获取学生的考试成绩和提交时间: 北京邮电大学 30 图6.4 管理员登录系统可以获取学生的考试成绩和提交时间 同时,管理员也可以获取教师信息: 图6.5 管理员登录系统可以获取教师信息 并且,管理员还可以添加和删除教师和学生的身份信息,方面用户数量的扩展。 北京邮电大学 31 6.2.3 教师管理窗口 教师登录系统后,可以支持密钥修改: 图6.6 教师登录系统后,可以支持密钥修改 同时,教师能够获取所有学生考试信息: 北京邮电大学 32 图6.7 教师登录系统后,能够获取所有学生考试信息 6.2.4 学生考试窗口 学生登录C语言源码评判系统后,在界面上可以显示当前考生的相关信息和最终成 绩: 北京邮电大学 33 学生登录C语言源码评判系统后,在界面上可以显示当前考生的相关信息和最终成绩: 图6.8 学生登录后,在界面上可以显示当前考生的相关信息和最终成绩 6.3 系统测试 考生点击“开始考试”后,开始进入考试状态,并从两套试卷中随机选择一套(A 卷或B卷),显示选择题: 北京邮电大学 34 考生点击“开始考试”后,从两套试卷中随机选择一套(A卷或B卷),显示选择题: 图6.9 考生点击“开始考试”后,开始进入考试状态 题库中包含有编程题,考生能够从外部载入源文件,进行编译与运行,同时能够 与数据库中已存在的源文件进行比对,判断源文件是否抄袭: 北京邮电大学 35 图6.10 从外部载入源文件,判断源文件是否抄袭 如果编译错误或运行错误,界面上均会显示结果,告知考生: 图6.11 加载源文件 北京邮电大学 36 编译失败: 图6.12 编译失败 运行结果错误: 图6.13 运行结果错误 北京邮电大学 37 运行结果正确: 图6.14 运行结果正确 北京邮电大学 38 结论 本文对C语言考试中常见的题型做出了分析,本文重点放在编程题的解决上。本系 统在实现程序设计题自动评分功能时,进行了如下创新: 1.在程序中对考生程序进行编译。 2.在程序中运行考生程序并避免系统崩溃。 3.考生程序是否存在抄袭的检测。 在进行自动阅卷系统研究中,由于条件和能力的有限。程序运行的最终结果成为 我最主要的判断依据。但是,而程序内部的逻辑和程序复杂度也应该是我们进行自动 阅卷系统所要判断的。这也是一个十分有前途的研究领域,研究的结果有很强的实用 性和可推广性,同时也是一个十分有挑战性的工作。 通过对C语言源程序自动打分系统现状及其开发技术了解,考虑其技术可行性、使 用可行性、经济可行性,及对系统的开发按软件工程的标准进行系统分析、详细设计 、系统实现,经过一系列的开发,能够满足C语言自动打分系统的要求,实现基本的功 能。 本次所做的毕业设计虽然完成了。但由于自己的水平有限,在写论文的过程中遇 到了许多的问题,例如,以何种形式完成对C语言源程序的自动打分功能,我们尝试了 很多的方法,但还是不能解决问题。最后还是在老师的提点下我们才找到突破口。同 时系统功能还需要进一步的完善。在后续的工作学习中,希望自己能够有所突破,改 善自己的不足,让自己更加的完善。通过对C语言源程序自动打分系统现状及其开发技 术了解,考虑其技术可行性、使用可行性、经济可行性,及对系统的开发按软件工程 的标准进行系统分析、详细设计、系统实现,经过一系列的开发,能够满足C语言自动 打分系统的要求,实现基本的功能。 学习是一个不断积累的过程,而且学习的时间越长积累的东西越多,这就需要我 们将自己的知识构建一个自己的知识体系。在一个大的知识体系的指导下对知识进行 学习、进行扩展,不断的完善自己的知识库,这些不是一朝一夕可以完成的,但这需 要我一朝一夕的积累。这次的毕业设计也给了我一个教训,书到用时方恨少,平时不 太注意积累到现在需要的时候就会发现有些东西真的是悄悄的从眼前溜走的,而且要 在学习过程中将知识学透,不然似是而非的学习将会导致以后的工作中不断的出现失 误,那样造成的结果不是我们现在可以体会的了的。 经过毕业设计遇到许多不懂的问题是正常的,而这时候的我们不应选择退却,而 应迎难而上,自己查阅书籍,询问老师,同学讨论,网上查阅,等等手段都可用来解 决,而这些解决的问题就将成为我们的财富,我们必可受益一生。我们作为即将离开 学校踏上社会的人,一定要具备这样的精神,方能在社会中立足,方能展望未来。 北京邮电大学 39 参考文献 1.钱海祎. 程序自动批改系统的设计与实现. 电子科技大学, 2006:2226 2.林宁. C语言编程题自动判分系统的设计与实现. 华章, 2011.3439 3.于淑香. C语言程序设计题自动评分系统的设计与实现. 沙洲职业工学院学报, 2008.4551 4.王兰. 应用于C语言无纸化考试的自动阅卷系统的研究.吉林大学,2007:6777 5.余梓唐. C语言源程序的自动评判系统. 计算机时代, 2010.5660 6.巨同升. C语言程序自动阅卷系统的改进.山东理工大学学报(自然科学版),2010:3747 7.张冰. 自动阅卷系统的研究.西华大学,2008:5562 8.Stephens Derek.Use of computer assisted assessment. Benefits to students and staff. Education for Information, 2001:4756 9.Gretes, John A,Green Michael.Improving Undergraduate Learning with Computer-Assisted Assessment. Journal of Research on Computing in Education, 2000:92103 10.ZHU Ying-hui,JIANG Yu-zhen.Analysis and Research of the Policies about Auto Scoring in Computer. Computer Knowledge and Technology, 2005:67 78 北京邮电大学 40 致 谢 作者在设计(论文)期间都是在亢海波教授全面、具体指导下完成进行的。亢海 波老师渊博的学识、敏锐的思维、民主而严谨的作风使学生受益非浅,并终生难忘。 感谢闫宏印副教授等在毕业设计工作中给予的帮助。 感谢我的学友和朋友对我的关心和帮助。 北京邮电大学 41 外文原文 The C Programming Language Preface The computing world has undergone a revolution since the publication of The C Programming Language in 1978. Big computers are much bigger, and personal computers have capabilities that rival mainframes of a decade ago. During this time, C has changed too, although only modestly, and it has spread far beyond its origins as the language of the UNIX operating system. The growing popularity of C, the changes in the language over the years, and the creation of compilers by groups not involved in its design, combined to demonstrate a need for a more precise and more contemporary definition of the language than the first edition of this book provided. In 1983, the American National Standards Institute (ANSI) established a committee whose goal was to produce an unambiguous and machine-independent definition of the language C, while still retaining its spirit. The result is the ANSI standard for C. The standard formalizes constructions that were hinted but not described in the first edition, particularly structure assignment and enumerations. It provides a new form of function declaration that permits cross-checking of definition with use. It specifies a standard library, with an extensive set of functions for performing input and output, memory management, string manipulation, and similar tasks. It makes precise the behavior of features that were not spelled out in the original definition, and at the same time states explicitly which aspects of the language remain machine-dependent. This Second Edition of The C Programming Language describes C as defined by the ANSI standard. Although we have noted the places where the language has evolved, we have chosen to write exclusively in the new form. For the most part, this makes no significant difference; the most visible change is the new form of function declaration and definition. Modern compilers already support most features of the standard. We have tried to retain the brevity of the first edition. C is not a big language, and it is not well served by a big book. We have improved the exposition of critical features, such as pointers, that are central to C programming. We have refined the original examples, and have added new examples in several chapters. For instance, the treatment of complicated declarations is augmented by programs that convert declarations into words and vice versa. As before, all examples have been tested directly from the text, which is in machine-readable form. 北京邮电大学 42 Appendix A, the reference manual, is not the standard, but our attempt to convey the essentials of the standard in a smaller space. It is meant for easy comprehension by programmers, but not as a definition for compiler writers - that role properly belongs to the standard itself. Appendix B is a summary of the facilities of the standard library. It too is meant for reference by programmers, not implementers. Appendix C is a concise summary of the changes from the original version. As we said in the preface to the first edition, C wears well as ones experience with it grows. With a decade more experience, we still feel that way. We hope that this book will help you learn C and use it well. We are deeply indebted to friends who helped us to produce this

温馨提示

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

最新文档

评论

0/150

提交评论