一、函数相关习题
1.使用递归实现 求 n 的 k 次方
#include <stdio.h>
int num_key(int n, int k)
{
if(k==0)
{
return 1; //递归出口,当指数==0,值==1
}
else
{
return n * num_key(n, k-1);//递归表达式,次方运算,底数不变,指数-1
}
}
int main(int argc, const char *argv[])
{
int num = 0, //定义并初始化一个底数
key = 0; //定义并初始化一个指数
printf("请输入一个底数和指数并用空格隔开:");
scanf("%d%d", &num, &key);
getchar();
printf("%d的%d次方的值为:%d\n", num, key, num_key(num, key));
return 0;
}
2.使用递归实现 strlen 的功能
#include <stdio.h>
#define MAX 20
//定义计算字符串实际长度的str_len()函数
int str_len(char * str)
{
if(*str=='\0')
{
return 0;
}
else
{
return 1 + str_len(++str);
}
}
//使用递归实现strlen的功能
int main(int argc, const char *argv[])
{
char str[MAX]=""; //初始化一个空字符串
printf("请输入一个字符串:");
gets(str);
//调用str_len()函数,输出str_len()的返回值,得到输入字符串的实际长度
printf("这个字符串的实际长度为:%d\n", str_len(str));
return 0;
}
3.使用递归实现汉诺塔问题
#include <stdio.h>
int hannuo(int n)
{
if(n==0)
{
//当汉诺塔层数为0,无需再移动,递归结束
return 0;
}
else
{
//当汉诺塔1层时,只需移动1次,就能完成
//当汉诺塔层数为2,只需移动1次(2次1层汉诺塔),就剩下一个1层汉诺塔
//当汉诺塔层数为3,只需移动5次(2次2层汉诺塔),就剩下一个2层汉诺塔
//当汉诺塔层数为n,只需移动2次n-1层汉诺塔,就剩下一个n-1层汉诺塔
return 2 * hannuo(n-1) + 1;
}
}
//使用递归实现汉诺塔问题
int main(int argc, const char *argv[])
{
int num = 0;
printf("请输入汉诺的层数:");
scanf("%d", &num);
printf("要完成该汉诺塔共需%d次移动\n", hannuo(num));
return 0;
}
4.定义一个函数将一个字符串从大到小排序
#include <stdio.h>
#define MAX 20
void str_sort(char *str)
{
char temp = "";
for(int i=0; i<strlen(str); i++)
{
for(int j=0; j<strlen(str)-i; j++)
{
//交换三部曲
if(str[j]<str[j+1])
{
temp = str[j];
str[j] = str[j+1];
str[j+1] = temp;
}
}
}
}
//定义一个函数将一个字符串从大到小排序
int main(int argc, const char *argv[])
{
char str[MAX] = "";
printf("请输入一个字符串:");
scanf("%s", str);
getchar();
//调用字符串排序函数
str_sort(str);
printf("这个字符串从大到小排序的结果为:\n%s\n", str);
return 0;
}
5.实现一个函数,用于检查一个字符串是否是回文字符串(正序和反序都相同)
#include <stdio.h>
#include <string.h>
#define MAX 20
char *huiwen(char *str)
{
//判断长度为l的字符串,只需判断到第l/2位
for(int i=0; i<strlen(str)/2; i++)
{
//在判断结束前,只需判定到正序和反序其中一对不相同,即可判定该字符串不是回文
if(str[i] != str[strlen(str)-i-1])
{
return "这不是一个回文字符串\n";
}
}
return "这是一个回文字符串\n";
}
//实现一个函数,用于检查一个字符串是否是回文字符串(正序和反序都相同)
int main(int argc, const char *argv[])
{
char str[MAX] = "";
printf("请输入一个字符串:");
scanf("%s",str);
//调用huiwen()函数,判断字符串是否是回文字符串
printf("%s",huiwen(str));
return 0;
}
6.使用指针完成判断自己的主机存储多字节整数时,是大端存储还是小端存储
#include <stdio.h>
//使用指针完成判断自己的主机存储多字节整数时,是大端存储还是小端存储
int main(int argc, const char *argv[])
{
int num = 48;
char* p = (char*)#
if(*p == '0')
{
printf("该主机是小端存储\n");
}
else
{
printf("该主机是大端存储\n");
}
return 0;
}
7.有一段文本,写一段程序统计其中的单词数。
例如:Do one thing at a time,and do well.
注意:单词间的间隔不一定是一个空格。
#include <stdio.h>
#include <string.h>
#define MAX 100
int word_count(char *text)
{
int count = 0;
for(int i=0; i<strlen(text); i++)
{
if(text[i]<'A' || text[i]>'Z' && text[i]<'a' || text[i]>'z')
{
//判断该字符是否为字母,如果不是,说明上一个单词遍历结束,单词数+1
count++;
}
}
//返回文本中的单词数
return count;
}
//写一段程序统计文本中的单词数
int main(int argc, const char *argv[])
{
char text[MAX] = "";
printf("请输入一段英文文本:\n");
gets(text);
printf("这段文本中的单词数为:%d\n",word_count(text));
return 0;
}