5.14_练习

1、字符串逆序

编写一个函数reverse_string(char* string)(递归实现)

实现:将参数字符串中的字符反向排列,不是逆序打印

要求:不能使用C函数库中的字符串操作函数

比如:

char arr[ ]="abcdef";

逆序之后数组的内容变成:fedcba

第一次代码:

#include<stdio.h>
#include<string.h>
int main()
{
	char arr[] = "abcdef";
	int sz = sizeof(arr) / sizeof(arr[0]);
	int left = 0;//左下标
	//int right =sz-2 ;//右下标,要减去\0的个数,且下标是从0开始的,所以还得减一,所以是减2.
	int right = strlen(arr) - 1;
	while (left < right)
	{
		char tmp = arr[left];
		arr[left] = arr[right];
		arr[right] = tmp;
		left++;
		right--;
	}
	printf("%s\n", arr);
	return 0;
}

sizeof计算字符串包含\0;strlen计算字符串不包含\0,且还要包含头文件string.h。

sizeof不可以用在主函数之外;strlen可以用在主函数之外。

写成函数的方式:

#define _CRT_SECURE_NO_WARNINGS 1

#include<stdio.h>
#include<string.h>
void reverse(char arr[])
{
	//int sz = sizeof(arr) / sizeof(arr[0]);
	int left = 0;//左下标
	//int right =sz-2 ;//右下标,要减去\0的个数,且下标是从0开始的,所以还得减一,所以是减2.
	int right = strlen(arr) - 1;
	while (left < right)
	{
		char tmp = arr[left];
		arr[left] = arr[right];
		arr[right] = tmp;
		left++;
		right--;
	}
}

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

递归实现:

可以看成拆成两部分,假设是逆序abcdef,首先交换a和f的位置,再逆序bcde,然后再把bcde看成一个字符串,也就是逆序字符串bcde,交换b和e,再把cd看成一个字符串。。。。。。

1、设置一个中间变量tmp,把a传给tmp,f传给a,此时本来应该是把tmp里面的a传给f,但是如果把tmp里面的a传给f,中间的部分bcde就不能看成一个字符串了,因为字符串是以\0结束的,所以,应该是先把\0传给f,那从b开始,看到的bcde\0就是一个字符串了,这个时候从中间开始的字符串就又可以用reverse把它逆序了,把中间的逆序成edcb的时候,再把tmp里面的a拿上来放到这最开始f的地方。

还差个停止递归的条件,其实就是看最后中间字符串的长度。

#include<stdio.h>
#include<string.h>
void reverse(char* str)
{
	char tmp = *str;//1
	int len = strlen(str);//字符串长度
	*str = *(str + len - 1);//str + len - 1这是最后一个字符f的位置  ,2
	*(str + len - 1) = '\0';//3
	if(strlen(str+1)>=2)
		reverse(str + 1);//4
	*(str + len - 1) = tmp;//最后
}

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

题目中不能使用C函数,这里用了strlen,就自己实现一个。

参考答案:

#include<stdio.h>
#include<string.h>
int my_strlen(char* str)
{
	int count = 0;
	while (*str != '\0')
	{
		count++;
		str++;
	}
	return count;
}
void reverse(char* str)
{
	char tmp = *str;//1
	int len = my_strlen(str);//字符串长度
	*str = *(str + len - 1);//str + len - 1这是最后一个字符f的位置  ,2
	*(str + len - 1) = '\0';//3
	if(strlen(str+1)>=2)
		reverse(str + 1);//4
	*(str + len - 1) = tmp;//最后
}

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

如果参数给的多:

#include<stdio.h>
#include<string.h>
int my_strlen(char* str)
{
	int count = 0;
	while (*str != '\0')
	{
		count++;
		str++;
	}
	return count;
}
void reverse(char arr[], int left, int right)
{
	char tmp = arr[left];
	arr[left] = arr[right];
	arr[right] = tmp;
	if (left+1 < right-1)
		reverse(arr, left+1 , right-1);
}

int main()
{
	char arr[] = "abcdef";
	int left = 0;
	int right = my_strlen(arr) - 1;
	reverse(arr,left,right);
	printf("%s\n", arr);
	return 0;
}

2、计算和

计算一个数的每位之和(递归实现)

写一个递归函数DigitSum(n),输入一个非负整数,返回组成它的数字之和。

例如:调用DigitSum(1729),则应该返回1+7+2+9,它的和是19

输入:1729 ,输出:19

假设输入1234

那DigitSum(1234)的话,这个4很容易得到,那就把4拆出来,先算DigitSum(123)然后再加上4,

然后算DigitSum(12)再加上3加上4,再拆成DigitSum(1)+2+3+4,这个时候1没法拆了,它的每一位数之和就是它自己,

#include<stdio.h>
int DigitSum(unsigned int n)//1234
{
	if (n > 9)//这个n是两位数
		return DigitSum(n / 10) + n % 10;  //n/10去掉个位数,n%10就是得到n的个位数
	else
		return n;
}
int main()
{
	unsigned int n = 0;
	scanf("%u", &n);
	int sum=DigitSum(n);
	printf("%d\n", sum);
	return 0;
}

3、次方

递归实现n的k次方

题目:

编写一个函数实现n的k次方,使用递归实现。

#include<stdio.h>
//Pow(n,k)  ->n*Pow(n,k-1)
//k=0  => n=1
//k>0  => n=Pow(n,k)  ->n*Pow(n,k-1)
//k<0  =>1.0/Pow(n,-k) 
double Pow(int n, int k)
{
	if (k > 0)
		return n * Pow(n, k - 1);
	else if (k == 0)
		return 1;
	else
		return 1.0 / Pow(n, -k);
}
int main()
{
	int n = 0;
	int k = 0;
	scanf("%d%d", &n, &k);
	double ret=Pow(n,k);
	printf("%f\n", ret);
	return 0;
}

4、交换数组

将数组A中的内容和数组B中的内容进行交换。(数组一样大)

#include<stdio.h>
int main()
{
	int arr1[] = { 1,3,5,7,9 };
	int arr2[] = { 2,4,6,8,0 };
	int i = 0;
	int sz = sizeof(arr1) / sizeof(arr1[0]);
	for (i = 0; i < sz; i++)
	{
		int tmp=arr1[i];
		arr1[i] = arr2[i];
		arr2[i] = tmp;
	}
	for (i = 0; i < sz; i++)
	{
		printf("%d ", arr1[i]);
	}
	printf("\n");
	for (i = 0; i < sz; i++)
	{
		printf("%d ", arr2[i]);
	}
	return 0;
}

5、数组操作

创建一个整型数组,完成对数组的操作

1、实现函数init(),初始化数组全为0

2、实现print(),打印数组的每一个元素

3、实现reverse(),函数完成数组元素的逆置

要求:自己设计以上函数的参数,返回值

#include<stdio.h>
void init(int arr[], int sz)
{
	int i = 0;
	for (i = 0; i < sz; i++)
	{
		arr[i] = 0;
	}
}
void print(int arr[], int sz)
{
	int i = 0;
	for (i = 0; i < sz; i++)
	{
		printf("%d ", arr[i]);
	}
	printf("\n");
}
void reverse(int arr[], int sz)
{
	int left = 0;
	int right = sz - 1;
	while (left < right)
	{
		int tmp = arr[left];
		arr[left] = arr[right];
		arr[right] = tmp;
		left++;
		right--;
	}
}
int main()
{
	int arr[10] = { 1,2,3,4,5,6,7,8,9,0 };
	int sz = sizeof(arr) / sizeof(arr[0]);
	print(arr, sz);
	reverse(arr, sz);
	print(arr, sz);
	init(arr,sz);
	print(arr, sz);
	return 0;
}
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值