2025.10.09C语言学习笔记

1.字符串逆序(循环)

   (1)字符串逆序应该是字符之间交换位置,而不是逆序打印结果;

(2)right = sz - 2   因为字符串末尾包含"\n",计算字符串长度时"\n"也被计算在内,同时right表示的是下标,所以最后要减去2;

   (3)left++  right--  是循环结束条件,不加会造成死循环,且无法达到既定目标。

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
//字符串逆序(非递归)
int main()
{
	char arr[] = "abcdefg";
	int sz = sizeof(arr) / sizeof(arr[0]);
	int left = 0;
	int right = sz - 2;
	while (left <= right)
	{
		int tmp = arr[left];
		arr[left] = arr[right];
		arr[right] = tmp;
		left++;
		right--;
	
	}
	printf("%s\n", arr);
	return 0;
}

2.字符串逆序(函数递归)

(1)首先观察主函数,arr数组本质上是首元素地址,因此将实参传入fun函数时,要取地址*;

(2)要将"abcdefg"实现倒序,逻辑上可先将a与g的位置调换,再将剩下的"bcdef"倒序。而要实现"bcdef"倒序,可先将b与f的位置调换,再将剩下的"cde"倒序......由此我们可以利用函数递归。即先将a的值(*str)暂时存放在tmp中,再将g(也就是*(str+len-1))放入原来a的位置(*str)。但是此时出现一个问题,假如我们接下来马上把a的值,赋入*(str+len-1)中,也就是赋入原来g所在的位置,等到下一次调用函数时,a会替代我们原本的f,与b交替位置。为了规避这个问题,我们暂缓a位置的摆放,而选择将"\n"放入*(str+len-1),同时要注意下一次调用fun函数时,参数要使用str+1(使得交换对象为b和f),调用完后,这时可以将a进行摆放;

(3)函数递归的使用要注意限制条件,避免形成死递归。我们的目的是将字符串进行倒序排列,一头一尾两两交换位置,因此只要未进行交换的字符串长度>=2, 我们的递归仍要进行。

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
void fun(char* str)
{
	char tmp = *str;
	int len = strlen(str);
	*str = *(str + len - 1);
	*(str + len - 1) = '\0';
	if (strlen(str + 1) >= 2)
	{
		fun(str + 1);
	}
		*(str + len - 1) = tmp;

}
int main()
{
	char arr[] = "abcdefg";
	fun(arr);
	printf("%s\n", arr);
	return 0;
}

3.a的b次方(函数递归)

(1)考虑b的大小(零,正, 负)对结果的影响,从而进行不同的运算

(2)b小于零时,要考虑函数pow(int a, int b)取值的范围,因为结果可能为小数,所以要用double类型进行命名。

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
double pow(int a, int b)
{
	if (b == 0)
		return 1;
	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);
	pow(a, b);
	double ret = pow(a, b);
	printf("%1f\n", ret);

	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值