基于預(yù)測的郵輪定價(jià)策略_第1頁
基于預(yù)測的郵輪定價(jià)策略_第2頁
基于預(yù)測的郵輪定價(jià)策略_第3頁
基于預(yù)測的郵輪定價(jià)策略_第4頁
基于預(yù)測的郵輪定價(jià)策略_第5頁
已閱讀5頁,還剩28頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、摘要近年來乘坐郵輪旅游的人越來越多,郵輪公司的發(fā)展也非常迅速。如何通過合理的定價(jià)吸引更多的旅游者,從而為郵輪公司創(chuàng)造更多的收益,這也是眾多郵輪公司需要探討和解決的問題。在問題一中,我們通過利用已知數(shù)據(jù)進(jìn)行多項(xiàng)式擬合、灰色預(yù)測和時(shí)間序列的手段,預(yù)測出了表2中的各航次每周實(shí)際預(yù)訂人數(shù)非完全累積數(shù)據(jù)。得到結(jié)果見附件的sheet2;同樣,利用多項(xiàng)式擬合的方法我們解決了問題二:預(yù)測每次航行各周預(yù)訂艙位的價(jià)格。在第三問中,我們先通過時(shí)間序列中的二次指數(shù)平滑法完善了表四中的每航次每周意愿預(yù)定人數(shù)以及以此預(yù)測出公司每周給的預(yù)定平均價(jià)格,結(jié)果見表格。問題四中,為了得到游輪每次航行的最大預(yù)期售票收益模型,我們先構(gòu)

2、建了相應(yīng)的每周預(yù)期銷售票數(shù)量函數(shù),和每航次預(yù)期售票收益函數(shù),通過函數(shù)的求最值,解得第八次航行的最大預(yù)期售票收益為:579899元;第五問是由實(shí)際生活中的經(jīng)驗(yàn)提出的關(guān)于實(shí)際上座未滿的加價(jià)升艙。我們通過設(shè)計(jì)相應(yīng)的升級(jí)折扣來確保高等級(jí)的倉位能全部滿,這樣就能使得預(yù)期收益最大。通過建立線性規(guī)劃模型我們得到各航次的最佳的升級(jí)價(jià)格。關(guān)鍵詞: 多項(xiàng)式擬合 ,灰色預(yù)測,時(shí)間序列 非線性規(guī)劃問題重述已知某郵輪公司擁有一艘1200個(gè)艙位的郵輪,艙位分為三種,250個(gè)頭等艙位,450個(gè)二等艙位,500個(gè)三等艙位。該郵輪每周往返一次,同一航次相鄰兩周之間價(jià)格浮動(dòng)比不超過20%?,F(xiàn)給出10次航行的實(shí)際預(yù)訂總?cè)藬?shù)、各航次

3、每周實(shí)際預(yù)訂人數(shù)非完全累積表、每次航行預(yù)訂艙位價(jià)格表、各艙位每航次每周預(yù)訂平均價(jià)格表及意愿預(yù)訂人數(shù)表、每次航行升艙后最終艙位人數(shù)分配表(詳見附件中表sheet1- sheet5),邀請(qǐng)你們?yōu)楣驹O(shè)計(jì)定價(jià)方案,需解決以下問題:1.預(yù)測每次航行各周預(yù)訂艙位的人數(shù),完善各航次每周實(shí)際預(yù)訂人數(shù)非完全累積表sheet2。(至少采用三種預(yù)測方法進(jìn)行預(yù)測,并分析結(jié)果。)2.預(yù)測每次航行各周預(yù)訂艙位的價(jià)格,完善每次航行預(yù)訂艙位價(jià)格表sheet3。3.依據(jù)附件中表sheet4給出的每周預(yù)訂價(jià)格區(qū)間以及每周意愿預(yù)訂人數(shù),預(yù)測出公司每周給出的預(yù)訂平均價(jià)格。4.依據(jù)附件中表sheet1-sheet4,建立郵輪每次航行

4、的最大預(yù)期售票收益模型,并計(jì)算第8次航行的預(yù)期售票收益。5.在頭等、二等艙位未滿的情況下,游客登船后,可進(jìn)行升艙(即原訂二等艙游客可通過適當(dāng)?shù)募觾r(jià)升到頭等艙,三等艙游客也可通過適當(dāng)?shù)募觾r(jià)升到頭等艙、二等艙)。請(qǐng)建立游客升艙意愿模型,為公司制定升艙方案使其預(yù)期售票收益最大。問題分析對(duì)于問題一,由于至少需要三種方法進(jìn)行預(yù)測這里我們通過多項(xiàng)式數(shù)據(jù)擬合、時(shí)間序列模型、灰色預(yù)測這三種手段進(jìn)行預(yù)測。利用多項(xiàng)式擬合先根據(jù)已知的數(shù)據(jù)擬合出大致的趨勢和解析式,代入時(shí)間t進(jìn)行求解預(yù)測;建立相應(yīng)灰微分方程和直線趨勢預(yù)測。對(duì)于問題二,由于前4期的1-14周數(shù)據(jù)全部給出,后面6期未知數(shù)據(jù)不斷增多,我們?nèi)匀徊捎玫谝粏栔械?/p>

5、多項(xiàng)式擬合進(jìn)行數(shù)據(jù)的預(yù)測。第三問由于兩部分?jǐn)?shù)據(jù)均有缺失,我們先通過時(shí)間序列模型將每行每次預(yù)定人數(shù)預(yù)測并補(bǔ)全,由于還需要預(yù)測公司給的平均預(yù)定價(jià)格,我們還需要通過已知數(shù)據(jù)建立預(yù)定人數(shù)和給定平均價(jià)格的關(guān)系。這可以通過回歸分析作出相應(yīng)函數(shù),在得到對(duì)應(yīng)的預(yù)測的公司給的預(yù)定平均價(jià)格。第四問需要建立輪每次航行的最大預(yù)期售票收益模型,而收益是由銷售量和銷售價(jià)格決定,因此需要先確定銷售量(實(shí)際會(huì)預(yù)定船票的人)和對(duì)應(yīng)的銷售價(jià)格。由此確定出最后的預(yù)期售票收益,再通過求函數(shù)的求最值得到最大預(yù)期收票模型,以此解決第八航次的最大預(yù)期收益。問題五在頭等艙,二等艙未滿的情況下允許通過加錢的方式進(jìn)行倉位升級(jí),我們需假設(shè)出三種倉

6、位的實(shí)際預(yù)定人數(shù),并設(shè)出相應(yīng)的升級(jí)折扣,通過線性規(guī)劃來確定受益最大的升級(jí)折扣。模型假設(shè)假設(shè)所有數(shù)據(jù)均無誤;每種倉位每周預(yù)定價(jià)格在價(jià)格區(qū)間內(nèi)服從平均分布;當(dāng)平均價(jià)格為上限時(shí),有意愿購買人數(shù)就是實(shí)際人數(shù);符號(hào)說明一次指數(shù)平滑值二次指數(shù)平滑值初始預(yù)定人數(shù)航次擬合的函數(shù),用于預(yù)測一次移動(dòng)平均數(shù)二次移動(dòng)平均數(shù)平滑系數(shù)平滑系數(shù)加權(quán)系數(shù)第t周的價(jià)格區(qū)間上界第t周的價(jià)格區(qū)間的下界第t周的實(shí)際定價(jià)在定價(jià)下的乘客購票概率第t周有意向購買人數(shù)第t周實(shí)際購買人數(shù)第t周的收益升艙人數(shù)百分比a升艙所需加價(jià)R目標(biāo)利潤函數(shù)模型建立與求解問題一:方法1:多項(xiàng)式擬合由于sheet2中的十次數(shù)據(jù)中,前四次的全部數(shù)據(jù)已知,我們可以通

7、過前四次的數(shù)據(jù)進(jìn)行擬合,進(jìn)而預(yù)測后6次的數(shù)據(jù)??上雀鶕?jù)前四次的數(shù)據(jù)散點(diǎn)圖,判斷整體趨勢再設(shè)計(jì)合理的擬合函數(shù)。這里這里先做變換,以第一次的數(shù)據(jù)作圖得到:曲線趨勢近似指數(shù)曲線,.這里我們以第一次的頭等艙數(shù)據(jù)進(jìn)行擬合,得到下圖:由此我們得到第一次頭等艙的預(yù)定數(shù)量的擬合十次多項(xiàng)式:結(jié)果分析:如圖所示擬合效果還較為理想,殘差模僅為28.16。我們由此認(rèn)為該函數(shù)可以進(jìn)行預(yù)測。下面對(duì)表二中的數(shù)據(jù)進(jìn)行多項(xiàng)式擬合,結(jié)果如下:頭等艙:頭等艙航次擬合函數(shù)5678910二等艙:二等艙航次擬合多項(xiàng)式函數(shù)5678910三等艙:三等艙航次擬合函數(shù)5678910通過代入數(shù)據(jù)到擬合多項(xiàng)式函數(shù)中,我們求解得到:航次頭等艙二等艙三

8、等艙第五航次1453381088第六航次241419485286425/515第七航次137474441145/460183/470第八航次178367400198422434217477465235/493第九航次169330426196393451225459468254/474/467第十航次119251382169336418233438525313560/(紅色字體表示與測試超過理論最大值,劃線部分由于超過理論值,舍去。)這里可以看到多項(xiàng)式擬合對(duì)第十次航行的預(yù)測效果較差,不建議采用這組數(shù)據(jù)。方法二:時(shí)間序列模型由方法一中的圖可知,時(shí)間序列近似是現(xiàn)行的增加,考慮到簡單平移移動(dòng)的滯后性,

9、我們采用趨勢移動(dòng)平均法來進(jìn)行預(yù)測。我們假設(shè)時(shí)間序列從某時(shí)刻開始具有線性趨勢,這在圖中恩能夠大致看出。由此我們可以設(shè)出直線趨勢預(yù)測模型:其中t為當(dāng)前星期數(shù),m為由t致預(yù)測期的星期數(shù),是平滑系數(shù)。我們引入如下概念:一次移動(dòng)的平均數(shù):二次移動(dòng)平均:如下推導(dǎo),取,得到:利用一次移動(dòng)平均數(shù)化簡,可以得到:由此可算出平滑系數(shù)。從而確定預(yù)測函數(shù)。預(yù)測結(jié)果如下:航次頭等艙二等艙三等艙第五航次218424516第六航次223417509247435/第七航次235468468283/513/第八航次157357403183399448207444479232486520第九航次12932645515537751

10、0176428/200479/221/第十航次102310382130375415151436466177500503199/224/由上表的結(jié)果顯示,預(yù)測效果仍然無法令人滿意。方法三:灰色預(yù)測方法在建立模型前首先進(jìn)行級(jí)比檢驗(yàn),這里仍然以第五次的頭等艙的數(shù)據(jù)為例,首先列出參考數(shù)據(jù)列首先進(jìn)行級(jí)比檢驗(yàn),發(fā)現(xiàn)對(duì)于,均能滿足該要求,所以下面建立灰色預(yù)測模型:首先將參考數(shù)據(jù)列做一次累加的到:其中,建立均值數(shù)列:,由此建立灰微分方程:相應(yīng)白化方程:,記,,有最小二乘法求得使達(dá)到最小的,于是求得方程的解:,而且有,求解的到航次頭等艙二等艙三等艙第五航次218423514第六航次229412514265423

11、/第七航次260/476/第八航次168368428209428/260/第九航次141345452183424518234/第十航次121344388177462437251/507/顯然,灰色預(yù)測效果很不好,可能是由于有的地方已知數(shù)據(jù)量太少而預(yù)測數(shù)據(jù)過多造成,幾乎不能達(dá)到預(yù)測效果。問題二:這里所知十個(gè)航次的三中倉位十四周的部分預(yù)定價(jià)格,這里我們仿照問題一的法一,利用多項(xiàng)式擬合。我們?cè)O(shè)出多項(xiàng)式函數(shù):來進(jìn)行擬合,通過已知數(shù)據(jù)擬合得出系數(shù),再對(duì)未知的進(jìn)行預(yù)測。這里我們?yōu)榱吮WC擬合的良好效果并且符合數(shù)據(jù)的變化趨勢,我們采用三次多項(xiàng)式進(jìn)行擬合。所求得的結(jié)果如下表:頭等艙:航次多項(xiàng)式表達(dá)式567891

12、0二等艙:5678910三等艙:5678910通過上面三個(gè)表中所得的各個(gè)航次不同倉位的價(jià)格擬合函數(shù),可以求得sheet3中空格處的預(yù)定價(jià)格,結(jié)果下表:航次頭等艙二等艙三等艙第五航次16281053746第六航次1580122680314381175711第七航次165112539011547119882414251129714第八航次17121191914153510278341296809715989529550第九航次1720129295716011157910144697082712527297021016413538第十航次1796116797317019639391556661867

13、13532697491085/577747/343(紅色字體為預(yù)測的不在價(jià)格區(qū)間的價(jià)格。)問題三:由于sheet4中,每航次每周預(yù)定平均價(jià)格和每航次每周意愿訂購人數(shù)的數(shù)據(jù)均有缺失,我們先要補(bǔ)全每航次每周意愿訂購人數(shù)。為了補(bǔ)全數(shù)據(jù)我們采用時(shí)間序列模型進(jìn)行預(yù)測。由于一次指數(shù)平滑法再出現(xiàn)直線趨勢時(shí)的滯后缺點(diǎn),我們選用二次指數(shù)平滑法進(jìn)行建模預(yù)測。為時(shí)間序列,為加權(quán)系數(shù),其中有一次平滑公式:,由此建立預(yù)測模型: 在趨勢類似直線時(shí),我們有直線趨勢模型:由此進(jìn)行預(yù)測。為求出各周的模擬值,我們?nèi)∵@里我們通過選取第四航次的數(shù)據(jù)進(jìn)行驗(yàn)證,發(fā)現(xiàn)加權(quán)系數(shù)選用0.2時(shí),預(yù)測結(jié)果與實(shí)際數(shù)據(jù)最接近。下面均選用,具體運(yùn)算結(jié)果

14、如下:得到對(duì)應(yīng)的每航次每周意愿預(yù)定人數(shù)。補(bǔ)全每航次每周意向預(yù)定人數(shù)的數(shù)據(jù)。得到如圖:頭等艙二等艙三等艙同樣方法,我們能預(yù)測出公司的定價(jià)。結(jié)果如下所示;頭等艙二等艙三等艙。問題四:預(yù)期售票收益是由每航次各個(gè)周意向預(yù)定人數(shù)和和相應(yīng)的周預(yù)定價(jià)格所決定。這兩篇我們?cè)O(shè)游輪的每種倉位的最大倉位數(shù)為,游輪票的銷售時(shí)間為T周,預(yù)售船票的實(shí)際需求量為,實(shí)際的總收益為,t表示具體的銷售期內(nèi)的某一周,是在該周內(nèi)定的預(yù)售票的價(jià)格,表示第t周的價(jià)格區(qū)間的上界,表示第t周的價(jià)格區(qū)間的下界,是顧客真正購買預(yù)定售票的概率,表示在該定價(jià)下真正會(huì)購買預(yù)售票的概率。表示該周內(nèi)有意向購買預(yù)售的人數(shù)。由于在sheet4中,有假設(shè):每種

15、倉位每周預(yù)定價(jià)格在價(jià)格區(qū)間內(nèi)服從平均分布,且當(dāng)平均價(jià)格為上限時(shí),有意愿購買人數(shù)為實(shí)際人數(shù)。由此我們可以確定出。由此可得到第t周的實(shí)際需量:由此得到第t周的總收益:,每次航行的總收益為E:利用次模型,可解得第八次航行的最大預(yù)期收益為:579899元。問題五:在頭等、二等艙位未滿的情況下,為了使得郵輪公司的利益得以擴(kuò)大,郵輪公司可原來價(jià)格上適當(dāng)?shù)丶觾r(jià),刺激游客升艙。然而如果只是補(bǔ)差價(jià)來進(jìn)行升艙,那么沒人愿意升艙,因?yàn)槭窍嗤膬r(jià)格,不如當(dāng)初就預(yù)定更好的艙位。如果增加價(jià)格為0。那么幾乎所有人都愿意升艙。我們假設(shè)每艙升艙人數(shù)占該艙現(xiàn)有人數(shù)百分比與加價(jià)呈負(fù)線性關(guān)系,那么由以及,(為差價(jià))可以得到關(guān)系式:即

16、記三等艙升二等艙、頭等艙,和二等艙升頭等艙需要的加價(jià)分別問,那么由上面的分析可知相應(yīng)艙的升艙人數(shù)占本艙中人數(shù)百分比百分比為.記每周某一航次的頭等艙,二等艙,三等艙價(jià)格為,現(xiàn)有人數(shù)為于是可得增加利潤的目標(biāo)函數(shù)相應(yīng)的約束條件為Lingo求解,得:第一航次三升二加價(jià)205第六航次三升二加價(jià)208三升一加價(jià)870三升一加價(jià)896二升一加價(jià)494二升一加價(jià)509第二航次三升二加價(jià)220第七航次三升二加價(jià)204三升一加價(jià)931三升一加價(jià)885二升一加價(jià)507二升一加價(jià)505第三航次三升二加價(jià)208第八航次三升二加價(jià)213三升一加價(jià)910三升一加價(jià)875二升一加價(jià)497二升一加價(jià)502第四航次三升二加價(jià)22

17、0第九航次三升二加價(jià)215三升一加價(jià)926三升一加價(jià)909二升一加價(jià)491二升一加價(jià)497第五航次三升二加價(jià)199第十航次三升二加價(jià)206三升一加價(jià)950三升一加價(jià)867二升一加價(jià)558二升一加價(jià)487模型優(yōu)缺點(diǎn)優(yōu)點(diǎn):1.通過理想化的假設(shè),使得模型簡潔。模型具有一般性,通過修改參數(shù)即可套用到別的模型的預(yù)測。缺點(diǎn):由于采取理想化的假設(shè),建立的簡單模型,求解中會(huì)有與實(shí)際數(shù)據(jù)的偏差。參考文獻(xiàn):1 姜啟源 數(shù)學(xué)模型 北京,高等教育出版社2韓中庚 數(shù)學(xué)建模方法及其應(yīng)用 北京,高等教育出版社3司守奎 數(shù)學(xué)建模算法及應(yīng)用 北京,國防工業(yè)出版社附件: 灰色預(yù)測MATLAB代碼:format long n=le

18、ngth(X0);sigma=X0(1:n-1)./X0(2:n);range=minmax(sigma);X1=cumsum(X0); for i=1:n-1B(i,1)=-0.5*(X1(i)+X1(i+1);B(i,2)=1;Y(i)=X0(i+1);endu=(B*B)(-1)*B*Y;a=u(1,1);b=u(2,1);d=b/a;c=X0(1)-d;X2(1)=X0(1);X(1)=X0(1);for i=1:n-1X2(i+1)=c*exp(-a*i)+d;X(i+1)=X2(i+1)-X2(i);endfor i=(n+1):(n+k)X2(i)=c*exp(-a*(i-1)+

19、d;X(i)=X2(i)-X2(i-1);endfor i=1:nerror1(i)=X(i)-X0(i);error2(i)=abs(error1(i)/X0(i);endC=std(error1)/std(X0);rho=1-(1-0.5*a)/(1+0.5*a)*sigma;時(shí)間序列:(1)load renshu.txtyt=renshu;n=length(yt);alpha=0.3;st1(1)=yt(1);st2(1)=yt(1);for i=2:n st1(i)=alpha*yt(i)+(1-alpha)*st1(i-1); st2(i)=alpha*st1(i)+(1-alpha

20、)*st2(i-1);endxlswrite(renshu.xls,st1,st2);a=2*st1-st2b=alpha/(1-alpha)*(st1-st2)yhat=a+b;xlswwrite(renshu.xls,yhat,Sheet,C2)str=char(C,int2str(n+2);xlswrite(renshu.xls,a(n)+2*b(n),Sheet,str)(2)load y.txtm1=length(y);n=5;for i=1:m1-n+1 yhat1(i)=sum(y(i:i+n-1)/n;endyhat1m2=length(yhat1);for i=1:m2-n+

21、1 yhat2(i)=sum(yhat1(i:i+n-1)/n; endyhat2a1=2*yhat1(end)-yhat2(end)b1=2*(yhat1(end)-yhat2(end)/(n-1)y16=a1+b1Lingo代碼:data:x1,x2,x3,y1,y2,y3=?;enddatamax=a1*x3*(-a1/(y2-y3)+1)+a2*x3*(-a2/(y1-y3)+1)+a3*x2*(-a3/(y1-y2)+1);-x3/(y1-y3)*a2-x2/(y1-y2)*a3+x1+x2+x3=250;x2/(y1-y2)*a3-x3/(y2-y3)*a1-x3=450;a1=y

22、2-y3;a2=y1-y3;a3=y1-y2;附錄資料:不需要的可以自行刪除Pascal/C/C+語句對(duì)比(補(bǔ)充版)一、Hello world 先看三種語言的樣例:Pascalbegin writeln(Hello world);end.C#include int main() printf(Hello world!n); return 0;C+#include using namespace std;int main()cout Hello world! endl; return 0; 從這三個(gè)程序可以看到一些最基本的東西。在Pascal中的begin和end,在C/C+里就是;Pascal

23、主程序沒有返回值,而C/C+返回0(好像在C中可以為NULL)。在C/C+中,main函數(shù)以前的是頭文件,樣例中C為stdio.h,C+除了iostream還有第二行的using namespace std,這個(gè)是打開命名空間的,NOIP不會(huì)考這個(gè),可以不管,只要知道就行了。 此外說明 注釋單行用/,段落的話Pascal為,C/C+為/* */。* 常用頭文件(模板)#include #include #include #include #include #include using namespace std;int main() system(“pause”);return 0;二、數(shù)據(jù)類

24、型及定義 這里只列出常用的類型。1、整型PascalC/C+范圍shortint-128 127integershort-32768 32767longintInt -2147483648 2147483647int64long long-9223372036854775808 9223372036854775807byte-0 255wordunsigned short0 65535longwordunsigned int0 4294967295qwordunsigned long long0 18446744073709551615 * 當(dāng)對(duì)long long 變量賦值時(shí),后要加LLLon

25、g long x=6327844632743269843LL* 如果位移 x2LL* Linux: printf(“%lldn”,x);* Windows: printf(“%I64dn”,x);2、實(shí)型PascalC/C+范圍realfloat2.9E-39 1.7E38single-1.5E-45 3.4E38doubledouble5.0E-324 1.7E3083、字符即字符串 字符在三種語言中都為char,C里沒有字符串,只有用字符數(shù)組來代替字符串,Pascal和C+均為string。Pascal中字符串長度有限制,為255,C+則沒有。 字符串和字符在Pascal中均用單引號(hào)注明,

26、在C/C+中字符用單引號(hào),字符串用雙引號(hào)。4、布爾類型 Pascal 中為 boolean,C/C+ 為 bool。值均為True 或 False。C/C+中除0外bool都為真。5、定義 常量的定義均為 const,只是在C/C+中必須要注明常量的類型。在C/C+中還可以用宏來定義常量,此時(shí)不注明類型。PascalC/C+const a = 60; b = -a + 30; d = ;const int a = 60;const int b = - a + 30;const string d = “”;define MAXN 501 /這個(gè)是宏 * 宏定義其實(shí)就是直接在程序相應(yīng)的位置替換:

27、#define randomize srand(unsigned time(NULL) #define wait for(int w=0;w a;cout a;cout a endl;特別說明C+中cin一個(gè)字符的話會(huì)自動(dòng)跳過空格和回車,Pascal和C則會(huì)讀入空格和回車。在Pascal中writeln(a:n:m) 表示在n個(gè)字符寬的輸出域上輸出a保留m位小數(shù)。例如:pascal write(a:6) c/c+ printf(“%6d”,a) Pascal write(a:6:2) c/c+ printf(“%6.2f”,a) C+ 如果用 cout ? (繁瑣!) 需要加頭文件 #inlu

28、de cout setprecision(2)a; /作用永久 cout setw(6)a; /作用臨時(shí) 以下三個(gè)進(jìn)制設(shè)定都是永久作用: cout deca; 相當(dāng) printf(“%d”,a); /十進(jìn)制 cout hexa; 相當(dāng) printf(“%X”,a); /十六進(jìn)制 cout octa; 相當(dāng) printf(“%o”,a); /八進(jìn)制例如:cout 12hex12oct1212endl;輸出:12c1414 C 的輸入輸出里面的字符串中%表示變量,%后面的字目表示變量類型。下面是類型表:%hd1個(gè)short型整數(shù)%d1個(gè)int型整數(shù)%u1個(gè)unsigned int型整數(shù)%I64d1

29、個(gè)long long型整數(shù)%c1個(gè)字符%s1個(gè)C字符串%f1個(gè)float型實(shí)數(shù)%lf1個(gè)double型實(shí)數(shù)%10.4f輸出1個(gè)總寬度為10,保留4位小數(shù)的實(shí)數(shù) 文件輸入輸出:Pascalassign(input, test.in);assign(output, test.out);reset(input);rewrite(output);read(a, b);writeln(a, b);close(input);close(output);CFILE *fin = fopen(“test.in”, “r”);FILE *fout = fopen(“test.out”, “w”);fscanf(

30、fin, “%d%d”, &a, &b);fprintf(fout, “%d%d”, a, b);fclose(fin); fclose(fout);C+#include using namespace std;ifstream fin(“test.in”);ofstream fout(“test.out”);fin a b;fout a b endl;fin.close(); fout.close();因?yàn)镃+的讀入較慢,個(gè)人建議C+的話使用C的輸入方式。當(dāng)然也有人用C的讀入,C+的輸出的,這種方式我們稱之為城鄉(xiāng)結(jié)合。*中國計(jì)算機(jī)學(xué)會(huì)競賽須知發(fā)布的C讀寫程序:(C+ 也能用,cin,cout

31、,scanf,printf 可混用)#include int main() int a,b; freopen(“sum.in”,”r”,stdin);freopen(“sum.out”,”w”,stdout); scanf(“%d%d”,&a,&b); printf(“%dn”,a+b); return 0; 或者:freopen(“sum.in”,”r”,stdin);freopen(“sum.out”,”w”,stdout);ios:sync_with_stdio(false); 取消同步,cin,cout的速度就不慢了! cinab;couta+bendl; return 0;以下擴(kuò)充c

32、/c+混用是可行的:#include #include using namespace std;int main() int a,b,c,d; freopen(sum.in,r,stdin); freopen(sum.out,w,stdout); scanf(%d%d,&a,&b); cincd; printf(%dn,a+b); couta+b+c+dsn).Cwhile(scanf(%s%d,s,&n)!=EOF).四、賦值語句及運(yùn)算符號(hào) 一一對(duì)應(yīng)的關(guān)系PascalC/C+賦值運(yùn)算賦值:=基本運(yùn)算加+減-乘*除(實(shí)數(shù))/ (double)除法取整div(int) / (int)取余mod%

33、比較等于=不等于!=大于大于等于=小于小于等于=邏輯且and&或or|非not!位運(yùn)算左移(*2)shl且and&或or|非not異或xor其他增一inc(x)x+減一dec(x)x- 在C/C+中對(duì)某個(gè)變量自身進(jìn)行運(yùn)算可以簡寫為 變量名 運(yùn)算符號(hào)= 改變量 如 x += 8 就表示 x = x + 8, 即 inc(x, 8)。 在 C/C+里還存在一種三目運(yùn)算 變量名 = 條件 ? 值A(chǔ) : 值B 如 x = x 0 ? x : -x; /表示若x 0 則取 x, 否則取 x, 同 if x 0 then x := x else x := -x;五、條件語句1、if C/C+中if 語句的

34、條件必須要用括號(hào)括起來,后面不使用then。PascalC/C+if a b then flag := true else flag := false;if (a b) flag = true;else flag = false;2、多種分支 C/C+中為switch,Pascal為case:PascalC/C+case x of 1: inc(x); 2: dec(x); else x := x * x;end;switch (x) case 1: x +; break; case 2: x -; break; default: x *= x; 切記C/C+中一定要寫break,后果你可以去

35、掉break,運(yùn)行看看就知道了。六、循環(huán)語句1、forPascalC/C+for 變量名 := 初始值 to(downto) 終止值 dofor (變量名=初始值;條件;改變方式)for i := 5 to 10 do dec(a);/終止值大于初始值用 tofor i := 5 downto 1 do dec(a);/終止值小于于初始值用 downtofor (i = 5; i = 1; i-) a-;/*只要i 滿足條件就會(huì)一直循環(huán)。C/C+中i是實(shí)數(shù)、指針都可以*/C/C+中for的特殊用法:/變量為實(shí)數(shù)for (double i = 1; i 符號(hào)為間接引用,后面會(huì)提到。for (ty

36、pe1 *p = head - next; p; p = p - next) printf(“%d”, p - k);2、whilePascalC/C+while 條件 dowhile (條件)while i 0 do dec(i);while (i != 0) i-;/也可寫作 while (i) i-;/在C/C+中非0即為真。3、repeat-until & do-whilePascalC/C+repeat 語句 until 結(jié)束條件;do while (運(yùn)行條件)repeat int(i) until i 100;do i+; while (i = 100);七、數(shù)組 Pascal中數(shù)

37、組的下標(biāo)可以隨意定義,而C/C+下標(biāo)始終為從0開始到(數(shù)組大小1)。PascalC/C+定義a : array 1.100 of integer;b :array 1.10,1.10 of int64;int a100;int b1010;含義a 為大小為100的integer數(shù)組,合法下標(biāo)為1到100b 為大小為10*10的int64數(shù)組,合法下標(biāo)為1,1到10,10a 為大小為100的int數(shù)組,合法下標(biāo)為0到99b 為大小為10*10的int數(shù)組,合法下標(biāo)為0,0到9,9;使用inc(a21);b2,2:=b1,1+b1,2+b2,1;a21+;b11=b01+b00+b10; 數(shù)組清零

38、PascalC/C+Fillchar(a, sizeof(a), 0);memset(a, 0, sizeof(a);/頭文件包含 string.h*如果要填最大: memset(a,127,sizeof(a) (但達(dá)不到 INT_MAX) 如果要填最?。?memset(a,128,sizeof(a) (但達(dá)不到 INT_MIN) 如果填0: memset(a,0,sizeof(a) 如果填-1: memset(a,-1,sizeof(a)八、字符串 C風(fēng)格的字符串就是字符數(shù)組。 C+和Pascal的字符串使用基本相同,只是C+中字符串下標(biāo)以0開始,Pascal以1開始。字符串處理很多這里不一

39、一列舉,只寫最常用的幾個(gè)。PascalC (包含)定義用:char sC+(包含)定義用:string s輸入輸出Readln(s);Writeln(s);Scanf(“%s”,s);Printf(“%sn”,s);注:不能輸入輸出c+的字符串Cins;Couts = s 的區(qū)別: getline(cin,s)cins一次性整行讀入,直至行末尾。只讀入一個(gè)“單詞”,遇空格和行末停止。例如輸入;How are you?s=” How are you?”讀入整串含空格例如輸入;How are you?s=”How”如果三個(gè)都讀:cins1s2s3*C+ 數(shù)字與數(shù)值之間的轉(zhuǎn)換:#include #i

40、nclude #include /必須加入using namespace std;int main() string text = 152; int number; stringstream ss;ss number; /string - int coutnumber+100endl; ss string string str = ss.str(); return 0;九、過程和函數(shù)1、過程 在C/C+中沒有過程,但可以把返回值為“空”的函數(shù)理解為過程。PascalC/C+無參過程procedure 過程名;說明部分begin 語句部分 end;/說明部分、begin、end語句部分統(tǒng)稱為過程

41、體void 函數(shù)名(); 主體部分; return ;帶參過程procedure 過程名(形參表)過程體void 函數(shù)名(形參表)過程體 值傳和址傳:當(dāng)一個(gè)參數(shù)是值傳時(shí),形參在子過程中相當(dāng)于一個(gè)局部變量,對(duì)它的改變不影響實(shí)在的參數(shù)值。址傳則會(huì)影響。下例中a為值傳,b為址傳。初始a = 5,b = 5,運(yùn)行后a = 5,b = 10;PascalC/C+var a, b:integer;procedure doit(a:integer; var b:integer);begin b := a + b; a := a + b;end;begina := 5;b := 5;doit(a, b);wr

42、iteln(a, , b);end.void doit(int a, int &b) HYPERLINK a a認(rèn)為值參,b認(rèn)為變量傳參 b += a; a += b; return ;int main()int a = 5, b = 5;doit(a, b);cout a b;return 0;* 用若干地址傳參可以給調(diào)用者傳回若干值 Void tryit(int &x,int &y,int &z) 調(diào)用時(shí): tryit(a,b,c) ,可以傳回 a,b,c的值。* 用數(shù)組名(也是地址)傳參可以傳回整組的數(shù)據(jù) Void tryit( int a) 調(diào)用時(shí): tryit(x),可以傳回整個(gè)數(shù)組

43、。例如:void tryit(int a) for(int i=0;i=10;i+) ai=i*2; return; int main() int x10; tryit(x); for(int i=0;i=10;i+) coutxiendl; system(pause); return 0;*用指向函數(shù)的指針作為參數(shù),可以執(zhí)行指定的函數(shù)。(略)STL 的兩個(gè)應(yīng)用:* C+ 快排函數(shù)#include Bool com(int a,int b) Return ab;Int main() Int a10=5,7,3,2,6,8,4,3,5,7;Sort(a,a+10,com); /如果升序可以省略c

44、om.For(int i=0;i10;i+) Coutai” “;* 優(yōu)先隊(duì)列(以堆排為例)#include #include using namespace std;priority_queue Q;int main() int n,a; cinn; while (n-) cina; Q.push(a); while (!Q.empty() cout Q.top() ; Q.pop(); return 0;* 隊(duì)列、棧、優(yōu)先隊(duì)列 三種數(shù)據(jù)結(jié)構(gòu)匯總:#include #include priority_queue Q;queue Q1;stack S;int main()Q.push(5); x = Q.top(); Q.pop();Q.empty();Q.size()Q1.push(5); Q1.size(); Q1.front(); Q1.empty(); Q1.pop();S.push(5); S.size(); S.to

溫馨提示

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

最新文檔

評(píng)論

0/150

提交評(píng)論