c语言程序代码应缩进几格,汉诺塔c语言程序代码

汉诺塔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];

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值