第一篇:汉诺塔c语言程序代码
汉诺塔c语言程序代码(通过vc++6.0验证)(附讲解)让我们先看看代码吧 #include
printf(“%d->%dn”,a,c);else {t=c;c=b;b=t;hj(a,b,c,i-1);printf(“%d->%dn”,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->%dn”,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->%dn”,a,c);else {t=c;c=b;(交换值)
b=t;hj(a,b,c,i-1);printf(“%d->%dn”,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语言程序设计(汉诺塔问题)
C语言程序设计(汉诺塔设计)
#include
/*函数声明*/
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——>%cn”,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语言程序代码
长 春 工 业 大 学
课程设计程序代码
课程设计名称 运筹学课程设计 专 业 信息管理与信息系统 班 级 130506班 学 生 姓 名 于松南、张鑫蕊、赵改玲、赵海潮
指 导 教 师
王亚君、王忠吉
2015年7月3日
#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(“ tCBtXBtbt”);
for(i=0;i printf(“ X(%d)t”,i+1); for(i=0;i x[i]=0; printf(“n”); while(1){ q=mincz(); if(q==-1){ print(); printf(“n所得解已经是最优解!n”); printf(“n最优解为:n”); for(j=0;j temp=num[j]-1; x[temp]=b[j]; } for(i=0;i printf(“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;i if(cn[i]>=0) flag=1; else { flag=0; break; } if(flag==1) return-1; //进行到此处,说明存在<0的检验数 //找到最小的检验数,作为换入变量 for(i=0;i if(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;i if(A[i][k]<=0) flag=1; else { flag=0; break; } if(flag==1){ printf(“n该线性规划无最优解!n”); return-1; } for(i=0;i if(A[i][k]>0) seta[i]=b[i]/A[i][k]; else seta[i]=M; } min=M; for(i=0;i if(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;j A[c][j]=A[c][j]/temp1;//主元化为1 for(i=0;i if(i!=c) if(A[i][l]!=0){ temp2=A[i][l]; b[i]=b[i]-b[c]*temp2; //主元所在列,其余元素化为0 for(j=0;j A[i][j]=A[i][j]-A[c][j]*temp2; } } temp3=cn[l]; for(i=0;i cn[i]=cn[i]-A[c][i]*temp3;} void print(){ int i,j=0; printf(“n------------n”); for(i=0;i printf(“%8.2ftX(%d)%8.2f ”,CB[i],num[i],b[i]); for(j=0;j printf(“%8.2f ”,A[i][j]); printf(“n”); } printf(“n------------n”); printf(“ttt”); for(i=0;i printf(“ %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;i for(j=0;j scanf(“%f”,&A[i][j]); printf(“n请输入初始基变量的数字代码矩阵:n”); for(i=0;i scanf(“%d”,&num[i]); printf(“n请输入方程组右边的值矩阵b:n”); for(i=0;i scanf(“%f”,&b[i]); printf(“n请输入目标函数各个变量的系数所构成的系数阵C:n”); for(i=0;i scanf(“%f”,&C[i]); for(i=0;i cn[i]=-C[i]; for(i=0;i k=num[i]-1; CB[i]=C[k]; } } C语言 程序代码编写规范 (初级程序员 讨论版) 前言 一个好的程序编写规范是编写高质量程序的保证。清晰、规范的源程序不仅仅是方便阅读,更重要的是能够便于检查错误,提高调试效率,从而最终保证软件的质量和可维护性。 说明 此文挡还在完善改进中,如有不足,欢迎指正。本文档主要适用于刚刚开始接触编程的初学者。 对于具有一定工程项目开发经验的程序员,建议学习C语言程序代码编写规范—高级版。 目录 代码书写规范 2 注释书写规范 3 命名规范内容代码书写规范 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.1注释风格 语言中使用一组(/* … */)作为注释界定符。注释内容尽量用英语方式表述。 注释的基本样式参考范例4。 注释应该出现在要说明的内容之前,而不应该出现在其后。 除了说明变量的用途和语言块末尾使用的注释,尽量不使用行末的注释方式。 范例4:几种注释样式 /* * ************************************************* 强调注释 * ************************************************ */ /* * 块注释 */ /* 单行注释 */ int i;/*行末注释*/ 2.2何时需要注释 如果变量的名字不能完全说明其用途,应该使用注释加以说明。 如果为了提高性能而使某些代码变得难懂,应该使用注释加以说明。对于一个比较长的程序段落,应该加注释予以说明。如果设计文档中有流程图,则程序中对应的位置应该加注释予以说明。 如果程序中使用了某个复杂的算法,建议注明其出处。 如果在调试中发现某段落容易出现错误,应该注明。命名规范 3.1常量、变量命名 用#define定义的符号常量全部采用大写。 变量命名的基本原则: 可以选择有意义的英文(小写字母)组成变量名,使人看到该变量就能大致清 楚其含义。 不要使用人名、地名和汉语拼音。 如果使用缩写,应该使用那些约定俗成的,而不是自己编造的。 多个单词组成的变量名,每个单词的首字母应该大写。如:dwUserInputValue。 3.2函数命名 函数命名原则与变量命名原则基本相同。对于初学者,函数命名可以采用 “FunctionName”的形式。 师生问答对话的探索----《汉诺塔》教学反思 山东省日照市文登路小学 刘卫妮 汉诺塔游戏,起源于古印度的一个传说,这一堂从游戏中开始的数学课,将一改有些学生认为“数学很枯燥的”的想法,通过让学生自己动手去体验,不仅是在学习数学知识,更是在训练数学思维。揭开的不仅是谜底,更是想教给学生如何学好数学的一种方法。下面,我将对师生问答对话进行一下反思。 过程课中,第一,开始通过师生会话自然导入,如:你喜欢玩游戏吗?你还想继续玩吗?通过传说中关于世界末日的预言,让学生迫不及待的想找到问题的答案。第二,通过让学生到黑板上贴标题的方法,一方面自然出现课题,另一方面通过这种活动又复习了游戏规则,让学生通过活动说出游戏规则。如,师:孩子们,眼睛看到这儿来,你发现了什么? 生:老师,汉诺塔这款游戏器具既有立柱,还有圆盘,我发现黑板上只有三根立柱,而缺少圆盘。师:孩子,你有一双善于发现的眼睛。圆盘在老师手里。谁来将这三个纸质圆盘贴到黑板上的第一根圆柱上?生贴师:大家同意他的贴法吗?理由是什么?师:同学们同意他的观点吗?生:。。师:是的,小盘在上,大盘在下,这是我们玩这款游戏的规则之一(PPT出示),汉诺塔仅仅这一个规则吗?生:老师,我知道。玩汉诺塔还有一个规则是:一次只能移动一个圆盘。师:说的很好。请同学们仔细观察,看老师的操作是否正确,并说出理由。(师故意做错误演示)生:。。第三,注重在各个环节中渗透对学生的情感目标。比如“师:孩子们知道了游戏规则,我想征求大家的意见,此时,你最想干什么?”通过询问,拉近和学生的距离,建立一种平等民主的教学环境。又如“师:XX同学,不仅善于分析,还讲述的非常清楚,跟大家分享了他的成功。孩子们,分享别人的成功,也是一种进步。”让学生知道要取长补短,互相学习。第四,通过让学生找最少步数之间的规律进行拓展延伸,找到里面的数学奥秘,让学生觉得数学是很有趣的,数学无处不在,我们可以用数学问题解释生活中的很多事情。如,师:要是我们一直这样做下去,还没有做到咱们所有的9个圆盘的游戏,就已经下课了,来,我们先一起看一下我们的研究成果,认真看,你发现这些数字有什么规律了吗?最后,作为奖励我给学生讲了一个小故事,这个故事正好体现了本节课的数学问题,让学 生在课下研究探索,找到问题的答案,寓教于乐。师:同学们,今天的这堂课老师分享了你们的成功和快乐,老师有一个故事也想和大家分享一下,“百万富翁的破产”:杰米是百万富翁,一天,他碰到上一件奇怪的事。一个叫韦伯的人对他说,我想和你订个合同,我将在整整一个月中每天给你10万元,而你第一天只需给我1分钱,以后你每天给我的钱是前一天的两倍。杰米说,真的?!你说话算数? 合同开始生效了,杰米欣喜若狂。第一天杰米支出1分钱,收入10万元。第二天,杰米支出2分钱,收入10万元。到了第10天,杰米共得100万元,而总共才付出5元1角2分。到了第20天,杰米共得200万元,而韦伯才得5千元多。杰米想:要是合同订、三个月该多好!结果杰米却破产了。孩子们,原因是什么?我期待着你们能帮帮我。 汉诺塔问题在数学界有很高的研究价值,而且至今还在被一些数学家们所研究,它可以帮助开发智力,激发我们的思维。让小学生接触这款益智游戏,利用一次次不断的探索和尝试,可以激发他们的兴趣,积极应对困难,获得成功体验,锻炼他们的思维,同时,培养主动探索,不服输的精神。数学磨砺孩子的思维品质。数学,是思维的体操;数学课堂应是师生思维活动的场所。数学学习的主要任务,其实就是发展学生的思维,要让学生学会思维的方式,形成良好的思维品质。课堂里知识的学习是有形的,思维的发展是无形的。如何让无形的思维发展转化为外在的有形体现,这就要求学生在掌握知识的过程中,理解掌握知识之间的内在联系,联系就是思维,联系就是方法,联系就是能力,我们要在数学学习过程中让孩子寻找到知识与知识之间的联系,知识与生活之间的联系等。只有建立联系学生才会触类旁通,一通百通。然而,学生的思维单靠老师是教不会的。靠的是学生自己在经验中的摸索、体悟和积累,依靠学生自主地将这种摸索和体悟所得进行内化,逐渐学会如何思维,这个过程只有孩子自己才能实现。 在活动过程中,教师应更善于引导学生积极动脑自己去找到游戏策略,让学生更多参与,更多发现,培养学生独立思考的良好学习习惯,同时,这样也有利于学生建立学习信心。第四篇:C语言 程序代码编写规范
第五篇:汉诺塔教学反思