Вычисление скалярного и векторного произведений в C

CBeginner
Практиковаться сейчас

Введение

В этом лабораторном практикуме вы научитесь вычислять скалярное и векторное произведение 3D векторов на языке C. Практикум охватывает следующие этапы:

  1. Чтение компонент векторов: Разработайте программу, которая позволяет пользователям вводить компоненты двух 3D векторов.
  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 для 3D векторов.
  • Функция readVector() принимает массив и его размер в качестве параметров.
  • scanf() используется для чтения компонент вектора с плавающей точкой.
  • Функция main() демонстрирует чтение двух векторов.

Вычисление Скалярного или Векторного Произведения

В этом шаге вы научитесь вычислять скалярное и векторное произведения 3D векторов на языке 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() вычисляет векторное произведение по стандартной формуле 3D векторного произведения.
  • Функция 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 и выполнять вычисления скалярного и векторного произведений. Вы создали программу, которая позволяет пользователям вводить компоненты векторов, а затем вычисляет скалярное или векторное произведение этих векторов. Ключевыми моментами обучения являются определение функции для считывания компонент векторов, реализация формул скалярного и векторного произведений и вывод результатов.

Программа демонстрирует работу с 3D векторами на языке C и применение основных векторных операций. Следуя пошаговым инструкциям, вы получили практический опыт работы с структурами данных векторов и выполнения общих арифметических операций над векторами.