




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、信息理論與編碼實驗指導書武漢理工大學教材中心2009年7月實驗一 繪制二進熵函數(shù)曲線一、實驗目的 1.熟悉 Matlab 工作環(huán)境及工具箱; 2.掌握 Matlab 繪圖函數(shù); 3.理解熵函數(shù)表達式及其性質。 二、實驗內容 實驗內容與要求內容:用 Matlab 軟件繪制二進熵函數(shù)曲線。 要求: 1. 提前預習實驗,認真閱讀教材及相應的參考書,熟悉實驗原理; 2. 遵守實驗室規(guī)定,實驗過程中服從實驗室管理人員和實驗指導老師的管理; 3. 獨立完成實驗,認真做好實驗記錄; 4. 實驗結束后,認真填寫實驗報告。 知識要點 1. 信源熵的概念及其性質。參照教材及參考書。 2. 二進熵公式: 注意:雖然
2、理論上定義 0 log0 = 0 ,但是,在實際運算時,對數(shù)函數(shù) logx 的變量 x 不能取 0 值,而應設置一個系統(tǒng)默認的最小值 eps 。 三、實驗總結 1、繪制二進熵函數(shù)曲線,觀察曲線形狀。 2、結合熵函數(shù)的性質,分析二進熵函數(shù)曲線的特點。 四、思考與提高 1、繪制三元熵函數(shù)曲線,觀察曲線形狀。 2、結合熵函數(shù)的性質,分析三元熵函數(shù)曲線的特點。 p=0.00001:0.00001:0.99999;h=-p.*log2(p)-(1-p).*log(1-p);plot(p,h);title(二進熵函數(shù)曲線);ylabel(H(p,1-p);p=linspace(eps,1-eps,100)
3、;q=linspace(eps,1-eps,100);P,Q=meshgrid(p,q);P_Q=P+Q;for n=1:100 for m=1:100 if P_Q(n,m)=1 Q(n,m)=nan; end endendH=-P.*log2(P)-Q.*log2(Q)-(1-P-Q).*log2(1-P-Q);mesh(P,Q,H);title(三維熵函數(shù)圖像);實驗二 一般信道容量迭代算法一、實驗目的 1、熟悉 Matlab 工作環(huán)境及工具箱; 2、掌握一般信道容量迭代算法的原理。 二、實驗內容 實驗內容與要求 內容:用 Matlab 軟件編程實現(xiàn)一般信道容量迭代算法。 要求: 1、提
4、前預習實驗,認真閱讀相應的參考書,熟悉實驗原理; 2、遵守實驗室規(guī)定,實驗過程中服從實驗室管理人員和實驗指導老師的管理; 3、獨立完成實驗,認真做好實驗記錄; 4、實驗結束后,認真填寫實驗報告。 知識要點::1、一般信道容量迭代算法的原理。參照教材及參考書。 2、程序流程圖如下: 其中:(1)(2)實驗提示:1、設定不同的信道(對稱信道、非對稱信道),計算最佳輸入分布,分析計算結果的異同。 2、設定不同的迭代精度,分析其對計算結果的影響。 三、實驗總結 1、信道的性質與最佳輸入分布的關系。 2、迭代精度對計算結果的影響。 四、思考與提高 1、編制一般信道容量迭代算法的通用程序,適應不同的信道特
5、性。 2、優(yōu)化程序,提高運算速度。 實驗三 二進制霍夫曼編碼一、實驗目的 1、熟悉 Matlab 工作環(huán)境及工具箱; 2、掌握霍夫曼編碼的基本步驟;3、利用MATLAB實現(xiàn)霍夫曼編碼。 二、實驗內容 實驗內容與要求 內容:用 Matlab 軟件編程實現(xiàn)二進制霍夫曼編碼。 要求: 1、提前預習實驗,認真閱讀相應的參考書,熟悉實驗原理; 2、遵守實驗室規(guī)定,實驗過程中服從實驗室管理人員和實驗指導老師的管理; 3、獨立完成實驗,認真做好實驗記錄; 4、實驗結束后,認真填寫實驗報告。 知識要點: 1、霍夫曼編碼的基本原理。參照教材及參考書。 2、二進制霍夫曼編碼方法。 基本原理:變長編碼不要求所有碼字
6、長度相同,對不同概率的信源符號或序列,可賦予不同長度的碼字。 變長編碼力求平均碼長最小,此時編碼效率最高,信源的冗余得到最大程度的壓縮。1)幾種常用變長編碼方法:霍夫曼編碼費若編碼香農(nóng)編碼。2)霍夫曼編碼:二進制霍夫曼編碼r進制霍夫曼編碼符號序列的霍夫曼編碼。3)二進制霍夫曼編碼的編碼過程:將信源中n個符號按概率分布的大小,以遞減次序排列起來; 用0和1碼分別分配給概率最小的兩個信源符號,并將這兩個概率最小的信源符號合并成一個新符號,并用這兩個最小概率之和作為新符號的概率,從而得到只包含n-1個符號的新信源,稱為其縮減信源; 把縮減信源的符號仍按概率大小以遞減次序排列,再將最后兩個概率最小的符
7、號合并成一個新符號,并分別用0和1碼表示,這樣又形成一個新縮減信源;依次繼續(xù)下去,直到縮減信源最后只剩兩個符號為止。再將最后兩個新符號分別用0和1 碼符號表示。最后這兩個符號的概率之和為1,然后從最后一級縮減信源開始,依編碼路徑右后向前返回,就得到各信源符號所對應得碼符號序列,即對應得碼字。r進制霍夫曼編碼由二進制霍夫曼編碼可推廣到r進制霍夫曼編碼,只是每次求縮減信源時,改求r個最小概率之和,即將r個概率最小符號縮減為一個新符號,直到概率之和為1。但要注意,即縮減過程中可能到最后沒有r個符號。為達次目的,可給信源添加幾個概率為零的符號。符號序列的霍夫曼編碼對信源編碼除了對信源符號編碼以外,也可
8、對信源符號序列編碼,一般來說,對序列編碼比對單個符號更為有效。實驗提示:1、取得信源概率分布,并進行合法性判斷;2、對信源概率分布進行降序排列; x=fliplr(sort(x) 3、建立空的編碼表構造一個零矩陣;B=zeros(n,n-1) 4、將信源概率分布及以后產(chǎn)生的縮減序列放入矩陣的某一列;5、利用得到的編碼矩陣獲得各元素的編碼結果并輸出。三、實驗總結 1、變長編碼和定長編碼的優(yōu)缺點。 2、二進制霍夫曼編碼的特點。 四、思考與提高 比較各種無失真信源編碼算法的優(yōu)缺點。實驗四 線性分組碼的信道編碼和譯碼一、實驗目的 1、熟悉 Matlab 工作環(huán)境及工具箱; 2、掌握線性分組碼的編碼、譯
9、碼原理以及糾錯原理。 二、實驗內容 實驗內容與要求 內容:用 Matlab 軟件編程實現(xiàn)線性分組碼的信道編碼和譯碼。 要求: 1、提前預習實驗,認真閱讀相應的參考書,熟悉實驗原理; 2、遵守實驗室規(guī)定,實驗過程中服從實驗室管理人員和實驗指導老師的管理; 3、獨立完成實驗,認真做好實驗記錄; 4、實驗結束后,認真填寫實驗報告。 知識要點: 1、線性分組碼的編碼、譯碼原理。參照教材及參考書。 2、線性分組碼的設計。 基本原理:首先,將信息序列分成K個符號一組,然后,在信息組中加入一些校驗碼元,組成N長碼字,由此得到(N,K)分組碼。(N,K)分組碼中任一碼字的碼長為N,所含的信息位數(shù)目為K,校驗位
10、數(shù)目為r=NK,且碼中任意兩個碼字的和仍為碼字。 例如,對于(5,2)分組碼,N=5,K=2,其編碼函數(shù)f 為 由編碼函數(shù)可知: c ( 碼字 )= m( 信息矩陣 ) G (生成矩陣) 其中,生成矩陣當生成矩陣 G 確定后,編碼的問題就解決了。又由編碼函數(shù)的后 3 個方程可以確定校驗方程,對應的矩陣形式為 或 ,式中, H 稱為一致性校驗矩陣。 一致性校驗矩陣如下: H 與 G 的關系: , 。 糾錯譯碼時,若發(fā)送碼字為 c ,則接收序列為 y ,校正子 S=y* =e* 。 因此,可以得到譯碼 c=ye( 模 2 和 ) 。 其中,e稱為差錯圖樣。S是傳輸是否出錯的標志,稱為伴隨式。(5,
11、2) 線性分組碼的最小漢明距離為dmin=3,能夠檢出 2 位錯誤或糾正 1 位錯誤。 線性分組碼的信道編碼和譯碼流程圖: 圖 1 線性分組碼信道編碼流程圖圖 2 線性分組碼信道譯碼流程圖實驗提示:1、線性分組碼中生成矩陣、校驗矩陣、伴隨式之間的關系。 2、在計算矩陣時,注意位操作運算。 三、實驗總結 1、根據(jù)不同的線性分組碼,觀察生成矩陣和校驗矩陣的特性。 2、根據(jù)不同的線性分組碼,分析檢錯和糾錯能力。 四、思考與提高 1、編制線性分組碼的信道編碼和譯碼的通用程序,適應不同的生成矩陣和校驗矩陣。 2、優(yōu)化程序,提高運算速度。實驗五 分組乘積Turbo碼動態(tài)迭代譯碼算法一、實驗目的 1.熟悉
12、Matlab 工作環(huán)境及工具箱; 2.掌握分組乘積Turbo碼的編碼、譯碼原理。 二、實驗內容 實驗內容與要求內容:用 Matlab編程實現(xiàn)分組乘積Turbo碼動態(tài)迭代譯碼仿真、并試著對其算法提出優(yōu)化方法。 要求: 1. 提前預習實驗,認真閱讀教材及相應的參考書,熟悉實驗原理; 2. 遵守實驗室規(guī)定,實驗過程中服從實驗室管理人員和實驗指導老師的管理; 3. 獨立完成實驗,認真做好實驗記錄; 4. 實驗結束后,認真填寫實驗報告。 知識要點 1. 分組乘積Turbo碼(簡稱TPC碼)是一類將分組碼進行串行級聯(lián),并采用分組交織器構成的級聯(lián)碼,是一種構造十分簡單的糾錯碼,它是香農(nóng)信息理論提出后第一個在
13、非零碼率時可以實現(xiàn)無誤碼傳輸?shù)募m錯編碼。 采用迭代譯碼方法,可發(fā)揮該碼的良好性能,并特別適合于高速硬件譯碼。2. TPC碼的編碼結構在乘積碼中,分量碼一般采用線性分組碼,其結構簡單,易于實現(xiàn)。乘積碼的編碼過程可以分為三個步驟:(1)將信息元填入一個m2行m1列的矩陣;(2)對矩陣的每一行用一個(n1,m1)系統(tǒng)分組碼k1進行編碼,得到一個m2行n1列的矩陣;(3)對這個矩陣的每一列用一個(n2,m2)系統(tǒng)分組碼k2進行編碼,最終得到一個n2行n1列的矩陣。這樣得到的糾錯碼是一個(n1*n2,m1*m2)分組碼,所以稱為乘積碼。3. TPC碼的譯碼算法Chase算法是一種找碼字D 的低復雜度的次
14、優(yōu)算法。4.TPC碼的迭代譯碼在迭代過程中行譯碼和列譯碼交替進行,相互之間提供外信息,每進行一次行譯碼或列譯碼可以看作半次迭代。注意: 增加迭代次數(shù)可以提高TPC碼的糾錯性能,但是當?shù)_到一定限度以后,譯碼性能就呈現(xiàn)出飽和的趨勢。三、實驗總結 1、分組乘積Turbo碼動態(tài)迭代譯碼分析、仿真。 2、針對相應算法提出改進意見。 四、思考與提高 1、當使用不同收斂率的兩組參數(shù),比較其迭代的次數(shù),并分析那種參數(shù)可以起到改善譯碼性能的目的。實驗六 MIMO系統(tǒng)信道容量分析一、實驗目的 1.熟悉 Matlab 工作環(huán)境及工具箱; 2.掌握 Matlab 繪圖函數(shù); 3.理解MIMO系統(tǒng)信道容量的分析方法
15、。 二、實驗內容 實驗內容與要求內容:用 Matlab 軟件實現(xiàn)對一些典型MIMO系統(tǒng)信道容量進行仿真。 要求: 1. 提前預習實驗,認真閱讀教材及相應的參考書,熟悉實驗原理; 2. 遵守實驗室規(guī)定,實驗過程中服從實驗室管理人員和實驗指導老師的管理; 3. 獨立完成實驗,認真做好實驗記錄; 4. 實驗結束后,認真填寫實驗報告。 知識要點 1. MIMO:多輸入多輸出無線通信系統(tǒng)。提高通信系統(tǒng)的容量和頻譜利用率,是新一代移動通信系統(tǒng)采用的關鍵技術。2. MIMO系統(tǒng)模型MIMO系統(tǒng)的輸入輸出關系可表示為式中,xn表示從第n根發(fā)射天線發(fā)射的信號。 3. MIMO信道容量這里主要考慮當接收機已知信道
16、狀態(tài)信息而發(fā)射機不知道信道狀態(tài)信息的信道條件在這種信道條件下,可利用三、實驗總結 1、信道矩陣為一個確定性的數(shù)值矩陣時的信道容量。 2、信道傳輸矩陣H為全1矩陣時的情況。 四、思考與提高 1、比較MIMO系統(tǒng)與傳統(tǒng)SISO系統(tǒng)之間的區(qū)別。附錄:(參考程序)1、計算任意多個符號信源的熵function H=entropy(p)% 該函數(shù)用來計算包含任意多個符號的信源熵(比特)% p為DMS的概率分布,行向量if sum(p)=1 % 判斷是否滿足概率完備性 error( !不滿足概率完備性,請重新輸入信源分布) return;else L=length(p) % 得到信源符號的個數(shù) H=0; %
17、 熵值初始化為零 for i=1:L H=H-p(i)*log2(p(i); % 累加熵函數(shù)各個子項 endendMatlab函數(shù)說明:sum(A):求數(shù)組A的元素之和length(X):求矢量X的長度log2(X):計算以2為底X的對數(shù)error:顯示錯誤信息2、繪制二元信源熵函數(shù)曲線clc% 讓概率從一個很小的數(shù)0.000001開始變化,步長為0.001:p=0.000001:0.001:1;h=-p.*log2(p)-(1-p).*log2(1-p); % log2也可以計算矢量,結果也為矢量plot(p,h);title(二符號信源熵函數(shù)曲線);ylabel(H(p,1-p)運行結果:
18、3、繪制三元熵函數(shù)曲線p=linspace(eps,1-eps,100);q=linspace(eps,1-eps,100);P,Q=meshgrid(p,q);P_Q=P+Q;for n=1:100 for m=1:100 if P_Q(n,m)=1 Q(n,m)=nan; end endendH=-P.*log2(P)-Q.*log2(Q)-(1-P-Q).*log2(1-P-Q);mesh(P,Q,H)title(三維熵函數(shù)的圖形)程序說明:(1)eps:極小值,避免0概率事件(2)meshgrid:語法X,Y = meshgrid(x,y) 將矢量x和y規(guī)定的區(qū)域變換為數(shù)組X和Y,X和
19、Y可用于計算2自變量函數(shù)或繪制3維網(wǎng)格/表面。X的各行均為矢量x;Y的各列均為矢量y。(3) nan:無效值(4)mesh:繪制網(wǎng)格曲面運行結果:4將迭代算法用matlab代碼實現(xiàn)如下function answer=chacap(Pt)% Pt:信道矩陣% 用matalb的eps代替信道矩陣內的元素0以避免對0取對數(shù)% C:信道容量r,s=size(Pt); % 確定輸入和輸出符號個數(shù)Pi=ones(1,r)/r; % 行向量,輸入分布初始化為等概Cn=0; % C(n)初始化為0Cn1=inf; % C(n)初始化為無窮大beta=ones(1,r); % 偏互信息的指數(shù)I=1; % 互信息
20、初始化為1while abs(Cn-Cn1)=1.0e-004 % 迭代誤差限 for k=1:r Pi(k)=Pi(k)*beta(k)/I; % 更新輸入分布 end % 以下計算beta(k): Po=Pi*Pt ; % 輸出概率 for k=1:r bt=0; % 中間變量 for j=1:s bt=bt+Pt(k,j)*log(Pt(k,j)/Po(j); end beta(k)=exp(bt); end I=Pi*beta; % 各的加權平均 Cn=log(I); % Cn1=log(max(beta); % 各的最大值endC=Cn*log2(exp(1); % 比特answer
21、=sprintf(該信道的信道容量 C = %f 比特/信道符號,C);程序說明:ones:創(chuàng)建一個全1的數(shù)組inf:無窮大abs:求絕對值該程序返回字符串a(chǎn)nswer5、繪制二進制對稱信道平均互信息量Matlab實現(xiàn)p,q=meshgrid(0.000001:0.01:1,0.000001:0.01:1);Hnoise=-p.*log2(p)-(1-p).*log2(1-p); % 噪聲熵x=(1-p).*q+p.*(1-q);I=-x.*log2(x)-(1-x).*log2(1-x)-Hnoise;mesh(p,q,I)運行結果:分析說明:從圖上可以看出:信道給定的條件下,平均互信息隨信
22、源分布呈現(xiàn)上凸性,具有最大值。而在信源給定的條件下,平均互信息隨信道轉移概率呈現(xiàn)下凸性,具有最小值。6、編制LZW算法function CodeStream,CS_hexa,CS_binary,CompressionRatio=lzw(SourceSeq)% 采用8比特LZW編碼,首先構造一個包含256個“單詞”的字典,% 可以對ASCII碼表中字符構成的序列進行編碼% SourceSeq:信源符號序列% CodeStream:單詞位置構成的碼流序列% CS_hexa:3位16進制數(shù)表示的位置碼% CS_binary:12比特表示的位置碼序列% CompressionRatio:壓縮比Sour
23、ceSeq=uint8(SourceSeq);dict = cell(1,256); % 字典初始化for i = 1:256,dicti = uint8(i-1); % 用2個字節(jié)表示前綴字符endCodeStream=SourceSeq; % 輸出碼流初始化i_CS=1; % 碼流索引len_seq=length(SourceSeq);W1=; % 前綴初始化為空for i=1:len_seq W2=SourceSeq(i); % 讀取第i個序列符號W,必定存在于字典中 neword=W1 W2; % 組成一個新單詞neword position=poscode(neword,dict);
24、 % 在字典中查找新單詞 if isempty(position) % 字典中沒有neword dictend+1=neword; % 將新單詞添加到字典中 ps=poscode(W1,dict); % 獲得W1的位置碼 CodeStream(i_CS)=ps; % 輸出W1的位置碼 W1=W2; % 前綴更新為W2 i_CS=i_CS+1; % else % 字典中已有新單詞 W1=neword; % 更新前綴為新單詞 endendCodeStream(i_CS+1:end)=;CS_hexa=dec2hex(CodeStream,3); % 每個位置碼用12比特(3位16進制數(shù))來表示CS
25、_binary=dec2bin(CodeStream,12); % 每個位置碼用12比特來表示NumCodeword=length(CodeStream); % 碼字個數(shù)CompressionRatio=len_seq*8/(12*NumCodeword); % 計算壓縮比function position = poscode(word,dict)position=; % 位置碼初始化為空if length(word)=1 % word只包含一個字符 position=word; % 該字符的ASCII碼即為其位置碼else % word包含多個字符 for i_dict=257:length
26、(dict) % 在字典的初始位置碼之外查找 if isequal(dicti_dict,word) % 在字典中查找到新單詞W1W2 position=i_dict; % word在字典中的位置序號即為其位置碼 end endend程序說明:uint8:轉換為無符號整數(shù)(0255)cell:創(chuàng)建胞元數(shù)組poscode:為自編的函數(shù),實現(xiàn)在字典中查找單詞位置的功能end:數(shù)組最后的下標7、編制算術編碼算法function codestream=arithcoder(SourceSeq,P,SymbolSet)% SourceSeq:字符串,信源符號序列% P:行矢量,信源符號概率分布% Sym
27、bolSet:字符串,信源符號集合(順序與P對應)len_seq=length(SourceSeq); % 信源序列長度num_sym=length(SymbolSet); % 信源符號個數(shù)F=zeros(1,num_sym); % 符號的累計分布初始化for i=2:num_sym F(i)=F(i-1)+P(i-1); % 計算信源符號的累積概率分布函數(shù)endFF=0; % 序列的累積分布初始化A=1; % 序列對應的區(qū)間長度for i=1:len_seq sym=SourceSeq(i); % 讀取信源序列的第i個符號 i_set=find(SymbolSet=sym); % 確定當前符
28、號sym種子符號集的位置 FF=FF+A*F(i_set); A=A*P(i_set);endCodeLength=ceil(-log2(A); % 確定碼長codeword=;for i=1:CodeLength FF=2*FF; bit=floor(FF); codeword=codeword bit; FF=FF-bit;endcodeword程序說明:ceil:ceil(A)返回不小于A的最小整數(shù)floor:floor(A)返回不超過A的最大整數(shù)8、線性分組碼的信道編碼和譯碼MATLAB實現(xiàn):clear; clc;%編碼G=input(請輸入生成矩陣G,例如:G=1 0 1 1 1;0
29、 1 1 0 1n G=);k,n=size(G);r=n-k;m=input(請輸入需傳送信息m,如m=0 0 0 1 1 0 1 1n m=);l=length(m);if(mod(l,k) disp(輸入的信息有誤);else ge=l/k;%將輸入序列轉化成矩陣mtemp1=;for i=1:ge temp1(i,:)=m(k*(i-1)+1:i*k);endm=temp1;%求校驗矩陣Hc=mod(m*G,2); A=G(:,k+1:n);H=A,eye(r);disp(校驗矩陣);Hdisp(編碼矩陣);cenddisp(敲回車鍵繼續(xù)); pause%解碼y=input(輸入接收序
30、列y,如:y=0 0 0 0 0 0 1 1 0 1 1 0 1 1 1 1 0 0 1 0n y=);temp2=;for i=1:ge temp2(i,:)=y(1,n*(i-1)+1:i*n);endy=temp2s=mod(y*H,2);e=s*pinv(H);for i=1:ge for j=1:n if(e(i,j)0.5-eps) e(i,j)=1; else e(i,j)=0; end endendcc=mod(y+e,2);sc=cc(:,1:2);disp(差錯圖樣); edisp(估計值); ccdisp(譯碼序列); sc附錄資料:不需要的可以自行刪除c語言典型問題處理
31、方法小結循環(huán)問題(1)、數(shù)論問題1、求素數(shù) for(i=2;i1,如果它僅有平凡約數(shù)1和a,則我們稱a為素數(shù)(或質數(shù))。整數(shù) 1 被稱為基數(shù),它既不是質數(shù)也不是合數(shù)。整數(shù) 0 和所有負整數(shù)既不是素數(shù),也不是合數(shù)。 2、求最大公約數(shù)和最小公倍數(shù)a、 if(ab) t=a; a=b; b=t; for(i=a;i=1;i-) if(a%i=0&b%i=0) break; printf(largest common divisor:%dn,i); printf(least common multiple:%dn,(a*b)/is);b、輾轉相除法求解 a1=a; b1=b; while(a%b!=0
32、) t=a%b; a=b; b=t; printf(largest common divisor:%dnleast common multiple:%d,b,a1*b1/b);3、求完數(shù) 一個數(shù)如果恰好等于它的因子之和,這個數(shù)就稱為“完數(shù)”。 例如:6的因子為1、2、3,而6123,因此6是“完數(shù)”。for(a=1;a=1000;a+) s=0; for(i=1;i=a) break; if(s=a) printf(%dt,a);注意S=0所放的位置 4、分解質因數(shù) 將一個整數(shù)寫成幾個質因數(shù)的連乘積,如: 輸入36,則程序輸出36=2*2*3*3 。解一、看似簡單,但要自己完整地寫出來還真不容
33、易!竟然還動用了goto語句,正好可以熟悉一下goto語句的用法!main() int a,z,i; clrscr(); scanf(%d,&a);判斷下一個數(shù)開始有要重新從2開始了。所以用loop語句回到for語句,這是for語句仍從2初始化。從2開始的原則不變,變的是a的值。 loop: for(z=2;z=a;z+)判斷是否為質數(shù)for(i=2;i=z;i+) if(z%i=0) break;判斷是否為a的質因數(shù) if(z=i) if(a%z=0) k+; if(k=1) printf(%d=%d,a1,z);用計數(shù)器來解決每行輸入不同的問題。 else printf(*%d,z); a
34、/=z; goto loop; 解二:main() int n, k=2, isfirst=1; printf(Input n=); scanf(%d,&n); while(k=n) if(n%k=0) if(isfirst) printf(%d=%d, n, k); isfirst=0; else printf(*%d,k); n/=k; else k+; printf(n);5、從鍵盤輸入兩個整數(shù),輸出這兩個整數(shù)的商的小數(shù)點后所有1000位整數(shù) for(i=1;i=2;i-) if(fm%i=0&fz%i=0) fz/=i; fm/=i; z=fz/fm; fzx=fz%fm; if(fz
35、x=0) printf(%d%d/%d-%d%d/%d=%dn,z1,fz1,fm1,z2,fz2,fm2,z); else if(z=0) printf(%d%d/%d-%d%d/%d=%d/%dn,z1,fz1,fm1,z2,fz2,fm2,fzx,fm); else printf(%d%d/%d-%d%d/%d=%d%d/%dn,z1,fz1,fm1,z2,fz2,fm2,z,fzx,fm);(2)近似問題1、書P122習題4-6注意千萬不要忘記添加#include “math.h”#include math.hmain() float x,j=1,k,s,so; int n; scan
36、f(%f,&x); s=x; so=x+1; for(n=1;fabs(s-so)1e-6;n+) for(k=1;k1e-6) x=(x1+x2)/2; f=x*x*x+4*x*x-10;可以用/*if(f*f10) x2=x; else x1=x; printf(%fn,x);(3)枚舉法(4)數(shù)列問題二、數(shù)組問題(1)排序問題1、從小到大排序main() int a10,i,j,t; for(i=0;i10;i+) scanf(%d,&ai); for(i=1;i10;i+) for(j=0;jaj+1) t=aj+1;aj+1=aj;aj=t; for(i=0;i10;i+) prin
37、tf(%d ,ai); printf(n);注意排序問題:1、須迅速,熟練,無差錯經(jīng)常插入在程序中間2、現(xiàn)使用最大數(shù)下沉冒泡法還可以使用最小數(shù)上浮冒泡法3、j控制前面一個數(shù)和后面一個數(shù)一一比較。由于是最大數(shù)下沉,i+1后j仍要從0開始。4、i控制這樣的操作一共要做多少次5、注意i j的控制次數(shù)2、從大到小排序main()現(xiàn)使用最大數(shù)上浮冒泡法還可使用最小數(shù)下沉冒泡法 int a10,i,j,t; for(i=0;i10;i+) scanf(%d,&ai); for(i=1;i=i;j-) if(ajaj-1) t=aj-1; aj-1=aj; aj=t; for(i=0;i10;i+) pri
38、ntf(%d ,ai);(2)二維數(shù)組三、字符或字符串輸入輸出問題(1)字符打印1、打印*此類題的溯源為書P122 4.11(1),其他題都是它的拓展 for (i=1;i=n;i+) 一共要輸出的行數(shù) for(j=1;j=i;j+) 每行要打印的*數(shù) printf(*); printf(n); a、*解題要點:此類題關鍵在于找到每行要打印的個數(shù)和行數(shù)的關系。此題j=i j=n-i+1b、* for(i=1;i=n;i+) 一共要輸出的行數(shù) for(j=1;j=n-i;j+) 控制空格數(shù) printf( ); for(k=1;k=i;k+) 每行要打印的*數(shù) printf(*); printf
39、(n); c、 * * *解題要點:在出現(xiàn)空格的時候,在找到每行要打印的*個數(shù)和行數(shù)的關系后,還應找到空格和行數(shù)的關系,分不同的參數(shù)進行循環(huán)。此題k=i j=n-i j=i-1k=n-i+1d、* * for(i=1;i=n;i+) for(j=1;j=n-i;j+) printf( ); for(k=1;k=2*i-1;k+) printf(*); printf(n); * *e、 * * * for(i=1;i=n-1;i+) for(j=1;j=i;j+) printf( ); for(k=1;k=2*(n-1-i)+1;k+) printf(*); printf(n); for(i=1
40、;i=n;i+) for(j=1;j=n-i;j+) printf( ); for(k=1;k=2*i-1;k+) printf(*); printf(n); * * * * * *2、打印9*9乘法表解題要點:注意尋找行與列的規(guī)律。i*ji代表列j代表行for(i=1;i=9;i+) for(j=1;j=9;j+) printf(%-3d ,i*j); 注意輸出格式的控制 printf(n); 3、九九乘法表1 2 3 4 5 6 7 8 92 4 6 8 10 12 14 16 183 6 9 12 15 18 21 24 27 9 18 27 36 45 54 63 72 814、楊暉三
41、角形11 11 2 11 3 3 11 4 6 4 11 5 10 10 5 11 6 15 20 15 6 1(2)字符串打印問題for(i=1;i=7;i+) ai1=1; aii=1; for(i=3;i=7;i+) for(j=2;j=i-1;j+) aij=ai-1j-1+ai-1j; gets(a); puts(a); for(i=1;i0;j-) aj=aj-1; a0=t; for(k=0;k=a&ai=z) ai-=32; puts (a);3、逆序輸出gets (a); c=strlen(a); for(i=0;i=0;i-) 藍色部分可以簡寫為綠色部分coutai-1;4
42、、如輸入:ab1 3,;z 輸出:ab1注意點:1、= =2、while語句的使用處體會3、全面考慮問題 3,;zgets(a); while(a0= ) for(i=0;ai!=0;i+) ai=ai+1; for(i=0;ai!=0;i+)if(ai= &ai+1!= ) printf(n); else if(ai= &ai+1= ) for(k=i;ak!=0;k+) ak+1=ak+2; i-; elseprintf(%c,ai);5、輸入3個字符串,按從小到大排序輸出這3個字符串。 使用一個兩維數(shù)組貯存多個字符串char a8181;注意:如何使用一個兩維數(shù)組貯存多個字符串 int
43、i,j; for(i=0;i3;i+) gets(ai); for(i=0;i3;i+) puts(ai);注意:1、scanf(%d%s,&n,str) 其中%s為字符串格式2、逐個給字符串賦值的方法見書140頁。 不可for(i=0;ai!=0;i+)3、stri=stri-A+10;4、pow函數(shù)5、任何進制轉為十進制的方法6、輸入一個整數(shù)n和一個字符串str,計算并輸出n進制數(shù)str的值。 如輸入:7 16則輸出:13(16)7=(13)10如輸入:16 3A則輸出:58(3A)16=(58)10#include stdio.h#include math.hmain() char st
44、r81; int n,i,s=0,t; clrscr(); scanf(%d%s,&n,str); for(i=0;stri!=0;i+) if(stri=A) stri=stri-A+10; else stri=stri-0; t=strlen(str); for(i=0;stri!=0;i+) s+=strt-i-1*pow(n,i); printf(%d,s);編寫程序,將一個十進制正整數(shù)轉換成十六進制數(shù)。 注意類比#include main()char a20;int x,i=0,j;clrscr();scanf(%d,&x);while(x) if(x%16=10&x%16=0;j-
45、)printf(%c,aj);printf(n);7、輸入一個字符串,將其中的縮寫形式展開,并輸出展開后的該字符串。所謂展開縮寫形式就是將其中由大小寫字母或數(shù)字構成的形如a-f、U-Z、3-8 的形式展開成為 abcdef 、UVWXYZ 、345678,若出現(xiàn)f-a、A-7、9-5等形式則不予理睬。例如: 輸入:qwe246e-hA-d$-%4-7A-Dz-xp-R4-0輸出:qwr246efghA-d$-%4567ABCDz-xp-R4-0main() char a81; int i,c,s,k,t; gets(a); for(i=0;ai!=0;i+) if(ai=-) if(ai-1=
46、A&ai+1=a&ai+1=0&ai+1i;k-)ak+c-2=ak;as-1+c-2+1=0; for(;i=t;i+) ai=ai-1+1; puts(a);補充:循環(huán):求:a+aa+aaa+.的值#includevoid main()int a,n,i=1,sn=0,tn=0;coutinput a and nan;while(i=n)tn=tn+a;sn+=tn;a*=10;i+;coutthe answer is snendl;兩個乒乓球隊進行比賽,各出3人。甲隊為A,B,C;已對是X,Y,Z;已經(jīng)抽簽決定比賽名單。有人向隊員大廳比賽的名單。A說他不和X比,C說他不和X,Z比。請編程
47、序找出3對賽手的名單。#includevoid main()char i,j,k;for(i=X;i=Z;i+)for(j=X;j=Z;j+)if(i!=j)for (k=X;k=Z;k+)if(i!=k&j!=k)if(i!=X&k!=X&k!=Z)coutA-i B-j C-kendl;枚舉口袋中有紅,黃,藍,白,黑5種顏色的球若干。每次從口袋中任意取出3歌,問得到3種不同顏色球的可能取法,輸出每種排列的情況。#include#include /在C語言中不用加這句void main()enum colorred ,yellow ,blue,white, black;color pri;int i,j,k,n=0,loop;for(i=red;i=black;i+)for(j=red;j=black;j+)if(i!=j)for (k=red;k=black;k+)if(k!=i)&(k!=j)n+;coutsetw(3)n; /setw是輸出格式的限定for(loop=1;loop=3;loop+)switch(loop)case 1:pri=color(i);break;case 2:pri=color(j);break;case 3:pri=color(k);break;default:break;switc
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- T-ZZB 3624-2024 1000kV交流架空輸電線路金具
- T-ZHCA 031-2024 淋洗類化妝品溫和性評價 重建表皮模型組織活力法
- 二零二五年度房屋代管及租戶租賃合同終止通知協(xié)議
- 二零二五年度公共設施配套拆遷房產(chǎn)分割及公益基金合同
- 2025年度門面轉讓及獨家代理權合同
- 二零二五年度合資公司股權合作協(xié)議書
- 2025年度網(wǎng)絡安全責任方合作協(xié)議范本(適用于互聯(lián)網(wǎng)企業(yè))
- 二零二五年度車輛抵押抵貨款金融創(chuàng)新服務協(xié)議
- 二零二五年度銷售團隊市場分析聘用協(xié)議
- 二零二五年度農(nóng)村房屋租賃與農(nóng)村社區(qū)文化活動合作協(xié)議
- 電線電纜檢測報告模板
- 模具開發(fā)管理手冊
- Q∕SY 06505.13-2016 煉油化工工程儀表自動化設計規(guī)范 第13部分:儀表防爆及防護
- 油漆使用登記記錄表
- 【知識點提綱】新教材-人教版高中化學必修第一冊全冊各章節(jié)知識點考點重點難點提煉匯總
- 高中語文基礎知識手冊薛金星
- 輪轂電機驅動電動車懸架和轉向系統(tǒng)設計與性能匹配
- 二年級第二學期體育知識結構圖
- CASS勘測定界操作指導方案
- 中國商品條碼系統(tǒng)注冊登記表規(guī)范填寫
- 湘科教版小學信息技術四年級下冊全冊教案.doc
評論
0/150
提交評論