導航:首頁 > 源碼編譯 > 語言編譯實驗

語言編譯實驗

發布時間:2022-02-15 19:19:26

A. vs2015編譯C語言程序出現了很多錯誤,我用了一個很簡單的程序做了個實驗 #include<st

#include <stdio.h>
int main()
{
int a=5,b=2;
printf("a+b=%d\n",a+b);

return 0;
}

B. 匯編語言實驗5

1、 push ds:[0] ;0123h進棧
push ds:[2] ;0456h進棧
pop ds:[2] ;0456h出棧送到了ds:【2】處
pop ds:[0] ;0123h出棧送到了ds:【0】處
所以順序並沒有發生改變。
2、由於stake和data段中各定義了兩個字型數據,不大於16位元組,所以三個段的段地址相差1。

C. C語言實驗

哈夫曼編碼(Huffman Coding)是一種編碼方式,以哈夫曼樹—即最優二叉樹,帶權路徑長度最小的二叉樹,經常應用於數據壓縮。 在計算機信息處理中,「哈夫曼編碼」是一種一致性編碼法(又稱"熵編碼法"),用於數據的無損耗壓縮。這一術語是指使用一張特殊的編碼表將源字元(例如某文件中的一個符號)進行編碼。這張編碼表的特殊之處在於,它是根據每一個源字元出現的估算概率而建立起來的(出現概率高的字元使用較短的編碼,反之出現概率低的則使用較長的編碼,這便使編碼之後的字元串的平均期望長度降低,從而達到無損壓縮數據的目的)。這種方法是由David.A.Huffman發展起來的。 例如,在英文中,e的出現概率很高,而z的出現概率則最低。當利用哈夫曼編碼對一篇英文進行壓縮時,e極有可能用一個位(bit)來表示,而z則可能花去25個位(不是26)。用普通的表示方法時,每個英文字母均佔用一個位元組(byte),即8個位。二者相比,e使用了一般編碼的1/8的長度,z則使用了3倍多。倘若我們能實現對於英文中各個字母出現概率的較准確的估算,就可以大幅度提高無損壓縮的比例。

本文描述在網上能夠找到的最簡單,最快速的哈夫曼編碼。本方法不使用任何擴展動態庫,比如STL或者組件。只使用簡單的C函數,比如:memset,memmove,qsort,malloc,realloc和memcpy。
因此,大家都會發現,理解甚至修改這個編碼都是很容易的。

背景
哈夫曼壓縮是個無損的壓縮演算法,一般用來壓縮文本和程序文件。哈夫曼壓縮屬於可變代碼長度演算法一族。意思是個體符號(例如,文本文件中的字元)用一個特定長度的位序列替代。因此,在文件中出現頻率高的符號,使用短的位序列,而那些很少出現的符號,則用較長的位序列。
編碼使用
我用簡單的C函數寫這個編碼是為了讓它在任何地方使用都會比較方便。你可以將他們放到類中,或者直接使用這個函數。並且我使用了簡單的格式,僅僅輸入輸出緩沖區,而不象其它文章中那樣,輸入輸出文件。
bool CompressHuffman(BYTE *pSrc, int nSrcLen, BYTE *&pDes, int &nDesLen);
bool DecompressHuffman(BYTE *pSrc, int nSrcLen, BYTE *&pDes, int &nDesLen);
要點說明
速度
為了讓它(huffman.cpp)快速運行,我花了很長時間。同時,我沒有使用任何動態庫,比如STL或者MFC。它壓縮1M數據少於100ms(P3處理器,主頻1G)。
壓縮
壓縮代碼非常簡單,首先用ASCII值初始化511個哈夫曼節點:
CHuffmanNode nodes[511];
for(int nCount = 0; nCount < 256; nCount++)
nodes[nCount].byAscii = nCount;
然後,計算在輸入緩沖區數據中,每個ASCII碼出現的頻率:
for(nCount = 0; nCount < nSrcLen; nCount++)
nodes[pSrc[nCount]].nFrequency++;
然後,根據頻率進行排序:
qsort(nodes, 256, sizeof(CHuffmanNode), frequencyCompare);
現在,構造哈夫曼樹,獲取每個ASCII碼對應的位序列:
int nNodeCount = GetHuffmanTree(nodes);
構造哈夫曼樹非常簡單,將所有的節點放到一個隊列中,用一個節點替換兩個頻率最低的節點,新節點的頻率就是這兩個節點的頻率之和。這樣,新節點就是兩個被替換節點的父節點了。如此循環,直到隊列中只剩一個節點(樹根)。
// 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;
這里我用了一個好的訣竅來避免使用任何隊列組件。我先前就直到ASCII碼只有256個,但我分配了511個(CHuffmanNode nodes[511]),前255個記錄ASCII碼,而用後255個記錄哈夫曼樹中的父節點。並且在構造樹的時候只使用一個指針數組(ChuffmanNode *pNodes[256])來指向這些節點。同樣使用兩個變數來操作隊列索引(int nParentNode = nNodeCount;nBackNode = nNodeCount –1)。
接著,壓縮的最後一步是將每個ASCII編碼寫入輸出緩沖區中:
int nDesIndex = 0;
// loop to write codes
for(nCount = 0; nCount < nSrcLen; nCount++)
{
*(DWORD*)(pDesPtr+(nDesIndex>>3)) |=
nodes[pSrc[nCount]].dwCode << (nDesIndex&7);
nDesIndex += nodes[pSrc[nCount]].nCodeLength;
}
(nDesIndex>>3): >>3 以8位為界限右移後到達右邊位元組的前面
(nDesIndex&7): &7 得到最高位.
注意:在壓縮緩沖區中,我們必須保存哈夫曼樹的節點以及位序列,這樣我們才能在解壓縮時重新構造哈夫曼樹(只需保存ASCII值和對應的位序列)。
解壓縮
解壓縮比構造哈夫曼樹要簡單的多,將輸入緩沖區中的每個編碼用對應的ASCII碼逐個替換就可以了。只要記住,這里的輸入緩沖區是一個包含每個ASCII值的編碼的位流。因此,為了用ASCII值替換編碼,我們必須用位流搜索哈夫曼樹,直到發現一個葉節點,然後將它的ASCII值添加到輸出緩沖區中:
int nDesIndex = 0;
DWORD nCode;
while(nDesIndex < nDesLen)
{
nCode = (*(DWORD*)(pSrc+(nSrcIndex>>3)))>>(nSrcIndex&7);
pNode = pRoot;
while(pNode->pLeft)
{
pNode = (nCode&1) ? pNode->pRight : pNode->pLeft;
nCode >>= 1;
nSrcIndex++;
}
pDes[nDesIndex++] = pNode->byAscii;
}

D. 跪求 編譯原理實驗 中間代碼生成(生成四元式)及目標代碼生成(匯編語言) 要求可以處理if 及while循環

利用ADC0809採用中斷式設計一個溫度測控系統,在LED數碼顯示器上顯示溫度值,並對溫度進行測試和控制

E. 急求!!!用C語言編寫一個編譯原理實驗的簡單優先分析法程序

編譯原理IF條件語句的翻譯程序設計—簡單優先法、輸出四元式通過設計、編制、調試一個條件語句的語法及語義分析程序,加深對語法及語義分析原理的理解,並實現詞法分析程序對單詞序列的詞法檢查和分析。具體做到以下幾點:①對輸入語句進行詞法分析。將輸入的字元串進行掃描和分解,識別出一個個合法的單詞。單詞種類包括:關鍵字,標識符,運算符,常數和界限符②進行語法分析。編寫條件語句的相應文法,按照語法分析方法中的簡單優先分析法為文法設計簡單優先表,對詞法分析得到的單詞序列進行語法分析,以判別輸入的語句是否屬於該文法的條件語句。③語法制導翻譯。設計中間代碼(四元式)序列的結構及屬性文法,運用語法制導翻譯,在進行語法分析的同時,執行相應的語義規則描述的動作,從而實現語義處理,生成中間代碼以四元式的形式輸出。④錯誤提示。對不同的錯誤給出簡略描述,並終止程序的繼續執行。下載地址如下,有你要的東西!pile.rar

F. 王爽老師匯編語言第四章4.4編譯,實驗的時候遇到的問題

你可能是通過雙擊打開的masm.如果想回車完了後看到編譯情況,需要進入DOS環境,即運行command或cmd之類的.在dos環境下,通過命令方式進行操作,就可看到了!!!

G. c語言實驗

要連續輸入兩個數吧(中間不要有空隔),如果先輸入一個數如a,再按空隔鍵,最後再輸入一個數如b,這樣是不行的。因為空隔鍵已佔了一個位元組。如果按這樣輸入的話,實質上把a給了c1,空隔給了c2,而b被電腦抹殺把(因為getchar只能接收一個字元),最終輸出只能a和空隔,只不過空隔看不見,但它是存在的。

H. 編譯原理 實驗 題目是 用C語言編寫語法分析以及中間代碼生成程序

這是一個大工程,我們也正在做編譯原理,我做完了語法分析,你自己看書做吧

I. 世界上第一個語言編譯程序是用什麼語言編寫的

數字電子計算機,在1946年誕生,那時還沒有編譯程序,一台計算機就是一個程序,修改程序,就是直接修該內存的指令(電路).後來,出現了匯編程序(當然用機器語言寫的),匯編語言就出現了,在後來就有了高級語言.至於第一個編譯程序,嚴格來說匯編程序也是編譯程序,所以是用機器語言寫的.

閱讀全文

與語言編譯實驗相關的資料

熱點內容
應屆畢業生程序員實習期怎麼過 瀏覽:706
板石樓梯計演算法 瀏覽:434
swift開發pdf 瀏覽:293
ideajava編譯版本 瀏覽:964
邁普交換機常用命令 瀏覽:179
刪除創建的文件夾命令 瀏覽:183
linuxmysql連接拒絕連接 瀏覽:821
php關鍵詞源碼 瀏覽:830
小米公司需要那麼多程序員嗎 瀏覽:897
超准macd副圖源碼 瀏覽:10
好脾氣的程序員 瀏覽:664
macppt壓縮軟體 瀏覽:135
公眾號推廣系統源碼 瀏覽:66
程序員作息安排 瀏覽:625
如何在本地登錄伺服器 瀏覽:338
喵吧app怎麼使用 瀏覽:754
家庭伺服器如何連wifi 瀏覽:209
新聞推薦系統源碼 瀏覽:227
php中文星號 瀏覽:515
伺服器4盤是什麼意思 瀏覽:598