一.程序如何实现模块化
在程序设计过程中大多数程序要比我们之前设计的程序复杂的多,传统的设计方法是“自定向下,逐步求精”的过程。该过程就是将一个大的问题按照层次分解成多个方便解决的小问题,直至各个功能模块,每个单独的功能模块可以单独设计,最后将所有的功能模块有机的结合成完整的程序。
二.函数如何进行定义
1函数简介:函数是C语言程序的基本模块,函数一般可以从3中角度进行分类:
从函数定义角度:
1)库函数:库函数由C系统提供,用户无需定义,可以直接调用。
2)用户自定义函数:用户自己编写的函数,在调用的函数中还必须对被调用函数进行类型说明才能使用。
从返回值角度看:
1)有返回值的函数:有返回值的函数在被调用后将向调用者返回一个执行结果,这个结果就是返回值,用户在定义这种函数时应该说明返回值类型。
2)无返回值函数:无返回值函数用于完成某项特定的功能,执行完成后不用返回函数值,用户定义时声明这种函数的返回值为空类型,即void。
从数据传输来看:
1)无参函数:无参函数是指函数在定义和调用中均不带参数,调用和被调用函数之间不进行参数传递。
2)有参函数:参数包括形式参数和实际参数,在函数定义和说明时的参数称之为形参,调用时给出的函数称之为实参。
2函数的定义
定义的一般形式:
类型说明符函数名(类型名 形式参数1,类型名 形式参数2,.....)
{
函数体
}
函数名:是一个标示符,取名要求有意义、简短,同一源程序文件中不能重名。
类型说明符:值函数的返回值类型,使用void来指定函数无返回值,返回值类型可以是基本类型也可以是指针、结构体和用户自定义类型。
形式参数:定义函数时的参数称之为形式参数,参数列表说明了参数的类型和个数,一下两种方式都是正确的:
intmax(int a,intb){
Return0;
}
intmax(a,b)
inta,b;{
Return0;
}
函数体:即函数具体功能的实现。
三.函数如何实现调用
1函数调用的一般形式:
函数名(参数列表);
1)有返回值的函数调用:
int max(int x,int y){
returnx>y?x:y;
}
调用该函数:
a=max(a,b);
2)无返回值的调用
voidprintstart(int n){//输出n个星号
inti;
for(i=1;i<n;i++){
printf("*");
}
}
调用该函数:
pirntstart(5);//输出5个星号
2被调用函数的声明和函数原型
除去scanf和printf两个函数外,任何系统标准函数的调用都必须在本文件的开头用编译预处理命令#include将函数所在的头文件信息包含到本文件中。例如:#include"stdio.h"
如果被调用的函数是用户自己定义的函数,除了对函数功能的定义以外,通常还应在主调用函数或主调函数所在的源文件中对被调用函数进行声明,其目的是指出被调用函数的返回值类型和参数的个数和类型,以便在调用该函数时系统按此进行检查。
声明函数的一般格式是:
类型标示符函数名(参数类型1,参数类型2,...);
调用函数和主调用函数的位置关系主要分为三种情况:
1)调用函数和主调用函数在同一文件中,且主调函数在调用函数的前面。
2)调用函数和主调用函数在同一文件中,且主调函数在调用函数的后面。
3)调用函数和主调用函数不在同一文件中。
四.参数传递
1形式参数和实际参数
参数传递中的数据变化:
#include "stdio.h"
void fun(int num) {
num=20;
printf("%d\n",num);
}
main(){
int x;
x=10;
fun(x); /(调用函数无返回值的函数fun*/
printf("%d\n",x);
}
运行结果:
20
10
函数fun有一个形参变量num,当main函数调用时,实参x的值传送到num,在fun函数中虽然num被修改为20,但是并不影响x的值。
程序从main开始运行,这是x拥有储存空间,初值为10,当fun函数被调用时,为形参分配空间,接受实参的值,流程转到调用函数fun中执行,为变量num重新赋值为20,次数赋值对实参没有影响,同时实参在fun函数中也不可用,函数调用结束后,形参空间撤销,流程返回。这就是值传递。
五.数组作为函数的参数
当数组作为参数传递时,系统就会将作为实参的数组元素首地址传递给形参所表示的数组名,即参数传递时地址传递。
1一维数组作为参数:一维数组名表示数组中下标为0的元素在内存中的起始地址。假设数组a在内存中从2000地址开始存放,则a的值为2000。2000是地址值,是指针型数据。
数组作为参数传递的例子代码:
#include "stdio.h"
void input(int a[10],int n) { /*输入函数*/
int i;
for(i=0;i<n;i++)
scanf("%d",&a[i]);
printf("\n");
}
int maxa(int a[10],int n) { /*求最大值函数*/
int i;
int m;
m=a[0];
a[1]=100;
for(i=1;i<n;i++)
if (m<a[i]) m=a[i];
return m;
}
void print(int a[10],int n) { /*输出函数*/
int i;
for(i=0;i<n;i++)
printf("%4d",a[i]);
printf("\n");
}
void main() {
int b[10];
int max;
input(b,10);
max=maxa(b,10);
printf("array max is %d\n",max);
printf("the array is :\n");
print(b,10);
}
地址传递就是形参和实参同时指向同一个地址,修改在改存储单元上的数据。