本文进一步介绍C语言函数,函数的优点:

1. 函数有助于将一个程序模块化。函数本质上是一个自带声明和语句的小程序。可以利用函数把程序划分成小块,便于人们理解和修改程序。

2. 使程序变得更简洁清晰 

3. 有利于程序维护

4. 可以提高程序开发的效率 

5. 提高了代码的重用性

因此,C语言是函数的语言--小函数大程序。不会用函数进行构思和模块划分,不能算会C语言编程。下面我们以三个实例来一起学习下,如何使用函数来编程?

一、素数表

问题:输出100以内的全部素数,每个素数占6列。

思路分析:对2~100之间的每个数进行判断,若是素数,则输出该数。

for(m = 2; m <= 100; m++) 

    if (m是素数) 

        printf("%6d", m);       

定义函数IsPrime()来判断素数,函数原型如下:



int IsPrime (int m) ; //若m是素数返回1,否则返回0

main()函数和IsPrime()分别实现如下:



int main(void)
{ int m;
for(m = 2; m <= 100; m++)
{ if (IsPrime(m) != 0 )
              printf("%6d", m );  
        }    
        printf ("\n");    
        return 0;   
 }




int IsPrime (int m)
{ int i, k;
if ( m == 1 ) return 0;
k = (int)sqrt (m);
for( i = 2; i <= k; i++)
       {    if (m % i == 0)  return 0;   }    
       return 1; 
 }


完整代码及输出结果如下图所示:

C语言基础12:函数进阶编程_哥德巴赫猜想

二、哥德巴赫猜想

问题:验证哥德巴赫猜想,任意输入一个不小于6的偶数,将其表示成两个素数的和,如:

6=3+3;8=3+5;18=7+13

解题思路: 

枚举加数i:for(i=3; i<=n/2; i+=2)

 {

    if( i和n-i都是素数)

        输出素数对i和n-i;

 }

该问题可以通过调用第一例中的IsPrime()函数来实现!从而实现了代码复用、函数复用,并且这样结构清晰,代码优美!





int main(void) 
{     int n, i;     
scanf("%d", &n);      
for(i = 3;i <= n/2;i = i+2)   
{      if(IsPrime(i) && IsPrime(n-i))          
printf("%d %d\n", i, n-i);    
       }     
       return 0;
 } 


由上面代码可见,复用了之前的IsPrime()函数;更易于实现;程序可读性更好;更易于程序的排错、调试。

完整代码及输出结果如下图所示:

 C语言基础12:函数进阶编程_组合数_02

三、组合数

排列组合与概率论关系密切。组合数:从m个不同元素中取出k(k≤m)个元素的所有组合的个数,计算公式如下:

C语言基础12:函数进阶编程_复用_03

由上面公式可见,组合数的计算,主要通过反复计算阶乘实现,因此,可以编写一个计算阶乘的fact()函数,代码如下:



/* 定义阶乘函数fact */
int fact( int n)
{ int i;
int result = 1;
for(i = 2; i <= n; i++)
result *= i;
     return result;
 }


根据计算公式中的计算方法,main函数代码如下:




#include <stdio.h>
int main(void)
{ int m, k, p;
scanf("%d%d", &m, &k);
p = fact(m) / (fact(k) * fact(m - k));
printf("p=%d\n", p);
return 0;
}


完整代码及输出结果如下图所示:

 C语言基础12:函数进阶编程_哥德巴赫猜想_04

 然后公众号回复"C教程"获取全部完整资源~