目录
5、实现一个函数,用于检查一个字符串是否是回文字符串(正序和反序都相同)
6、 使用指针完成判断自己的主机存储多字节整数时,是大端存储还是小端存储
7、有一段文本,写一段程序统计其中的单词数。例如:Do one thing at a time.and do well.
1、 使用递归实现 求 n 的 k 次方
#include<stdio.h>
int fun1(int n,int k)
{
if(k == 0) //当k == 0的时候终止循环返回
{
return 1;
}
else
{
return n * fun1(n,k-1); //每次k都要减一
}
}
int main(int argc, char const *argv[])
{
int n = 0,k = 0;
printf("请输入你需要求的n和k:");
scanf("%d %d",&n,&k);
int retval = fun1(n,k);
printf("%d的%d次方是:%d\n",n,k,retval);
return 0;
}
输出结果如下:
心得:一开始在写第10行时,进行了k--,会导致k的取值一直返回而不进行改变,会导致函数一直循环,出现段错误。需要使用k = k - 1的赋值语句才可。
2、使用递归实现 strlen 的功能
#include<stdio.h>
int fun(char arr[])
{
if(*arr == '\0') //当地址移动到最后一位时候,为终止符,顾返回0结束
{
return 0;
}
else
{
return 1 + fun(arr + 1); //地址后移
}
}
int main(int argc, char const *argv[])
{
char arr[30] = {""};
printf("请输入需要判断长度的字符串:");
gets(arr);
int retval = fun(arr);
printf("该字符串的长度是:%d\n",retval);
return 0;
}
输出结果如下:
3、使用递归实现汉诺塔问题(君子作业)
#include<stdio.h>
#include<math.h>
//1块->1次 2块->3次 3块->7次 n块->2^n-1次
int fun(int n)
{
if(n == 1) //当运行到n=1的时候返回0,结束递归
{
return 1;
}
else
{
return pow(2,n-1) + fun(n-1); //依次加上前面的次数,如输入3,则算2^2 + fun(2) = 2^2 + 2^1 + fun(1) = 2^2 + 2^1 + 1 = 4 + 2 + 1 = 7;
}
}
int main(int argc, char const *argv[])
{
int n = 0;
printf("请输入你的汉诺塔层数:");
scanf("%d",&n);
int retval = fun(n);
printf("该汉诺塔需要%d次才能完成换柱\n",retval);
return 0;
}
输出结果如下:
4、定义一个函数将一个字符串从大到小排序
#include<stdio.h>
#include<string.h>
char* fun(char *arr)
{
int len = strlen(arr); //计算arr的长度
for(int i = 0;i < len;i++) //冒泡排序,升序
{
for(int j = 0;j < len - i;j++)
{
if(arr[j] < arr[j+1])
{
arr[j] = arr[j] ^ arr[j+1];
arr[j+1] = arr[j] ^ arr[j+1];
arr[j] = arr[j] ^ arr[j+1];
}
}
}
return arr;
}
int main(int argc, char const *argv[])
{
char arr[30] = {""};
printf("请输入一串字符:");
gets(arr);
char *retarr = fun(arr); //函数返回值是一个指针类型,顾需要定义一个指针类型的来进行接收
printf("排序后的结果是:");
puts(retarr);
return 0;
}
输出结果如下:
5、实现一个函数,用于检查一个字符串是否是回文字符串(正序和反序都相同)
#include<stdio.h>
#include<string.h>
void *fun(char *arr)
{
int len = strlen(arr);
int flag = 0;
for(int i = 0;i < len / 2;i++)
{
if(arr[i] != arr[len - 1 - i])
{
flag += 1;
}
}
if(flag != 0)
{
printf("该字符串不是回文字符串\n");
}
else
{
printf("该字符串是回文字符串\n");
}
}
int main(int argc, char const *argv[])
{
char arr[30] = {""};
printf("请输入一串字符:");
gets(arr);
fun(arr);
return 0;
}
输出结果如下:
6、 使用指针完成判断自己的主机存储多字节整数时,是大端存储还是小端存储
#include <stdio.h>
int main() {
int test = 0x12345678; // 定义一个测试整数
char *p= (char*)&test; // 将整数的地址转换为指向字符的指针
// 打印出整数的字节表示
printf("0x12345678 的字节序为:");
printf("%0x", p[0]);
if (*p == 0x12) { // 如果第一个字节是 0x12
printf("\n主机是大端存储。\n");
} else {
printf("\n主机是小端存储。\n");
}
return 0;
}
输出结果如下:
7、有一段文本,写一段程序统计其中的单词数。例如:Do one thing at a time.and do well.
注意:单词间的间隔不一定是一个空格。
#include<stdio.h>
int main(int argc, char const *argv[])
{
char arr[100] = {""};
printf("请输入一段英文文本:");
gets(arr);
char *p = arr;
int flag = 1;
while(*p)
{
if(!((*p >= 'a' && *p <= 'z') || (*p >= 'A' && *p <= 'Z')))
{
flag++;
}
p++;
}
printf("该文本内有%d个单词\n",flag);
return 0;
}
输出结果如下: