奧賽經(jīng)典題目講解_第1頁(yè)
奧賽經(jīng)典題目講解_第2頁(yè)
奧賽經(jīng)典題目講解_第3頁(yè)
奧賽經(jīng)典題目講解_第4頁(yè)
奧賽經(jīng)典題目講解_第5頁(yè)
已閱讀5頁(yè),還剩13頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

巧用數(shù)組下標(biāo)輕松回避重復(fù)判斷

[作者:佚名轉(zhuǎn)貼自:網(wǎng)絡(luò)點(diǎn)擊數(shù):68文章錄入:kknd]

在程序設(shè)計(jì)的某個(gè)環(huán)節(jié)中,需要統(tǒng)計(jì)不同數(shù)據(jù)的個(gè)數(shù),按照常規(guī)思路的算法簡(jiǎn)單描述如下:

①讀入下一個(gè)數(shù);

②將該數(shù)與之前已讀入的數(shù)一一比較,如果都不同,則該數(shù)是新數(shù),累加器加1;否則,表示該數(shù)是

舊數(shù),有重復(fù),直接退出比較的循環(huán)②。

③是否讀完所有數(shù)據(jù),如果是,輸出累加器值,結(jié)束;否則,轉(zhuǎn)到①;

下面用一個(gè)實(shí)例說(shuō)明。

例產(chǎn)生10個(gè)范圍為1—20的隨機(jī)整數(shù),統(tǒng)計(jì)不同數(shù)的個(gè)數(shù)。

按照常規(guī)思路,得如下參考程序。

programtongji(input,output);

var

a:array[1..10]ofinteger;

i,j,t:integer;

begin

writeln。產(chǎn)生隨機(jī)數(shù):);

randomize;

fori:=1to10do

begina[i]:=l+random(19);write(Jend;

t:=0;

fori:=1to10do

begin

j:=l;

while(j<i)and(a[i]Oa[j])doj:=j+1;

ifj=ithent:=t+l;

end;

writeln;writeln(,統(tǒng)計(jì)不同數(shù)據(jù)有個(gè)二);

end.

由以上程序可知,完成數(shù)據(jù)統(tǒng)計(jì)需要兩重循環(huán),時(shí)間復(fù)雜度為O(n2)。如果數(shù)據(jù)是正整數(shù),那么試著

換另外一種思路:將數(shù)據(jù)作為數(shù)組的下標(biāo),進(jìn)行一個(gè)賦值為1的標(biāo)記操作。比如,現(xiàn)有數(shù):2,6,2,

用數(shù)組b口輔助存儲(chǔ),依次操作:b[2]:=1,b[6]:=1,接下來(lái)是2,已重復(fù),在程序中無(wú)需特殊判斷,

執(zhí)行相同操作:b[2]:=1,這樣就可以有效回避重復(fù)判斷,最后只要累計(jì)b[]數(shù)組中值為1的個(gè)數(shù),事

實(shí)上,數(shù)組中其他元素由于沒(méi)有進(jìn)行賦值操作,保留了默認(rèn)值0,因此累加操作也可以擴(kuò)展到所有數(shù)

組元素的直接相加,為了更有效的累加,可以在執(zhí)行賦值操作時(shí),加入數(shù)據(jù)范圍的上限、下限標(biāo)識(shí):

max和min,每讀入一個(gè)數(shù)后,更新數(shù)據(jù)范圍,最后只要將下標(biāo)為上下限范圍的數(shù)組數(shù)據(jù)進(jìn)行累加。

參考程序如下:

programtongji(input,output);

var

a:array[1..10]ofinteger;

b:array[1..20]ofinteger;

i,t,max,min:integer;

begin

wiitelnC產(chǎn)生隨機(jī)數(shù)

randomize;

fori:=1to10do{產(chǎn)生10個(gè)(1-20)隨機(jī)數(shù)}

begina[i]:=l+random(19);write,end;

t:=0;max:=0;min:=10000;{設(shè)置統(tǒng)計(jì)時(shí),數(shù)組范圍的上下標(biāo)識(shí)}

fori:=1to10do

begin

"a叩:=1;{將數(shù)據(jù)以數(shù)組下標(biāo)的形式寫(xiě)入,避免判斷}

ifa[i]>maxthenmax:=a[i];{更新數(shù)組范圍的上下標(biāo)識(shí)}

ifa[i]<minthenmin:=a[i];

end;

fori:=mintomaxdot:=t+b[i];{統(tǒng)計(jì)不同數(shù)據(jù)個(gè)數(shù)}

writein;writeln。統(tǒng)計(jì)不同數(shù)據(jù)有X'個(gè)

end.

如果程序要求將個(gè)數(shù)統(tǒng)計(jì)結(jié)果分別顯示,如

輸入:262;

輸出:2:26:1

2

其中輸出第1行分別顯示每個(gè)數(shù)的統(tǒng)計(jì)情況,第2行統(tǒng)計(jì)數(shù)據(jù)有幾個(gè)。

要統(tǒng)計(jì)每個(gè)數(shù)的數(shù)量情況,在將數(shù)據(jù)以數(shù)組下標(biāo)的形式寫(xiě)入時(shí),不能直接賦1操作,需執(zhí)行累加,

以為該數(shù)進(jìn)行統(tǒng)計(jì);這個(gè)操作對(duì)統(tǒng)計(jì)不同數(shù)據(jù)的總個(gè)數(shù)發(fā)生了變化,因此統(tǒng)計(jì)時(shí)將原來(lái)的直接累加,

變?yōu)榕袛喾?后,再累加1完成。改變部分的代碼如下:

t:=0;max:=O;min:=10000;{設(shè)置統(tǒng)計(jì)時(shí),數(shù)組范圍的上下標(biāo)識(shí)}

fori:=1to10do

begin

b[a[i]]:=b[a[i]]+l;

ifa[i]>maxthenmax:=a[i];

ifa[i]<minthenmin:=a[i];

end

fori:=mintomaxdo

ifb[i]<>0then

beginwrite(i,':',b[i]');t:=t+1;end;{統(tǒng)計(jì)不同數(shù)據(jù)個(gè)數(shù)}

writein;writeln(t);

時(shí)間復(fù)雜度由原來(lái)的0(n2)降低為0(n)?

編程時(shí),不妨拋開(kāi)傳統(tǒng)解題思路,嘗試著用其他方法解決,一個(gè)小小的數(shù)據(jù)統(tǒng)計(jì)程序,或許可以給

你些許啟迪,愿本文起到拋磚引玉的作用。

歷屆NOIP搜索算法全集

用動(dòng)態(tài)規(guī)劃來(lái)解背包問(wèn)題

在歷屆NOIP競(jìng)賽中,有4道初賽題和5道復(fù)賽題均涉及到背包問(wèn)題,所謂的背包問(wèn)

題,可以描述如下:一個(gè)小偷打劫一個(gè)保險(xiǎn)箱,發(fā)現(xiàn)柜子里有N類不同大小與價(jià)值

的物品,但小偷只有一個(gè)容積為M的背包來(lái)裝東西,背包問(wèn)題就是要找出一個(gè)小偷

選擇所偷物品的組合,以使偷走的物品總價(jià)值最大。

如有4件物品,容積分別為:3458

對(duì)應(yīng)的價(jià)值分別為:45710

小偷背包的載重量為:12

則取編號(hào)為123的物品,得到最大價(jià)值為16。

算法分析:如果采用貪心法,則先取價(jià)值最大的10,消耗了容積8,下面只能取容

積為4的物品,得到價(jià)值5,這樣總價(jià)值是15,這不是最優(yōu)解,因此貪心法是不正

確的。

采用窮舉法,用一個(gè)B數(shù)組來(lái)表示取數(shù)的標(biāo)記,當(dāng)時(shí)表示第i件物品不取,

當(dāng)B=1時(shí)表示第i件物品已取,初始化全部取0,以下算法是從后面的物品開(kāi)始取

起,通過(guò)B數(shù)組的取值把15種取法全部窮舉出來(lái),價(jià)值MAX初始化為0o

B[0]B[l]B[2]B[3]B[4]

00000{初始化}

00001{取第4件物品,容積為8,不超,價(jià)值為10,將MAX替換為10}

00010{取物品3,容積為5,不超,價(jià)值為7,不換}

00011{取物品3、4,容積為13,超}

00100{取物品2,容積為4,不超,價(jià)值為5,不換}

00101

00110

00111

01110{這是最佳方案}

01111

10000{當(dāng)B(0)=1時(shí)停止,B10〕稱為哨兵}

生成B數(shù)組中數(shù)據(jù)的方法如下:

fillchar(b,sizeof(b),0);

whileb[0]=0do

beginj:=n;

whileb[j]=ldodec(j);

b[j]:=1;

fori:=j+ltondo

b:=0;

end;

小結(jié):以上每件物品只能取1件,所以取法只有0和1兩種情況,我們稱之為0、1

背包,算法的時(shí)間復(fù)雜度為0(2N),在1秒內(nèi)N只能做到20。

例1:選數(shù)(N0IP2002初中組復(fù)賽第2題)

[問(wèn)題描述]:已知n個(gè)整數(shù)xl,x2,…,xn,以及一個(gè)整數(shù)k(k<n)。從n個(gè)整數(shù)

中任選k個(gè)整數(shù)相加,可分別得到一系列的和。例如當(dāng)n=4,k=3,4個(gè)整數(shù)分別

為3,7,12,19時(shí),可得全部的組合與它們的和為:

3+7+12=223+7+19=297+12+19=383+12+19=34。

現(xiàn)在,要求你計(jì)算出和為素?cái)?shù)共有多少種。

例如上例,只有一種的和為素?cái)?shù):3+7+19=29。

[輸入]:

鍵盤(pán)輸入,格式為:

n,k(K=n<=20,k<n)

xl,x2,xn(K=xi<=5000000)

n[輸出]:

屏幕輸出,格式為:

一個(gè)整數(shù)(滿足條件的種數(shù))。

[輸入輸出樣例]:

輸入:

43

371219

輸出:

1

[算法分析]:本題應(yīng)用背包問(wèn)題中取數(shù)的方法進(jìn)行窮舉,在取數(shù)的過(guò)程中,當(dāng)B數(shù)組

中有K個(gè)1的時(shí)候?qū)?duì)應(yīng)的K個(gè)數(shù)相加,再判斷是不是素?cái)?shù)。

主要程序段如下:

readln(n,k);sum:=0;

fori:=ltondoread(a);

fillchar(b,sizeof(b),0);

whileb[0]=0do

beginj:=n;

whileb[j]=ldodec(j);

b[j]:=1;

fori:=j+ltondob:=0;

m:=0;

fori:=ltondo

ifb=lthenm:=m+l;{統(tǒng)計(jì)1的個(gè)數(shù)}

ifm=kthen

begin計(jì)算此種取數(shù)方法得到的和S;

ifS是素?cái)?shù)thensum:=sum+l;

end;

end;

例2:采藥(N0IP2005初中組復(fù)賽第3題)

【問(wèn)題描述】

辰辰是個(gè)天資聰穎的孩子,他的夢(mèng)想是成為世界上最偉大的醫(yī)師。為此,他想拜附

近最有威望的醫(yī)師為師。醫(yī)師為了判斷他的資質(zhì),給他出了一個(gè)難題。醫(yī)師把他帶

到一個(gè)到處都是草藥的山洞里對(duì)他說(shuō):“孩子,這個(gè)山洞里有一些不同的草藥,采

每一株都需要一些時(shí)間,每一株也有它自身的價(jià)值。我會(huì)給你一段時(shí)間,在這段時(shí)

間里,你可以采到一些草藥。如果你是一個(gè)聰明的孩子,你應(yīng)該可以讓采到的草藥

的總價(jià)值最大?!?/p>

如果你是辰辰,你能完成這個(gè)任務(wù)嗎?

【輸入文件】

輸入文件medic.in的第一行有兩個(gè)整數(shù)T(1<=T<=1000)和M(1〈=M〈=100),

用一個(gè)空格隔開(kāi),T代表總共能夠用來(lái)采藥的時(shí)間,M代表山洞里的草藥的數(shù)目。接

下來(lái)的M行每行包括兩個(gè)在1至U100之間(包括1和100)的整數(shù),分別表示采摘

某株草藥的時(shí)間和這株草藥的價(jià)值。

【輸出文件】

輸出文件medic,out包括一行,這一行只包含一個(gè)整數(shù),表示在規(guī)定的時(shí)間內(nèi),可

以采到的草藥的最大總價(jià)值。

【樣例輸入】

703

71100

691

12

【樣例輸出】

3

【數(shù)據(jù)規(guī)?!?/p>

對(duì)于30%的數(shù)據(jù),M<=10;

對(duì)于全部的數(shù)據(jù),M<=100o

【算法分析】本題如果采用上述方法來(lái)解,只能將M算到20,而這里M<=100,所

以只能拿30%的分?jǐn)?shù),比較好的算法是采用動(dòng)態(tài)規(guī)劃,為了能說(shuō)清算法,現(xiàn)重新舉

一個(gè)例子,若輸入:

103

34

45

56

表示背包的容量是10,有3種物品。用一個(gè)數(shù)組用來(lái)表示背包容量與其最大價(jià)值的

關(guān)系,上例中設(shè)置一個(gè)數(shù)組count,用下標(biāo)表示容量,初始化為0。然后按物品的順

序一一來(lái)統(tǒng)計(jì)此時(shí)的最大價(jià)值,每種藥品對(duì)應(yīng)各種背包容量時(shí)得到的最大價(jià)值為:

對(duì)于是第i件物品,背包容量為j時(shí)的最大價(jià)值Cmax(j)=MAX(Cmaxj,Pi+余下空間

的最大價(jià)值Cmax(j-i物品所占的空間)),如上例中,根據(jù)物品的不斷增加,各容量

背包得到的最大價(jià)值不斷替換:

容量12345678910

價(jià)值

序號(hào)0000000000

10044444444

20045559999

30045669101111

[數(shù)據(jù)結(jié)構(gòu)]time,price數(shù)組分別用來(lái)存入時(shí)間和價(jià)值,count來(lái)存入背包的價(jià)值。

var

time,price:array[1..100]oflongint;

t:longint;i,m,j:integer;

count:array[0..1000]oflongint;

begin

assign(input,?medic.in,);

assign(output,?medic.out,);

reset(input);

rewrite(output);

readln(t,m);

fori:=1tomdo

readln(time,price);

fillchar(count,sizeof(count),0);

fori:=1tomdo

forj:=tdownto1do

begin

if(j>=time)and(price+count[j-time]>count[j])then

count[j]:=price+count[j-time];

end;{j>=time表示當(dāng)前的容量能放入背包,price+count[j-time]>count[j]表示

第i件物品的價(jià)值加上第i件物品對(duì)于背包容量為j時(shí)余下空間的最大價(jià)值大于當(dāng)

前背包容量為j時(shí)的最大價(jià)值}

writein(count[t]);

close(input);

close(output);

end.

例3:開(kāi)心的金明(N0IP2006初中組復(fù)賽第2題)

題目較長(zhǎng),省略,本題與例2相比,在比較時(shí)要先將價(jià)值乘以一個(gè)數(shù),其余一樣,

但要注意的是:本題N的范圍是〈二26,如果用0、1背包窮舉法在1秒內(nèi)只能過(guò)10

個(gè)點(diǎn)中的8個(gè)點(diǎn)。

總結(jié):采用動(dòng)態(tài)規(guī)劃的時(shí)間復(fù)雜度為O(n*m),范圍比窮舉法大多了,但也有弱點(diǎn),

當(dāng)數(shù)據(jù)不是整數(shù)時(shí),就不可使用;如果還要求出具體的取法,那也相當(dāng)麻煩。

競(jìng)賽的高分的關(guān)鍵一測(cè)試

[作者:王亞峰轉(zhuǎn)貼自:河南大學(xué)附屬中學(xué)點(diǎn)擊數(shù):54文章錄入:kknd]

競(jìng)賽的高分的關(guān)鍵一測(cè)試

noip剛結(jié)束,很多同學(xué)認(rèn)為題目很容易,但是自測(cè)時(shí)卻沒(méi)有得到理想的分?jǐn)?shù),

這主要是因?yàn)楦?jìng)賽時(shí)“測(cè)試”這個(gè)環(huán)節(jié)沒(méi)有做好,作為一個(gè)。i輔導(dǎo)老師,我

介紹一下一些經(jīng)驗(yàn),供大家分享。

信息學(xué)奧林匹克競(jìng)賽中得高分的關(guān)鍵環(huán)節(jié)一一測(cè)試

河南大學(xué)附屬中學(xué)王亞峰

I、引言

中學(xué)生信息學(xué)奧林匹克競(jìng)賽是中學(xué)生奧林匹克競(jìng)賽的一個(gè)重要組成部分,和其他科目的奧林匹克競(jìng)賽相比它在

競(jìng)賽方式上和評(píng)分標(biāo)準(zhǔn)上有著很大不同。競(jìng)賽實(shí)施的方式完全是上機(jī)編程序,實(shí)踐性很強(qiáng),評(píng)分的唯一標(biāo)準(zhǔn)是

看通過(guò)測(cè)試數(shù)據(jù)的多少。通常競(jìng)賽中編寫(xiě)一個(gè)程序可以分為這樣幾個(gè)環(huán)節(jié):分析題目一設(shè)計(jì)算法和數(shù)據(jù)結(jié)構(gòu)一

編碼一調(diào)試一測(cè)試,設(shè)計(jì)測(cè)試數(shù)據(jù)的能力是競(jìng)賽考察的重點(diǎn)之一。但是很多學(xué)習(xí)信息學(xué)奧林匹克競(jìng)賽的學(xué)生和

一些教師常常只重視算法的學(xué)習(xí),忽視了“測(cè)試”這個(gè)環(huán)節(jié)。有的同學(xué)在競(jìng)賽中為了趕時(shí)間多做完一道題目,

沒(méi)有對(duì)已經(jīng)做過(guò)的題目進(jìn)行充分的測(cè)試,認(rèn)為設(shè)計(jì)測(cè)試數(shù)據(jù)是浪費(fèi)時(shí)間,所以經(jīng)常會(huì)出現(xiàn)會(huì)做的題目不得分或

者得不了滿分的情況。那么怎么才能提高程序的正確率,在競(jìng)賽中取得高分呢?

II、一些良好的習(xí)慣可以幫助提高編程正確率

眾所周知,要想提高學(xué)生編程的正確率必須要培養(yǎng)學(xué)生有一個(gè)良好的編程習(xí)慣。這些良好的習(xí)慣包括:

A、規(guī)范地書(shū)寫(xiě)程序。我們書(shū)寫(xiě)程序時(shí)要使用縮進(jìn)格式,不同層次的語(yǔ)句向后縮進(jìn)若干格,這樣可以保證程序

盡量少出語(yǔ)法錯(cuò)誤。另外,命名變量名時(shí)應(yīng)盡量有一定意義,增加程序的可讀性,調(diào)試程序時(shí)也方便。但是不

要把變量名起得太長(zhǎng),這樣會(huì)影響編程速度,可以使用一些簡(jiǎn)短的漢語(yǔ)拼音或英文縮寫(xiě),只要自己好記就可以

了。

B、編程時(shí)要使用自頂向下分析的方法和模塊化的方法??梢詫⒁恍┆?dú)立的功能例如輸入、輸出功能模塊化,

這樣在調(diào)試的時(shí)候可以逐模塊地檢查排錯(cuò),將一個(gè)大規(guī)模問(wèn)題分解成幾個(gè)小規(guī)模問(wèn)題。但是也不能盲目地將程

序分割成太多模塊,信息學(xué)奧林匹克競(jìng)賽中出的題目往往都不大,所以不必分成太多的模塊,分得太多反而會(huì)

成為累贅。模塊化的依據(jù)主要在于程序的內(nèi)在邏輯。

C、使用全局變量時(shí)要特別小心。信息學(xué)奧林匹克競(jìng)賽中的程序規(guī)模一般比較小,全局變量的使用會(huì)很頻繁,

有時(shí)全局變量可以簡(jiǎn)化編程復(fù)雜度,但是全局變量的使用也會(huì)帶來(lái)危險(xiǎn),特別是在過(guò)程或函數(shù)中改變?nèi)肿兞?/p>

的值可能會(huì)帶來(lái)不可預(yù)期的后果。例如,在深度優(yōu)先搜索中可以設(shè)一個(gè)全局的“棧”來(lái)存儲(chǔ)搜索中的狀態(tài),但

是在遞歸過(guò)程中,進(jìn)入遞歸時(shí)數(shù)據(jù)“進(jìn)?!?,回溯時(shí)數(shù)據(jù)“出棧”。在這個(gè)過(guò)程中要對(duì)全局變量“棧”和“棧

的指針”進(jìn)行操作,在這個(gè)過(guò)程中非常容易出錯(cuò),出錯(cuò)后很難檢查和調(diào)試。所以在教學(xué)中一定要給學(xué)生講清楚

全局變量和局部變量的區(qū)別,全局變量在過(guò)程或函數(shù)中被修改時(shí)對(duì)程序的影響,養(yǎng)成學(xué)生正確使用全局變量的

習(xí)慣。

III、測(cè)試是信息學(xué)奧林匹克競(jìng)賽中得高分的關(guān)鍵

養(yǎng)成良好的習(xí)慣能避免編程中的很多錯(cuò)誤,但是這還不足以能保證競(jìng)賽中編寫(xiě)的程序能通過(guò)所有的測(cè)試數(shù)據(jù),

這是因?yàn)楦?jìng)賽評(píng)測(cè)時(shí)給的標(biāo)準(zhǔn)測(cè)試數(shù)據(jù)都是相當(dāng)苛刻的,如果程序提交前沒(méi)有經(jīng)過(guò)充分的測(cè)試,很有可能不能

通過(guò)標(biāo)準(zhǔn)測(cè)試數(shù)據(jù)。學(xué)生在參加競(jìng)賽時(shí)經(jīng)常會(huì)遇到這樣的情況:競(jìng)賽完了以后感覺(jué)非常好,覺(jué)得題目不難,而

且?guī)椎李}自己都做完了,都通過(guò)了樣例數(shù)據(jù),但是等成績(jī)出來(lái)以后卻和期望中的相差甚遠(yuǎn)。使用標(biāo)準(zhǔn)測(cè)試數(shù)據(jù)

測(cè)試自己的程序后才發(fā)現(xiàn),不是某些特殊情況沒(méi)有考慮到,就是犯了小錯(cuò)誤,例如變量誤用,或者數(shù)組聲明地

太小。很多學(xué)生不止一次犯過(guò)類似這樣的錯(cuò)誤,常常因?yàn)檫@樣的錯(cuò)誤而懊悔不已,原本應(yīng)該能夠拿到的分?jǐn)?shù)卻

沒(méi)有拿到。大多數(shù)人把這種錯(cuò)誤歸咎于粗心,其實(shí)出現(xiàn)錯(cuò)誤是很正常的,無(wú)論多么擅長(zhǎng)編程的人都不可能完全

避免出錯(cuò)。那么能不能及時(shí)糾正這些由“粗心”引起的錯(cuò)誤呢?在競(jìng)賽中我們編寫(xiě)完一個(gè)題目后自己應(yīng)該設(shè)計(jì)

多組測(cè)試數(shù)據(jù)來(lái)測(cè)試自己的程序從而找到程序中隱藏的錯(cuò)誤,測(cè)試是編程時(shí)的“把門(mén)將軍”,他可以將錯(cuò)誤拒

之門(mén)外,測(cè)試進(jìn)行得越充分,程序的正確率就越高,所以“測(cè)試”這一環(huán)節(jié)是競(jìng)賽中得高分的關(guān)鍵。

程序結(jié)構(gòu)組織的技巧

[作者:風(fēng)清云淡轉(zhuǎn)貼自:網(wǎng)絡(luò)博客點(diǎn)擊數(shù):28文章錄入:kknd]

1概述

1)自頂向下,逐步求精

意思就是,先寫(xiě)主程序,需要用子程序的地方盡管調(diào)用(雖然子程序還沒(méi)有寫(xiě)),

直至完成主程序的框架(頂)。下面再分別完成各各子程序。

這樣做的好處很明顯:思路連貫,清晰,從全局入手,不會(huì)被眾多小問(wèn)題弄的

暈頭轉(zhuǎn)向。靜態(tài)查錯(cuò)和調(diào)試也非常方便,程序可讀性也極強(qiáng)。

2)子程序的大小

學(xué)過(guò)一點(diǎn)軟件工程基本知識(shí)的同學(xué)應(yīng)該知道,子程序因?yàn)槠鸬搅朔指顔?wèn)題的作用

會(huì)降低編程復(fù)雜度,但過(guò)多的子程序會(huì)因?yàn)榻涌诠ぷ鲙?lái)額外的程序量。我不

想借用那種N行一個(gè)子程序的建議,只是希望大家注意,子程序不能太多。常用

的代碼寫(xiě)成子程序就可以了。

3)子程序的相互依賴關(guān)系。

我不想深入展開(kāi),只是提醒大家,少用全局變量,減少依賴性,增加獨(dú)立性。這

會(huì)給調(diào)試帶來(lái)極大的方便。

4)競(jìng)賽需要簡(jiǎn)潔和清晰的統(tǒng)一

一般來(lái)說(shuō),競(jìng)賽時(shí)更看中簡(jiǎn)潔,因?yàn)樯婕暗骄幊虖?fù)雜度和調(diào)試復(fù)雜度,所以過(guò)程不易太多。

[b]2美化你的程序

這是一個(gè)值得深入研究的問(wèn)題。我在這里只是講一點(diǎn)皮毛,給初學(xué)者引引路,

幫你們找到“感覺(jué)”。

源程序是給人看的。

不只有你是人,因此程序要讓第二個(gè)人也能看懂

我知道你不想讓別人看到你的程序,但N年以后可能你自己都看不懂了...

所以,我給你一些建議:

a.縮進(jìn)式。就是每個(gè)層次空兩格(也不一定是2格,看你的習(xí)慣了)。如:

fori:=1tondo

forj:=1tondo

ifi+j>5then

begin

i:=i+l;

j:=j-2;

end;

就寫(xiě)成:

fori:=1tondo

forj:=1tondo

ifi+j>5then

begin

i:=i+1;

j:=j-2;

end;

這樣層次很清楚,也比較好看一點(diǎn)。

b.給變量取好記的名字。

如:i,j:循環(huán)變量

total:累加器

best:當(dāng)前最優(yōu)值

等等。主要也是看你的習(xí)慣了。注意一定不要引起混淆。

例如一個(gè)變量叫num,一個(gè)叫number,就難免會(huì)用錯(cuò)。

c.善用子程序。

例如:

begin

Init;

fori:=1tondo

begin

Analyse(i);

Process(i);

AddToResult(i);

end;

end.

程序的作用和結(jié)構(gòu)很明顯,如果把init(),analyse0,process().addtoresult()代碼放在這里,

就會(huì)顯得非常臃腫,分不清哪些代碼是干什么的,而且很不利于單獨(dú)調(diào)試。

程序調(diào)試技巧

[作者:風(fēng)清云淡轉(zhuǎn)貼自:網(wǎng)絡(luò)博客點(diǎn)擊數(shù):28文章錄入:kknd]

1調(diào)試技巧

調(diào)試之前,先要靜態(tài)查錯(cuò)。

1.看算法是否正確(其實(shí)應(yīng)該是在編碼之前做的工作)

2.看有沒(méi)有筆誤(如i寫(xiě)成j)

調(diào)試一般是分幾個(gè)步驟的。先把開(kāi)關(guān)R,S,Q,I打開(kāi)!

1.建立測(cè)試數(shù)據(jù)(技巧見(jiàn)后面的文章),可以

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(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)論