第一篇:LabVIEW FPGA編程小結(jié)
LabVIEW FPGA編程小結(jié)
NI PXI-7813R為FPGA卡,板卡上引出4個(gè)端口,每個(gè)端口有40路引腳,共160路DIO,使用LabVIEW FPGA模塊進(jìn)行編程控制。當(dāng)FPGA程序復(fù)雜度變大或是使用的DIO端口數(shù)增多時(shí),可能面臨的主要問(wèn)題包括FPGA空間不夠用以及實(shí)際循環(huán)時(shí)間過(guò)長(zhǎng)等。之前編寫(xiě)的 FPGA程序示意圖如下,采集循環(huán)與輸出循環(huán)獨(dú)立,均采用控件形式與RT程序通訊,兩塊板卡均使用了近120路DIO口?;?813R板卡編程實(shí)踐及涉及到的幾個(gè)瓶頸問(wèn)題,簡(jiǎn)要做了一下總結(jié):
1)使用FIFO還是使用控件?
FPGA與RT通訊時(shí),常用的方法是使用讀寫(xiě)FIFO或是使用輸入輸出控件。這兩者的特點(diǎn)是:
a)兩者在速度上無(wú)明顯差別。這是建立在不使用For循環(huán)的基礎(chǔ)上的,但實(shí)際中FIFO通常都要配合For循環(huán)來(lái)使用,F(xiàn)or循環(huán)相當(dāng)于串行操作,當(dāng)同類端口較多時(shí),使用for將導(dǎo)致循環(huán)時(shí)間變長(zhǎng),故運(yùn)行速度上FIFO并沒(méi)有多少優(yōu)勢(shì)。b)FIFO使用合理時(shí)不丟數(shù),而控件不能保證。
通過(guò)配置FPGA與RT中讀寫(xiě)FIFO的超時(shí)以及FIFO大小,讀寫(xiě)方式等手段,通??杀WCFIFO傳遞數(shù)據(jù)不丟數(shù)(可能要經(jīng)過(guò)多次嘗試);而使用控件則可能會(huì)有丟數(shù)的情況。當(dāng)不嚴(yán)格要求每次while循環(huán)都不丟數(shù)時(shí),可考慮使用控件,例如對(duì)DO輸出的配置,用戶可能很久才會(huì)去配置一次,而且配置后不會(huì)要求馬上生效,稍微晚幾個(gè)循環(huán)周期(us級(jí))再使配置生效也不會(huì)有很大影響,這種時(shí)候使用讀取控件值是合理的。c)FIFO可使用的數(shù)據(jù)類型有限,而控件幾乎無(wú)限制。
就7813R而言,F(xiàn)IFO只能傳遞指定的幾種類型的數(shù)據(jù),而使用控件時(shí),可使用包括簇?cái)?shù)組在內(nèi)的自定義控件。
所以,還是根據(jù)實(shí)際需要來(lái)選擇吧,雖然這句話跟沒(méi)說(shuō)一樣~ 2)用不用For循環(huán)?
端口較多時(shí),很容易就遇到連續(xù)幾個(gè)都是要求采集脈寬的,而另外連續(xù)幾個(gè)要求采集電平即可。這時(shí)候很自然想到使用For循環(huán)對(duì)多個(gè)端口一起進(jìn)行操作,例如下圖:
如上面所說(shuō),使用FOR循環(huán)相當(dāng)于使端口操作(上圖中所說(shuō)的操作是指將采集到的布爾轉(zhuǎn)成U32數(shù)值)變?yōu)榇校涣硗?,要使用For,通常就得配合數(shù)組操作,例如上圖中創(chuàng)建數(shù)組等,這樣就更加導(dǎo)致循環(huán)時(shí)間變長(zhǎng)。當(dāng)發(fā)現(xiàn)循環(huán)時(shí)間不滿足使用要求時(shí),這種處理方法可能就不能使用了,每一路單獨(dú)處理就省掉了創(chuàng)建數(shù)組及For,節(jié)省了循環(huán)時(shí)間,但這樣又使重復(fù)代碼變多,工作量加大。
3)怎么使用子VI?
輸出脈沖時(shí),脈沖的產(chǎn)生可以封裝成一個(gè)子VI,供多路端口進(jìn)行使用;采集脈寬時(shí),脈寬采集可以封裝成一個(gè)子VI供多路端口進(jìn)行調(diào)用。然而,默認(rèn)情況下,子VI的執(zhí)行是串行的(因?yàn)椴](méi)有設(shè)置VI屬性為“可重入執(zhí)行”),子VI在同一時(shí)間內(nèi)只能被一路端口所占用,可能導(dǎo)致的結(jié)果是循環(huán)時(shí)間變長(zhǎng),精度降低。如果設(shè)置子VI為可重入執(zhí)行,又可能導(dǎo)致FPGA空間占用率過(guò)高,編譯無(wú)法通過(guò)。我想到的一種折中的辦法是:使用幾個(gè)程序框圖一樣的子VI(功能完全一樣,將子VI多另存為幾個(gè)所生成)來(lái)代替原先一個(gè)子VI,替換之后,相當(dāng)于減少了串行運(yùn)行的子VI數(shù)量,循環(huán)用時(shí)減少明顯。下圖中使用6個(gè)子VI A,如果用2個(gè)B與2個(gè)C替換其中的4個(gè)A,循環(huán)時(shí)間可能減少為原來(lái)的1/3。
While循環(huán)方式1:子VI A子VI A子VI A子VI A子VI A子VI AWhile循環(huán)方式2:子VI A子VI A子VI B子VI B子VI C子VI C
4)精打細(xì)算
這一點(diǎn)可能只會(huì)在FPGA空間不夠用時(shí)才會(huì)被重視,下圖是邏輯片不夠用時(shí)導(dǎo)致的FPGA編譯失敗錯(cuò)誤:
因此,當(dāng)資源有限時(shí),盡量使用能滿足使用要求的最小長(zhǎng)度的數(shù)據(jù)類型來(lái)實(shí)現(xiàn),能使用U16滿足要求的堅(jiān)決不用U32!另一方面,暫時(shí)還沒(méi)有發(fā)現(xiàn)數(shù)據(jù)類型變長(zhǎng)時(shí)對(duì)FPGA循環(huán)運(yùn)行時(shí)間產(chǎn)生明顯影響。
5)循環(huán)延時(shí)考慮
脈沖輸出及采集均需要根據(jù)實(shí)際循環(huán)時(shí)間來(lái)計(jì)算,若參與運(yùn)算的值不是實(shí)際的循環(huán)時(shí)間,輸出或采集的結(jié)果自然不會(huì)準(zhǔn)確。例如可配置脈沖或電平輸出的端口,若輸出電平,其算法簡(jiǎn)單,所需時(shí)間較少,而配置為脈沖輸出時(shí),算法復(fù)雜。配置為單路脈沖輸出可能不會(huì)有明顯的影響循環(huán)時(shí)間,但當(dāng)多路脈沖一起輸出時(shí),可能影響到循環(huán)時(shí)間增加1~2us甚至更長(zhǎng)。故實(shí)際配置循環(huán)時(shí)間時(shí),需按照可能的最復(fù)雜算法進(jìn)行運(yùn)行測(cè)試,并依此來(lái)設(shè)置循環(huán)時(shí)間,以保證循環(huán)時(shí)間的確定性已經(jīng)算法運(yùn)算的正確性。
總而言之,設(shè)計(jì)時(shí)還是應(yīng)該根據(jù)實(shí)際需要,綜合考慮數(shù)據(jù)完整性、FPGA板卡資源大小、循環(huán)時(shí)間等因素,已達(dá)到滿意效果。
第二篇:編程小結(jié)
編程小結(jié)
(一)一.累加:加數(shù)1+加數(shù)2+加數(shù)3+??+加數(shù)n(n個(gè)加數(shù)相加)假設(shè)我們用i表示我們的加數(shù)數(shù)目,例如:當(dāng)i=9時(shí),就表示加數(shù)9 模版:int i,sum=0;(注意:如果是分?jǐn)?shù)或者小數(shù)sum就是float類型)
for(i=1;i<=n;i++)(注意:循環(huán)變量的初值和遞變規(guī)律,也有
可能是i--,或者i+=2等等){通項(xiàng)a;(通項(xiàng):用一個(gè)通用的式子表示所有的加數(shù))sum+=a;} printf(“%d”,sum);(注意:如果是float類型就是%f)
1、求1+2+3??+100的和,則通項(xiàng)a就是i。
分析:因?yàn)閍就是i的值,所以這里不需要通項(xiàng)這一行了,因此整個(gè)大括號(hào)中間就只有一句話,所以大括號(hào)可以省略。整理之后就是: int i,sum=0;for(i=1;i<=100;i++)sum+=i;printf(“%d”,sum);
2、求2+4+6??+100的和。
分析:因?yàn)閍就是i的值,所以這里不需要通項(xiàng)這一行了,因此整個(gè)大括號(hào)中間就只有一句話,所以大括號(hào)可以省略,再分析,再分析我們發(fā)現(xiàn)每個(gè)加數(shù)都是偶數(shù),那么i的變化就是i+=2,并且i是從2開(kāi)始變化,那么在賦值的時(shí)候就應(yīng)該是i=2。整理之后就是: int i,sum=0;for(i=2;i<=100;i+=2)sum+=i;printf(“%d”,sum);
3、求1+3+5??+99的和。
分析:因?yàn)閍就是i的值,所以這里不需要通項(xiàng)這一行了,因此整個(gè)大括號(hào)中間就只有一句話,所以大括號(hào)可以省略,再分析,再分析我們發(fā)現(xiàn)每個(gè)加數(shù)都是奇數(shù),那么i的變化就是i+=2。整理之后就是: int i,sum=0;for(i=1;i<=100;i+=2)sum+=i;printf(“%d”,sum);
4、求1+5+9+13+17+??的前100項(xiàng)的和,則通項(xiàng)為j+4,則程序?yàn)椋?int i,sum=0,j=1;for(i=1;i<=100;i++){ sum+=j;j=j+4; } printf(“%d”,sum);因?yàn)榧訑?shù)的第一項(xiàng)是1,所以賦初值的時(shí)候j=1,然后加數(shù)進(jìn)行變化,變成5加到sum里面,所以這里要將通項(xiàng)和求和這兩句話互換位置。
5、求1+4+9+16+??的前100項(xiàng)的和
分析可知:每個(gè)加數(shù)就是對(duì)應(yīng)的加數(shù)數(shù)目的平方,則通項(xiàng)為i*i,則程序?yàn)椋?int i,sum=0;for(i=1;i<=100;i++)sum+= i*i;printf(“%d”,sum);
6、求1+(1+2)+(1+2+3)+(1+2+3+4)+??的前100項(xiàng)的和。
分析可知每一個(gè)加數(shù)本身又是一個(gè)累加的式子,進(jìn)一步觀察可以發(fā)現(xiàn),每個(gè)累加的式子都是加到這個(gè)加數(shù)所在的加數(shù)數(shù)目,即第35個(gè)加數(shù)就是1+2+3??+35,并且是在前面一個(gè)加數(shù)的基礎(chǔ)上加上這個(gè)加數(shù)所在的加數(shù)數(shù)目,也就是說(shuō)第36個(gè)加數(shù)就是在前一個(gè)加數(shù)的基礎(chǔ)上加上36,即:1+2+3??+35+36。假設(shè)第k個(gè)加數(shù)是j,那么第k+1個(gè)加數(shù)就可以表示為j+(k+1),然后第k+2個(gè)加數(shù)就是j+(k+1)+(k+2)??那么我們的通項(xiàng)就可以表示為a=a+i,則程序?yàn)椋?int i,sum=0, a=0;for(i=1;i<=100;i++){ a+=i;sum+=a;} printf(“%d”,sum);
7、求1+1+2+3+5+8+13+21+??的前100項(xiàng)的和。
分析可知從第三個(gè)加數(shù)開(kāi)始,每一個(gè)加數(shù)是其前兩個(gè)加數(shù)之和,假設(shè)第k個(gè)加數(shù)是m,第k+1個(gè)加數(shù)是n,然后第k+2個(gè)加數(shù)就是m+n,那么我們的通項(xiàng)就可以表示為a=m+n,但是要注意每次加數(shù)所對(duì)應(yīng)的m和n不一樣,所以我們要在求出每個(gè)加數(shù)之后,找出其對(duì)應(yīng)的m和n;再分析我們可以發(fā)現(xiàn)當(dāng)前的n是下一次的m,當(dāng)前的加數(shù)a是下一次的n,假設(shè)接著上面的推導(dǎo),那么第k+3個(gè)加數(shù)就是n+(m+n),對(duì)應(yīng)我們的通項(xiàng)a=m+n,理解前面一句話。則程序?yàn)椋?int i,sum=0, m=1,n=1,a;for(i=3;i<=100;i++){ a=m+n;sum+=a;m=n;n=a;} printf(“%d”,sum);
8、求1+1/2+1/3+??+1/100 分析可知每一個(gè)加數(shù)就是我們的加數(shù)數(shù)目的倒數(shù),則通項(xiàng)a就是1/i,我們說(shuō)循環(huán)變量i一般定義為整型,那么1/i的結(jié)果就是整型,這樣的話小數(shù)點(diǎn)后面的就會(huì)被省略,所以正確的應(yīng)該寫(xiě)為a=1.0/i,則程序?yàn)椋?/p>
int i;float sum=0;for(i=1;i<=100;i++){a=1.0/i;sum+=a;} printf(“%f”,sum);
9、求1+1/2+2/3+3/5+5/8+??的前100項(xiàng)的和。
分析可從第三個(gè)加數(shù)開(kāi)始觀察,每一個(gè)加數(shù)的分母是其前一個(gè)加數(shù)的分子和分母之和,每一個(gè)加數(shù)的分子是其前一個(gè)加數(shù)的分母??梢詫⒌谝粋€(gè)加數(shù)看成1/1,那么第二個(gè)加數(shù)也符合我們的規(guī)律,只有第一個(gè)不符合,那么我們可以先將第一個(gè)加數(shù)加到sum,然后再變下一個(gè)加數(shù),但是要注意每次加數(shù)所對(duì)應(yīng)的分子和分母不一樣,所以我們要在求出每個(gè)加數(shù)之后,找出下一個(gè)加數(shù)所對(duì)應(yīng)的分子和分母。設(shè)通項(xiàng)表示為a=m/n, 那么下一個(gè)加數(shù)是n/(m+n),然后下下一個(gè)加數(shù)就是(m+n)/(m+n+n);再分析我們可以發(fā)現(xiàn)當(dāng)前的分子和分母之和(m+n)是下一次的分母n,當(dāng)前的分母n是下一次的分子m,注意這里在做數(shù)據(jù)交換的時(shí)候需要中間變量,對(duì)應(yīng)我們的通項(xiàng)a=m/n,理解前面一句話。則程序?yàn)椋?int i;float sum=0, m=1,n=1,t;for(i=1;i<=100;i++){ sum+=m/n;t=m+n;m=n;n=t;} printf(“%f”,sum);
二.累乘:乘數(shù)1*乘數(shù)2*乘數(shù)3*??*乘數(shù)n(n個(gè)乘數(shù)相乘)假設(shè)我們用i表示我們的乘數(shù)數(shù)目,例如:當(dāng)i=9時(shí),就表示乘數(shù)9 模版:int i,sum=1;(注意:如果是分?jǐn)?shù)或者小數(shù)sum就是float類型)
for(i=1;i<=n;i++)(注意:循環(huán)變量的初值和遞變規(guī)律,也有
可能是i--,或者i+=2等等){通項(xiàng)a;(通項(xiàng):用一個(gè)通用的式子表示所有的乘數(shù))sum*=a;} printf(“%d”,sum);(注意:如果是float類型就是%f)
1、求1*2*3??*100的積,則通項(xiàng)a就是i。
分析:因?yàn)閍就是i的值,所以這里不需要通項(xiàng)這一行了,因此整個(gè)大括號(hào)中間就只有一句話,所以大括號(hào)可以省略。整理之后就是: int i,sum=1;for(i=1;i<=100;i**)sum*=i;printf(“%d”,sum);
2、求2*4*6??*100的和。分析:因?yàn)閍就是i的值,所以這里不需要通項(xiàng)這一行了,因此整個(gè)大括號(hào)中間就只有一句話,所以大括號(hào)可以省略,再分析,再分析我們發(fā)現(xiàn)每個(gè)乘數(shù)都是偶數(shù),那么i的變化就是i+=2,并且i是從2開(kāi)始變化,那么在賦值的時(shí)候就應(yīng)該是i=2。整理之后就是: int i,sum=1;for(i=2;i<=100;i+=2)sum*=i;printf(“%d”,sum);
3、求1*3*5??*99的和。
分析:因?yàn)閍就是i的值,所以這里不需要通項(xiàng)這一行了,因此整個(gè)大括號(hào)中間就只有一句話,所以大括號(hào)可以省略,再分析,再分析我們發(fā)現(xiàn)每個(gè)乘數(shù)都是奇數(shù),那么i的變化就是i+=2。整理之后就是: int i,sum=1;for(i=1;i<=100;i+=2)sum*=i;printf(“%d”,sum);
4、求1*5*9*13*17*??的前100項(xiàng)的積,則通項(xiàng)為j*4,則程序?yàn)椋?分析:因?yàn)槌藬?shù)的第一項(xiàng)是1,所以賦初值的時(shí)候j=1,然后乘數(shù)進(jìn)行變化,變成5乘到sum里面,所以這里要將通項(xiàng)和求積這兩句話互換位置。
int i,sum=1,j=1;for(i=1;i<=100;i**){ sum*=j;j=j*4; } printf(“%d”,sum);
5、求1*4*9*16*??的前100項(xiàng)的積
分析可知:每個(gè)乘數(shù)就是對(duì)應(yīng)的乘數(shù)數(shù)目的平方,則通項(xiàng)為i*i,則程序?yàn)椋?int i,sum=1;for(i=1;i<=100;i**)sum*= i*i;printf(“%d”,sum);
6、求1*(1*2)*(1*2*3)*(1*2*3*4)*??的前100項(xiàng)的積。分析可知每一個(gè)乘數(shù)本身又是一個(gè)累乘的式子,進(jìn)一步觀察可以發(fā)現(xiàn),每個(gè)累乘的式子都是乘到這個(gè)乘數(shù)所在的乘數(shù)數(shù)目,即第35個(gè)乘數(shù)就是1*2*3??*35,并且是在前面一個(gè)乘數(shù)的基礎(chǔ)上乘上這個(gè)乘數(shù)所在的乘數(shù)數(shù)目,也就是說(shuō)第36個(gè)乘數(shù)就是在前一個(gè)乘數(shù)的基礎(chǔ)上乘上36,即:1*2*3??*35*36。假設(shè)第k個(gè)乘數(shù)是j,那么第k+1個(gè)乘數(shù)就可以表示為j*(k+1),然后第k+2個(gè)乘數(shù)就是j*(k+1)*(k+2)??那么我們的通項(xiàng)就可以表示為a=a*i,則程序?yàn)椋?int i,sum=1, a=0;for(i=1;i<=100;i**){ a*=i;sum*=a;} printf(“%d”,sum);
7、求1*1*2*3*5*8*13*21*??的前100項(xiàng)的積。
分析可知從第三個(gè)乘數(shù)開(kāi)始,每一個(gè)乘數(shù)是其前兩個(gè)乘數(shù)之和,假設(shè)第k個(gè)乘數(shù)是m,第k+1個(gè)乘數(shù)是n,然后第k+2個(gè)乘數(shù)就是m+n,那么我們的通項(xiàng)就可以表示為a=m+n,但是要注意每次乘數(shù)所對(duì)應(yīng)的m和n不一樣,所以我們要在求出每個(gè)乘數(shù)之后,找出其對(duì)應(yīng)的m和n;再分析我們可以發(fā)現(xiàn)當(dāng)前的n是下一次的m,當(dāng)前的乘數(shù)a是下一次的n,假設(shè)接著上面的推導(dǎo),那么第k+3個(gè)乘數(shù)就是n*(m+n),對(duì)應(yīng)我們的通項(xiàng)a=m*n,理解前面一句話。則程序?yàn)椋?int i,sum=1, m=1,n=1,a;for(i=3;i<=100;i**){ a=m+n;sum*=a;m=n;n=a;} printf(“%d”,sum);
8、求1*1/2*1/3*??*1/100 分析可知每一個(gè)乘數(shù)就是我們的乘數(shù)數(shù)目的倒數(shù),則通項(xiàng)a就是1/i,我們說(shuō)循環(huán)變量i一般定義為整型,那么1/i的結(jié)果就是整型,這樣的話小數(shù)點(diǎn)后面的就會(huì)被省略,所以正確的應(yīng)該寫(xiě)為a=1.0/i,則程序?yàn)椋?/p>
int i;float sum=1;for(i=1;i<=100;i**){a=1.0/i;sum*=a;} printf(“%f”,sum);
9、求1*1/2*2/3*3/5*5/8*??的前100項(xiàng)的積。
分析可從第三個(gè)乘數(shù)開(kāi)始觀察,每一個(gè)乘數(shù)的分母是其前一個(gè)乘數(shù)的分子和分母之和,每一個(gè)乘數(shù)的分子是其前一個(gè)乘數(shù)的分母。可以將第一個(gè)乘數(shù)看成1/1,那么第二個(gè)乘數(shù)也符合我們的規(guī)律,只有第一個(gè)不符合,那么我們可以先將第一個(gè)乘數(shù)乘到sum,然后再變下一個(gè)乘數(shù),但是要注意每次乘數(shù)所對(duì)應(yīng)的分子和分母不一樣,所以我們要在求出每個(gè)乘數(shù)之后,找出下一個(gè)乘數(shù)所對(duì)應(yīng)的分子和分母。設(shè)通項(xiàng)表示為a=m/n, 那么下一個(gè)乘數(shù)是n/(m+n),然后下下一個(gè)乘數(shù)就是(m+n)/(m+n+n);再分析我們可以發(fā)現(xiàn)當(dāng)前的分子和分母之和(m+n)是下一次的分母n,當(dāng)前的分母n是下一次的分子m,注意這里在做數(shù)據(jù)交換的時(shí)候需要中間變量,對(duì)應(yīng)我們的通項(xiàng)a=m/n,理解前面一句話。則程序?yàn)椋?int i;float sum=1, m=1,n=1,t;for(i=1;i<=100;i**){ sum*=m/n;t=m+n;m=n;n=t;} printf(“%f”,sum);
10、求1+(1*2)+(1*2*3)+(1*2*3*4)+??的前100項(xiàng)的和。
分析可知每一個(gè)加數(shù)本身是一個(gè)累乘的式子,進(jìn)一步觀察可以發(fā)現(xiàn),每個(gè)累乘的式子都是乘到這個(gè)乘數(shù)所在的乘數(shù)數(shù)目,即第35個(gè)乘數(shù)就是1*2*3??*35,并且是在前面一個(gè)乘數(shù)的基礎(chǔ)上乘上這個(gè)乘數(shù)所在的乘數(shù)數(shù)目,也就是說(shuō)第36個(gè)乘數(shù)就是在前一個(gè)乘數(shù)的基礎(chǔ)上乘上36,即:1*2*3??*35*36。假設(shè)第k個(gè)乘數(shù)是j,那么第k+1個(gè)乘數(shù)就可以表示為j*(k+1),然后第k+2個(gè)乘數(shù)就是j*(k+1)*(k+2)??那么我們的通項(xiàng)就可以表示為a=a*i,再利用累加的模版,則程序?yàn)椋?/p>
int i,sum=0, a=1;for(i=1;i<=100;i**){ a*=i;sum+=a;} printf(“%d”,sum);
11、求1*(1+2)*(1+2+3)*(1+2+3+4)*??的前100項(xiàng)的積。
分析可知每一個(gè)乘數(shù)本身又是一個(gè)累加的式子,進(jìn)一步觀察可以發(fā)現(xiàn),每個(gè)累加的式子都是加到這個(gè)乘數(shù)所在的乘數(shù)數(shù)目,即第35個(gè)乘數(shù)就是1+2+3??+35,并且是在前面一個(gè)乘數(shù)的基礎(chǔ)上加上這個(gè)乘數(shù)所在的乘數(shù)數(shù)目,也就是說(shuō)第36個(gè)乘數(shù)就是在前一個(gè)乘數(shù)的基礎(chǔ)上加上36,即:1+2+3??+35+36。假設(shè)第k個(gè)乘數(shù)是j,那么第k+1個(gè)乘數(shù)就可以表示為j+(k+1),然后第k+2個(gè)乘數(shù)就是j+(k+1)+(k+2)??那么我們的通項(xiàng)就可以表示為a=a+i, 再利用累乘的模版,則程序?yàn)椋?/p>
int i,sum=1, a=0;for(i=1;i<=100;i**){ a+=i;sum*=a;} printf(“%d”,sum);
三.最大值和最小值:數(shù)字0,數(shù)字1,數(shù)字2,??數(shù)字n-1(一共n個(gè)數(shù)字)假設(shè)我們用i表示我們的數(shù)字所在的位置,并且第一個(gè)位置是0,例如:當(dāng)i=9時(shí),就表示這個(gè)數(shù)字在第10個(gè)位子
模版: int i,max,a[n];(注意:如果是分?jǐn)?shù)或者小數(shù)max和a[n]就是float
類型,注意這里定義的時(shí)候根據(jù)題目所給的具體數(shù)字把n換掉,千萬(wàn)不可以寫(xiě)a[n]o哦~~~~)
for(i=0;i 了數(shù)字,就在定義的時(shí)候直接賦值,這個(gè)循環(huán)就不需要了;如果要求產(chǎn)生給數(shù)組賦a到b之間的隨機(jī)數(shù),那么就用a[i]= a + rand()%(b-a);這句話代替這句。注意如果是float類型就是%f)max=a[0];for(i=0;i 1、求20個(gè)數(shù)字的最大值和最小值,要求賦1到100之間的隨機(jī)數(shù),并且輸出它們及其下標(biāo)。 分析:因?yàn)檫@里還要輸出其下標(biāo),所以還有定義一個(gè)row來(lái)存放,并且要對(duì)其賦值為0,因?yàn)槲覀兘omax賦值為a[0],則程序?yàn)椋?/p> int i,max,min,a[20],row1=0,row2=0;for(i=0;i<20;i++)a[i]= 1+rand()%99;max=a[0];min=a[0];for(i=0;i<20;i++){ if(maxa[i])(這里是找出最小值){ min=a[i];row2=i;} } printf(“max =%d, row=%dn min =%d, row=%dn”, max,row1,min,row2); 2、求4*5矩陣的最大值和最小值,要求賦值隨機(jī)數(shù),并且輸出它們及其下標(biāo)。分析:雖然這是一個(gè)二維的數(shù)組,但是其思路仍然和一維數(shù)組的一樣,區(qū)別只是這里需要用嵌套循環(huán)。要求還要輸出其下標(biāo),二維數(shù)組的下標(biāo)是兩個(gè),所以還要定義一個(gè)row和一個(gè)col來(lái)存放,并且要對(duì)它們賦值為0,因?yàn)槲覀兘omax賦值為a[0] [0],則程序?yàn)椋?/p> int i,j,max,min,a[4] [5],row1=0,row2=0,col1=0,col2=0;for(i=0;i<4;i++)for(j=0;j<5;j++)a[i] [j]=rand();max=a[0] [0];min=a[0] [0];for(i=0;i<4;i++)for(j=0;j<5;j++){ if(maxa[i] [j])(這里是找出最小值){ min=a[i] [j];row2=i;col2=j;} } printf(“max =%d, row=%d, col=%d n min =%d, row=%d, col=%d n”, max,row1, col1, min,row2, col2); 3、求4*5矩陣的每一行最大值和最小值,要求賦值隨機(jī)數(shù),并且輸出它們及其下標(biāo)。 分析:雖然這是一個(gè)二維的數(shù)組,但是要求的是每一行的最大最小值,我們知道二維數(shù)組的每一行本身就是一個(gè)數(shù)組,那么我們就還需要一個(gè)控制行數(shù)的循環(huán)。要求還要輸出其下標(biāo),二維數(shù)組的下標(biāo)是兩個(gè),每一行的最大最小值其行號(hào)不就是i,所以還要定義一個(gè)存放列號(hào)的col,并且要對(duì)它賦值為0,因?yàn)槲覀兘omax賦值為每一行的第一個(gè)元素,也就是a[i] [0],則程序?yàn)椋?int i,j,max,min,a[4] [5],col1=0,col2=0;for(i=0;i<4;i++)for(j=0;j<5;j++)a[i] [j]=rand();for(i=0;i<4;i++)(這個(gè)循環(huán)是控制行的,里面的循環(huán)體本身就是一個(gè)求 一維數(shù)組的最大最小值的程序) {max=a[i] [0];min=a[i] [0];for(j=0;j<5;j++){ if(maxa[i] [j])(這里是找出最小值){ min=a[i] [j];col2=j;} } printf(“max =%d, row=%d, col=%d n min =%d, row=%d, col=%d n”,max,i, col1, min,i, col2);} 4、求4*5矩陣的每一列最大值和最小值,要求賦值隨機(jī)數(shù),并且輸出它們及其下標(biāo)。 分析:雖然這是一個(gè)二維的數(shù)組,但是要求的是每一列的最大最小值,二維數(shù)組的每一列可以看成一個(gè)數(shù)組,那么我們就還需要一個(gè)控制列數(shù)的循環(huán)。要求還要輸出其下標(biāo),二維數(shù)組的下標(biāo)是兩個(gè),每一列的最大最小值其列號(hào)不就是j,所以還要定義一個(gè)存放行號(hào)的row,并且要對(duì)它賦值為0,因?yàn)槲覀兘omax賦值為每一列的第一個(gè)元素,也就是a[0] [j],則程序?yàn)椋?int i,j,max,min,a[4] [5],row1=0,row2=0;for(i=0;i<4;i++)for(j=0;j<5;j++)a[i] [j]=rand();for(j=0;j<5;j++)(這個(gè)循環(huán)是控制列的,里面的循環(huán)體本身就是一個(gè)求 一維數(shù)組的最大最小值的程序){max=a[0] [j];min=a[0] [j];for(i=0;i<4;i++){ if(maxa[i] [j])(這里是找出最小值){ min=a[i] [j];row2=i;} } printf(“max =%d, row=%d, col=%d n min =%d, row=%d, col=%d n”,max, row1,j, min, row2,j);} 5、排序(冒泡法)比如說(shuō) 對(duì)于5個(gè)數(shù)字排序,首先要把5個(gè)數(shù)字放到一個(gè)一維的數(shù)組里面去 所以編程的前幾句為:int a[5] for(i=0;i<5;i++)scanf(“%d”,&a*i+); 那接下來(lái)就是排序了,為了方便理解就將數(shù)組實(shí)際化:比如 a[5]里面放著{7,9,0,12,3}那畫(huà)圖出來(lái)就是 a[5] a[0] a[1] a[2] a[3] a[4] ????????????那我們排序的方法是這樣的采用這樣幾步: 1,用a[0]與后面的(a[1]~a[4]里面的每一個(gè)成員比較即是說(shuō):a[0]~a[1]比較 a[0]~a[2]比較 a[0]~a[3]比較 a[0]~a[4]比較)當(dāng)后面的成員只要發(fā)現(xiàn)比a[0]小的就與他的位置交換 這部做完之后數(shù)組就應(yīng) 該是這個(gè)樣子: a[0] a[1] a[2] a[3] a[4] ???????????2,用a[1]與后面的(a[2]~a[4]里面的每一個(gè)成員比較即是說(shuō): a[1]~a[2]比較 a[1]~a[3]比較 a[1]~a[4]比較)當(dāng)后面的成員只要發(fā)現(xiàn)比a[1]小的就與他的位置交換 這部做完之后數(shù) 組該是這個(gè)樣子:這個(gè)時(shí)候的a1不是我們賦初值時(shí)候的a1老就是我們改變后的數(shù)組所以這個(gè)時(shí)候的a1=9哦。 a[0] a[1] a[2] a[3] a[4] ???????????3,用a[2]與后面的(a[3]~a[4]里面的每一個(gè)成員比較即是說(shuō): a[2]~a[3]比較 a[2]~a[4]比較)當(dāng)后面的成員只要發(fā)現(xiàn)比a[2]小的就與他的位置交換 這部做完之后數(shù)組就應(yīng) 該是這個(gè)樣子: a[0] a[1] a[2] a[3] a[4] ???????????4,用a[3]與后面的(a[4]~a[4]里面的每一個(gè)成員比較即是說(shuō): a[3]~a[4]比較)當(dāng)后面的成員只要發(fā)現(xiàn)比a[2]小的就與他的位置交換 這部做完之后數(shù)組就應(yīng) 該是這個(gè)樣子: a[0] a[1] a[2] a[3] a[4] ???????????循環(huán)就是 寫(xiě)成這個(gè)樣子的哦: for(i=0;i<4;i++)