首页 > 其他分享 >42.C语言有关函数的学习整理

42.C语言有关函数的学习整理

时间:2024-05-11 20:19:43浏览次数:11  
标签:函数 fang int 42 C语言 ++ printf include

先看一个简单的函数 实现的就是将数组里面的数加起来
\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);
   }
}

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

标签:函数,fang,int,42,C语言,++,printf,include
From: https://www.cnblogs.com/gaodiyuanjin/p/18185293

相关文章

  • tp6 递归函数使用
    publicfunctionfindLastClass($id){$classInfo=Db::name('class')->where('id',$id)->find();if($classInfo&&$classInfo['islast']==1){//如果当前记录的islast为1,直接返回return$classInfo......
  • 获取任意bmp图片的参数函数设计
    /**@Author:[email protected]*@Date:2024-05-0814:24:52*@LastEditors:[email protected]*@LastEditTime:2024-05-1118:57:02*@FilePath:\数据结构text\text,.c*@Description:这是默认设置,请设置`customMade`,打开koroFileHeader查看配置进行设......
  • ..\HAL_LIB\Inc\stm32l4xx_hal_rcc_ex.h(2424): error: #20: identifier "HAL_Sta
    stm32工程编译时遇到这个错误,显示HAL_StatusTypeDef没有被定义,但是go todefinition又能找到定义 后来在网上寻找解决办法,结果发现竟然是#include"stm32l4xx_hal_spi.h"#include"stm32l4xx_hal.h"这两个的顺序问题,#include"stm32l4xx_hal.h"头文件包含必须在最前面,真是......
  • jmeter函数记录
    1、Jmeter时间偏移函数:__timeShift2、#vars保存对象类型(包括List,Map,closure之类),使用如下方法:#vars.putObject("object_name",Object);3、Jmeter执行文件与上传文件在同一文件夹下,获取相对路径先用BeanShell函数获取当前路径:importorg.apache.jmeter.services.File......
  • U423621 [HDK - NRC] Sqen Paradox 题解
    题目描述及\(O(n^2)\)做法见这个设\(a_i\)表示以\(i\)为左端点,无重复元素的最长区间的左端点,这个直接拿双指针做就行。处理出来后,分类讨论,找\(\max(i-l+1,i-a_i+1)\),找\(i-l+1\)拿个桶维护一下左端点为\(i\)的右端点有那些就行,剩下的位置找最值即可,这个是RMQ。时间......
  • FlexibleButton - 一个小巧灵活的C语言按键处理库+SerialChart - 能将串口数据实时绘
    1、FlexibleButton-一个小巧灵活的C语言按键处理库FlexibleButton是一个基于标准C语言的小巧灵活的按键处理库,支持单击、连击、短按、长按、自动消抖,可以自由设置组合按键,可用于中断和低功耗场景。项目主页:https://github.com/murphyzhao/FlexibleButton该按键库解耦了......
  • ELL-8051-LIB - 面向8051的高效低封装函数库+KLite - 简洁易用的嵌入式操作系统内核
    1、Arm-2D-基于Cortex-M的2D图形加速库ARM官方出品的2D图形加速库,在Cortex-M55系统频率8MHz下就可以实现30fps的渲染(6图层。320x240,rgb565)。项目主页: https://github.com/ARM-software/EndpointAI/tree/master/Kernels/Research/Arm-2DArm-2D库特性包括但不限于:*......
  • C++_函数式编程-以及常用序列化
    函数式编程函数式编程是一种编程范式,它强调程序的构建是通过应用(applying)和组合函数(composingfunctions)来实现的函数式编程属于“结构化编程”的一种,主要思想是把运算过程尽量写成一系列嵌套的函数调用 LambdaCalculus函数式编程语言早期的函数式......
  • 使用js有效括号匹配封装函数
    点击查看代码functionisValidParentheses(str){//定义一个栈,用于存储待匹配的左括号letstack=[];//定义一个对象,用于快速判断括号是否成对constpairs={')':'(','}':'{',']':'['};//遍历输入字符串for(let......
  • 非常完整的开源无刷电机驱动项目+仅1300行代码的C语言异步网络库+简单到傻瓜都会用的
    1、VESC-非常完整的开源无刷电机驱动项目ESC是ElectricSpeedController的缩写,也就是电子调速控制器,简称电调;项目作者是BenjaminVedder,所以叫VESC,就是本杰明电调。这个项目主要分为几个部分,VESC固件,物料清单,VESC硬件,VESC工具软件,是一个非常完整的软硬件项目,并且配套的软......