版權(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年度私人診所護(hù)士護(hù)理咨詢與聘用合同3篇
- 二零二五年廢石資源采購(gòu)與資源再生利用合同6篇
- 2025年度硅藻泥原材料采購(gòu)合同3篇
- 二零二五年度城市環(huán)境綜合整治招投標(biāo)合同3篇
- 2025年度福樂(lè)鍋爐產(chǎn)品銷售業(yè)績(jī)獎(jiǎng)勵(lì)合同2篇
- 海南衛(wèi)生健康職業(yè)學(xué)院《園林植物病理學(xué)》2023-2024學(xué)年第一學(xué)期期末試卷
- 二零二五年度商業(yè)地產(chǎn)改造項(xiàng)目合作開(kāi)發(fā)協(xié)議書(shū)3篇
- 課程設(shè)計(jì)目標(biāo)的基本方式
- 二零二五年度房地產(chǎn)沙盤(pán)模型制作與物聯(lián)網(wǎng)技術(shù)應(yīng)用合同3篇
- 消色差物鏡課程設(shè)計(jì)
- 《水下拋石基床振動(dòng)夯實(shí)及整平施工規(guī)程》
- 現(xiàn)代學(xué)徒制課題:數(shù)字化轉(zhuǎn)型背景下新型師徒關(guān)系構(gòu)建研究(附:研究思路模板、可修改技術(shù)路線圖)
- 9.2溶解度(第2課時(shí))-2024-2025學(xué)年九年級(jí)化學(xué)人教版(2024)下冊(cè)
- 安徽省合肥市包河區(qū)2023-2024學(xué)年三年級(jí)上學(xué)期語(yǔ)文期末試卷
- 2024版食源性疾病培訓(xùn)完整課件
- 兒童傳染病預(yù)防課件
- 2025年中國(guó)蛋糕行業(yè)市場(chǎng)規(guī)模及發(fā)展前景研究報(bào)告(智研咨詢發(fā)布)
- 護(hù)理組長(zhǎng)年底述職報(bào)告
- 巨量引擎合同范本
- 《住院患者身體約束的護(hù)理》團(tuán)體標(biāo)準(zhǔn)解讀課件
- 初中語(yǔ)文:非連續(xù)性文本閱讀練習(xí)(含答案)
評(píng)論
0/150
提交評(píng)論