目录
设计函数
1.函数命名法要采用传统命名方法
2.能拆成函数的尽量拆成函数
3.函数设计时,尽可能考虑健壮性和扩展性
函数调用关系: 调用者和被调用者
int main()
{
printf("%d",getMonthDays());
}
getMonthDays----在此处是被调用者
main函数至整个程序的入口,只能是调用者
注:
函数不支持在函数内部再定义,但支持函数嵌套调用。
函数名 ----函数入口地址
pc //program couter ---程序计数器
栈
// 先入后出FILO (First In Last Out)
数据结构 -----(表示数组组织形式)
函数调用的本质
实际是利用栈的结构 ---先进后出,保证了函数可以层层嵌套调用。
C语言角度的栈:
1.本质是一块内存空间。
2.只是按照 栈 这种数据结构 来处理数据。
C语言程序: //把区域划分成5个区域
栈 默认8M可以修改
堆
字符串常量区
静态区(全局区)
代码区
递归
递归思路:
要求问题n---依赖于问题n-1的解决
汉诺塔
过程分析:首先创建hanoi函数,返回值是打印具体变换过程,则返回无(void),打印部分的交给内部引用的move函数,move(int pole1,int pole2)函数指从pole1 移动到pole2,同样它也是一个起点一个目标点,这才是本身参数的意义,是指一个起点移到一个目标点,hanoi(int n,int A,int B,int C),分成n-1和n两部分,n-1可以分成n-2和1,直到n=1;这个过程就体现了递归思想,注意 hanoi(n个盘子,起始柱,辅助柱,目标柱)传参的abc的意义,而不是abc数字本身。
include <stdio.h>
2
3 void move(int pole1,int pole2)
4 {
5 printf("%c --> %c \n",pole1,pole2);
6 }
7
8 //起始 辅助 目标
9 void hanoi(int n,int A,int B,int C)
10 {
11 if (n == 1)
12 {
13 move(A,C);
14 }else
15 {
16 hanoi(n-1,A,C,B);
17 move(A,C);
18 hanoi(n-1,B,A,C);
19 }
20
21 }
22
23
24 int main(void)
25 {
26 int n;
27 scanf("%d",&n);
28
29 hanoi(n,'A','B','C');
30 return 0;
31 }
~
结果:打印变换过程
数组作为函数参数
传变量int a[ ] 但编译器最终理解的是int *a,所以实际上最正确的写法应该是 在函数传参部分写 int *a: -------int FindMax(int *a,int len){}
应用如下:
1 #include <stdio.h>
2 #include <string.h>
3
4 int FindMax(int a[],int len)//还没学到指针,才写的int a[]
5 {
6 int i = 0;
7 int max = a[0];
8 for(i=1;i<len;i++)
9 {
10 max = max>a[i]?max:a[i];
11 }
12
13 return max;
14 }
15
16 int main()
17 {
18 int a[] = {1,2,3,4,5,6,7,8,9};
19 int ret ;
20
21 ret = Findmax(a,9);
22
23 printf("the max num is %d\n",ret);
24 return 0;
25 }
~
函数练习
练习:实现数组的逆序(用函数)
1 #include <stdio.h>
2 #include <string.h>
3
4 void arrayRes(int a[],int len)
5 {
6 int i,temp;
7
8 for(i=0;i<len/2;i++) //注意这里不要写成i<len 这样还是回到原来的样子,换两遍又换回来了
9 {
10 temp = a[i];
11 a[i] = a[len-1-i];
12 a[len-1-i] = temp;
13 }
14
15 for(i=0;i<len;i++)
16 {
17 printf("a[%d] = %d\n",i,a[i]);
18 }
19 }
20
21 int main()
22 {
23 int a[] = {1,2,3,4,5,6,7,8,9};
24 int len = sizeof(a)/sizeof(a[0]);
25
26 arrayRes(a,len);
27
28 return 0;
29 }
~
~
练习:插入排序(用函数)
1 #include <stdio.h>
2 #include <string.h>
3
4 void arrayRank(int a[],int len)
5 {
6 int j,i,temp;
7
8 for(i=1;i<len;i++)
9 {
10 temp = a[i];
11 j = i;
12 while(j>0&&temp<a[j-1])
13 {
14 a[j] = a[j-1];
15 j--;
16 }
17 a[j] = temp;
18 }
19 return;
20 }
21
22
23 int main()
24 {
25 int a[] = {9,8,7,6,5,4,3,2,1};
26 int len = sizeof(a)/sizeof(a[0]);
27 int i;
28 arrayRank(a,len);
29
30 for(i=0;i<len;i++)
31 {
32 printf("a[%d] = %d\n",i,a[i]);
33 }
34 return 0;
35 }
练习:完成查找函数
#include <stdio.h>
#include <string.h>
int arrayFind(int a[],int len,int n)
{
int begin = 0;
int end = len -1;
int mid;
while(begin<=end)
{
mid = (begin + end)/2;
if(a[mid]>n)
{
end = mid -1;
}else if(a[mid]<n)
{
begin = mid + 1;
}else
break;
}
if(begin<=end)
{
return mid;
}else
{
return -1;
}
}
int main()
{ int a[] = {1,2,3,4,5,6,7,8,9};
int len = sizeof(a)/sizeof(a[0]);
int ret,n;
printf("Input n:\n");
scanf("%d",&n);
ret = arrayFind(a,len,n);
if(ret==-1)
{
printf("not find\n");
}else
{
printf("the num is a[%d] = %d\n",ret,a[ret]);
}
return 0;
}