Получить матрицу, элементы которой вычисляются по формуле - C (СИ)
Формулировка задачи:
Дана квадратная матрица А порядка n. Получить матрицу АВ ; элементы матрицы В вычисляются по формуле b[i][j]=1/(i+j-1). Нужно сделать в указателях
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main(int argc, char *argv[]) {
srand(time(NULL));
const int array_size = 5;
float a[array_size][array_size];
float b[array_size][array_size];
float ab[array_size][array_size];
int i, j, k;
printf("A[][]:\n");
for (i = 0; i < array_size; ++i) {
for (j = 0; j < array_size; ++j)
// так как индексация в математике идет с единицы
// в формуле прибавляется по +1 для каждого измерения
// +2 -1 = +1 иначе получаем inf при i = 0 или j = 0
printf("%9.5f", b[i][j] = 1./(i + j + 1));
printf("\n");
}
printf("\n");
printf("B[][]:\n");
for (i = 0; i < array_size; ++i) {
for (j = 0; j < array_size; ++j)
printf("%9.5f", a[i][j] = (rand() % 1000) / 100.);
printf("\n");
}
printf("\n");
printf("C[][] = A x B:\n");
for (i = 0; i < array_size; ++i) {
for (j = 0; j < array_size; ++j) {
ab[i][j] = 0;
for (k = 0; k < array_size; ++k)
ab[i][j] += a[i][k] * b[k][j];
printf("%9.5f", ab[i][j]);
}
printf("\n");
}
printf("\n");
return 0;
}Решение задачи: «Получить матрицу, элементы которой вычисляются по формуле»
textual
Листинг программы
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main(int argc, char *argv[]) {
srand(time(NULL));
const int array_size = 5;
float **a = (float**)malloc(sizeof(float*) * array_size);
float **b = (float**)malloc(sizeof(float*) * array_size);
float **ab = (float**)malloc(sizeof(float*) * array_size);
for(int i = 0; i < array_size; ++i){
a[i] = (float*)malloc(sizeof(float) * array_size);
b[i] = (float*)malloc(sizeof(float) * array_size);
ab[i] = (float*)malloc(sizeof(float) * array_size);
}
int i, j, k;
printf("A[][]:\n");
for (i = 0; i < array_size; ++i) {
for (j = 0; j < array_size; ++j)
// так как индексация в математике идет с единицы
// в формуле прибавляется по +1 для каждого измерения
// +2 -1 = +1 иначе получаем inf при i = 0 или j = 0
printf("%9.5f", *(*(b + i) + j) = 1./(i + j + 1));
printf("\n");
}
printf("\n");
printf("B[][]:\n");
for (i = 0; i < array_size; ++i) {
for (j = 0; j < array_size; ++j)
printf("%9.5f", *(*(a + i) + j) = (rand() % 1000) / 100.);
printf("\n");
}
printf("\n");
printf("C[][] = A x B:\n");
for (i = 0; i < array_size; ++i) {
for (j = 0; j < array_size; ++j) {
*(*(ab + i) + j) = 0;
for (k = 0; k < array_size; ++k)
*(*(ab + i) + j) += *(*(a + i) + k) * *(*(b + k) + j);
printf("%9.5f", *(*(ab + i) + j));
}
printf("\n");
}
printf("\n");
for(int i = 0; i < array_size; ++i){
free(a[i]);
free(b[i]);
free(ab[i]);
}
free(a);
free(b);
free(ab);
return 0;
}
Объяснение кода листинга программы
В этом коде создаются три массива строк (матрицы) A, B и C. Матрица A заполняется случайными числами от 0 до 1000, матрица B вычисляется по формуле 1/(i+j+1), а матрица C вычисляется как произведение матриц A и B. Здесь представлена разбиение кода на отдельные шаги и их описание:
- Определение размера матрицы. Задается размер матрицы в виде константы
array_size(строка 6). - Выделение памяти под матрицы A, B и C. Используется оператор
mallocдля выделения памяти под каждый элемент матрицы (строки 8-10). - Заполнение матрицы A случайными числами. Используется генератор случайных чисел
rand()для заполнения матрицы A случайными числами от 0 до 1000 (строки 13-18). - Заполнение матрицы B по формуле 1/(i+j+1). Используется формула 1/(i+j+1) для заполнения матрицы B (строки 21-26).
- Вычисление матрицы C как произведения матриц A и B. Используется цикл
forдля вычисления произведения матриц A и B и сохранения результата в матрице C (строки 28-37). - Освобождение памяти. После использования
malloc, память освобождается с помощью функцииfree(строки 40-45). - Выход из программы. Программа завершается возвратом значения 0 (строка 49).