第一篇:C語(yǔ)言課程設(shè)計(jì)大數(shù)加減實(shí)驗(yàn)報(bào)告
《C語(yǔ)言程序設(shè)計(jì)》課程設(shè)計(jì)
大數(shù)加減
一、目的
因?yàn)镃語(yǔ)言中的int類(lèi)型和long 類(lèi)型的大小范圍僅為(-32767~32767和-2147483647~2147483647),在某些較大型計(jì)算中,數(shù)據(jù)長(zhǎng)度不能滿足需要。本實(shí)驗(yàn)?zāi)康氖怯肅設(shè)計(jì)一個(gè)足夠大的整數(shù)類(lèi)型,實(shí)現(xiàn)兩個(gè)大整數(shù)的加減運(yùn)算。
二、需求分析
1、輸入的形式和輸入值的范圍
運(yùn)行程序時(shí),按照提示將依次輸入一個(gè)整數(shù)、一個(gè)‘+’或‘-’號(hào)和另一個(gè)整數(shù);輸入值最小為0,最大可達(dá)100位,但當(dāng)輸入的兩個(gè)數(shù)都是100位且相加時(shí),可能會(huì)發(fā)生溢出,所以為了保險(xiǎn)起見(jiàn),最大輸入為99位。
2、輸出的形式
輸入的兩個(gè)數(shù)進(jìn)行加法或減法運(yùn)算后,結(jié)果將以一個(gè)整型數(shù)輸出。
3、程序所能達(dá)到的功能
在某些較大型計(jì)算中,C語(yǔ)言中的int類(lèi)型和long 類(lèi)型的長(zhǎng)度不能滿足需要,本程序借助字符數(shù)組來(lái)儲(chǔ)存這兩個(gè)大數(shù),然后根據(jù)0-9的ASCII碼進(jìn)行加減并轉(zhuǎn)換成數(shù)字輸出,從而實(shí)現(xiàn)兩個(gè)大整數(shù)的加減運(yùn)算。
4、初步的測(cè)試計(jì)劃
(1)兩個(gè)正整數(shù)相加,結(jié)果分發(fā)生進(jìn)位和未發(fā)生進(jìn)位兩種情況;(2)兩個(gè)正整數(shù)相減,分大數(shù)減小數(shù)和小數(shù)減大數(shù)兩種情況。
三、概要設(shè)計(jì)
1、主函數(shù)模塊
int mian(){ 定義變量; Do {
定義字符數(shù)組并初始化;
調(diào)用函數(shù)讀入兩個(gè)數(shù)據(jù)和從鍵盤(pán)輸入‘+’或‘-’; 給變量賦值;
中南民族大學(xué)計(jì)算機(jī)科學(xué)學(xué)院計(jì)算機(jī)科學(xué)與技術(shù)專業(yè) 學(xué)號(hào): 姓名: 1
《C語(yǔ)言程序設(shè)計(jì)》課程設(shè)計(jì)
使用switch結(jié)構(gòu)來(lái)實(shí)現(xiàn)加減運(yùn)算并輸出結(jié)果; 提示是否繼續(xù)計(jì)算;
} while();return 0;}
2、子函數(shù)功能
int read(char str[N]);
用數(shù)組讀入整數(shù)并返回?cái)?shù)位;
void increase(char str1[N],char str2[N],char str[N],int m,int n,int a,int b);對(duì)兩個(gè)整數(shù)進(jìn)行加法運(yùn)算 ; void output(char str[N],int m);輸出兩個(gè)整數(shù)相加后的結(jié)果 ;
void calculate(char str1[N],char str2[N],char str[N],int m,int n,int a,int b);比較兩個(gè)整數(shù)的大小,調(diào)用其它函數(shù)執(zhí)行減法運(yùn)算,輸出結(jié)果;
void decrease(char str1[N],char str2[N],char str[N],int m,int n,int a,int b);對(duì)兩個(gè)整數(shù)進(jìn)行減法運(yùn)算 ; void print(char str[N],int m);輸出兩個(gè)整數(shù)相減后的結(jié)果。
3、數(shù)據(jù)類(lèi)型及含義
int a,b,m,n;定義整型變量,a是第一個(gè)整數(shù)的位數(shù),b是第二個(gè)整數(shù)的位數(shù),m是a、b中較大值再加上1,n是a、b中較小值;
char op,ans;定義字符變量,op代表‘+’或‘-’,ans代表你的選擇(完成此次計(jì)算后是否繼續(xù)下一次計(jì)算);
char number1[N]={0},number2[N]={0},number[N]={0};定義三個(gè)字符數(shù)組,分別儲(chǔ)存兩個(gè)輸入值和一個(gè)結(jié)果,并進(jìn)行初始化。
中南民族大學(xué)計(jì)算機(jī)科學(xué)學(xué)院計(jì)算機(jī)科學(xué)與技術(shù)專業(yè) 學(xué)號(hào): 姓名: 2
《C語(yǔ)言程序設(shè)計(jì)》課程設(shè)計(jì)
四、詳細(xì)設(shè)計(jì)
1、偽碼算法
/* 函數(shù)功能:輸入兩個(gè)大正整數(shù),利用字符數(shù)組對(duì)其進(jìn)行加法運(yùn)算或減法運(yùn)算,并輸出結(jié)果*/ /*頭文件*/ #include
void increase(char str1[N],char str2[N],char str[N],int m,int n,int a,int b);void output(char str[N],int m);void decrease(char str1[N],char str2[N],char str[N],int m,int n,int a,int b);void print(char str[N],int m);void calculate(char str1[N],char str2[N],char str[N],int m,int n,int a,int b);/*主函數(shù)*/ int main(){ int a,b,m,n;
/*用于字符串的處理*/ char op,ans;/* 定義變量*/ do { char number1[N]={0},number2[N]={0},number[N]={0};/* 定義三個(gè)字符數(shù)組并進(jìn)行初始化 */
a=read(number1);
/*調(diào)用函數(shù)讀入數(shù)據(jù) */ printf(“請(qǐng)輸入'+'或'-': ”);中南民族大學(xué)計(jì)算機(jī)科學(xué)學(xué)院計(jì)算機(jī)科學(xué)與技術(shù)專業(yè) 學(xué)號(hào): 姓名: 3
《C語(yǔ)言程序設(shè)計(jì)》課程設(shè)計(jì)
scanf(“%c”,&op);/* 讀入'+'或'-' */
getchar();
/* 讀入回車(chē)符 */
b=read(number2);
m=(a>=b?a:b)+1;
n=(a<=b?a:b);
switch(op)
{
case '+':
increase(number1,number2,number,m,n,a,b);
output(number,m);
break;
case '-':
calculate(number1,number2,number,m,n,a,b);
break;
default:
printf(“輸入錯(cuò)誤!n”);
}
printf(“你想繼續(xù)嗎?輸入y表示繼續(xù),輸入n表示放棄:”);
scanf(“%c”,&ans);getchar();}while((ans=='Y')||(ans=='y'));return 0;}
int read(char str[N]){ int i;使用循環(huán)讀入數(shù)據(jù),儲(chǔ)存到字符數(shù)組
return i;
/* 用i返回字符串長(zhǎng)度即大正整數(shù)位數(shù) */ 中南民族大學(xué)計(jì)算機(jī)科學(xué)學(xué)院計(jì)算機(jī)科學(xué)與技術(shù)專業(yè) 學(xué)號(hào): 姓名:4
《C語(yǔ)言程序設(shè)計(jì)》課程設(shè)計(jì)
}
void increase(char str1[N],char str2[N],char str[N],int m,int n,int a,int b){ 利用字符‘0’到‘9’的ASCII碼進(jìn)行加法運(yùn)算,注意進(jìn)位;
當(dāng)a、b不同時(shí),要考慮a、b的大小,當(dāng)較小的那個(gè)數(shù)累加完后,仔細(xì)思考另一個(gè)數(shù)剩余位上的數(shù)與進(jìn)位的數(shù)相加后是否進(jìn)位及進(jìn)位后該位數(shù)字;
return;}
void output(char str[N],int m){ 逐個(gè)輸入每位數(shù)字,考慮第一位是否為0,如果是0,則不能輸出改為數(shù)字;
return;}
void calculate(char str1[N],char str2[N],char str[N],int m,int n,int a,int b){ printf(“結(jié)果是: ”);if(a>b){
} else if(a
decrease(str2,str1,str,m,n,b,a);printf(“-”);/*考慮到結(jié)果可能是負(fù)數(shù)*/ print(str,m);中南民族大學(xué)計(jì)算機(jī)科學(xué)學(xué)院計(jì)算機(jī)科學(xué)與技術(shù)專業(yè) 學(xué)號(hào): 姓名:
decrease(str1,str2,str,m,n,a,b);/*調(diào)用函數(shù)計(jì)算*/ print(str,m);/*調(diào)用函數(shù)輸出*/
《C語(yǔ)言程序設(shè)計(jì)》課程設(shè)計(jì)
} else /* a=b */ {
} return;}
void decrease(char str1[N],char str2[N],char str[N],int m,int n,int a,int b){ 減法運(yùn)算,考慮借位,分a、b相等和不等進(jìn)行討論;
return;}
void print(char str[N],int m)if(strcmp(str1,str2)>0){
} else if(strcmp(str1,str2)<0){
} else /* strcmp(str1,str2)==0 */ { } printf(“0n”);decrease(str2,str1,str,m,n,b,a);printf(“-”);print(str,m);decrease(str1,str2,str,m,n,a,b);print(str,m);中南民族大學(xué)計(jì)算機(jī)科學(xué)學(xué)院計(jì)算機(jī)科學(xué)與技術(shù)專業(yè) 學(xué)號(hào): 姓名: 6
《C語(yǔ)言程序設(shè)計(jì)》課程設(shè)計(jì)
{ 輸出結(jié)果;
return;}
2、整個(gè)程序流程圖如下: 開(kāi)始輸入數(shù)據(jù)和運(yùn)算符加法判斷運(yùn)算符減法計(jì)算算運(yùn)計(jì)算它其輸出輸入錯(cuò)誤!輸出是否繼續(xù)YESON結(jié)束
五、調(diào)試分析
中南民族大學(xué)計(jì)算機(jī)科學(xué)學(xué)院計(jì)算機(jī)科學(xué)與技術(shù)專業(yè) 學(xué)號(hào): 姓名:
《C語(yǔ)言程序設(shè)計(jì)》課程設(shè)計(jì)
1、關(guān)于用字符數(shù)組來(lái)儲(chǔ)存輸入的數(shù)據(jù)
我最初的想法是用整型數(shù)組來(lái)儲(chǔ)存數(shù)據(jù),將數(shù)據(jù)一次輸入,但在執(zhí)行時(shí)無(wú)法用strlen來(lái)計(jì)算數(shù)據(jù)位數(shù),所以我使用字符數(shù)組,但現(xiàn)在想想用整型數(shù)組也是可以的,只要將一個(gè)數(shù)的相鄰兩位之間都加入空格,而且計(jì)算時(shí)會(huì)簡(jiǎn)單很多,但這樣的輸入很不方便。
2、關(guān)于加減時(shí)出現(xiàn)的問(wèn)題
(1)利用字符0-9的ASCII進(jìn)行計(jì)算、轉(zhuǎn)化,再輸出字符0-9,需要掌握其中規(guī)律,容易出錯(cuò);
(2)需要注意加減運(yùn)算可能出現(xiàn)的進(jìn)位和退位的問(wèn)題;(3)需要考慮兩個(gè)數(shù)據(jù)長(zhǎng)度不同時(shí),其中每個(gè)循環(huán)的控制條件;
3、關(guān)于輸出的問(wèn)題
(1)需要考慮兩個(gè)整數(shù)相加時(shí)結(jié)果的位數(shù)是否增加,如果沒(méi)有增加,如何在輸出時(shí)消除首位的0;
(2)需要考慮兩個(gè)整數(shù)相減時(shí),結(jié)果的正負(fù),輸出時(shí)結(jié)果前的0。
六、測(cè)試結(jié)果
1、加法運(yùn)算
(1)位數(shù)增加
(2)位數(shù)不增加
中南民族大學(xué)計(jì)算機(jī)科學(xué)學(xué)院計(jì)算機(jī)科學(xué)與技術(shù)專業(yè) 學(xué)號(hào): 姓名:
《C語(yǔ)言程序設(shè)計(jì)》課程設(shè)計(jì)
2、減法運(yùn)算
(1)結(jié)果為正
(2)結(jié)果為負(fù)
(3)結(jié)果為0
3、運(yùn)算符輸入錯(cuò)誤 中南民族大學(xué)計(jì)算機(jī)科學(xué)學(xué)院計(jì)算機(jī)科學(xué)與技術(shù)專業(yè) 學(xué)號(hào): 姓名: 9
《C語(yǔ)言程序設(shè)計(jì)》課程設(shè)計(jì)
七、用戶使用說(shuō)明
本程序的算法簡(jiǎn)單明確,但在實(shí)際的編碼過(guò)程中卻遇到了不少細(xì)節(jié)問(wèn)題,分多種情況討論,導(dǎo)致程序相對(duì)較長(zhǎng)和復(fù)雜,還好的是實(shí)際操作簡(jiǎn)單,用戶只需要根據(jù)提示進(jìn)行輸入便可得到結(jié)果,而且可以根據(jù)用戶的選擇重復(fù)計(jì)算。
八、課程設(shè)計(jì)總結(jié)
1、本次課程設(shè)計(jì)難度較大,是我學(xué)習(xí)C語(yǔ)言以來(lái)用時(shí)最長(zhǎng)、代碼最長(zhǎng)的一次編程。
2、本次的課程設(shè)計(jì)加深了我對(duì)C語(yǔ)言的了解,強(qiáng)化了相關(guān)知識(shí),也提高了我對(duì)自己專業(yè)的學(xué)習(xí)興趣。
3、本次課程設(shè)計(jì)的所有內(nèi)容均為自己獨(dú)立思考完成的,一定程度上加強(qiáng)了自己的實(shí)踐能力和思考能力。
4、本次課程設(shè)計(jì)加強(qiáng)了我對(duì)文檔排版的重視,在準(zhǔn)備材料時(shí)首次使用繪圖軟件,也算是一種收獲。
中南民族大學(xué)計(jì)算機(jī)科學(xué)學(xué)院計(jì)算機(jī)科學(xué)與技術(shù)專業(yè) 學(xué)號(hào): 姓名:
《C語(yǔ)言程序設(shè)計(jì)》課程設(shè)計(jì)
源代碼:
/* 函數(shù)功能:輸入兩個(gè)大正整數(shù),利用字符數(shù)組 對(duì)其進(jìn)行加法運(yùn)算或減法運(yùn)算,并輸出結(jié)果 */
#include
#define N 100 int read(char str[N]);/* 用數(shù)組讀入大正整數(shù) */ void increase(char str1[N],char str2[N],char str[N],int m,int n,int a,int b);/* 對(duì)兩個(gè)大正整數(shù)進(jìn)行加法運(yùn)算 */ void output(char str[N],int m);/* 輸出兩個(gè)大正整數(shù)相加后的結(jié)果 */ void decrease(char str1[N],char str2[N],char str[N],int m,int n,int a,int b);/* 對(duì)兩個(gè)大正整數(shù)進(jìn)行減法運(yùn)算 */ void print(char str[N],int m);/* 輸出兩個(gè)大正整數(shù)相減后的結(jié)果 */ void calculate(char str1[N],char str2[N],char str[N],int m,int n,int a,int b);/* 比較兩個(gè)大正整數(shù)的大小,分別執(zhí)行不同的操作 */ int main(){ int a,b,m,n;char op,ans;do { 中南民族大學(xué)計(jì)算機(jī)科學(xué)學(xué)院計(jì)算機(jī)科學(xué)與技術(shù)專業(yè) 學(xué)號(hào): 姓名: 11
《C語(yǔ)言程序設(shè)計(jì)》課程設(shè)計(jì)
char number1[N]={0},number2[N]={0},number[N]={0};/* 定義三個(gè)字符數(shù)組并進(jìn)行初始化 */
a=read(number1);
/* 讀入第一個(gè)大正整數(shù) */
printf(“請(qǐng)輸入'+'或'-': ”);
scanf(“%c”,&op);/* 讀入'+'或'-' */
getchar();
/* 讀入回車(chē)符 */
b=read(number2);/* 讀入第二個(gè)大正整數(shù) */
m=(a>=b?a:b)+1;
n=(a<=b?a:b);
switch(op)
{
case '+':
increase(number1,number2,number,m,n,a,b);
output(number,m);
break;
case '-':
calculate(number1,number2,number,m,n,a,b);
break;
default:
printf(“輸入錯(cuò)誤!n”);
}
printf(“Do you want continue?Y for yes,N for no:”);
scanf(“%c”,&ans);getchar();}while((ans=='Y')||(ans=='y'));return 0;}
int read(char str[N])中南民族大學(xué)計(jì)算機(jī)科學(xué)學(xué)院計(jì)算機(jī)科學(xué)與技術(shù)專業(yè) 學(xué)號(hào): 姓名:12
《C語(yǔ)言程序設(shè)計(jì)》課程設(shè)計(jì)
{ int i;printf(“請(qǐng)輸入一個(gè)正整數(shù): ”);for(i=0;;i++){
} return i;}
void increase(char str1[N],char str2[N],char str[N],int m,int n,int a,int b){ char c,d='0';int i;for(i=1;i<=n;i++){
c=str1[a-i]+str2[b-i]-48;/* 利用ASCII碼對(duì)字符進(jìn)行處理 */ c=c+d-48;d='0';if(c>'9'){
} str[m-i]=c;c=c-10;d=d+1;/* 用i返回字符串長(zhǎng)度即大正整數(shù)位數(shù) */ scanf(“%c”,&str[i]);if(str[i]=='n'){ } break;中南民族大學(xué)計(jì)算機(jī)科學(xué)學(xué)院計(jì)算機(jī)科學(xué)與技術(shù)專業(yè) 學(xué)號(hào): 姓名: 13
《C語(yǔ)言程序設(shè)計(jì)》課程設(shè)計(jì)
} if(a>=b){ for(i=n+1;i<=a;i++){
c=str1[a-i]+d-48;
d='0';
if(c>'9')
{
c=c-10;
d=d+1;
}
str[m-i]=c;} str[0]=d;} else { for(i=n+1;i<=b;i++){
c=str2[b-i]+d-48;
d='0';
if(c>'9')
{
c=c-10;
d=d+1;
}
str[m-i]=c;} 中南民族大學(xué)計(jì)算機(jī)科學(xué)學(xué)院計(jì)算機(jī)科學(xué)與技術(shù)專業(yè) 學(xué)號(hào): 姓名:14
《C語(yǔ)言程序設(shè)計(jì)》課程設(shè)計(jì)
str[0]=d;} return;}
void output(char str[N],int m){ int i;printf(“結(jié)果是: ”);if(str[0]=='1'){
for(i=0;i { printf(“%c”,str[i]); } printf(“n”);} else { for(i=1;i { printf(“%c”,str[i]); } printf(“n”);} return;} 中南民族大學(xué)計(jì)算機(jī)科學(xué)學(xué)院計(jì)算機(jī)科學(xué)與技術(shù)專業(yè) 學(xué)號(hào): 姓名:15 《C語(yǔ)言程序設(shè)計(jì)》課程設(shè)計(jì) void calculate(char str1[N],char str2[N],char str[N],int m,int n,int a,int b){ printf(“結(jié)果是: ”);if(a>b){ decrease(str1,str2,str,m,n,a,b); print(str,m);} else if(a decrease(str2,str1,str,m,n,b,a); printf(“-”); print(str,m);} else /* a=b */ { if(strcmp(str1,str2)>0) { decrease(str1,str2,str,m,n,a,b); print(str,m); } else if(strcmp(str1,str2)<0) { decrease(str2,str1,str,m,n,b,a); printf(“-”); print(str,m); } else /* strcmp(str1,str2)==0 */ 中南民族大學(xué)計(jì)算機(jī)科學(xué)學(xué)院計(jì)算機(jī)科學(xué)與技術(shù)專業(yè) 學(xué)號(hào):姓名: 16 《C語(yǔ)言程序設(shè)計(jì)》課程設(shè)計(jì) } { } printf(“0n”);return;} void decrease(char str1[N],char str2[N],char str[N],int m,int n,int a,int b){ char c;int i;for(i=1;i<=n;i++){ } for(i=n+1;i<=a;i++){ if(str1[a-i]<'0'){ } str[m-i]=str1[a-i];str1[a-i]=str1[a-i]+10;str1[a-i-1]=str1[a-i-1]-1;c=str1[a-i]-str2[b-i]+48;if(c<'0'){ } str[m-i]=c;c=c+10;str1[a-i-1]=str1[a-i-1]-1;中南民族大學(xué)計(jì)算機(jī)科學(xué)學(xué)院計(jì)算機(jī)科學(xué)與技術(shù)專業(yè) 學(xué)號(hào): 姓名: 17 《C語(yǔ)言程序設(shè)計(jì)》課程設(shè)計(jì) } return;} void print(char str[N],int m){ int i;for(i=1;;i++){ if(str[i]!='0') { break; } } for(i;i printf(“%c”,str[i]);} printf(“n”);return;} 中南民族大學(xué)計(jì)算機(jī)科學(xué)學(xué)院計(jì)算機(jī)科學(xué)與技術(shù)專業(yè) 學(xué)號(hào): 姓名:18 擴(kuò)頻實(shí)驗(yàn)報(bào)告 學(xué) 院: 電子信息工程學(xué)院 專 業(yè): 通信工程 組員: 12211008 呂興孝 12211010 牟文婷 12211096 鄭羲 12211004 馮順 任課教師: 姚冬萍 1實(shí)驗(yàn)四 擴(kuò)頻實(shí)驗(yàn) 一、實(shí)驗(yàn)?zāi)繕?biāo) 在本實(shí)驗(yàn)中你要基于labview+usrp平臺(tái)實(shí)現(xiàn)一個(gè)擴(kuò)頻通信系統(tǒng),你需要在對(duì)擴(kuò)頻技術(shù)有一定了解的基礎(chǔ)上編寫(xiě)程序,完成所有要求的實(shí)驗(yàn)任務(wù)。在這一過(guò)程中會(huì)讓你對(duì)擴(kuò)頻技術(shù)有更直接和感性的認(rèn)識(shí),并進(jìn)一步掌握在labview+usrp平臺(tái)上實(shí)現(xiàn)通信系統(tǒng)的技巧。 二、實(shí)驗(yàn)環(huán)境與準(zhǔn)備 軟件環(huán)境:labview 2012(或以上版本); 硬件環(huán)境:一套u(yù)srp和一臺(tái)計(jì)算機(jī); 實(shí)驗(yàn)基礎(chǔ):了解labview編程環(huán)境和usrp的基本操作; 知識(shí)基礎(chǔ):了解擴(kuò)頻通信的基本原理。 三、實(shí)驗(yàn)介紹 1、擴(kuò)頻通信技術(shù)簡(jiǎn)介 擴(kuò)頻通信技術(shù)是一種十分重要的抗干擾通信技術(shù),可以大大提高通信系統(tǒng)的抗干擾性能,在電磁環(huán)境越來(lái)越惡劣的情況下,擴(kuò)頻技術(shù)在諸多通信領(lǐng)域都有了十分廣泛的應(yīng)用。 擴(kuò)頻技術(shù)簡(jiǎn)單來(lái)講就是將信息擴(kuò)展到非常寬的帶寬上——確切地說(shuō),是比數(shù)據(jù)速率大得多的帶寬。在擴(kuò)頻系統(tǒng)中,發(fā)端用一種特定的調(diào)制方法將原始信號(hào)的帶寬加以擴(kuò)展,得到擴(kuò)頻信號(hào);然后在收端對(duì)接收到的擴(kuò)頻信號(hào)進(jìn)行解擴(kuò)處理,把它恢復(fù)為原始的窄帶信號(hào)。 擴(kuò)頻系統(tǒng)之所有具有較強(qiáng)的抗干擾能力,是因?yàn)榻邮斩嗽诮邮盏綌U(kuò)頻信號(hào)后,需要通過(guò)相關(guān)處理對(duì)接收信號(hào)進(jìn)行帶寬的壓縮,將其恢復(fù)成窄帶信號(hào)。對(duì)于干擾信號(hào)而言,由于與擴(kuò)頻信號(hào)不相關(guān),所以會(huì)被擴(kuò)展到很寬的頻帶上,使之進(jìn)入信號(hào)帶寬內(nèi)的干擾功率大幅下降,即增加了相關(guān)器輸出端的信號(hào)/干擾比。因此擴(kuò)頻系統(tǒng)對(duì)大多數(shù)人為干擾都具有很強(qiáng)的抵抗能力。 22、發(fā)射端程序簡(jiǎn)介 本實(shí)驗(yàn)包括發(fā)射端和接收端兩個(gè)主程序,其中發(fā)射端主程序top_tx的前面板如圖1所示。 圖1 發(fā)射端程序前面板 前面板上部的選項(xiàng)卡控件中可以配置各項(xiàng)參數(shù)。在硬件參數(shù)部分中可以配置usrp的ip地址、載波頻率等參數(shù);在信號(hào)參數(shù)部分中可以配置調(diào)制方式、設(shè)配采樣速率、成型濾波器等參數(shù);在信道模型參數(shù)部分中你可以選擇不同的信道模型并設(shè)置噪聲功率;在右側(cè)你可以設(shè)置擴(kuò)頻碼的長(zhǎng)度。在前面板下方為顯示界面,包括發(fā)送信號(hào)的時(shí)域/頻域波形以及星座圖和眼圖。 發(fā)射端的程序框圖主要由兩部分組成。 主程序框圖左側(cè)的transmitter子程序完成發(fā)射信號(hào)的生成、擴(kuò)頻、調(diào)制等功能,程序框圖如圖2所示。 3圖2 transmitter的程序框圖 3、接收端程序簡(jiǎn)介 接收端主程序top_rx的前面板如圖3所示。 圖3 接收端程序前面板 與發(fā)射端程序類(lèi)似,接收端主程序前面板上部為各項(xiàng)參數(shù)的輸入,例如硬件參數(shù)、擴(kuò)頻參數(shù)、同步參數(shù)等。前面板下部顯示生成的圖形,包括星座圖、眼圖、信噪比/誤碼率曲線等。接收端端的程序框圖也主要由兩部分組成。 主程序框圖右側(cè)的receiver.vi子程序主要完成發(fā)射信號(hào)的接受、同步、解擴(kuò)和解調(diào)等功能,程序框圖如圖3所示。4 圖3 receiver.vi 的程序框圖 matched filter子程序完成匹配濾波;其中rx init子程序是接收機(jī)的初始化; synch子程序使同步模塊,完成收發(fā)同步;channel estimated子程序完成信道估計(jì);equalize子程序的作用是信道均衡;strip control子程序用來(lái)刪除控制信息,即訓(xùn)練序列;decode子程序?qū)崿F(xiàn)信號(hào)的解調(diào);de-dsss子程序用來(lái)實(shí)現(xiàn)解擴(kuò);error detect子程序的作用是計(jì)算誤碼率。 接收端主程序框圖的其他部分主要用來(lái)完成usrp的配置、計(jì)算信噪比/誤碼率曲線以及生成所需的圖形。 四、實(shí)驗(yàn)任務(wù) 1、ds-ss.vi子程序 ds-ss子程序的作用是對(duì)信源進(jìn)行直接擴(kuò)頻(direct sequence spread spectrum)。其原理是利用10個(gè)以上的chips來(lái)代表原來(lái)的0或1,使得原來(lái)較高功率、較窄的頻譜變成具有較寬頻的低功率頻譜,這種特性類(lèi)似于噪聲功率譜,因此接收端只有知道正確的擴(kuò)頻碼才能進(jìn)行正確的接收,進(jìn)而增加了傳輸?shù)目煽啃?。它是一種數(shù)字調(diào)制方法,具體說(shuō),就是將信源與一定的pn碼(偽隨機(jī)碼、chip)進(jìn)行同或運(yùn)算。例如,在發(fā)射端用11000100110代替1,用00110010110代替0,這個(gè)過(guò)程就實(shí)現(xiàn)了擴(kuò)頻。上述過(guò)程如圖4所示。 圖4 擴(kuò)頻的實(shí)現(xiàn)過(guò)程 前面板: 圖6 ds-ss前面板 ds-ss程序框圖: 圖7 ds-ss程序框圖 實(shí)驗(yàn)步驟: 1、首先產(chǎn)生所需長(zhǎng)度的偽隨機(jī)序列(pn序列): pn序列(pseudo-noise sequence)即偽噪聲序列,這類(lèi)序列具有類(lèi)似隨機(jī)噪聲的一些統(tǒng)計(jì)特性,但和真正的隨機(jī)信號(hào)不同,它可以重復(fù)產(chǎn)生和處理,故稱作 pn碼最見(jiàn)的用途是在擴(kuò)頻系統(tǒng)中用來(lái)擴(kuò)展信號(hào)頻譜;偽隨機(jī)噪聲序列。此外pn 碼也可以用來(lái)作為信源信息。 圖8 mt generate bits輸入輸出 其中total bits為生成的偽隨機(jī)序列的總長(zhǎng)度、pn sequence order用來(lái)設(shè)定pn序列的循環(huán)周期(如果pn sequence order設(shè)為n,則周期為)、seed in指定pn序列生成器移位寄存器的初始狀態(tài)(默認(rèn)為0xd6bf7df2);output bit stream為偽隨機(jī)序列的輸出。 此外mt generate bits函數(shù)還有user defined模式,在此模式下函數(shù)可以 根據(jù)用戶自定義的輸入序列生成所需長(zhǎng)度的循環(huán)序列。其輸入輸出如圖9所示: 圖9 user defined模式的輸入輸出 其中user base bit pattern為用戶指定的序列,控件會(huì)不斷循環(huán)用戶指定的序列output bit stream為生成序列的直到輸出序列的長(zhǎng)度達(dá)到total bits所設(shè)定的值。輸出。 本例中用到了三個(gè)mt generate bits函數(shù),分別用來(lái)生成保護(hù)序列、同步序列和信息序列。 2、利用產(chǎn)生的序列對(duì)信源序列進(jìn)行擴(kuò)展: 圖10 擴(kuò)頻模塊 輸入信源bit碼、pn擴(kuò)頻碼、誤差;輸出擴(kuò)頻碼、誤差。 72、de-dsss.vi子程序 de-dsss子程序的作用是在接收端實(shí)現(xiàn)對(duì)信號(hào)的解擴(kuò)。解擴(kuò)操作即擴(kuò)頻操作的逆過(guò)程。繼續(xù)使用上面的例子,當(dāng)你在發(fā)射端用11000100110代替1,而用00110010110代替0后,在接收機(jī)處只要把收到的序列是11000100110恢復(fù)成1,而00110010110恢復(fù)成0,這就是解擴(kuò)。上述過(guò)程如圖0所示。 圖11 解擴(kuò)的實(shí)現(xiàn)過(guò)程 前面板: 圖12 de-dsss前面板 de-dsss程序框圖: 圖13 de-dsss程序框圖 五、實(shí)驗(yàn)步驟: 1、產(chǎn)生所需長(zhǎng)度的并與發(fā)射端相同偽隨機(jī)序列(pn序列),同ds-ss; 2、然后利用產(chǎn)生的序列對(duì)接收信號(hào)進(jìn)行解擴(kuò): 輸入:將信源與pn序列通過(guò)“數(shù)組大小”模塊返回其長(zhǎng)度,相除得到的商作為搜索深度;輸入經(jīng)信道傳輸后的擴(kuò)頻碼、與發(fā)送端同步的擴(kuò)頻序列以及誤差。輸出得解擴(kuò)后碼序列以及誤差。 3、實(shí)驗(yàn)驗(yàn)證 在ds-ss子程序中,你可以手動(dòng)輸入一串0/1作為信源序列,并設(shè)置好pn序列的長(zhǎng)度(設(shè)為n)。單獨(dú)運(yùn)行ds-ss子程序,觀察輸出的序列長(zhǎng)度是否擴(kuò)展了n倍,并注意輸出序列中pn碼是否與相應(yīng)的0或者1對(duì)應(yīng)。驗(yàn)證成功的話便表明你的ds-ss子程序編寫(xiě)正確。并利用類(lèi)似的方法驗(yàn)證de-dsss子程序的正確性。 然后驗(yàn)證發(fā)射端主程序是否能正確的發(fā)射我們想要的擴(kuò)頻信號(hào)。首先正確的連接usrp并合理的配置發(fā)射端的各項(xiàng)參數(shù),運(yùn)行程序。 然后你可能會(huì)看到如圖 9至圖所示的發(fā)射信號(hào)時(shí)域波形和頻域波形。 圖14不擴(kuò)頻的時(shí)域信號(hào) 圖16擴(kuò)頻后的時(shí)域信號(hào) 圖17擴(kuò)頻后的頻域信號(hào) 圖15不擴(kuò)頻的頻域信號(hào) 10可以看出經(jīng)過(guò)擴(kuò)頻的發(fā)射信號(hào)與不經(jīng)過(guò)擴(kuò)頻的發(fā)射信號(hào)相比,在頻域上進(jìn)行 了展寬,在時(shí)域上變得更加密集。這與擴(kuò)頻的基本原理相符,說(shuō)明發(fā)射端的設(shè)計(jì)基本正確。 在接收端,我們需要使得參數(shù)能夠與發(fā)射端匹配,這樣才能正常的接收。特 別需要注意capture time、packet length和rx sample rate這幾個(gè)參數(shù),你首先需要理解它們的意義,這樣才能夠正確的配置它們。如果你在發(fā)射端沒(méi)有修改默認(rèn)參數(shù)的話,接收端的默認(rèn)參數(shù)恰好能夠與發(fā)射端匹配。你需要同時(shí)運(yùn)行發(fā)射端和接收端程序,在發(fā)射端正確運(yùn)行時(shí)觀察接收端能否正確接收。程序會(huì)計(jì)算當(dāng)前信噪比下的誤碼率,并逐漸增大信噪比、最終得出一條信噪比/誤碼率曲線,如圖3-4-11所示。你可能需要稍等一段時(shí)間才能夠看到程序運(yùn)行完成的結(jié)果。在接收端程序運(yùn)行的同時(shí),你可以進(jìn)入receiver子程序中的ber detected子程序,在里面觀察當(dāng)前信噪比接收到的數(shù)據(jù)數(shù)和誤碼數(shù),如圖3-4-12所示。 圖18誤碼率曲線 圖19運(yùn)行時(shí)的數(shù)據(jù)顯示 然后你可以嘗試改變收發(fā)端的各項(xiàng)參數(shù),觀察不同參數(shù)對(duì)運(yùn)行結(jié)果的影響。最后你需要按照要求完成實(shí)驗(yàn)報(bào)告。 六、實(shí)驗(yàn)結(jié)果 qpsk: 將usrp連接電腦,更改ip地址等參數(shù)。頻率使用915mhz避免干擾。如下圖20: 11 發(fā)送端前面板調(diào)制參數(shù)以及發(fā)送星座圖發(fā)送時(shí)域波形如下圖21: 發(fā)送端眼圖和發(fā)送端頻域波形如下,眼圖的尖銳程度和發(fā)送頻率有關(guān),如圖22: 接收端的硬件參數(shù)和誤碼率如下圖,如圖23: 接收端眼圖如圖24所示: bpsk: 調(diào)制參數(shù)如下: 14bpsk:發(fā)送端硬件參數(shù) 發(fā)送端星座圖: 接收端眼圖: 接收端星座圖及誤碼率曲線(信噪比較低): 五、實(shí)驗(yàn)擴(kuò)展 1、解釋接收端同步模塊的具體實(shí)現(xiàn)方式及其利用的基本原理。 (1)初始同步,或稱粗同步、捕獲。它主要解決載波頻率和碼相位的不確定性,保 證解擴(kuò)后的信號(hào)能通過(guò)相關(guān)器后面的中頻濾波器,這是所有問(wèn)題中最難解決的問(wèn)題。 (2)跟蹤,或稱精同步。 接收機(jī)對(duì)接收到的信號(hào),首先進(jìn)行搜索,對(duì)收到的信號(hào)與本地碼相位差的大小進(jìn)行判斷,若不滿足捕獲要求,即收發(fā)相位差大于一個(gè)碼元,則調(diào)整時(shí)鐘再進(jìn)行搜索。直到使收發(fā)相位差小于一個(gè)碼元時(shí),停止搜索,轉(zhuǎn)入跟蹤狀態(tài)。圖3-4-5同步流程圖 圖3-4-6跟蹤流程圖 2、擴(kuò)頻通信技術(shù)除了有較強(qiáng)的抗干擾能力外,還具有哪些優(yōu)點(diǎn)?逐一例舉出來(lái)并簡(jiǎn)述擴(kuò)頻技術(shù)具有這些優(yōu)點(diǎn)的原因。 (1)易于重復(fù)使用頻率,提高了無(wú)線頻譜利用率 無(wú)線頻譜十分寶貴,雖然從長(zhǎng)波到微波都得到了開(kāi)發(fā)利用,仍然滿足不了社會(huì) 17的需求。在窄帶通信中,主要依靠波道劃分來(lái)防止信道之間發(fā)生干擾。為此,世界各國(guó)都設(shè)立了頻率管理機(jī)構(gòu),用戶只能使用申請(qǐng)獲準(zhǔn)的頻率。擴(kuò)頻通信發(fā)送功率極低,采用了相關(guān)接收技術(shù),且可工作在信道噪聲和熱噪聲背景中,易于在同一地區(qū)重復(fù)使用同一頻率,也可與各種窄道通信共享同一頻率資源。所以,在美國(guó)及世界絕大多數(shù)國(guó)家,擴(kuò)頻通信無(wú)須申請(qǐng)頻率,任何個(gè)人與單位都可以無(wú)執(zhí)照使用。 (2)抗干擾性強(qiáng),誤碼率低 擴(kuò)頻通信在空間傳輸時(shí)所占用的帶寬相對(duì)較寬,而接收端又采用相關(guān)檢測(cè)的辦法來(lái)解擴(kuò),使有用寬帶信息信號(hào)恢復(fù)成窄帶信號(hào),而把非所需信號(hào)擴(kuò)展成寬帶信號(hào),然后通過(guò)窄帶濾波技術(shù)提取有用的信號(hào)。這樣,對(duì)于各種干擾信號(hào),因其在接收端的非相關(guān)性,解擴(kuò)后窄帶信號(hào)中只有很微弱的成分,信噪比很高,因此抗干擾性強(qiáng)。在商用的通信系統(tǒng)中,擴(kuò)頻通信是唯一能夠工作在負(fù)信噪比條件下的通信方式。 (3)隱蔽性好,對(duì)各種窄帶通信系統(tǒng)的干擾很小 由于擴(kuò)頻信號(hào)在相對(duì)較寬的頻帶上被擴(kuò)展了,單位頻帶內(nèi)的功率很小,信號(hào)湮沒(méi)在噪聲里,一般不容易被發(fā)現(xiàn),而想進(jìn)一步檢測(cè)信號(hào)的參數(shù)如偽隨機(jī)編碼序列就更加困難,因此說(shuō)其隱蔽性好。再者,由于擴(kuò)頻信號(hào)具有很低的功率譜密度,它對(duì)使用的各種窄帶通信系統(tǒng)的干擾很小。 (4)可以實(shí)現(xiàn)碼分多址 擴(kuò)頻通信提高了抗干擾性能,但付出了占用頻帶寬的代價(jià)。如果讓許多用戶共用這一寬頻帶,則可大大提高頻帶的利用率。由于在擴(kuò)頻通信中存在擴(kuò)頻碼序列的擴(kuò)頻調(diào)制,充分利用各種不同碼型的擴(kuò)頻碼序列之間優(yōu)良的自相關(guān)特性和互相關(guān)特性,在接收端利用相關(guān)檢測(cè)技術(shù)進(jìn)行解擴(kuò),則在分配給不同用戶碼型的情況下可以區(qū)分不同用戶的信號(hào),提取出有用信號(hào)。這樣一來(lái),在一寬頻帶上許多對(duì)用戶可以同時(shí)通話而互不干擾。 (5)抗多徑干擾 這兩種技術(shù)在擴(kuò)頻通信中都易于實(shí)現(xiàn)。利用擴(kuò)頻碼的自相關(guān)特性,在接收端從多徑信號(hào)中提取和分離出最強(qiáng)的有用信號(hào),或把多個(gè)路徑來(lái)的同一碼序列的波形相加合成,這相當(dāng)于梳狀濾波器的作用。另外,在采用頻率跳變擴(kuò)頻調(diào)制方式的擴(kuò)頻系統(tǒng)中,由于用多個(gè)頻率的信號(hào)傳送同一個(gè)信息,實(shí)際上起到了頻率分集的作用。 (6)能精確地定時(shí)和測(cè)距 電磁波在空間的傳播速度是固定不變的光速,人們自然會(huì)想到如果能夠精確測(cè) 18量電磁波在兩個(gè)物體之間的傳播時(shí)間,也就等于測(cè)量?jī)蓚€(gè)物體之間的距離。在擴(kuò)頻通信中如果擴(kuò)展頻譜很寬,則意味著所采用的擴(kuò)頻碼速率很高,每個(gè)碼片占用的時(shí)間就很短。當(dāng)發(fā)射出去的擴(kuò)頻信號(hào)在被測(cè)量物體反射回來(lái)后,在接收端解調(diào)出擴(kuò)頻碼序列,然后比較收發(fā)兩個(gè)碼序列相位之差,就可以精確測(cè)出擴(kuò)頻信號(hào)往返的時(shí)間差,從而算出兩者之間的距離。測(cè)量的精度決定于碼片的寬度,也就是擴(kuò)展頻譜的寬度。碼片越窄,擴(kuò)展的頻譜越寬,精度越高。 (7)適合數(shù)字話音和數(shù)據(jù)傳輸,以及開(kāi)展多種通信業(yè)務(wù) 擴(kuò)頻通信一般都采用數(shù)字通信、碼分多址技術(shù),適用于計(jì)算機(jī)網(wǎng)絡(luò),適合于數(shù)據(jù)和圖像傳輸。 (8)安裝簡(jiǎn)便,易于維護(hù) 擴(kuò)頻通信設(shè)備是高度集成,采用了現(xiàn)代電子科技的尖端技術(shù),因此,十分可靠、小巧,大量運(yùn)用后成本低,安裝便捷,易于推廣應(yīng)用。 3、偽隨機(jī)序列有許多種,例如m序列、gold序列、m序列等。嘗試使用不同的方法來(lái)產(chǎn)生偽隨機(jī)序列,并用其實(shí)現(xiàn)對(duì)信號(hào)的擴(kuò)頻。 (1)m序列是目前廣泛應(yīng)用的一種偽隨機(jī)序列,m序列每一周期中 1 的個(gè)數(shù)比 0 的個(gè)數(shù)多 1 個(gè)。狀態(tài)“0”或“1”連續(xù)出現(xiàn)的段稱為游程。游程中“0”或“1” m序列的一個(gè)周期(p=2^n-1)中,的個(gè)數(shù)稱為游程長(zhǎng)度。游程總數(shù)為 2^n-1,“0”、“1” 各占一半。2個(gè)彼此移位等價(jià)的相異m序列,按模2相加所得的序列仍為m序列,并與原m序列等價(jià)。 (2)gold序列g(shù)old碼序列是一種基于m序列的碼序列,具有較優(yōu)良的自相關(guān)和互相關(guān)特性,產(chǎn)生的序列數(shù)多。gold碼的自相關(guān)性不如m序列,具有三值自相關(guān)特性;互相關(guān)性比m序列要好,但還沒(méi)有達(dá)到最佳。是由兩個(gè)碼長(zhǎng)相等、碼時(shí)鐘速率相同的m序列優(yōu)選對(duì)通過(guò)模2相加而構(gòu)成的。 4、適當(dāng)?shù)脑谙到y(tǒng)中添加干擾,以驗(yàn)證擴(kuò)頻的良好的抗干擾能力。 強(qiáng)擴(kuò)頻通信系統(tǒng)擴(kuò)展的頻譜越寬,處理增益越高,抗干擾能力就越強(qiáng)。簡(jiǎn)單 地說(shuō),如果信號(hào)頻譜展寬10倍,那么干擾方面需要在更寬的頻帶上去進(jìn)行干擾,分散了干擾功率,從而在總功率不變的條件下,其干擾強(qiáng)度只有原來(lái)的1/10。另外,由于接收端采用擴(kuò)頻碼序列進(jìn)行相關(guān)檢測(cè),空中即使有同類(lèi)信號(hào)進(jìn)行干擾,如果不能檢測(cè)出有用信號(hào)的碼序列,干擾也起不了太大作用,因此抗干擾性能強(qiáng)是擴(kuò)頻通信的最突出的優(yōu)點(diǎn)。19 20 C語(yǔ)言課程設(shè)計(jì)報(bào)告——?jiǎng)@安 C語(yǔ)言課程設(shè)計(jì) 姓名:劉顯安 學(xué)號(hào):09041131 班級(jí):090411 專業(yè):計(jì)算機(jī)科學(xué)與技術(shù) 學(xué)院:信息工程學(xué)院 設(shè)計(jì)題目:學(xué)生通訊錄管理系統(tǒng) 指導(dǎo)教師:宋文琳 提交時(shí)間:2010年9月4日 第1頁(yè)(共25頁(yè)) C語(yǔ)言課程設(shè)計(jì)報(bào)告——?jiǎng)@安 課程題目:學(xué)生通訊錄管理系統(tǒng) 要求:學(xué)生通訊錄信息包括:學(xué)號(hào)、姓名、班機(jī)、聯(lián)系電話、E-mail、宿舍等 主要功能:1、2、3、4、5、通訊錄信息錄入功能 通訊錄信息刪除功能 通訊錄信息瀏覽功能 通訊錄信息查詢功能 按學(xué)號(hào)排序功能 一、總體設(shè)計(jì) 首先,整個(gè)系統(tǒng)必須有一個(gè)主函數(shù),為了盡量提高程序的易修改性,且不至于相互干擾,將每一個(gè)功能分成不同的模塊,用不同的函數(shù)來(lái)實(shí)現(xiàn),例如在我寫(xiě)的這個(gè)程序中,一共用了11個(gè)函數(shù),分別是: 主菜單函數(shù)menu()、關(guān)于函數(shù)gaunyu()、幫助函數(shù)help()、輸出單個(gè)學(xué)生信息函數(shù)shuchu()、輸入函數(shù)shuru()、輸出所有學(xué)生信息函數(shù)findall()、按姓名查找函數(shù)findname()、按學(xué)號(hào)查找函數(shù)findnum()、刪除函數(shù)shanchu()、排序函數(shù)paixu()、主函數(shù)main(),這樣在整個(gè)程序的設(shè)計(jì)過(guò)程中也就一目了然,寫(xiě)起來(lái)也相對(duì)輕松了不少。 這個(gè)程序我只是總體上參考了一下網(wǎng)上程序的架構(gòu),具體的各個(gè)函數(shù)是參照課本上《鏈表》那一章的內(nèi)容的,比如結(jié)構(gòu)體的建立、查找和排序等功能,這些書(shū)上都有類(lèi)似的,其中排序功能雖沒(méi)有原版的,第2頁(yè)(共25頁(yè)) C語(yǔ)言課程設(shè)計(jì)報(bào)告——?jiǎng)@安 但是在第六章中有一個(gè)用冒泡法排序的例題,我就是仿照這個(gè)模式來(lái)對(duì)結(jié)構(gòu)體進(jìn)行排序的,總之整個(gè)程序中蘊(yùn)含了我很多的汗水。 二、具體設(shè)計(jì) 關(guān)于這個(gè)程序的具體設(shè)計(jì),也不是一兩句話就能說(shuō)完的,所以我也不想再在這里贅述了,因?yàn)槌绦蚶锒伎梢钥吹牡?,幾乎每個(gè)函數(shù)都傾注了我的大量汗水,我在這上面花了不少的時(shí)間,不過(guò)從中也收獲了很多,因?yàn)椴煌5匦薷牟煌5恼{(diào)試,總之還是直接看源程序吧,因?yàn)橐矝](méi)必要在這里重復(fù)地說(shuō)廢話。 三、源代碼 以下是整個(gè)程序的源代碼,其中我的主菜單函數(shù)是很美觀的,但由于這里字體和板式的限制,不能很好的顯現(xiàn),可以看我下面程序運(yùn)行的截圖就知道了?!?#include struct student{ 第3頁(yè)(共25頁(yè)) C語(yǔ)言課程設(shè)計(jì)報(bào)告——?jiǎng)@安 long num;char name[20];int banji;char tel[11];char Email[20];int sushe;struct student *next;}; struct student *stu;int n; void menu(void){ /*主菜單函數(shù)*/ system(“cls”);puts(“****************************************************************************”);puts(“** ^_^學(xué)生通訊錄管理系統(tǒng)^_^ **”);puts(“****************************************************************************”);puts(“******** 計(jì) ********”); 第4頁(yè)(共25頁(yè)) C語(yǔ)言課程設(shè)計(jì)報(bào)告——?jiǎng)@安 puts(“******* *******”);puts(“****** 算 ******”);puts(“***** 0 1=錄入學(xué)生通訊錄信息 *****”);puts(“**** 9 機(jī) ****”);puts(“*** ***”);puts(“** 科 **”);puts(“* *”);puts(“** 1 學(xué) **”);puts(“*** ***”);puts(“**** 與 ****”);puts(“***** *****”);0 4 劉 2= 顯 安 6= 第5頁(yè)(共25頁(yè)) 列出所有學(xué)生通訊錄 3=按姓名查詢信息 4=按學(xué)號(hào)查詢信息 5=刪除學(xué)生信息 按學(xué)號(hào)將通訊錄排序 7=關(guān)于 8=幫助 0=退出 C語(yǔ)言課程設(shè)計(jì)報(bào)告——?jiǎng)@安 puts(“****** 技 ******”);puts(“******* *******”);puts(“******** 術(shù) ********”);puts(“****************************************************************************”);} void guanyu()/*關(guān)于函數(shù)*/ { system(“cls”);puts(“n ************************** ”);puts(“ *** 版權(quán)所有,翻版必究!***”);puts(“**** copyright◎劉顯安!****”);puts(“ *** 2009~2010 ***”);puts(“ **************************”);puts(“n返回主菜單請(qǐng)按【9】”);if(getche()=='9')menu();} struct student *shuru(void)/*輸入函數(shù)*/ 第6頁(yè)(共25頁(yè)) C語(yǔ)言課程設(shè)計(jì)報(bào)告——?jiǎng)@安 { system(“cls”);struct student *s1,*s2;n=1;int num;puts(“請(qǐng)輸入學(xué)生個(gè)數(shù)(提示:個(gè)數(shù)不能輸入0?。骸?;scanf(“%d”,&num);s1=s2=(struct student *)malloc(sizeof(struct student));puts(“*************************************************”);puts(“請(qǐng)輸入學(xué)號(hào):”);scanf(“%ld”,&s1->num);puts(“請(qǐng)輸入學(xué)生姓名:”);scanf(“%s”,s1->name);puts(“請(qǐng)輸入班級(jí):”);scanf(“%d”,&s1->banji);puts(“請(qǐng)輸入電話號(hào)碼:”);scanf(“%s”,s1->tel);puts(“請(qǐng)輸入電子郵件:”);scanf(“%s”,s1->Email);puts(“請(qǐng)輸入學(xué)生宿舍號(hào):”);scanf(“%d”,&s1->sushe);stu=s1; 第7頁(yè)(共25頁(yè)) C語(yǔ)言課程設(shè)計(jì)報(bào)告——?jiǎng)@安 while(n 第8頁(yè)(共25頁(yè)) C語(yǔ)言課程設(shè)計(jì)報(bào)告——?jiǎng)@安 s2=s1;s2->next=NULL;return(stu);//system(“cls”);} void shuchu(struct student *s){ /*輸出單個(gè)學(xué)生信息*/ printf(“* %-8ld”,s->num);printf(“%-15s”,s->name);printf(“%-8d”,s->banji);printf(“%-15s”,s->tel);printf(“%-15s”,s->Email);printf(“%-5d *n”,s->sushe);} void findall()/*輸出所有學(xué)生信息*/ { system(“cls”);struct student *s;//if(n=2)//printf(“n現(xiàn)在有%d個(gè)學(xué)生信息,分別是:n”,n);//else 第9頁(yè)(共25頁(yè)) C語(yǔ)言課程設(shè)計(jì)報(bào)告——?jiǎng)@安 printf(“n現(xiàn)在有%d個(gè)學(xué)生信息,分別是:n”,n);puts(“________________________________________________________________________”);puts(“* 學(xué)號(hào) 姓名 班級(jí) 電話 電子郵件 宿舍 *”);s=stu;while(s!=NULL){ shuchu(s);s=s->next;} puts(“________________________________________________________________________”);puts(“返回主菜單請(qǐng)按【9】”);if(getche()=='9')menu();} void findname(){ /*按姓名查找函數(shù)*/ system(“cls”);struct student *s;char name[20];printf(“n請(qǐng)輸入你要查詢的學(xué)生姓名:n”); 第10頁(yè)(共25頁(yè)) C語(yǔ)言課程設(shè)計(jì)報(bào)告——?jiǎng)@安 scanf(“%s”,name);s=stu;while(strcmp(s->name,name)!=0){ s=s->next;} if(s==NULL){ puts(“查無(wú)此學(xué)生姓名!”);goto end;} else { puts(“該學(xué)生的信息為:”);puts(“* 學(xué)號(hào) 姓名 電子郵件 宿舍 *”);shuchu(s);} end:;puts(“返回主菜單請(qǐng)按【9】”);if(getche()=='9')menu();} 第11頁(yè)(共25頁(yè)) 班級(jí) 電話 C語(yǔ)言課程設(shè)計(jì)報(bào)告——?jiǎng)@安 void findnum()/*按學(xué)號(hào)查找函數(shù)*/ { system(“cls”);struct student *s;puts(“請(qǐng)輸入你要查詢的學(xué)生學(xué)號(hào):”);long i;scanf(“%ld”,&i);s=stu; while(s->num!=i){ s=s->next;} if(s==NULL){puts(“查無(wú)此學(xué)生學(xué)號(hào)!”);goto end;} else { puts(“該學(xué)生的信息為:”);puts(“* 學(xué)號(hào) 姓名 班級(jí) 郵件 宿舍 *”);shuchu(s); 第12頁(yè)(共25頁(yè)) 子電話 電C語(yǔ)言課程設(shè)計(jì)報(bào)告——?jiǎng)@安 } end:;puts(“返回主菜單請(qǐng)按【9】”);if(getche()=='9')menu();} struct student *shanchu(struct student*stu)/*刪除函數(shù)*/ { system(“cls”);long num;char s;struct student *s1,*s2;if(stu==NULL){ puts(“傻冒!沒(méi)有任何學(xué)生信息,還刪個(gè)屁啊,刪刪刪!”);goto end;} puts(“請(qǐng)輸入你要?jiǎng)h除的學(xué)生學(xué)號(hào):”);scanf(“%ld”,&num);s1=stu;puts(“警告:你確定要?jiǎng)h除這個(gè)學(xué)生的信息嗎(Y/N)?”);scanf(“%s”,&s); 第13頁(yè)(共25頁(yè)) C語(yǔ)言課程設(shè)計(jì)報(bào)告——?jiǎng)@安 if((s=='Y')||(s=='y')){ while((num!=s1->num)&&(s1->next!=NULL)){s2=s1;s1=s1->next;} if(num==s1->num){ puts(“該學(xué)生的信息為:”);puts(“* 學(xué)號(hào) 姓名 班級(jí) 電話 電子郵件 宿舍 *”);shuchu(s1);if(s1==stu)stu=s1->next;else s2->next=s1->next;puts(“注意喲,該學(xué)生的信息已經(jīng)刪除了!剩下的學(xué)生通訊錄信息如下:”);n=n-1;} } findall();return(stu);end:; 第14頁(yè)(共25頁(yè)) C語(yǔ)言課程設(shè)計(jì)報(bào)告——?jiǎng)@安 puts(“返回主菜單請(qǐng)按【9】”);if(getche()=='9')menu();} void paixu(){ /*排序函數(shù)*/ struct student *p, *p1,*p2;int i,j;int temp;char b[20];if(stu==NULL){printf(“n學(xué)生信息不存在n”);goto end;} for(i=0;i {temp=p1->num;p1->num=p2->num;p2->num=temp; strcpy(b,p1->name);strcpy(p1->name,p2->name);strcpy(p2->nam 第15頁(yè)(共25頁(yè)) C語(yǔ)言課程設(shè)計(jì)報(bào)告——?jiǎng)@安 e,b); temp=p1->banji;p1->banji=p2->banji;p2->banji=temp; strcpy(b,p1->tel);strcpy(p1->tel,p2->tel);strcpy(p2->tel,b); strcpy(b,p1->Email);strcpy(p1->Email,p2->Email);strcpy(p2->Email,b);temp=p1->sushe;p1->sushe=p2->sushe;p2->sushe=temp; } p1=p1->next;} } p=stu;puts(“已按學(xué)生學(xué)號(hào)順序排序完畢!重新排序如下:”); puts(“****************************************************************************”);puts(“* 學(xué)號(hào) 姓名 班級(jí) 電話 電子郵件 宿舍 *”); while(p!=NULL) 第16頁(yè)(共25頁(yè)) C語(yǔ)言課程設(shè)計(jì)報(bào)告——?jiǎng)@安 { printf(“* %-8ld”,p->num);printf(“%-15s”,p->name);printf(“%-8d”,p->banji);printf(“%-15s”,p->tel);printf(“%-15s”,p->Email);printf(“%-5d *n”,p->sushe);p=p->next;} end:;puts(“返回主菜單請(qǐng)按【9】”);if(getche()=='9')menu();} void help()/*幫助函數(shù)*/ { system(“cls”);puts(“n1、請(qǐng)按提示操作,第一次進(jìn)入本系統(tǒng)時(shí)請(qǐng)按“1”錄入學(xué)生信息,”);puts(“ 否則有可能造成程序運(yùn)行錯(cuò)誤!”);puts(“ 2、添加、修改功能本系統(tǒng)暫不提供,還有待以后完善,謝謝 第17頁(yè)(共25頁(yè)) C語(yǔ)言課程設(shè)計(jì)報(bào)告——?jiǎng)@安 合作!”);puts(“ 3、請(qǐng)注意查看“Num Lock”是否打開(kāi),如果沒(méi)有打開(kāi),則按數(shù)字n 鍵可能導(dǎo)致程序錯(cuò)誤!”);puts(“ 4、版權(quán)所有,翻版必究!請(qǐng)按“7”鍵查看關(guān)于。”);puts(“n返回主菜單請(qǐng)按【9】”);if(getche()=='9')menu();} void main()/*主函數(shù)*/ { char a;menu();puts(“n您為首次使用本系統(tǒng),強(qiáng)烈建議您按1開(kāi)始錄入學(xué)生信息,”);puts(“否則有可能導(dǎo)致程序運(yùn)行錯(cuò)誤!您可以按8查看幫助.”);a=getche();while(a){ puts(“");switch(a){case'0':goto end;break;case '1': puts(”n好了,您可以開(kāi)始向本系統(tǒng)錄入學(xué)生通訊錄信息了: 第18頁(yè)(共25頁(yè)) C語(yǔ)言課程設(shè)計(jì)報(bào)告——?jiǎng)@安 “);stu=shuru();system(”cls“);menu();puts(”n學(xué)生信息錄入完畢,請(qǐng)輸入你的選擇(0~6):n“); break;case '2':findall();puts(”n請(qǐng)輸入你的選擇(0~6):“);break;case '3':findname();puts(”n請(qǐng)輸入你的選擇(0~6):“);break;case '4':findnum();puts(”n請(qǐng)輸入你的選擇(0~6):“);break;case '5':stu=shanchu(stu);puts(”n請(qǐng)輸入你的選擇(0~6):“);break;case '6':paixu();puts(”n請(qǐng)輸入你的選擇(0~6):“);break;case '7':guanyu();puts(”n請(qǐng)輸入你的選擇(0~6):“);break;case '8':help();puts(”n請(qǐng)輸入你的選擇(0~6):“);break;default:puts(”輸錯(cuò)了!笨蛋!快點(diǎn)按數(shù)字1鍵錄入學(xué)生信息吧!“);break;} a=getche();} end:;puts(”謝謝您使用本系統(tǒng),歡迎再次使用!"); 第19頁(yè)(共25頁(yè)) C語(yǔ)言課程設(shè)計(jì)報(bào)告——?jiǎng)@安 } ————————————————————————— 四、調(diào)試 主要是通過(guò)截圖來(lái)顯示運(yùn)行過(guò)程 以下是程序運(yùn)行的主界面: 按1后,開(kāi)始錄入信息,程序會(huì)提示你輸入學(xué)生個(gè)數(shù)(例如本例中輸入4個(gè)),當(dāng)輸完4個(gè)學(xué)生的信息時(shí),程序會(huì)提示你已輸入完畢: 第20頁(yè)(共25頁(yè)) C語(yǔ)言課程設(shè)計(jì)報(bào)告——?jiǎng)@安 學(xué)生信息錄入完畢,提示輸入(0到6)進(jìn)行選擇: 第21頁(yè)(共25頁(yè)) C語(yǔ)言課程設(shè)計(jì)報(bào)告——?jiǎng)@安 這時(shí)我選擇按2輸出所有學(xué)生信息,按9返回: 按3按姓名查詢信息: 按4按學(xué)號(hào)查詢信息: 第22頁(yè)(共25頁(yè)) C語(yǔ)言課程設(shè)計(jì)報(bào)告——?jiǎng)@安 按5刪除學(xué)生信息,這是按學(xué)號(hào)刪除學(xué)生信息,本例中,刪除學(xué)號(hào)為41212的學(xué)生信息: 刪除成功后,系統(tǒng)自動(dòng)將剩下的學(xué)生信息列出: 按6按學(xué)號(hào)從小到大進(jìn)行排序,可以發(fā)現(xiàn),排序成功: 第23頁(yè)(共25頁(yè)) C語(yǔ)言課程設(shè)計(jì)報(bào)告——?jiǎng)@安 按8查看幫助函數(shù): 呵呵,這是我設(shè)置的關(guān)于函數(shù),滿足一下敝人的虛榮心嘛^_^,版權(quán)所有,翻版必究哦! 最后按0退出系統(tǒng): 第24頁(yè)(共25頁(yè)) C語(yǔ)言課程設(shè)計(jì)報(bào)告——?jiǎng)@安 呵呵,怎么樣?我寫(xiě)的程序還行吧。嘿嘿…… 三、總結(jié) 這個(gè)程序我只是總體上參考了一下網(wǎng)上程序的架構(gòu),具體的各個(gè)函數(shù)是參照課本上《鏈表》那一章的內(nèi)容的,比如結(jié)構(gòu)體的建立、查找和排序等功能,這些書(shū)上都有類(lèi)似的,其中排序功能雖沒(méi)有原版的,但是在第六章中有一個(gè)用冒泡法排序的例題,我就是仿照這個(gè)模式來(lái)對(duì)結(jié)構(gòu)體進(jìn)行排序的,總之整個(gè)程序中蘊(yùn)含了我很多的汗水。 第25頁(yè)(共25頁(yè)) 匯編語(yǔ)言課程設(shè)計(jì)要求 1.設(shè)計(jì)的目的和任務(wù) (1)目的:課程設(shè)計(jì)是本科教學(xué)全過(guò)程中重要環(huán)節(jié)。其目的是培養(yǎng)計(jì)算機(jī)專業(yè)學(xué)生運(yùn)用所學(xué)知識(shí)解決計(jì)算機(jī)應(yīng)用領(lǐng)域內(nèi)實(shí)際問(wèn)題能力,進(jìn)一步提高學(xué)生匯編語(yǔ)言綜合編程能力,程序調(diào)試技能。 (2)任務(wù):能夠按照設(shè)計(jì)題目完成相應(yīng)設(shè)計(jì);撰寫(xiě)設(shè)計(jì)報(bào)告。 2.設(shè)計(jì)要求 完成設(shè)計(jì)任務(wù),撰寫(xiě)設(shè)計(jì)報(bào)告,上交源程序和可執(zhí)行程序,源程序加注釋 3.設(shè)計(jì)地點(diǎn) 學(xué)院計(jì)算機(jī)實(shí)驗(yàn)室或自己的計(jì)算機(jī) 4.主要儀器設(shè)備(實(shí)驗(yàn)用的軟硬件環(huán)境) 普通微機(jī)一臺(tái);匯編語(yǔ)言環(huán)境(基于DOS環(huán)境:EDIT、MASM、LINK、DEBUG;基于Windows環(huán)境) 5.設(shè)計(jì)內(nèi)容 5.2 匯編程序設(shè)計(jì)的內(nèi)容 題目自擬(每人單獨(dú)一題),但必須有一定的難度和一定的設(shè)計(jì)工作量,可參考課本內(nèi)容和設(shè)計(jì)輔導(dǎo)書(shū)內(nèi)容,也可參考其它參考書(shū)。 6.問(wèn)題討論與分析 根據(jù)自己設(shè)計(jì)和調(diào)試過(guò)程出現(xiàn)的問(wèn)題進(jìn)行分析的討論,并進(jìn)行小結(jié)。 參考文獻(xiàn) 1、詹仕華等編.《匯編語(yǔ)言程序設(shè)計(jì)》.北京:中國(guó)電力出版社.2008.2 2、詹仕華等編.《匯編語(yǔ)言程序設(shè)計(jì)習(xí)題解答及課程實(shí)驗(yàn)、設(shè)計(jì)輔導(dǎo)》.北京:中國(guó)電力出版社.2008.2 3、王爽編.《匯編語(yǔ)言》.北京:清華大學(xué)出版社,2003.5 4、曹加恒等編.《新一代匯編語(yǔ)言課程設(shè)計(jì)》.北京:高等教育出版社,2003.6 5、楊路明等編.《匯編語(yǔ)言程序設(shè)計(jì)》.長(zhǎng)沙:中南大學(xué)出版社,2005.8 實(shí)驗(yàn)室觀看設(shè)計(jì)結(jié)果時(shí)間和上交設(shè)計(jì)報(bào)告時(shí)間:6月24日,地點(diǎn):學(xué)院機(jī)房。 附課程設(shè)計(jì)大綱 《匯編語(yǔ)言》課程設(shè)計(jì) 課程名稱(中文):匯編語(yǔ)言 課程名稱(英文):Assembly Language 總周數(shù):1周學(xué)分?jǐn)?shù):1分 1.目的及任務(wù) (1)目的:課程設(shè)計(jì)是本科教學(xué)全過(guò)程中重要環(huán)節(jié)。其目的是培養(yǎng)電子信息專業(yè)學(xué)生運(yùn)用所學(xué)知識(shí)解決計(jì)算機(jī)應(yīng)用領(lǐng)域內(nèi)實(shí)際問(wèn)題能力,進(jìn)一步提高學(xué)生匯編語(yǔ)言綜合編程能力,程序調(diào)試技能。 (2)任務(wù):能夠按照設(shè)計(jì)題目完成相應(yīng)設(shè)計(jì);撰寫(xiě)設(shè)計(jì)報(bào)告。2.要求 完成設(shè)計(jì)任務(wù),撰寫(xiě)設(shè)計(jì)報(bào)告,上交源程序和可執(zhí)行程序,源程序加注釋。3.面對(duì)專業(yè) 電子信息工程、計(jì)算機(jī)科學(xué)與技術(shù) 4.成績(jī)?cè)u(píng)定 設(shè)計(jì)過(guò)程和結(jié)果自述占50%,課程設(shè)計(jì)報(bào)告占50%。5.主要儀器設(shè)備、工具書(shū)、參考文獻(xiàn)資料 主要儀器設(shè)備:通用PC機(jī) 工具書(shū):課程教材 參考文獻(xiàn)資料: 沈美明、溫冬蟬編著,《IBM-PC匯編語(yǔ)言程序設(shè)計(jì)》清華大學(xué)出版社; 王爽編著《匯編語(yǔ)言》 清華大學(xué)出版社 長(zhǎng)整數(shù)加減的運(yùn)算 一、需求分析 問(wèn)題描述: 設(shè)計(jì)一個(gè)實(shí)現(xiàn)任意長(zhǎng)的整數(shù)進(jìn)行加法運(yùn)算的演示程序 基本要求: 利用雙向循環(huán)鏈表實(shí)現(xiàn)長(zhǎng)整數(shù)的存儲(chǔ),每個(gè)結(jié)點(diǎn)含一個(gè)整型變量。任何整型變量的范圍是 -(2 15 -1)~(2 15 -1)。輸入輸出形式:按照中國(guó)對(duì)于長(zhǎng)整數(shù)的表示習(xí)慣,每四位是一組,組間用逗號(hào)隔開(kāi) 更高要求: (1)長(zhǎng)整數(shù)的減法 (2)多個(gè)長(zhǎng)整數(shù)的連續(xù)加減法,并帶括號(hào)等。具體方式可以參見(jiàn)表達(dá)式的求值部分,利用棧 測(cè)試數(shù)據(jù): (1)0;0;應(yīng)輸出“0” (2)-2345,6789;-7654,3211;應(yīng)輸出“-1,0000,0000” (3)-9999,9999;1,0000,0000,0000;應(yīng)輸出“9999,0000,0001”(4)1,0001,0001;-1,0001,0001;應(yīng)輸出“0”(5)1,0001,0001;-1,0001,0000;應(yīng)輸出“1” (6)-9999,9999,9999;-9999,9999,9999;應(yīng)輸出“-1,9999,9999,9998”(7)1,0000,9999,9999;1;應(yīng)輸出“1,0001,0000,0000” 一、概要設(shè)計(jì) 1.數(shù)據(jù)結(jié)構(gòu) 此實(shí)驗(yàn)采用的數(shù)據(jù)結(jié)構(gòu)是雙向循環(huán)鏈表。這樣可以很容易的找到他的前驅(qū)以及它的后繼。節(jié)點(diǎn)采用結(jié)構(gòu)體類(lèi)型,代碼如下:typedef struct Node // 雙向鏈表的結(jié)構(gòu)體定義 { int data; struct Node *prior;struct Node *next;}DLNode; 2.使用函數(shù) 1)void ListInitiate(DLNode **head) 操作結(jié)果:初始化一個(gè)頭結(jié)點(diǎn)為head的雙向循環(huán)鏈表; 2)int ListLength(DLNode *head) 操作結(jié)果:計(jì)算以head為頭結(jié)點(diǎn)的鏈表的長(zhǎng)度 3)int ListInsert(DLNode *head,int i,int x) 操作結(jié)果:將節(jié)點(diǎn)數(shù)據(jù)為x的節(jié)點(diǎn)插到第i個(gè)位置上去。4)int abs(int x) 操作結(jié)果:絕對(duì)值函數(shù),返回x的絕對(duì)值。5)int InputNumber(DLNode *head) 操作結(jié)果:將從鍵盤(pán)中接收數(shù)據(jù)并把得到的數(shù)據(jù)存入以head為頭結(jié)點(diǎn)的鏈表中。四位一存,中間以逗號(hào)區(qū)分,結(jié)束符為分號(hào)。6)void OutputNumber(DLNode *head,int sign) 操作結(jié)果:將以head為頭結(jié)點(diǎn)的鏈表中的所有數(shù)據(jù)輸出到顯示屏上,7)void add(DLNode *head1,DLNode *head2,DLNode *head3)操作結(jié)果:實(shí)現(xiàn)正數(shù)加正數(shù)的加法操作。8)int change(DLNode *head1,DLNode *head2) 操作結(jié)果:判斷存在倆個(gè)鏈表中的數(shù)的大小,如何head1中的數(shù)大于head2中的數(shù)那么返回值為0,反之返回值為1,相等時(shí)返回值為2; 9)void method(DLNode *head1,DLNode *head2,int x) 操作結(jié)果:計(jì)算正數(shù)乘以正數(shù)的乘法運(yùn)算。 10)void minus(DLNode *head1,DLNode *head2,DLNode *head3)操作結(jié)果:計(jì)算正數(shù)減正數(shù)的減法運(yùn)算。 11)void yunsuan(DLNode *head1,DLNode *head2,DLNode *head3,char ch) 操作結(jié)果:正數(shù),負(fù)數(shù),加法,減法。計(jì)算式共分為八種運(yùn)算,在這之前我已經(jīng)實(shí)現(xiàn)了二種運(yùn)算,那么這個(gè)函數(shù)就是把這八種運(yùn)算按照一定的規(guī)則轉(zhuǎn)化成已經(jīng)實(shí)現(xiàn)的二種運(yùn)算來(lái)實(shí)現(xiàn)完整的加減法運(yùn)算。 12)void chengfa(DLNode *head1,DLNode *head2) 操作結(jié)果:在乘法中我只是實(shí)現(xiàn)了正數(shù)乘以正數(shù)的運(yùn)算,那么這個(gè)函數(shù)就是通過(guò)調(diào)用method函數(shù)按照一定的規(guī)則來(lái)實(shí)現(xiàn)完整的乘法運(yùn)算。13)void main() 操作結(jié)果:主函數(shù)。調(diào)用以上的各個(gè)函數(shù)來(lái)引導(dǎo)用戶進(jìn)行長(zhǎng)整數(shù)的加法運(yùn)算,加法運(yùn)算,乘法運(yùn)算。 二、詳細(xì)設(shè)計(jì) 1.數(shù)據(jù)結(jié)構(gòu)詳細(xì)設(shè)計(jì) typedef struct Node // 雙向鏈表的結(jié)構(gòu)體定義 { int data;struct Node *prior;struct Node *next;}DLNode;雙向循環(huán)鏈表的節(jié)點(diǎn)由三個(gè)部分組成,第一是數(shù)據(jù)部分data存儲(chǔ)此節(jié)點(diǎn)的數(shù)據(jù),第二是此節(jié)點(diǎn)的前驅(qū)指針部分*prior指向此節(jié)點(diǎn)的前驅(qū),第三是此節(jié)點(diǎn)的后繼指針部分*next指向此節(jié)點(diǎn)的后繼。數(shù)據(jù)部分我們約定它為整形變量,前驅(qū)后繼指針均為結(jié)構(gòu)體Node類(lèi)型。2.鏈表初始化函數(shù): void ListInitiate(DLNode **head)//雙向鏈表的初始化 { } if((*head=(DLNode *)malloc(sizeof(DLNode)))==NULL)exit(0);(*head)->prior=*head;(*head)->next=*head; 初始化之前需要定義一個(gè)類(lèi)型為Node型的頭結(jié)點(diǎn)變量,經(jīng)過(guò)函數(shù)后完成鏈表的初始化即:頭節(jié)點(diǎn)的前驅(qū)指針指向自己,同時(shí)他的后繼指針也指向自己。3.計(jì)算已知的鏈表長(zhǎng)度: int ListLength(DLNode *head)//雙向鏈表的表長(zhǎng) { DLNode *p=head;int size=0;while(p->next!=head){ } p=p->next;size++;return size;} 此函數(shù)計(jì)算的是已知鏈表的長(zhǎng)度。主要思想:從頭結(jié)點(diǎn)開(kāi)始尋找下一個(gè)節(jié)點(diǎn),找到計(jì)數(shù)器加一。直到再次尋找到頭結(jié)點(diǎn)時(shí)停止,計(jì)算完畢。 4.插入函數(shù): int ListInsert(DLNode *head,int i,int x)//雙向鏈表的數(shù)據(jù)插入,i表示是插入的第幾個(gè)元素 { DLNode *p,*s;int j;p=head->next;j=0;while(p!=head&&j } if(j!=i){ } if((s=(DLNode *)malloc(sizeof(DLNode)))==NULL)exit(0);s->data=x;s->prior=p->prior;//插入 p->prior->next=s;s->next=p;p->prior=s;return 1;printf(“n插入位置不合法!”);return 0;p=p->next;j++; } 此函數(shù)是已知一雙向鏈表實(shí)現(xiàn)在第i個(gè)位置插入data為x的節(jié)點(diǎn)。函數(shù)需要注意的是在什么位置插入才是合法的,在就是在該節(jié)點(diǎn)指針時(shí)的順序不要搞錯(cuò)。5.絕對(duì)值函數(shù): int abs(int x){ } if(x<0)return-x;else return x;此函數(shù)是實(shí)現(xiàn)求一個(gè)整數(shù)的絕對(duì)值。設(shè)計(jì)這么一個(gè)函數(shù)主要是考慮到在存儲(chǔ)負(fù)數(shù)的時(shí)候頭結(jié)點(diǎn)應(yīng)該變?yōu)檎麛?shù),然后通過(guò)其他手段變相實(shí)現(xiàn)那種運(yùn)算。6.讀入數(shù)據(jù)并插入對(duì)應(yīng)的鏈表函數(shù): int InputNumber(DLNode *head)//讀入輸入的數(shù)據(jù) { int input,i=0;//第i個(gè)節(jié)點(diǎn) char c;scanf(“%d%c”,&input,&c);while(1){ if(input<0&&i==0)//輸入數(shù)為負(fù)且是第一個(gè)節(jié)點(diǎn) { } else if(input>=0&&i==0)//輸入數(shù)為正且是第一個(gè)節(jié)點(diǎn) { } else { } if(head->next->data>=0){ } //input=-1*input;ListInsert(head,i,input);ListInsert(head,i,input);//非第一個(gè)節(jié)點(diǎn) else head->data=1;//將長(zhǎng)整數(shù)的符號(hào)保存在頭結(jié)點(diǎn)中 ListInsert(head,i,input);//插入數(shù)據(jù) head->data=0;//將長(zhǎng)整數(shù)的符號(hào)保存在頭結(jié)點(diǎn)中 //input=abs(input);//取輸入數(shù)字的絕對(duì)值 ListInsert(head,i,input);//插入數(shù)據(jù) } } return 1;i++;if(c==';')break;//遇到數(shù)據(jù)輸入完成標(biāo)志,跳出循環(huán) scanf(“%d%c”,&input,&c);此函數(shù)實(shí)現(xiàn)的是從鍵盤(pán)上得到數(shù)據(jù)根據(jù)三種情況進(jìn)行不同的處理,判斷是否是頭結(jié)點(diǎn),判斷是否是整數(shù),判斷輸入的字符是否是“;”分號(hào)。并且如果是正整數(shù)它的頭結(jié)點(diǎn)data等于1否則為0。 7.輸出函數(shù) void OutputNumber(DLNode *head,int sign){ DLNode *r=head->next;while(r->data==0&&r!=head->prior){ r=r->next;} if(sign==1){ printf(“結(jié)果是:”);} else { printf(“結(jié)果是:-”);} printf(“%d”,r->data); r=r->next; while(r!=head) { if(r->data<10) { printf(“,000”); printf(“%d”,r->data); } else if(r->data<100) { printf(“,00”); printf(“%d”,r->data); } else if(r->data<1000){ //從表尾輸出數(shù)據(jù)元素 } } printf(“n”); } else { } r=r->next; printf(“,%d”,r->data);printf(“,0”);printf(“%d”,r->data);此函數(shù)實(shí)現(xiàn)的是將最后的結(jié)果輸出到顯示屏上,經(jīng)過(guò)判斷數(shù)據(jù)的正負(fù)和數(shù)據(jù)的范圍來(lái)進(jìn)行不同的處理,以保證在顯示屏上顯示的是正確的格式。 8.不完整加法函數(shù)(只可實(shí)現(xiàn)正數(shù)加上正數(shù)) void add(DLNode *head1,DLNode *head2,DLNode *head3){ int z=0; if(p1==head1&&p2!=head2){ while(p2!=head2){ e=p2->data+z;if(e>=10000){ z=1;int e;DLNode *p1,*p2;p1=head1->prior;p2=head2->prior;while(p1!=head1&&p2!=head2){ e=p1->data+p2->data+z; } if(e>=10000){ } else z=0;ListInsert(head3,0,e);p1=p1->prior;p2=p2->prior;z=1;e=e%10000; } else z=0;ListInsert(head3,0,e);p2=p2->prior;e=e%10000;} if(z==1)ListInsert(head3,0,z);} else if(p1!=head1&&p2==head2){ while(p1!=head1){ e=p1->data+z; if(e>=10000){ } z=1;e=e%10000;else z=0;p1=p1->prior;ListInsert(head3,0,e);} if(z==1)ListInsert(head3,0,z);} else{ if(z==1)ListInsert(head3,0,z);} } 此函數(shù)實(shí)現(xiàn)的是兩個(gè)正數(shù)之間的相加運(yùn)算,主要的算法和我們手算加法是一樣的,首先設(shè)置一個(gè)進(jìn)位計(jì)數(shù)的變量,根據(jù)存儲(chǔ)的特點(diǎn)從低位開(kāi)始相加帶上進(jìn)位即可得出相應(yīng)的位和,最后更新進(jìn)位變量。處理邊界狀況:如果兩個(gè)鏈表一樣長(zhǎng)同時(shí)他們最高位在計(jì)算完成時(shí)仍然會(huì)有進(jìn)位,那么應(yīng)該考慮到在數(shù)據(jù)的更高位插入一個(gè)1表示最后的計(jì)算結(jié)果,這樣才可以保證數(shù)據(jù)的完整性。9.判斷倆正數(shù)大小函數(shù): int change(DLNode *head1,DLNode *head2){ int length1,length2,r=2;length1=ListLength(head1);DLNode *p1,*p2;p1=head1->next;p2=head2->next;length2=ListLength(head2); if(length1>length2){ } else if(length1 } else { } return r;} int i=0;for(i=0;i } if(p1->data>p2->data){ } else if(p2->data>p1->data){ } else { } p1=p1->next;p2=p2->next;r=2;r=1;return r;break;r=0;return r;break;r=1;return r;r=0;return r;此函數(shù)實(shí)現(xiàn)的是判斷倆個(gè)正數(shù)的大小??紤]倆正數(shù)的在鏈表中所占存儲(chǔ)單元的多少,多的一定大,當(dāng)他們一樣長(zhǎng)時(shí),一位一位的比較直到找到一個(gè)節(jié)點(diǎn)中的data比另一個(gè)鏈表的對(duì)應(yīng)節(jié)點(diǎn)的data大為止。如果最后仍是一樣大那么這兩個(gè)數(shù)就是一樣大的。返回值為自己約定的參數(shù)r等于2表示倆數(shù)一樣大,等于1表示第二個(gè)數(shù)大,等于 0表示第一個(gè)數(shù)大。 10.乘法函數(shù): void method(DLNode *head1,DLNode *head2,int x){ void minus(DLNode *head1,DLNode *head2,DLNode *head3);DLNode *temp1;DLNode *temp2;DLNode *temp3;DLNode *temp4;DLNode *temp5;int e,z=0,i,j;ListInitiate(&temp1);ListInitiate(&temp2);ListInitiate(&temp3);ListInsert(temp2,0,0);DLNode *p1,*p2;p1=head1->prior;p2=head2->prior;for(i=0;i while(p1!=head1){ } if(z!=0)ListInsert(temp1,0,z);for(j=0;j } else z=0;ListInsert(temp1,0,e);p1=p1->prior;z=e/10000;e=e-z*10000;ListInitiate(&temp4);ListInsert(temp4,0,0);ListInitiate(&temp5); } p1=head1->prior;p2=p2->prior;}OutputNumber(temp2,x);此函數(shù)實(shí)現(xiàn)的是倆個(gè)整數(shù)的乘法運(yùn)算。模仿手算乘法,乘數(shù)的每一位分別和被乘數(shù)相乘得到的結(jié)果相加,注意的是在每次乘完相加時(shí)注意把低位的空缺補(bǔ)上0,以保證數(shù)據(jù)可以按位相加。在每一位乘法時(shí)需要注意一定要加上低位的進(jìn)位以及改變進(jìn)位的值,這樣才能保證每一位誠(chéng)出來(lái)的結(jié)果是正確的。11.減法函數(shù): void minus(DLNode *head1,DLNode *head2,DLNode *head3){ int z=0,x=-1;int e;DLNode *p1,*p2;p1=head1->prior;p2=head2->prior;x=change(head1,head2);if(x==0){ while(p1!=head1&&p2!=head2){ } p1->data=p1->data+z;p1->data=p1->data+z;if(p1->data>=p2->data){ } else { } e=10000+p1->data-p2->data;ListInsert(head3,0,e);z=-1;e=p1->data-p2->data;ListInsert(head3,0,e);p1=p1->prior;p2=p2->prior;z=0;p1=p1->prior;p2=p2->prior;while(p1!=head1){ e=p1->data; ListInsert(head3,0,e); p1=p1->prior;} else if(x==1){ p2=head1->prior;while(p1!=head2&&p2!=head1){ } p1->data=p1->data+z;p1->data=p1->data+z;if(p1->data>=p2->data){ } else { } e=10000+p1->data-p2->data;ListInsert(head3,0,e);z=-1;e=p1->data-p2->data;ListInsert(head3,0,e);p1=p1->prior;p2=p2->prior;z=0;p1=head2->prior;} p1=p1->prior;p2=p2->prior;while(p1!=head2){ e=p1->data;p1=p1->prior;ListInsert(head3,0,e);} head3->next->data=-1*head3->next->data;} else { } } head3->next->data=0;此函數(shù)實(shí)現(xiàn)的是兩個(gè)正數(shù)的減法運(yùn)算。整個(gè)函數(shù)分為倆大部分,第一部分處理第一個(gè)數(shù)大于第二個(gè)數(shù),第而部分是處理第二個(gè)數(shù)大于第一個(gè)數(shù)。在這個(gè)為題上我自己想了好長(zhǎng) 時(shí)間,感覺(jué)倆部分可以 結(jié)合成一部分,但是由于本人的知識(shí)所限沒(méi)有想出更好的辦法,這使得代碼量增加了足足一倍之多。仍然模仿手算減法,先找到倆數(shù)字中最大的那個(gè),用大的減去小的。最后判斷符號(hào)位。12.整合八種情況函數(shù): void yunsuan(DLNode *head1,DLNode *head2,DLNode *head3,char ch){ DLNode *p1,*p2;p1=head1->next;p2=head2->next;if(head1->data==1&&head2->data==1){ } else if(head1->data==1&&head2->data==0){ } else if(head1->data==0&&head2->data==1){ } if(ch=='+'){ } else { } head1->next->data*=-1;head2->next->data*=-1;add(head1,head2,head3);head3->next->data*=-1;head1->next->data*=-1;minus(head2,head1,head3);if(ch=='+'){ } else { } head2->next->data*=-1;add(head1,head2,head3);head2->next->data*=-1;minus(head1,head2,head3);if(ch=='+')add(head1,head2,head3);else minus(head1,head2,head3); else { } } 此函數(shù)實(shí)現(xiàn)的是八種情況的整合。八種情況分別是正數(shù)加正數(shù)、正數(shù)加負(fù)數(shù)、正數(shù)減正數(shù)、正數(shù)減負(fù)數(shù)、負(fù)數(shù)加負(fù)數(shù)、負(fù)數(shù)加正數(shù)、負(fù)數(shù)減正數(shù)、負(fù)數(shù)減負(fù)數(shù)。此函數(shù)調(diào)用已經(jīng)做好的正數(shù)加正數(shù)和正數(shù)減正數(shù)函數(shù)判斷符號(hào)位,根據(jù)一定的規(guī)則實(shí)現(xiàn)八種運(yùn)算。if(ch=='+'){ } { } head1->next->data*=-1;head2->next->data*=-1;minus(head2,head1,head3);head1->next->data*=-1;head2->next->data*=-1;add(head1,head2,head3);head3->next->data*=-1;else 13.整合乘法運(yùn)算函數(shù): void chengfa(DLNode *head1,DLNode *head2){ int i;if((head1->next->data*head2->next->data)<0){ } else { } } 此函數(shù)實(shí)現(xiàn)的是乘法運(yùn)算的完整運(yùn)算。調(diào)用已經(jīng)實(shí)現(xiàn)的正數(shù)乘以正數(shù)的函數(shù)來(lái)計(jì)算函數(shù)值,在判斷最head1->next->data=abs(head1->next->data);head2->next->data=abs(head2->next->data);i=1;method(head1,head2,i);head1->next->data=abs(head1->next->data);head2->next->data=abs(head2->next->data);i=0;method(head1,head2,i); 終的函數(shù)符號(hào),得到最和的結(jié)果。 14.主函數(shù): void main(){ } 此函數(shù)是主函數(shù)。主要的作用是為用戶做一個(gè)提示,如何完成自己想要的運(yùn)算。同時(shí)調(diào)用各個(gè)函數(shù)實(shí)現(xiàn)運(yùn)算。char ch,ch1;while(1){ } //int w=-1;DLNode *a,*b,*c;ListInitiate(&a);ListInitiate(&b);ListInitiate(&c);printf(“請(qǐng)輸入數(shù)A(以分號(hào)結(jié)束):”);InputNumber(a);//printf(“n”);printf(“請(qǐng)輸入數(shù)B(以分號(hào)結(jié)束):”);InputNumber(b);//w=change(a,b);printf(“請(qǐng)選擇操作符:<+,-,*>:n”);scanf(“%s”,&ch1);if(ch1=='+'||ch1=='-'){ } else if(ch1=='*')chengfa(a,b);else printf(“此版本不支持%c運(yùn)算”,ch1);printf(“要繼續(xù)嗎?(y/n):”);scanf(“%s”,&ch);if(ch=='Y'||ch=='y'){ } else exit(0);printf(“n”);continue;yunsuan(a,b,c,ch1);OutputNumber(c,1); 三、調(diào)試分析 1.調(diào)試過(guò)程中遇到的問(wèn)題 在函數(shù)編寫(xiě)之前我首先寫(xiě)出了所有函數(shù)的框架以及各個(gè)函數(shù)之間的關(guān)系,根據(jù)逐步求精的思想來(lái)完善整個(gè)程序。即使是這樣我仍然遇到了不少錯(cuò)誤。 例如:在實(shí)現(xiàn)正數(shù)減正數(shù)時(shí),我一開(kāi)始沒(méi)有分為以上所說(shuō)的倆個(gè)部分,而是把倆個(gè)部分整合到一起實(shí)現(xiàn)一個(gè)大函數(shù),但是在我運(yùn)行調(diào)試時(shí)結(jié)果大不如人意,出現(xiàn)的都是匪夷所思的數(shù)字,我根本就推算不出這些數(shù)字是怎么來(lái)的。沒(méi)有辦法我只好在另辟途徑來(lái)完成函數(shù)的實(shí)現(xiàn)。于是我就分作兩個(gè)部分來(lái)實(shí)現(xiàn),這樣逐步追蹤可以使思緒更加清晰,所付出的代價(jià)是代碼量增加。 四、使用說(shuō)明和測(cè)試結(jié)果 1.使用說(shuō)明 用戶在使用該程序時(shí),只需按照程序中的規(guī)定進(jìn)行即可實(shí)現(xiàn)長(zhǎng)整數(shù)的加減運(yùn)算,具體使用步驟如下: 1)點(diǎn)擊運(yùn)行按鈕,在DOS窗口下按照規(guī)定輸入的數(shù)字需要從低位開(kāi)始數(shù)四位一組用逗號(hào)隔開(kāi)。輸入第一個(gè)數(shù)字。2)同上輸入第二個(gè)數(shù); 3)選擇要對(duì)這兩個(gè)長(zhǎng)整數(shù)進(jìn)行的運(yùn)算。 4)兩個(gè)操作數(shù)與運(yùn)算符選擇完畢后,按回車(chē)鍵即可得到運(yùn)算結(jié)果。2.測(cè)試結(jié)果 1)考慮邊界數(shù)字,輸入0和0做加法運(yùn)算,輸出“0”,結(jié)果如下圖: 2)考慮加法進(jìn)位(包括低位向高位的進(jìn)位以及高位仍有進(jìn)位情況),結(jié)果如下圖: 3)考慮減法進(jìn)位并且數(shù)A小于數(shù)B以及數(shù)A大于數(shù)B,結(jié)果如下圖: 4)乘法結(jié)果為正數(shù)以及負(fù)數(shù)兩種情況,結(jié)果如下圖: 5)本試驗(yàn)要求的數(shù)據(jù) 0、0; 輸出“0”(已證明) 2345,6789、-7654,3211; 輸出“1,0000,0000” 1,0000,0000,0000、9999,9999; 輸出“9999,0000,0001” 1,0001,0001、;1,0001,0001; 輸出“0” 五、心得體會(huì) 本次試驗(yàn)是我感覺(jué)到了理論應(yīng)用與實(shí)踐的意義,以前我們也做過(guò)類(lèi)似的題目,所以在試驗(yàn)中我感覺(jué)還是比較順利的但是還是花了我十七個(gè)小時(shí)左右才完成。根據(jù)模塊化思想來(lái)把握整體結(jié)構(gòu)會(huì)使自己的思路更加清晰,更加明了。得到的東西往往是說(shuō)不出來(lái)的只有自己心理面最清楚。 六、附錄 程序的完整代碼清單: #include int data;struct Node *prior;struct Node *next;}DLNode;void ListInitiate(DLNode **head)//雙向鏈表的初始化 { if((*head=(DLNode *)malloc(sizeof(DLNode)))==NULL)exit(0);(*head)->prior=*head; } int ListLength(DLNode *head)//雙向鏈表的表長(zhǎng) { } int ListInsert(DLNode *head,int i,int x)//雙向鏈表的數(shù)據(jù)插入,i表示是插入的第幾個(gè)元素 { } int abs(int x){ if(x<0)return-x;DLNode *p,*s;int j;p=head->next;j=0;while(p!=head&&j } if(j!=i){ } if((s=(DLNode *)malloc(sizeof(DLNode)))==NULL)exit(0);s->data=x;s->prior=p->prior;//插入 p->prior->next=s;s->next=p;p->prior=s;return 1;printf(“n插入位置不合法!”);return 0;p=p->next;j++;DLNode *p=head;int size=0;while(p->next!=head){ } p=p->next;size++;(*head)->next=*head;return size; } int InputNumber(DLNode *head)//讀入輸入的數(shù)據(jù) { } void OutputNumber(DLNode *head,int sign)//從表尾輸出數(shù)據(jù)元素 { DLNode *r=head->next;while(r->data==0&&r!=head->prior){ r=r->next;int input,i=0;//第i個(gè)節(jié)點(diǎn) char c;scanf(“%d%c”,&input,&c);while(1){ } return 1;if(input<0&&i==0)//輸入數(shù)為負(fù)且是第一個(gè)節(jié)點(diǎn) { } else if(input>=0&&i==0)//輸入數(shù)為正且是第一個(gè)節(jié)點(diǎn) { } else { } i++;if(c==';')break;//遇到數(shù)據(jù)輸入完成標(biāo)志,跳出循環(huán) scanf(“%d%c”,&input,&c);if(head->next->data>=0){ } //input=-1*input;ListInsert(head,i,input);ListInsert(head,i,input);//非第一個(gè)節(jié)點(diǎn) else head->data=1;//將長(zhǎng)整數(shù)的符號(hào)保存在頭結(jié)點(diǎn)中 ListInsert(head,i,input);//插入數(shù)據(jù) head->data=0;//將長(zhǎng)整數(shù)的符號(hào)保存在頭結(jié)點(diǎn)中 //input=abs(input);//取輸入數(shù)字的絕對(duì)值 ListInsert(head,i,input);//插入數(shù)據(jù) else return x; } void add(DLNode *head1,DLNode *head2,DLNode *head3){ int z=0;int e;DLNode *p1,*p2;} if(sign==1){ } else { } printf(“%d”,r->data);r=r->next;while(r!=head){ } printf(“n”); if(r->data<10){ } else if(r->data<100){ } else if(r->data<1000){ } else { } r=r->next; printf(“,%d”,r->data);printf(“,0”);printf(“%d”,r->data); printf(“,00”);printf(“%d”,r->data);printf(“,000”);printf(“%d”,r->data);printf(“結(jié)果是:-”);printf(“結(jié)果是:”); p1=head1->prior;p2=head2->prior;while(p1!=head1&&p2!=head2) if(p1==head1&&p2!=head2){ while(p2!=head2){ e=p2->data+z;if(e>=10000){ } else z=0;ListInsert(head3,0,e);p2=p2->prior;z=1;e=e%10000;{ e=p1->data+p2->data+z; } if(e>=10000){ } else z=0;ListInsert(head3,0,e);p1=p1->prior;p2=p2->prior;z=1;e=e%10000;} if(z==1)ListInsert(head3,0,z);} else if(p1!=head1&&p2==head2){ while(p1!=head1){ e=p1->data+z; if(e>=10000){ } z=1;e=e%10000;else z=0;p1=p1->prior;ListInsert(head3,0,e);} if(z==1)ListInsert(head3,0,z);} else{ } int change(DLNode *head1,DLNode *head2){ int length1,length2,r=2;length1=ListLength(head1);DLNode *p1,*p2;p1=head1->next;p2=head2->next;if(length1>length2){ } else if(length1 } else { int i=0;for(i=0;i if(p1->data>p2->data){ } else if(p2->data>p1->data){ } else { p1=p1->next;p2=p2->next;r=1;return r;break;r=0;return r;break;r=1;return r;r=0;return r;if(z==1)ListInsert(head3,0,z);} length2=ListLength(head2); } void method(DLNode *head1,DLNode *head2,int x){ void minus(DLNode *head1,DLNode *head2,DLNode *head3);DLNode *temp1;DLNode *temp2;DLNode *temp3;DLNode *temp4;DLNode *temp5;int e,z=0,i,j;ListInitiate(&temp1);ListInitiate(&temp2);ListInitiate(&temp3);ListInsert(temp2,0,0);DLNode *p1,*p2;p1=head1->prior;p2=head2->prior;for(i=0;i while(p1!=head1){ } if(z!=0)ListInsert(temp1,0,z);for(j=0;j } else z=0;ListInsert(temp1,0,e);p1=p1->prior;z=e/10000;e=e-z*10000;ListInitiate(&temp4);ListInsert(temp4,0,0);ListInitiate(&temp5); } return r; } } r=2; } void minus(DLNode *head1,DLNode *head2,DLNode *head3){ int z=0,x=-1;int e;DLNode *p1,*p2;p1=head1->prior;p2=head2->prior;x=change(head1,head2);if(x==0){ while(p1!=head1&&p2!=head2){ } p1->data=p1->data+z;p1->data=p1->data+z;if(p1->data>=p2->data){ } else { } e=10000+p1->data-p2->data;ListInsert(head3,0,e);z=-1;e=p1->data-p2->data;ListInsert(head3,0,e);p1=p1->prior;p2=p2->prior;z=0; add(temp1,temp2,temp3);temp1=temp4;temp2=temp3;temp3=temp5;z=0;p1=head1->prior;p2=p2->prior;}OutputNumber(temp2,x);p1=p1->prior;p2=p2->prior;while(p1!=head1){ e=p1->data;p1=p1->prior;ListInsert(head3,0,e);} } } void yunsuan(DLNode *head1,DLNode *head2,DLNode *head3,char ch){ DLNode *p1,*p2;p1=head1->next;p2=head2->next;if(head1->data==1&&head2->data==1)else if(x==1){ p2=head1->prior;while(p1!=head2&&p2!=head1){ } p1->data=p1->data+z;p1->data=p1->data+z;if(p1->data>=p2->data){ } else { } e=10000+p1->data-p2->data;ListInsert(head3,0,e);z=-1;e=p1->data-p2->data;ListInsert(head3,0,e);p1=p1->prior;p2=p2->prior;z=0;p1=head2->prior;p1=p1->prior;p2=p2->prior;while(p1!=head2){ e=p1->data;p1=p1->prior;ListInsert(head3,0,e);} head3->next->data=-1*head3->next->data;} else { } head3->next->data=0; { } else if(head1->data==1&&head2->data==0){ } else if(head1->data==0&&head2->data==1){ } else { if(ch=='+'){ } { head1->next->data*=-1;head1->next->data*=-1;head2->next->data*=-1;add(head1,head2,head3);head3->next->data*=-1;if(ch=='+'){ } else { } head1->next->data*=-1;head2->next->data*=-1;add(head1,head2,head3);head3->next->data*=-1;head1->next->data*=-1;minus(head2,head1,head3);if(ch=='+'){ } else { } head2->next->data*=-1;add(head1,head2,head3);head2->next->data*=-1;minus(head1,head2,head3);if(ch=='+')add(head1,head2,head3);else minus(head1,head2,head3);else } void chengfa(DLNode *head1,DLNode *head2){ } void main(){ char ch,ch1;while(1){ //int w=-1;DLNode *a,*b,*c;ListInitiate(&a);ListInitiate(&b);ListInitiate(&c);printf(“請(qǐng)輸入數(shù)A(以分號(hào)結(jié)束):”);InputNumber(a);//printf(“n”);printf(“請(qǐng)輸入數(shù)B(以分號(hào)結(jié)束):”);InputNumber(b);//w=change(a,b);printf(“請(qǐng)選擇操作符:<+,-,*>:n”);scanf(“%s”,&ch1);if(ch1=='+'||ch1=='-'){ yunsuan(a,b,c,ch1);int i;if((head1->next->data*head2->next->data)<0){ } else { } head1->next->data=abs(head1->next->data);head2->next->data=abs(head2->next->data);i=1;method(head1,head2,i);head1->next->data=abs(head1->next->data);head2->next->data=abs(head2->next->data);i=0;method(head1,head2,i); } } head2->next->data*=-1;minus(head2,head1,head3); } } } else if(ch1=='*')chengfa(a,b);else printf(“此版本不支持%c運(yùn)算”,ch1);printf(“要繼續(xù)嗎?(y/n):”);scanf(“%s”,&ch);if(ch=='Y'||ch=='y'){ } else exit(0);printf(“n”);continue;OutputNumber(c,1);第二篇:無(wú)線課程設(shè)計(jì)實(shí)驗(yàn)報(bào)告
第三篇:學(xué)生通訊錄管理系統(tǒng)(C語(yǔ)言課程設(shè)計(jì)實(shí)驗(yàn)報(bào)告)
第四篇:語(yǔ)言課程設(shè)計(jì)要求
第五篇:長(zhǎng)整數(shù)加減運(yùn)算實(shí)驗(yàn)報(bào)告