在 C 语言中计算点积和叉积

CCBeginner
立即练习

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

简介

在本实验中,你将学习如何在 C 编程中计算三维向量的点积和叉积。本实验涵盖以下步骤:

  1. 读取向量分量:开发一个程序,允许用户输入两个三维向量的分量。
  2. 计算点积或叉积:实现函数来计算输入向量的点积和叉积。
  3. 打印结果:向用户显示计算出的点积或叉积。

完成本实验后,你将对向量运算及其在 C 中的实现有扎实的理解。

读取向量分量

在这一步中,你将学习如何在 C 编程中读取向量分量,以便进行点积和叉积计算。我们将创建一个程序,允许用户输入向量分量并存储它们,以进行进一步的数学运算。

首先,让我们为向量运算创建一个新的 C 文件:

cd ~/project
nano vector_operations.c

现在,添加以下代码来定义一个读取向量分量的函数:

#include <stdio.h>

#define VECTOR_SIZE 3

// 读取向量分量的函数
void readVector(float vector[], int size) {
    printf("输入 %d 个向量分量(用空格分隔):", size);
    for (int i = 0; i < size; i++) {
        scanf("%f", &vector[i]);
    }
}

int main() {
    float vector1[VECTOR_SIZE];
    float vector2[VECTOR_SIZE];

    printf("向量 1:\n");
    readVector(vector1, VECTOR_SIZE);

    printf("向量 2:\n");
    readVector(vector2, VECTOR_SIZE);

    return 0;
}

让我们编译并运行该程序以测试向量输入:

gcc vector_operations.c -o vector_operations
./vector_operations

示例输出:

向量 1:
输入 3 个向量分量(用空格分隔):1 2 3
向量 2:
输入 3 个向量分量(用空格分隔):4 5 6
解释

在这段代码中:

  • 我们定义了一个常量 VECTOR_SIZE,设置为 3 用于三维向量
  • readVector() 函数将一个数组及其大小作为参数
  • scanf() 用于读取浮点型向量分量
  • main() 函数演示了读取两个向量的过程

计算点积或叉积

在这一步中,你将学习如何在 C 编程中计算三维向量的点积和叉积。我们将扩展上一个程序,以包含对向量的数学运算。

使用以下代码更新 vector_operations.c 文件:

cd ~/project
nano vector_operations.c

添加点积和叉积计算的实现:

#include <stdio.h>

#define VECTOR_SIZE 3

void readVector(float vector[], int size) {
    printf("输入 %d 个向量分量(用空格分隔):", size);
    for (int i = 0; i < size; i++) {
        scanf("%f", &vector[i]);
    }
}

// 计算点积
float computeDotProduct(float vector1[], float vector2[], int size) {
    float dotProduct = 0.0;
    for (int i = 0; i < size; i++) {
        dotProduct += vector1[i] * vector2[i];
    }
    return dotProduct;
}

// 计算叉积
void computeCrossProduct(float vector1[], float vector2[], float result[]) {
    result[0] = vector1[1] * vector2[2] - vector1[2] * vector2[1];
    result[1] = vector1[2] * vector2[0] - vector1[0] * vector2[2];
    result[2] = vector1[0] * vector2[1] - vector1[1] * vector2[0];
}

int main() {
    float vector1[VECTOR_SIZE];
    float vector2[VECTOR_SIZE];
    float crossProductResult[VECTOR_SIZE];

    printf("向量 1:\n");
    readVector(vector1, VECTOR_SIZE);

    printf("向量 2:\n");
    readVector(vector2, VECTOR_SIZE);

    // 计算并显示点积
    float dotProduct = computeDotProduct(vector1, vector2, VECTOR_SIZE);
    printf("点积:%.2f\n", dotProduct);

    // 计算并显示叉积
    computeCrossProduct(vector1, vector2, crossProductResult);
    printf("叉积:[%.2f, %.2f, %.2f]\n",
           crossProductResult[0],
           crossProductResult[1],
           crossProductResult[2]);

    return 0;
}

编译并运行更新后的程序:

gcc vector_operations.c -o vector_operations
./vector_operations

示例输出:

向量 1:
输入 3 个向量分量(用空格分隔):1 2 3
向量 2:
输入 3 个向量分量(用空格分隔):4 5 6
点积:32.00
叉积:[-3.00, 6.00, -3.00]
解释
  • computeDotProduct() 通过将相应的向量分量相乘来计算点积
  • computeCrossProduct() 使用标准的三维向量叉积公式计算叉积
  • main() 函数演示了计算和显示点积与叉积的过程

打印结果

在这最后一步中,你将通过添加格式化输出来增强向量运算程序,并创建一个函数以清晰、可读的格式打印向量结果。

使用以下改进后的实现更新 vector_operations.c 文件:

cd ~/project
nano vector_operations.c

添加新的打印函数并修改主程序:

#include <stdio.h>

#define VECTOR_SIZE 3

void readVector(float vector[], int size) {
    printf("输入 %d 个向量分量(用空格分隔):", size);
    for (int i = 0; i < size; i++) {
        scanf("%f", &vector[i]);
    }
}

float computeDotProduct(float vector1[], float vector2[], int size) {
    float dotProduct = 0.0;
    for (int i = 0; i < size; i++) {
        dotProduct += vector1[i] * vector2[i];
    }
    return dotProduct;
}

void computeCrossProduct(float vector1[], float vector2[], float result[]) {
    result[0] = vector1[1] * vector2[2] - vector1[2] * vector2[1];
    result[1] = vector1[2] * vector2[0] - vector1[0] * vector2[2];
    result[2] = vector1[0] * vector2[1] - vector1[1] * vector2[0];
}

// 新函数,用于格式化打印向量
void printVector(const char* label, float vector[], int size) {
    printf("%s: [", label);
    for (int i = 0; i < size; i++) {
        printf("%.2f%s", vector[i], (i < size - 1)? ", " : "");
    }
    printf("]\n");
}

int main() {
    float vector1[VECTOR_SIZE];
    float vector2[VECTOR_SIZE];
    float crossProductResult[VECTOR_SIZE];

    // 输入向量
    printf("向量输入:\n");
    printVector("向量 1", vector1, VECTOR_SIZE);
    readVector(vector1, VECTOR_SIZE);

    printVector("向量 2", vector2, VECTOR_SIZE);
    readVector(vector2, VECTOR_SIZE);

    // 计算结果
    float dotProduct = computeDotProduct(vector1, vector2, VECTOR_SIZE);
    computeCrossProduct(vector1, vector2, crossProductResult);

    // 打印格式化后的结果
    printf("\n向量运算结果:\n");
    printVector("向量 1", vector1, VECTOR_SIZE);
    printVector("向量 2", vector2, VECTOR_SIZE);
    printf("点积:%.2f\n", dotProduct);
    printVector("叉积", crossProductResult, VECTOR_SIZE);

    return 0;
}

编译并运行更新后的程序:

gcc vector_operations.c -o vector_operations
./vector_operations

示例输出:

向量输入:
向量 1:[0.00, 0.00, 0.00]
输入 3 个向量分量(用空格分隔):1 2 3
向量 2:[0.00, 0.00, 0.00]
输入 3 个向量分量(用空格分隔):4 5 6

向量运算结果:
向量 1:[1.00, 2.00, 3.00]
向量 2:[4.00, 5.00, 6.00]
点积:32.00
叉积:[-3.00, 6.00, -3.00]
解释
  • 添加了 printVector() 函数以创建一致的、格式化的向量输出
  • 增强了 main() 函数以演示向量输入和结果打印
  • 提高了向量和计算结果的可读性
  • 为向量运算提供了简洁、专业的输出格式

总结

在本实验中,你学习了如何在 C 编程中读取向量分量并执行点积和叉积计算。你创建了一个程序,允许用户输入向量分量,然后计算向量的点积或叉积。关键的学习要点包括定义一个读取向量分量的函数、实现点积和叉积公式以及打印结果。

该程序演示了如何在 C 中处理三维向量并应用基本的向量运算。通过遵循逐步说明,你获得了处理向量数据结构和执行常见向量算术运算的实践经验。