C语言简单函数跟递归

目录

C语言函数

函数的嵌套调用和链式访问 函数声明

自定义函数

参数传值、传址

函数递归


C语言函数

1.输入数据-使用输入函数scanf()

        2.计算字符串长度——strlen()

        {'a','b','c'……,'\0'}'/0'没有被计算进去,它只是个结束标志

        但如果算存储空间的字节(sizeof)要把它+1

	char arr[] = "abc";
	char arr1[] = "abc'\0'";
	char arr2[] = "abc\0";
	printf("%d\n", strlen(arr)); //3
	printf("%d\n", strlen(arr1)); //4 因为那个‘’单引号的左边被算进去了,而\0就不会再往后计算了
	printf("%d\n", strlen(arr2)); //3
	char arr[] = "abc\n";
	char arr1[] = "abc'\n'";
	printf("%d\n",strlen(arr));//4
	printf("%d\n",strlen(arr1));//6

        3.两字符比较大小-strcmp

        strcmp(a,b);比较的是ASCII码值

        a跟b一定是字符串,如果a<b,那么返回值为小于0,若a>b,则返回值大于0,若两者相同,返回值等于0。

        4.srand函数

        srand函数是发生器的初始化函数。

        原型:void srand(unsigned int seed);srand和rrand()配合使用产生伪随机数序列。

        语法:void srand (unsigned seed);

        参数说明:unsigned seed:随机数产生器的初始值(种子值)。

        5.strcpy函数

        char * strcpy ( char * destination, const char * source );返回的是复制后char* destination

        把source复制到destination

int main() {
	char arr1[20] = {0};
	char arr2[] = "hello bit";
	strcpy(arr1,arr2);
	printf("%s",arr1);//打印arr1这个字符串%s-以字符串格式打印
	return 0;
}

         6.printf函数

        虽然printf函数用于输出,可是当我们嵌套调用会是怎么样的?

        printf返回值是在打印屏幕上输出的字符个数

int main() {
	printf("%d", printf("%d",printf("%d", 78)));// 7821 记得是后面先输出再轮到外围的函数
	return 0;
}

函数的嵌套调用和链式访问 函数声明

        函数不能嵌套定义(区分好定义跟调用)

        嵌套调用:

void test() {
	printf("123");
}
int test1() {
	test();
	printf("\n121");
	return 0;
}
int main() {
	test1();
	return 0;
}

        链式访问

        不直接用一个变量去接受,直接输出。

int add(int x,int y) {
	return x + y;
}
int main() {
	printf("%d",add(3,3));
	return 0;
}

        函数声明

//函数声明
int get_Max(int,int);//可以不加变量名
int main() {
	int a = 456;
	int b = 156;
    //函数声明在这里也可以
	printf("%d\n", get_Max(a, b));
}
//找出两个数最大的数
int get_Max(int a,int b) {
	if (a > b)
	{
		return a;
	}
	else
	{
		return b;
	}
}

        在add.h声明,add.c写明函数内容,在主函数调用

/*sub.h*/
int sub(int x,int y);
/*sub.c*/
int sub(int x,int y){
    return x - y;
}
/*可以起一个测试类test.c*/
int main{
    printf("%d",sub(10,8));
    return 0
}

        当后缀名为sub.lib,需要导入静态库

#pragma comment(lib,"lib名称.lib")

自定义函数

        若自定义函数没有加返回值类型,默认为int类型

        将字符串反向输出

void reverse_String(char *str) {
	int left = 0;
	int right = strlen(str) - 1;
	while (left < right)
	{
		char temp = str[left];//*(str + left)
		str[left] = str[right];
		str[right] = temp;
		left++;
		right--;
	}
}
//递归解法
void 
void reverse_String(char *str) {
	char temp = *str;
	int len = strlen(str);
	*str = *(str + len - 1);
	*(str + len - 1) = '\0';
	//判断条件
	if (strlen(str + 1) >= 2)
	{
		reverse_String(str + 1);//4
	}
	*(str + len - 1) = temp;
}
int main() {
	char arr[] = "abcdefg";
	reverse_String(arr);//数组名arr是数组arr首元素的地址
	printf("%s\n", arr);
	return 0;
}


        判断是否闰年的函数

int isleapYear(i) {
	if ((i%4 == 0 && i % 100 != 0)||(i % 400 == 0))//注意括号加在哪里 %100是不等于0
	{
		return 1;
	}
	else
	{
		return 0;
	}
}
int main() {
	int count = 0;
	int year = 0;
	for (year = 2000; year <= 3000; year++)
	{
		if (isleapYear(year) == 1)
		{
			printf ("%d ", year);
			count++;
		}
	}
	printf("\n%d", count);
	return 0;
}

        当找数字时,说int binarySearch(int arr[],int key,int sz);为什么一定要传int sz?

int binarySearch(int arr[],int key,int sz) {
	//为什么不在这里面直接 int sz = sizeof(arr)/sizeof(arr[0]);
	//数组arr传参,实际传递的不是本身,而只有首地址而已
	int left = 0;
	int right = sz - 1;
	
	while (left <= right)//要记得循环,并且要包含等于
	{
		int mid = (left + right) / 2;//再强调一次!放这里,不要放外部!要不然根本实现不了
		if (arr[mid] > key)
		{
			right = mid - 1;
		}
		else if (arr[mid] < key)
		{
			left = mid + 1;
		}
		else {
			return mid;
		}
	}
	return -1;
}	
int main() {
	int arr[] = { 1,2,3,4,5,6,7 };
	int key = 3;
	int sz = sizeof(arr) / sizeof(arr[0]);
	int ret = binarySearch(arr,key,sz);
	if (ret == -1 )
	{
		printf("找不到");
	}
	else
	{
		printf("找到了,下标为%d", ret);
	}
	return 0;
}

参数传值、传址

        如果你想改变实参的值,那么你就需要设为地址。区分好什么时候设置参数为地址或者值

//传址
int add(int *a) {
	(* a)++;
}
//传值
int add1(int a) {
	a++;
}
int main() {
	int num = 0;
	add(&num);
	printf("%d\n",num);//1
	add(&num);
	printf("%d\n", num);//2
	add(&num);
	printf("%d\n", num);//3
	int num1 = 0;
	add1(num1);
	printf("%d\n", num1);//0
	return 0;
}

函数递归

        接收一个整型值(无符号),按顺序打印它的每一位/例如:输入:1234,输出1 2 3 4

void myPrintf(unsigned int a) {
	if (a > 9)
	{
		myPrintf(a / 10);

	}
	printf("%d ",a % 10);
}

int main() {
	int a = 0;
	scanf("%d",&a);
	myPrintf(a);
	return 0;
}

         编写函数不允许创建临时变量,求字符串的长度。

//这样也可以做,但是不符合题意,count是临时变量
int strleng(char * p) {
	int count = 0;
	while (*p != '\0')
	{
		count++;
		p++;
		
	}
	return count;
}

int main() {
	char arr[] = "abc";
	//['a']['b']['c']['\0']
	//模拟实现一个strleng函数
	printf("%d",strleng(arr));
	return 0;
}

//正解
int strleng(char * p) {
	if (*p != '\0')
	{
		return 1 + strleng(p + 1);
	}
	else
	{
		return 0;
	}
}

int main() {
	char arr[] = "abc";
	//['a']['b']['c']['\0']
	//模拟实现一个strleng函数
	printf("%d",strleng(arr));
	return 0;
}

         求阶乘

int main() {
	int n = 0;
	scanf("%d",&n);
	int sum = 1;//这里也要是1
	//迭代
	for (int i = 1; i <= n; i++)//这里绝对不能设i = 0 要想好等号取不取
	{
		sum *= i;
	}
	printf("%d",sum);
	return 0;
}
//递归解法
int Fac(int n) {
	if (n <= 1)
	{
		return 1;
	}
	else {
		 return n* Fac(n - 1);
	}
}

int main() {
	int n = 0;
	scanf("%d",&n);
	printf("%d",Fac(n));
	return 0;
}

        求第n个斐波那契数列的值

//递归效率太慢了
int Fib(int n) {
	if (n <= 2)
	{
		return 1;
	}
	else {
		 return Fib(n-1) + Fib(n-2);
	}
}
//另解
int Fib1(int n) {
	int a = 1;
	int b = 1;
	int c = 1;
	while (n > 2)
	{
		c = a + b;
		a = b;
		b = c;
		n--;
	}
	return c;

}
int main() {
	int n = 0;
	scanf("%d",&n);
	printf("%d\n",Fib(n));
	printf("%d", Fib1(n));
	return 0;
}

        判断下列函数结果

int Demo(int n) {
	if (n == 5)
	{
		return 2;
	}
	else {
		return
			2 * Demo(n + 1);
	}
}
int main() {
	printf("%d",Demo(2));
}

         输入一整数,将此整数的每位数相加起来

int DigitiSum(int n) {
	if (n > 9)
	{
		return DigitiSum(n / 10) + n % 10;
	}
	else
	{
		return n;
	}
}

int main() {
	int num = 1654;
	int sum = DigitiSum(num);
	printf("%d",sum);
}

        自定义一个平方函数,输入a^b,得出结果。

double Pow(int a,int b) {
	if (b == 0)//不用写或者a == 1
	{
		return 1.0;
	}
	else if(b > 0) {
		return a * pow(a,b - 1);
	}
	else
	{
		return 1.0 / (Pow(a, -b));
	}
}

int main() {
	int a = 0;
	int b = 0;
	scanf("%d %d", &a, &b);
	double res = Pow(a, b);
	printf("%lf\n",res);
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值