Форум русскоязычного сообщества Ubuntu


Увидели сообщение с непонятной ссылкой, спам, непристойность или оскорбление?
Воспользуйтесь ссылкой «Сообщить модератору» рядом с сообщением!

Автор Тема: с++ функции  (Прочитано 3736 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн S@B@K@

  • Автор темы
  • Любитель
  • *
  • Сообщений: 76
    • Просмотр профиля
с++ функции
« : 13 Июнь 2007, 00:07:41 »
народ, помогите, пожалуйста.

нужно: разработать фунцию, которая считает сумму диагональных элементов квадратной матрицы и с ее помощью найти сумму диагональных элементов трех матриц.

вот до чего додумался я.

#include <iostream>
#include <cstdlib>

using namespace std;
int sortirovka(int a, int b, int **q)
{
cout<<"Сумма диагоналей матрицы "<<a<<"x"<<b<<":\n";
int sum=0;
int sum1=0;
for (int i=0; i<a; i++)
for (int j=0; j<b; j++)
{
if(i=j)
{
sum+=q[i][j];
}

}

for (int i=0; i<a; i++)
for (int j=0; j<b; j++)
{
if(a==i+j)
{sum1+=q[i][j];
}
}

int u;
u=sum+sum1;
cout<<u;
}

main()
{

//----------- задаем элементы массива явно
int a[2][2]={{3, 2},
{26, 74}};
// вывод исходной матрицы
cout<<"Исходная Матрица 2x2:";
for (int i=0; i<2; i++)
{
cout<<"\n";
for (int j=0; j<2; j++)
cout<<a[i][j]<<" ";
}
// понадобится для дальнейшего обращения к функции
int *k[2];
for(int i=0;i<2;i++)
k[i]=& a[i][0];

cout<<"\n\n";

sortirovka (2, 2, k); // обращение к функции
cout<<"\n\n";



//----------- задаем элементы массива явно
int c[4][4]={{65, -3, 24, 69},
{74, 85, -49, 5},
{47, -87, 55, -7},
{62, -88, 75, 99}};
// вывод исходной матрицы
cout<<"Исходная Матрица 4x4:";
for (int i=0; i<4; i++)
{
cout<<"\n";
for (int j=0; j<4; j++)
cout<<c[i][j]<<" ";
}
// понадобится для дальнейшего обращения к функции
int *p[4];
for(int i=0;i<4;i++)
p[i]=& c[i][0];

cout<<"\n\n";

sortirovka (4, 4, p); // обращение к функции

cout<<"\n\n";

//--------- задаем элементы массива явно
int b[6][6]={{25, 65, 47, 5, 8, 63},
{-4, 3, -9, 52, 7, 3},
{7, 66, 89, 20, 38, 4},
{24, 85, 98, 65, 23, 45},
{3, 9, 4, 25, 40, 403},
{54, 35, 76, 98, 59, 4}};
// вывод исходной матрицы
cout<<"Исходная Матрица 6x6:";
for (int i=0; i<6; i++)
{
cout<<"\n";
for (int j=0; j<6; j++)
cout<<b[i][j]<<" ";
}
// понадобится для дальнейшего обращения к функции
int *l[6];
for(int i=0;i<6;i++)
l[i]=& b[i][0];

cout<<"\n\n";

sortirovka (6, 6, l); // обращение к функции

cout<<"\n\n";



  return EXIT_SUCCESS; // задержка экрана
}

Оффлайн VestniK

  • Активист
  • *
  • Сообщений: 594
    • Просмотр профиля
Re: с++ функции
« Ответ #1 : 13 Июнь 2007, 01:36:22 »
Цитировать
if(i=j)
:) класная ошибочка. Интересно как он там по этому циклу идёт.
int main()
вместо main() хорошо бы поставить
и ещё sortirovka должна возвращать значение.
Если я правильно понимаю словосочетание сумма диагональных элементов (что как мне помниться в математике называется след), то тогда я не понимаю назначение второго цикла в функции. Ещё одна вещь во втором цикле меня смущает: в математике индексы матрицы нумеруются от 1 до n, а в C массивы нумеруются от 0 до n-1 во втором цикле ты делаешь очень странное сравнение, да ещё и C'шных индексов
Ещё:
for (int i = 0; i < MIN(a,b); i++) {
sum += q[i][i];
}
где MIN():
#define MIN(a,b) (((a) < (b)) ? (a) : (b))
проходить по циклу дважды не нужно.
« Последнее редактирование: 13 Июнь 2007, 01:42:22 от VestniK »

Оффлайн Kwah

  • Заслуженный пользователь
  • Старожил
  • *
  • Сообщений: 1442
  • Ubuntu 17.10
    • Просмотр профиля
Re: с++ функции
« Ответ #2 : 13 Июнь 2007, 12:30:35 »
2 S@B@K@

Если у вас практикум по Си именно "++", то больше 1 (единицы) я бы за такое не поставил.
1. матрицы жёстко вбиты в код
2. про подсчёт следа уже написали + не используется свойство квадратности матрицы
3. каша в коде: работа с данными вперемешку с выводом, странные названия ф-ий, левые комментарии

Совет: почитай умные книжки: Липмана, Саттера и прочих товарищей.

2 VestniK
Использование макросов в Си++, когда без них вполне можно обойтись - моветон :P

Оффлайн S@B@K@

  • Автор темы
  • Любитель
  • *
  • Сообщений: 76
    • Просмотр профиля
Re: с++ функции
« Ответ #3 : 13 Июнь 2007, 18:29:39 »
2Kwah
У нас практикум именно по ++
в универе ведет препод, который сам Си не знает... есесно, ничего не объясняет... поэтому такой уровонь..
пример не притендует на оценку отличную от 0.. :) это просто наброски.. слепок с нескольких программ...

2VestniK
Пасиба, буду менять-думать...

Оффлайн Yurror

  • Старожил
  • *
  • Сообщений: 1966
    • Просмотр профиля
Re: с++ функции
« Ответ #4 : 09 Август 2007, 09:55:38 »
Re: return EXIT_SUCCESS; // задержка экрана
Рыдал.

Оффлайн fixed

  • Новичок
  • *
  • Сообщений: 2
    • Просмотр профиля
Re: с++ функции
« Ответ #5 : 18 Сентябрь 2007, 01:27:36 »
наверное, уже поздно давать ответ... результат, по-моему, должен был быть приблизительно такой:

// кол-во матриц
#define MATRIX_COUNT (3)

#define MIN_MATRIX_SIZE (4)
#define MAX_MATRIX_SIZE (8)
#define MAX_VALUE (10)

#include <iostream>
#include <time.h>
using namespace std;

// класс квадратная матрица
class CMatrix
{
int m_size; // размер матрицы
int **m_matrix; // указатель на собсна матрицу (двумерный массив)
void randomFill(); // заполняет случайными значениями
public:
CMatrix(int size=1);
~CMatrix();
void print(); // вывод матрицы на консоль
int calc(); // подсчет суммы диагоналей
};


CMatrix::CMatrix(int size)
{
m_size = size;
// выделяется память под матрицу
m_matrix = new int*[size];
for(int i=0; i<size; i++)
m_matrix[i] = new int[size];
// заполнение случайными значениями
randomFill();
}

CMatrix::~CMatrix()
{
// освобождение выделеной памяти
for(int i=0; i<m_size; i++)
delete m_matrix[i];
delete m_matrix;
}

// вывод матрицы на консоль
void CMatrix::print()
{
for(int i=0; i<m_size; i++)
{
for(int o=0; o<m_size; o++)
{
cout << m_matrix[o][i] << " ";
}
cout << endl;
}
}

// заполнение случайными значениями
void CMatrix::randomFill()
{
for(int i=0; i<m_size; i++)
{
for(int o=0; o<m_size; o++)
{
m_matrix[o][i] = rand()%MAX_VALUE;
}
}
}

// подсчет суммы диагоналей
int CMatrix::calc()
{
int res=0;
for(int i=0; i<m_size; i++)
{
res+=m_matrix[i][i] + m_matrix[i][m_size-i-1];
}
return res;
}

int main()
{
srand(time(0)); // инициализация генератора случайных чисел
CMatrix* m;
int res = 0, currentSum=0;
for(int i=0; i<MATRIX_COUNT; i++, res+=currentSum)
{
m = new CMatrix(rand()%(MAX_MATRIX_SIZE-MIN_MATRIX_SIZE)+MIN_MATRIX_SIZE);
m->print();
cout << "the sum = " << (currentSum = m->calc()) << endl << endl;
delete m;
}
cout << "total sum : " << res << endl;
return 0;
}
« Последнее редактирование: 18 Сентябрь 2007, 01:30:19 от fixed »

Оффлайн Kwah

  • Заслуженный пользователь
  • Старожил
  • *
  • Сообщений: 1442
  • Ubuntu 17.10
    • Просмотр профиля
Re: с++ функции
« Ответ #6 : 18 Сентябрь 2007, 09:44:57 »
Буду краток:
Использование макросов - моветон
Конструкторов маловато будет
Метод print должен быть const
Что делает "// подсчет суммы диагоналей"? Кстати, он тоже должен быть const
Фи за глобальное using namespace
 

Оффлайн S@B@K@

  • Автор темы
  • Любитель
  • *
  • Сообщений: 76
    • Просмотр профиля
Re: с++ функции
« Ответ #7 : 20 Сентябрь 2007, 10:33:59 »
2Yurror
ну нам так препод в универе говорил. =)))

это задание сдал еще в июне :)
сам доработал, разобрался.

спасибо всем за участие

 

Страница сгенерирована за 0.057 секунд. Запросов: 25.