Bootstrap

作业7.11

练习题:

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

;