
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;
}
#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;
}
Я бы эту работу вообще не принял. Тратить время на умножение, чтобы вычислить адрес? Зачем тогда язык си++ вам, если не учитесь эффективности?
Разбейте задачу не подзадачи, где:
- научиться объявлять двумерные массивы и их инициализировать
- научиться освобождать память под двумерные массивы
Разбейте задачу не подзадачи, где:
- научиться объявлять двумерные массивы и их инициализировать
- научиться освобождать память под двумерные массивы
Хорошо, что Вы уже владеете разыменованием указателей. Но неужели Вы не догадывались о существовании операции инкремента указателя???
Зачем вычислять каждый адрес по сложной формуле, если можно пройти область памяти из конца в конец с помощью вспомогательного указателя?
Чтобы переставить указатель на соседний элемент достаточно инкрементировать этот указатель.
Зачем вычислять каждый адрес по сложной формуле, если можно пройти область памяти из конца в конец с помощью вспомогательного указателя?
Чтобы переставить указатель на соседний элемент достаточно инкрементировать этот указатель.
Похожие вопросы
- Меня бесит вопрос по c++ и c#
- Вопросы о C++
- Вопрос по c++
- Вопрос про c++.
- День добрый \[-_-]/ вопрос по вузовскому программированию на си(C)
- C и C++ вопросы
- У меня вот такой вопрос, к опытным программистам. По поводу c++, и математики.
- C++ вопрос по задаче. Здача лёгкая
- Какие из этих книг вы посоветуете прочесть в первую очередь чтобы повысить свои знания в C/C++?
- Задача по C++