C语言函数

目录

1.认识函数

2.函数传参

3.函数声明

4.函数递归调用

5.标准库中一些函数


前言

C语言函数是一种函数,用来编译C语言,一般包括字符库函数,数学函数,目录函数,进程函数,诊断函数,操作函数等。


正文

一.认识函数

#include <stdio.h>
//No.1 无参,无返回的函数,用来做效果,
//这种效果一般可能需要重复使用
void print() 
{
	//return;  函数遇到这个reutrn就结束
	printf("----------------------\n");
	printf("\t0.退出\n");
	printf("\t1.录入\n");
	printf("\t2.浏览\n");
	printf("----------------------\n");
}
//No.2 带返回值 带参
//用来做数据的加工
//函数处理后结果需要在调用者中使用,可以同函数返回值体现
int Max(int a, int b)    //int a=aa,int b=bb
{
	return a > b ? a : b;//2
}
//拷贝本的问题
void modifyNum(int a)   //int a=num;
{
	a = 1004;			//局部的
	printf("%d\n", a);
}
void printA() 
{
	//a = 0;
}
int main() 
{
	print();  //函数名(参数)		
	print();
	int aa = 1;
	int bb = 2;
	int result=Max(aa, bb);	//函数返回值是函数调用表达式代表值
	//Max(aa, bb) = 101;    //函数返回值是一个值,不能充当左值
	printf("Max=%d\n", result);
	printf("Max=%d\n", Max(3, 4));	//Max(3, 4)是一个int的值,所以直接打印
	printf("Max=%d\n", Max(Max(5, 6), Max(4, 3)));
	//上面一行等效下面三行
	int first = Max(5, 6);
	int second = Max(4, 3);
	printf("Max=%d\n", Max(first, second));

	//所有传参方式都是赋值方式
	int num = 100;
	modifyNum(num);
	printf("num=%d\n", num);
	//printf("a=%d\n", a);
	return 0;
}

二.函数传参

#include <stdio.h>
#include <string.h>
//No.1 对于函数的每一个参数自己都要能解释清除
int Max(int a, int b)	//功能:求最大值, 求谁的最大值(a和b的最大)
{
	return a > b ? a : b;
}
//No.2 传一维数组
//数字类的数组必须要传入数组长度
void printArray(int num[], int arrayNum) 
{
	for (int i = 0; i < arrayNum; i++) 
	{
		printf("%d\t", num[i]);
	}
	printf("\n");
}
//void printArray2(int* num, int arrayNum); 和上面写法等效
//字符类的不需要长度 ,字符串结束标记
//strlen
int my_strlen(char str[])   //str="ABC"
{
	int count = 0;
	while (str[count] != '\0')	//str[0]:'A'  str[1]:'B' str[2]:'C'  str[3]:'\0'
		count++;				//count=1     count=2    count=3
	return count;				//count=3
}
//int my_strlne(const char* str);   //const常属性
//No.3 函数调用的时候,形参和实参类型必须一致
//不一致会存在强制类型转换 ,如果转换不了直接崩掉
void print(int num)  //int num='A';  //int num="ILoveyou";
{
	printf("\nnum=%d\n", num);
}
//No.4 二维数组独有传参方式
//行可以不同,但是列必须相同
void printArray2D(int array[][4], int row, int cols) 
{
	for (int i = 0; i < row; i++) 
	{
		for (int j = 0; j < cols; j++) 
		{
			printf("%d\t", array[i][j]);
		}
		printf("\n");
	}
}
int main() 
{
	Max(3, 4);			//赋值的方式传参
	int array[3] = { 1,2,3 };
	//写一个在函数打印数组
	printArray(array, 3);
	int array2[5] = { 1,2,3,4,5 };
	printArray(array2, 5);
	char str[] = { "ILoveyou" };
	printf("%d\t", my_strlen("ABC"));
	printf("%d\t", my_strlen(str));
	printf("%zd\t", strlen(str));		//zd  ---unsigned int 
	print('A');
	//print("ILoveyou");
	// 希望大家把编译这种提醒当做错误
	// warning C4047: “函数”:“int”与“char [9]”的间接级别不同
	// warning C4024: “print”: 形参和实参 1 的类型不同
	int array2D[3][4] = { {1},{2},{3} };   //其他的值默认初始化为0
	printArray2D(array2D, 3, 4);
	//所有的数组为参数,都是传入数组名

	return 0;
}

三.函数的声明

#include <stdio.h>
void printData();
void print(int num);		//声明语法不带函数体
//我上可以一般函数实现都是写在上面
int Max(int, int);			//声明函数可以不带形参名
void printA() 
{

}
void printB()
{
	printA();
}
int main()
{
	//error C2371: “print”: 重定义;不同的基类型
	print(34);					//“print”未定义;假设外部返回 int						
	printData();

	extern void printMM();		//外部函数,需要声明一下
	//warning C4013: “printMM”未定义;假设外部返回 int
	printMM();
	return 0;
}
void printData() 
{
	print(43);
}
void print(int num)
{
	printf("%d\n", num);
}
int Max(int a, int b) 
{
	return a > b ? a : b;
}

exfile.h

void printMM() 
{
	printf("外部文件函数!\n");
}

四.函数的递归调用

#include <stdio.h>
int Max(int a, int b) 
{
	return a > b ? a : b;
}
//函数递归-->解决重复有规律的操作问题
//斐波拉契数列
//F(1)=1  F(2)=1
//F(3)=F(2)+F(1)=2;
// .....
//F(n)=F(n-1)+F(n-2);
// 1  1  2 3 5 8 13 21
//求解第N项
//考虑数据类型存储范围-->
int F(int n) 
{
	if (n == 1 || n == 2)			//退出性条件
		return 1;
	//printf("%d\n", n);				//????
	return  F(n - 1) + F(n - 2);	//递归
	//递归的本质是通过参数的递归实现递归
	//参数的递归一定是往退出性条件靠拢
	//堆栈溢出-->死递归
	printf("%d\n", n);			//没有用
}
int main() 
{
	printf("%d\n", Max(Max(1, 2), Max(3, 4)));
	printf("%d\n", F(8));


	return 0;
}

五.标准库其他函数与他们返回值

#include <stdio.h>
#include <time.h>
#include <stdlib.h>
int main() 
{
	//srand() 函数: 用来设置随机的范围
	//time(NULL); 获取时间戳: 当前离1970有多少秒--->一直改变
	//随机函数种子
	srand((unsigned int)time(NULL));	//把time(NULL)返回值强制转换为无符号整形
	printf("伪随机数:%d\n", rand());  //rand() 产生一个值
	//随机数范围
	//rand() 产生x 不知道是多少
	//x%n    [0,n-1]
	int  randNum = rand()%10;   //[0-9]
	printf("randNum=%d\n", randNum);
	//x%n+a  [0+a,n-1+a];		//不从0开始
	randNum = rand() % 10 + 1;  //[1-10]
	printf("randNum=%d\n", randNum);
	//怎么描述概率问题
	int count = 1;
	while (1)
	{
		int num = rand() % 100;		//100个数字 
		printf("第【%d】抽奖:", count++);
		if (num == 0&&count>=200)
		{
			printf("一等奖\n");
			break;
		}
		else if (num >= 1 && num <= 10)
		{
			printf("二等奖\n");   //10/100
		}
		else 
		{
			printf("安慰奖\n");
		}
	}
	int result = printf("ILoveyou\n");	//prinf返回是打印数据的个数
	printf("%d\n", result);
	int num=scanf_s("%d", &result);		//输入成功数据个数据
	printf("%d\n", num);
	//while (scanf_s("%d", &num) != 0);
	//随机数





	return 0;
}

总结

C语言函数众多,功能强大,这里只列举了个别函数,如需进一步学习函数,可参阅

https://baike.baidu.com/item/C%E8%AF%AD%E8%A8%80%E5%87%BD%E6%95%B0/1814181#:~:text=C%E8%AF%AD%E8%A8%80%E5%87%BD%E6%95%B0%E6%98%AF%E4%B8%80%E7%A7%8D%20%E5%87%BD%E6%95%B0%20%EF%BC%8C%E7%94%A8%E6%9D%A5,%E7%BC%96%E8%AF%91%20C%E8%AF%AD%E8%A8%80%EF%BC%8C%E4%B8%80%E8%88%AC%E5%8C%85%E6%8B%AC%E5%AD%97%E7%AC%A6%E5%BA%93%E5%87%BD%E6%95%B0%EF%BC%8C%20%E6%95%B0%E5%AD%A6%E5%87%BD%E6%95%B0%20%EF%BC%8C%E7%9B%AE%E5%BD%95%E5%87%BD%E6%95%B0%EF%BC%8C%E8%BF%9B%E7%A8%8B%E5%87%BD%E6%95%B0%EF%BC%8C%E8%AF%8A%E6%96%AD%E5%87%BD%E6%95%B0%EF%BC%8C%E6%93%8D%E4%BD%9C%E5%87%BD%E6%95%B0%E7%AD%89%E3%80%82

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

兴趣使然的Qsiri

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值