今天主要学习了如何设计函数对以前的问题求解,C语言程序内存区域,函数的递归调用
一,设计函数对以前问题求解
1.闰年每个月有几天问题:
被调函数1:求闰年有哪些
被调函数2:打印出从开始到结束所有的闰年
被调函数3:打印输入的年月的每一天的数字
改进后
assert函数:如果输入值不在这个范围内,那么直接中止函数运行并且输出时报告
输入月份为18后报错
主调函数:
2.素数的查找
被调函数1:素数有哪些
如果找到了一个数能被整除,证明他不是素数。回复return 0
如果没有找到证明他是素数,回复return 1。程序继续执行
被调函数2:打印出从开始到结束所有的素数
素数要大于2,如果开始值小于2,则return一个负数
主函数
将被调函数2的值赋值给参数ret,如果ret的值 < 0,则证明被调函数2开始值 < 2了,输出error。
反之输出正确的值。
2.双胞胎素数:被调函数2 改为
3.回文数查找
被调函数1:找出回文数
被调函数2:打印出从开始到结束所有的回文数
原理同素数被调函数2一样 小于1输出负值给主函数
主函数
直接输出即可
二,递归调用
在调用一个函数的过程中又出现直接或间接的调用该函数本身,称为函数的递归调用。
1.累乘法
如图,在此函数中被调函数是他自己本省身
主函数直接输出
2.斐波那契数列求第n项
同上,fib函数中还有个fib函数
主函数直接输出
2.斐波那契数列前n项求和
加一个被调函数即可
3.汉诺塔解法
注意;递归调用函数及其占用栈区,在嵌入式中一般不使用。
三,C语言程序内存区域
1.栈区(保护现场)
遵循FILO,即先进后出原则
栈区:栈区是用来存放局部变量的,比如函数内部定义的int a,int b,const int a,char p,char arr[ ],还有函数的形参等等都是存放在栈区。栈区的数据由编译器管理,调用完之后就自动释放,压栈,出栈。先进后出的原则,比如当你执行到函数调用的时候,编译器会先把下一条代码的地址压入栈中,再把你调用的那个函数里的一些局部变量,形参啊等等压入栈中,等你函数调用执行完毕。栈就会把你调用的这个函数之前压入栈的变量和形参全部清除出栈,之后根据下一条代码的地址,接着执行程序,以后的程序也都是这么执行。栈区是有大小的,一般是1M左右,所以别定义太大的数组。
c语言程序只做值传递,传参自右向左
...........................................................................................................................................................今天的学习到此结束,明天见。