Найти скалярное произведение векторов - 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(). Обратите внимание, что в этом коде используются статические переменные, что может вызвать проблемы при работе с большими объемами данных. Также, код не обрабатывает ситуацию, когда векторы имеют разную длину.