先看一个简单的函数 实现的就是将数组里面的数加起来
\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   不爱美女爱辣条  阅读(22)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 【.NET】调用本地 Deepseek 模型
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
· DeepSeek “源神”启动!「GitHub 热点速览」
· 我与微信审核的“相爱相杀”看个人小程序副业
· Plotly.NET 一个为 .NET 打造的强大开源交互式图表库



点击右上角即可分享
微信分享提示