Найти скалярное произведение векторов - C (СИ)
Формулировка задачи:
Даны вещественные векторы x,y,z. Вычислить величину (а,а)-(b,c), где а обозначает тот из этих векторов, в котором самый большой минимальный элемент(считать, то такой вектор единственный ), b и c обозначают два других вектора , а (p,q) - скалярное произведение p и q.
выдает ошибку при первой ссылке на подпрограмму scan
#include <stdio.h> void scan (float s[100],int n) { printf("Введите эл-ты массива %f\n",s[100]); for(int i=0;i<n; i++) scanf("%d", &s[i]); }; void min (float s[100],int min,int n) { int min=s[0]; for(int i=1; i<n; i++) if(s[i]<min) min=s[i]; }; void main() { int i,t=0,r=0,p=0,n,*a,*b,*c; float minx=0,miny=0,minz=0; float x[100], y[100],z[100]; printf("Введите кол-во эл-в массива "); scanf("%d",&n); scan(x[100],n); scan(y[100],n); scan(z[100],n); min(x[100],minx,n); min(y[100],miny,n); min(z[100],minz,n); if(minx>miny) { if (minx>minz) a=x[100],b=y[100],c=z[100]; else a=z[100],b=x[100],c=y[100]; }; else a=y[100],b=x[100],c=z[100]; for (i=0;i<n;i++)t=t+a[i]*a[i]; for (i=0;i<n;i++) r=r+b[i]*c[i]; p=t-r; printf("Выражение (a,a)-(b,c) будет равно %d",p); }
Решение задачи: «Найти скалярное произведение векторов»
textual
Листинг программы
#include <stdio.h> #include <stdlib.h> #include <conio.h> void scan (float *s,int n,char e[]) { printf("vvedite elementi massiva %s\n",e); for(int i=0;i<n; i++) scanf("%f", &s[i]); }; float mini (float *s,float min,int n) { min=s[0]; for(int i=1; i<n; i++) if(s[i]<min) min=s[i]; return min; }; void main() { char v[]={'x','\0'},h[]={'y','\0'},g[]={'z','\0'}; int i,n; float minx=0,miny=0,minz=0,t=0,r=0,p=0; float *a,*b,*c; float x[100], y[100],z[100]; printf("Vvedite kol-vo elementov "); scanf("%d",&n); scan(x,n,v); scan(y,n,h); scan(z,n,g); minx=mini(x,minx,n); miny=mini(y,miny,n); minz=mini(z,minz,n); if(minx>miny) { if (minx>minz) { for (i=0;i<n;i++) t=t+x[i]*x[i]; for (i=0;i<n;i++) r=r+y[i]*z[i]; } else { for (i=0;i<n;i++) t=t+z[i]*z[i]; for (i=0;i<n;i++) r=r+y[i]*x[i]; } } else { for (i=0;i<n;i++) t=t+y[i]*y[i]; for (i=0;i<n;i++) r=r+x[i]*z[i]; }; p=t-r; printf(" (a,a)-(b,c) = %f",p); _getch(); }
Объяснение кода листинга программы
В этом коде реализован алгоритм вычисления скалярного произведения трех векторов. Вот список действий, которые выполняются в коде:
- Ввод количества элементов векторов.
- Ввод элементов векторов x, y и z.
- Нахождение минимального элемента в каждом из векторов.
- Сравнение минимальных элементов.
- Вычисление скалярного произведения.
- Вывод результата. Вот более подробное описание каждого шага:
- Функция
scanf()
используется для ввода количества элементов векторов. Переменнаяn
инициализируется этим значением. - Функция
scan()
используется для ввода элементов векторовx
,y
иz
. Эта функция считывает элементы, пока не встретит ноль (что указывает на конец вектора). - Функция
mini()
используется для нахождения минимального элемента в каждом из векторов. Это делается путем итерации по каждому элементу вектора и сравнения его с текущим минимальным значением. Если текущий элемент меньше, он становится новым минимальным значением. - После нахождения минимальных значений, происходит сравнение этих значений. Если минимальное значение вектора
x
больше, чем минимальные значения векторовy
иz
, выполняется следующий блок кода. В противном случае выполняется другой блок кода. - Внутри каждого блока кода происходит вычисление скалярного произведения. Это делается путем итерации по каждому элементу вектора и умножения его на соответствующий элемент другого вектора.
- Наконец, результат скалярного произведения сохраняется в переменной
p
и выводится на экран с помощью функцииprintf()
. Обратите внимание, что в этом коде используются статические переменные, что может вызвать проблемы при работе с большими объемами данных. Также, код не обрабатывает ситуацию, когда векторы имеют разную длину.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д