使用 C 语言创建阶乘计算器

CCBeginner
立即练习

💡 本教程由 AI 辅助翻译自英文原版。如需查看原文,您可以 切换至英文原版

简介

在本实验中,你将学习如何使用 C 编程语言创建一个阶乘计算器。实验涵盖了关键主题,例如理解 for 循环的语法、遍历数组元素、实现阶乘计算、处理边缘情况以及测试和调试阶乘计算器。通过本实验,你将对这些基础编程概念有扎实的理解,并能够应用它们来构建一个功能完善的阶乘计算器。

实验提供了逐步的指导和代码示例,帮助你完成阶乘计算器的创建过程。你将从学习 for 循环的基本语法开始,这对于遍历数组和执行重复任务至关重要。然后,你将探索如何访问和操作数组元素,这是阶乘计算的基础。实验还将涵盖阶乘计算的实现、边缘情况的处理以及最终程序的测试和调试。


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL c(("`C`")) -.-> c/BasicsGroup(["`Basics`"]) c(("`C`")) -.-> c/ControlFlowGroup(["`Control Flow`"]) c(("`C`")) -.-> c/CompoundTypesGroup(["`Compound Types`"]) c(("`C`")) -.-> c/FunctionsGroup(["`Functions`"]) c(("`C`")) -.-> c/UserInteractionGroup(["`User Interaction`"]) c/BasicsGroup -.-> c/variables("`Variables`") c/ControlFlowGroup -.-> c/for_loop("`For Loop`") c/CompoundTypesGroup -.-> c/arrays("`Arrays`") c/FunctionsGroup -.-> c/function_declaration("`Function Declaration`") c/UserInteractionGroup -.-> c/output("`Output`") subgraph Lab Skills c/variables -.-> lab-438256{{"`使用 C 语言创建阶乘计算器`"}} c/for_loop -.-> lab-438256{{"`使用 C 语言创建阶乘计算器`"}} c/arrays -.-> lab-438256{{"`使用 C 语言创建阶乘计算器`"}} c/function_declaration -.-> lab-438256{{"`使用 C 语言创建阶乘计算器`"}} c/output -.-> lab-438256{{"`使用 C 语言创建阶乘计算器`"}} end

理解 For 循环语法

在这一步中,你将学习 C 编程中 for 循环的基本语法,这对于遍历数组和执行重复任务(如计算阶乘)至关重要。

让我们从一个简单的 C 程序开始,演示基本的 for 循环语法。打开 WebIDE,在 ~/project 目录下创建一个名为 loop_example.c 的新文件:

cd ~/project
touch loop_example.c
#include <stdio.h>

int main() {
    // 基本 for 循环语法:for (初始化; 条件; 递增/递减)
    for (int i = 0; i < 5; i++) {
        printf("Current iteration: %d\n", i);
    }
    return 0;
}

示例输出:

Current iteration: 0
Current iteration: 1
Current iteration: 2
Current iteration: 3
Current iteration: 4

让我们分解 for 循环的语法:

  • int i = 0:初始化 - 将循环计数器变量设置为初始值
  • i < 5:条件 - 当条件为真时继续循环
  • i++:递增 - 每次迭代后增加循环计数器

现在,编译并运行程序以查看循环的工作原理:

gcc loop_example.c -o loop_example
./loop_example

for 循环的强大之处在于它允许你精确控制迭代过程。你可以修改初始化、条件和递增/递减部分,以满足不同的编程需求,例如遍历数组或执行计算。

遍历数组元素

在这一步中,你将学习如何在 C 语言中遍历数组元素,这对于实现我们的阶乘计算器至关重要。基于上一步中关于 for 循环的知识,我们将探索如何访问和操作数组元素。

让我们在 ~/project 目录下创建一个名为 array_iteration.c 的新文件,以演示数组遍历:

cd ~/project
touch array_iteration.c
#include <stdio.h>

int main() {
    // 声明并初始化一个整数数组
    int numbers[5] = {10, 20, 30, 40, 50};

    // 使用 for 循环遍历数组
    for (int i = 0; i < 5; i++) {
        printf("Element at index %d is: %d\n", i, numbers[i]);
    }

    return 0;
}

示例输出:

Element at index 0 is: 10
Element at index 1 is: 20
Element at index 2 is: 30
Element at index 3 is: 40
Element at index 4 is: 50

让我们分解关键概念:

  • int numbers[5] 创建一个可以容纳 5 个整数元素的数组
  • {10, 20, 30, 40, 50} 使用特定值初始化数组
  • numbers[i] 使用索引访问数组中的单个元素
  • for 循环使用 i 作为索引依次访问每个元素

现在,编译并运行程序:

gcc array_iteration.c -o array_iteration
./array_iteration

为了使遍历更加实用,让我们创建一个计算数组元素之和的示例:

#include <stdio.h>

int main() {
    int numbers[5] = {10, 20, 30, 40, 50};
    int sum = 0;

    // 使用数组遍历计算总和
    for (int i = 0; i < 5; i++) {
        sum += numbers[i];
    }

    printf("Sum of array elements: %d\n", sum);

    return 0;
}

示例输出:

Sum of array elements: 150

这展示了如何使用 for 循环对数组元素执行操作,这在我们即将实现的阶乘计算器中至关重要。

实现阶乘计算

在这一步中,你将学习如何使用在前几步中学到的循环迭代技术在 C 语言中实现阶乘计算函数。阶乘是一种数学运算,它将一个数与所有小于它的正整数相乘。

让我们在 ~/project 目录下创建一个名为 factorial_calculator.c 的新文件:

cd ~/project
touch factorial_calculator.c
#include <stdio.h>

// 计算阶乘的函数
int calculateFactorial(int n) {
    // 将结果初始化为 1
    int factorial = 1;

    // 使用 for 循环将数字从 1 乘到 n
    for (int i = 1; i <= n; i++) {
        factorial *= i;
    }

    return factorial;
}

int main() {
    // 测试不同数字的阶乘计算
    int numbers[] = {0, 1, 5, 7};

    // 遍历数字并计算它们的阶乘
    for (int j = 0; j < 4; j++) {
        int num = numbers[j];
        int result = calculateFactorial(num);

        printf("Factorial of %d is: %d\n", num, result);
    }

    return 0;
}

示例输出:

Factorial of 0 is: 1
Factorial of 1 is: 1
Factorial of 5 is: 120
Factorial of 7 is: 5040

让我们分解阶乘计算:

  • 0 和 1 的阶乘为 1
  • n 的阶乘 (n!) = 1 _ 2 _ 3 _ ... _ n
  • calculateFactorial() 函数使用 for 循环进行数字相乘
  • 我们从 1 开始阶乘,并依次乘以每个数字直到 n

编译并运行程序:

gcc factorial_calculator.c -o factorial_calculator
./factorial_calculator

为了使计算器更具交互性,让我们修改程序以接受用户输入:

#include <stdio.h>

int calculateFactorial(int n) {
    int factorial = 1;
    for (int i = 1; i <= n; i++) {
        factorial *= i;
    }
    return factorial;
}

int main() {
    int number;

    // 提示用户输入
    printf("Enter a number to calculate its factorial: ");
    scanf("%d", &number);

    // 计算并显示阶乘
    int result = calculateFactorial(number);
    printf("Factorial of %d is: %d\n", number, result);

    return 0;
}

示例交互:

Enter a number to calculate its factorial: 6
Factorial of 6 is: 720

处理边缘情况

在这一步中,你将学习如何处理阶乘计算器中的边缘情况,例如负数输入和可能导致整数溢出的较大输入。健壮的错误处理对于创建可靠的软件至关重要。

让我们修改阶乘计算器以处理这些边缘情况。在 ~/project 目录下创建一个名为 factorial_edge_cases.c 的新文件:

cd ~/project
touch factorial_edge_cases.c
#include <stdio.h>
#include <limits.h>

// 带有错误处理的阶乘计算函数
int calculateFactorial(int n) {
    // 检查负数
    if (n < 0) {
        printf("Error: Factorial is not defined for negative numbers.\n");
        return -1;
    }

    // 将结果初始化为 1
    int factorial = 1;

    // 检查潜在的整数溢出
    for (int i = 1; i <= n; i++) {
        // 检查乘法是否会导致溢出
        if (factorial > INT_MAX / i) {
            printf("Error: Factorial result exceeds integer limit.\n");
            return -1;
        }
        factorial *= i;
    }

    return factorial;
}

int main() {
    // 测试各种边缘情况
    int test_cases[] = {-5, 0, 1, 12, 13};

    for (int i = 0; i < 5; i++) {
        int number = test_cases[i];
        int result = calculateFactorial(number);

        // 仅在计算成功时打印结果
        if (result != -1) {
            printf("Factorial of %d is: %d\n", number, result);
        }
    }

    return 0;
}

示例输出:

Error: Factorial is not defined for negative numbers.
Factorial of 0 is: 1
Factorial of 1 is: 1
Factorial of 12 is: 479001600
Error: Factorial result exceeds integer limit.

关键错误处理技术:

  • 在计算前检查负数
  • 使用 INT_MAX 防止整数溢出
  • 返回 -1 表示计算错误
  • 提供信息丰富的错误消息

编译并运行程序:

gcc factorial_edge_cases.c -o factorial_edge_cases
./factorial_edge_cases

让我们通过更友好的输入处理来增强程序:

#include <stdio.h>
#include <limits.h>

int calculateFactorial(int n) {
    if (n < 0) {
        printf("Error: Factorial is not defined for negative numbers.\n");
        return -1;
    }

    int factorial = 1;

    for (int i = 1; i <= n; i++) {
        if (factorial > INT_MAX / i) {
            printf("Error: Factorial result exceeds integer limit.\n");
            return -1;
        }
        factorial *= i;
    }

    return factorial;
}

int main() {
    int number;

    while (1) {
        printf("Enter a non-negative integer (or negative to exit): ");

        // 检查输入是否有效
        if (scanf("%d", &number) != 1) {
            printf("Invalid input. Please enter an integer.\n");
            // 清除输入缓冲区
            while (getchar() != '\n');
            continue;
        }

        // 退出条件
        if (number < 0) {
            printf("Exiting factorial calculator.\n");
            break;
        }

        // 计算并显示阶乘
        int result = calculateFactorial(number);
        if (result != -1) {
            printf("Factorial of %d is: %d\n", number, result);
        }
    }

    return 0;
}

示例交互:

Enter a non-negative integer (or negative to exit): 10
Factorial of 10 is: 3628800
Enter a non-negative integer (or negative to exit): -1
Exiting factorial calculator.

测试和调试阶乘计算器

在这最后一步中,你将学习如何使用各种测试技术和调试策略来全面测试和调试阶乘计算器。

让我们创建一个包含多个测试用例和调试功能的综合测试程序。在 ~/project 目录下创建一个名为 factorial_test.c 的文件:

cd ~/project
touch factorial_test.c
#include <stdio.h>
#include <assert.h>
#include <limits.h>

// 带有详细错误检查的阶乘计算函数
int calculateFactorial(int n) {
    // 调试打印以跟踪函数调用
    printf("DEBUG: Calculating factorial for %d\n", n);

    // 验证输入范围
    if (n < 0) {
        fprintf(stderr, "ERROR: Factorial undefined for negative numbers\n");
        return -1;
    }

    // 处理特殊情况
    if (n == 0 || n == 1) return 1;

    // 带有溢出保护的阶乘计算
    long long factorial = 1;
    for (int i = 2; i <= n; i++) {
        factorial *= i;

        // 溢出检查
        if (factorial > INT_MAX) {
            fprintf(stderr, "ERROR: Factorial exceeds integer limit\n");
            return -1;
        }
    }

    return (int)factorial;
}

// 验证阶乘计算的测试函数
void runTests() {
    // 包含预期结果的测试用例
    struct TestCase {
        int input;
        int expected;
    } tests[] = {
        {0, 1},    // 边缘情况:0!
        {1, 1},    // 边缘情况:1!
        {5, 120},  // 正常情况:5!
        {10, 3628800}  // 较大数字
    };

    int numTests = sizeof(tests) / sizeof(tests[0]);

    printf("Running %d test cases...\n", numTests);

    // 遍历测试用例
    for (int i = 0; i < numTests; i++) {
        int result = calculateFactorial(tests[i].input);

        // 断言式测试
        if (result == tests[i].expected) {
            printf("Test case %d PASSED: factorial(%d) = %d\n",
                   i+1, tests[i].input, result);
        } else {
            printf("Test case %d FAILED: Expected %d, Got %d\n",
                   i+1, tests[i].expected, result);
        }
    }
}

int main() {
    // 运行综合测试套件
    runTests();

    // 交互式测试模式
    int number;
    printf("\nEnter a number to calculate its factorial (or negative to exit): ");
    while (scanf("%d", &number) == 1 && number >= 0) {
        int result = calculateFactorial(number);
        if (result != -1) {
            printf("Factorial of %d is: %d\n", number, result);
        }

        printf("\nEnter another number (or negative to exit): ");
    }

    return 0;
}

编译并运行程序:

gcc factorial_test.c -o factorial_test
./factorial_test

示例输出如下:

Running 4 test cases...
DEBUG: Calculating factorial for 0
Test case 1 PASSED: factorial(0) = 1
DEBUG: Calculating factorial for 1
Test case 2 PASSED: factorial(1) = 1
DEBUG: Calculating factorial for 5
Test case 3 PASSED: factorial(5) = 120
DEBUG: Calculating factorial for 10
Test case 4 PASSED: factorial(10) = 3628800

Enter a number to calculate its factorial (or negative to exit):

展示的关键调试和测试技术:

  • 使用调试打印语句跟踪函数执行
  • 涵盖边缘情况的综合测试用例
  • 对无效输入的错误处理
  • 溢出保护
  • 断言式测试
  • 交互式测试模式

调试技巧:

  1. 使用 printf() 进行日志记录和跟踪函数调用
  2. 显式处理边缘情况
  3. 实现输入验证
  4. 使用 long long 进行较大数字的计算
  5. 创建测试套件以验证不同场景

总结

在本实验中,你学习了 C 编程中 for 循环的基本语法,这对于遍历数组和执行重复任务(如计算阶乘)至关重要。你还探索了如何遍历数组元素,这对于实现阶乘计算器至关重要。

你首先创建了一个简单的 C 程序来演示基本的 for 循环语法,理解了循环的初始化、条件和递增/递减部分。然后,你学习了如何使用 for 循环遍历整数数组,访问和操作数组元素。

您可能感兴趣的其他 C 教程