第三周学习内容

转载请注明出处:http://www.cnblogs.com/Christen/p/6035441.html

L3 函数

1. 什么是函数

之前我们写的程序只有一个main函数,里面是程序的内容。对的,main就是一个函数,我们称为主函数。运行一个.c文件,第一步就是找到main函数,然后顺序执行。

在main函数中,我们可以调用其他函数。例如,求绝对值函数abs(),fabs();三角函数sin(),cos();对数函数log()等等(自己上网搜具体用法)使用是需要添加它们对应的头文件。

除了这些标准函数之外,我们还可以自定义函数。以下是函数定义的一般形式:

返回值类型 函数名(类型1 形参1, 类型2 形参2,...) {
	函数体内容
}

举一个栗子:

int max(int x,int y)
{
	if (x > y) return x;
	return y;
}

int main() {
	int a, b;
	scanf("%d %d", &a, &b);
	printf("%d\n", max(a, b));
	return 0;
}

这是一个求最大值的程序。分为两个部分。
上面的max函数,这是我们写的一个自定义函数。这个max函数定义可以结合上面的格式来看。
程序从main函数开始,在max(a,b)这一步,我们调用了max函数,并将a和b的数值传入。这两个值,分别对应到max函数中的x和y。在max函数中,对传入的两个数进行大小比较,并返回较大的那个数。return语句是返回结果值,一旦执行到return语句,函数就结束了,不论后面还有什么语句,它直接结束(当然,是带着它的返回值结束的)。这就是为什么在max函数里面,return x之后我们不用再写else语句,就可以直接return y。带着这个返回值,回到调用该函数的地方。自然地,我们就能输出两个数中的较大值了。

形象化地理解,一个函数就是一个盒子。这个盒子有一个入口和一个出口。入口是括号中的那些参数,可以是一个、多个、甚至没有,具体根据程序的功能来定。通过入口,函数内部会进行一系列的操作,这就是大括号中的内容。最后这个盒子会有一个出口,通过return语句来实现,也就是这个函数最后的结果。

2. 为什么要定义函数

  • 一个程序通常会有好多功能。我们把每一项功能单独写成一个函数,可以使代码结构更加清晰。

  • 比如说你要多次使用一段同样的代码,将其放到一个函数里面,每当需要用到的时候直接调用这个函数就可以了。

程序设计原则

  • 模块分解
    • 高聚合,低耦合(模块功能独立单一,模块之间联系松散)
  • 自顶向下、逐步求精
    • 对问题全局分析
    • 将整个问题分解成若干相对独立的子问题
    • 确定子问题的具体功能及其相互关系
    • 将子问题逐一精细化

3. 栗子

下面这个例子是求一个组合数c的问题。

其中求阶乘的函数给出了两种写法。我们课上讲的是第一种fact的写法,即直接一个循环语句。第二个factorial函数也可以求阶乘,这是递归调用的思路,感兴趣的可以自己钻研一下。

int fact(int x)
{
	int i,num = 1;
	for (i = 2;i <= x;i++)
	 num = num * i;
	return num; 
}

int factorial(int x)
{
	if (x == 1 ||x ==0) return 1;
	               else return x * factorial(x -1); 
}
int c(int n,int m)
{
//	return fact(n)/fact(m)/fact(n-m);
    return factorial(n)/factorial(m)/factorial(n-m);
}

int main()
{
	int n,m;
	scanf("%d%d",&n,&m);
	printf("%d",c(n,m));
	return 0;
}

4. 作业

  1. 随机生成一个数字n(1~100),用户输入猜测的数字,程序给出反馈(过大、正确、过小),直至猜测正确。
  2. 判断素数:对每一个输入的数字进行判断,直至输入-1结束程序。
  3. *汉诺塔 :题目背景百度,要求输入盘子个数n,输出移动的步骤。
posted @ 2016-11-06 15:30  Christen  阅读(238)  评论(0编辑  收藏  举报