2、 函数

1.函数存在的意义

  • 避免了重复性操作。
  • 有利于程序的模块化。
# include <stdio.h>

//max是函数的名字, i和j是形式参数,简称形参 void表示函数没有返回值
void max(int i, int j)
{
    if (i > j)
        printf("%d\n", i);
    else
        printf("%d\n", j);
}
int main(void)
{
    int a, b, c, d, e, f;

    a = 1, b = 2; c = 3, d = 9, e = -5, f = 100;
    max(a, b);
    max(c, d);
    max(e, f);

2-1 什么是函数

1.逻辑上:能够完成特定功能的独立的代码块。
2.物理上:能够接收数据【也可以不接收数据】,能够对接收的数据进行处理【也可以不对数据进行处理】,能够将数据处理的结果返【也可以没有返回值】。

2-2 如何定义函数

  • 函数的返回值,函数的名字(函数的形参列表)
    {
    函数的执行体
    }

  • 函数定义的本质:详细描述函数之所以能够实现某个特定功能的具体方法。
  • 函数中的变量叫做形参;数组中的变量叫元素。一旦函数执行完毕,其内部的形参所占空间就被收回。

return 表达式含义

  • return是终止被调函数,向主调函数返回表达式的值,如果表达式为空,则只终止函数,不向被主函数返回任何值。

代码显示

# include <stdio.h>

int f()
{
    return 10.5;  //因为函数的返回值类型是int  所以最终f返回的是10而不是10.5
}

int main(void)
{
    int i = 99;
    double x = 6.6;
    
    x = f();
    printf("%lf\n", x);

    return 0;
}

Break是用来终止(就近的)循环和switch语句。而return是用来终止被调函数的。

# include <stdio.h>

void f(void)
{
    int i;

    for (i=0; i<5; ++i)
    {
        printf("大家辛苦了!\n");
        return;   //return是终止函数的
    }
    printf("同志们好!\n");
}

int main(void)
{
    f();

    return 0;
}

3 函数的分类

1.有参函数和无参函数。
2.有返回值和无返回值。
3.库函数和用户自定义函数。
4.普通函数和主函数(main函数)

4 注意事项

1.一个程序有且只有一个主函数。
2.主函数可以调用普通函数,普通不能调用主函数。
3.普通函数可以相互调用。
4.主函数是程序的入口,也是函数的出口。

值传递函数和地址传递函数。

# include <stdio.h>

//max是函数的名字, i和j是形式参数,简称形参 void表示函数没有返回值
void max1(int i, int j)
{
    if (i > j)
        printf("%d\n", i);
    else
        printf("%d\n", j);
}

int max2(int i, int j)
{
    if (i > j)
        return i;
    else
        return j;
}

int main(void)
{
    int a, b, c, d, e, f;
    a = 1, b = 2; c = 3, d = 9, e = -5, f = 100;

    printf("%d\n", max2(a, b));
    printf("%d\n", max2(c, d));
    printf("%d\n", max2(e, f));


}

代码实现

//判断一个数是否素数,该数只能被1和本身整除
# include <stdio.h>

bool IsPrime(int val)
{
    int i;

    for (i=2; i<val; ++i)
    {
        if (val%i == 0)
            break;
    }
    if (i == val)
        return true;
    else
        return false;
}

int main(void)
{
    int m;
    scanf("%d", &m);
    
    if ( IsPrime(m) )
        printf("Yes!\n");
    else
        printf("No!\n");

    return 0;
}

代码实现

//void f(int i) 则是return不需要返回任何数据类型
int f(int i)
//void f(void) 表示f里面不需要参数
{
    return 10.8;
}

int main(void)
{
    float i = 99.9;
    
    printf("%f\n", i);
    i = f(5);
    printf("%f\n", i);

    return 0;
}

4 函数的声明

# include <stdio.h>

void f(void); //函数声明, 分号不能丢掉

int main(void)
{
    f();

    return 0;
}

void f(void)
{
    printf("哈哈!\n");
}
---------------------------------------------------------------

# include <stdio.h>

//void f(void);  //9行

void g(void)
{
    f();  //因为函数f的定义放在了调用f语句的后面,所有语法出错
}

void f(void)
{
    printf("哈哈!\n");
}

int main(void)
{
    g();

    return 0;
}

当函数没有返回值时,那么规范的写法是要在函数中写明void的。如果函数调用写在了函数定义的前面,则必须加函数前置声明。

5 形参和实参的关系

1:形参和实参个数是一一对应的。
2:形参和实参的位置也是一一对应的。
3: 形参和实参的数据类型需要相互兼容。

# include <stdio.h>

void f(int i, float x)  //形参
{
    printf("%d\n", i);
}
int main(void)
{
    f(9.9, 6.6); //实际参数

    return 0;
}

6 如何合理的设计函数

//判断一个数是否是素数
# include <stdio.h>

int main(void)
{
    int val;
    int i;

    scanf("%d", &val);
    for (i=2; i<val; ++i)
    {
        if (0 == val%i)
            break;
    }
    if (i == val)
        printf("Yes!\n");
    else
        printf("No!\n");

    return 0;
}
------------------------------------------------------------
**代码2**
# include <stdio.h>

bool IsPrime(int val)
{
    int i;

    for (i=2; i<val; ++i)
    {
        if (0 == val%i)
            break;
    }
    if (i == val)
        return true;
    else
        return false;
}

int main(void)
{
    int val;
    int i;

    scanf("%d", &val);
    if ( IsPrime(val) )
        printf("Yes!\n");
    else
        printf("No!\n");

    return 0;
}
-------------------------------------------------------------
**代码3:**
/*
求1到某个数字之间(包括该数字)所有的素数,并将其输出
只用main函数实现,有局限性:
    1. 代码的重用性不高
    2. 代码不容易理解      
*/
# include <stdio.h>

int main(void)
{
    int val;
    int i;
    int j;

    scanf("%d", &val);
    for (i=2; i<=val; ++i)
    {
        //判断i是否是素数,是输出,不是不输出
        for (j=2; j<i; ++j)
        {
            if (0 == i%j)
                break;
        }
        if (j == i)
            printf("%d\n", i);
    }
    return 0;
}
-------------------------------------------------------------
** 代码4**
/*
求1到某个数字之间(包括该数字)所有的素数,并将其输出
用1个函数来判断一个数字是否是素数 */

# include <stdio.h>

bool IsPrime(int m)
{
    int i;
        
    for (i=2; i<m; ++i)
    {
        if (0 == m%i)
            break;
    }
    if (i == m)
        return true;
    else
        return false;

}

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

    return 0;
}
---------------------------------------------------------------
**代码5**
/*
    用两个函数来实现求1到某个数字之间所有的素数,并将其输出
    本程序 和 如何合理设计函数
*/

# include <stdio.h>

//本函数的功能是: 判断m是否是素数,是返回true,不是返回false
bool IsPrime(int m)
{
    int i;
        
    for (i=2; i<m; ++i)
    {
        if (0 == m%i)
            break;
    }
    if (i == m)
        return true;
    else
        return false;

}

//本函数的功能是把1到n之间所有的素数在显示器上输出
void TraverseVal(int n)
{
    int i;

    for (i=2; i<=n; ++i)
    {
        if ( IsPrime(i) )
            printf("%d\n", i);
    }
}

int main(void)
{
    int val;
 
    scanf("%d", &val);
    TraverseVal(val);

    return 0;
}

7 变量的作用域和存储方式

1、局部变量

局部变量的使用范围只能在本函数内部使用
2.全局变量

/*
    一定要明白该程序为什么是错的,
    也要明白把9到12行代码放在14行后面,为什么程序就OK了
*/

# include <stdio.h>

void g()  //9
{
    printf("k = %d\n", k);
} //12

int k = 1000;  //14行

void f(void)
{
    g();
    printf("k = %d\n", k);
}

int main(void)
{
    f();
    return 0;
}

3、局变量和局部变量命名冲突的问题

#### 代码显示
# include <stdio.h>
//在一个函数内部,如果定义的局部函数的名字和全局变量名一样时,局部变量会屏蔽掉全局变量,上例中最终的输出结果是8,因为局部变量把全局变量给屏蔽掉了。
int i = 99;

void f(int i)
{
    printf("i = %d\n", i);
}

int main(void)
{
    f(8);

    return 0;
}

猜你喜欢

转载自www.cnblogs.com/Guard9/p/11075452.html