C语言-数组练习

1,字符串逆序(三种方法)

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

3,递归实现n的k次方

4,逗号表达式

5,sizeof和strlen的区别

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

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


1,字符串逆序(三种方法)

复制代码
#include<stdio.h>
#include<string.h>
//字符串逆序(递归实现)
//编写一个 reverse string(char* string)
//将参数字符串中的字符反向排列,不是逆序打印
//要求:不能使用c函数库中的字符串操作函数
//比如:
//          char arr[]="abcdef";
//逆序之后数组内容变为:
//          fedcba   
//三种方法
//方法一:
//int main() {
//	char arr[] = "abcdef";//[a b c d e f \0]
//	int sz = sizeof(arr) / sizeof(arr[0]);//注意如果用函数方式这句话要在main里面,不能出现在函数中,下面的可以应用
//	//或者
//	//int sz = strlen(arr) - 1;
//	int left = 0;
//	int right = sz - 2;//减去 \0;数组下标为0
//	while (left<right) {
//		char tmp = arr[left];
//		arr[left] = arr[right];
//		arr[right] = tmp;
//		left++;
//		right--;
//	}
//	printf("%s\n", arr);
//	return 0;
//}
//上面方法的函数方式
//void reverse(char arr[]) {
//	int sz = strlen(arr) - 1;//注意:int sz = sizeof(arr) / sizeof(arr[0]);这句话不能出现在这里
//	int left = 0;
//	int right = sz ;
//	while (left < right) {
//		char tmp = arr[left];
//		arr[left] = arr[right];
//		arr[right] = tmp;
//		left++;
//		right--;
//	}
//}
//int main() {
//	char arr[] = "abcdef";//[a b c d e f \0]
//	reverse(arr);
//	printf("%s\n", arr);
//	return 0;
//}

//方法二:递归实现
//不让使用c语言的库函数就自己写一个
//int my_strlen(char* str) {
//	int count = 0;
//	while (*str!='\0') {
//		count++;
//		str++;
//	}
//	return count;
//} 
//void reverse(char* str) {
//	//char* str 是指针变量,存的是数组的首地址;即指针str指向arr[0]
//	char tmp = *str;//1  指针指向的数组变量赋给临时变量tmp ,比如第一层递归arr[0]==a 赋给tmp
//	int len = my_strlen(str);//求数组元素的个数,为6
//	*str = *(str + len - 1);//2  (str + len - 1)指针第一层递归指的是arr[5]==f,赋给str指针指向的地方为arr[0]处
//	*(str + len - 1) = '\0';//3  为了便于递归,将(str + len - 1)指针指向的地方赋为 \0
//	if (my_strlen(str + 1) >= 2)//为了让递归停止,设的条件
//		reverse(str + 1);//4  开始递归
//	*(str + len - 1) = tmp; 
//}
//int main() {
//	char arr[] = "abcdef";//[a b c d e f \0]
//	/*int l = strlen(arr);
//	printf("%d\n", l);*/
//	reverse(arr);
//	printf("%s\n", arr);
//	return 0;
//}

//方法三,多参数递归
//void reverse(char arr[] ,int left,int right) {//此代码有bug  输出的是 efcdba
//	char tmp = arr[left];
//	arr[left] = arr[right];
//	arr[right] = tmp;
//	if (left < right)
//		reverse(arr, left + 1, right - 1);
//}

//改进后的版本
int my_strlen(char* str) {
	int count = 0;
	while (*str != '\0') {
		count++;
		str++;
	}
	return count;
}
void reverse(char arr[], int left, int right) {
	if (left < right) {
		char tmp = arr[left];
		arr[left] = arr[right];
		arr[right] = tmp;
		reverse(arr, left + 1, right - 1);
	}
}
int main() {
		char arr[] = "abcdef";//[a b c d e f \0]
		int left = 0;
		int right = my_strlen(arr) - 1;
		reverse(arr,left,right);
		printf("%s\n", arr);
		return 0;
	}

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

复制代码
#include<stdio.h>
#include<string.h>
//计算一个数的每位之和(递归实现)
//写一个递归函数DigitSum(n),输入一个非负整数,返回组成它的数字之和
//实现过程:
//DigitSum(1234)
//DigitSum(123)+4
//DigitSum(12)+3+4
//DigitSum(1)+2+3+4
int DigitSum(unsigned int n) {
	if (n>9)
	{
		return DigitSum(n / 10) + n % 10;
	}
	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次方

复制代码
#include<stdio.h>
#include<string.h>
//递归实现n的k次方
//Pow(n,k) -> n*Pow(n,k-1)
//k=0    1
//k>0 -> Pow(n,k) -> n*Pow(n,k-1)
//k<0 -> 1.0/(Pow(n,-k))  //注意此处的1.0
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("%lf\n", ret);
	return 0;
}

4,逗号表达式

复制代码
#include<stdio.h>
#include<string.h>
////逗号表达式
int main() {
	//int arr[] = { 1,2,(3,4),5 };//1,2,4,5
	//printf("%d\n", sizeof(arr));//16  每个元素四个字节,4个元素
	
	int num = 0;//num的类型是int
	int arr[10] = { 0 }; //arr的类型是int[10]
	printf("%d\n", sizeof(arr));
	printf("%d\n", sizeof(int [10]));
	return 0;
}

5,sizeof和strlen的区别

复制代码
#include<stdio.h>
#include<string.h>
//sizeof和strlen的区别
//sizeof是一个操作符
//是用来计算变量(类型)所占内存空间的大小,不关注内存中存放的内容
//单位是字节
//
//strlen
//strlen是一个库函数,是专门求字符串长度的,只能针对字符串
//从参数给定的地址向后一直找\0,统计\0之前出现的字符的个数
int main() {
	char str[] = "hello bit";
	//       [h e l l o _ b i t \0]
	printf("%d %d\n", sizeof(str), strlen(str));
	//                    10           9
	return 0;
}

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

复制代码
#include<stdio.h>
#include<string.h>
//将数组A中的内容和数组B中的内容进行交换 (数组一样大)
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]);
	}
}

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

复制代码
#include<stdio.h>
#include<string.h>
//创建一个整型数组,完成对数组的操作
//实现函数init()  初始化数组为全0
//实现print() 打印数组的每个元素
//实现reverse() 函数完成数组元素的逆置
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;
}
相关推荐
尘缘浮梦1 小时前
websockets处理流式接口
开发语言·python
识君啊1 小时前
Java 动态规划 - 力扣 零钱兑换与完全平方数 深度解析
java·算法·leetcode·动态规划·状态转移
xiaoye-duck2 小时前
《算法题讲解指南:优选算法-滑动窗口》--09长度最小的子数串,10无重复字符的最长字串
c++·算法
※DX3906※2 小时前
Java多线程3--设计模式,线程池,定时器
java·开发语言·ide·设计模式·intellij idea
froginwe112 小时前
Shell test 命令详解
开发语言
二年级程序员2 小时前
一篇文章掌握“双向链表”
c语言·数据结构·链表
沐知全栈开发2 小时前
jQuery 密码验证
开发语言
Frostnova丶2 小时前
LeetCode 762 二进制表示中质数个计算置位
算法·leetcode
WZ188104638692 小时前
LeetCode第367题
算法·leetcode