先看一个简单的函数 实现的就是将数组里面的数加起来
\t 缩进相当于Tab键
    int a[10] = {9, 8, 7, 6, 5, 4, 3, 2, 1, 0};
    for (int i = 0; i < 10; ++i)
        a[i] = add(a[i], i);
    for (int i = 0; i < 10; ++i)
        printf("%d\t", a[i]);
		
		
		int add(int x, int n) {
    			return (x + n);
		}

先看库函数的使用 也就是c自带的函数

像printf scanf函数都是c自带的库函数
当然库函数很多很多:
这里给三个地方参考

https://zh.cppreference.com/w/cpp
https://zh.cppreference.com/w/cpp
https://blog.csdn.net/weixin_44793491/article/details/107644666

那简单举几个例子:

   // strcpy(char *dest,char *src)	把src所指由NULL结束的字符串复
    char a1[]="abc";
    char a2[10]="12345";
    strcpy(a2,a1);
    printf("%s\n",a2);
	输出结果为abc

image

image

可以发现 abc连同\0也复制到了a2数组里(替代了原来的1 2 3 4) 而打印遇到\0就会结束 所以5不会打印

    //void *memset(void *buffer, int c, int count)	把buffer所指内存区域的前count个字节设置成字符c
    char a3[]="hello world";
    memset(a3,'*',5);
    printf("%s\n",a3);
输出结果为 ***** world
参照参数就可以

自定义函数
我们可以发现关于一个自定义函数分为三步
//函数声明
int fang_max(int a, int b);
int fang_min(int x, int y);
int main{
    //自定义函数 求两个数的较大值和较小值
    int a=10,b=55;
    int min=fang_min(a,b);			//调用函数
    printf("较小值为:%d\n", min);
    printf("较大值为:%d\n", fang_max(a,b));	//调用函数
}
// 函数定义
int fang_min(int x, int y) {
    return x<y?x:y;
}

int fang_max(int x, int y) {
    int max=x>y?x:y;
    return max;
}

这里是一个重点 关于函数传值的
官网语言:值传递是将实际参数复制一份副本传递到函数中 
在函数内部对参数进行修改 而不会影响到实际参数

改变形参的值不会影响实参的值
因为其都有独立的空间
    //写一个函数 交换两个整形变量的内容
    int c=50,d=20;
    //传值    调用函数
    fang_swap(c,d);
	void fang_swap(int x, int y) {
    //x,y形参有自己独立的内存空间(地址不同于实参c,d)
    //值不会交换
    int tem=0;
    tem=x;
    x=y;
    y=tem;
}

那如何呢:

址传递
void fang_swap2(int *x, int *y);

    fang_swap2(&c,&d);
	
    void fang_swap2(int *x, int *y) {
    int tem=*x;
    *x=*y;
    *y=tem;
}

看两个练习题:

//
// Created by 28418 on 2024/5/6.
//
#include<stdio.h>
#include<math.h>

int is_prime(int n);

int main() {
    // 函数 打印100-200之间的素数
    //质数又称素数 一个大于1的自然数,除了1和它本身外,不能被其他自然数(质数)整除
    //如果一个数可以写成 i=a*b  那a或者b 一定<=根号i
    for (int i = 100; i < 201; ++i) {
        if (is_prime(i) == 1)
            printf("%d ", i);
    }
}
// 从2到n-1试除
int is_prime(int n) {
    for (int j = 2; j <= sqrt(n); j++) {
        if (n % j == 0) {
            return 0;
        }
    }
    return 1;
}


//
// Created by 28418 on 2024/5/6.
//
#include<stdio.h>

void add(int *x);

int main() {
//函数每执行一次 num就加1
    int num = 0;
    for (int i = 0; i < 3; ++i) {
        add(&num);
        printf("%d ", num);
    }
}

void add(int *x) {
//    *x++;  错误 ++优先级高  写成(*x)++;
    ++*x;
}



函数的多层嵌套调用

大致就是函数里面再调用函数

例如:
   printf("%d ", printf("%d ", printf("%d ",43)));
   输出的为 43 2 1

image
返回值为整形int 打印屏幕上显示的个数43 2个数字 所以打印2 2一个数字 所以打印1


后续会用到的.h和.c文件
//
// Created by 28418 on 2024/5/6.
//
#include<stdio.h>
#include "add.h"
int main(){
    //函数声明在头文件中 定义在一个源文件中 如果其他源文件要调用include
    //例如:add
    int a=5,b=5;
    printf("%d ",sum(a,b));

}
头文件:
//
// Created by 28418 on 2024/5/6.
//

#ifndef PROJECTS_ADD_H
#define PROJECTS_ADD_H

#endif //PROJECTS_ADD_H
int sum(int x,int y);
源文件:实现函数功能:
//
// Created by 28418 on 2024/5/6.
//
#include<stdio.h>

int sum(int x,int y){
    return x+y;
}

我用的是Clion 别忘记在CMakeLists.txt中加入
add_executable(projects
image

大致就是将来会写很多很多文件 相同的部分就用一个头文件或者源文件实现


递归函数

说之前请注意一个问题 就是递归函数可能导致栈溢出

例如:

int main(){
    //会导致栈溢出
    printf("哈哈");
    main();
}

来看看几个例子 使用递归函数实现:

#include<stdio.h>

void print(int x);

int main() {
    //输入1234 打印1 2 3 4
    //递归函数来实现
    unsigned int num = 0;
    scanf("%d", &num);
    print(num);
}

void print(int x) {
     if (x > 9) {
        print(x / 10); // 123
    }
    printf("%d ", x % 10);
}
为何能实现呢

咱来好好刨析一下:
断点看看:

image

image

还是手写吧意思呢就是返回后是返回的上一层调用它的
image

还有另外一个例子:

#include<stdio.h>

int my_strlen(char *str);

int main() {
    //不创建临时变量 求字符串长度
    //递归函数实现
    char arr[] = "gao";
//    printf("%d ",strlen(arr));
    int len = my_strlen(arr);
    printf("%d", len);
}

int my_strlen(char *str) {
    //不允许临时变量v
//    int count = 0;
//    while (*str != '\0') {
//        count++;
//        str++;
//    }
//    return count;
    if (*str != '\0') {
        return 1+ my_strlen(str+1);
    } else{
        return 0;
    }
}

image

再来一个求n的阶乘

#include<stdio.h>

int Facl(int x);
int Facl2(int x);

int main() {
    //求n的阶乘
    //使用递归的方式
    int n;
    printf("请输入n的值:");
    scanf("%d", &n);
    printf("%d的阶乘为:%d\n", n, Facl(n));
    printf("%d的阶乘为:%d", n, Facl2(n));
}

int Facl(int x) {
    int sum = 1;
    for (int i = 1; i < x + 1; ++i) {
        sum *= i;
    }
    return sum;
}
int Facl2(int x) {
   if(x<=1){
       return 1;
   } else{
       return x*= Facl2(x-1);
   }
}

大致到这里了 后续整理函数题目练习

posted on 2024-05-11 20:12  蒸饺  阅读(31)  评论(0)    收藏  举报