专业课程设计报告内容撰写参考模板.doc_第1页
专业课程设计报告内容撰写参考模板.doc_第2页
专业课程设计报告内容撰写参考模板.doc_第3页
专业课程设计报告内容撰写参考模板.doc_第4页
专业课程设计报告内容撰写参考模板.doc_第5页
已阅读5页,还剩26页未读 继续免费阅读

下载本文档

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

文档简介

教师对学生的项目评分进程的同步与互斥一、 课题内容和要求1、课题内容:在一个班上有S个学生。每个学生都要做一个项目,每一个项目由K个老师一起评分。总共有M个老师。每个老师最多给N个项目评分。其中,S*KD。每一个学生的项目由K个老师共同来检查。在T分钟的时间段内,学生可以在任何时间进入教室(random),除了在最后的D分钟内。所有的老师一直保持工作状态直到他检查完N个项目或者是T分钟过去后。T分钟过去后,所有的老师和同学都必须离开教室。另外,在T分钟结束前的D分钟内(即在最后的D分钟内),如果有任何老师或者是学生都处在没有任务的状态下,都必须离开教室,因为已经没有时间让他完成任务了(因为一个项目检查的时间是整整D分钟)。当一个学生进入教室后,他立即开始找K个没有任务的老师(一次找一个老师,假如没有空闲的老师,则等到有老师为止),找齐K个老师之后给老师检查,然后离开教室。刚开始每一个老师都是处于空闲状态直到他被学生找到,被学生找到后只能等待,直到学生找齐K个老师(在等待学生找其他老师的时间里,他是不能接受其他同学检查作业的请求的),当学生找齐K个老师后,老师们执行完检查任务,然后重新变成空闲状态。每个老师在总共检查了N个学生的作业后,离开教室。2、基本要求:用一个程序来模拟上面描述的作业检查过程。每一个学生和每一个老师应该用不同的线程来完成。可以选用C、C+和Java作为开发语言,但是考虑到专业课程设计I的实验大纲,请尽可能使用Java语言。3、提高要求:(1) 考虑到跨平台的特性,请尽量使用posix线程标准(采用该标准有额外的加分);(2) 实现良好的图形用户界面;(3) 在程序演示过程中能清晰的展示多个学生线程和多个老师线程的同步和互斥流程。二、需求和思路分析1、Java线程由于Java具有平台无关性(“Write once,run anywhere”)和内置对多线程的支持(java.lang包中的Thread类),所以本次课程设计考虑采用Java语言编写线程,下面简单介绍一下可能用到的一些方法。(1)start()线程调用该方法将启动线程,使之从新建状态进入就绪队列排队,一旦轮到它来享用CPU资源时,就可以脱离创建它的主线程开始自己的生命周期了。(2)run()Thread类的run()方法与Runnable接口中的run()方法的功能和作用相同,都用来定义线程对象被调度之后所执行的操作,都是系统自动调用而用户程序不得引用的方法。调用start()方法(从父类继承的方法)通知JVM,等待JVM将CPU使用权切换给该线程。当JVM将CPU使用权切换给线程时,如果线程是Thread的子类创建的,该类中的run()方法没有具体内容,程序要在Thread类的子类中重写run()方法来覆盖父类的run()方法,run()方法规定了该线程的具体使命。当run()方法执行完毕,线程就变成死亡状态。在线程没有结束run()方法之前,不要再调用start()方法,否则将发生IllegalThreadStateException异常。(3)sleep(int millsecond)线程使用CPU资源期间,执行了sleep(int millsecond)方法,使当前线程进入休眠状态。sleep(int millsecond)方法是Thread类中的一个类方法,线程一旦执行了sleep(int millsecond)方法,就立刻让出CPU的使用权,使当前线程处于中断状态。经过参数millsecond指定的毫秒数之后,该线程就重新进到线程队列中排队等待CPU资源,以便从中断处继续执行。如果线程在休眠时被打断,JVM就抛出InterruptedException异常。因此必须在try-catch语句块中调用sleep(int millsecond)方法。(4)currentThread()currentThread()方法是Thread类中的类方法,可以用类名调用,该方法返回当前正在使用CPU资源的线程。(5)线程的同步当使用多个线程来访问同一个数据时,非常容易出现线程安全问题(比如多个线程都在操作同一数据导致数据不一致),所以我们用同步机制来解决这些问题。实现同步机制有两个方法:a)同步代码块:synchronized(同一个数据)同一个数据:就是N条线程同时访问一个数据。b)同步方法:public synchronized 数据返回类型 方法名()使用 synchronized 来修饰某个方法,则该方法称为同步方法。对于同步方法而言,无需显示指定同步监视器,同步方法的同步监视器是 this 也就是调用该同步方法的对象的本身当使用synchronized 来修饰某个共享资源时(分同步代码块和同步方法两种情况),当某个线程获得共享资源的锁后就可以执行相应的代码段,直到该线程运行完该代码段后才释放对该共享资源的锁,让其他线程有机会执行对该共享资源的修改。当某个线程占有某个共享资源的锁时,如果另外一个线程也想获得这把锁运行就需要使用wait() 和notify()/notifyAll()方法来进行线程通讯了(6)wait()、notify()、notifyAll()wait()、notify()、notifyAll()都是Object类中的final方法,被所有的类继承,且不允许重写。wait()方法导致当前线程等待,直到其他线程调用同步监视器的notify()方法或notifyAll()方法来唤醒该线程。notify()方法唤醒在同步监视器上等待的单个线程,如果所有线程都在同步监视器上等待,则会选择唤醒其中一个线程,选择是任意性的,只有当前线程放弃对该同步监视器的锁定后,也就是使用wait方法后,才可以执行被唤醒的线程。notifyAll()方法唤醒在同步监视器上等待的所有的线程。只用当前线程放弃对该同步监视器的锁定后,才可以执行被唤醒的线程。(7)创建线程有两种方法,一是创建Thread子类以继承Thread类,但Java不支持多继承,灵活性不够好。二是用Thread类直接创建线程对象,使用构造方法Thread(Runnable target)实现Runnable接口对于使用同一目标对象的线程,目标对象的成员变量就是这些线程共享的数据单元;另外,创建目标对象类在必要时还可以是某个特定类的子类。正因此,使用Runnable接口比使用Thread的子类更具有灵活性。所以,本次课程设计考虑采用实现Runnable接口的方法来创建老师和学生线程。2、主线程模块产生学生进入的随机时间;全部老师进入教室;学生进入教室;等待;时间T到达,退出程序;3、学生线程模块学生线程执行下面的步骤:选择一个进入的时间(random()%T) ;进入教室;选择K个空闲的老师,若找不齐,则等待;找齐后,做D分钟的检查;检查完毕离开教室。4、老师线程模块老师线程执行下面的步骤:在教室中空闲;直到被一个学生选择后等待(所有K个老师聚集);等待结束项目检查开始;做D分钟的项目检查,返回(1);N次检查完毕或者T分钟时间到,离开教室。5、注意事项:在剩余时间小于D时,一个已创建的学生线程只能执行第(5)步,不能再创建新的学生线程;在剩余时间小于D时,一个老师进程只能在执行(3)(4)步或者直接执行第(5)步;对于所有合理的S, M, K, N, T, D数值(这些数必须都是正整数并且满足条件:S*KD),程序都能够运行成功;程序对所有的时间安排策略都必须运行成功。例如不管线程的相对速度,例如要把握好sleep的毫秒数;在每一个线程的生命周期内,每一步都要有一个合理的说明信息,来表明这个线程中包括哪个老师,哪个学生,进行到什么程度了;要特别注意防范死锁问题的发生。三、概要设计仔细分析课题,可以分为以下几个模块实现:1、主线程通过人机对话获得所需要的学生人数S,老师人数M,学生需要接受检查的老师数K,老师最多检查学生数N,总时间 T,学生接受检查所需时间D。调用随机函数产生学生线程产生的时间,接着创建ProjectCheck类实现Runnable接口产生老师线程,等老师线程全部产生,一旦学生线程产生时间一到立即产生学生线程,等待时间T到,结束所有未结束的学生和老师线程,退出程序。2、ProjectCheck类(1)成员变量:int S, M, K, N, T, D; /学生人数S,老师人数M,学生需要接受检查的老师数K,老师最多检查学生数N,总时间 T,学生接受检查所需时间Dint countCurrentTeacher;/当前处于空闲状态的老师数目static long timeStart;/程序开始时间boolean teacherBusy;/老师当前忙闲状态int teacherCountOfCheckedProject;/当前已经检查过的项目数目 Thread teacher; /老师线程Thread student; /学生线程final static int EMPTY = 0; /状态“空”,没人进入或离开教室final static int COMING = 1; /状态“进入”,有人正在进入教室final static int LEAVING = 2; /状态“离开”,有人正在离开教室int state; /教室当前状态(2)成员函数:public static int gettime();/获取相对于timeStart的当前时间,以ms为单位public ProjectCheck(int S, int M, int K, int N, int T, int D, long timeStart); /构造函数,初始化一些成员变量public void run(); /重写接口中的方法/保证同一时刻只有一人进入或者离开public synchronized void comeLock(); /有人进入“锁”public synchronized void leaveLock(); /有人离开“锁”public synchronized void comeUnlock(); /有人进入“解锁”public synchronized void leaveUnlock(); /有人离开“解锁”public void startCheck(int id); /在run()方法中调用此方法,针对不同的老师线程、学生线程开始检查(3)老师线程老师线程的流程图如下图所示。对老师进入上锁、解锁保证同一时刻只有一名老师进入,打印老师进入信息表明老师已进入教室,教室中处于空闲状态的老师人数加1。接着利用while循环判断结束时间T是否到达和老师检查次数是否到达N,两个条件都不满足则继续循环判断那两个条件,老师即处于等待状态,否则如果老师检查学生的次数到达N,说明老师已完成规定的检查任务,已经离开,如果时间T到达,说明所有线程都要结束,所以这两种情况都要跳出循环,准备离开。最后对老师离开上锁、解锁保证同一时刻只有一名老师离开,打印老师离开信息,教室中处于空闲状态的老师人数减1。老师线程结束。开始调用comeLock()方法上锁教室中空闲老师人数countCurrentTeacher加1打印老师进入信息调用comeUnlock()方法解锁判断时间T是否到达或N次检查已完成教室中空闲老师人数countCurrentTeacher减1打印老师离开信息调用leaveUnlock()方法解锁调用leaveLock()方法上锁结束YesNoYesYesNoNo(4)学生线程判断当前时刻是否大于T-D,若大于则说明剩余时间不够老师检查,学生立即离开即学生线程结束,否则对学生进入上锁、解锁保证同一时刻只有一名学生进入,打印学生进入信息表明学生已经进入教室。接着在寻找K个老师检查之前,先利用while循环判断目前教室中处于空闲状态的老师人数是否小于K,若小于表明目前该学生无法找到K个老师为他检查,则继续判断该条件,学生即处于等待状态,否则立即把教室中处于空闲状态的老师人数减去K,跳出循环,寻找K个老师检查。学生等待过程中,若剩余时间不足D,则学生立即离开即学生线程结束。寻找K个老师通过for循环K次,每次循环调用Random类的nextInt(M)方法寻找老师,利用while循环判断老师已检查次数是否到达N和老师是否正在检查别人即状态是否处于忙,两个条件只要有一个被满足,再调用Random类的nextInt(M)方法寻找老师,否则就立即修改老师的忙闲状态,保存老师序号。找齐K个老师后,开始检查,调用Thread类的类方法sleep()阻塞时间D。等检查完毕,利用K次for循环,将这K个老师的忙闲状态置闲,并把这些老师的检查次数加1,教室中处于空闲状态的老师人数加1。最后对学生离开上锁、解锁保证同一时刻只有一名学生离开,打印学生离开信息。学生线程结束。学生线程的流程图如下图所示。开始判断时间T-D是否到达调用comeLock()方法上锁打印学生进入信息调用comeUnlock()方法解锁判断空闲老师数countCurrentTeacher KcountCurrentTeacher=countCurrentTeacher-KiK调用Random类的nextInt方法随机找空闲老师判断该老师状态是否处于忙或将成学生次数已达N将老师忙闲状态置忙保存老师序号打印老师开始检查学生的信息i+调用Thread类方法sleep(),堵塞时间DiK取出老师序号将老师的忙闲状态置闲老师检查次数加1打印老师结束检查学生的信息countCurrentTeacher+i+调用leaveLock()上锁打印学生离开信息调用leaveUnlock()解锁结束打印学生离开信息YesYesNoNoNoYesYesYesYesNoYesNoNoNo四、详细设计源程序代码如下:创建名为projectCheck的工程文件,创建名为projectCheck.java和Main.java的类文件。projectCheck.java:package com.sand;import java.util.Scanner;import java.util.Random;import java.awt.*;import java.lang.InterruptedException;public class ProjectCheck implements Runnable int S, M, K, N, T, D; /学生人数S,老师人数M,学生需要接受检查的老师数K,老师最多检查学生数N,总时间 T,学生接受检查所需时间D int countCurrentTeacher;/当前处于空闲状态的老师数目 static long timeStart;/程序开始时间 boolean teacherBusy;/老师当前忙闲状态 int teacherCountOfCheckedProject;/当前已经检查过的项目数目 Thread teacher; /老师线程 Thread student; /学生线程 final static int EMPTY = 0; /状态“空”,没人进入或离开教室 final static int COMING = 1; /状态“进入”,有人正在进入教室 final static int LEAVING = 2; /状态“离开”,有人正在离开教室 int state; /教室当前状态 public ProjectCheck(int S, int M, int K, int N, int T, int D, long timeStart) /构造函数,初始化一些成员变量 this.S = S; this.M = M; this.K = K; this.N = N; this.T = T; this.D = D; this.timeStart = timeStart; state = EMPTY; countCurrentTeacher = 0; /初始化当前处于空闲状态的老师数目为0 int i; teacherBusy = new booleanM; for (i = 0; i M; i+) teacherBusyi = false; /初始化老师的忙闲状态为空闲 teacherCountOfCheckedProject = new intM; for (i = 0; i M; i+) teacherCountOfCheckedProjecti = 0; /初始化老师的检查次数为0 teacher = new ThreadM; /创建线程名为teacheri的老师线程 for (i = 0; i M; i+) teacheri = new Thread(this,teacher + i); student = new ThreadS; /创建线程名为studenti的学生线程 for (i = 0; i S; i+) studenti = new Thread(this,student + i); public static int gettime() /获取相对于timeStart的当前时间,以ms为单位 long timeCurrent; int duration; timeCurrent = System.currentTimeMillis(); duration = (int)(timeCurrent - timeStart); return duration; public void run() /重写接口中的方法 int i; int max; while(true) for (i = 0; i M; i+) if (Thread.currentThread().getName().equals(teacher + i) startCheck(i); return ; for (i = 0; i S; i+) if (Thread.currentThread().getName().equals(student + i) startCheck(i); return ; /保证同一时刻只有一人进入或者离开 public synchronized void comeLock() /有人进入“锁” if(state = EMPTY) state = COMING; else if(state = COMING) else if(state = LEAVING) try wait(); catch(InterruptedException e) state = COMING; public synchronized void leaveLock() /有人离开“锁” if(state = EMPTY) state = LEAVING; else if(state = LEAVING) else if(state = COMING) try wait(); catch(InterruptedException e) state = LEAVING; public synchronized void comeUnlock() /有人进入“解锁” state = EMPTY; notify(); public synchronized void leaveUnlock() /有人离开“解锁” state = EMPTY; notify(); public void startCheck(int id) /针对不同的老师线程、学生线程开始检查 if (Thread.currentThread().getName().equals(teacher + id)/老师线程所要完成的操作 comeLock(); /使同一时刻只有一人进入或离开教室 countCurrentTeacher+; /教室中空闲老师人数加1 System.out.println(gettime() + ms:+Thread.currentThread().getName() + enters classroom); /打印老师进入信息 comeUnlock(); /判断当前时间是否小于T并且老师检查次数是否小于N,若两者都满足,则继续等待,否则跳出循环。 while (teacherCountOfCheckedProjectid N & (int)(gettime() T - D) /剩余时间是否小于D leaveLock(); /是,则学生离开 System.out.println(gettime() + ms:+ Thread.currentThread().getName() + does not need to enter classroom (time is not enough);/打印学生离开信息,时间不够 leaveUnlock(); return ; /结束学生线程 else comeLock(); /不是,学生进入教室 System.out.println(gettime() + ms:+ Thread.currentThread().getName() + enters classroom);/打印学生进入信息 comeUnlock(); synchronized(this) while (countCurrentTeacher T - D) /等待过程中,若剩余时间小于D,则结束等待,退出教室 comeLock(); System.out.println(gettime() + ms:+ Thread.currentThread().getName() + exits classroom (time is not enough); comeUnlock(); return ; /目前教室中能找齐K个空闲的老师,立即将处于空闲状态的老师人数减去K,防止死锁 countCurrentTeacher = countCurrentTeacher - K; int studentCheckingQueue;/记录检查id号学生的老师号 studentCheckingQueue = new intK; int studentIndexOfNextTeacher;/记录待查找老师坐标 studentIndexOfNextTeacher = 0; Random random=new Random(); for (int i = 0; i = N表明老师已完成任务,已离开,teacherBusystudentIndexOfNextTeacher表明老师正在忙,为别人检查,继续寻找 while ( teacherBusystudentIndexOfNextTeacher | teacherCountOfCheckedProjectstudentIndexOfNextTeacher = N) studentIndexOfNextTeacher = random.nextInt(M); teacherBusystudentIndexOfNextTeacher = true; /找到老师,修改其忙闲状态 studentCheckingQueuei = studentIndexOfNextTeacher;/保存老师序号 System.out.println(gettime()+ms:teacher+studentIndexOfNextTeacher+ grabbed by student+id+ (job+teacherCountOfCheckedProjectstudentIndexOfNextTeacher+); System.out.println(gettime() + ms:+ Thread.currentThread().getName() + starts check); try /检查学生 Thread.sleep(D); catch (InterruptedException e) for (int i = 0; i K; i+) /检查完毕,释放老师 /以下两句执行顺序问题,若先+可能出现老师还没打印输出finished with student的消息,而已经grabbed by student System.out.println(gettime() + ms:teacher + studentCheckingQueuei + finished with student + id + (job + teacherCountOfCheckedProjectstudentCheckingQueuei +); teacherBusystudentCheckingQueuei = false; /将老师忙闲状态置闲 teacherCountOfCheckedProjectstudentCheckingQueuei +; /老师检查次数加1 countCurrentTeacher +; /教室中处于空闲状态的老师人数加1 leaveLock(); /学生离开教室System.out.println(gettime() + ms:+ Thread.currentThread().getName() + ends check); System.out.println(gettime() + ms:+ Thread.currentThread().getName() + exits classroom (finished); leaveUnlock(); Main.java:package com.sand;import java.util.Random;import java.util.Scanner;import java.lang.Thread;public class Main public static void main(String args) Scanner scan = new Scanner(System.in); /获取S、M、K、N、T、D的值 int S,M,K,N,T,D; System.out.println(please input students number (S):); S=scan.nextInt(); System.out.println(please input teachers number (M):); M=scan.nextInt(); System.out.println(please input required teachers number by every student(K):); K=scan.nextInt(); System.out.println(please input checked projects number at most (N):); N=scan.nextInt(); System.out.println(please input total time (T):); T=scan.nextInt(); System.out.println(please input checked time (D):); D=scan.nextInt(); System.out.println(S=+S+,M=+M+,K=+K+,N=+N+,T=+T+ms,D=+D+ms); Random random=new Random(); int enterTime=new intS; /enterTime数组保存学生进入的随机时间 System.out.println(students enter time:); for(int i=0;iS;i+) enterTimei = random.nextInt(T - D);/产生随机进入的时间,保存于enterTime数组中 System.out.print(enterTimei+ms ); System.out.println(); int p; for(int i=0;iS;i+) /将时间从小到大排列,以便学生依次进入 for(int j=i+1;jS;j+) if(enterTimejenterTimei)p=enterTimej;enterTimej=enterTimei;enterTimei=p; long timeStart; timeStart=System.currentTimeMillis(); ProjectCheck projectCheck; projectCheck=new ProjectCheck(S,M,K,N,T,D,timeStart); for(int i=0;iM;i+) /启动老师线程 projectCheck.teacheri.start(); for(int i=0;iS;i+) /根据enterTime数组依次启动所有学生线程 while(projectCheck.gettime()enterTimei); projectCheck.studenti.start(); while(projectCheck.gettime()=T); /等待时间T到达 五、测试数据及其结果分析在NetBeans 6.9.1中打开工程文件,生成主项目,运行主项目。根据提示输入学生人数S,老师人数M,学生需要接受检查的老师数K,老师最多检查学生数N,总时间 T,学生接受检查所需时间D。具体运行情况如下图所示:5ms开始,3个老师陆续进入教室:747ms,学生0进入教室,找到老师0、1,开始检查:1165ms,老师0、1检查完学生0,学生0离开教室:1385ms,学生1进入教室,找到老师0、2,开始检查:8350ms,学生2进入教室,找不齐2个空闲的老师,故等待:1799ms,老师0、2检查完学生1:1830ms,学生2找到老师0、2,开始检查:1839ms,学生1离开教室:1987ms,学生3进入教室,找不齐2个空闲的老师,故等待:2257ms,老师0、2检查完学生2:2281ms,学生3找到老师0、1,开始检查:2298ms,学生2离开教室:2573ms,学生4进入教室,找不齐2个空闲的老师,故等待: 2601ms,因为剩余时间不够检查,故学生4离开教室:2709ms,老师0、1检查完学生3:2709ms,老师0因为检查次数已满,离开教室:2710ms,学生3离开教室:3000ms,总时间到达,老师1、2离开教室:六、调试过程中的问题1、在主函数的调试中发现随机产生学生线程的时间有点问题,由于学生线程是依次产生的,如果学生线程开始的随机时间小于当前时刻,那么会导致学生线程根本没有开始,以致于把后面的学生线程都堵塞了。所以在这里通过对产生的随机时间从小到大排列,这样就可以避免这种问题。2、老师进入教室存在同步问题。如果两个老师同时进入教室,那么教室中空闲得老师人数会同时加1而不是加2,这样就有可能发生同步问题。经过仔细分析,可以通过synchronized关键字来定义同步方法,并使用wait()、notify()方法定义进入锁和离开锁来解决同步问题。调用自定义的comeLock()方法对老师进入教室上锁,一旦上锁,别的老师就不可能进入教室,而是处于等待中,直至调用自定义的comeUnlock()方法解锁方能进入,这样就解决了老师与老师之间的同步问题。3、在学生线程中最大的问题是死锁的发生。如果两个学生先后进入教室,分别取寻找K个老师,而此时教室中空闲的老师已不足2*K,两人都无法满足,相互占有对方所需要的资源而陷入僵局,这样就会有可能产生死锁。经过思考,可以通过循环判断目前教室中空闲的老师人数是否小于K,若小于,说明学生进入教室后无法找齐K个老师,则继续判断这个条件,直至目前教室中空闲的老师人数大于等于K,则说明学生进入教室后能找齐K个老师,立即将目前教室中空闲的老师人数减去K,相当于提前占用K个老师,这样下一个进来的学生就会根据前一个学生已经占用了K个老师的情况进行判断,这样就有效的防止了死锁的发生。4、刚开始时,我是把存储检查某学生的M个老师序号的studentCheckingQueue数组声明为projectCheck.java中的共享变量,结果在运行时某些情况下会发生错误。例如在student0找到teacher0、teacher1检查项目期间,又发生student1找到teacher2、teacher3检查项目,那么studentCheckingQueue数组最初存储的0,1就会被后来的2,3覆盖,从而导致错误。所以要在student线程中声明studentCheckingQueue数组变量,以便每一个student线程都有自己的一段空间存储老师序号。七、专业课程设计总结初学Java语言时,只是简单的了解了它的一些基本概念,例如类与对象、继承与多态、平台无关性

温馨提示

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

评论

0/150

提交评论