第十二课 函数

函数

定义

c 语言函数设计:早前模块化设计理念的具体应用;

将一个复杂问题解决程序的代码,根据功能不同我们给它划分成若干多个简单模块,然后对每个模块进行程序设计;实现对复杂问题解决;

模块在每个语言上称呼:在 c program 叫做 函数;有的语言叫做过程,在面向对象的语言中:方法();

格式:

1
2
3
4
5
6
函数类型 函数名(参数系列)        // 函数的数据类型和函数返回处理结果的数据类型一致的;
{
    sentence;
    ...
    return 函数处理的结果;
}

如果函数没有 return 语句,那么函数类型就是 void 类型;

函数名:调用的依据;函数名的命名和普通变量的规则相同;

参数系列:参数提供给函数加工处理的数据;系列是可以提供多个参数

int x,y 如果作为参数变量,需要分开表达:int x, int y;

在函数中,一旦执行 return,语句所有执行都全部停止;

Q1 定义一个函数,求三个数的最大值;

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
int FindMax(int x,int y,int z){            // 函数的默认类型是 int
    int max;
    max = x<y?y:x;
    max = max<z?z:max;
    return max;
}

main(){
    int x;
    x = fun(12,36,4);
    printf("%d",x);
}

调用就是通过一个函数调用另一个函数,在考试范围内,都是通过 main() 函数调用;

Q2 定义一个函数,求阶乘;

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
int fun(int n){
    int s = 1;
    for(int i=1; i<=n; i++)
        s = s*i;
    return s;
}
main()
{
    int m,n,s;
    printf("input m,n:");
    scanf("%d,%d",&m,&n);
    s = fum(m) / (fun(n) * fun(m-n));
    printf("%d",s);
}

将指针作为函数参数

指针参数传递的只能是地址

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
void fun(int pa, int pb){
    int t;
    t = pa; pa = pb; pb = t;   // 函数内是局部变量,即改变后的值不会传输给main函数;
}

main(){
    int a,b,c;
    a = 3, b= 1;
    c = fun(a,b);                // 传值进入函数,对原来的函数没有任何影响
    printf("%d\n",c);
}
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
void fun(int *pa, int *pb){
    int t;
    t = *pa; *pa = *pb; *pb = t;    
}

main(){
    int a,b,c;
    a = 3, b= 1;
    fun(&a,&b);                      // 传地址,即直接修改该变量
    printf("%d\n",c);
}

Q3 指针作为参数,定义函数求两个数的最小公倍数

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
int fun(int *pa, int *pb){
    int t,r;
    t = *p1 * (*p2);
    // 求最大公约
    while(*pa%*pb!=0){
        t = *pa % *pb;
        *pa = *pb;
        *pb = t;  
    }
    // 求最小公倍数    return t/(*p2);
}

main(){
    int m,n;
    printf("input m,n:");
    scanf("%d %d",&a,&b);
    printf("%d\n",fun(&a,&b));
}

以数组名作为参数

1
2
3
4
int fun(int a[],int n);        // a是数组名,n是元素个数
int fun(int *p, int n);        // 与前者等同,p是指向数组的首地址,n为元素个数

// 无论如何,参数为数组的传递的实参,肯定是地址;通常传递的是数组的首地址;

Q4 定义一个数组,求数组元素的次最大值;

解题思路:次最大值,它是由最大值反应出来的,在求解过程中,要求出最大值,比自己值大,且比最大值小肯定就是次最大值;如果有比最大值大的,此时最大值就是次最大值;

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
int fun(int a[],int n){
    int i,j,max,xmax;
    if(a[0]>a[1]){
        max1 = a[0];
        max2 = a[1];
    }
    else{max1 = a[1];
     max}
    for(i=0; i<n; i++){
        if(xmax<a[i]){
            max = xmax;
            xmax = a[i];
        }
        else if(max<a[i])
            max = a[i];
    }
    return max;       
    // 只能返回一个 对象,只能执行一个 return;
    // 若要返回多个数,必须返回数组,问:数组是地址,修改过后还需要返回吗?
    //答:没有必要,除非该数组是在函数内定义的局部变量,返回后空间释放,数组丢失……
}

main(){
    int a[] = {12,98,6,35,78,21};
    int n = 6;
    int i;
    for(i=0; i<10; i++){
        scanf("%d",&a[i]);
    }
    k = fun(a,n);
    printf("%d",k);
}

**Q5 设计一个函数,删除非前导的 ***

字符串作为函数的参数

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
void fun(char st[]){                // 字符串有 \0 作为结束,故此无须传入元素个数
    int i=0,j;
    while(st[i]=='*') i++;
    while(st[i]!='\0')
    {
        if('*' == st[i])
            for(j=i+1; j<strlen(st); j++)
                st[j-1] = st[j];
    
        if(st[i] != '*') i++;
    }
}

int main(){
    char st[] = "****sa**def***zffd";
    fun(st);
    printf("%s\n",st);
    return 0;
}

Q6 以指针作为函数子串的参数;设计函数,将一句话的每个单词前面第一个字母变成大写;

how are you -> How Are You

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
void fun(char *p);
{
    int i,j;
    *p -= 32;
    for(i=1; *(p+i) != '\0'; i++){
        while(*(st+i) == ' ') i++;
        if(*(st+i-1) == ' '){
            *(st+i) -= 32;
        }
    }    
}

main(){
    char st[] = "how are you";
    fun(st);
    printf("%s\n",st);
}

补充:

  1. 当函数非空型,必须有return返回值,函数没有return 语句时,默认函数类型为 void
  2. 若是没有定义函数的类型,默认为int整型
  3. 形参与实参占据不同的单元
Licensed under CC BY-NC-SA 4.0
本文阅读量 次, 总访问量 ,总访客数
Built with Hugo .   Theme Stack designed by Jimmy