//返回


第一题
/*    1、从键盘上输入一个五位数,对该数的五个数字进行从大到小排序,形成一个新的五位数输出。例如输入:35287,输出87523
    提示:对输入的五位数分解出每一位,放在一个数组中,然后按降序排序,排好后,再组合成一个5位数输出。
*/   
/*****************************************************************/
#include <stdio.h>
int main()
{
int num; //输入的五位数
int digits[5]; //存储每个数字
int i, j, temp; //循环变量和临时变量

printf("请输入一个五位数:\n");
scanf_s("%d", &num);

//将每个数字存入数组
for (i = 0; i < 5; i++)
{
    digits[i] = num % 10;
    num /= 10;
}

//对数组进行冒泡排序,从大到小
for (i = 0; i < 4; i++)
{
    for (j = 0; j < 4 - i; j++)
    {
        if (digits[j] < digits[j + 1])
        {
            temp = digits[j];
            digits[j] = digits[j + 1];
            digits[j + 1] = temp;
        }
    }
}

//将排序后的数组重新组合成一个数
num = 0;
for (i = 0; i < 5; i++)
{
    num = num * 10 + digits[i];
}

//输出结果
printf("排序后的五位数是:%d\n", num);

return 0;
}

第二题
/*2、将一个2×3的矩阵进行转置,并输出一个3×2的矩阵。
提示:int a[2][3]={1,2,3,4,5,6};
      Int b[3][2];
     对于a数组中一个元数a[i][j], 赋值给b[j][i]
*/
/*****************************************************************/
#include <stdio.h>

int main()
{
    int a[2][3] = { 1, 2, 3, 4, 5, 6 }; //原始矩阵
    int b[3][2]; //转置后的矩阵
    int i, j; //循环变量
    
    //对于a数组中的每个元素,赋值给b数组中对应的位置
    for (i = 0; i < 2; i++)
    {
        for (j = 0; j < 3; j++)
        {
            b[j][i] = a[i][j];
        }
    }
    
    //输出转置后的矩阵
    printf("转置后的矩阵是:\n");
    for (i = 0; i < 3; i++)
    {
        for (j = 0; j < 2; j++)
        {
            printf("%d ", b[i][j]);
        }
        printf("\n");
    }
    
    return 0;
}

第三题
/*3、输入一字符串,统计出其数字字符的个数。*/
/*****************************************************************/
#include <stdio.h>
#include <string.h>

int main()
{
char str[100]; //输入的字符串
int len; //字符串的长度
int i; //循环变量
int count = 0; //数字字符的个数

printf("请输入一个字符串:\n");
scanf("%s", str);

//获取字符串的长度
    len = strlen(str);

    //遍历字符串中的每个字符,判断是否是数字字符
    for (i = 0; i < len; i++)
    {
        if (str[i] >= '0' && str[i] <= '9')
        {
            count++; //如果是数字字符,计数器加一
        }
    }

    //输出结果
    printf("字符串中的数字字符个数是:%d\n", count);

    return 0;
}

第四题
/*4、输入一英文句子,分解出每一个单词。例如:I am a studengt,分解出4个单词并输出
提示:char str[100],danc[20];gets(str);i=j=0;
      While(str[i]!=’ ‘&&str[i]!=’\0’){danc[j++]=str[i];i++}
      Danc[j]=’\0’;puts(danc);j=0;
*/
/*****************************************************************/
#include <stdio.h>
#include <ctype.h>
//判断是否是分隔符
int isdelimeter(char ch) {
    return ispunct(ch) || isspace(ch); //使用ispunct和isspace函数
}
//提取单词
char* get_token(char* buf, char* token) { //使用指针参数和返回值
    while (*buf != '\0' && isdelimeter(*buf)) buf++; //跳过分隔符
    while (*buf != '\0' && !isdelimeter(*buf)) { //提取单词
        *token = *buf;
        buf++;
        token++;
    }
    *token = '\0'; //添加结束符
    return buf; //返回下一个位置
}
int main() {
    char str[100]; //存储输入的句子
    char token[80]; //存储单词
    char* p; //指向句子中的位置
    int count = 0; //记录单词个数
    printf("请输入一个英文句子:\n");
    fgets(str, 100, stdin); //使用fgets函数读入句子,直到遇到换行符或者达到最大长度
    p = str; //初始化p指向句子开头
    while (*p != '\0') { //循环提取单词
        p = get_token(p, token); //调用提取单词函数,返回下一个位置
        if (*token != '\0') { //如果单词不为空,输出并计数
            printf("%s\n", token);
            count++;
        }
    }
    printf("单词个数 = %d\n", count); //输出单词个数
    return 0;
}

第五题
/*5、编写一个求N!的函数:int fact(int n){....},主函数通过调用这个函数求8 之内的偶数阶乘之和。*/
/*****************************************************************/
#include <stdio.h>
//定义一个求n的阶乘的函数,使用递归的方法
int fact(int n) {
    if (n == 1) return 1; //递归的基准情况
    else return n * fact(n - 1); //递归的一般情况
}
//定义主函数
int main() {
    int n; //输入的n值
    int sum = 0; //阶乘之和
    printf("请输入一个正整数:\n");
    scanf("%d", &n); //读入n
    if (n > 8) n = 8; //如果n大于8,就取8
    for (int i = 2; i <= n; i += 2) { //从2开始,每次增加2,直到n或者8为止
        sum += fact(i); //调用fact函数,将返回值加到sum上
    }
    printf("8之内的偶数阶乘之和为:%d\n", sum); //输出sum
    return 0;
}