《C++面向?qū)ο蟪绦蛟O(shè)計導(dǎo)論》-從抽象到編程 課件 05 設(shè)計與實現(xiàn)_第1頁
《C++面向?qū)ο蟪绦蛟O(shè)計導(dǎo)論》-從抽象到編程 課件 05 設(shè)計與實現(xiàn)_第2頁
《C++面向?qū)ο蟪绦蛟O(shè)計導(dǎo)論》-從抽象到編程 課件 05 設(shè)計與實現(xiàn)_第3頁
《C++面向?qū)ο蟪绦蛟O(shè)計導(dǎo)論》-從抽象到編程 課件 05 設(shè)計與實現(xiàn)_第4頁
《C++面向?qū)ο蟪绦蛟O(shè)計導(dǎo)論》-從抽象到編程 課件 05 設(shè)計與實現(xiàn)_第5頁
已閱讀5頁,還剩44頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

Josephus游戲設(shè)計《C++面向?qū)ο蟪绦蛟O(shè)計導(dǎo)論》--從抽象到編程第5章設(shè)計與實現(xiàn)5.1.1分析設(shè)計5.1Josephus游戲5.1.2編碼實現(xiàn)5.1.3程序維護本節(jié)學(xué)習(xí)目標(biāo)能夠從具體應(yīng)用場景中識別事物及其關(guān)系并抽象出類和關(guān)聯(lián)(靜態(tài))能夠從具體應(yīng)用場景中識別事物的行為并抽象出類的方法(動態(tài))能夠使用對象圖、類圖、時序圖等工具建立軟件模型能夠運用前面4章所學(xué)的知識解釋分析設(shè)計的步驟和方法

Josephus游戲:一群小孩圍成一圈,任意假定一個數(shù)m,從第一個小孩起,順時針方向數(shù)數(shù),每數(shù)到第m個小孩時,該小孩便離開。小孩不斷離開,圈子不斷縮小。最后剩下一個小孩便是勝利者。Josephus游戲介紹5.1.1分析設(shè)計步驟1.發(fā)現(xiàn)對象及其連接2.合并對象并劃分職責(zé)3.抽象類及關(guān)聯(lián)4.發(fā)現(xiàn)類的屬性5.發(fā)現(xiàn)類的方法從具體到抽象:應(yīng)用場景開始1.發(fā)現(xiàn)對象及其連接選擇典型游戲場景描述典型游戲場景標(biāo)識游戲場景中的事物及其關(guān)系圖5.1典型游戲場景中的事物及其關(guān)系2.合并對象并劃分職責(zé)將對象“小孩數(shù)”和“間隔數(shù)”組合到對象“游戲”將“獲勝者”聚合到對象“游戲”將對象“圓圈”聚合到“游戲”每個小孩負責(zé)管理自己,承擔(dān)加入、離開等職責(zé)賦予“游戲”管理“小孩數(shù)”和“間隔數(shù)”“獲勝者”“圓圈”的職責(zé)圖5.2對象之間的組合聚合連接3.抽象類及關(guān)聯(lián)圖5.3標(biāo)注類別的對象及連接圖5.4Josephus游戲中的類及其關(guān)聯(lián)“小孩”、“游戲”和“圓圈”三類別,視為三個類“Boy”、“Jose”和“Ring”圖5.4Josephus游戲中的類及其關(guān)聯(lián)圖5.5類中增加的屬性第一步,將numOfBoys和m作為類Jose的屬性。第二步,將關(guān)聯(lián)對端的名稱作為屬性名,用于表示類之間的關(guān)聯(lián)。第三步,增加與場景有關(guān)的屬性。4.發(fā)現(xiàn)類的屬性圖5.6對象的職責(zé)與協(xié)作圖5.7類的屬性和成員函數(shù)根據(jù)Message(信息)設(shè)計成員函數(shù)5.發(fā)現(xiàn)類的方法練習(xí)1.發(fā)現(xiàn)對象及其連接2.合并對象并劃分職責(zé)3.抽象類及關(guān)聯(lián)4.發(fā)現(xiàn)類的屬性5.發(fā)現(xiàn)類的方法在PowerDesigner15.3中重做上述分析設(shè)計過程總結(jié)及進一步學(xué)習(xí)思維:從具體到抽象(概念思維)分析設(shè)計:分析應(yīng)用場景中的事物及其變遷,設(shè)計軟件模型工具:對象圖、類圖、時序圖5.1.2編碼實現(xiàn)進一步學(xué)習(xí)第5章設(shè)計與實現(xiàn)5.1.1分析設(shè)計5.1Josephus游戲5.1.2編碼實現(xiàn)5.1.3程序維護學(xué)習(xí)目標(biāo)能夠針對所設(shè)計的軟件模型(PIM)選用恰當(dāng)?shù)膶崿F(xiàn)技術(shù)建立軟件的實現(xiàn)模型(平臺相關(guān)模型,PSM)能夠根據(jù)需求變化調(diào)整軟件的模型并體會易維護性能夠在VS2013中編程實現(xiàn)軟件的實現(xiàn)模型5.1.2編碼實現(xiàn)編碼實現(xiàn)1.選擇實現(xiàn)技術(shù)2.編程實現(xiàn)類Boy3.編程實現(xiàn)類Ring4.編程實現(xiàn)類Jose5.編寫main()函數(shù)圖5.9具有C++語言和鏈表特性的類圖1.選擇實現(xiàn)技術(shù)主要問題:如何編程實現(xiàn)關(guān)聯(lián)?回到玩游戲的典型場景在鏈表上繼續(xù)玩游戲圖5.8典型場景中的對象及連接圖5.9具有C++語言和鏈表特性的類圖圖5.7類的屬性及成員函數(shù)2.編程實現(xiàn)類Boy圖5.9具有C++語言和鏈表特性的類圖圖5.10與類Boy相關(guān)的交互過程編程實現(xiàn)類Boy續(xù)class

Boy{public:Boy(Boy*pPosition,intid);voidleave(Boy*pPosition);voidprint();Boy*next();protected:int

code;Boy*pNext;};#include

"Boy.h"#include

<iostream>using

namespacestd;Boy::Boy(Boy*pPosition,intid){code=id;if(!pPosition){this->pNext=this;//只有一個小孩時,自己指向自己}else{this->pNext

=pPosition->pNext;//當(dāng)前小孩指向第一個小孩pPosition->pNext=this;//插入到小孩*pPosition的后面

//與上一條不能交換}}插入第1個小孩后的情況插入第2個小孩后的情況pFirst=pCurrent=new

Boy(nullptr,1);Boy*pB=pFirst;for(inti=2;i<=n;i++){pB=new

Boy(pB,i);}pPositionNULLpNextthispNextpNextpFirstpCurrentvoidBoy::leave(Boy*pPosition){

pPosition->pNext=this->pNext;cout<<"離開:"

<<code<<endl;}voidBoy::print(){cout<<"Id:"<<code;}Boy*Boy::next(){return

pNext;}thispPosition一個小孩離開(以4個小孩為例演示)3.編程實現(xiàn)類Ring圖5.9具有C++語言和鏈表特性的類圖圖5.13與類Ring相關(guān)的交互過程#include

"Ring.h"Ring::Ring(intn){pFirst=pCurrent=new

Boy(nullptr,1);Boy*pB=pFirst;for(inti=2;i<=n;i++){pB=new

Boy(pB,i);}}#include

"Boy.h"class

Ring{public:Ring();Ring(intn);~Ring();Boy

getWinner(intm);private:voidcountUpTo(intm);Boy*pFirst;Boy*pCurrent;};Boy

Ring::getWinner(intm){//數(shù)小孩while

(pCurrent!=pCurrent->next()){ countUpTo(m);//往下數(shù)m個小孩,數(shù)到的小孩離開}//返回獲勝者Boywin(*pCurrent);

//另外創(chuàng)建(復(fù)制)一個Boy對象delete

pCurrent;returnwin;}voidRing::countUpTo(intm){//往下數(shù)m個小孩Boy*pLast;for(inti=m;i>1;i--){pLast=pCurrent;pCurrent=pCurrent->next();}//數(shù)到的小孩離開

pCurrent->leave(pLast);//當(dāng)前從圓圈中離開,pLast指向前面的小孩

deletepCurrent;//刪除當(dāng)前小孩pCurrent=pLast->next();//當(dāng)前小孩是上一個小孩的下一個}Ring::~Ring(){}編程實現(xiàn)類Ring續(xù)pCurrentpLast一個小孩離開(以4個小孩為例演示)4.編程實現(xiàn)類Jose#include

"Ring.h"class

Jose{public:Jose(intboys,intinterval);~Jose();Boy

gameBegin();private:int

numOfBoys;int

m;Ring*ring;Boy*win;};#include

"Jose.h"Jose::Jose(intboys,intinterval){numOfBoys=boys;m=interval;ring=new

Ring(boys);win=nullptr;}Jose::~Jose(){delete

ring;delete

win;}Boy

Jose::gameBegin(){if(!win)win=new

Boy(ring->getWinner(m));return*win;}5.編寫main()函數(shù)#include

"Jose.h"#include

<iostream>using

namespacestd;intmain(){Josejs1(7,3);js1.gameBegin().print();intm,n;cout<<endl<<"請輸出小孩數(shù)和間隔數(shù)......"

<<endl;cin>>n>>m;Josejs2(n,m);js2.gameBegin().print();cout<<endl<<"現(xiàn)在宣布"

<<endl<<"第一場獲勝者是:"

<<endl;js1.gameBegin().print();cout<<endl<<"第二場獲勝者是:"

<<endl;js2.gameBegin().print();}離開:3離開:6離開:2離開:7離開:5離開:1Id:4請輸出小孩數(shù)和間隔數(shù)......104離開:4離開:8離開:2離開:7離開:3離開:10離開:9離開:1離開:6Id:5現(xiàn)在宣布第一場獲勝者是:Id:4第二場獲勝者是:Id:55.1.3程序維護增加類Person,增加類Boy到類Person的關(guān)系Boy(Boy*pPosition,intid,Person*ps);Ring(intn,Person*ps[]);Jose(intboys,intinterval,Person*ps[]);圖5.14增加繼承關(guān)系后的類圖圖5.15增加小孩信息后的對象職責(zé)及其協(xié)作Boy::Boy(Boy*pPosition,intid,Personps):Person(ps){ code=id;

if(!pPosition){

this->pNext=this; //只有一個小孩時,自己指向自己 }

else{

this->pNext=pPosition->pNext; pPosition->pNext=this; }}Ring::Ring(intn,Person*ps[]){ pFirst=pCurrent=newBoy(NULL,1,*ps[1]); Boy*pB=pFirst;

for(inti=2;i<=n;i++){ pB=newBoy(pB,i,*ps[i]); }}Jose::Jose(intboys,intinterval,Person*ps[]){ numOfBoys=boys; m=interval; ring=newRing(boys,*ps); win=NULL;}voidBoy::print(){ cout<<"Id:"<<code; Person::print();}修改實現(xiàn)代碼練習(xí)VS2013上編輯調(diào)試【例5.1-5.5】中的代碼1.選擇實現(xiàn)技術(shù)2.編程實現(xiàn)類Boy3.編程實現(xiàn)類Ring4.編程實現(xiàn)類Jose5.編寫main()函數(shù)6.增加類Person并修改代碼總結(jié)及進一步學(xué)習(xí)設(shè)計:選用編程實現(xiàn)技術(shù)細化軟件模型編碼:按照軟件模型聲明類,編碼實現(xiàn)類的成員函數(shù)維護:調(diào)整軟件模型,修改程序代碼5.2矩陣計算進一步學(xué)習(xí)5.2.1矩陣和向量的乘法5.2矩陣計算5.2.2使用友元提高運行速度第5章設(shè)計與實現(xiàn)學(xué)習(xí)目標(biāo)能夠識別數(shù)學(xué)模型中的關(guān)鍵因素(矩陣及運算),設(shè)計出軟件模型能夠選用適當(dāng)?shù)木幊碳夹g(shù)實現(xiàn)軟件模型能夠使用友元提高代碼的運行效率5.2.1矩陣和向量的乘法存儲計算

Amn×Vn=(bi)m

圖5.16矩陣和向量相乘【例5.6】矩陣與向量的乘法//Vector.hclass

Vector{public:

int&Elem(inti); Vector(intn); Vector(const

Vector&oldVector); ~Vector();

voidprint(void);

intgetN(void);private:

intn;

int*v;};//Vector.cpp#include

"Vector.h"#include

<iostream>using

namespacestd;

int&Vector::Elem(int

i){

if(i<n)

returnv[i];

else cout<<"超標(biāo)越界??!";}Vector::Vector(int

n){

Vector::n=n; v=new

int[n];}Vector::~Vector(){

deletev;}void

Vector::print(){ cout<<v[0];

for(inti=1;i<n;i++) cout<<"\t"<<v[i];}int

Vector::getN(){

returnn;}Vector::Vector(const

Vector&oldVector){ n=oldVector.n; v=new

int[n];

for(inti=0;i<n;i++){ v[i]=oldVector.v[i]; }}Matrix代碼//Matrix.hclass

Matrix{public:

int&Elem(inti,intj); Matrix(intm,intn); Matrix(const

Matrix&oldMatrix); ~Matrix();

voidprint();

intgetM();

intgetN();private:

intm;

intn;

int*Mat;};

//Matrix.cpp#include

"Matrix.h"#include

<iostream>using

namespacestd;

int&Matrix::Elem(int

i,int

j){

if(i<m&&j<n)

returnMat[i*n+j];//計算第i行第j列元素的位置

else cout<<"超標(biāo)越界??!";}Matrix::Matrix(int

m,int

n){

Matrix::m=m;

Matrix::n=n; Mat=new

int[m*n];}Matrix::~Matrix(){

delete[](int*)Mat;}void

Matrix::print(){

for(inti=0;i<m;i++){ cout<<Mat[i*n+0];

for(intj=1;j<n;j++){ cout<<"\t"<<Mat[i*n+j]; } cout<<endl; }}int

Matrix::getM(){

returnm;}int

Matrix::getN(){

returnn;}Matrix::Matrix(const

Matrix&oldMatrix){ m=oldMatrix.m; n=oldMatrix.n; Mat=new

int[m*n];

for(inti=0;i<m*n;i++) Mat[i]=oldMatrix.Mat[i];}【例5.6】矩陣與向量的乘法#include

"Matrix.h"#include

"Vector.h"#include

<iostream>using

namespacestd;

VectorMultiply(Matrix&mat,Vector&vec){

//省略檢查行列的代碼

Vectorc(mat.getM());

for(inti=0;i<mat.getM();i++){

c.Elem(i)=0;

for(intj=0;j<mat.getN();j++){

c.Elem(i)+=mat.Elem(i,j)*vec.Elem(j); } }

returnc;}voidmain(){

intm=3,n=4;

cout<<"矩陣:"<<endl;

Matrixa(m,n);

for(inti=0;i<m;i++){

for(intj=0;j<n;j++){ a.Elem(i,j)=(i+1)*10+j+1; } } a.print();

cout<<endl<<"向量:"<<endl;

Vectorv(n);

for(inti=0;i<n;i++){ v.Elem(i)=(i+1)*2; } v.print(); cout<<endl<<"矩陣×向量:"<<endl; Multiply(a,v).print();}

Amn×Vn=(bi)m5.2.2使用友元提高運行速度

封裝能夠提高程序的安全性和可維護性,但也會降低程序的運行速度。面向?qū)ο蟪绦蛟O(shè)計中,借鑒日常中的“朋友”提出了友元(friend)的概念,可以將一些函數(shù)或類指定為一個類的友元,并按照“朋友”值得相信的常識,允許這些函數(shù)或類直接訪問其私有的或保護的成員?!纠?.7】將普通函數(shù)聲明為友元classVector;classMatrix{

friendVectorMultiply(Matrix&mat,Vector&vec); //聲明友元函數(shù) //以下代碼省略};

classMatrix;classVector{

friendVectorMultiply(Matrix&,Vector&); //聲明友元函數(shù) //以下代碼省略};

好處:Multiply()函數(shù)中就可直接訪問類Vector和Matrix的數(shù)據(jù)成員直接訪問矩陣和向量中的元素//未使用友元代碼VectorMultiply(Matrix&mat,Vector&vec){

//省略檢查行列的代碼

Vectorc(mat.getM());

for(inti=0;i<mat.getM();i++){

c.Elem(i)

=0;

for(intj=0;j<mat.getN();j++){

c.Elem(i)+=mat.Elem(i,j)*vec.Elem(j); } }

returnc;}//使用友元代碼VectorMultiply(Matrix&mat,Vector&vec){ //省略檢查行列的代碼

Vectorc(mat.m); for(inti=0;i<mat.m;i++){

c.v[i]

=0; for(intj=0;j<mat.n;j++){

c.v[i]+=mat.Mat[i*mat.n+j]*vec.v[j]; } } returnc;}破壞了封裝,提高了運行效率!!【例5.8】將成員函數(shù)聲明為友元按照“A乘以B”的習(xí)慣m.Multiply(v).print();圖5.17使用成員函數(shù)實現(xiàn)乘法運算例5.8示例代碼#include

"Matrix.h"class

Vector{

friend

VectorMatrix::Multiply(Vector&vec);//將類Matrix的成員函數(shù)聲明友元

//friendclassMatrix;//聲明友元類

//以下代碼省略};VectorMatrix::Multiply(Vector&vec){

//省略檢查行列的代碼

Vectorc(m);

for(inti=0;i<m;i++){ c.v[i]=0;

for(intj=0;j<n;j++){

c.v[i]+=Mat[i*n+j]*vec.v[j]; } }

returnc;}請參考例【5.6】,編寫調(diào)試通過練習(xí)1.根據(jù)圖5.16所示軟件模型采用普通函數(shù)實現(xiàn)矩陣乘法2.根據(jù)圖5.17所示結(jié)合友元技術(shù)采用成員方法實現(xiàn)矩陣乘法VS2013上編輯調(diào)試【例5.6-5.8】中的代碼圖5.16矩陣和向量相乘圖5.17使用成員函數(shù)實現(xiàn)乘法運算總結(jié)及進一步學(xué)習(xí)設(shè)計:根據(jù)數(shù)學(xué)模型設(shè)計軟件模型的方法編碼:根據(jù)軟件模型編寫程序代碼的方法優(yōu)化:使用友元提高代碼運行速度的方法5.3異常處理進一步學(xué)習(xí)5.3.1異常分類和錯誤定義5.3異常處理5.3.2識別異常和拋出錯誤第5章設(shè)計與實現(xiàn)5.3.3捕獲異常并處理錯誤學(xué)習(xí)目標(biāo)能夠運用面向?qū)ο笾R解釋運行環(huán)境中的異常及其層次關(guān)系能夠使用C++編寫定義、拋出、捕獲和處理異常的代碼能夠針對一個具體場景描述拋出異常和捕獲異常的過程5.3.1異常分類和錯誤定義使用類描述異常的類別使用繼承關(guān)系描述層次關(guān)系定義錯誤編號定義錯誤信息分級處理機制軟件=程序+數(shù)據(jù)+文檔+運行環(huán)境圖5.18異常及其分類例5.9示例代碼//MyErr.hclass

MyErr{public: MyErr(interrNo,const

char*msg); MyErr(const

MyErr&oldMyErr); myStringgetErrMsg();

intgetErrNo();protected: myStringerrMsg;

interrNo;};class

SysErr:public

MyErr{public: SysErr(intsysNo,const

char*msg); SysErr(const

SysErr&oldSysErr);

intgetSysErrNo();protected:

intsysErrNo;};class

FileErr:public

SysErr{public: FileErr(const

char*msg);};class

MemErr:public

SysErr{public: MemErr(const

char*msg);};class

LogicErr:public

MyErr{public: LogicErr(intlogErrNo,const

char*msg); LogicErr(const

LogicErr&oldLogicErr);

intgetLogErrNo(void);protected:

intlogErrNo;};class

MatErr:public

LogicErr{public: MatErr(const

char*msg);};class

VecErr:public

LogicErr{public: VecErr(const

char*msg);};class

MulErr:public

LogicErr{public: MulErr(const

char*msg);};

//MyErr.cpp#include

"myString.h"#include

"MyErr.h"

MyErr::MyErr(int

errNo,const

char*msg):errMsg(msg){

MyErr::errNo=errNo;}MyErr::MyErr(const

MyErr&oldMyErr):errMsg(oldMyErr.errMsg){ errNo=oldMyErr.errNo;}myStringMyErr::getErrMsg(){

returnerrMsg;}int

MyErr::getErrNo(){

returnerrNo;}

SysErr::SysErr(int

sysNo,const

char*msg):MyErr(1,msg){ sysErrNo=sysNo;}SysErr::SysErr(const

SysErr&oldSysErr):MyErr(oldSysErr.errNo,oldSysErr.errMsg.getString()){ sysErrNo=oldSysErr.sysErrNo;}int

SysErr::getSysErrNo(){

returnsysErrNo;}FileErr::FileErr(const

char*msg):SysErr(1,msg){}MemErr::MemErr(const

char*msg):SysErr(2,msg){}LogicErr::LogicErr(int

logErrNo,const

char*msg):MyErr(2,msg){

LogicErr::logErrNo=logErrNo;}LogicErr::LogicErr(const

LogicErr&oldLogicErr):MyErr(oldLogicErr.errNo,oldLogicErr.errMsg.getString()){ logErrNo=oldLogicErr.logErrNo;}int

LogicErr::getLogErrNo(){

returnlogErrNo;}MatErr::MatErr(const

char*msg):LogicErr(1,msg){}VecErr::VecErr(const

char*msg):LogicErr(2,msg){}MulErr::MulErr(const

char*msg):LogicErr(3,msg){}5.3.2識別異常和拋出錯誤#include

"MyErr.h"#include

"Vector.h"#include

<iostream>using

namespacestd;

int&Vector::Elem(int

i){

if(i<n)

returnv[i];

else

throwVecErr("向量中數(shù)組下標(biāo)越界!");}Vector::Vector(int

n){ Vector::n=n; v=new

int[n];

if(!v)

throwMemErr("向量中申請內(nèi)存失敗!");}Vector::Vector(constVector&oldVector){ n=oldVector.n; v=new

int[n];

if(!v)

throwMemErr("向量中申請內(nèi)存失敗!");

//省略下面代碼}#include

"MyErr.h"#include

"Matrix.h"#include

"Vector.h"#include

<iostream>using

namespacestd;

int&Matrix::Elem(int

i,int

j){

if(i<m*n)

returnMat[i*n+j];

else

throwMatErr("矩陣中數(shù)組下標(biāo)越界!");}Matrix::Matrix(int

m,int

n){ Matrix::m=m; Matrix::n=n; Mat=new

int[m*n];

if(!Mat)

throwMemErr("矩陣中申請內(nèi)存失??!");}Matrix::Matrix(constMatrix&oldMatrix){ m=oldMatrix.m; n=oldMatrix.n; Mat=new

int[m*n];

if(!Mat)

throwMemErr("矩陣中申請內(nèi)存失??!");

for(inti=0;i<m*n;i++) Mat[i]=oldMatrix.Mat[i];}

5.3.3捕獲異常并處理錯誤#include

"myString.h"#include

"MyErr.h"#include

"Matrix.h"#include

"Vector.h"#include

<iostream>using

namespacestd;

VectorMultiply(Matrix&mat,Vector&vec){

//檢查行列的代碼

if(mat.getN()!=vec.getN())

throwMatErr("矩陣和向量的行列不符合相乘條件!

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論