本人自学编程刚读完谭浩强的这版C语言程序设计,从什么都不懂的小白到现在仅有一些思维上的感想。
自己用十天认真读完了其实感觉受益还挺大,自己其实在读之前在MOOC上先看了一个《计算机导论》的视频教程,看完之后总结只有一个点 就是要有计算机的思维方式,因为计算机是01二进制的,所以要学会如何与计算机沟通,充分了解计算机及其结构,它只是做一个入门的思维了解,然后当我看这本书用以导入思维方式,是一种过渡!总之当看完这本书之后感觉以后要走的路还有很长(要看的书还很多),它并不能让你编出什么像样的程序,可能入门都不算,好了下面说下自己读的过程遇到的比较难的一些!
自己用的是Dev-C++而且可以练下敲代码的能力,VC++的化书上建议用的2010版,我下载的2019的个人免费版发现它不支持c语言的一些语法,毕竟c太基础!
总结其实指针那章只要仔细看问题并不大,链表那段要有指针前面的基础,只要认真看也没事! 自己在递归那小结卡了一整天,好在最后过了! 讲下遇到的问题:汉诺塔问题
代码如下:
1 int main()
2 {
3 void hanoi(int n,char one,char two,char three); //对hanoi函数声明
4 int m;
5 printf("input the number of diskes:");
6 scanf("%d",&m);
7 printf("the step to move %d diskes:n",m);
8 hanoi(m,'A','B','C');
9 return 0;
10 }
11 void hanoi(int n,char one,char two,char three) //定义hanoi函数
12 //将n个盘子从one借助two移动到three
13 {
14 void move(char x,char y);
15 if (n==1)
16 move(one,three);
17 else
18 {
19 hanoi(n-1,one,three,two);
20 move(one,three);
21 hanoi(n-1,two,one,three);
22 }
23 }
24 void move(char x,char y)
25 {
26 printf("%c-->%cn",x,y);
27 }
上面图片的解决思路与解决思想已经很清楚,我只是说下程序是怎么运行的:从第八行开始 输入一个整数型 m=3(假设)则第八行hanoi(m,'A','B','C')开始调用函数 把数据传给下面的11行 void hanoi(int n,char one,char two,char three) 显然 这时候 是这样的:
n=3 one=A two=B three=C
void hanoi函数再把 数据向下分配 执行void move函数 (char x,char y)
if(n==1) // 如果n=1则执行 move(one,three)// 显然这里是n=3(上面假设的传下的数据)
则执行 else { hanoi (n-1,one,three,two ; move(one,three) ;
hanoi(n-1,two,one,three) ;} 这里比较难思考:具体在下
【1】 n=3 则19行 函数hanoi(n-1,one,three,two);调用11行函数void hanoi(int n,char one,char two,char three) 本身, 一直把这个函数执行结束 因为19行函数后面是分号。
循环@1 【先放下函数执行,思考这时的函数们的每一个的数据】
14 void move(char x,char y); 15 if (n==1) 16 move(one,three); 17else
19 hanoi(n-1,one,three,two);20 move(one,three);21 hanoi(n-1,two,one,three);
第一 16 行的接收数据是 one=A three=C 19 行接收数据是 (“n=3”n-1=2,one=A,three=C,two=B)20 行 (one=A,three=c)21行(“n=3”n-1=2,two=B,one=A,three=C)数据介绍完 继续下面的程序执行:
【1】 则19行 函数hanoi(n-1,one,three,two);调用11行函数void hanoi(int n,char one,char two,char three) 本身 上面说了19行接收到的数据是(2,one=A,three=C,two=B)因为是调用它本身void hanoi(int n,char one,char two,char three) 则它的本身接 收到 数据就是19行的数据 是这个样子 void hanoi(2,one=A, two=C, three=B) 那么这个数据再向下传就又是一个循环体和以下传输的数据
@循环1.1 14 void move(char x,char y); 15 if (n==1) 16 move(one=A,three=B); 17else
19 hanoi(1,one=A,three=B,two=C);20 move(one=A,three=B);21 hanoi(1,two=C,one=A,three=B);
【1.1】继续执行程序函数hanoi(n-1,one=A,three=B,two=C) 又一次调用函数本身此时传给
函数的数据void hanoi(int n=1, one=A,two=B, three=C) 继续执行函数体 14 void move(char x,char y); 15 if (n==1) 16 move(one,three); 17else
19 hanoi(n-1,one,three,two);20 move(one,three);21 hanoi(n-1,two,one,three);
则此时因为n=1 则执行move(one=A,three=C) < 输出A--C 第一个> 那么程序返回上一循环@循环1.1 14 void move(char x,char y); 15 if (n==1) 16 move(one=A,three=B); 17else
19 hanoi(1,one=A,three=B,two=C);20 move(one=A,three=B);21 hanoi(1,two=C,one=A,three=B);
执行 20 move(one=A,three=B); <输出A--B 第二个> 接下来再执行21 hanoi(1,two=C,one=A,three=B); 函数hanoi(1,two=C,one=A,three=B);调用自己本身函数的数据void hanoi(int n=1, one=C,two=A, three=B)函数再向下传数据 继续执行程序 @ 循环1.1 14 void move(char x,char y); 15 if (n==1) 16 move(one=C,three=B); 17else
19 hanoi(n-1,one,three,two);20 move(one,three);21 hanoi(n-1,two,one,three); 此时n=1 则执行move(one=C,three=B) <输出C--B第三个>
注意 调用函数void hanoi(int 2, one=A,two=C, three=B) 循环体
《@循环1.1 14 void move(char x,char y); 15 if (n==1) 16 move(one=A,three=B); 17else
19 hanoi(1,one=A,three=B,two=C);20 move(one=A,three=B);21 hanoi(1,two=C,one=A,three=B); 》
执行完了 注意这一步,再返回 上一循环体
循环@1
14 void move(char x,char y); 15 if (n==1) 16 move(one=A,three=C); 17else
19 hanoi(3-1,one=A,three=C,two=B);20 move(one=A,three=C);21 hanoi(3-1,two=B,one=A,three=C);
显然 19行 hanoi(3-1,one=A,three=C,two=B);全部执行完了,接下来执行20 move(one=A,three=C);(有点烧脑我也从新有看一遍)
则输出<输出A--C第四个>
在执行21 hanoi(3-1,two=B,one=A,three=C);再调用函数得到数据void hanoi(int 2,char one=B,char two=A,char three=C) 主函数 向下传输数据 @2
void move(char x,char y); 15 if (n==1)
16 move(one=B,three=C);
17 else
18 {
19 hanoi(n-1,one=B,three=C,two=A);
20 move(one=B,three=C);
21 hanoi(n-1,two=A,one=B,three=C);
此时n=2 则执行 19 hanoi(2-1,one=B,three=C,two=A);那么调用主函数void hanoi(int 1,char one=B,char two=C,char three=A) 向下传数据 则void move(char x,char y); 15 if (n==1)
16 move(one=B,three=A); <输出B--A> 再返回 @2 执行20 move(one=B,three=C); <输出B--C> 再返回21 hanoi(n-1,two=A,one=B,three=C);调用函数并得到数据 主函数void hanoi(int 1,char one=A,char two=B,char three=C) 向下传输数据 void move(char x,char y);
15 if (n==1)
16 move(one=A,three=C); 则输出数据<输出A--C>
程序转向输出程序!
感觉好难这只是开始,接下来自己搞一下 高数 与 数据结构 总之这些都是基础吧!方向是Java s/b !加油!