汉诺塔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)
/*当我选定这一行的时候 然后单击组间选择调试
run to_
发现不管输入的x值是多少
ABC的值都是65 66 67
后来才发现原来是他们所代表的十进制的值*/ {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)
/*
定义move函数用来显示移动的路线*/ {printf("%c——>%c\n",x,y);
} /*汉洛塔问题:如果有N个盘子
那么可以简化为n-1个盘子和一个盘子来处理,只要先把上面的n-1个盘子从A——>B
把第n个盘子由A——>C 再把n-1个盘子由B——>C 即可;
n-1盘子
那么可以简化为n-2个盘子和一个盘子来处理
只要
把上面的n-2个盘子从A——>B
把第n个盘子由A——>C 再把n-1个盘子由B——>C 即可;
n-3盘子
那么可以简化为n-3个盘子和一个盘子来处理
只要
把上面的n-4个盘子从A——>B
把第n个盘子由A——>C 再把n-1个盘子由B——>C 即可;
N-4
.
.
.
.
.
4个盘子
那么可以简化为3个盘子和一个盘子来处理
只要 把上面的3个盘子有a 到b
把第4个盘子由a到c 再把上面的三个盘子由b到c;
3个盘子
可以简化为。。。。*/
C语言 程序代码编写规范
(初级程序员 讨论版)
前言
一个好的程序编写规范是编写高质量程序的保证。清晰、规范的源程序不仅仅是方便阅读,更重要的是能够便于检查错误,提高调试效率,从而最终保证软件的质量和可维护性。
说明
此文挡还在完善改进中,如有不足,欢迎指正。 本文档主要适用于刚刚开始接触编程的初学者。
对于具有一定工程项目开发经验的程序员,建议学习C语言程序代码编写规范—高级版。
目录
1 代码书写规范 2 注释书写规范 3 命名规范内容
1 代码书写规范
1.1函数定义
每个函数的定义和说明应该从第1列开始书写。函数名(包括参数表)和函数体的花括号(“{”和“}”)应该各占一行。在函数体结尾的括号(“}”)后面应该加上注释,注释中应该包括函数名,这样比较方便进行括号配对检查,也可以清晰地看出来函数是否结束。
范例1:函数的声明
void matMyFunction(int n) { …… } /* matMyFunction*/ 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."); } /* if (value < max) */
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];
}
}