10-C语言函数

目录:

一、函数

二、return与exit关键字

三、递归与递推

回到顶部

一、函数

1 函数由函数名、返回值、形参、函数体组成。

函数的使用分三个步骤:声明、定义、调用

2 语法格式:

返回值类型 函数名(参数){

      。。。函数体;

}

3 函数声明

正常来件,函数在使用前一定要声明,由编译器从上到下,所以下面的代码调用上面的函数,不需要声明,但上面的代码调用下面的函数,就必须声明。

函数的声明:去掉函数体部分,保留返回值类型 函数名(参数);

如果返回值类型不是int的话,都要使用函数声明。

函数声明,可以省略参数,省略参数代表可以接收任意参数,如果不需要参数,使用void关键字。

4 函数调用

在准备使用函数的时候,执行函数名(参数),就调用了函数体的语句。没有参数()也不能省略。

有参数的函数在定义时使用的参数叫形参,当调用此函数时传人的参数叫实参。

调用函数时,需要函数的执行结果,这时就需要返回值类型标识结果的类型,函数体内部需要使用return关键字,标识具体的函数结果(返回值)。

如果函数有返回值,当调用函数时,通常会使用变量接收返回值。

5 函数使用时注意的问题:

如果函数执行后,不需要结果,就定义函数的返回值类型void(空),也就不需要return关键字。

如果执行函数需要参照一些特定的条件,就可以使用参数,如果有多个参数,之间用逗号分隔符。

练习:

1)求两个数的和。(求和函数、有返回值、参数2)

2)求两个数的差、积、商。定义成函数。

3)输入五组数,求和差积商。

4)输入一个分数,输出相应的级别。

   输入一个级别,输出相应的分数。

   分别输入5个数,5个级别。

  1 #include <stdio.h>
  2 //声明函数
  3 //void空 没有返回值
  4 void sayHello();
  5 //定义函数
  6 void sayHello()
  7 {
  8     printf("hello world!
");
  9 }
 10 //声明
 11 void sayHello5();
 12 //int func();
 13 void sayHelloByCount(int count);//形参
 14 void sayHelloByCount(int count)
 15 {
 16     for (int i = 0; i < count; i++) {
 17         printf("hello world!
");
 18     }
 19 }
 20 int getNumber()
 21 {
 22     return 0;
 23 }
 24 //练习:求两个数的和
 25 int sum(int n1,int n2)
 26 {
 27     int sum2 = n1 + n2;
 28     return sum2;
 29 }
 30 //2)求两个数的差、积、商。定义成函数。
 31 int cha(int n1,int n2)
 32 {
 33     return n1 - n2;
 34 }
 35 int ji(int n1,int n2)
 36 {
 37     return n1 * n2;
 38 }
 39 int shang(int n1,int n2)
 40 {
 41     return n1 / n2;
 42 }
 43 //3)输入五组数,求和差积商。
 44 int intputNum()
 45 {
 46     int num;
 47     printf("输入一个数:");
 48     scanf("%d",&num);
 49     scanf("%*c");//清除缓存
 50     return num;
 51 }
 52 //输入一个分数,输出相应的级别。
 53 int inputNum2()
 54 {
 55     int num;
 56     printf("输入一个数:");
 57     scanf("%d",&num);
 58     return num;
 59 }
 60 void printFenshuByLevel(int i){
 61     if (i >= 90) {
 62         printf("a
");
 63     }else if(i >= 60){
 64         printf("b
");
 65     }else{
 66         printf("c
");
 67     }
 68 }
 69 //输入一个级别,输出相应的分数。
 70 char inputChar(){
 71     char ch;
 72     printf("输入一个字母:
");
 73     scanf("%c",&ch);
 74     scanf("%*c");//清除缓存
 75     return ch;
 76 }
 77 void printLevelByChar(char ch){
 78     switch (ch) {
 79         case 'a':
 80             printf("90~100
");
 81             break;
 82         case 'b':
 83             printf("60~90
");
 84             break;
 85         case 'c':
 86             printf("0~60
");
 87             break;
 88             
 89         default:
 90             break;
 91     }
 92 }
 93 int main(int argc, const char * argv[])
 94 {
 95     //调用函数
 96     //    sayHello();
 97     //    sayHello5();
 98     //    func();//int返回值可以不用声明
 99     //    sayHelloByCount(3);
100     //    int num = getNumber();
101     //    printf("num:%d
",num);
102     //    int i = 3;
103     //    int j = 5;
104     //    int s = sum(i,j);
105     //    printf("sum:%d
",s);
106     //    int i = intputNum();
107     //    int i2 = intputNum();
108     //    int j = intputNum();
109     //    int j2 = intputNum();
110     //    printf("res:%d
",cha(i, i2));
111     //    printf("res:%d
",ji(j, j2));
112 //    for (int i = 0; i < 3; i++) {
113 //        char c = inputChar();
114 //        printLevelByChar(c);
115 //    }
116     for (int i = 0; i < 3; i++) {
117         char i = inputNum2();
118         printFenshuByLevel(i);
119     }
120     //command +a 全选 ctrl + i 格式化
121     return 0;
122 }

 作业:使用函数重构昨天的作业。

使用参数的时候,相当于实参传递值给形参。

练习:有两个数i = 2,j = 3使用函数调换两个数的值,在调换函数中查看i和j的值,在main函数中查看调换后的值。

形参是数组时,采用两个参数,第一个参数是数组的长度,第二个参数是不指定数组长度的数组名。

练习:求一组数的和,最小值,最大值。

#include <stdio.h>
//有两个数i = 2,j = 3使用函数调换两个数的值,在调换函数中查看i和j的值,在main函数中查看调换后的值。
void swap(int m,int n){//实参传递给形参时是值传递
    int temp = 0;
    temp = m;
    m = n;
    n = temp;
    printf("swap函数中m:%d,n:%d
",m,n);
}
int main()
{
    int i = 2;
    int j = 3;
    printf("main调换之前i:%d,j:%d
",i,j);
    swap(i,j);
    printf("main调换之后i:%d,j:%d
",i,j);
    return 0;
}

回到顶部

二、return与exit关键字

1 exit(0)是一个函数,用于退出整个程序,需要包含stdlib.h

2 return可以作为返回值的关键字,终止当前函数的继续执行。

#include <stdio.h>
#include <stdlib.h>
int test(){
    //exit(0);//终止整个程序
    return 0;//终止函数的继续执行
    printf("函数结束了!
");//这里不会被执行
}
int main()
{
    printf("程序开始!
");
    test();
    printf("程序结束了!
");//如果test函数里加上exit(0),这里不会被执行
    return 0;
}

回到顶部

三、递归与递推

1 递归算法

递归的过程:一般通过函数或子函数实现。

递归的方法:在函数或子函数内部,直接或间接调用自己的算法。

递归有可能造成死循环或算法的复杂化,(运行次数过多),因此在使用递归时,必须注意:

1)必须有退出条件

2)必须保证递归后,算法简化

2 递归格式

int f1(int n){

    if (n == 1) {//结束条件

        return 1;

    }

    return n*f1(n - 1);

}

3 递推的概念与基本思想

给一个数的序列H0、H1、H2、....、Hn,若存在n0,当n > n0时,可以用等号(或大于号、小于号)将Hn与前面的某些Hi(0 < i < n)联系起来,这样的式子就叫递推关系。

int f2(int n){

    int res = 1;

    for (int i = 1; i <= n; i++) {

        res = res * i;

    }

    return res;

}

原文地址:https://www.cnblogs.com/yangmx/p/3468216.html