В vvod(*mas[], n, m, i, j); (под bool) пишет что в *mas[] требуется выражение, не пойму что сделать.
using namespace std;
void vvod(int** mas[], int n, int m, int i, int j);
int main()
{
int **mas, n, m, i, j, j1, temp, temp1, sum;
bool fl;
vvod(*mas[], n, m, i, j);
for (i = 0; i<m; i++)
{
sum = 0;
fl = true;
for (j = 0; j<n; j++)
{
sum += *((int*)mas + i*n + j);
if (*((int*)mas + i*n + j)<0)
fl = false;
}
cout << ("в столбце ") << i + 1;
if (!fl)
cout << (" есть орицательный элемент и сумма его элементов равна ") << sum << endl;
else
cout << (" нет отрицательного элемента") << endl;
}
for (j = 0; j<m - 1; j++)
for (j1 = 0; j1<m - 1 - j; j1++)
{
temp1 = temp = 0;
for (i = 0; i<n; i++)
{
if (*((int*)mas + i*n + j1)<0 && abs (*((int*)mas + i*n + j1)) % 2 == 1)
temp += abs(*((int*)mas + i*n + j1));
if (*((int*)mas + i*n + j1+1)<0 && abs(*((int*)mas + i*n + j1 + 1)) % 2 == 1)
temp1 += abs(*((int*)mas + i*n + j1+1));
}
if (temp>temp1)
for (i = 0; i<n; i++)
{
temp = *((int*)mas + i*n + j1);
*((int*)mas + i*n + j1) = *((int*)mas + i*n + j1+1);
*((int*)mas + i*n + j1+1) = temp;
}
}
cout << ("\nПолученная матрица") << endl;
for (i = 0; i<n; i++)
{
for (j = 0; j<m; j++)
{
cout.width(4);
cout << *((int*)mas + i*n + j);
}
cout << endl;
}
cout << endl;
system("pause");
return 0;
}
void vvod(int* mas[], int n, int m, int i, int j)
{
cout << "Введите количество строк матрицы: " << endl;
cin >> n;
if (n < 0) cout << ("Ошибка") << endl;
else
cout << ("\nВведите количество столбцов матрицы: ") << endl;
cin >> m;
if (m < 0) cout << ("Ошибка") << endl;
mas = new int*[n];
for (i = 0; i < n; i++)
mas[i] = new int[m];
cout << ("\nВведите элементы матрицы: ") << endl;
for (i = 0; i < n; i++)
for (j = 0; j < m; j++)
{
cout << "[" << i + 1 << "][" << j + 1 << "]= ";
cin >> *((int*)mas + i*n + j);
}
cout << ("\nИсходная матрица") << endl;
for (i = 0; i < n; i++)
{
for (j = 0; j < m; j++)
{
cout.width(4);
cout << *((int*)mas + i*n + j);
}
cout << endl;
}
}
Другие языки программирования и технологии
Требуется выражение C++ подскажите, что не так.
void vvod(int** mas[], int n, int m, int i, int j); // прототип содержит двойной указатель на массив
void vvod(int* mas[], int n, int m, int i, int j) { // TODO: } // реализация содержит указатель на массив
То есть у вас в объявлении фигурирует трёхмерный массив, а в определении двухмерный. Это то, что бросается в глаза.
int **mas, n, m, i, j, j1, temp, temp1, sum; // здесь имеется не инициализированный указатель на двумерный массив, под который предполагается выделить память. И он же передаётся в функцию, чего делать нельзя!
Нужно чтобы ему присваивался адрес локального указателя из функции, в которой выделялась память, по этому локальному указателю.
Вот тут я когда-то набросал пример этого дела http://pastebin.com/MP1SyHuX
Посмотрите что к чему, разберитесь что там и зачем и как всё работает.
Удачи!
void vvod(int* mas[], int n, int m, int i, int j) { // TODO: } // реализация содержит указатель на массив
То есть у вас в объявлении фигурирует трёхмерный массив, а в определении двухмерный. Это то, что бросается в глаза.
int **mas, n, m, i, j, j1, temp, temp1, sum; // здесь имеется не инициализированный указатель на двумерный массив, под который предполагается выделить память. И он же передаётся в функцию, чего делать нельзя!
Нужно чтобы ему присваивался адрес локального указателя из функции, в которой выделялась память, по этому локальному указателю.
Вот тут я когда-то набросал пример этого дела http://pastebin.com/MP1SyHuX
Посмотрите что к чему, разберитесь что там и зачем и как всё работает.
Удачи!
первое что исправить: стиль записи
не
---
for (j = 0; j<n; j++)
{
sum += *((int*)mas + i*n + j);
if (*((int*)mas + i*n + j)<0)
fl = false;
}
----
А
---
for (j = 0; j<n; j++){
sum += *((int*)mas + i*n + j);
if (*((int*)mas + i*n + j)<0)fl = false;
}
-----
Просто логические куски станут в экран влезать и станет удобнее править прогу и ловить бяки
не лепить на каждый вывод подстройку ширины -однажды выставленная действует до отмены и лишние опятьже просто засирают код..
А обсчет вообще не должен соотносится с выдачей на экран.
матрица?
---
for (i = 0; i < n; i++)
{
for (j = 0; j < m; j++)
{
cout.width(4);
cout << *((int*)mas + i*n + j);
}
cout << endl;
}
-----
нафига на каждом выводе ставить формат? лучше
--
cout.width(4);
for (i = 0; i < n; i++){
for (j = 0; j < m; j++)cout << *((int*)mas + i*n + j);
cout << endl;
}
----
Про объявление
void vvod(int** mas[],...
и вызов
vvod(*mas[],
уже сказано не мной
Добавлю только что vvod() принимет n и m по значению а обрабатываются результаты
так как будто там по ссылке или по указателю
а всякие служебные, типа i и j в этом примере, воообще не должны передаваться, внутренние счетчики циклов только к циклу и относятся
не
---
for (j = 0; j<n; j++)
{
sum += *((int*)mas + i*n + j);
if (*((int*)mas + i*n + j)<0)
fl = false;
}
----
А
---
for (j = 0; j<n; j++){
sum += *((int*)mas + i*n + j);
if (*((int*)mas + i*n + j)<0)fl = false;
}
-----
Просто логические куски станут в экран влезать и станет удобнее править прогу и ловить бяки
не лепить на каждый вывод подстройку ширины -однажды выставленная действует до отмены и лишние опятьже просто засирают код..
А обсчет вообще не должен соотносится с выдачей на экран.
матрица?
---
for (i = 0; i < n; i++)
{
for (j = 0; j < m; j++)
{
cout.width(4);
cout << *((int*)mas + i*n + j);
}
cout << endl;
}
-----
нафига на каждом выводе ставить формат? лучше
--
cout.width(4);
for (i = 0; i < n; i++){
for (j = 0; j < m; j++)cout << *((int*)mas + i*n + j);
cout << endl;
}
----
Про объявление
void vvod(int** mas[],...
и вызов
vvod(*mas[],
уже сказано не мной
Добавлю только что vvod() принимет n и m по значению а обрабатываются результаты
так как будто там по ссылке или по указателю
а всякие служебные, типа i и j в этом примере, воообще не должны передаваться, внутренние счетчики циклов только к циклу и относятся
void vvod(int** mas, int n, int m, int i, int j);
int main()
{
int **mas, n, m, i, j, j1, temp, temp1, sum;
bool fl;
vvod(mas, n, m, i, j);
int main()
{
int **mas, n, m, i, j, j1, temp, temp1, sum;
bool fl;
vvod(mas, n, m, i, j);
Данил Загайнов
Пробовал, появляется ошибка "Ошибка1error C2664: "void vvod(int **[],int,int,int,int)": невозможно преобразовать аргумент 1 из "int **" в "int **[]"63)
Похожие вопросы
- Подскажите учебник по C++! Подскажите учебник по С++, с самого нуля. Желательно с примерами и задачками!
- Помогите, пожалуйста! Куда-то девается свободное место с диска C. Подскажите, что с ним еще можно сделать?
- Очень хочется начать работать в C++ подскажите как это сделать?) )
- задание на C++, подскажите путь решения хотя бы
- C++. Подскажите ответ, есть какие нибудь правила инициализации вложенных структур ?
- c# Подскажите что такое массив?
- Только начал изучать c++, подскажите как в программе указать % ?
- C++ подскажите наглядно про стек и рекурсии
- Требуются ли знания C++ для изучения C#?
- требуется помощь специалистов. Ребята что мне сделать с компьтером чтобы объединить память диска C и D
http://co depad.org/qHK82jqn