C/C++

Вопрос по C++

Нужно перемножить каждые ненулевые элементы выбранного столбца.Как это сделать?
Можешь написать маааааленький класс для работы с одномерным массивом как с двумерным:

#include < iostream >
using namespace std;

class dmas //класс имитирующий двумерный массив
{
private:
int* array;
int col;
public:
dmas(int* array, int col) //при создании нужен указатель на существующий массив и количество его предполагаемых столбцов
{
this->array = array;
this->col = col;
}

int * operator [] (int str) //перегрузка индексации
{
return array + str * col;
}
};

int& element(int* array, int &col, int &it_str, int &it_col) // функция имитирующая итерацию
{
return array[it_str * col + it_col];
}

int main()
{
setlocale(0, "");
int tik = 0;
int str = 5, col = 3;
int* arr = new int[str * col];
for (int i = 0; i < str; i++)
for (int j = 0; j < col; j++)
element(arr, col, i, j) = tik++; // заполняем элементы массива от 0,1,2,3,4... для наглядности

for (int i = 0; i < str; i++) {
for (int j = 0; j < col; j++)
cout << element(arr, col, i, j) << "\t";
cout << endl;
}

dmas arch(arr, col); //пакуем наш массив arr в класс dmas
cout << endl << "Теперь тоже самое через класс:" << endl << endl;

for (int i = 0; i < str; i++) {
for (int j = 0; j < col; j++)
cout << arch[i][j] << "\t"; //ради чего все и затевалось
cout << endl;
}

int summ = 1; //тут собственно решение вопроса:
cout << "Выберете номер столбца для перемножения" << endl;
cin >> tik; //эта переменная нам еще послужит чтобы запомнить выбранный столбец
for (int i = 0; i < str; i++)
if (arch[i][tik]) summ *= arch[i][tik]; //перемножаем элементы столбца
cout << "\n\n Перемноженный столбец = " << summ;

delete[] arr;
}
Сергей Киреев
Сергей Киреев
51 411
Лучший ответ
Я бы эту работу вообще не принял. Тратить время на умножение, чтобы вычислить адрес? Зачем тогда язык си++ вам, если не учитесь эффективности?
Разбейте задачу не подзадачи, где:
- научиться объявлять двумерные массивы и их инициализировать
- научиться освобождать память под двумерные массивы
Sheroz Sanavbarov
Sheroz Sanavbarov
81 352
   Хорошо, что Вы уже владеете разыменованием указателей. Но неужели Вы не догадывались о существовании операции инкремента указателя???
Зачем вычислять каждый адрес по сложной формуле, если можно пройти область памяти из конца в конец с помощью вспомогательного указателя?

   Чтобы переставить указатель на соседний элемент достаточно инкрементировать этот указатель.
!@
!!!!виталь!!!!! @
16 172