一、思维导图
二、课后练习
1> 使用递归实现 求 n 的 k 次方
#include<myhead.h>
int Pow(int n,int k)
{
if(k == 0 ) //递归出口
{
return 1;
}
else
{
return n*Pow(n,k-1); //递归主体
}
}
int main(int argc, const char *argv[])
{
int n=0,k=0;
printf("请输入n和k:");
scanf("%d%d",&n,&k);
int res = Pow(n,k);
printf("%d的%d次方:%d\n",n,k,res);
return 0;
}
2> 使用递归实现 strlen 的功能
#include<myhead.h>
#define Max_Size 100
int Strlen_Dig(char str[Max_Size])
{
char *ptr = str;
if(*ptr == '\0') //递归出口
{
return 0;
}
else
{
return Strlen_Dig(ptr+1)+1; //指针偏移
}
}
int main(int argc, const char *argv[])
{
while(1)
{
printf("请输入字符串:");
char str[Max_Size]; //定义字符数组
gets(str); //输入字符数组
int res = Strlen_Dig(str); //调用函数求数组长度
printf("字符串的长度为:%d\n",res);
}
return 0;
}
3> 使用递归实现汉诺塔问题
#include<myhead.h>
int Tower_Han(int n)
{
//递归出口
if(n == 1)
{
return 1;
}
else
return Tower_Han(n-1)*2+1;
}
int main(int argc, const char *argv[])
{
int n = 0;
printf("请输入汉诺塔的层数:");
scanf("%d",&n);
int res = Tower_Han(n);
printf("%d层汉诺塔需要移动%d次\n",n,res);
return 0;
}
4> 定义一个函数将一个字符串从大到小排序
#include<myhead.h>
#define Max_Size 100
void Sort_Str(char str[Max_Size])
{
char *ptr =str;
int len = strlen(str); //求字符串长度
//冒泡排序
for(int i=1;i<len;i++)
{
for(int j=0;j<len-i;j++)
{
if(*(ptr+j) < *(ptr+j+1)) //降序排序
{
char temp = *(ptr+j);
*(ptr+j) = *(ptr+j+1);
*(ptr+j+1) = temp;
}
}
}
}
int main(int argc, const char *argv[])
{
char str[Max_Size];
//输入字符数组
printf("请输入字符串");
gets(str);
//调用字符数组排序函数
Sort_Str(str);
//输出排序后的字符串
puts(str);
return 0;
}
5> 实现一个函数,用于检查一个字符串是否是回文字符串(正序和反序都相同)
#include<myhead.h>
#define Max_Size 100
void HuiWen(char str[Max_Size])
{
//定义指针变量指向字符数组首位
char *ptr = str;
//求字符串长度
int len = strlen(str);
//判断上是否为回文字符串
int i=0;
for(i=0;i<len/2;i++)
{
//判断字符串是否对称相等
if(*(ptr+i) == *(ptr+len-1-i))
continue;
else
break;
}
//通过i判断上述判断进行位置
if(i >= len/2)
printf("该字符串是回文字符串\n");
else
printf("该字符串不是回文字符串\n");
}
int main(int argc, const char *argv[])
{
//定义一位字符数组存储字符串
char str[Max_Size];
//输入字符数组
printf("请输入字符串:");
gets(str);
//调用函数判断
HuiWen(str);
return 0;
}
6> 使用指针完成判断自己的主机存储多字节整数时,是大端存储还是小端存储
#include<myhead.h>
int main(int argc, const char *argv[])
{
int n =1;
char *ptr = (char*)&n;
if(*ptr == 1)
printf("小端存储\n");
else
printf("大端存储\n");
return 0;
}
7> 有一段文本,写一段程序统计其中的单词数。例如:Do one thing at a time, and do well.
(注意:单词间的间隔不一定是一个空格。)
#include<myhead.h>
#define Max_size 100
//判断字符是否为空白字符
int isWhitespace(char c) {
return (c == ' ' || c == '\t' || c == '\n' || c == '\r');
}
// 判断字符是否为标点符号
int isPunctuation(char c) {
return (c == '.' || c == ',' || c == ';' || c == ':' || c == '!' || c == '?');
}
// 计算文本中的单词数
int Num_Word(const char* str) {
int inWord = 0;
int wordCount = 0;
while (*str) {
// 跳过空白字符和标点符号
while (isWhitespace(*str) || isPunctuation(*str)) {
str++;
}
if (*str) { // 如果不是字符串末尾
wordCount++; // 遇到单词的开始
inWord = 1;
// 继续往后找,直到遇到空白字符或标点符号
while (*str && !isWhitespace(*str) && !isPunctuation(*str)) {
str++;
}
}
}
return wordCount;
}
int main(int argc, const char *argv[])
{
//定义字符数组并输入
char str[Max_size];
printf("请输入字符串:");
gets(str);
//调用求单词数函数
int res = Num_Word(str);
printf("上述文本单词数量为:%d\n",res);
return 0;
}