知识要点:函数的作用域
视频:
目录
一、任务分析
二、必备知识与理论
三、任务实施
一、任务分析
本任务要求将 20 个学生成绩放到一个整型数组中,对这些数据进行从大到小排序, 现从键盘输入一个成绩,将这个成绩从数组中删除,用外部函数实现。
任务要求用外部函数来实现,也就是要实现多文件的程序。程序应包括输入函数、排序函数、删除函数、输出函数及主函数。将这些函数在一个文件里使用,就可以解决这个问题。但任务要求用外部函数,那么可以把函数放在其它文件里,即需要多个文件。
二、必备知识与理论
函数一旦被定义就可被其它函数调用,即函数本质上是全局的。但当一个源程序由多个源文件组成时,根据在一个源文件中定义的函数能否被其它源文件中的函数调用,C语言又把函数分为内部函数和外部函数。
1. 内部函数
如果在一个源文件中定义的函数只能被本文件中的函数调用,而不能被同一源程序其它文件中的函数调用,这种函数称为内部函数。定义内部函数的一般形式为:
static 类型标识符 函数名(形参表)
关键字“static”,译成中文就是“静态的”,所以内部函数又称为静态函数。但此处static的含义已不是指存储方式,而是指对函数的调用范围只局限于本文件。
2.外部函数
如果一个函数既可以被本文件中的函数调用,又允许被本程序其它文件中的函数调 用,则可将这样的函数称为外部函数。外部函数在整个源程序中都有效,定义外部函数的一般形式为:
extern 类型标识符 函数名(形参表)
(1)如果在函数定义中没有说明extern或static,则默认为extern。在前面例题中定义过的函数除了主函数以外都可以被其它函数所调用,都是外部函数。
(2)在需要调用此函数的文件中,用extern对函数进行声明,表示该函数是在其它文件中定义的外部函数。
对函数的声明类似于对外部变量的声明,可以放在函数内部,也可以放在函数外部。放在函数内是局部的,放在函数外则是全局的。
三、任务实施
本任务是将20个学生成绩放到一个整型数组中,对这些数据进行从大到小排序,现从键盘输入一个成绩,要求程序将这个成绩从数组中删除,请用外部函数实现。
(1)算法分析:这整个程序由4个文件组成。除了主函数所在的文件之外,每个文件包含一个函数。主函数是主控函数,除声明部分外,由6个函数调用语句组成。其中scanf和printf是库函数,另外4个是用户自己定义的函数。函数input和output是往数组中输入输出数据元素的,函数sort对数组中的元素排序,函数del在数组中删除和变量x相同的数据。程序中3个函数都定义为外部函数。在main函数中用extern声明在main函数中用到的sort、del、output是在其它文件中定义的外部函数。下面的代码完成了这个功能,里面共含有4个文件,分别为filea.c、fileb.c、filec.c、filed.c。
/* 以下代码存放于filea.c中 */#include <stdio.h>main() { /*声明在本函数中将要调用的在其它文件中定义的3个函数*/extern sort(int score[],int n);extern del(int score[],int n,int x);extern output(int score[],int n);/*声明要调用的内部函数*/void input(int score[],int n);int x,score[20];printf("input score to array.\n");input(score,20);printf("sorting the score.\n");sort(score,20); /*调用排序函数*/output(score,20);printf("delete score x.\n");scanf("%d",&x);del(score,20,x); /*调用函数del ,完成删除操作*/output(score,19);}/*定义内部函数*/static void input(int score[20],int n){int i;for(i=0;i<n;i++)scanf("%d",&score[i]);}/* 以下代码存放于fileb.c中 */extern void sort(int score[20],int n) /* 选择排序函数 */{ int i,j,k;int temp;for(i=0;i<n-1;i++){ k=i;for(j=i+1;j<n;j++)if(score[k]<score[j]) k=j;temp=score[i];score[i]=score[k];score[k]=temp;}}/* 以下代码存放于filec.c中 */extern void del(int score[],int n,int x) /*删除数组中元素为x的元素*/{ int i,j;for(i=0;i<n;i++){ if(score[i]==x) break; }if(i<n)for(j=i+1;j<n;j++)score[j-1]=score[j];}/* 以下代码存放于filed.c中 */extern void output(int score[20],int n){ int i;for(i=0;i<n;i++){ if(i%5==0) printf("\n");printf("%d ",score[i]);}}
(2)程序包含多个源程序文件的编译和连接:
对上述建立的4个文件,如何将它们编译在一起,形成一个最终的.exe文件而运行呢?对由多个源文件构成的程序,应当构建“项目”,所谓“项目”就是多个源文件的集合。按照下面的步骤可创建包含多文件的项目,最终对项目进行编译、连接,就能生成所需的exe文件: