真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

c語(yǔ)言實(shí)驗(yàn)8函數(shù)的應(yīng)用,c語(yǔ)言程序設(shè)計(jì)實(shí)驗(yàn)8

C語(yǔ)言實(shí)驗(yàn)

哈夫曼編碼(Huffman Coding)是一種編碼方式,以哈夫曼樹(shù)—即最優(yōu)二叉樹(shù),帶權(quán)路徑長(zhǎng)度最小的二叉樹(shù),經(jīng)常應(yīng)用于數(shù)據(jù)壓縮。 在計(jì)算機(jī)信息處理中,“哈夫曼編碼”是一種一致性編碼法(又稱(chēng)"熵編碼法"),用于數(shù)據(jù)的無(wú)損耗壓縮。這一術(shù)語(yǔ)是指使用一張?zhí)厥獾木幋a表將源字符(例如某文件中的一個(gè)符號(hào))進(jìn)行編碼。這張編碼表的特殊之處在于,它是根據(jù)每一個(gè)源字符出現(xiàn)的估算概率而建立起來(lái)的(出現(xiàn)概率高的字符使用較短的編碼,反之出現(xiàn)概率低的則使用較長(zhǎng)的編碼,這便使編碼之后的字符串的平均期望長(zhǎng)度降低,從而達(dá)到無(wú)損壓縮數(shù)據(jù)的目的)。這種方法是由David.A.Huffman發(fā)展起來(lái)的。 例如,在英文中,e的出現(xiàn)概率很高,而z的出現(xiàn)概率則最低。當(dāng)利用哈夫曼編碼對(duì)一篇英文進(jìn)行壓縮時(shí),e極有可能用一個(gè)位(bit)來(lái)表示,而z則可能花去25個(gè)位(不是26)。用普通的表示方法時(shí),每個(gè)英文字母均占用一個(gè)字節(jié)(byte),即8個(gè)位。二者相比,e使用了一般編碼的1/8的長(zhǎng)度,z則使用了3倍多。倘若我們能實(shí)現(xiàn)對(duì)于英文中各個(gè)字母出現(xiàn)概率的較準(zhǔn)確的估算,就可以大幅度提高無(wú)損壓縮的比例。

10年積累的成都網(wǎng)站建設(shè)、成都網(wǎng)站設(shè)計(jì)經(jīng)驗(yàn),可以快速應(yīng)對(duì)客戶對(duì)網(wǎng)站的新想法和需求。提供各種問(wèn)題對(duì)應(yīng)的解決方案。讓選擇我們的客戶得到更好、更有力的網(wǎng)絡(luò)服務(wù)。我雖然不認(rèn)識(shí)你,你也不認(rèn)識(shí)我。但先做網(wǎng)站后付款的網(wǎng)站建設(shè)流程,更有久治免費(fèi)網(wǎng)站建設(shè)讓你可以放心的選擇與我們合作。

本文描述在網(wǎng)上能夠找到的最簡(jiǎn)單,最快速的哈夫曼編碼。本方法不使用任何擴(kuò)展動(dòng)態(tài)庫(kù),比如STL或者組件。只使用簡(jiǎn)單的C函數(shù),比如:memset,memmove,qsort,malloc,realloc和memcpy。

因此,大家都會(huì)發(fā)現(xiàn),理解甚至修改這個(gè)編碼都是很容易的。

背景

哈夫曼壓縮是個(gè)無(wú)損的壓縮算法,一般用來(lái)壓縮文本和程序文件。哈夫曼壓縮屬于可變代碼長(zhǎng)度算法一族。意思是個(gè)體符號(hào)(例如,文本文件中的字符)用一個(gè)特定長(zhǎng)度的位序列替代。因此,在文件中出現(xiàn)頻率高的符號(hào),使用短的位序列,而那些很少出現(xiàn)的符號(hào),則用較長(zhǎng)的位序列。

編碼使用

我用簡(jiǎn)單的C函數(shù)寫(xiě)這個(gè)編碼是為了讓它在任何地方使用都會(huì)比較方便。你可以將他們放到類(lèi)中,或者直接使用這個(gè)函數(shù)。并且我使用了簡(jiǎn)單的格式,僅僅輸入輸出緩沖區(qū),而不象其它文章中那樣,輸入輸出文件。

bool CompressHuffman(BYTE *pSrc, int nSrcLen, BYTE *pDes, int nDesLen);

bool DecompressHuffman(BYTE *pSrc, int nSrcLen, BYTE *pDes, int nDesLen);

要點(diǎn)說(shuō)明

速度

為了讓它(huffman.cpp)快速運(yùn)行,我花了很長(zhǎng)時(shí)間。同時(shí),我沒(méi)有使用任何動(dòng)態(tài)庫(kù),比如STL或者M(jìn)FC。它壓縮1M數(shù)據(jù)少于100ms(P3處理器,主頻1G)。

壓縮

壓縮代碼非常簡(jiǎn)單,首先用ASCII值初始化511個(gè)哈夫曼節(jié)點(diǎn):

CHuffmanNode nodes[511];

for(int nCount = 0; nCount 256; nCount++)

nodes[nCount].byAscii = nCount;

然后,計(jì)算在輸入緩沖區(qū)數(shù)據(jù)中,每個(gè)ASCII碼出現(xiàn)的頻率:

for(nCount = 0; nCount nSrcLen; nCount++)

nodes[pSrc[nCount]].nFrequency++;

然后,根據(jù)頻率進(jìn)行排序:

qsort(nodes, 256, sizeof(CHuffmanNode), frequencyCompare);

現(xiàn)在,構(gòu)造哈夫曼樹(shù),獲取每個(gè)ASCII碼對(duì)應(yīng)的位序列:

int nNodeCount = GetHuffmanTree(nodes);

構(gòu)造哈夫曼樹(shù)非常簡(jiǎn)單,將所有的節(jié)點(diǎn)放到一個(gè)隊(duì)列中,用一個(gè)節(jié)點(diǎn)替換兩個(gè)頻率最低的節(jié)點(diǎn),新節(jié)點(diǎn)的頻率就是這兩個(gè)節(jié)點(diǎn)的頻率之和。這樣,新節(jié)點(diǎn)就是兩個(gè)被替換節(jié)點(diǎn)的父節(jié)點(diǎn)了。如此循環(huán),直到隊(duì)列中只剩一個(gè)節(jié)點(diǎn)(樹(shù)根)。

// parent node

pNode = nodes[nParentNode++];

// pop first child

pNode-pLeft = PopNode(pNodes, nBackNode--, false);

// pop second child

pNode-pRight = PopNode(pNodes, nBackNode--, true);

// adjust parent of the two poped nodes

pNode-pLeft-pParent = pNode-pRight-pParent = pNode;

// adjust parent frequency

pNode-nFrequency = pNode-pLeft-nFrequency + pNode-pRight-nFrequency;

這里我用了一個(gè)好的訣竅來(lái)避免使用任何隊(duì)列組件。我先前就直到ASCII碼只有256個(gè),但我分配了511個(gè)(CHuffmanNode nodes[511]),前255個(gè)記錄ASCII碼,而用后255個(gè)記錄哈夫曼樹(shù)中的父節(jié)點(diǎn)。并且在構(gòu)造樹(shù)的時(shí)候只使用一個(gè)指針數(shù)組(ChuffmanNode *pNodes[256])來(lái)指向這些節(jié)點(diǎn)。同樣使用兩個(gè)變量來(lái)操作隊(duì)列索引(int nParentNode = nNodeCount;nBackNode = nNodeCount –1)。

接著,壓縮的最后一步是將每個(gè)ASCII編碼寫(xiě)入輸出緩沖區(qū)中:

int nDesIndex = 0;

// loop to write codes

for(nCount = 0; nCount nSrcLen; nCount++)

{

*(DWORD*)(pDesPtr+(nDesIndex3)) |=

nodes[pSrc[nCount]].dwCode (nDesIndex7);

nDesIndex += nodes[pSrc[nCount]].nCodeLength;

}

(nDesIndex3): 3 以8位為界限右移后到達(dá)右邊字節(jié)的前面

(nDesIndex7): 7 得到最高位.

注意:在壓縮緩沖區(qū)中,我們必須保存哈夫曼樹(shù)的節(jié)點(diǎn)以及位序列,這樣我們才能在解壓縮時(shí)重新構(gòu)造哈夫曼樹(shù)(只需保存ASCII值和對(duì)應(yīng)的位序列)。

解壓縮

解壓縮比構(gòu)造哈夫曼樹(shù)要簡(jiǎn)單的多,將輸入緩沖區(qū)中的每個(gè)編碼用對(duì)應(yīng)的ASCII碼逐個(gè)替換就可以了。只要記住,這里的輸入緩沖區(qū)是一個(gè)包含每個(gè)ASCII值的編碼的位流。因此,為了用ASCII值替換編碼,我們必須用位流搜索哈夫曼樹(shù),直到發(fā)現(xiàn)一個(gè)葉節(jié)點(diǎn),然后將它的ASCII值添加到輸出緩沖區(qū)中:

int nDesIndex = 0;

DWORD nCode;

while(nDesIndex nDesLen)

{

nCode = (*(DWORD*)(pSrc+(nSrcIndex3)))(nSrcIndex7);

pNode = pRoot;

while(pNode-pLeft)

{

pNode = (nCode1) ? pNode-pRight : pNode-pLeft;

nCode = 1;

nSrcIndex++;

}

pDes[nDesIndex++] = pNode-byAscii;

}

C語(yǔ)言實(shí)訓(xùn)總結(jié)

在初學(xué)C語(yǔ)言的一個(gè)學(xué)期后,我們進(jìn)行了C語(yǔ)言實(shí)訓(xùn)階段,嘗試自己編寫(xiě)一個(gè)比較復(fù)雜的程序系統(tǒng)。在為期兩周的時(shí)間中,我們同組的同學(xué)共同的感受是:C語(yǔ)言實(shí)訓(xùn)和平時(shí)上課所接觸的程序是有很大不同的,所經(jīng)受的考驗(yàn)和克服的困難是平時(shí)所無(wú)法比擬的。好在同組的搭檔們精誠(chéng)合作,分工明確,有問(wèn)題共同解決,攻克了C語(yǔ)言實(shí)訓(xùn)的復(fù)雜程序。在這里,我作為其中的參與者,自然感觸良多。

剛開(kāi)始接觸到C的時(shí)候,我已經(jīng)學(xué)過(guò)一些有關(guān)VB的內(nèi)容,這個(gè)在算法和思維上稍微有點(diǎn)幫助?;叵氡緦W(xué)期的學(xué)習(xí),首先,最基本的,是C的數(shù)據(jù)格式,讓我們知道整數(shù),浮點(diǎn)數(shù)以及字符常量在C中的運(yùn)用。然后,在學(xué)會(huì)了數(shù)據(jù)轉(zhuǎn)化,以及熟練的可以對(duì)各種數(shù)據(jù)處理之后,我開(kāi)始進(jìn)行有關(guān)數(shù)據(jù)結(jié)構(gòu),像數(shù)組,結(jié)構(gòu)體等的學(xué)習(xí),因?yàn)橛械臇|西從現(xiàn)有的知識(shí)來(lái)看都是非常簡(jiǎn)單的,還沒(méi)有聯(lián)系到指針等等一些復(fù)雜的概念??墒牵瑑H僅學(xué)會(huì)這些是遠(yuǎn)遠(yuǎn)不夠的,C語(yǔ)言中,還有很多更加經(jīng)典、重要、實(shí)用的知識(shí)。

說(shuō)說(shuō)函數(shù)。雖說(shuō)很多程序語(yǔ)言都有函數(shù)這一內(nèi)容,但我覺(jué)得C語(yǔ)言的函數(shù)是最有魅力的了。學(xué)習(xí)函數(shù)的方法是比較簡(jiǎn)單的,只有兩個(gè)字“牢記”,即:牢記函數(shù)的功能,牢記函數(shù)的用途以及如何輸入輸出。函數(shù)從本質(zhì)上講是一段通用程序,用它可以幫助我們節(jié)約很多編程的時(shí)間,學(xué)習(xí)C語(yǔ)言的“高人”都說(shuō),一個(gè)聰明的編程者在編寫(xiě)程序前往往總是先找自己所編寫(xiě)的程序中有多少是可以用函數(shù)來(lái)代替的。比如,大家可以作一個(gè)比較字符串的實(shí)驗(yàn),用C語(yǔ)言中的strcmp()函數(shù)只要一句話,而自己編寫(xiě)的話,30句都很難實(shí)現(xiàn),可想而知函數(shù)的實(shí)用和快捷。在我們C語(yǔ)言實(shí)訓(xùn)的代碼中,函數(shù)更是得到了充分的應(yīng)用,可以說(shuō),實(shí)訓(xùn)題目的復(fù)雜代碼,就是用無(wú)數(shù)個(gè)函數(shù)的調(diào)用和嵌套積累出來(lái)的。

要注意的是,有的同學(xué)剛剛開(kāi)始的時(shí)候,都是被一些大的程序激勵(lì)的,所以當(dāng)開(kāi)始的時(shí)候看到繁瑣的數(shù)據(jù)轉(zhuǎn)化和簡(jiǎn)單的算法,都覺(jué)得很無(wú)聊,都想自己做幾個(gè)自己滿意的程序來(lái)看看,雖然這種想法很好,但是,我們說(shuō),沒(méi)有基礎(chǔ),純粹是搬照一些現(xiàn)成設(shè)計(jì)方法,是不足取的。要知道,程序設(shè)計(jì)講究的是個(gè)人的思維的,假如剛開(kāi)始就被一些現(xiàn)成的思想束縛住,以后就會(huì)覺(jué)得很無(wú)趣。

我們知道,指針其實(shí)是C語(yǔ)言的靈魂,許多的數(shù)據(jù)結(jié)構(gòu)在我們學(xué)到這里之前都可以說(shuō)是精通了。所以我們的任務(wù)就是,讓數(shù)據(jù)結(jié)構(gòu)在指針中運(yùn)行。當(dāng)然,剛剛開(kāi)始接觸到這些新的東西,是一件非常痛苦的事情,所以我們一定要用非常形象的思維去看待指針,不能太固化。所以,新的東西,比如結(jié)構(gòu)體在指針中的表現(xiàn)方法,數(shù)組及多維數(shù)組在結(jié)構(gòu)體中的運(yùn)用,都一點(diǎn)一點(diǎn)的加了進(jìn)來(lái),同時(shí)豐滿了我們對(duì)原來(lái)C的數(shù)據(jù)機(jī)構(gòu),數(shù)據(jù)表示的理解。當(dāng)我們完成了這三步的學(xué)習(xí),我們已經(jīng)可以自豪的說(shuō),我們的基礎(chǔ)都扎實(shí)了,可以進(jìn)一步的學(xué)習(xí)有關(guān)算法,設(shè)計(jì)概念等等深層次的東西了。

但是,指針,結(jié)構(gòu)體,這些太抽象的東西,在學(xué)習(xí)C語(yǔ)言的時(shí)候我們就有點(diǎn)“似懂非懂”,可是在眼下的C語(yǔ)言實(shí)訓(xùn)中,像這么重要的C語(yǔ)言知識(shí),一定要達(dá)到能熟練掌握,實(shí)際運(yùn)用的程度。在實(shí)訓(xùn)的大程序中,結(jié)構(gòu)體在指針中的表現(xiàn)方法,數(shù)組及在結(jié)構(gòu)體中的運(yùn)用等具體的技術(shù)環(huán)節(jié),都得到了體現(xiàn),不會(huì)指針,我們的工作是沒(méi)法展開(kāi)的。所以,在實(shí)訓(xùn)期間,大家在鞏固基本知識(shí)的基礎(chǔ)上,逐塊攻克實(shí)訓(xùn)課題,克服了困難,自信心得到了提高。

最后,談?wù)勎覀兘M的程序軟件。商店商品管理系統(tǒng),是一個(gè)比較利于應(yīng)用,解決實(shí)際問(wèn)題,方便實(shí)際管理的程序。設(shè)計(jì)代碼比較復(fù)雜,結(jié)構(gòu)比較嚴(yán)謹(jǐn)。在程序編寫(xiě)的1周左右的時(shí)間里,組員們遇到了上述的困難,包括程序設(shè)計(jì)構(gòu)思,甚至是指針等某些知識(shí)點(diǎn)的欠缺,導(dǎo)致的工作中出現(xiàn)的困難。但是,當(dāng)大家一起團(tuán)結(jié)協(xié)作,解決了這些困難之后,發(fā)現(xiàn)自己也可以編寫(xiě)復(fù)雜的、應(yīng)用性的程序了,更發(fā)現(xiàn)自己對(duì)C語(yǔ)言這門(mén)學(xué)科的興趣也提高了。

當(dāng)然,我們編寫(xiě)的商店商品管理系統(tǒng),還存在很多疏漏和不合理之處。比如,程序復(fù)雜冗長(zhǎng),如果時(shí)間充裕,我們將在不改變程序運(yùn)行結(jié)果的基礎(chǔ)上,簡(jiǎn)化程序,使每一句更加精辟,總體上更加簡(jiǎn)化。另外,在程序的外觀上,我們由于時(shí)間問(wèn)題,沒(méi)有做更多的修飾,運(yùn)行起來(lái)顯得比較死板、枯燥乏味。如果增添一些色彩和其他效果,我們的程序也許會(huì)更加完美。

以上就是我的C語(yǔ)言實(shí)訓(xùn)個(gè)人總結(jié)

C語(yǔ)言函數(shù)作業(yè)! 重賞??! 按要求?。。?50分!

#include?stdio.h

#define?N?4

int?fun(int?a[N][N])

{

int?i,j,s=0;

for(i=0;iN;i++)

for(j=0;jN;j++)

{

if(j==i||i+j==3)

a[i][j]=1;

else?s+=a[i][j];

}

return?s;

}

void?main()

{

int?i,j,a[N][N],k;

for(i=0;iN;i++)

for(j=0;jN;j++)

scanf("%d",a[i][j]);

k=fun(a);

printf("\n轉(zhuǎn)換后的數(shù)組:\n");

for(i=0;iN;i++)

{

for(j=0;jN;j++)

printf("%-4d",a[i][j]);

printf("\n");

}

printf("\n其余元素之和=%d",k);

}

已調(diào)試通過(guò),運(yùn)行示例:

C語(yǔ)言編程題 函數(shù)的應(yīng)用?

以下的程序?qū)崿F(xiàn)的功能為:

主函數(shù)中定義一個(gè)包含10個(gè)浮點(diǎn)型數(shù)據(jù)的數(shù)組,

自定義函數(shù)實(shí)現(xiàn)如下功能:

函數(shù)func1()的功能是計(jì)算并輸出數(shù)組的平均值;

函數(shù)func2()的功能是將數(shù)組的每個(gè)數(shù)取整數(shù)(題目未規(guī)定取整規(guī)則,程序中采用截尾取整),存儲(chǔ)到新的數(shù)組里,并打印輸出。

#includestdio.h

void fun1(float a[],int n)

{float s=0;

for(;n;)s+=a[--n];

printf("%f\n",s);

}

void fun2(float a[],int b[],int n)

{int i;

for(i=0;in;i++)

{b[i]=a[i];

printf("%d ",b[i]);

}

printf("\n");

}

int main()

{ int i;

float a[10];

int b[10];

for(i=0; i10; i++)

scanf("%f",a[i]);

fun1(a,10);

fun2(a,b,10);

return 0;

}

c語(yǔ)言實(shí)驗(yàn)報(bào)告心得

c語(yǔ)言實(shí)驗(yàn)心得:

1、只有頻繁用到或?qū)\(yùn)算速度要求很高的變量才放到data區(qū)內(nèi),如for循環(huán)中的計(jì)數(shù)值。

2、其他不頻繁調(diào)用到和對(duì)運(yùn)算速度要求不高的變量都放到xdata區(qū)。

3、常量放到code區(qū),如字庫(kù)、修正系數(shù)。

4、邏輯標(biāo)志變量可以定義到bdata中。

在51系列芯片中有16個(gè)字節(jié)位尋址區(qū)bdata,其中可以定義8*16=128個(gè)邏輯變量。這樣可以大大降低內(nèi)存占用空間。定義方法是: bdata bit LedState;但位類(lèi)型不能用在數(shù)組和結(jié)構(gòu)體中。

5、data區(qū)內(nèi)最好放局部變量。

因?yàn)榫植孔兞康目臻g是可以覆蓋的(某個(gè)函數(shù)的局部變量空間在退出該函數(shù)是就釋放,由別的函數(shù)的局部變量覆蓋),可以提高內(nèi)存利用率。當(dāng)然靜態(tài)局部變量除外,其內(nèi)存使用方式與全局變量相同;

6、確保程序中沒(méi)有未調(diào)用的函數(shù)。

在Keil C里遇到未調(diào)用函數(shù),編譯器就將其認(rèn)為可能是中斷函數(shù)。函數(shù)里用的局部變量的空間是不釋放,也就是同全局變量一樣處理。這一點(diǎn)Keil做得很愚蠢,但也沒(méi)辦法。

7、如果想節(jié)省data空間就必須用large模式。

將未定義內(nèi)存位置的變量全放到xdata區(qū)。當(dāng)然最好對(duì)所有變量都要指定內(nèi)存類(lèi)型。

8、使用指針時(shí),要指定指針指向的內(nèi)存類(lèi)型。

在C51中未定義指向內(nèi)存類(lèi)型的通用指針占用3個(gè)字節(jié);而指定指向data區(qū)的指針只占1個(gè)字節(jié);指定指向xdata區(qū)的指針占2個(gè)字節(jié)。如指針p是指向data區(qū),則應(yīng)定義為: char data *p;。還可指定指針本身的存放內(nèi)存類(lèi)型,如:char data * xdata p;。其含義是指針p指向data區(qū)變量,而其本身存放在xdata區(qū)。

以前沒(méi)搞過(guò)C51,大學(xué)時(shí)代跟單片機(jī)老師的時(shí)候也是搗鼓下匯編,現(xiàn)在重新搞單片機(jī),因?yàn)槭诸^資料不多,找到一些C51的程序,發(fā)現(xiàn)里面有這些關(guān)鍵字,不甚明了,沒(méi)辦法只好找了下,發(fā)現(xiàn)如下描述:

從數(shù)據(jù)存儲(chǔ)類(lèi)型來(lái)說(shuō),8051系列有片內(nèi)、片外程序存儲(chǔ)器,片內(nèi)、片外數(shù)據(jù)存儲(chǔ)器,片內(nèi)程序存儲(chǔ)器還分直接尋址區(qū)和間接尋址類(lèi)型,分別對(duì)應(yīng)code、data、xdata、idata以及根據(jù)51系列特點(diǎn)而設(shè)定的pdata類(lèi)型,使用不同的存儲(chǔ)器,將使程序執(zhí)行效率不同,在編寫(xiě)C51程序時(shí),最好指定變量的存儲(chǔ)類(lèi)型,這樣將有利于提高程序執(zhí)行效率(此問(wèn)題將在后面專(zhuān)門(mén)講述)。與ANSI-C稍有不同,它只分SAMLL、COMPACT、LARGE模式,各種不同的模式對(duì)應(yīng)不同的實(shí)際硬件系統(tǒng),也將有不同的編譯結(jié)果。

在51系列中data,idata,xdata,pdata的區(qū)別

data:固定指前面0x00-0x7f的128個(gè)RAM,可以用acc直接讀寫(xiě)的,速度最快,生成的代碼也最小。

idata:固定指前面0x00-0xff的256個(gè)RAM,其中前128和data的128完全相同,只是因?yàn)樵L問(wèn)的方式不同。idata是用類(lèi)似C中的指針?lè)绞皆L問(wèn)的。匯編中的語(yǔ)句為:mox ACC,@Rx.(不重要的補(bǔ)充:c中idata做指針式的訪問(wèn)效果很好)

xdata:外部擴(kuò)展RAM,一般指外部0x0000-0xffff空間,用DPTR訪問(wèn)。

pdata:外部擴(kuò)展RAM的低256個(gè)字節(jié),地址出現(xiàn)在A0-A7的上時(shí)讀寫(xiě),用movx ACC,@Rx讀寫(xiě)。這個(gè)比較特殊,而且C51好象有對(duì)此BUG,建議少用。但也有他的優(yōu)點(diǎn),具體用法屬于中級(jí)問(wèn)題,這里不提。

三、有關(guān)單片機(jī)ALE引腳的問(wèn)題

"單片機(jī)不訪問(wèn)外部鎖存器時(shí)ALE端有正脈沖信號(hào)輸出,此頻率約為時(shí)鐘振蕩頻率的1/6.每當(dāng)訪問(wèn)

外部數(shù)據(jù)存儲(chǔ)器是,在兩個(gè)機(jī)器周期中ALE只出現(xiàn)一次,即丟失一個(gè)ALE脈沖."這句話是不是有毛

病.我覺(jué)得按這種說(shuō)法,應(yīng)該丟失3個(gè)ALE脈沖才對(duì),我一直想不通是怎么回事,希望大蝦們幫幫我.

小弟感激涕零.

答:

其他所有指令每6個(gè)機(jī)器周期發(fā)出一個(gè)ALE,而MOVX指令占用12個(gè)機(jī)器周期只發(fā)出一個(gè)ALE

四、如何將一個(gè)INT型數(shù)據(jù)轉(zhuǎn)換成2個(gè)CHAR型數(shù)據(jù)?

經(jīng)keil優(yōu)化后,char1=int1/256,char2=int1%256或char1=int18,char2=int10x00ff效率是一樣的。

五、在KEIL C51上仿真完了,怎樣生成HEX文件去燒寫(xiě)??

右鍵點(diǎn)項(xiàng)目中Target 1,選第二個(gè),在OUTPUT中選中CREAT HEX

六、typedef 和 #define 有何不同??

typedef 和 #define 有何不同》》》 如

typedef unsigned char UCHAR ;

#define unsigned char UCHAR ;

typedef命名一個(gè)新的數(shù)據(jù)類(lèi)型,但實(shí)際上這個(gè)新的數(shù)據(jù)類(lèi)型是已經(jīng)存在的,只不過(guò)是定義了

一個(gè)新的名字.

#define只是一個(gè)標(biāo)號(hào)的定義.

你舉的例子兩者沒(méi)有區(qū)別,但是#define還可以這樣用

#define MAX 100

#define FUN(x) 100-(x)

#define LABEL

等等,這些情況下是不能用typedef定義的

七、請(qǐng)問(wèn)如何設(shè)定KELC51的仿真工作頻(時(shí)鐘)

用右鍵點(diǎn)擊左邊的的target 1,然后在xtal一欄輸入

八、不同模塊怎樣共享sbit變量,extern不行?

把SBIT定義單獨(dú)放到一個(gè).H中,每個(gè)模塊都包含這個(gè).h文件

九、C51中對(duì)于Px.x的訪問(wèn)必須自己定義嗎?

是的。

如sbit P17 = 0x97;即可定義對(duì)P1.7的訪問(wèn)

十、SWITCH( )語(yǔ)句中表達(dá)式不可以是位變量對(duì)嗎?

可以用位變量:

#include

#include

void main()

{

bit flag;

flag=0;

switch(flag)

{

case '0':{printf("0\n");break;}

case '1':{printf("1\n");break;}

default:break;

}

}

bit 變量只有兩種狀態(tài),if 語(yǔ)句足夠啦,!!!

十一、const常數(shù)聲明占不占內(nèi)存???

const 只是用來(lái)定義“常量”,所占用空間與你的定義有關(guān),如:

const code cstStr[] = {"abc"};

占用代碼空間;而如:

const char data cstStr[] = {"abc"};

當(dāng)然占用內(nèi)存空間。

另外,#define 之定義似乎不占用空間。

十二、philips的單片機(jī)P89C51RD+的擴(kuò)展RAM在C51中如何使用?

試一試將auxr.1清0,然后在c語(yǔ)言中直接聲明xdata類(lèi)型的變量

十三、BUG of Keil C51

程序中用如下語(yǔ)句:

const unsigned char strArr[] = {"數(shù)學(xué)"};

結(jié)果發(fā)現(xiàn)strArr[] 內(nèi)容為 {0xCA,0xD1,0xA7},真奇怪!

凡是有0xfd,則會(huì)通通不見(jiàn)了,所以只能手工輸入內(nèi)碼了,例如 uchar strArr[]=

{0xCA,0xfd,0xd1,0xa7}(用Ultraedit會(huì)很方便)。

十四、Keil C51中如何實(shí)現(xiàn)代碼優(yōu)化?

菜單Project下Option for target "Simulator"的C51.

看到Code optimization了嗎?

十五、請(qǐng)教c的!和 ~ 符號(hào)有甚區(qū)別??

!是邏輯取反,~是按位取反。

十六、c51編程,讀端口,還要不要先輸出1?

我怎么看到有的要,有的不要,請(qǐng)高手給講講,到底咋回事?謝了

要輸出1的,除非你能保證之前已經(jīng)是1,而中間沒(méi)有輸出過(guò)其他值。

十七、當(dāng)定時(shí)器1(T1)用于產(chǎn)生波特率時(shí),P3^5還是否可以用作正常的I/O口呢?

p3.5完全可以當(dāng)普通的io使用

十八、C51中 INT 轉(zhuǎn)換為 2個(gè)CHAR?

各位高手:

C51中 INT 轉(zhuǎn)換為 CHAR 如何轉(zhuǎn)換諸如:

X = LOW(Z);

Y = HIGH(Z);

答:

x=(char)z;

y=(char)(z8);

十九、如果我想使2EH的第7位置1的話,用位操作可以嗎?

現(xiàn)在對(duì)位操作指令我一些不太明白請(qǐng)各位多多指教:

如 SETB 07H 表示的是20H.7置1,對(duì)嗎?(我在一本書(shū)上是這么看到的)

那么如果我想使2EH的第7位置1的話,象我舉的這個(gè)例子怎么表示呢?謝謝!

SETB 77H

setb (2eh-20h)*8+7

20h-2fh每字節(jié)有8個(gè)可位操作(00h-7fh),其它RAM不可位直接操作

二十、char *addr=0xc000 和char xdata *addr=0xc000有何區(qū)別?

char *addr=0xc000;

char xdata *addr=0xc000;

除了在內(nèi)存中占用的字節(jié)不同外,還有別的區(qū)別嗎?

char *addr=0xc000; 是通用定義,指針變量 addr 可指向任何內(nèi)存空間的值;

char xdata *addr=0xc000; 指定該指針變量只能指向 xdata 中的值;

后一種定義中該指針變量(addr)將少占用一個(gè)存儲(chǔ)字節(jié)。

uchar xdata *addr=0xc000;指針指向外ram;

如果:data uchar xdata *addr=0xc000;指針指向外ram但指針本身存在于內(nèi)ram(data)

以此類(lèi)推可以idata uchar xdata *addr=0xc000;pdata uchar xdata *addr=0xc000;

data uchar idata *addr=0xa0;.........

二十一、while(p1_0)的執(zhí)行時(shí)間?

假設(shè),P1_0為單片機(jī)P1口的第一腳,請(qǐng)問(wèn),

while(P1_0)

{

P1_0=0;

}

while(!P1_0)

{

P1_0=1;

}

以上代碼,在KEIL C中,需要多長(zhǎng)時(shí)間,執(zhí)行完。能具體說(shuō)明while(P1_0)的執(zhí)行時(shí)間嗎?

仿真運(yùn)行看看就知道了,

我仿真了試了一下,約14個(gè)周期

二十二、怎樣編寫(xiě)C51的watchdog程序?

各位大蝦,我用KEIL C51 編寫(xiě)了一個(gè)帶外部開(kāi)門(mén)狗的程序,可程序無(wú)法運(yùn)行起來(lái),經(jīng)過(guò)查

找,發(fā)現(xiàn)程序在經(jīng)過(guò)C51編譯后,在MAIN()函數(shù)的前部增加了一端初始化程序,等到進(jìn)入

主程序設(shè)置開(kāi)門(mén)狗時(shí),開(kāi)門(mén)狗已經(jīng)時(shí)間到,將我的程序復(fù)位了,請(qǐng)問(wèn)我怎樣才能修改這一端

初始花程序,使他一運(yùn)行,就設(shè)置開(kāi)門(mén)狗?

可以在startup.a51中加入看門(mén)狗刷新指令,當(dāng)然用匯編,然后重新編譯startup.a51

,將他和你的程序連接即可。新的startup.a51會(huì)自動(dòng)代替系統(tǒng)默認(rèn)的啟動(dòng)模塊。

二十三、keil C51 怎樣把修改的startup.a51 加到工程文件中

直接加入即可

注意不要改動(dòng)?STACK,?C_START,?C_STARTUP等符號(hào)。startup.a51直接加入項(xiàng)目,不用修改也可??稍趦?nèi)面自己修改匯編的一些限制或堆棧指針。

二十四、關(guān)于波特率的設(shè)置

我在設(shè)定串口波特率時(shí)發(fā)現(xiàn)一個(gè)問(wèn)題:在晶體震蕩器為11.0592MHz時(shí),若設(shè)9600BPS的話,

TH1=0XFD,TL1=0XFD,而要設(shè)19200BPS的話,TH1、TL1有否變化,如果沒(méi)變,為什么?

如果變了,又為什么?(因?yàn)槲铱磿?shū)上倆個(gè)是一樣的),希望大家點(diǎn)撥。

答:

當(dāng)電源控制寄存器(PCON)第BIT7(SMOD)為1時(shí)波特率加倍。

TH1和TL1的值不變.

二十五、如何在C中聲明保留這部分RAM區(qū)不被C使用?

我不知道在C源程序中怎么控制這個(gè),但在匯編程序中加入下面一段就行:

DSEG AT 20H

AA: DS 10

這樣C51就不會(huì)占用20H--29H了

或者在c51里這樣定義:

uchar data asm_buff[10] _at_ 0x20;

二十六、問(wèn)浮點(diǎn)運(yùn)算問(wèn)題

我在用C51時(shí)發(fā)現(xiàn)它對(duì)傳遞浮點(diǎn)參數(shù)的個(gè)數(shù)有限制,請(qǐng)問(wèn):

1)參數(shù)是以全局變量的形式傳遞的,請(qǐng)問(wèn)以全局變量的形式傳遞的參數(shù)也有限制嗎?

2)這種傳遞浮點(diǎn)參數(shù)的限制有多少呢?

3)float*float的結(jié)果是float類(lèi)型還是double類(lèi)型?能否直接賦值給float類(lèi)型的變量?

答:

由于KEIL C51的參數(shù)傳遞是通過(guò)R0-R7來(lái)傳遞的,所以會(huì)有限制。

不過(guò)KEIL提供了一個(gè)編譯參數(shù),可以支持更多參數(shù)的傳遞。具體

的內(nèi)容見(jiàn)KEIL的PDF文檔。

我建議你把多個(gè)要傳遞的參數(shù)定義到指針或結(jié)構(gòu)體中去,傳遞參

數(shù)通過(guò)指針或結(jié)構(gòu)進(jìn)行,這樣好一些。

第3個(gè)問(wèn)題回答是YES,你自己試試不就知道了。

二十七、如何在某一個(gè)地址定義ram

用_at_ 命令,這樣可以定位靈活一點(diǎn)的地址

uchar xdata dis_buff[16] _at_ 0x6020 ;//定位RAM

將dis_buff[16]定位在0x6020開(kāi)始的16個(gè)字節(jié)

二十八、keil c中,用什么函數(shù)可以得到奇偶校驗(yàn)位?

例如32位數(shù)據(jù),將四個(gè)字節(jié)相互異或后檢查P即可,若耽心P被改變,可用內(nèi)嵌匯編。

#include

unsigned char parity(unsigned char x){

x^=x;

if(P)return(1);

else return(0);

}

unsigned char parity2(unsigned int x){

#pragma asm

mov a,r7

xrl ar6,a

#pragma endasm

if(P)return(1);

else return(0);

}

誰(shuí)有c語(yǔ)言程序設(shè)計(jì)蘇小紅版第8單元課后實(shí)驗(yàn)題答案

#include stdio.h

#define N 30

int Average(int score[], int n); /* Average()函數(shù)原型 */

void ReadScore(int score[], long num[],int n); /* ReadScore()函數(shù)原型 */

void DataSort(int score[], long num[], int n);

void PrintScore(int score[], long num[], int n);

void DataNum(int score[], long num[], int n);

void PrintNum(int score[], long num[], int n);

void SearchNum(int score[],long num[],int n);

void Statistics(int score[], int n);

void List(int score[], long num[], int n);

int main()

{

int choice,n,score[N], aver=0,i,sum=0;

long num[N];

do

{

printf("1: Append record\n");

printf("2: Caculate total and average score of course\n");

printf("3: Sort in descending order by score\n");

printf("4: Sort in ascending order by number\n");

printf("5: Search by number\n");

printf("6: Statistic analysisc\n");

printf("7: List record\n");

printf("0: Exit\n");

scanf("%d",choice);

switch(choice)

{

case 1:printf("Total students are:");

scanf("%d",n);

ReadScore (score,num,n);

break;

case 2:aver = Average(score, n);

printf("Average score is %d\n",aver);

for (i=0; in; i++)

{

sum += score[i];

}

printf("Caculate total score is %d\n",sum);

break;

case 3:DataSort(score,num,n);

printf("Sorted scores :\n");

printf(" number: score: \n");

PrintScore(score,num,n);

break;

case 4:DataNum(score,num,n);

printf("Sorted number :\n");

printf(" number: score: \n");

PrintNum(score,num,n);

break;

case 5:SearchNum(score,num,n);

break;

case 6:Statistics(score, n);

break;

case 7:List(score,num,n);

break;

case 0:break;

}

}while(choice!=0);

return 0;

}

/* 1、函數(shù)功能:輸入n個(gè)學(xué)生的學(xué)號(hào)及某門(mén)課成績(jī) */

void ReadScore(int score[], long num[],int n)

{

int i;

for(i=0;in;i++)

{

printf("Input student's ID and score:");

scanf("%ld%d",num[i],score[i]);

}

}

/* 2、函數(shù)功能:計(jì)算課程的總分和平均分 */

int Average(int score[], int n) /* Average()函數(shù)定義 */

{

int i, sum = 0;

for (i=0; in; i++)

{

sum += score[i];

}

return sum / n;

}

/* 3、函數(shù)功能:成績(jī)由高到低排序 */

void DataNum(int score[], long num[], int n)

{

int i,j,k,temp1;

long temp2;

for(i=0;in-1;i++)

{

k=i;

for(j=i+1;jn;j++)

{

if (score[j]score[k])

{

k=j;

}

}

if(k!=i)

{

temp1=score[k];score[k]=score[i];score[i]=temp1;

temp2=num[k];num[k]=num[i];num[i]=temp2;

}

}

}

/* 函數(shù)功能:顯示排序后學(xué)生學(xué)號(hào)和成績(jī) */

void PrintNum(int score[], long num[], int n)

{

int i;

for(i=0;in;i++)

{

printf(" %10ld %4d\n",num[i],score[i]);

}

}

/* 4、函數(shù)功能:學(xué)號(hào)由小到大排序 */

void DataSort(int score[], long num[], int n)

{

int i,j,k,temp1;

long temp2;

for(i=0;in-1;i++)

{

k=i;

for(j=i+1;jn;j++)

{

if (num[j]num[k])

{

k=j;

}

}

if(k!=i)

{

temp1=num[k];num[k]=num[i];num[i]=temp1;

temp2=score[k];score[k]=score[i];score[i]=temp2;

}

}

}

/* 函數(shù)功能:顯示排序后學(xué)生學(xué)號(hào)和成績(jī) */

void PrintScore(int score[], long num[], int n)

{

int i;

for(i=0;in;i++)

{

printf(" %10ld %4d\n",num[i],score[i]);

}

}

/* 5、函數(shù)功能:按學(xué)號(hào)查詢學(xué)生排名及其成績(jī)*/

void SearchNum(int score[],long num[],int n)

{

long number;

int i;

printf("Please input the number you want to search:");

scanf("%ld",number);

for(i=0;in;i++)

{

if(num[i]==number)

{

printf(" %ld %d\n",num[i],score[i]);

return;

}

}

printf("\nNot found!\n");

}

/* 6、函數(shù)功能:統(tǒng)計(jì)個(gè)人類(lèi)別的人數(shù)以及所占的百分比*/

void Statistics(int score[], int n)

{

int i,a=0,b=0,c=0,d=0,e=0;

for(i=0;in;i++)

{

if(score[i]=90)

{

a++;

}

else if(score[i]=80)

{

b++;

}

else if(score[i]=70)

{

c++;

}

else if(score[i]=60)

{

d++;

}

else

{

e++;

}

}

printf("優(yōu)秀人數(shù):%d\t占:%.3f%%\n良好人數(shù):%d\t占:%.3f%%\n中等人數(shù):%d\t占:%.3f%%\n及格人數(shù):%d\t占:%.3f%%\n不及格人數(shù):%d\t占:%.3f%%\n",a,(float)100*a/n,b,(float)100*b/n,c,(float)100*c/n,d,(float)100*d/n,e,(float)100*e/n);

}

/* 7、函數(shù)功能:輸入學(xué)生學(xué)號(hào)、成績(jī)、總分、平均分*/

void List(int score[], long num[], int n)

{

int i, j=0;

for(i=0;in;i++)

{

printf("學(xué)號(hào):%ld\t考試成績(jī):%d\n",num[i],score[i]);

j+=score[i];

}

printf("課程總分:%d\n平均分:%.3f\n",j,(float)j/n);

}


網(wǎng)站標(biāo)題:c語(yǔ)言實(shí)驗(yàn)8函數(shù)的應(yīng)用,c語(yǔ)言程序設(shè)計(jì)實(shí)驗(yàn)8
當(dāng)前URL:http://weahome.cn/article/dsggsso.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部