#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. Получить новую матрицу путем замены элементов, сумма индексов которых четная на среднее геометрическое модулей элементов, находящихся на главной диагонали.
Цитата:
delete arr;
Это все-таки массив и при освобождении памяти это надо учитывать с помощью delete [].
Но скорее всего преподаватель просто не понял твое решение (или у него плохое настроение), а программа достаточно хорошо оформлена. Напиши коментариев и снова сдай этот же код.
Единственное, что можно поменять в плане оптимизации, так это заменить двумерный массив [n][n] на одномерный [n*n] и обращаться к нему не [j], а [i*n+j]. Больше обоснованной оптимизации нет.
Ну и ввод элементов не рандом, а с клавиатуры. Тут уж не угадаешь.
Код:
//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;
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 тоже непонятна
Пример:
Код:
#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;
}
#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;
}
{
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;
}
}
{
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;
}
}
Тебе осталось тока разобраться чего да как, и влепить в свой код чтобы работало
Цитата: hivewarrior
Ну и ввод элементов не рандом, а с клавиатуры. Тут уж не угадаешь.
Тут я не согласен с вами товарищ:)
Цитата: cronya
Тут я не согласен с вами товарищ:)
От нас с вами мало что зависит, тут важна только воля преподавателя:rolleyes: