Обработка двумерного массива
Программа должна по выбору пользователя осуществлять ввод исходной матрицы с клавиатуры или из файла (это у меня есть). Для этого программа должна содержать две соответствующие функции, указатель на одну из которых необходимо передавать в функцию для вычисления элементов массива Х. Данная функция должна вызывать через указатель одну из функций ввода элементов матрицы, производить вычисление элементов массива X в соответствии с заданием и возвращать указатель на этот массив. Кроме того, программа должна содержать функцию для вывода на экран и в файл исходной матрицы и результирующего массива, а также рекурсивную функцию определения в соответствии с заданием величины Y. В программе не должно быть глобальных переменных. У меня дана матрица А(5х5). Необходимо определить массив Х из 5 элементов, каждый из которых равен первому отрицательному элементу соответствующей строки матрицы или нулю, если все элементы строки положительны. Определить величину Y, как индекс первого отрицательного элемента массива X. В моей программе есть "пример обработки матрицы", но я не уверена, что функция делает всё верно и у меня нет рекурсивной функции. Не понимаю как её сделать.
#include <iostream>
#include <fstream>
#define _CRT_SECURE_NO_WARNINGS
#define n 5
using namespace std;
void input_matrsam(int A[n][n])
{
cout << "Введите элементы матрицы А:\n";
for (int i = 0; i < n; i++)
for (int j = 0; j < n; j++)
cin >> A[i][j];
}
void input_matr(int A[n][n])
{
int i, j;
FILE* fp;
fp = fopen("in.txt", "r");
if (fp)
if (fp)
{
for (i = 0; i < n; i++)
for (j = 0; j < n; j++)
fscanf(fp, "%d", &A[i][j]);
fclose(fp);
}
}
//
// пример обработки матрицы
//
int* mas(int(*a)[n], int* otr,
void (*Process)(int[n][n]))
{
int otr, i, j;
Process(a);
for (i = 0; i < n; ++i)
{
otr[i] = 0;
for (j = 0; j < n; ++j)
{
if (a[i][j] < 0)
{
otr[i] = a[i][j];
break;
}
}
}
}
void output(const int x[], const int a[][n])
{
cout << "Массив А:\n";
for (int i = 0; i < n; i++, cout << '\n')
for (int j = 0; j < n; j++)
cout << a[i][j] << '\t';
cout << "Массив X:\n";
for (int j = 0; j < n; j++)
cout << x[j] << ' ';
}
int main()
{
setlocale( LC_ALL, "Rus" );
int a[n][n], x[n], y;
void (*Process)(int[n][n]);
cout << "Ввод матрицы:\n1. С клавитуры\n2. Из файла\n";
int c;
do
cin >> c;
while (c != 1 && c != 2);
// Присваивание указателю адреса одной их функций:
switch (c)
{
case 1: Process = &input_matr;
break;
case 2: Process = &input_matrsam;
break;
}
output(mas(a, x, Process), a);
return 0;
}
Ответы (1 шт):
Вот рекурсивная функция поиска Y: serchingY(). Но вначале не правильно прочел условие и в качестве бонуса рекурсивное заполнение массива X.
#include <iostream>
void search(int* matrixA, int* arrayX, int matrixNoRows, int matrixNoColumns)
{
if (matrixNoRows == 0)
return;
int number = 0;
for(int i = 0; i < matrixNoColumns; ++i)
if (number > *(matrixA + (matrixNoRows - 1) * matrixNoColumns + i) ){
number = *(matrixA + (matrixNoRows - 1) * matrixNoColumns + i);
break;
}
arrayX[matrixNoRows - 1] = number;
search(matrixA, arrayX, matrixNoRows - 1, matrixNoColumns);
}
void searchingY(int* array, int arraySize, int& y, int position = 0)
{
if (position == arraySize){
y = -1; // если нет отрицательных чисел в массиве, то y = -1
return;
}
if (*(array + position) < 0){
y = *(array + position) ;
return;
}
searchingY(array, arraySize, y, ++position);
}
int main() {
std::cout << "input number of rows:\n"; //если у вас матрица квадратная, то достаточно только одной переменной
int rows, columns;
std::cin >> rows;
std::cout << "input number of columns:\n"; //если у вас матрица квадратная, то этой строки...
std::cin >> columns; // ...и этой строки не надо как и переменной columns. Вместо нее везде пишите rows
int matrixA[rows][columns];
int arrayX[rows];
// далее в зависимости от метода ввода используете функцию заполнения матрицы
// ...
search((int*)matrixA, arrayX, rows, columns);
for (int i = 0; i < rows; ++i) // проверка содержимого arrayX
std::cout << arrayX[i] << '\t'; // этот цикл
std::cout << std::endl; // можно удалить
int y;
searchingY(arrayX, rows, y);
std::cout << "Y : " << y << '\n';
return 0;
}