Из элементов матрицы и вектора по определенному правилу получить новый вектор - C (СИ)
Формулировка задачи:
Суть задания в том, что есть матрица и вектор, из которых по определенному правилу надо получить новый вектор. В моем коде программа вместо введенной матрицы выдает нечто невразумительное
#include<stdio.h>;
#include<string.h>;
#include<stdlib.h>;
float* WC(float *w1,float f,int n)\\умножение вектора на число
{
int i=0;
float *w;
w=(float*)malloc(n*sizeof(float));
for(i=0;i<n;i++)
w[i]=0;
for(i=0;i<n;i++)
w[i]+=w1[i]*f;
return w;
}
float WW(float *w1,float *w2,int n)\\скалярное произведение 2х векторов
{
int i=0;
float w=0;
for(i=0;i<n;i++)
w+=w1[i]*w2[i];
return w;
}
float* MatrW(int n, float *a, float *w)\\произведение матрицы и вектора
{
int i=0,j=0;
float *w1;
w1=(float*)malloc(n*sizeof(float));
for (j=0;j<n;j++)
w1[j]=0;
for (j=0;j<n;j++)
for(i=0;i<n;i++)
w1[j]=w1[j]+a[j*n+i]*w[i];
return w1;
}
float* form(int n,float *a,float *w1, float *w0=NULL)\\сама формула
{
int i=0;
float *w,*w2;
float q,q1;
w=(float*)malloc(n*sizeof(float));
w2=(float*)malloc(n*sizeof(float));
w2=MatrW(n,a,w1);
q=(WW(w2,w2,n))/(WW(w1,w2,n));
if(w0==NULL)
for(i=0;i<n;i++)
w[i]=w2[i]-WC(w1,q,n)[i];
else
{
q1=(WW(w1,MatrW(n,a,w0),n))/(WW(w0,MatrW(n,a,w0),n));
for(i=0;i<n;i++)
w[i]=w2[i]-WC(w1,q,n)[i]-WC(w0,q1,n)[i];
}
return w;
}
void main()
{
int n=0, v=0, i=0, j=0, g=0;
float *a,*b, *c,*d;
printf("vvedite razmer matr\n");
scanf("%i",&n);
v=n*n;
a=(float*)malloc(v*sizeof(float));
b=(float*)malloc(n*sizeof(float));
c=(float*)malloc(n*sizeof(float));
d=(float*)malloc(n*sizeof(float));
for (i=0; i<n; i++)
for (j=0; j<n; j++)
{
printf ("vvedite element %i,%i matr a\n",i,j);
scanf ("%f", &g);
a[i*n+j]=g;
}
for(i=0;i<n;i++)
{
printf("vvedite b[%i]\n",i);
scanf("%i",&v);
b[i]=v;
}
printf("vved matr:\n");
for (i=0; i<n; i++)
{
for (j=0; j<n; j++)
printf("\t %f", &a[i*n+j]);\\вот тут и выдает неправильные значения
printf ("\n");
}
c=form(n,a,b,NULL);
for(i=0;i<n;i++)
printf("%f\n",&c[i]);
}Решение задачи: «Из элементов матрицы и вектора по определенному правилу получить новый вектор»
textual
Листинг программы
#include <stdio.h>
#include <stdlib.h>
#define N 2
#define M 4
int main()
{
float array[M * N];
size_t i = 1, j = 3;
array[i * N + j] = 42;
printf("%f\n", array[i * N + j]);
exit(0);
}
Объяснение кода листинга программы
В данном коде происходит следующее:
- Подключение необходимых библиотек
- В начале кода подключаются две библиотеки:
stdio.hиstdlib.h. Библиотекаstdio.hсодержит функции для ввода-вывода данных, аstdlib.hсодержит функции для работы с типами данных и обработки ошибок.
- В начале кода подключаются две библиотеки:
- Определение размеров матрицы и вектора
- С помощью макросов
NиMопределяются размеры матрицы и вектора соответственно. В данном случае, матрица имеет размерность 2x4, а вектор имеет размерность 2.
- С помощью макросов
- Инициализация массива
- Создается массив
arrayтипаfloatразмеромM * N.
- Создается массив
- Инициализация индексов
- Инициализируются индексы
iиjдля обращения к элементам массива. Значениеiустановлено на 1, аjна 3.
- Инициализируются индексы
- Заполнение массива
- В массив
arrayзаписывается значение 42 по определенному правилу, используя индексыiиj. Индекс элемента массива вычисляется как произведениеiна количество столбцов матрицы (N) плюсj.
- В массив
- Вывод значения элемента массива
- С помощью функции
printfвыводится значение элемента массиваarray[i * N + j].
- С помощью функции
- Завершение программы
- Программа завершается с помощью функции
exit(0).
- Программа завершается с помощью функции