ANTICHAT.XYZ    VIDEO.ANTICHAT.XYZ    НОВЫЕ СООБЩЕНИЯ    ФОРУМ  
Баннер 1   Баннер 2

ANTICHAT — форум по информационной безопасности, OSINT и технологиям

ANTICHAT — русскоязычное сообщество по безопасности, OSINT и программированию. Форум ранее работал на доменах antichat.ru, antichat.com и antichat.club, и теперь снова доступен на новом адресе — forum.antichat.xyz.
Форум восстановлен и продолжает развитие: доступны архивные темы, добавляются новые обсуждения и материалы.
⚠️ Старые аккаунты восстановить невозможно — необходимо зарегистрироваться заново.
Вернуться   Форум АНТИЧАТ > Программирование > С/С++, C#, Delphi, .NET, Asm
   
Ответ
 
Опции темы Поиск в этой теме Опции просмотра

  #1  
Старый 06.11.2007, 00:24
Forcer
Постоянный
Регистрация: 12.04.2007
Сообщений: 413
Провел на форуме:
3578578

Репутация: 275
Отправить сообщение для Forcer с помощью ICQ
По умолчанию

Мне кажется, лучше подредактировать тему, закрепить и выкладывать в ней сорцы реализаций стандартных структур данных(либо ссылки на сорцы). Просто такого вроде бы нету на ачате, а например тоже самое перемножение матриц отлично бы смотрелось как перегрузка оператора * в специальном классе матрицы.
 
Ответить с цитированием

  #2  
Старый 06.11.2007, 00:39
Серенький
Banned
Регистрация: 13.04.2007
Сообщений: 123
Провел на форуме:
921520

Репутация: 572
По умолчанию

Цитата:
нее еще надо врубиться
Для того, чтобы в матлабе перемножить две матрицы, особо и врубаться не нужно. А хелп все остальные вопросы лечит.
 
Ответить с цитированием

  #3  
Старый 06.11.2007, 19:04
VERte][
Moderator - Level 7
Регистрация: 17.05.2007
Сообщений: 220
Провел на форуме:
3013539

Репутация: 441
По умолчанию

вот небольшая поправка: запись результата в отдельный двумерный массив и последующий вывод результатов из него

Код:
#include<iostream>
using namespace std;

typedef int* pint;
void fillarray(pint array[], int m, int n);
pint* result(pint a[], pint b[], int m, int k ,int n);
void output(pint array[], int m, int n);

int main()
{
    int m,n,k;
    char exit;
    cout<<"Input 1st array size: "<<endl<<"m: ";
    cin>>m; cout<<"n: "; cin>>k;
    cout<<"Input 2nd array size: "<<endl<<"m: "<<k<<endl<<"n: ";
    cin>>n;

    pint *p=new pint[m],*q=new pint[k], *res;

    fillarray(p, m,k);
    fillarray(q, k,n);
    res=result(p,q,m,k,n);
    output(res,m,n);


cout<<"Input any key to quit: ";
cin>>exit;
return 0;
}


void fillarray(pint array[], int m, int n)
{
    for (int i=0;i<m;i++)
    array[i]=new int[n];

    cout<<"Input "<<m<<"x"<<n<<" array: "<<endl;
    for(int i=0;i<m;i++)
        for(int j=0;j<n;j++)
        cin>>array[i][j];
}

pint* result(pint a[], pint b[], int m, int k, int n)
{
    int sum(0);
    pint *temp = new pint[m];
    for (int i=0;i<m;i++)
    temp[i]=new int[n];

    for(int i=0;i<m;i++)
      for(int j=0;j<n;j++)
        temp[i][j]=0;



    for(int i=0; i<m; i++)
      for(int j=0; j<n; j++)
        {
            sum=0;
            for(int h=0; h<k ;h++)
            {
                sum=sum+a[i][h]*b[h][j];
            }
             temp[i][j]=sum;
        }
    return temp;

    for (int i=0;i<k;i++)
    delete a[i];

    for (int i=0;i<n;i++)
    delete b[i];

    delete[] a, b;
}

void output(pint array[], int m, int n)
{
    cout<<"Result "<<m<<"x"<<n<<" array:"<<endl;
    for (int i=0;i<m;i++)
     for (int j=0;j<n;j++)
      {
          cout<<array[i][j]<<" ";
          if (j==n-1) cout<<endl;
      }
     for (int i=0;i<n;i++)
     delete array[i];
    delete[] array;
}
 
Ответить с цитированием

  #4  
Старый 06.11.2007, 20:58
Forcer
Постоянный
Регистрация: 12.04.2007
Сообщений: 413
Провел на форуме:
3578578

Репутация: 275
Отправить сообщение для Forcer с помощью ICQ
По умолчанию

Уже не первый раз вижу подобное, поэтому решил написать.
Код:
Код:
for(int i=0; i<m; i++)
      for(int j=0; j<n; j++)
        {
            sum=0;
            for(int h=0; h<k ;h++)
            {
                sum=sum+a[i][h]*b[h][j];
            }
             temp[i][j]=sum;
        }
Зачем объявлять доп. переменную sum? Не проще ли сделать так:
Код:
for(int i=0; i<m; i++)
      for(int j=0; j<n; j++)
        {
            temp[i][j] = a[i][0]*b[0][j];
            for(int h=1; h<k ;h++)
            {
                temp[i][j] += a[i][h]*b[h][j];
            }
        }
И еще по тексту: понимаю что прога маленькая и простенькая, но тем не менее - комментарий вообще нету, обработка исключительных ситуаций тоже отсутствует. Зачем в функции result после return какой-то текст? Он что, когда-то выполняться будет?Переменная exit тоже впринципе не нужна - символ можно поместить и в любую другую переменную, какая разница как он будет храниться? И еще: если хочешь разобраться с указателями, то я бы лично не использовал typedef и конструкции вида array[i][i] заменял бы на *(*(array+i)+j) и использовал бы по максимуму арифметику с указателями. Через некоторое время(впринципе непродолжительное ) приходит понимание и привыкаешь к указателям. Мое имхо .
 
Ответить с цитированием

  #5  
Старый 07.11.2007, 01:49
VERte][
Moderator - Level 7
Регистрация: 17.05.2007
Сообщений: 220
Провел на форуме:
3013539

Репутация: 441
По умолчанию

справедливо, буду учится =) я ж ток начинаю
 
Ответить с цитированием

  #6  
Старый 07.11.2007, 23:54
VERte][
Moderator - Level 7
Регистрация: 17.05.2007
Сообщений: 220
Провел на форуме:
3013539

Репутация: 441
По умолчанию

Цитата:
Сообщение от Forcer  
Зачем объявлять доп. переменную sum? Не проще ли сделать так:
Код:
for(int i=0; i<m; i++)
      for(int j=0; j<n; j++)
        {
            temp[i][j] = a[i][0]*b[0][j];
            for(int h=1; h<k ;h++)
            {
                temp[i][j] += a[i][h]*b[h][j];
            }
        }
А вот ещё проще, зачем надо было ставить строчку temp[i][j] = a[i][0]*b[0][j]; ?
можно вот так:

Код:
for(int i=0; i<m; i++)
      for(int j=0; j<n; j++)
             for(int h=0; h<k ;h++)
                temp[i][j] += a[i][h]*b[h][j];
 
Ответить с цитированием

  #7  
Старый 08.11.2007, 00:09
Forcer
Постоянный
Регистрация: 12.04.2007
Сообщений: 413
Провел на форуме:
3578578

Репутация: 275
Отправить сообщение для Forcer с помощью ICQ
По умолчанию

Vertexe
По адресу temp[i][j] изначально находтися неинициализированное значение. Т.е. совершенно случайное число. Дальше по коду ты предлагаешь прибавлять к этому числу произведения соответствующих элементов. Это неправильно. Нам нужно чтобы там стоял 0, либо произведение первых двух элементов, как и было реализовано в моем сорце.
 
Ответить с цитированием

  #8  
Старый 08.11.2007, 00:12
VERte][
Moderator - Level 7
Регистрация: 17.05.2007
Сообщений: 220
Провел на форуме:
3013539

Репутация: 441
По умолчанию

заметь что в коде у меня идёт сначала обнуление массива temp!!!
 
Ответить с цитированием

  #9  
Старый 08.11.2007, 00:24
Forcer
Постоянный
Регистрация: 12.04.2007
Сообщений: 413
Провел на форуме:
3578578

Репутация: 275
Отправить сообщение для Forcer с помощью ICQ
По умолчанию

Признаюсь, не заметил. =) Но, мне кажется его лучше убрать. В нем нет необходимости. Когда обнуляешь - прогоняешь цикл лишний раз по всем элементам. Это не рационально. Получается огромная потеря по производительности. Раза в 2-а наверное.
 
Ответить с цитированием

  #10  
Старый 08.11.2007, 00:31
VERte][
Moderator - Level 7
Регистрация: 17.05.2007
Сообщений: 220
Провел на форуме:
3013539

Репутация: 441
По умолчанию

Тоже верно...
 
Ответить с цитированием
Ответ





Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
 


Быстрый переход




ANTICHAT.XYZ