數(shù)字信號處理實(shí)驗(yàn)報告一二_第1頁
數(shù)字信號處理實(shí)驗(yàn)報告一二_第2頁
數(shù)字信號處理實(shí)驗(yàn)報告一二_第3頁
數(shù)字信號處理實(shí)驗(yàn)報告一二_第4頁
數(shù)字信號處理實(shí)驗(yàn)報告一二_第5頁
已閱讀5頁,還剩29頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

1、數(shù)字信號處理課程實(shí)驗(yàn)報告實(shí)驗(yàn)名稱實(shí)驗(yàn)一、二學(xué)生姓名學(xué)生學(xué)號指導(dǎo)教師趙學(xué) 院信息科學(xué)與工程學(xué)院專業(yè)班級實(shí)驗(yàn)一 離散時間信號和系統(tǒng)響應(yīng)一. 實(shí)驗(yàn)?zāi)康?. 熟悉連續(xù)信號經(jīng)理想采樣前后的頻譜變化關(guān)系,加深對時域采樣定理的理解2. 掌握時域離散系統(tǒng)的時域特性3. 利用卷積方法觀察分析系統(tǒng)的時域特性4. 掌握序列傅里葉變換的計(jì)算機(jī)實(shí)現(xiàn)方法,利用序列的傅里葉變換對離散信號及系統(tǒng)響應(yīng)進(jìn)行頻域分析二、實(shí)驗(yàn)原理 1. 采樣是連續(xù)信號數(shù)字化處理的第一個關(guān)鍵環(huán)節(jié)。對采樣過程的研究不僅可以了解采樣前后信號時域和頻域特性的變化以及信號信息不丟失的條件,而且可以加深對離散傅里葉變換、Z變換和序列傅里葉變換之間關(guān)系式的理解。

2、對連續(xù)信號以T為采樣間隔進(jìn)行時域等間隔理想采樣,形成采樣信號:式中為周期沖激脈沖,為的理想采樣。的傅里葉變換為: 上式表明將連續(xù)信號采樣后其頻譜將變?yōu)橹芷诘?,周期為s=2/T。也即采樣信號的頻譜是原連續(xù)信號xa(t)的頻譜Xa(j)在頻率軸上以s為周期,周期延拓而成的。因此,若對連續(xù)信號進(jìn)行采樣,要保證采樣頻率fs2fm,fm為信號的最高頻率,才可能由采樣信號無失真地恢復(fù)出原模擬信號計(jì)算機(jī)實(shí)現(xiàn)時,利用計(jì)算機(jī)計(jì)算上式并不方便,因此我們利用采樣序列的傅里葉變換來實(shí)現(xiàn),即而為采樣序列的傅里葉變換2. 時域中,描述系統(tǒng)特性的方法是差分方程和單位脈沖響應(yīng),頻域中可用系統(tǒng)函數(shù)描述系統(tǒng)特性。已知輸入信號,可

3、以由差分方程、單位脈沖響應(yīng)或系統(tǒng)函數(shù)求出系統(tǒng)對于該輸入信號的響應(yīng)。本實(shí)驗(yàn)僅在時域求解,對于差分方程可用Matlab中的工具箱函數(shù)filter()函數(shù)求解 一個時域離散線性時不變系統(tǒng)的輸出與輸入間的關(guān)系為:可用Matlab中的工具箱函數(shù)conv()函數(shù)求解三、實(shí)驗(yàn)內(nèi)容及步驟1. 時域采樣定理的驗(yàn)證給定模擬信號:式中 。其幅頻特性如圖所示:選擇三種采樣頻率Fs=1kHz, 300Hz, 200Hz, 生成采樣序列分別用序列表示。編寫程序計(jì)算三個序列的幅頻特性曲線,并繪圖顯示。觀察在折疊頻率附近與連續(xù)信號頻譜有無明顯差別,分析頻譜混疊現(xiàn)象。源代碼:n=0:63;A=444.128;a=50*sqrt

4、(2)*pi;w=50*sqrt(2)*pi;fs=1000;T1=1/(fs);x=A*exp(-a*n*T1).*sin(w*n*T1);subplot(2,3,1);stem(n,x,.);title(Fs=1000Hz時域信號波形);subplot(2,3,4);X = fft(x);X1 = X, X;plot(0:127, abs(X1);title(Fs=1000Hz信號的幅度譜); fs2=300;T2=1/(fs2);x=A*exp(-a*n*T2).*sin(w*n*T2);subplot(2,3,2);stem(n,x,.);title(Fs=300Hz時域信號波形);s

5、ubplot(2,3,5);X = fft(x);X2= X, X;plot(0:127, abs(X2);title(Fs=300Hz信號的幅度譜); fs3=200;T3=1/(fs3);x=A*exp(-a*n*T3).*sin(w*n*T3);subplot(2,3,3);stem(n,x,.);title(Fs=200Hz時域信號波形);subplot(2,3,6);X = fft(x);X3 = X, X;plot(0:127, abs(X3);title(Fs=200Hz信號的幅度譜);圖片:2. 給定一個低通濾波器的差分方程為:輸入序列 (1)分別求出和的系統(tǒng)響應(yīng),并畫出其波形

6、(2) 求出系統(tǒng)的單位脈沖響應(yīng),畫出其波形源代碼:A=1,-0.9;B=0.05,0.05;x1n=ones(1,8),zeros(1,50);x2n=ones(1,100);y1n=filter(B,A,x1n);subplot(3,1,1);stem(y1n,.);title(1) 系統(tǒng)對R8(n)的響應(yīng) y1(n);y2n=filter(B,A,x2n);subplot(3,1,2);stem(y2n,.);title(2) 系統(tǒng)對u(n)的響應(yīng) y2(n);hn=impz(B,A,50);subplot(3,1,3);stem(hn,.);title(3) 系統(tǒng)單位脈沖響應(yīng) h(n);

7、圖片:3. 給定系統(tǒng)的單位脈沖響應(yīng)為 用線性卷積法求分別對系統(tǒng)和的輸出響應(yīng),并畫出波形源代碼:x1n=ones(1,8);h2n=1,2.5,2.5,1,zeros(1,10);y2n=conv(h2n,x1n);subplot(2,1,1);stem(h2n,.b);title(系統(tǒng)單位脈沖響應(yīng)h2(n);subplot(2,1,2);stem(y2n,.b);title(h2(n)與R8(n)的卷積y2(n);圖片:四、實(shí)驗(yàn)思考1. 在分析理想采樣序列特性的實(shí)驗(yàn)中,采樣頻率不同時,相應(yīng)理想采樣序列的傅里葉變換頻譜的數(shù)字頻率度量是否都相同?它們所對應(yīng)的模擬頻率是否相同?為什么?答:因?yàn)閣=T

8、=/fs,所以當(dāng)采樣頻率不同時, 相應(yīng)理想采樣序列的傅里葉變換頻譜的數(shù)字頻率度量不同,因?yàn)槟M信號是一定的,所以對應(yīng)的模擬頻率一定是相同的。如果輸入信號為無線長序列,系統(tǒng)的單位脈沖響應(yīng)是有限長序列,可否用線性卷積法求系統(tǒng)的響應(yīng)?如何求?答:函數(shù)fftfilt的調(diào)用格式為 y=fftfilt(b,x) 該格式是利用基于FFT的重疊相加法對數(shù)據(jù)進(jìn)行濾波,這種頻域?yàn)V波技術(shù)只對FIR濾波器有效。該函數(shù)是通過向量b描述的濾波器對x數(shù)據(jù)進(jìn)行濾波。x是等待濾波的信號;b是FIR濾波器的H(z)的分子多項(xiàng)式系數(shù)如果信號經(jīng)過低通濾波器,把信號的高頻分量濾掉,時域信號會有何變化?用前面第二個實(shí)驗(yàn)結(jié)果進(jìn)行分析說明答

9、:變得更平滑;如果高頻幅度較大,濾除后波形明顯改變。實(shí)驗(yàn)結(jié)論由圖中可以看出兩個序列卷積的傅立葉變換等于其傅立葉的乘積,從而驗(yàn)證了時域卷積定理。通過這次試驗(yàn)更好的熟悉了以前的知識,把以前學(xué)過的,忘了的知識重新拾回來,對MATLAB和信號與系統(tǒng)更加的熟悉。此次試驗(yàn)?zāi)M了但為沖激響應(yīng)已知的系統(tǒng)在不同輸入信號作用下的輸出,主要對一些知識的驗(yàn)證和模擬。采用了卷積進(jìn)行運(yùn)算,得到系統(tǒng)的輸出相應(yīng)。明白了序列傅里葉變換的物理含義,明白了它與理想采樣信號序列的傅里葉變換之間的關(guān)系,采樣信號序列的傅里葉變換實(shí)際上對應(yīng)與理想采樣信號的傅里葉變換,本質(zhì)是相同的。只要將模擬角頻率化為數(shù)字角頻率,這樣就將原來所得到的頻譜函

10、數(shù)周期都?xì)w一化了。實(shí)驗(yàn)二 用FFT對信號作頻譜分析一、實(shí)驗(yàn)?zāi)康?. 進(jìn)一步加深DFT算法原理和基本性質(zhì)的理解2. 掌握用FFT對連續(xù)信號和時域離散信號進(jìn)行頻譜分析的方法3. 了解用FFT進(jìn)行頻譜分析時可能出現(xiàn)的分析誤差及其原因,以便在實(shí)際中正確應(yīng)用FFT二、實(shí)驗(yàn)原理用FFT對信號作頻譜分析是學(xué)習(xí)數(shù)字信號處理的重要內(nèi)容,經(jīng)常需要進(jìn)行譜分析的信號是模擬信號和時域離散信號。對信號進(jìn)行譜分析的重要問題是頻譜分辨率F和分析誤差。頻譜分辨率直接和FFT的變換區(qū)間N有關(guān),F(xiàn)FT能夠?qū)崿F(xiàn)的頻率分辨率是2/N,因此要求2/NF。可以根據(jù)此式選擇FFT的變換區(qū)間N。誤差主要來自于用FFT作頻譜分析時,得到的是離散

11、譜,而信號(周期信號除外)是連續(xù)譜,只有當(dāng)N較大時,離散譜的包絡(luò)才能逼近于連續(xù)譜,因此N要適當(dāng)選擇大一些。周期信號的頻譜是離散譜,只有用整數(shù)倍周期的長度作FFT,得到的離散譜才能代表周期信號的頻譜。如果不知道信號周期,可以盡量選擇信號的觀察時間長一些。對模擬信號進(jìn)行譜分析時,首先要按照采樣定理將其變?yōu)闀r域離散信號。如果是模擬周期信號,也應(yīng)該選取整數(shù)倍周期的長度,經(jīng)過采樣后形成周期序列,按照周期序列的譜分析進(jìn)行。三、實(shí)驗(yàn)步驟及內(nèi)容1. 對以下給出的各序列進(jìn)行譜分析: 選擇FFT的變換區(qū)間N為8和16兩種情況進(jìn)行頻譜分析。分別打印其幅頻特性曲線,并進(jìn)行對比、分析、討論。1、設(shè)計(jì)方法:(1)生成各時

12、域離散信號。(2)計(jì)算8點(diǎn)、16點(diǎn)FFT。(3)繪制頻譜圖。2、源代碼與程序運(yùn)行結(jié)果:x1n的8點(diǎn)和16點(diǎn)FFT變換:x1n=zeros(1,8);x1n(1:4)=1;subplot(2,2,1);stem(0:7,x1n, fill);title(x1(n)的波形);x=fft(x1n,8);subplot(2,2,3);stem(0:7, abs(x), fill);title(x1(n)的8點(diǎn)FFT);subplot(2,2,2);stem(0:7,x1n, fill);title(x1(n)的波形);y=fft(x1n,16);subplot(2,2,4);stem(0:15, ab

13、s(y), fill);title(x1(n)的16點(diǎn)FFT);x2n的8點(diǎn)和16點(diǎn)FFT變換:x2n=zeros(1,8);n1=0:3;n2=4:7;x2n=n1+1,8-n2;subplot(2,2,1);stem(0:7,x2n,.);title(x2(n)的波形);x=fft(x2n,8);subplot(2,2,3);stem(0:7, abs(x),fill);title(x2(n)的8點(diǎn)FFT);subplot(2,2,2);stem(0:7,x2n,fill);title(x2(n)的波形);y=fft(x2n,16);subplot(2,2,4);stem(0:15, ab

14、s(y),fill);title(x2(n)的16點(diǎn)FFT);x3n的8點(diǎn)和16點(diǎn)FFT變換:x3n=zeros(1,8);n1=0:3;n2=4:7;x3n=4-n1,n2-3;subplot(2,2,1);stem(0:7,x3n,fill);title(x3(n)的波形);x=fft(x3n,8);subplot(2,2,3);stem(0:7, abs(x), fill);title(x3(n)的8點(diǎn)FFT);subplot(2,2,2);stem(0:7,x3n, fill);title(x3(n)的波形);y=fft(x3n,16);subplot(2,2,4);stem(0:15

15、, abs(y), fill);title(x3(n)的16點(diǎn)FFT);對比圖:實(shí)驗(yàn)結(jié)果分析(1)、非周期離散序列的8點(diǎn)DFT和16點(diǎn)DFT分別是原序列頻譜函數(shù)的8點(diǎn)和16點(diǎn)采樣。(2)、x3(n)與x2(n)的8點(diǎn)DFT的模相等,但是,當(dāng)N=16時,x3(n)與x2(n)不滿足循環(huán)移位關(guān)系,所以圖形不一樣。2. 對以下各周期序列進(jìn)行頻譜分析 選FFT的變換區(qū)間N為8和16兩種情況分別對以上序列進(jìn)行頻譜分析。分別打印其幅頻特性曲線,并進(jìn)行對比、分析、討論。1、設(shè)計(jì)方法:(1)生成各時域離散信號。(2)計(jì)算8點(diǎn)、16點(diǎn)FFT。(3)繪制頻譜圖。2、源代碼與程序運(yùn)行結(jié)果:x4n的8點(diǎn)和16點(diǎn)FFT

16、變換:n=0:7;x4n=cos(pi/4*n);subplot(2,2,1);stem(0:7,x4n, fill);title(x4(n)的波形);x=fft(x4n,8);subplot(2,2,3);stem(0:7, abs(x), fill);title(x4(n)的8點(diǎn)FFT);n=0:15;x4n=cos(pi/4*n);subplot(2,2,2);stem(0:15,x4n, fill);title(x4(n)的波形);subplot(2,2,4);y=fft(x4n,16);subplot(2,2,4);stem(0:15, abs(y),fill);title(x4(n

17、)的16點(diǎn)FFT);X5n的8點(diǎn)和16點(diǎn)FFT變換:n=0:7;x5n= cos(pi/4*n)+cos(pi/8*n);subplot(2,2,1);stem(0:7,x5n, fill);title(x5(n)的波形);x=fft(x5n,8);subplot(2,2,3);stem(0:7, abs(x), fill);title(x5(n)的8點(diǎn)FFT);n=0:15;x5n= cos(pi/4*n)+cos(pi/8*n);subplot(2,2,2);stem(0:15,x5n, fill);title(x5(n)的波形);subplot(2,2,4);y=fft(x5n,16);

18、subplot(2,2,4);stem(0:15, abs(y), fill);title(x5(n)的16點(diǎn)FFT);對比圖:3、實(shí)驗(yàn)結(jié)果分析:(1)x4(n)的周期為8,所以N=8和N=16均是其周期的整數(shù)倍,得到正確的單一頻率正弦波的頻譜,僅在0.25處有1根單一譜線。如上圖所示。(2)x5(n)的周期為16,所以N=8不是其周期的整數(shù)倍,得到的頻譜不正確,如圖所示。N=16是其一個周期,得到正確的頻譜,僅在0.25n和0.125m處有2根單一譜線。3. 對模擬周期信號進(jìn)行頻譜分析選擇樣頻率Fs=64Hz,對變換區(qū)間N=16,32,64三種情況進(jìn)行譜分析。分別打印其幅頻特性曲線,并進(jìn)行對

19、比、分析、討論。1、設(shè)計(jì)方法:(1)初始化設(shè)置(如采樣頻率、采樣間隔、FFT點(diǎn)數(shù)等)、生成各時域離散信號。(2)根據(jù)FFT點(diǎn)數(shù)計(jì)算時域信號的觀測時間、頻率分辨率F。(3)計(jì)算16點(diǎn)、32點(diǎn)、64點(diǎn)FFT。(4)以零頻率移作為頻譜中心繪制16點(diǎn)、32點(diǎn)、64點(diǎn)FFT的幅度譜。2、程序源代碼運(yùn)行結(jié)果:t=1/64;n=0:15;x6n=cos(pi*8*n*t)+cos(pi*16*n*t)+cos(pi*20*n*t);subplot(3,2,1);stem(0:15,x6n,.);title(x6(n)的波形);x=fft(x6n,16);subplot(3,2,2);stem(0:15, a

20、bs(x),.);title(x6(n)的16點(diǎn)FFT);n=0:31;x6n=cos(pi*8*n*t)+cos(pi*16*n*t)+cos(pi*20*n*t);subplot(3,2,3);stem(0:31,x6n,.);title(x6(n)的波形);x=fft(x6n,32);subplot(3,2,4);stem(0:31, abs(x),.);title(x6(n)的32點(diǎn)FFT);n=0:63;x6n=cos(pi*8*n*t)+cos(pi*16*n*t)+cos(pi*20*n*t);subplot(3,2,5);stem(0:63,x6n,.);title(x6(n)

21、的波形);x=fft(x6n,64);subplot(3,2,6);stem(0:63, abs(x),.);title(x6(n)的64點(diǎn)FFT);3、實(shí)驗(yàn)結(jié)果分析:x6(n)=cos(8t)+cos(16t)+cos(20t)有3個頻率成分,分別為:f1=4HZ(T1=0.25)、f2=8Hz(T2=0.125)、f3=10Hz(T3=0.1),所以x6(n)的周期為0.5s . 采樣頻率F=64Hz=l6f1=8f2=6.4f3.變換區(qū)間N=16時,觀察時間Tp=16Ts=16/64=0.25s,不是x6(n)的整數(shù)倍周期,所以所得頻譜不正確,如圖所示。變換區(qū)間N=32,64時,觀察時間

22、Tp=0.5s,1s,是x6(n)的整數(shù)周期,所以所得頻譜正確,如圖所示。圖中3根譜線正好位于4Hz,8Hz,10Hz處。變換區(qū)間N=64時頻譜幅度是變換區(qū)間N=32時2倍,該結(jié)果正好驗(yàn)證了用DFT對周期序列譜分析的理論。四、實(shí)驗(yàn)思考1. 在N=8時, 和的幅頻特性會相同嗎?為什么?N=16時呢?答:會。因?yàn)镈FT變換具有對稱性,x2(n)和x3(n)的時域序列都是關(guān)于n=N/2點(diǎn)對稱,所以,經(jīng)DFT變換后的幅頻序列相同。對于周期序列,如果周期不知道,如何用FFT進(jìn)行譜分析?答:如果周期信號的周期預(yù)先不知道時,應(yīng)該先作M點(diǎn)的DFT,得到頻譜函數(shù);再作2 M點(diǎn)的DFT,得到頻譜函數(shù)。比較兩者之形

23、狀。如果二者的差別滿足分析誤差要求,則為周期函數(shù)頻譜,可以近似表示該信號的頻譜,如果不滿足誤差要求就繼續(xù)講截取長度加倍,重復(fù)比較,直至結(jié)果滿足要求。五、實(shí)驗(yàn)結(jié)論該實(shí)驗(yàn)完成了離散信號、模擬信號以及周期模擬信號等各種信號的DFT變換,并且驗(yàn)證了離散傅里葉變換的共軛對稱性:主要是求、的8點(diǎn)和16點(diǎn)的FFT變換和的頻譜分析。其中給出了離散序列,而、則是周期序列,是模擬周期信號。離散傅立葉變換可以看作是在時的Z變換,即表明的N點(diǎn)DFT是的Z變換在單位圓上的N點(diǎn)等間隔采樣。離散傅立葉變換也可以看作在時的傅立葉變換,即表明可以看作的傅立葉變換在區(qū)間上的N點(diǎn)等間隔采樣。附錄資料:不需要的可以自行刪除Pasca

24、l/C/C+語句對比(補(bǔ)充版)一、Hello world 先看三種語言的樣例:Pascalbegin writeln(Hello world);end.C#include int main() printf(Hello world!n); return 0;C+#include using namespace std;int main()cout Hello world! endl; return 0; 從這三個程序可以看到一些最基本的東西。在Pascal中的begin和end,在C/C+里就是;Pascal主程序沒有返回值,而C/C+返回0(好像在C中可以為NULL)。在C/C+中,main

25、函數(shù)以前的是頭文件,樣例中C為stdio.h,C+除了iostream還有第二行的using namespace std,這個是打開命名空間的,NOIP不會考這個,可以不管,只要知道就行了。 此外說明 注釋單行用/,段落的話Pascal為,C/C+為/* */。* 常用頭文件(模板)#include #include #include #include #include #include using namespace std;int main() system(“pause”);return 0;二、數(shù)據(jù)類型及定義 這里只列出常用的類型。1、整型PascalC/C+范圍shortint-12

26、8 127integershort-32768 32767longintInt -2147483648 2147483647int64long long-9223372036854775808 9223372036854775807byte-0 255wordunsigned short0 65535longwordunsigned int0 4294967295qwordunsigned long long0 18446744073709551615 * 當(dāng)對long long 變量賦值時,后要加LLLong long x=6327844632743269843LL* 如果位移 x2LL*

27、Linux: printf(“%lldn”,x);* Windows: printf(“%I64dn”,x);2、實(shí)型PascalC/C+范圍realfloat2.9E-39 1.7E38single-1.5E-45 3.4E38doubledouble5.0E-324 1.7E3083、字符即字符串 字符在三種語言中都為char,C里沒有字符串,只有用字符數(shù)組來代替字符串,Pascal和C+均為string。Pascal中字符串長度有限制,為255,C+則沒有。 字符串和字符在Pascal中均用單引號注明,在C/C+中字符用單引號,字符串用雙引號。4、布爾類型 Pascal 中為 boole

28、an,C/C+ 為 bool。值均為True 或 False。C/C+中除0外bool都為真。5、定義 常量的定義均為 const,只是在C/C+中必須要注明常量的類型。在C/C+中還可以用宏來定義常量,此時不注明類型。PascalC/C+const a = 60; b = -a + 30; d = ;const int a = 60;const int b = - a + 30;const string d = “”;define MAXN 501 /這個是宏 * 宏定義其實(shí)就是直接在程序相應(yīng)的位置替換: #define randomize srand(unsigned time(NULL)

29、 #define wait for(int w=0;w a;cout a;cout a endl;特別說明C+中cin一個字符的話會自動跳過空格和回車,Pascal和C則會讀入空格和回車。在Pascal中writeln(a:n:m) 表示在n個字符寬的輸出域上輸出a保留m位小數(shù)。例如:pascal write(a:6) c/c+ printf(“%6d”,a) Pascal write(a:6:2) c/c+ printf(“%6.2f”,a) C+ 如果用 cout ? (繁瑣!) 需要加頭文件 #inlude cout setprecision(2)a; /作用永久 cout setw(6

30、)a; /作用臨時 以下三個進(jìn)制設(shè)定都是永久作用: cout deca; 相當(dāng) printf(“%d”,a); /十進(jìn)制 cout hexa; 相當(dāng) printf(“%X”,a); /十六進(jìn)制 cout octa; 相當(dāng) printf(“%o”,a); /八進(jìn)制例如:cout 12hex12oct1212endl;輸出:12c1414 C 的輸入輸出里面的字符串中%表示變量,%后面的字目表示變量類型。下面是類型表:%hd1個short型整數(shù)%d1個int型整數(shù)%u1個unsigned int型整數(shù)%I64d1個long long型整數(shù)%c1個字符%s1個C字符串%f1個float型實(shí)數(shù)%lf1

31、個double型實(shí)數(shù)%10.4f輸出1個總寬度為10,保留4位小數(shù)的實(shí)數(shù) 文件輸入輸出:Pascalassign(input, test.in);assign(output, test.out);reset(input);rewrite(output);read(a, b);writeln(a, b);close(input);close(output);CFILE *fin = fopen(“test.in”, “r”);FILE *fout = fopen(“test.out”, “w”);fscanf(fin, “%d%d”, &a, &b);fprintf(fout, “%d%d”,

32、a, b);fclose(fin); fclose(fout);C+#include using namespace std;ifstream fin(“test.in”);ofstream fout(“test.out”);fin a b;fout a b endl;fin.close(); fout.close();因?yàn)镃+的讀入較慢,個人建議C+的話使用C的輸入方式。當(dāng)然也有人用C的讀入,C+的輸出的,這種方式我們稱之為城鄉(xiāng)結(jié)合。*中國計(jì)算機(jī)學(xué)會競賽須知發(fā)布的C讀寫程序:(C+ 也能用,cin,cout,scanf,printf 可混用)#include int main() int a

33、,b; freopen(“sum.in”,”r”,stdin);freopen(“sum.out”,”w”,stdout); scanf(“%d%d”,&a,&b); printf(“%dn”,a+b); return 0; 或者:freopen(“sum.in”,”r”,stdin);freopen(“sum.out”,”w”,stdout);ios:sync_with_stdio(false); 取消同步,cin,cout的速度就不慢了! cinab;couta+bendl; return 0;以下擴(kuò)充c/c+混用是可行的:#include #include using namespace

34、 std;int main() int a,b,c,d; freopen(sum.in,r,stdin); freopen(sum.out,w,stdout); scanf(%d%d,&a,&b); cincd; printf(%dn,a+b); couta+b+c+dsn).Cwhile(scanf(%s%d,s,&n)!=EOF).四、賦值語句及運(yùn)算符號 一一對應(yīng)的關(guān)系PascalC/C+賦值運(yùn)算賦值:=基本運(yùn)算加+減-乘*除(實(shí)數(shù))/ (double)除法取整div(int) / (int)取余mod%比較等于=不等于!=大于大于等于=小于小于等于=邏輯且and&或or|非not!位運(yùn)算

35、左移(*2)shl且and&或or|非not異或xor其他增一inc(x)x+減一dec(x)x- 在C/C+中對某個變量自身進(jìn)行運(yùn)算可以簡寫為 變量名 運(yùn)算符號= 改變量 如 x += 8 就表示 x = x + 8, 即 inc(x, 8)。 在 C/C+里還存在一種三目運(yùn)算 變量名 = 條件 ? 值A(chǔ) : 值B 如 x = x 0 ? x : -x; /表示若x 0 則取 x, 否則取 x, 同 if x 0 then x := x else x := -x;五、條件語句1、if C/C+中if 語句的條件必須要用括號括起來,后面不使用then。PascalC/C+if a b then

36、 flag := true else flag := false;if (a b) flag = true;else flag = false;2、多種分支 C/C+中為switch,Pascal為case:PascalC/C+case x of 1: inc(x); 2: dec(x); else x := x * x;end;switch (x) case 1: x +; break; case 2: x -; break; default: x *= x; 切記C/C+中一定要寫break,后果你可以去掉break,運(yùn)行看看就知道了。六、循環(huán)語句1、forPascalC/C+for 變量

37、名 := 初始值 to(downto) 終止值 dofor (變量名=初始值;條件;改變方式)for i := 5 to 10 do dec(a);/終止值大于初始值用 tofor i := 5 downto 1 do dec(a);/終止值小于于初始值用 downtofor (i = 5; i = 1; i-) a-;/*只要i 滿足條件就會一直循環(huán)。C/C+中i是實(shí)數(shù)、指針都可以*/C/C+中for的特殊用法:/變量為實(shí)數(shù)for (double i = 1; i 符號為間接引用,后面會提到。for (type1 *p = head - next; p; p = p - next) prin

38、tf(“%d”, p - k);2、whilePascalC/C+while 條件 dowhile (條件)while i 0 do dec(i);while (i != 0) i-;/也可寫作 while (i) i-;/在C/C+中非0即為真。3、repeat-until & do-whilePascalC/C+repeat 語句 until 結(jié)束條件;do while (運(yùn)行條件)repeat int(i) until i 100;do i+; while (i = 100);七、數(shù)組 Pascal中數(shù)組的下標(biāo)可以隨意定義,而C/C+下標(biāo)始終為從0開始到(數(shù)組大小1)。PascalC/C

39、+定義a : array 1.100 of integer;b :array 1.10,1.10 of int64;int a100;int b1010;含義a 為大小為100的integer數(shù)組,合法下標(biāo)為1到100b 為大小為10*10的int64數(shù)組,合法下標(biāo)為1,1到10,10a 為大小為100的int數(shù)組,合法下標(biāo)為0到99b 為大小為10*10的int數(shù)組,合法下標(biāo)為0,0到9,9;使用inc(a21);b2,2:=b1,1+b1,2+b2,1;a21+;b11=b01+b00+b10; 數(shù)組清零PascalC/C+Fillchar(a, sizeof(a), 0);memset(

40、a, 0, sizeof(a);/頭文件包含 string.h*如果要填最大: memset(a,127,sizeof(a) (但達(dá)不到 INT_MAX) 如果要填最?。?memset(a,128,sizeof(a) (但達(dá)不到 INT_MIN) 如果填0: memset(a,0,sizeof(a) 如果填-1: memset(a,-1,sizeof(a)八、字符串 C風(fēng)格的字符串就是字符數(shù)組。 C+和Pascal的字符串使用基本相同,只是C+中字符串下標(biāo)以0開始,Pascal以1開始。字符串處理很多這里不一一列舉,只寫最常用的幾個。PascalC (包含)定義用:char sC+(包含)定義

41、用:string s輸入輸出Readln(s);Writeln(s);Scanf(“%s”,s);Printf(“%sn”,s);注:不能輸入輸出c+的字符串Cins;Couts = s 的區(qū)別: getline(cin,s)cins一次性整行讀入,直至行末尾。只讀入一個“單詞”,遇空格和行末停止。例如輸入;How are you?s=” How are you?”讀入整串含空格例如輸入;How are you?s=”How”如果三個都讀:cins1s2s3*C+ 數(shù)字與數(shù)值之間的轉(zhuǎn)換:#include #include #include /必須加入using namespace std;in

42、t main() string text = 152; int number; stringstream ss;ss number; /string - int coutnumber+100endl; ss string string str = ss.str(); return 0;九、過程和函數(shù)1、過程 在C/C+中沒有過程,但可以把返回值為“空”的函數(shù)理解為過程。PascalC/C+無參過程procedure 過程名;說明部分begin 語句部分 end;/說明部分、begin、end語句部分統(tǒng)稱為過程體void 函數(shù)名(); 主體部分; return ;帶參過程procedure 過程

43、名(形參表)過程體void 函數(shù)名(形參表)過程體 值傳和址傳:當(dāng)一個參數(shù)是值傳時,形參在子過程中相當(dāng)于一個局部變量,對它的改變不影響實(shí)在的參數(shù)值。址傳則會影響。下例中a為值傳,b為址傳。初始a = 5,b = 5,運(yùn)行后a = 5,b = 10;PascalC/C+var a, b:integer;procedure doit(a:integer; var b:integer);begin b := a + b; a := a + b;end;begina := 5;b := 5;doit(a, b);writeln(a, , b);end.void doit(int a, int &b)

44、HYPERLINK a a認(rèn)為值參,b認(rèn)為變量傳參 b += a; a += b; return ;int main()int a = 5, b = 5;doit(a, b);cout a b;return 0;* 用若干地址傳參可以給調(diào)用者傳回若干值 Void tryit(int &x,int &y,int &z) 調(diào)用時: tryit(a,b,c) ,可以傳回 a,b,c的值。* 用數(shù)組名(也是地址)傳參可以傳回整組的數(shù)據(jù) Void tryit( int a) 調(diào)用時: tryit(x),可以傳回整個數(shù)組。例如:void tryit(int a) for(int i=0;i=10;i+)

45、ai=i*2; return; int main() int x10; tryit(x); for(int i=0;i=10;i+) coutxiendl; system(pause); return 0;*用指向函數(shù)的指針作為參數(shù),可以執(zhí)行指定的函數(shù)。(略)STL 的兩個應(yīng)用:* C+ 快排函數(shù)#include Bool com(int a,int b) Return ab;Int main() Int a10=5,7,3,2,6,8,4,3,5,7;Sort(a,a+10,com); /如果升序可以省略com.For(int i=0;i10;i+) Coutai” “;* 優(yōu)先隊(duì)列(以堆排

46、為例)#include #include using namespace std;priority_queue Q;int main() int n,a; cinn; while (n-) cina; Q.push(a); while (!Q.empty() cout Q.top() ; Q.pop(); return 0;* 隊(duì)列、棧、優(yōu)先隊(duì)列 三種數(shù)據(jù)結(jié)構(gòu)匯總:#include #include priority_queue Q;queue Q1;stack S;int main()Q.push(5); x = Q.top(); Q.pop();Q.empty();Q.size()Q1.push(5); Q1.size(); Q1

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論