06-函数

// 函数

    // printf()输出函数,用于输出一个信息

    printf("输出函数\n");

    

    // scanf()输入函数,用于从键盘输入一个信息

    int a = 0;

    scanf("%d", &a);

    

    // strlen()求字符串长度函数,用于求出指定字符串的长度

    unsigned long strLength = strlen("I Love You");

    printf("strLength = %lu\n", strLength);

    

    // strcpy()字符串拷贝函数,用于实现字符串的赋值

    char str1[] = "I Like iOS";

    char str2[] = "";

    strcpy(str2, str1);

    printf("str2 = %s\n", str2);

    

    // 以上总结:

    // 这些都是函数,都实现了某一特定的功能,并且这些函数都是系统提供了,我们除了使用系统提供的函数之外,我们也可以使用自定义的函数

    

    

    

    // 那么,什么是函数呢?  答:函数是具有某段功能的代码片段

    // 通俗的讲:我们把一连串得语句放在一起,实现了某一个功能,然后我们给这些代码起一个名字。之后我们想使用这段代码的时候直接使用他们的名字

    // 使用函数,可以省去大量的重复代码,大大简化程序,提高我们的开发效率

    

    

    

    // 函数的分类

    // 从函数的定义上来区分,函数可以分为两类函数

    //      库函数:系统提供的函数,例如:printf() / scanf() / strlen() ...

    //      自定义函数:开发者自己写的函数

    

    

    

    

    

    

    // 库函数我们直接拿过来使用就可以了,那么,我们如何自己写函数???呢

    // 函数的一般形式

//    返回值类型 函数名(形式参数列表)

//    {

//        执行语句;

//        return 返回值;

//    }

    // 返回值类型: 函数可以有一个返回值,也可以没有,函数处理完之后,返回给你一个信息,你可以接收后使用,这个数据是函数给我们的

    // 函数名: 我们可以写很多的函数,如何区别出这些函数,我们就可以给函数命不同的名字,使用函数名找到函数

    // 形式参数列表: 让函数处理一些数据,我们使用参数的方式传递给函数,这里的数据是我们给函数的

    // 执行语句: 函数拿到数据后,进行处理,主要是函数的内部实现语句

    // return 返回值: 函数处理好数据之后,需要把结果返回。!注意:这里的返回值类型,需要与上面标注的返回值类型一致

    

    

    // 函数如果细致分的话可以分为4种:

    // 1. 无返回值无参数

    // 2. 无返回值有参数

    // 3. 有返回值无参数

    // 4. 有返回值有参数

    // 例如:

// 无返回值,无函数(功能:打印Hello World !

void hello1()

{

    printf("Hello World !");

}

// 无返回值,有参数(功能:输出参数内容)

void hello2(char str[])

{

    printf("%s", str);

}

// 有返回值,无参数(功能:返回圆周率π的值)

float PI()

{

    return 3.1415925;

}

// 有返回值,有参数(功能:计算两个参数的和并返回)

int sum(int a, int b)

{

    return a + b;

}

    

    

    // 再来解释下什么是返回值:

    // 函数的返回值称为函数的值,只能通过return语句返回给主调函数

    // 注意:一个函数只能有一个返回值

    // 如果一个函数没有返回值,也可以使用return语句来结束函数的执行,return后面的代码不再执行。回到主调函数

    

    

    

    // 写好了函数,下面开始使用函数了,也就是函数的调用。想一下,库函数是如何使用的?

    printf("形式参数列表");

    // 上面的代码是调用了系统提供的输出函数,直接是函数名+小括号+传递的数据+小括号+分号

    // 我们自己写的函数调用方式也是一样的

    hello1();

    hello2("形式参数列表");

    // 当代码执行到函数的调用的时候,就会去执行函数内部的代码,当函数内部执行完毕之后,再回来继续执行函数下面的代码

    

    

    

    // 我们成功的调用了函数,那么,我们就给函数一些数据,让函数帮助我们处理数据,How do?

    // 提到了参数,其实是分为两种的:

    // 1. 实参(实际参数):出现在函数调用中的表达式

    // 2. 形参(形式参数):出现在函数定义中,以假名字来表示函数调用时需要提供的值

    // 注意:在函数调用中,形参会拷贝实参内容,传递参数是给函数传送信息的一种方式

    

    

    

    

    

    // 概念基本都介绍完了,下面是练习部分

    // 1、编写函数int sumValue(int n):计算1n的和。

int sumValue(int n)

{

    int result = 0;

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

        result += i;

    }

    return result;

}

    

    // 2、编写函数dayOfYear(year, mouth,day),使得函数返回由这三个参数确定的那一天是一年中的第几天。

int dayOfYear(int year, int month, int day)

{

    int result = 0;

    

                //1   2   3   4   5   6   7   8   9   10  11  12

    int days[] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};

    BOOL isBissextile = (year % 400 == 0) || (year % 4 == 0 && year % 1 != 0);

    days[1] = isBissextile ? 29 : 28;

    

    for (int i = 0; i < month - 1; i++) {

        result += days[i];

    }

    result += day;

    

    return result;

}

    

    // 3. 编写函数,返回三个数的中间数

int midValue(int a, int b, int c)

{

    int maxValue = (a > b ? a : b) > c ? (a > b ? a : b) : c;

    int minValue = (a < b ? a : b) < c ? (a < b ? a : b) : c;

    printf("maxValue = %d\n", maxValue);

    printf("minValue = %d\n", minValue);

    

    return a + b + c - maxValue - minValue;

 

}

    

    

    // Implicit declaration of function'midValue' is invalid in C99

    // 暗示的    宣布、宣告、声明  函数                   无效的

    

    


    

    

    

    // 函数是需要声明的???

    // 严格意义上来讲,函数通常包含3部分:函数声明、函数定义、以及函数的调用

    // 函数声明:指的就是函数的描述,也叫函数原型

    // 函数声明的位置:

    //      1. 函数定义放在主函数的上面,不需要函数的声明

    //      2. 函数定义放在主函数的下面,需要函数的声明

    // 注意:函数声明虽然可以省略,但是在规范上来讲,函数的声明尽量加上

    

    // 重点!!!!

    // 函数声明的文件和位置:

    // 我们把函数的声明和定义分别放在不同的文件中

    //      xxx.h:头文件: 存放函数的声明部分

    //      xxx.m:实现文件: 存放函数的定义部分

    // 注意:需要在xxx.m文件中

    

    

    

    

    

    // 数组作为函数参数

    // 如果是数组元素作为参数:与普通变量一样

    // 如果是数组作为参数,把数组名传入,即数组的首地址

    // 注意,此时,形参和实参实际上是同一个变量,是同一段内存

    

    

    

    // 函数的嵌套调用

    // C语言不允许函数嵌套定义,但是允许函数嵌套调用

    // 注意:避免出现函数的嵌套定义

    

    // 练习3:求N个数的最大值

    int aaa[] = {12, 43, 32, 5, 23};

    printf("\nMaxValue = %d"maxValue(aaa, 5));

// 练习3,求N个数的最大值

int maxValue(int arr[], int count)

{

    for (int i = 0; i < count - 1; i++) {

        for (int j = 0; j < count - 1 - i; j++) {

            if (arr[j] < arr[j + 1]) {

                int temp = arr[j];

                arr[j] = arr[j + 1];

                arr[j + 1] = temp;

            }

        }

    }

    

    return arr[0];

}

    

    // 练习4

    //   计算 s = (1*1)!+(2*2)! + (3*3)!

// 练习4,求一个数的阶乘

int square(int a)

{

    return a * a;

}

int factorial(int a)

{

    int result = 1;

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

        result *= i;

    }

    return result;

 

}


    

    

    

    

    

    // 函数的递归调用(了解即可)

    // C语言允许函数实现体内再次调用函数本身。这种调用方式称为递归调用,这个函数称为递归函数

    // 在计算机中阶乘就可以使用递归调用

    // 注意:递归一定要有出口

    

    

    

    

    // 变量的作用域

    // 变量分为两种:全局变量、局部变量

    // 全局变量(外部变量):文件作用域,从变量被声明的点开始一直到所在文件的末尾

    // 局部变量:块作用域,从变量被声明的点开始一直到第一个大括号的结尾处

    // 定义在函数外面的都称为全局变量,作用域很大

    // 局部变量就是定义在函数大括号内部的变量

    

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值