基于MATLAB的m序列產(chǎn)生_第1頁(yè)
基于MATLAB的m序列產(chǎn)生_第2頁(yè)
基于MATLAB的m序列產(chǎn)生_第3頁(yè)
基于MATLAB的m序列產(chǎn)生_第4頁(yè)
基于MATLAB的m序列產(chǎn)生_第5頁(yè)
已閱讀5頁(yè),還剩26頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

設(shè)計(jì)內(nèi)容及要求

基于MATLAB產(chǎn)生m序列

要求:

1.通過(guò)matlab編程產(chǎn)生m序列的產(chǎn)生原理及其產(chǎn)生方法。

2.對(duì)特定長(zhǎng)度的m序列,分析其性質(zhì),及其用來(lái)構(gòu)造其它序列的方法。

第二章m序列設(shè)計(jì)方案的選擇

2.1方案一

MATLAB編程非常簡(jiǎn)單,無(wú)需進(jìn)行變量聲明,可以很方便的實(shí)現(xiàn)m序列。

2.2方案二

圖2.1Simulink實(shí)現(xiàn)m序列

Simulink是MATLAB最重要的組件之一,它提供了一個(gè)動(dòng)態(tài)系統(tǒng)建模,仿真和綜合分析的集成環(huán)境。在此環(huán)境中無(wú)需大量書寫程序,而只需通過(guò)簡(jiǎn)單直觀的鼠標(biāo)操作,就可構(gòu)造出復(fù)雜的系統(tǒng)。Simulink具有適應(yīng)性廣,結(jié)構(gòu)及流程清晰及仿真精細(xì)等優(yōu)點(diǎn),基于以上優(yōu)點(diǎn),Simulink已被廣泛的運(yùn)用到控制理論和數(shù)字信號(hào)處理的復(fù)雜仿真和設(shè)計(jì)。

通過(guò)比較方案一和方案二,發(fā)現(xiàn)方案一的有點(diǎn)具有通用性而方案二利用MATLAB的Simulink直接搭建模塊,在移位寄存器較少的情況下利用此方法比較簡(jiǎn)單,可是當(dāng)移位寄存器的個(gè)數(shù)增多時(shí),要搭建那么多的模塊就顯的很繁瑣了,缺乏通用性,因此本次實(shí)驗(yàn)選擇方案一。

m序列的產(chǎn)生及性質(zhì)

3.1m序列的產(chǎn)生原理、結(jié)構(gòu)及產(chǎn)生

m序列是最長(zhǎng)線性反饋移位寄存器序列的簡(jiǎn)稱,m序列是由帶線性反饋的移位寄存器產(chǎn)生的。

由n級(jí)串聯(lián)的移位寄存器和反饋邏輯線路可組成動(dòng)態(tài)移位寄存器,如果反饋邏輯線路只由模2和構(gòu)成,則稱為線性反饋移位寄存器。

帶線性反饋邏輯的移位寄存器設(shè)定初始狀態(tài)后,在時(shí)鐘觸發(fā)下,每次移位后各級(jí)寄存器會(huì)發(fā)生變化,其中任何一級(jí)寄存器的輸出,隨著時(shí)鐘節(jié)拍的推移都會(huì)產(chǎn)生一個(gè)序列,該序列稱為移位寄存器序列。

n級(jí)線性移位寄存器的如圖3.1所示:

eq\o\ac(

,A)

圖3.1n級(jí)線性移位寄存器

圖中Ci表示反饋線的兩種可能連接方式,Ci=1表示連線接通,第n-i級(jí)輸出加入反饋中;Ci=0表示連線斷開(kāi),第n-i級(jí)輸出未參加反饋。

因此,一般形式的線性反饋邏輯表達(dá)式為

------表達(dá)式3.1

將等式左邊的an移至右邊,并將an=C0an(C0=1)帶入上式,則上式可以寫成

-------表達(dá)式3.2

定義一個(gè)與上式相對(duì)應(yīng)的多項(xiàng)式

--------表達(dá)式3.3

其中x的冪次表示元素的相應(yīng)位置。該式為線性反饋移位寄存器的特征多項(xiàng)式,特征多項(xiàng)式與輸出序列的周期有密切關(guān)系。當(dāng)F(x)滿足下列三個(gè)條件時(shí),就一定能產(chǎn)生m序列:

F(x)是不可約的,即不能再分解多項(xiàng)式;

F(x)可整除xn+1,這里p=2n+1;

F(x)不能整除xn+1,這里q<q.

滿足上述條件的多項(xiàng)式稱為本原多項(xiàng)式,這樣產(chǎn)生m序列的充要條件就變成了如何尋找本原多項(xiàng)式。

3.2m序列的基本性質(zhì)

均衡性。在m序列一個(gè)周期中‘1’的個(gè)數(shù)比‘0’要多1位,這表明序列平均值很小。

m序列與其移位后的序列模2相加,所得的序列還是m序列,只是相位不同而已。例如:1110100與向又移3位的序列1001110相對(duì)應(yīng)模二相加后的序列為0111010,相當(dāng)于原序列向右移一位后的序列,仍為m序列。

m序列發(fā)生器中移位寄存器的各種狀態(tài),除全0狀態(tài)外,其他狀態(tài)只在m序列中出現(xiàn)一次。

m序列發(fā)生器中,并不是任何抽頭組合都能產(chǎn)生m序列。理論分析指出,產(chǎn)生的m序列數(shù)由下式?jīng)Q定:

--------表達(dá)式3.4

其中φ(X)為歐拉數(shù)。例如5級(jí)移位寄存器產(chǎn)生31位m序列只有6個(gè)。

m序列具有良好的自相關(guān)性,其自相關(guān)系數(shù):

-------表達(dá)式3.5

從m序列的自相關(guān)系數(shù)可以看出m序列是一個(gè)狹義偽隨機(jī)碼。

圖3.2m序列信號(hào)的自相關(guān)函數(shù)

3.3生成m序列的模塊

根據(jù)m序列的生成原理圖,如圖3.1所示,由圖可知m序列是多級(jí)移位寄存器通過(guò)線性反饋再進(jìn)行模二相加產(chǎn)生的,最后一位一位輸出觀察其波形圖。程序中使用的代碼如下:

N=2^length(reg1)-1;

fork=1:N

a_n=mod(sum(reg1.*coeff1(1:length(coeff1)-1)),2);

reg1=[reg1(2:length(reg1)),a_n];

out1(k)=reg1(1);

end

其中N為m序列的長(zhǎng)度,值為(26-1)。由程序已定義了移位寄存器的初始狀態(tài)和抽頭系數(shù),在此基礎(chǔ)上進(jìn)行反饋,后進(jìn)行模二加,所得的結(jié)果為輸出的第一個(gè)值,初始狀態(tài)向左移移位,而所得的輸出值填補(bǔ)上變成新的序列,在進(jìn)行第二次反饋和模二加,依次循環(huán)N次,產(chǎn)生m序列

第四章m序列構(gòu)造其他序列

Gold序列具有三值互相關(guān)函數(shù),其值為:

(式2.10)

這里,

(式2.11)

當(dāng)r為奇數(shù)時(shí),gold序列中約有50%的碼序列歸一化相關(guān)函數(shù)值為-1/p。當(dāng)r為偶數(shù)但又不是4的倍數(shù)是,約有75%的碼序列歸一化互相關(guān)函數(shù)值為-1/p。

Gold序列是R.Gold于1967年提出來(lái)的,它由兩個(gè)m序列按下述方法演變而來(lái)的:把2個(gè)碼長(zhǎng)相同的m序列移位并進(jìn)行模2加,如果相加的兩個(gè)m序列是一對(duì)優(yōu)選對(duì),則相加的結(jié)果為一個(gè)Gold序列。

設(shè)有一對(duì)周期為N=2r-1的m序列優(yōu)選對(duì){a},{b},以其中任意一個(gè)序列為基準(zhǔn)序列,如{a},對(duì)另一個(gè)序列{b}進(jìn)行移位i次,得到{b}的移位序列{bi},然后與序列{a}進(jìn)行模二加得到一個(gè)新的周期為N的序列{c},則稱新序列{c}為Gold序列,既

{ci}={a}+{b}i=0,1,2,....,N

4.1Gold序列的產(chǎn)生方框圖

產(chǎn)生gold序列的程序代碼如下:

gold=mod(out1+out2,2);

程序調(diào)試及運(yùn)行結(jié)果

5.1仿真設(shè)計(jì)流程圖

確認(rèn)程序無(wú)

編寫程序

規(guī)劃程序模塊

仿真準(zhǔn)備

結(jié)束

是否達(dá)到要

生成仿真圖形

運(yùn)行,調(diào)試及數(shù)據(jù)分析

設(shè)置仿真參數(shù)

圖5.1實(shí)驗(yàn)仿真流程圖

5.2實(shí)驗(yàn)的調(diào)試與運(yùn)行結(jié)果

程序中把移位寄存器的初始值定義全為1,抽頭系數(shù)定義為[1000011]和[1100111],根據(jù)公式m序列的長(zhǎng)度=2n-1,可知道所得的兩個(gè)m序列的長(zhǎng)度都為63,所利用的移位寄存器為6個(gè)。代碼如下:

reg1=ones(1,6);%寄存器初始狀態(tài)

coeff1=[1000011];%設(shè)置系數(shù)

reg2=ones(1,7);%寄存器初始狀態(tài)

coeff2=[1001111];%設(shè)置系數(shù)

程序檢測(cè)無(wú)誤后,運(yùn)行程序,得到圖形如下:

圖5.2運(yùn)行后的兩m序列波形仿真圖

根據(jù)產(chǎn)生Gold序列的原理,運(yùn)行程序,得到如下Gold序列的仿真圖;

圖5.3運(yùn)行后Gold序列的仿真圖

自相關(guān)性:首先將第一個(gè)m序列變成雙極性的序列,在與本身進(jìn)行移位相乘進(jìn)行積分運(yùn)算,代碼如下:

out1=2*out1-1;%變?yōu)殡p極性序列

forj=0:N-1

rho(j+1)=sum(out1.*[out1(1+j:N),out1(1:j)])/N;

end

j=-N+1:N-1;

rho=[fliplr(rho(2:N)),rho];

figure(3)

plot(j,rho);

axis([-1010-0.11.2]);title('第一個(gè)m序列的自相關(guān)函數(shù)')

互相關(guān)性:第一個(gè)m序列的函數(shù)與第二個(gè)m序列函數(shù)的移位相乘進(jìn)行積分運(yùn)算。代碼如下:

forj=0:N-1

R(j+1)=sum(out1.*[out2(1+j:N),out2(1:j)]);

圖5.4m序列自相關(guān)性仿真圖

圖5.5兩m序列的互相關(guān)性仿真圖

5.3錯(cuò)誤排除

實(shí)驗(yàn)過(guò)程中出了許多錯(cuò)誤,特別是在對(duì)序列的自相關(guān)性上,缺乏了對(duì)自相關(guān)性的了解,導(dǎo)致出的波形錯(cuò)誤,但在查找資料,修改自相關(guān)函數(shù),終于得到了正確的仿真圖。

結(jié)論

課程設(shè)計(jì)是一個(gè)十分有價(jià)值、有意義的實(shí)踐活動(dòng),把一個(gè)課題設(shè)計(jì)好不是一步到位的,是經(jīng)過(guò)反復(fù)修改,不斷調(diào)試的過(guò)程,期間有困難也有樂(lè)趣,使對(duì)工程實(shí)踐有了一個(gè)初步的認(rèn)識(shí)。

本次課程設(shè)計(jì)實(shí)現(xiàn)了設(shè)計(jì)要求,利用軟件實(shí)現(xiàn)m序列的生成,通過(guò)這次實(shí)驗(yàn)不但加深了對(duì)m序列的了解,而且對(duì)MATLAB的編程有了很好的掌握,雖然在仿真過(guò)程中會(huì)出現(xiàn)一些如程序不對(duì)或出的仿真圖沒(méi)有達(dá)到實(shí)驗(yàn)要求,如m序列中‘1’的個(gè)數(shù)要比‘0’的個(gè)數(shù)多1,而實(shí)際出的仿真圖‘1’和‘0’的個(gè)數(shù)卻是相等的,最后在調(diào)整了頂層原理圖才使得仿真圖正確,在不斷的程序調(diào)整中提高了自己的能力。

m序列可以用軟件實(shí)現(xiàn),也可以用硬件實(shí)現(xiàn),但是通過(guò)此次實(shí)驗(yàn)看出了軟件的諸多優(yōu)點(diǎn)。在課程設(shè)計(jì)的過(guò)程中,查詢了大量的資料,通過(guò)相關(guān)資料的查詢,使我對(duì)通信領(lǐng)域的有關(guān)知識(shí)有了一定的了解,擴(kuò)大了知識(shí)面。

參考資料

[1]肖國(guó)鎮(zhèn),梁傳甲.偽隨機(jī)序列及其應(yīng)用[M].北京:國(guó)防工業(yè)出版社.1985

[2]林可祥,汪一飛.偽隨機(jī)碼的原理與應(yīng)用[M].北京:人民郵電出版社.1998.

[3]吳先用,鄒學(xué)玉.一種m序列偽碼發(fā)生器的產(chǎn)生方法[J].西安:西安電子科技大學(xué)出版社.2003

附錄

clear;

reg1=ones(1,7);%寄存器初始狀態(tài)

coeff1=[1000011];%設(shè)置系數(shù)

N=2^length(reg1)-1;

%產(chǎn)生m序列

fork=1:N

a_n=mod(sum(reg1.*coeff1(1:length(coeff1)-1)),2);

reg1=[reg1(2:length(reg1)),a_n];

out1(k)=reg1(1);

end

reg2=ones(1,7);%寄存器初始狀態(tài)

coeff2=[1100111];%設(shè)置系數(shù)

N=2^length(reg2)-1;

fork=1:N

a_n=mod(sum(reg2.*coeff2(1:length(coeff2)-1)),2);%移位,反饋

reg2=[reg2(2:length(reg2)),a_n];%反饋

out2(k)=reg2(1);%取第一個(gè)值輸出

end

%產(chǎn)生gold序列

gold=mod(out1+out2,2);

c=1:N;

figure(1)

[b1,t1]=stairs(c,out1);

subplot(2,1,1);plot(b1,t1);

axis([0130-0.11.1]);title('第一個(gè)m序列');

[b2,t2]=stairs(c,out2);

subplot(2,1,2);plot(b2,t2);

axis([0130-0.11.1]);title('第二個(gè)m序列');

figure(2)

[b3,t3]=stairs(c,gold);

plot(b3,t3);

axis([0130-0.11.1]);title('gold序列')

out1=2*out1-1;%變?yōu)殡p極性序列

out2=2*out2-1;

%自相關(guān)函數(shù)

forj=0:N-1

rho(j+1)=sum(out1.*[out1(1+j:N),out1(1:j)])/N;

end

j=-N+1:N-1;

rho=[fliplr(rho(2:N)),rho];

figure(3)

plot(j,rho);

axis([-1010-0.11.2]);title('第一個(gè)m序列的自相關(guān)函數(shù)')

%互相關(guān)函數(shù)

forj=0:N-1

R(j+1)=sum(out1.*[out2(1+j:N),out2(1:j)]);

end

j=-N+1:N-1;

R=[fliplr(R(2:N)),R];

figure(4)

plot(j,R);

axis([-NN-2020]);title('兩個(gè)m序列的互相關(guān)函數(shù)');

附錄資料:不需要的可以自行刪除

c語(yǔ)言典型問(wèn)題處理方法小結(jié)

循環(huán)問(wèn)題

(1)、數(shù)論問(wèn)題

1、求素?cái)?shù)

for(i=2;i<=a;i++)

if(a%i==0)

break;

if(a==i)

printf("yes\n");

else

第一個(gè)if判斷是否能被2,3,4……直到本身整除。

第二個(gè)if判斷是否只能被本身整除。

printf("no\n");

素?cái)?shù)概念:

對(duì)于某個(gè)整數(shù)a>1,如果它僅有平凡約數(shù)1和a,則我們稱a為素?cái)?shù)(或質(zhì)數(shù))。

整數(shù)1被稱為基數(shù),它既不是質(zhì)數(shù)也不是合數(shù)。

整數(shù)0和所有負(fù)整數(shù)既不是素?cái)?shù),也不是合數(shù)。

2、求最大公約數(shù)和最小公倍數(shù)

a、

if(a>b)

{

t=a;

a=b;

b=t;

}

for(i=a;i>=1;i--)

if(a%i==0&&b%i==0)

break;

printf("largestcommondivisor:%d\n",i);

printf("leastcommonmultiple:%d\n",(a*b)/is);

b、輾轉(zhuǎn)相除法求解

a1=a;

b1=b;

while(a%b!=0)

{

t=a%b;

a=b;

b=t;

}

printf("largestcommondivisor:%d\nleastcommonmultiple:%d",b,a1*b1/b);

3、求完數(shù)

一個(gè)數(shù)如果恰好等于它的因子之和,這個(gè)數(shù)就稱為“完數(shù)”。

例如:6的因子為1、2、3,而6=1+2+3,因此6是“完數(shù)”。

for(a=1;a<=1000;a++)

{

s=0;

for(i=1;i<=a;i++)

if(a%i==0)

{

s+=i;

if(s>=a)

break;

}

if(s==a)

printf("%d\t",a);

注意S=0所放的位置

}

4、分解質(zhì)因數(shù)

將一個(gè)整數(shù)寫成幾個(gè)質(zhì)因數(shù)的連乘積,如:輸入36,則程序輸出36=2*2*3*3。

解一、

看似簡(jiǎn)單,但要自己完整地寫出來(lái)還真不容易?。?!

竟然還動(dòng)用了goto語(yǔ)句,正好可以熟悉一下goto語(yǔ)句的用法?。?!

main()

{

inta,z,i;

clrscr();

scanf("%d",&a);

判斷下一個(gè)數(shù)開(kāi)始有要重新從2

開(kāi)始了。所以用loop語(yǔ)句回到for語(yǔ)句,這是for語(yǔ)句仍從2初始化。

從2開(kāi)始的原則不變,變的是a的值。

loop:for(z=2;z<=a;z++)

{

判斷是否為質(zhì)數(shù)

for(i=2;i<=z;i++)

if(z%i==0)

break;

判斷是否為a的質(zhì)因數(shù)

if(z==i)

if(a%z==0)

{

k++;

if(k==1)

printf("%d=%d",a1,z);

用計(jì)數(shù)器來(lái)解決每行輸入不同的問(wèn)題。

else

printf("*%d",z);

a/=z;

gotoloop;

}

}

}

解二:

main()

{intn,k=2,isfirst=1;

printf("Inputn=");scanf("%d",&n);

while(k<=n)

if(n%k==0)

{if(isfirst){printf("%d=%d",n,k);isfirst=0;}

elseprintf("*%d",k);

n/=k;

}

elsek++;

printf("\n");

}

5、從鍵盤輸入兩個(gè)整數(shù),輸出這兩個(gè)整數(shù)的商的小數(shù)點(diǎn)后所有1000位整數(shù)

for(i=1;i<=1000;i++)

{

t=a%b;

主要體會(huì)除法運(yùn)算中小數(shù)形成的原因

解決這類題目從本質(zhì)出發(fā)

printf("%d",t*10/b);

a=t*10;

}

printf("\n");

6、編程計(jì)算并輸出兩個(gè)帶分?jǐn)?shù)的差。帶分?jǐn)?shù)就是由一個(gè)整數(shù)和一個(gè)真分?jǐn)?shù)合成的數(shù),兩個(gè)帶分?jǐn)?shù)(整數(shù)、分子、分母均大于0)從鍵盤輸入,且?guī)Х謹(jǐn)?shù)1大于帶分?jǐn)?shù)2,輸入格式為:整數(shù)1[分子1/分母1],整數(shù)2[分子2/分母2]。差要求化簡(jiǎn),整個(gè)輸出樣式為(如差為整數(shù),則無(wú)分?jǐn)?shù)部分,如差的整數(shù)為0,則無(wú)整數(shù)部分):

整數(shù)1[分子1/分母1]-整數(shù)2[分子2/分母2]=整數(shù)[分子/分母]

例如:輸入:12[6/35],8[3/5]

輸出:12[6/35]-8[3/5]=3[4/7]

又如:輸入:6[2/3],4[12/18]

輸出:6[2/3]-4[12/18]=2

又如:輸入:9[7/8],9[3/8]

輸出:9[7/8]-9[3/8]=[1/2]

main()

{

intz1,fz1,fm1,fz1x,z2,fz2,fm2,fz2x,z,fz,fm,fzx,i;

scanf("%d[%d/%d],%d[%d/%d]",&z1,&fz1,&fm1,&z2,&fz2,&fm2);

fz1x=z1*fm1+fz1;

fz2x=z2*fm2+fz2;

fm=fm1*fm2;

fz=fz1x*fm2-fz2x*fm1;

for(i=fm;i>=2;i--)

if(fm%i==0&&fz%i==0)

{

fz/=i;

fm/=i;

}

z=fz/fm;

fzx=fz%fm;

if(fzx==0)

printf("%d[%d/%d]-%d[%d/%d]=%d\n",z1,fz1,fm1,z2,fz2,fm2,z);

elseif(z==0)

printf("%d[%d/%d]-%d[%d/%d]=[%d/%d]\n",z1,fz1,fm1,z2,fz2,fm2,fzx,fm);

else

printf("%d[%d/%d]-%d[%d/%d]=%d[%d/%d]\n",z1,fz1,fm1,z2,fz2,fm2,z,fzx,fm);

}

(2)近似問(wèn)題

1、書P122習(xí)題4-6

注意千萬(wàn)不要忘記添加

#include“math.h”

#include"math.h"

main()

{

floatx,j=1,k,s,so;

intn;

scanf("%f",&x);

s=x;

so=x+1;

for(n=1;fabs(s-so)>1e-6;n++)

{

for(k=1;k<=n;k++)

j*=k;

so=s;

if(n%2!=0)

s-=x*x*x/((2*n-1)*j);

else

s+=x*x*x/((2*n-1)*j);

}

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

2、解方程問(wèn)題:

編程用二分法求解方程x3+4x2-10=0的解。

#include"math.h"

main()

{

可以省略此句

floatx,x1=1,x2=4,f1=-1,f;

/*f1=x1*x1*x1+4*x1*x1-10;*/

while(fabs(x2-x1)>1e-6)

{

x=(x1+x2)/2;

f=x*x*x+4*x*x-10;

可以用/*if(f*f1<0)*/替代

if(f>0)

x2=x;

else

x1=x;

}

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

}

(3)枚舉法

(4)數(shù)列問(wèn)題

二、數(shù)組問(wèn)題

(1)排序問(wèn)題

1、從小到大排序

main()

{

inta[10],i,j,t;

for(i=0;i<10;i++)

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

for(i=1;i<10;i++)

for(j=0;j<10-i;j++)

if(a[j]>a[j+1])

{

t=a[j+1];

a[j+1]=a[j];

a[j]=t;

}

for(i=0;i<10;i++)

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

printf("\n");

注意排序問(wèn)題:

1、須迅速,熟練,無(wú)差錯(cuò)

經(jīng)常插入在程序中間

2、現(xiàn)使用最大數(shù)下沉冒泡法

還可以使用最小數(shù)上浮冒泡法

3、j控制前面一個(gè)數(shù)和后面一個(gè)數(shù)一一比較。由于是最大數(shù)下沉,i+1后j仍要從0開(kāi)始。

4、i控制這樣的操作一共要做多少次

5、注意ij的控制次數(shù)

}

2、從大到小排序

main()

現(xiàn)使用最大數(shù)上浮冒泡法

還可使用最小數(shù)下沉冒泡法

{

inta[10],i,j,t;

for(i=0;i<10;i++)

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

for(i=1;i<10;i++)

for(j=9;j>=i;j--)

if(a[j]>a[j-1])

{

t=a[j-1];

a[j-1]=a[j];

a[j]=t;

}

for(i=0;i<10;i++)

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

}

(2)二維數(shù)組

三、字符或字符串輸入輸出問(wèn)題

(1)字符打印

1、打印*

此類題的溯源為書P1224.11(1),其他題都是它的拓展

for(i=1;i<=n;i++)一共要輸出的行數(shù)

{

for(j=1;j<=i;j++)每行要打印的*數(shù)

printf("*");

printf("\n");

}

a、

*

**

***

****

解題要點(diǎn):

此類題關(guān)鍵在于找到每行要打印的個(gè)數(shù)和行數(shù)的關(guān)系。此題j==i

j==n-i+1

b、

****

***

**

*

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("\n");

}

c、

*

**

***

****

解題要點(diǎn):

在出現(xiàn)空格的時(shí)候,在找到每行要打印的‘*’個(gè)數(shù)和行數(shù)的關(guān)系后,還應(yīng)找到空格和行數(shù)的關(guān)系,分不同的參數(shù)進(jìn)行循環(huán)。此題k==ij==n-i

j==i-1

k==n-i+1

d、

****

***

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;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乘法表

解題要點(diǎn):注意尋找行與列的規(guī)律。

i*j

i代表列

j代表行

for(i=1;i<=9;i++)

{

for(j=1;j<=9;j++)

printf("%-3d",i*j);注意輸出格式的控制

printf("\n");

}

3、九九乘法表

123456789

24681012141618

369121518212427

91827364554637281

4、楊暉三角形

1

11

121

1331

14641

15101051

1615201561

(2)字符串打印問(wèn)題

for(i=1;i<=7;i++)

{

a[i][1]=1;

a[i][i]=1;

}

for(i=3;i<=7;i++)

for(j=2;j<=i-1;j++)

a[i][j]=a[i-1][j-1]+a[i-1][j];

gets(a);

puts(a);

for(i=1;i<=5;i++)

{

t=a[5];

for(j=5;j>0;j--)

a[j]=a[j-1];

a[0]=t;

for(k=0;k<=5;k++)

printf("%c",a[k]);

printf("\n");

}

1、

ABCDEZ

ZABCDE

EZABCD

DEZABC

CDEZAB

BCDEZA

注意交換過(guò)程和把所有的數(shù)后移一位的方法

注意點(diǎn):

inti,不要誤打成chari

a[i]!=’\0’不要誤打成i!=’\0’

邏輯與&&

單引號(hào)內(nèi)表示字符

不加單引號(hào)的字符型數(shù)據(jù)為其ASCII碼

2、輸入一字符串小寫換大寫

chara[81];

inti;

gets(a);

for(i=0;a[i]!='\0';i++)

if(a[i]>='a'&&a[i]<='z')

a[i]-=32;

puts(a);

3、逆序輸出

gets(a);

c=strlen(a);

for(i=0;i<c/2;i++)

{

t=a[i];

a[i]=a[c-1-i];

a[c-1-i]=t;

}

puts(a);

注意此問(wèn)題的思想方法:

要求一組數(shù)的逆序?qū)嵸|(zhì)就是將其對(duì)稱換位

for(inti=n;i>=0;i--)藍(lán)色部分可以簡(jiǎn)寫為綠色部分

cout<<a[i-1];

4、如輸入:ab1@3,;z

輸出:ab1

注意點(diǎn):

1、‘==’

2、while語(yǔ)句的使用處體會(huì)

3、全面考慮問(wèn)題

@3,;z

gets(a);

while(a[0]=='')

for(i=0;a[i]!='\0';i++)

a[i]=a[i+1];

for(i=0;a[i]!='\0';i++)

if(a[i]==''&&a[i+1]!='')

printf("\n");

elseif(a[i]==''&&a[i+1]=='')

{

for(k=i;a[k]!='\0';k++)

a[k+1]=a[k+2];

i--;

}

else

printf("%c",a[i]);

5、輸入3個(gè)字符串,按從小到大排序輸出這3個(gè)字符串。使用一個(gè)兩維數(shù)組貯存多個(gè)字符串

chara[81][81];

注意:如何使用一個(gè)兩維數(shù)組貯存多個(gè)字符串

inti,j;

for(i=0;i<3;i++)

gets(a[i]);

for(i=0;i<3;i++)

puts(a[i]);

注意:

1、scanf("%d%s",&n,str)其中%s為字符串格式

2、逐個(gè)給字符串賦值的方法見(jiàn)書140頁(yè)。

不可for(i=0;a[i]!=’\0’;i++)

3、str[i]=str[i]-'A'+10;

4、pow函數(shù)

5、任何進(jìn)制轉(zhuǎn)為十進(jìn)制的方法

6、輸入一個(gè)整數(shù)n和一個(gè)字符串str,計(jì)算并輸出n進(jìn)制數(shù)str的值。

如輸入:716

則輸出:13 (16)7=(13)10

如輸入:163A

則輸出:58 (3A)16=(58)10

#include"stdio.h"

#include"math.h"

main()

{

charstr[81];

intn,i,s=0,t;

clrscr();

scanf("%d%s",&n,str);

for(i=0;str[i]!='\0';i++)

if(str[i]<='Z'&&str[i]>='A')

str[i]=str[i]-'A'+10;

else

str[i]=str[i]-'0';

t=strlen(str);

for(i=0;str[i]!='\0';i++)

s+=str[t-i-1]*pow(n,i);

printf("%d",s);

}

編寫程序,將一個(gè)十進(jìn)制正整數(shù)轉(zhuǎn)換成十六進(jìn)制數(shù)。

注意類比

#include<stdio.h>

main()

{

chara[20];

intx,i=0,j;

clrscr();

scanf("%d",&x);

while(x)

{

if(x%16>=10&&x%16<=15)

a[i]=x%16-10+'A';

else

a[i]=x%16+'0';

x=x/16;

i++;

}

for(j=i-1;j>=0;j--)

printf("%c",a[j]);

printf("\n");

}



7、輸入一個(gè)字符串,將其中的縮寫形式展開(kāi),并輸出展開(kāi)后的該字符串。所謂展開(kāi)縮寫形式就是將其中由大小寫字母或數(shù)字構(gòu)成的形如"a-f"、"U-Z"、"3-8"的形式展開(kāi)成為"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-0

main()

{

chara[81];

inti,c,s,k,t;

gets(a);

for(i=0;a[i]!='\0';i++)

if(a[i]=='-')if(a[i-1]<a[i+1]&&(a[i-1]>='A'&&a[i+1]<='Z'||a[i-1]>='a'&&a[i+1]<='z'||a[i-1]>='0'&&a[i+1]<='9'))

注意:

必須在結(jié)尾處加上結(jié)束標(biāo)記,才能實(shí)現(xiàn)puts語(yǔ)句。

加上結(jié)束標(biāo)記后for(i=0;a[i]!='\0';i++)語(yǔ)句才能實(shí)現(xiàn)。

邏輯&&與邏輯||的優(yōu)先級(jí)。

s=strlen(a)擺放的位置。

{

s=strlen(a);

c=a[i+1]-a[i-1];

t=i+c-2;

for(k=s-1;k>i;k--)

a[k+c-2]=a[k];

a[s-1+c-2+1]='\0';

for(;i<=t;i++)

a[i]=a[i-1]+1;

}

puts(a);

}

補(bǔ)充:

循環(huán):

求:a+aa+aaa+…..的值

#include<iostream.h>

voidmain()

{

inta,n,i=1,sn=0,tn=0;

cout<<"inputaandn"<<endl;

cin>>a>>n;

while(i<=n)

{

tn=tn+a;

sn+=tn;

a*=10;i++;

}

cout<<"theansweris"<<sn<<endl;

}

兩個(gè)乒乓球隊(duì)進(jìn)行比賽,各出3人。甲隊(duì)為A,B,C;已對(duì)是X,Y,Z;已經(jīng)抽簽決定比賽名單。有人向隊(duì)員大廳比賽的名單。A說(shuō)他不和X比,C說(shuō)他不和X,Z比。請(qǐng)編程序找出3對(duì)賽手的名單。

#include<iostream.h>

voidmain()

{

chari,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')

cout<<"A--"<<i<<"B--"<<j<<"C--"<<k<<endl;

}

枚舉

口袋中有紅,黃,藍(lán),白,黑5種顏色的球若干。每次從口袋中任意取出3歌,問(wèn)得到3種不同顏色球的可能取法,輸出每種排列的情況。

#include<iostream.h>

#include<iomanip.h>//在C語(yǔ)言中不用加這句

voidmain()

{enumcolor{red,yellow,blue,white,black};

colorpri;

inti,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++;

cout<<setw(3)<<n;//setw是輸出格式的限定

for(loop=1;loop<=3;loop++)

{

switch(loop)

{

case1:pri=color(i);break;

case2:pri=color(j);break;

case3:pri=color(k);break;

default:break;

}

switch(pri)

{

casered:cout<<setw(8)<<"red";break;

caseyellow:cout<<setw(8)<<"yellow";break;

caseblue:cout<<setw(8)<<"blue";break;

casewhite:cout<<setw(8)<<"white";break;

caseblack:cout<<setw(8)<<"black";break;

default:break;

}

}

cout<<endl;

}

}

cout<<"total:"<<n<<endl;

}

數(shù)組:

不用strcat函數(shù),編寫程序,將兩個(gè)字符串串接起來(lái)。

#include<iostream>

usingnamespacestd;

voidmain()

{

inti=0;

chara[20],b[10];

gets(a);gets(b);

for(i=0;i<10;i++)

if(a[i]=='\0')break;

for(intj=0;j<10;j++

溫馨提示

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

最新文檔

評(píng)論

0/150

提交評(píng)論