【C++ 程序设计】实战:C++ 实践练习题(21~30)

目录

21. 计算并输出 1 到 9 之间奇数之和

22. 多层嵌套计算

23. 循环结构:打印变量 a、b、c

24. 函数调用:全局变量、局部变量

25. 找到数组中不等于最大值和最小值的元素

26. 计算:平方根、平方、立方根、立方

27. 找出三个整型数中的最大值

28. 初始化一个 5x5 的二维数组 a,根据表达式 (i + 1) * (j + 1) 将数组元素设置为 i * j,然后按矩阵形式输出这个二维数组

29. 统计字符的个数并保存进文件中

30. 递归方法:计算从 0 到 10 的阶乘



21. 计算并输出 1 到 9 之间奇数之和

#include <iostream>

int main()
{
    int i, s = 0;

    // 循环从1到9,每次增加2
    for (i = 1; i < 10; i += 2)
    {
        // 将 i+1 的值加到变量 s 上
        s += i + 1;
    }

    // 输出变量 s 的值
    printf("%d\n", s);

    return 0;
}

【代码详解】

  • 这段代码的作用是计算并输出 1 到 9 之间(包括 1 和 9)的奇数之和。、
  1. 包含头文件 <iostream>,这是用于输入输出流的标准 C++ 头文件。在这个代码里没有直接使用,可以省略。

  2. main() 函数是 C++ 程序的入口函数。

  3. 声明了两个整型变量 i 和 s,并将 s 初始化为 0。

  4. for 循环语句初始化 i = 1,设置循环条件 i < 10,每次迭代增加 2

  5. 循环体内的语句 s += i + 1 将迭代变量 i 加 1 的结果加到 s 上,相当于将奇数加到 s 中。

  6. printf("%d\n", s); 使用 printf 函数输出 s 的值,并换行。

  7. 返回 0,表示程序正常运行结束。

【计算过程】

  1. 代码执行结果为 30
  2. 原因是在循环中,变量 i 从 1 开始,每次增加 2,所以循环的迭代包括了 1, 3, 5, 7, 9 这五个奇数。
  3. 在循环体内部,将 i+1 的值加到变量 s 上,即 s += i + 1
  4. 所以循环体执行过程如下:
  • 第一次迭代,i=1,将 1+1=2 加到 s 上,s 变为 2
  • 第二次迭代,i=3,将 3+1=4 加到 s 上,s 变为 6
  • 第三次迭代,i=5,将 5+1=6 加到 s 上,s 变为 12
  • 第四次迭代,i=7,将 7+1=8 加到 s 上,s 变为 20
  • 第五次迭代,i=9,将 9+1=10 加到 s 上,s 变为 30

【执行结果】

30


22. 多层嵌套计算

#include <iostream>

int main()
{
    int x = 15, y = 21, z = 0;

    // 根据 x 对 3 取余数进行判断
    switch (x % 3)
    {
        case 0: 
            z++; // 如果余数为 0,z 的值加 1
            break;
        case 1: 
            z++; // 如果余数为 1,z 的值加 1

            // 根据 y 对 2 取余数进行判断
            switch (y % 2)
            {
                default: 
                    z++; // 如果余数不是 0,z 的值加 1
                case 0: 
                    z++; // 如果余数为 0,z 的值加 1
                    break;
            }
    }
    printf("%d\n", z); // 输出变量 z 的值

    return 0;
}

【代码详解】

  • 这段代码的功能是根据给定的 x 和 y 的值,通过多层嵌套的 switch 语句来计算变量 z 的值,并将其输出。
  1. 包含头文件 <iostream>,这是用于输入输出流的标准 C++ 头文件。在这个代码里没有直接使用,可以省略。

  2. main() 函数是 C++ 程序的入口函数。

  3. 声明了三个整型变量 xy 和 z,并将分别赋值为 1521 和 0

  4. 第一个 switch 语句根据 x 对 3 取余数进行判断。

  5. 在第一个 switch 语句中,使用 case 语句根据余数的不同执行相应的操作。

  6. 如果余数为 0,执行 case 0,将 z 的值加 1

  7. 如果余数为 1,执行 case 1,将 z 的值加 1,然后进入另一个嵌套的 switch 语句。

  8. 第二个 switch 语句根据 y 对 2 取余数进行判断。

  9. 在第二个 switch 语句中,使用 case 语句根据余数的不同执行相应的操作。

  10. 如果余数不是 0,执行 default(默认),将 z 的值加 1

  11. 如果余数为 0,执行 case 0,将 z 的值加 1

  12. 最后,使用 printf 函数输出变量 z 的值。

【执行结果】

  • 执行结果为 1
  • 假设 x = 15,对 x 取余数得到 0。因此不执行 case 1 的代码。执行 case 0 的代码,将 z 的值加 1,此时 z = 1
  • 然后打印 z 的值,输出为 1
  • 因此,最终输出的结果是 1
1


23. 循环结构:打印变量 a、b、c

#include <iostream>

int main()
{
    int a = 0, b = 5, c = 3;
    
    while (c > 0 && a < 5)
    {
        b = b - 1;  // 将 b 的值减 1
        ++a;        // 将 a 的值加 1
        c--;        // 将 c 的值减 1
    }
    
    printf("%d, %d, %d\n", a, b, c);  // 输出变量 a、b、c 的值
    
    return 0;
}

【代码详解】

  • 这段代码的功能是根据给定的初始值,依次执行循环内的操作,并将最终的变量 a、b、c 的值打印出来。
  1. 包含头文件 <iostream>,这是用于输入输出流的标准 C++ 头文件。在这个代码里没有直接使用,可以省略。

  2. main() 函数是 C++ 程序的入口函数。

  3. 声明了三个整型变量 abc,并分别赋值为 053

  4. while 循环语句的循环条件是 c > 0 && a < 5,只要 c 大于 0 并且 a 小于 5,就会执行循环体内的操作。

  5. 在循环体内,b 的值减 1,相当于将 b 减 1

  6. ++a 表示将 a 的值加 1

  7. c-- 表示将 c 的值减 1

  8. 当循环条件不再满足时,跳出循环。

  9. 使用 printf 函数打印输出变量 abc 的值。

【执行结果】

  1. 执行结果根据初始值的不同而有所变化,具体结果取决于 ab 和 c 的最终值。

  2. 例如,如果循环体被执行了 3 次,那么输出结果可能是 3, 2, 0

3, 2, 0


24. 函数调用:全局变量、局部变量

#include <iostream>

int z = 5;  // 全局变量 z

void f()
{
    static int x = 2;  // 静态局部变量 x,只会初始化一次
    int y = 5;         // 局部变量 y

    x = x + 2;    // x 的值加 2
    z = z + 5;    // z 的值加 5
    y = y + z;    // y 的值加上 z 的值

    printf("%5d%5d\n", x, z);  // 输出变量 x 和 z 的值
}

int main()
{
    static int x = 10;  // 静态局部变量 x,只会初始化一次
    int y;

    y = z;  // 将全局变量 z 的值赋给局部变量 y

    printf("%5d%5d\n", x, z);  // 输出变量 x 和 z 的值
    f();  // 调用函数 f()
    printf("%5d%5d\n", x, z);  // 输出变量 x 和 z 的值
    f();  // 再次调用函数 f()

    return 0;
}

【代码详解】

  • 这段代码使用了全局变量和局部变量,并展示了函数的调用。
  1. 声明了一个全局变量 z,初始值为 5

  2. 定义了函数 f()

  3. 在 f() 函数内部,声明了一个静态局部变量 x,初始值为 2,静态局部变量只会初始化一次。

  4. 在 f() 函数内部,声明了一个局部变量 y,初始值为 5

  5. 在 f() 函数内部,对静态局部变量 x 进行操作,将其值加 2

  6. 在 f() 函数内部,对全局变量 z 进行操作,将其值加 5

  7. 在 f() 函数内部,对局部变量 y 进行操作,将其值加上全局变量 z 的值。

  8. 使用 printf 函数打印输出变量 x 和 z 的值。

  9. 定义了 main() 函数。

  10. 在 main() 函数内部,定义了一个静态局部变量 x,初始值为 10,静态局部变量只会初始化一次。

  11. 在 main() 函数内部,声明了一个局部变量 y

  12. 将全局变量 z 的值赋给局部变量 y

  13. 使用 printf 函数打印输出变量 x 和 z 的值。

  14. 调用函数 f()

  15. 使用 printf 函数打印输出变量 x 和 z 的值。

  16. 再次调用函数 f()

【执行结果

   10    5
    4   10
   10   10
    6   15


25. 找到数组中不等于最大值和最小值的元素

#include <iostream>

struct prob
{
    const char* a;  // 字符串类型改为 const char* 类型
    int b;
} x[] = {
   
   {"Zhang San", 19}, 
         {"Li Si", 21}, 
         {"Wang Wu", 20}};

int main()
{
    int i, m1, m2;
    m1 = m2 = x[0].b;  // 初始化 m1 和 m2 为数组第一个元素的 b 值
    
    for (i = 1; i < 3; i++)
    {
        if (x[i].b > m1)
            m1 = x[i].b;  // 更新 m1 为更大的 b 值
        else if (x[i].b < m2)
            m2 = x[i].b;  // 更新 m2 为更小的 b 值
    }
    
    for (i = 0; i < 3; i++)
    {
        if (x[i].b != m1 && x[i].b != m2)
        {
            printf("%s:%d\n", x[i].a, x[i].b);  // 输出不等于 m1 和 m2 的元素的 a 和 b 值
            break;
        }
    }
    
    return 0;
}

【代码详解】

  • 代码的功能是找到数组中不等于最大值和最小值的元素,并将其输出。
  • 请注意,为了使用 printf 函数,需要包含适当的头文件 <stdio.h> 或 <cstdio>
  1. 定义了一个名为 prob 的结构体,其中包括一个 const char* 类型的字符串指针 a 和一个整型变量 b

  2. 创建一个 prob 结构体类型的数组 x,并对其进行初始化,数组中的每个元素包括一个字符串和一个整数。

  3. 在 main 函数中,声明了一些整型变量 im1 和 m2

  4. 将数组第一个元素的 b 值分别赋给 m1 和 m2,即初始化 m1 和 m2

  5. 使用 for 循环遍历数组,从索引为 1 的元素开始,依次判断每个元素的 b 值是否比 m1 大,如果是,则更新 m1 为该值;如果不是,则判断是否比 m2 小,如果是,则更新 m2 为该值。

  6. 使用另外一个 for 循环遍历数组,与之前的循环类似,但这次是用来查找不等于 m1 和 m2 的元素。当找到符合条件的元素时,使用 printf 函数将其对应的 a 和 b 值打印输出,并使用 break 终止循环。

  7. 最后,返回整数值 0 表示程序执行成功结束。

【执行结果】

  • 执行结果将输出不等于最大值 m1 和最小值 m2 的元素的 a 和 b 值。
  • 由于数组 x 中的元素顺序是固定的,可以确定 m1 和 m2 的值,然后在循环中找到不等于这两个值的元素进行输出。
  • 根据数组的初始化,m1 的初始值为 21m2 的初始值为 19。根据代码逻辑,应该输出 Wang Wu:20,这是因为它是唯一一个既不等于 m1 也不等于 m2 的元素。
Wang Wu:20


26. 计算:平方根、平方、立方根、立方

【题目】 为实型变量 x 输入一个值后,输出 x 的值、x 的平方根、x 的平方、x 的立方根和 x的立方。

#include <iostream> // 输入输出流头文件
#include <cmath>    // 数学函数头文件

int main() {
    double x;
    std::cout << "请输入实数 x 的值:"; // 提示用户输入实数 x 的值
    std::cin >> x; // 从用户输入读取实数 x 的值

    double squareRoot = std::sqrt(x); // 计算 x 的平方根
    double square = std::pow(x, 2);   // 计算 x 的平方
    double cubeRoot = std::cbrt(x);   // 计算 x 的立方根
    double cube = std::pow(x, 3);     // 计算 x 的立方

    std::cout << "x 的值:" << x << std::endl;                      // 输出 x 的值
    std::cout << "x 的平方根:" << squareRoot << std::endl;         // 输出 x 的平方根
    std::cout << "x 的平方:" << square << std::endl;               // 输出 x 的平方
    std::cout << "x 的立方根:" << cubeRoot << std::endl;           // 输出 x 的立方根
    std::cout << "x 的立方:" << cube << std::endl;                 // 输出 x 的立方

    return 0; // 程序执行完毕,返回 0 表示成功
}

【代码详解】

  • 代码的功能是:用户输入一个实数 x 的值,然后计算并输出 x 的值、平方根、平方、立方根和立方。
  • 代码中使用了 cmath 头文件中的函数 sqrt()pow() 和 cbrt() 来计算平方根、幂和立方根。
  • 请注意,为了使用输入输出流和数学函数,需要包含适当的头文件 <iostream> 和 <cmath>
  1. 包含了 <iostream> 和 <cmath> 两个头文件,分别用于输入输出流和数学函数的声明。

  2. 在 main 函数中声明了一个 double 类型的变量 x,用于存储用户输入的实数值。

  3. 使用 std::cout 输出提示信息,要求用户输入实数 x 的值。

  4. 使用 std::cin 从用户输入读取实数 x 的值,并将其存储到变量 x 中。

  5. 声明了四个 double 类型的变量 squareRootsquarecubeRoot 和 cube,用于保存计算结果。

  6. 使用 std::sqrt(x) 计算 x 的平方根,并将结果赋给 squareRoot

  7. 使用 std::pow(x, 2) 计算 x 的平方,并将结果赋给 square

  8. 使用 std::cbrt(x) 计算 x 的立方根,并将结果赋给 cubeRoot

  9. 使用 std::pow(x, 3) 计算 x 的立方,并将结果赋给 cube

  10. 使用 std::cout 输出 x 的值、平方根、平方、立方根和立方,分别带有相应的提示信息。

  11. 返回整数值 0 表示程序执行成功结束。

【执行结果】

  • 键盘输入示例:
    请输入实数 x 的值:5.7
  • 执行结果输出示例:
    x 的值:5.7
    x 的平方根:2.38747
    x 的平方:32.49
    x 的立方根:1.78632
    x 的立方:185.193


27. 找出三个整型数中的最大值

【题目】输入三个整型数,找出其中数值最大者并输出。

#include <iostream>

int main() {
    int a, b, c;

    std::cout << "请输入三个整数: ";  // 提示用户输入三个整数
    std::cin >> a >> b >> c;        // 从用户输入读取三个整数

    int max = a;  // 假设第一个整数 a 是最大值

    if (b > max) {
        max = b;  // 如果第二个整数 b 大于当前最大值,则更新最大值为 b
    }

    if (c > max) {
        max = c;  // 如果第三个整数 c 大于当前最大值,则更新最大值为 c
    }

    std::cout << "最大值是: " << max << std::endl;  // 输出最大值

    return 0;  // 程序执行完毕,返回 0 表示成功
}

【代码详解】

  • 代码的功能是:用户输入三个整数,通过比较找出其中的最大值,并将其输出。
  • 请注意,代码中使用了三个变量 abc 分别表示输入的三个整数,并使用 if 条件语句和比较操作符 > 来判断最大值。
  1. 包含了 <iostream> 头文件,用于输入输出流的声明。

  2. 在 main 函数中声明了三个整数变量 abc,用于存储用户输入的三个整数值。

  3. 使用 std::cout 输出提示信息,要求用户输入三个整数。

  4. 使用 std::cin 从用户输入读取三个整数,并分别将它们存储到变量 abc 中。

  5. 声明了一个整数变量 max,并将其初始值设为 a,即假设第一个整数 a 是最大值。

  6. 使用 if 条件语句和比较操作符 > 对变量 max 进行更新:

    • 如果第二个整数 b 大于当前最大值 max,则将 max 更新为 b
    • 如果第三个整数 c 大于当前最大值 max,则将 max 更新为 c
  7. 使用 std::cout 输出最大值,并附带相应的提示信息。

  8. 返回整数值 0 表示程序执行成功结束。

【执行结果】

  • 键盘输入示例:
请输入三个整数: 55 329 2
  • 执行结果输出示例:
最大值是: 329


28. 初始化一个 5x5 的二维数组 a,根据表达式 (i + 1) * (j + 1) 将数组元素设置为 i * j,然后按矩阵形式输出这个二维数组

【题目】使用二维数组形成并按下列形式输出数据

#include <stdio.h>

int main()
{
    int i, j, a[5][5];

    // 使用两层循环初始化二维数组 a
    for (i = 0; i < 5; i++)
        // 在两层循环中,使用表达式 (i + 1) * (j + 1) 将数组元素的值进行初始化,即将数组中的每个元素设置为 i * j。
        for (j = 0; j < 5; j++) a[i][j] = (i + 1) * (j + 1);  

    // 输出二维数组 a 的元素
    for (i = 0; i < 5; i++)
    {
        // 使用 printf("%2d ", a[i][j]) 来输出二维数组 a 中的元素,其中 %2d 表示输出一个两位数的整数,并用空格进行对齐。
        for (j = 0; j < 5; j++) printf("%2d ", a[i][j]); 
        // 在每一行输出结束之后,使用 printf("\n") 来换行,使输出结果呈现矩阵的形式。
        printf("\n"); 
    }

    return 0;
}

【代码详解】

  • 代码的功能是:初始化一个 5x5 的二维数组 a,根据表达式 (i + 1) * (j + 1) 将数组元素设置为 i * j,然后按矩阵形式输出这个二维数组。
  1. 包含了 <stdio.h> 头文件,用于标准输入输出函数的声明。

  2. 在 main 函数中声明了三个整数变量 ija[5][5]

  3. 使用两个嵌套的循环,对二维数组 a 进行初始化:

    • 外层循环控制行数,变量 i 的初始值为 0,每次循环增加 1,循环条件为 i < 5
    • 内层循环控制列数,变量 j 的初始值为 0,每次循环增加 1,循环条件为 j < 5
    • 在内层循环中,使用表达式 (i + 1) * (j + 1) 将数组元素的值进行初始化,即将数组中的每个元素设置为 i * j
  4. 使用两个嵌套的循环,输出二维数组 a 的元素:

    • 外层循环控制行数,变量 i 的初始值为 0,每次循环增加 1,循环条件为 i < 5
    • 内层循环控制列数,变量 j 的初始值为 0,每次循环增加 1,循环条件为 j < 5
    • 在内层循环中,使用 printf("%2d ", a[i][j]) 来输出二维数组 a 中的元素,其中 %2d 表示输出一个两位数的整数,并用空格进行对齐。
    • 在每一行输出结束之后,使用 printf("\n") 来换行,使输出结果呈现矩阵的形式。
  5. 返回整数值 0 表示程序执行成功结束。

【执行结果】

 1  2  3  4  5
 2  4  6  8 10
 3  6  9 12 15
 4  8 12 16 20
 5 10 15 20 25


29. 统计字符的个数并保存进文件中

【题目】 键入一串字符(换行作为结束标志),统计字符的个数,将该串字符及字符个数显示到屏幕上并写入文件 str. dat 中。

#include <stdio.h>

int main()
{
    char ch;
    int sumch = 0;
    FILE *fp;
    
    // 打开文件 "str.dat",并以写入模式打开
    if (fopen_s(&fp, "str.dat", "w") != 0)
    {
        printf("Failed to open the file.\n");
        return 1;
    }

    // 循环读取用户输入的字符,直到遇到换行符为止
    while ((ch = getchar()) != '\n') 
    {
        sumch++;  // 字符计数器自增
        putchar(ch);  // 输出字符到屏幕
        fputc(ch, fp);  // 写入字符到文件
    }

    printf("sumch=%d\n", sumch);  // 输出字符的个数到屏幕
    fprintf(fp, "sumch=%d\n", sumch);  // 将格式化后的字符串写入文件
    fclose(fp);  // 关闭文件
    
    return 0;
}

【代码详解】

  • 这段代码的功能是从标准输入读取字符,并统计字符的个数,并将字符打印在屏幕上和写入到名为 “str.dat” 的文件中。程序还会输出字符的个数。如果文件打开失败,则会输出一条错误信息。
  1. 包含了 <stdio.h> 头文件,用于标准输入输出函数的声明。

  2. 在 main 函数中声明了字符变量 ch,整数变量 sumch,以及 FILE 类型的指针变量 fp

  3. 使用 fopen_s 函数打开名为 “str.dat” 的文件,并以写入模式 "w" 打开,将文件指针返回给 fp 变量。

    • 使用 fopen_s 函数可以更安全地打开文件,避免潜在的安全问题。
  4. 使用 if 条件判断语句检查文件是否成功打开。

    • 如果 fopen_s 函数返回非零值,则说明文件打开失败,输出一条错误信息并返回非零值。
  5. 使用一个循环,读取用户输入的字符并执行相应的操作,直到遇到换行符 '\n' 为止:

    • 循环条件是 (ch = getchar()) != '\n',表示当从标准输入中读取到的字符不是换行符时,继续循环。
    • 在循环体中,字符计数器 sumch 自增,将读取到的字符输出到屏幕上使用 putchar(ch) 函数,将字符写入到文件中使用 fputc(ch, fp) 函数。
  6. 使用 printf 函数在屏幕上输出字符的个数。

  7. 使用 fprintf 函数将格式化后的字符串写入文件中,格式化的字符串为 "sumch=%d\n",其中 %d 表示一个整数,将 sumch 变量的值插入到字符串中。

  8. 使用 fclose 函数关闭文件。

  9. 返回整数值 0 表示程序执行成功结束。

【执行结果】

  • 键盘输入示例:
    wueyoiwuepwoejwkfldkf.sqwuoqwio都弄去问候
  • 执行结果输出示例:
    wueyoiwuepwoejwkfldkf.sqwuoqwio都弄去问候sumch=41


30. 递归方法:计算从 0 到 10 的阶乘

【题目】用递归方法写出计算 n 的阶乘的函数,调用该函数计算并输出 n=0, 1, 2, ……, 10 时各阶乘的值。

  • 计算公式:

(1)当 n=0,1 时,n! = 1

(2)当 n>1 时,  n! = nx(n-1)!

#include <iostream>

// 递归计算阶乘函数
long fac(int n) {
    // 当 n=0,1 时,n! = 1
    if (n == 0 || n == 1) 
        return 1;
    else
        // 当 n>1 时,n! = n*(n-1)!
        return n * fac(n - 1); 
}

int main() {
    int n;
    long int result;
    for (n = 0; n <= 10; n++) {
        // 调用 fac 函数计算阶乘值
        result = fac(n);
        // 输出阶乘结果
        std::cout << n << "! = " << result << std::endl;
    }
    return 0;
}

【代码详解】

  1. 这段代码通过递归的方式计算了从 0 到 10 的阶乘,并输出了结果。
  2. 这段代码定义了一个递归函数 fac,它用于计算 n 的阶乘的值。
  3. 首先在 main 函数中,我们通过循环从 0 到 10 遍历不同的 n 值。
  4. 在循环中,调用 fac 函数计算当前 n 的阶乘值,并将结果赋给 result 变量。
  5. 最后,输出每个 n 的阶乘结果。

【执行结果】

0! = 1
1! = 1
2! = 2
3! = 6
4! = 24
5! = 120
6! = 720
7! = 5040
8! = 40320
9! = 362880
10! = 3628800

猜你喜欢

转载自blog.csdn.net/qq_39720249/article/details/132137050
今日推荐