Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 18.05.2013, 22:18   #1
Alexandr-
Пользователь
 
Регистрация: 04.03.2013
Сообщений: 79
По умолчанию Найти произведение двух симметричных матриц А и В

Найти произведение двух симметричных матриц А и В. Матрицы хранятся в одномерных массивах, где построчно записаны элементы, стоящие не ниже главной диагонали.

В общем не понимаю вообще, как реализовать 2 предложение в задачи.
К примеру из 2 массивов(допустим заполненных случайными числами) получается так(ниже код) матрица насколько я понимаю, значит нужна ещё 1 такая же и умножить их соответственно. Вот только, как реализовать это: "где построчно записаны элементы, стоящие не ниже главной диагонали".

Помогите написать задачу, кому не сложно.

Код:
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <time.h>
int tr(int *C, int *D, int n){//функция создания 2 массивов(не знаю зачем создал)
    int i;
 for (i=1;i<=n;i++) {
C[i] = rand()%10+1; 
 printf ("%d ",C[i]); }
 printf("\n");
   for (i=1;i<=n;i++) {
D[i] = rand()%10+1; 
 printf ("%d ",D[i]); }
 printf("\n");
}
 
 
int main () {  
 int i,j,n; int *C,*D,**A;
srand(time(NULL));
printf ("vvedite razmer massiva\n");
scanf ("%d",&n);
C = (int *)malloc(n * sizeof(int));
D = (int *)malloc(n * sizeof(int)); 
A = (int **)malloc(n * sizeof(int *)); 
   
tr(C,D,n);
for (i=1;i<=n;i++) { A[i]=(int *)malloc(sizeof(int)*n); printf ("\n");
for (j=1;j<=n;j++) {
 
 if (i==1) A[i][j]=C[j]; //условие умножения массивов
 if (j==1) A[i][j]=D[i];
 if(i!=1 && j!=1) A[i][j]=C[j]*D[i];
A[1][1]=C[1]*D[1];
printf ("%3d",A[i][j]); }}
free(C);
free(D);
free(A);
getch (); return 0; }
Alexandr- вне форума Ответить с цитированием
Старый 18.05.2013, 22:48   #2
Alanel'
Пользователь
 
Регистрация: 17.05.2013
Сообщений: 10
По умолчанию

Ну если ты изначально вводишь матрицу, которая потом преобразуется в массив, то я бы так делала:
Код:
for(i=0; i<n; i++) //идем по строке матрицы
{
   for(j=0; j<i; j++)
      scanf("%d", &a[i*n+i]);//можно любую переменную, просто при считывании пропускаем числа, идем до диагонали
   for(j=i; j<n; j++)
      scanf("%d", &a[i*n+j]);//формируем одномерный массив
}
Если матрица записана в проге, то первый цикл по j убираем, а во втором будет просто присвоение a[i*n+j]=A[i][j];
Ну а перемножение в таких массивах думать надо. Надеюсь, что правильно поняла задание.
Alanel' вне форума Ответить с цитированием
Старый 18.05.2013, 22:49   #3
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,430
По умолчанию

Код:
#include <iostream>
#include <cmath>
#include <cstdlib>
#include <ctime>

using namespace std;

int
pos(int s, int row, int col)
{
    if (row > col) {
        int tmp = row;
        row = col;
        col = tmp;
    }
    return (col - row + (s + s - row + 1) * row / 2);
}

void
print_matrix1(int a[], int n)
{
    for (int i = 0; i < n; ++i) {
        for (int j = 0; j < n; ++j) {
            cout << a[pos(n, i, j)] << " ";
        }
        cout << endl;
    }
}

void
print_matrix2(int a[], int n)
{
    for (int i = 0; i < n; ++i) {
        for (int j = 0; j < n; ++j) {
            cout << a[n * i + j] << " ";
        }
        cout << endl;
    }
}

int
main()
{
    srand(time(NULL));
    int count;
    cin >> count;
    int n = (sqrt(8 * count + 1) - 1) / 2;
    int a[count], b[count], c[n * n];
    for (int i = 0; i < count; ++i) {
        a[i] = rand() % 41 - 20;
        b[i] = rand() % 41 - 20;
    }
    for (int i = 0; i < n; ++i) {
        for (int j = 0; j < n; ++j) {
            int tmp = 0;
            for (int k = 0; k < n; ++k) {
                tmp += a[pos(n, i, k)] * b[pos(n, k, j)];
            }
            c[n * i + j] = tmp;
        }
    }
    cout << "A:" << endl;
    print_matrix1(a, n);
    cout << "B:" << endl;
    print_matrix1(b, n);
    cout << "C:" << endl;
    print_matrix2(c, n);
}
Ваша задача, разобраться в программе и переписать ее с С++ на Си.
У меня матрица хранится в виде одномерного массива, причем только элементы, расположенные не ниже главной диагонали, т.е.:
Цитата:
1 2 3
2 4 5
3 5 6
хранится:
Цитата:
1 2 3 4 5 6
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )

Последний раз редактировалось BDA; 19.05.2013 в 14:45.
BDA вне форума Ответить с цитированием
Старый 18.05.2013, 23:00   #4
Sciv
Старожил
 
Аватар для Sciv
 
Регистрация: 16.05.2012
Сообщений: 3,211
По умолчанию

Объясняю: для симметричных матриц нет необходимости хранить всю матрицу в двумерном массиве, так как:

1 2 3
2 5 6
3 6 4

Как видим, элемент [2,1]=[1,2], [3,1]=[1,3] и тд - в общем виде: [i,j]=[j,i]. Таким образом, все элементы ниже главной диагонали будут всего лишь дублировать элементы выше нее.

Для данной в примере матрицы одномерный массив запишется так: [1,2,3,5,6,4] при порядке матрицы n=3.
Начал решать проблему с помощью регулярных выражений. Теперь решаю две проблемы...
Sciv вне форума Ответить с цитированием
Старый 19.05.2013, 12:02   #5
Alexandr-
Пользователь
 
Регистрация: 04.03.2013
Сообщений: 79
По умолчанию

Что нужно сделать теперь понимаю, но все равно не получается из одномерного массива получить такую матрицу(просто не понимаю, что с ним делать то).
Помогите с частью данного кода пожалуйста.
Alexandr- вне форума Ответить с цитированием
Старый 19.05.2013, 14:39   #6
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,430
По умолчанию

Чем Вас не устраивает код из моего поста выше?

Кстати, программа работала неправильно.
Исправлена.
http://ideone.com/adRU5x
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )

Последний раз редактировалось BDA; 19.05.2013 в 14:47.
BDA вне форума Ответить с цитированием
Старый 19.05.2013, 14:58   #7
Alexandr-
Пользователь
 
Регистрация: 04.03.2013
Сообщений: 79
По умолчанию

Там С++, а я его ещё даже не начинал проходить, поэтому на С переписать не могу. Не могли бы вы написать часть кода формирования матрицы из одномерного массива на С, если не сложно.
Alexandr- вне форума Ответить с цитированием
Старый 19.05.2013, 15:04   #8
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,430
По умолчанию

Код:
#include <math.h>
#include <stdlib.h>
#include <time.h>

int
pos(int s, int row, int col)
{
    if (row > col) {
        int tmp = row;
        row = col;
        col = tmp;
    }
    return (col - row + (s + s - row + 1) * row / 2);
}

void
print_matrix1(int a[], int n)
{
    int i, j;
    for (i = 0; i < n; ++i) {
        for (j = 0; j < n; ++j) {
            printf("%d ", a[pos(n, i, j)]);
        }
        printf("\n");
    }
}

void
print_matrix2(int a[], int n)
{
    int i, j;
    for (i = 0; i < n; ++i) {
        for (j = 0; j < n; ++j) {
            printf("%d ", a[n * i + j]);
        }
        printf("\n");
    }
}

int
main()
{
    srand(time(NULL));
    int count;
    scanf("%d", &count);
    int n = (sqrt(8 * count + 1) - 1) / 2;
    int a[count], b[count], c[n * n];
    int i, j, k;
    for (i = 0; i < count; ++i) {
        a[i] = rand() % 41 - 20;
        b[i] = rand() % 41 - 20;
    }
    for (i = 0; i < n; ++i) {
        for (j = 0; j < n; ++j) {
            int tmp = 0;
            for (k = 0; k < n; ++k) {
                tmp += a[pos(n, i, k)] * b[pos(n, k, j)];
            }
            c[n * i + j] = tmp;
        }
    }
    printf("A:\n");
    print_matrix1(a, n);
    printf("B:\n");
    print_matrix1(b, n);
    printf("C:\n");
    print_matrix2(c, n);
    return 0;
}
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Найти произведение двух двумерных массивов A и B Falman Паскаль, Turbo Pascal, PascalABC.NET 0 23.05.2012 12:04
Найти матрицу, представляющую собой сумму двух данных матриц lokomotiv C# (си шарп) 0 17.12.2011 14:34
Обращение матрицы методом разложения её на произведение двух треугольных(найти ошибку в коде) Monomah Общие вопросы C/C++ 0 20.02.2011 18:35
Найти произведение первых трёх наибольших элементов Матриц - паскаль Sandrewz Помощь студентам 4 15.10.2010 20:25
Произведение двух матриц 010 Паскаль, Turbo Pascal, PascalABC.NET 5 03.06.2008 11:33