练习题:
1.使用递归实现 求 n的k次方
#include <stdio.h>
int sqr_k(int a,int b)
{
if(b==0)
{
return 1;
}
else
{
return a*sqr_k(a,b-1);
}
}
int main(int argc, char const *argv[])
{
int n=0,k=0;
printf("请输入:");
scanf("%d %d",&n,&k);
printf("%d\n",sqr_k(n,k));
return 0;
}
2.使用递归实现 strlen 的功能
#include <stdio.h>
int strlen_1(char *p)
{
if(*p=='\0') //取值运算
{
return 0;
}
else
{
return 1+strlen_1(p+1); //指针偏移
}
}
int main(int argc, char const *argv[])
{
char str[20]={""};
printf("请输入一个字符串:");
gets(str);
printf("字符串实际长度为:%d\n",strlen_1(str));
return 0;
}
3.使用递归实现汉诺塔问题
#include <stdio.h>
unsigned long long hannuo(int n)
{
if(n==1)
{
return 1;
}
else
{
return 2*hannuo(n-1)+1;
}
}
int main(int argc, char const *argv[])
{
int n=0;
printf("输入汉诺塔层数:");
scanf("%d",&n);
printf("需要%llu步\n",hannuo(n));
return 0;
}
4.定义一个函数将一个字符串从大到小排序
#include <stdio.h>
#include <string.h>
void sort_char(char * str,int n)
{
for(int i=1;i<n;i++)
{
for(int j=0;j<n-i;j++)
{
if(str[j] < str[j+1])
{
char temp=str[j];
str[j]=str[j+1];
str[j+1]=temp;
}
}
}
printf("排序完成\n");
}
int main(int argc, char const *argv[])
{
char str[20]={""};
printf("请输入一个字符串:");
gets(str);
sort_char(str,strlen(str));
printf("%s\n",str);
return 0;
}
5.实现一个函数,用于检查一个字符串是否是回文字符串(正序和反序都相同)
#include <stdio.h>
#include <string.h>
void huiwen(char str[],int n)
{
int flag=0;
for(int i=0;i<n/2;i++)
{
if(str[i]!=str[n-i-1])
{
flag=0;
break;
}
else
{
flag=1;
}
}
if(flag==1)
{
printf("是回文字符串\n");
}
else
{
printf("不是回文字符串\n");
}
}
int main(int argc, char const *argv[])
{
char str[20]={""};
printf("请输入一个字符串:");
gets(str);
huiwen(str,strlen(str));
return 0;
}
6.使用指针完成判断自己的主机存储多字节整数时,是大端存储还是小端存储
#include <stdio.h>
int main(int argc, char const *argv[])
{
int n=0x12345678;
char * p=&n;
if(*p==0x78)
{
printf("小端存储\n");
}
else if(*p==0x12)
{
printf("大端存储\n");
}
printf("%#x\n",*p);
return 0;
}
7.有一段文本,写一段程序统计其中的单词数。
例如:Do one thing at a time, and do well.注意:单词间的间隔不一定是一个空格。
方法一:
#include <stdio.h>
#include <string.h>
int tongji(char txt[],int n)
{
int count=0; //用于单词个数计数
int flag=0;
for(int i=0;i<=n;i++) //i<=n,使'\0'进入循环
{
if(!((txt[i]>='a' && txt[i]<='z') || (txt[i]>='A' && txt[i]<='Z')))
{
if(flag==1) //当前一个元素是字母,此时遇到非字母元素时,代表一个单词结束
{
count++; //单词计数自增
}
else if(txt[i]=='\0' && flag==0) //用于字符串结尾是字母时判断
{ //当前一个元素是字母,且当前元素是'\0'时,代表一个单词结束
count++; //单词计数器自增
}
flag=0; //flag置0,表示前一个元素不是字母
}
else
{
flag=1; //flag置1,表示前一个元素是字母
}
}
return count;
}
int main(int argc, char const *argv[])
{
char txt[100]={"Do one thing at a time, and do well"};
printf("共有%d个单词\n",tongji(txt,strlen(txt)));
return 0;
}
方法二:
#include <stdio.h>
#include <string.h>
int tongji(char txt[],int n)
{
int count=0; //用于单词个数计数
for(int i=0;i<=n;i++)
{
if(((txt[i]>='a' && txt[i]<='z') || (txt[i]>='A' && txt[i]<='Z')) && !((txt[i+1]>='a' && txt[i+1]<='z') || (txt[i+1]>='A' && txt[i+1]<='Z')))
{
count++;
}
}
return count;
}
int main(int argc, char const *argv[])
{
char txt[100]={"Do one thing at a time, and do well"};
printf("共有%d个单词\n",tongji(txt,strlen(txt)));
return 0;
}