Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

матрицы

35K
01 декабря 2010 года
life4fun
64 / / 15.11.2010
Доброй ночи, помогите пожалуйста упростить\оптимизировать\изменить(в лучшую сторону) код следующей программы:

Код:
#include <iostream>
#include <ctime>
#include <cmath>
 
using std::cout;
using std::cin;
using std::endl;

int sr_geo(int **arr, int n)
{
        int sr_geo=0;
        float pr=1;
        for(int i=0; i<n; i++)
        {
                pr*=abs(arr);
        }
        sr_geo = (int)exp(log((float)pr)/n);
        return sr_geo;
}
 
int main()
{    
         srand((unsigned)time(NULL)); // Функция, которая устанавливает зерно генерации случайных чисел (аргумент - время), из <ctime>.
         int n,i,j;
         int sr;
         int **arr;
         cout<<"Vvedite razmer massiva: ";
         cin>>n;
         arr = new int*[n];
         cout<<"Massiv: "<<endl;
         for(i=0; i<n; i++)
         {
                  arr = new int[n];
                  for(j=0; j<n; j++)
                   {
                     arr[j]=rand()%9+1;
                     cout<<arr[j]<<"  ";
                        }
            cout<<endl;
         }
         sr = sr_geo(arr,n); // Присвоим переменой sr результат выполнения функции sr_geo() (функция поиска среднего геометрического)
         cout<<endl;
         cout<<"Sformirovannaya matrica:"<<endl;
         for(i=0; i<n; i++)
         {
                 for(j=0; j<n; j++)
                 {
                         if((i+j)%2==0)
                         {
                                 arr[j]= sr;
                         }
                         cout<<arr[j]<<"  ";
                 }
                 cout<<endl;
         }
 
         delete arr;
         system("pause");
   return 0;
}


Когда показал код преподавателю, он сказал что все сделано через ж, и сказал все переделать, но я не понимаю что я не так сделал(

а само задание к этой программе звучит так:

Дано действительную квадратную матрицу порядка n. Получить новую матрицу путем замены элементов, сумма индексов которых четная на среднее геометрическое модулей элементов, находящихся на главной диагонали.
33K
01 декабря 2010 года
hivewarrior
205 / / 16.11.2010
Единственное нарекание к коду, так это
Цитата:
delete arr;


Это все-таки массив и при освобождении памяти это надо учитывать с помощью delete [].
Но скорее всего преподаватель просто не понял твое решение (или у него плохое настроение), а программа достаточно хорошо оформлена. Напиши коментариев и снова сдай этот же код.
Единственное, что можно поменять в плане оптимизации, так это заменить двумерный массив [n][n] на одномерный [n*n] и обращаться к нему не [j], а [i*n+j]. Больше обоснованной оптимизации нет.
Ну и ввод элементов не рандом, а с клавиатуры. Тут уж не угадаешь.

535
01 декабря 2010 года
Нездешний
537 / / 17.01.2008
Для удаления двойного динамического массива одного delete[] недостаточно:
 
Код:
//allocate memory
some_type **array = new some_type * [size];
for (unsigned i = 0; i < size; ++i)  array = new some_type [size];

//free memory
for (unsigned i = 0; i < size; ++i)  delete[] array;
delete[] array;


автору темы в гугл или википедию узнавать что такое "среднее геометрическое" и чем оно отличается от "среднего геометрического взвешенного"

целесообразность чехарды с типами внутри функции sr_geo тоже непонятна
392
01 декабря 2010 года
cronya
421 / / 03.01.2009
Ну если улучшить, то зачем тогда использовать двойные указатели, когда они одного типа int.
Пример:
Код:
#include<iostream>
#include<ctime>
using namespace std;

int main(int argc, char* argv[])
{
    srand((unsigned)time(NULL));
    int row=rand()%3+2;
    int column=rand()%3+2;
    int size=row*column;
    int *arr=new int[size];
    for(int idx=0;idx<size;idx++)
        arr[idx]=rand()%10;
    for(int idx=0;idx<row;idx++)
    {
        for(int jdx=0;jdx<column;jdx++)
            cout<<arr[idx*column+jdx]<<"\t";
        cout<<endl;
    }
    delete []arr;
    system("pause");
    cout<<endl;
    return 0;
}

Что касается алгоритма все просто(немного помогу [COLOR="Red"]для вашего кода[/COLOR], хотя общество не очень одобрит мой жест):
1) Считаем среднее геометрическое модулей элементов, находящихся на главной диагонали.
 
Код:
double sred(int **mas,int size)
{
    double proiz=1, rez=0;//лучше тип double вместо float
    for(int idx=0;idx<size;idx++)
    {
        proiz*=abs(mas[idx][idx]);
    }
    rez=pow(proiz,1./size);//так находится среднее геометрическое
    return rez;
}

2) просматриваем матрицу на наличие элементов сумма индексов которых четная
Код:
void swap(int **mas, int size, double sred)
{
    for(int idx=0;idx<size;idx++)  
        for(int jdx=0;jdx<size;jdx++)
            if((idx+jdx)%2==0 && (idx+jdx)!=0)//0 -не нечетное и не четное число его тоже исключаем
            {
                    cout<<mas[idx][jdx]<<" - ["<<idx<<"]["<<jdx<<"]";
                    mas[idx][jdx]=(int)sred;
                    cout<<" :change to '"<<mas[idx][jdx]<<"'"<<endl;
            }
}

Тебе осталось тока разобраться чего да как, и влепить в свой код чтобы работало
392
01 декабря 2010 года
cronya
421 / / 03.01.2009
Цитата: hivewarrior

Ну и ввод элементов не рандом, а с клавиатуры. Тут уж не угадаешь.



Тут я не согласен с вами товарищ:)

33K
01 декабря 2010 года
hivewarrior
205 / / 16.11.2010
Цитата: cronya
Тут я не согласен с вами товарищ:)


От нас с вами мало что зависит, тут важна только воля преподавателя:rolleyes:

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог