Из элементов матрицы и вектора по определенному правилу получить новый вектор - 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)
.
- Программа завершается с помощью функции
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д