欧美一区二区三区老妇人-欧美做爰猛烈大尺度电-99久久夜色精品国产亚洲a-亚洲福利视频一区二区

c語言實(shí)驗(yàn)7函數(shù)的應(yīng)用 c語言實(shí)驗(yàn)七

c語言中函數(shù)的應(yīng)用場景

使用函數(shù),能簡化代碼量,方便維護(hù),流程清晰明了,易于理解。

萊陽ssl適用于網(wǎng)站、小程序/APP、API接口等需要進(jìn)行數(shù)據(jù)傳輸應(yīng)用場景,ssl證書未來市場廣闊!成為創(chuàng)新互聯(lián)建站的ssl證書銷售渠道,可以享受市場價格4-6折優(yōu)惠!如果有意向歡迎電話聯(lián)系或者加微信:13518219792(備注:SSL證書合作)期待與您的合作!

但,有函數(shù)的話,就需要傳遞參數(shù),開辟緩存、堆棧等,相比較而言,會耗一些多余的時間。

但是,還是要用函數(shù),要不然你以后維護(hù)程序的話,呵呵呵,你就 要完蛋了。

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

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

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

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

背景

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

編碼使用

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

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

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

要點(diǎn)說明

速度

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

壓縮

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

CHuffmanNode nodes[511];

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

nodes[nCount].byAscii = nCount;

然后,計算在輸入緩沖區(qū)數(shù)據(jù)中,每個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)造哈夫曼樹,獲取每個ASCII碼對應(yīng)的位序列:

int nNodeCount = GetHuffmanTree(nodes);

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

// 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;

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

接著,壓縮的最后一步是將每個ASCII編碼寫入輸出緩沖區(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ū)中,我們必須保存哈夫曼樹的節(jié)點(diǎn)以及位序列,這樣我們才能在解壓縮時重新構(gòu)造哈夫曼樹(只需保存ASCII值和對應(yīng)的位序列)。

解壓縮

解壓縮比構(gòu)造哈夫曼樹要簡單的多,將輸入緩沖區(qū)中的每個編碼用對應(yīng)的ASCII碼逐個替換就可以了。只要記住,這里的輸入緩沖區(qū)是一個包含每個ASCII值的編碼的位流。因此,為了用ASCII值替換編碼,我們必須用位流搜索哈夫曼樹,直到發(fā)現(xiàn)一個葉節(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語言實(shí)驗(yàn)7 函數(shù)1

#include?stdio.h

int?main?()

{

int?ad(int);

int?n;

printf("請輸入一個測試數(shù):");

while(scanf("%d",n)==1)

if(ad(n))

printf("\t?%d?是??素數(shù).\n",n);

else?

printf("\t?%d?不是素數(shù).\n",n);

return?0;

}

int?ad(int?n)

{

int?flag=1,i;

for?(i=2;i=n/2??flag==1;i++)??//?這里?i=n/2就好了

if(n%i==0)

flag=0;

return?(flag);

}

代碼有點(diǎn)小問題,參看上面的注釋

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

函數(shù)func2()的功能是將數(shù)組的每個數(shù)取整數(shù)(題目未規(guī)定取整規(guī)則,程序中采用截尾取整),存儲到新的數(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;

}

網(wǎng)頁題目:c語言實(shí)驗(yàn)7函數(shù)的應(yīng)用 c語言實(shí)驗(yàn)七
文章出自:http://www.chinadenli.net/article36/dooshsg.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供微信小程序營銷型網(wǎng)站建設(shè)定制開發(fā)手機(jī)網(wǎng)站建設(shè)App開發(fā)品牌網(wǎng)站建設(shè)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

成都seo排名網(wǎng)站優(yōu)化