Введение
В этом лабораторном практикуме вы научитесь вычислять скалярное и векторное произведение 3D векторов на языке C. Практикум охватывает следующие этапы:
- Чтение компонент векторов: Разработайте программу, которая позволяет пользователям вводить компоненты двух 3D векторов.
- Вычисление скалярного или векторного произведения: Реализуйте функции для вычисления скалярного и векторного произведения введённых векторов.
- Вывод результата: Отобразите вычисленное скалярное или векторное произведение пользователю.
По завершении этого практикума вы получите глубокое понимание векторных операций и их реализации на языке 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 и применение основных векторных операций. Следуя пошаговым инструкциям, вы получили практический опыт работы с структурами данных векторов и выполнения общих арифметических операций над векторами.



