漢諾塔c語言程式代碼(通過vc++6.0驗證)(附講解) 讓我們先看看代碼吧 #include int hj(int a,int b, int c,int i) { int t; if(i==1)
printf("%d->%d\n",a,c); else {t=c; c=b; b=t; hj(a,b,c,i-1); printf("%d->%d\n",a,b); t=a; a=c; c=t; t=b; b=c; c=t; hj(a,b,c,i-1); return 0; } } main() { int a,b,c,i; a=1; b=2; c=3; printf("請輸入漢諾塔的盤數"); scanf("%d",&i); hj(a,b,c,i); return 0; }
以上是漢諾塔的代碼,該程式主要是運用了遞歸的思想,比如數學中的f(x)=f(x-1)+f(x-2),在本程式中為:int hj(int a,int b, int c,int i) { int t; if(i==1)
printf("%d->%d\n",a,c); else {t=c; c=b; b=t; hj(a,b,c,i-1); 也就是說,我們在這個函數中再次調用這個函數,相當于一個循環,而在再次調用的過程中,i的值變成i-1,就類似于f(x-1),這樣層層調用,最終就變成當i=1的時候的值,然後通過運算,計算出想要得到的值。 漢諾塔的數值分析:
我們可以發現,當隻有一個盤的時候,我們隻需要做1->3(就是把第一個柱子上的最頂端的盤移動到第三根柱子,以下不再解釋) 當有兩個盤的時候,是1->2
1->3
2->3 三個盤子是:1->3
1->2
3->2
1->3
2->1
2->3 分析一下可以得出以下結論: 初始值a=1 b=2 c=3 一個盤子就是a->c 兩個盤子與一個盤子的關系是:
第一步:b與c交換值,然後列印a->c 第二步:列印a->b 第三步:a與c交換值,b與c交換值,列印a->c 進一步分析,便可以得出以下結論 隻要盤子數量為i(i大于1),那麼它就有三部分 第一部分,b與c交換值,然後運作i-1 第二部分,列印a->b 第三部分,a與c交換值,b與c交換值,然後運作i-1 程式表示便是: if(i==1)
printf("%d->%d\n",a,c); else {t=c; c=b;(交換值)
b=t; hj(a,b,c,i-1); printf("%d->%d\n",a,b); t=a; a=c; c=t;(a c交換)
t=b; b=c; c=t;(b c交換)
hj(a,b,c,i-1); 不明加QQ765233918(請寫清備注)
1->3
漢諾塔c語言程式代碼(通過vc++6.0驗證)(附講解) 讓我們先看看代碼吧 #include int hj(int a,int b, int c,int i) { int t; if(i==1)
printf("%d->%d\n",a,c); else {t=c; c=b; b=t; hj(a,b,c,i-1); printf("%d->%d\n",a,b); t=a; a=c; c=t; t=b; b=c; c=t; hj(a,b,c,i-1); return 0; } } main() { int a,b,c,i; a=1; b=2; c=3; printf("請輸入漢諾塔的盤數"); scanf("%d",&i); hj(a,b,c,i); return 0; }
以上是漢諾塔的代碼,該程式主要是運用了遞歸的思想,比如數學中的f(x)=f(x-1)+f(x-2),在本程式中為:int hj(int a,int b, int c,int i) { int t; if(i==1)
printf("%d->%d\n",a,c); else {t=c; c=b; b=t; hj(a,b,c,i-1); 也就是說,我們在這個函數中再次調用這個函數,相當于一個循環,而在再次調用的過程中,i的值變成i-1,就類似于f(x-1),這樣層層調用,最終就變成當i=1的時候的值,然後通過運算,計算出想要得到的值。 漢諾塔的數值分析:
我們可以發現,當隻有一個盤的時候,我們隻需要做1->3(就是把第一個柱子上的最頂端的盤移動到第三根柱子,以下不再解釋) 當有兩個盤的時候,是1->2
1->3
2->3 三個盤子是:1->3
1->2
3->2
1->3
2->1
2->3 分析一下可以得出以下結論: 初始值a=1 b=2 c=3 一個盤子就是a->c 兩個盤子與一個盤子的關系是:
第一步:b與c交換值,然後列印a->c 第二步:列印a->b 第三步:a與c交換值,b與c交換值,列印a->c 進一步分析,便可以得出以下結論 隻要盤子數量為i(i大于1),那麼它就有三部分 第一部分,b與c交換值,然後運作i-1 第二部分,列印a->b 第三部分,a與c交換值,b與c交換值,然後運作i-1 程式表示便是: if(i==1)
printf("%d->%d\n",a,c); else {t=c; c=b;(交換值)
b=t; hj(a,b,c,i-1); printf("%d->%d\n",a,b); t=a; a=c; c=t;(a c交換)
t=b; b=c; c=t;(b c交換)
hj(a,b,c,i-1); 不明加QQ765233918(請寫清備注)
1->3
C語言程式設計(漢諾塔設計)
#includevoid main() {void tian(int n,int x,int y,int z);
int m; printf("please enter the number of diskes:\n"); scanf("%d",&m); printf("the step of move %d diskes :",m); tian(m,'A','B','C');
} void tian(int n,int x,int y,int z)
{void move(int x,int y);
if(n==1) move(x,z);
else
{tian(n-1,x,z,y); move(x,y);
tian(n-1,y,x,z); } } void move(int x, int y)
{printf("%c——>%c\n",x,y);
}
C語言 程式代碼編寫規範
(初級程式員 讨論版)
前言
一個好的程式編寫規範是編寫高品質程式的保證。清晰、規範的源程式不僅僅是友善閱讀,更重要的是能夠便于檢查錯誤,提高調試效率,進而最終保證軟體的品質和可維護性。
說明
此文擋還在完善改進中,如有不足,歡迎指正。 本文檔主要适用于剛剛開始接觸程式設計的初學者。
對于具有一定工程項目開發經驗的程式員,建議學習C語言程式代碼編寫規範—進階版。
目錄
1 代碼書寫規範 2 注釋書寫規範 3 命名規範内容
1 代碼書寫規範
1.1函數定義
每個函數的定義和說明應該從第1列開始書寫。函數名(包括參數表)和函數體的花括号(“{”和“}”)應該各占一行。在函數體結尾的括号(“}”)後面應該加上注釋,注釋中應該包括函數名,這樣比較友善進行括号配對檢查,也可以清晰地看出來函數是否結束。
範例1:函數的聲明
void matMyFunction(int n) { …… } 1.2空格的使用
使用空格分割所有演算符号和操作數。
這條規則的例外是“->”,““.”, “()”和“[]”,這些操作符和操作數之間不空格。 當需要把一個程式行的内容分成幾行寫時,操作符号應該放在行末,而不是下一行的開頭。
1.3縮進的設定
代碼書寫應該遵從結構化的要求,采用縮進的格式。最小縮進量為4個空格,整個檔案内部應該統一,不要混用Tab鍵和4個空格這兩種情況,因為不同的編輯器對Tab鍵的處理方法不同。
1.4折行的使用
每行的長度不要超過80個字元,當程式行太長時,應該分行書寫。 分行時應該按照自然的邏輯關系進行,例如:不要把一個簡單的邏輯判斷寫在兩行上。
分行後的縮進應該按照程式的邏輯關系進行對齊。例如:參數表折行後,下面的行應該在參數表左括号的下方。
範例2:折行的格式dwNewShape = matAffineTransform(coords, translation,
rotation);
if ( ( (new_shape.x > left_border) &&
(new_shape.x < right_border) ) &&
( (new_shape.y > bottom_border) &&
(new_shape.y < top_border) ) ) {
draw(new_shape); }
1.5嵌套語句(語句塊)的格式
對于嵌套式的語句--即語句塊(如,if、while、switch等)應該包括在花括号中。花括号的左括号應該單獨占一行,并與關鍵字對齊。建議即使語句塊中隻有一條語句,也應該使用花括号包括,這樣可以使程式結構更清晰,也可以避免出錯。建議對比較長的塊,在末尾的花括号後加上注釋以表明該語言塊結束。
範例3:嵌套語句格式 if (value < max) {
if (value != 0)
{
func(value);
} } } else {
error("The value is too big."); }
2 注釋書寫規範
注釋必須做到清晰,準确地描述内容。對于程式中複雜的部分必須有注釋加以說明。注釋量要适中,過多或過少都易導緻閱讀困難。
2.1注釋風格
語言中使用一組()作為注釋界定符。 注釋内容盡量用英語方式表述。
注釋的基本樣式參考範例4。
注釋應該出現在要說明的内容之前,而不應該出現在其後。
除了說明變量的用途和語言塊末尾使用的注釋,盡量不使用行末的注釋方式。
範例4:幾種注釋樣式
int i; 2.2何時需要注釋
如果變量的名字不能完全說明其用途,應該使用注釋加以說明。
如果為了提高性能而使某些代碼變得難懂,應該使用注釋加以說明。 對于一個比較長的程式段落,應該加注釋予以說明。如果設計文檔中有流程圖,則程式中對應的位置應該加注釋予以說明。
如果程式中使用了某個複雜的算法,建議注明其出處。
如果在調試中發現某段落容易出現錯誤,應該注明。
3 命名規範
3.1常量、變量命名
用#define定義的符号常量全部采用大寫。
變量命名的基本原則:
可以選擇有意義的英文(小寫字母)組成變量名,使人看到該變量就能大緻清 楚其含義。
不要使用人名、地名和漢語拼音。
如果使用縮寫,應該使用那些約定俗成的,而不是自己編造的。
多個單詞組成的變量名,每個單詞的首字母應該大寫。如:dwUserInputValue。
3.2函數命名
函數命名原則與變量命名原則基本相同。對于初學者,函數命名可以采用 “FunctionName”的形式。
長 春 工 業 大 學
課程設計程式代碼
課程設計名稱 運籌學課程設計 專 業 資訊管理與資訊系統 班 級 130506班 學 生 姓 名 于松南、張鑫蕊、
趙改玲、趙海潮
指 導 教 師
王亞君、王忠吉
2015年7月3日
#include#include
int m; //記錄限制條件方程組的個數 int n; //記錄未知量的個數 float M=1000000.0; float A[100][100];
//用于記錄方程組的數目和系數
float C[100];
//用于存儲目标函數中各個變量的系數 float b[100];
//用于存儲常限制條件中的常數 float CB[100];
//用于存儲基變量的系數 float seta[100];
//存放出基與入基的變化情況 float cn[100];
//存儲檢驗數矩陣 float x[100]; int num[100];
//用于存放出基與進基變量的情況 float Z=0;
//記錄目标函數值
void shuru(); void print(); int mincz(); int find_line(int a); void exchange(int a,int b); int main() {
int i,j=0;
int p,q,temp; //q:換入,p:換出
shuru();
printf("\n------------\n");
printf(" \tCB\tXB\tb\t");
for(i=0; iprintf(" X(%d)\t",i+1);
for(i=0; ix[i]=0;
printf("\n");
while(1) {
q=mincz();
if(q==-1) {
print();
printf("\n所得解已經是最優解!\n");
printf("\n最優解為:\n");
for(j=0; jtemp=num[j]-1;
x[temp]=b[j];
}
for(i=0; iprintf("x%d=%.2f ",i+1,x[i]);
Z=Z+x[i]*C[i];
}
printf("Z=%.2f",Z);
break;
}
print();
p=find_line(q);
printf("\np=%d,q=%d",p,q);
if(q==-1) break;
exchange(p,q);
}
return 0; } int mincz() {
int i,k=0;
int flag=0; //檢驗數标記
float min=0;
for(i=0; iif(cn[i]>=0)
flag=1;
else {
flag=0;
break;
}
if(flag==1)
return -1;
//進行到此處,說明存在<0的檢驗數
//找到最小的檢驗數,作為換入變量
for(i=0; iif(min>cn[i]) {
min=cn[i];
k=i;
}
}
return k; } int find_line(int a) {
int i,k,j;
int flag=0;
float min;
k=a;
for(i=0; iif(A[i][k]<=0)
flag=1;
else {
flag=0;
break;
}
if(flag==1) {
printf("\n該線性規劃無最優解!\n");
return -1;
}
for(i=0; iif(A[i][k]>0)
seta[i]=b[i]/A[i][k];
else seta[i]=M;
}
min=M;
for(i=0; iif(min>=seta[i]) {
min=seta[i];
j=i;
}
}
num[j]=k+1;
CB[j]=C[k];
return j; } void exchange(int p,int q) {
int i,j,c,l;
float temp1,temp2,temp3;
c=p; //行号,換出
l=q; //列号,換入
temp1=A[c][l]; //A[c][l]主元
b[c]=b[c]/temp1;
for(j=0; jA[c][j]=A[c][j]/temp1; //主元化為1
for(i=0; iif(i!=c)
if(A[i][l]!=0) {
temp2=A[i][l];
b[i]=b[i]-b[c]*temp2;
//主元所在列,其餘元素化為0
for(j=0; jA[i][j]=A[i][j]-A[c][j]*temp2;
}
}
temp3=cn[l];
for(i=0; icn[i]=cn[i]-A[c][i]*temp3; } void print() {
int i,j=0;
printf("\n------------\n");
for(i=0; iprintf("%8.2f\tX(%d) %8.2f ",CB[i],num[i],b[i]);
for(j=0; jprintf("%8.2f ",A[i][j]);
printf("\n");
}
printf("\n------------\n");
printf("\t\t\t");
for(i=0; iprintf(" %8.2f",cn[i]);
printf("\n------------\n"); } void shuru() {
int i,j; //循環變量
int k;
printf("請輸入線性規劃問題的限制條件個數M:");
scanf("%d",&m);
printf("請輸入線性規劃問題的決策變量個數N:");
scanf("%d",&n);
printf("\n請輸入方程組的系數矩陣A(%d行%d列):\n",m,n);
for(i=0; ifor(j=0; jscanf("%f",&A[i][j]);
printf("\n請輸入初始基變量的數字代碼矩陣:\n");
for(i=0; iscanf("%d",&num[i]);
printf("\n請輸入方程組右邊的值矩陣b:\n");
for(i=0; iscanf("%f",&b[i]);
printf("\n請輸入目标函數各個變量的系數所構成的系數陣C:\n");
for(i=0; iscanf("%f",&C[i]);
for(i=0; icn[i]=-C[i];
for(i=0; ik=num[i]-1;
CB[i]=C[k];
}
}