C语言入门第十四篇,函数

在一开始我们介绍C语言的时候我们介绍了程序是由一个主函数和若干子函数组成(见第一篇初识C语言)。函数英文是function,有方式、方法的意思。那么我们在程序设计的时候就可以把程序写成很多个程序块(函数),每块程序块实现不同的功能。
我们来看看例子。

#include<stdio.h>

void print_helloworld()
{
    printf("hello world!\n");
}

int main()
{
    print_helloworld();
    return 0;
}

上面的代码是一个简单的函数,实现的功能是输出hello world。函数名字叫print_helloworld,下面是具体的语法。
类型 函数名(形式参数)
{
代码块
}
上面的代码没有参数,所以形式参数(简称:形参)那里是空着的。函数名类似变量的名字,是由自己决定,前面说了函数除了void类型以外其他的都必须有返回值,所以一定要确定好你函数的返回值的类型。

函数声明

函数其实和前面的变量差不多都是需要先声明才能使用的,我们说一个具体的例子来讲函数的声明,假设我要声明一个比较两个数大小的函数,首先我要传入这两个数a,b,也就说我要声明两个形式参数,接着我返回一个最大值来表明这两个数中较大的(函数只能返回一个值),函数如果不是void(空)的类型的话,是必须要有返回值的。返回值的类型就是你定义函数的类型,用return来返回值。如下:

int compare(int a,int b)

函数的声明可以放在主函数的前面和后面。上面的程序是放在前面的,下面我们来看看放在后面的。

#include<stdio.h>

void print_helloworld(); 

int main()
{
    print_helloworld();
    return 0;
}

void print_helloworld()
{
    printf("hello world!\n");
}

这里我们对函数先进行了声明,最后才来实现了这个函数的功能。当然void print_helloworld(); 这个也可以放在main函数的里面,在调用这个函数之前就好。

int main()
{
    void print_helloworld();
    print_helloworld();
    return 0;
}

这里涉及到作用域的问题,后面会说。这里只要记住函数要被使用就必须先有声明(当然函数在调用之前声明实现的话只需要把完整的函数写出来就好了,例如我们这篇文章的第一个程序)。这里不要忘了函数如果先声明但是没实现的话,后面要加分号。

函数参数
上面我们简单的讲函数声明所以没有加函数的参数,我们来看看下面这个程序。

#include<stdio.h>

int compare(int a,int b)
{
    if(a<b)
    return b;
    else
    return a;
}

int main()
{
    int m,n,c;
    scanf("%d%d",&m,&n);
    c=compare(m,n);
    printf("最大值为:%d\n",c);
    return 0;
}

这个程序很简单,输入两个数的,然后调用函数判断较大的那个数是多少,并输出最大值。

函数的参数,我们传入什么参数类型就必须声明什么类型的形式参数,不然编译器会报错。

C语言采用的是传值调用,意味着他所有传入的参数在函数里面都是原来参数的复制(ps:记住这点很重要),我们在后面指针与函数中更加深刻的去讨论这个问题。

返回值
返回值意味着函数的结束,函数一旦执行到return语句就会跳出函数块。返回值要和函数声明的类型一样,否则可能会出错。返回值可以由变量接收,或者直接输出。上面的例子是由变量接收的。也可以直接输出的。

int main()
{
    int m,n,c;
    scanf("%d%d",&m,&n);
    printf("最大值为:%d\n",compare(m,n));
    return 0;
}

上面例子就是直接输出返回值。

递归函数

递归函数就是函数自己调用自己,初学者都很不太喜欢递归,因为他没有循环那么直观。但是你会渐渐的发现,递归可以大大减少代码量,并且将复杂问题简单化,符合人类的逻辑思维。递归的思想在编程中非常重要。
我们印象中最熟悉的就是斐波那契数(不了解的可以去看一下百度百科 斐波那契数
F1=0
F2=1
Fn=Fn-1+Fn-2
这是典型的数学里面的递推式子。下面来看一下实现的代码:

int Fib(int n)
{
    if(n==0)
    return 0;
    if(n==1)
    return 1;
    return Fib(n-1)+Fib(n-2);
}

这段程序的实现功能很简单,函数接受一个输入参数n,求出第n个斐波那契数。逻辑思路是函数不断的调用自己,直到n==0和n==1时,返回0和1,然后一层一层的返回值。最后得到你的n的值。递归函数就是数据结构堆栈实现的,递归就是不断压栈,达到出栈条件的时候,进行出栈操作。如下图:
出栈入栈

如图所示,我们先将Fn放入下面接着放Fn-1一直这样放下去,当n=0的时候开始出栈,F0和F1已知,就可以得到F2,递推下去就会得到Fn。当然这个出栈和入栈的操作是编译器进行的。如果你对堆栈这些都不太理解,就当是了解一下这些内容就好,后面会专门讲递归函数。

总结
函数的大部分内容都简单的介绍了一下,但是对于一些其他的问题还是需要再下一篇进行更深层次的讨论。这篇希望大家熟悉函数的基本语法和应用。

练习
1.输入一个n,求出前n项斐波那契数的和。
2.编写一个求最大公约数和一个最小公倍数的函数。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章