#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;
}