Наличие параметров матрицы для чтения? - PullRequest
0 голосов
/ 07 ноября 2019

Поэтому часть моей домашней работы - написать программу, в которой будут считаны параметры двумерного массива.

Это мой код:

#include <iostream>
#define ROWCAP 100
#define COLCAP 100
using namespace std;
void readValues(int x, int y, double matrix[x][y]);
void printValues(int x, int y, double matrix[x][y]);
int main() {
    int row;
    int cols;

    cout<<"Enter the number of rows: ";
    cin>>row;
    while(row>ROWCAP){
        cout<<"Number is too large, try again: ";
        cin>>row;
    }
    cout<<"Enter the number of columns: ";
    cin>>cols;
    while(cols>COLCAP){
        cout<<"Number is too large, try again: ";
        cin>>cols;
    }
    double matrix[row][cols];
    cout<<"Enter the matrix: \n";
    readValues(row,cols,matrix[row][cols]);
    cout<<"\nThe matrix entered was:\n";
    printValues(row,cols,matrix[row][cols])
    return 0;
}

void readValues(int x, int y, double matrix[x][y])
{
    for(int i=0; i<x; i++)
    {
        for(int j=0; j<y; j++)
        {
            cin>>matrix[i][j];
        }
    }
}

void printValues(int x, int y, double matrix[x][y])
{
    for(int i=0; i<x; i++)
    {
        for(int j=0; j<y; j++)
        {
            cout<<matrix[i][j]<<"\t";
        }
        cout<<endl;
    }
}

Это ошибки:

error: 'matrix' declared as array of references of type 'double &'
void readValues(int x, int y, double &matrix[x][y]);

Я застрял на этом три часа. Что я делаю не так?
PS Можно использовать только iostream

Ответы [ 3 ]

2 голосов
/ 07 ноября 2019

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

. Чтобы определить размер всех измерений, вы также можете опустить описание размера первого измерения, например: void Func(int array[3][10]); void Func(int array[][10]); Оба являются допустимыми и эквивалентными, но вы не можете опустить размер второго или более высокого измерения.

#include <iostream>
#define ROWCAP 100
#define COLCAP 100

using namespace std;
double matrix[ROWCAP][COLCAP];
void readValues(int x, int y, double matrix[][100]);
void printValues(int x, int y, double matrix[][100]);

int main() {

    int row;

    int cols;

    cout << "Enter the number of rows: ";
    cin >> row;
    while (row > ROWCAP) {
        cout << "Number is too large, try again: ";
        cin >> row;
    }
    cout << "Enter the number of columns: ";
    cin >> cols;
    while (cols > COLCAP) {
        cout << "Number is too large, try again: ";
        cin >> cols;
    }

    cout << "Enter the matrix: \n";
    readValues(row, cols, matrix);
    cout << "\nThe matrix entered was:\n";
    printValues(row, cols, matrix);
    return 0;
}

void readValues(int x, int y, double matrix[][100])
{
    for (int i = 0; i < x; i++)
    {
        for (int j = 0; j < y; j++)
        {
            cin >> matrix[i][j];
        }
    }
}

void printValues(int x, int y, double matrix[][100])
{
    for (int i = 0; i < x; i++)
    {
        for (int j = 0; j < y; j++)
        {
            cout << matrix[i][j] << "\t";
        }
        cout << endl;
    }
}

Кстати: (1) Параметр представляет собой двумерный массив, но размерностьуказывается второе измерение.

int array[10][10];

Объявление функции: void fuc(int a[][10]);

Вызов функции: fuc(array);

  • В функцииfuc, a - двумерный массив. Используйте форму a[i][j] для доступа к элементам в массиве.

(2) Параметр использует массив одномерных указателей.

Int *array[10];

For(i = 0; i < 10; i++)

Array[i] = new int[10];

Объявление функции: void fuc(int *a[10]);

Вызов функции: fuc(array);

  • В функции fuc a - это одномерный массив указателей. Используйте форму *(a[i] + j) для доступа к элементам в массиве.

(3) Указатель параметра использует указатель.

Int **array;

Array = new int *[10];

For(i = 0; i <10; i++)

Array[i] = new int[10];

Объявление функции: void fuc(int **a);

Вызов функции: fuc(array);

  • В функции fuc a является указателем на указатель. Используйте форму *(int *)(a + i*d2 + j) для доступа к элементам в массиве.
0 голосов
/ 07 ноября 2019

См. Проблему Основная проблема этого подхода - VLA (массив переменного размера). Прочитайте это

Измерение должно быть известно во время компиляции, что означает, что измерение должно быть постоянным выражением. Но в вашем случае вы используете x и y для создания массива, значения которого будут известны во время выполнения. Вам повезло, что ваш компилятор позволяет вам это сделать. Но помните, что эти VLA не поддерживаются в C ++.

Все, что вы можете сделать, -

double matrix[100][100]; // declare it globally. Btw it's your choice it can be inside function. Notice we have provided the size at compiler time(100).
void readValues(int x, int y, double matrix[][100]); 
void printValues(int x, int y, double matrix[][100]);
int main() {
    int row;
    int cols;

    cout<<"Enter the number of rows: ";
    cin>>row;
    while(row>ROWCAP){
        cout<<"Number is too large, try again: ";
        cin>>row;
    }
    cout<<"Enter the number of columns: ";
    cin>>cols;
    while(cols>COLCAP){
        cout<<"Number is too large, try again: ";
        cin>>cols;
    }

    cout<<"Enter the matrix: \n";
    readValues(row,cols,matrix); // Just pass it like normal argument.
    cout<<"\nThe matrix entered was:\n";
    printValues(row,cols,matrix);
    return 0;
}

void readValues(int x, int y, double matrix[][100]) //
{
    for(int i=0; i<x; i++)
    {
        for(int j=0; j<y; j++)
        {
            cin>>matrix[i][j];
        }
    }
}

void printValues(int x, int y, double matrix[][100])
{
    for(int i=0; i<x; i++)
    {
        for(int j=0; j<y; j++)
        {
            cout<<matrix[i][j]<<"\t";
        }
        cout<<endl;
    }
}

ВЫХОД

Enter the number of rows: 3
Enter the number of columns: 3
Enter the matrix:
1
2
3
4
5
6
7
8
9

The matrix entered was:
1       2       3
4       5       6
7       8       9

Process returned 0 (0x0)   execution time : 7.435 s
Press any key to continue.

РЕДАКТИРОВАТЬ - Я заметил, что ваш учитель попросил использовать глобальную строку и столбец const. Так что вы должны сделать так.


const int row = 100;
const int column = 100;
double matrix[row][column]; // Now you can do this as row and column are const. before it was error.
void readValues(int x, int y, double matrix[][100]);
void printValues(int x, int y, double matrix[][100]);
int main() {
    int roww, colss;
    cout<<"Enter the number of rows: ";
    cin>>roww;
    while(roww>row){
        cout<<"Number is too large, try again: ";
        cin>>roww;
    }
    cout<<"Enter the number of columns: ";
    cin>>colss;
    while(colss>column){
        cout<<"Number is too large, try again: ";
        cin>>colss;
    }
    double matrix[100][100];
    cout<<"Enter the matrix: \n";
    readValues(roww,colss,matrix);
    cout<<"\nThe matrix entered was:\n";
    printValues(roww,colss,matrix);
    return 0;
}

void readValues(int x, int y, double matrix[][100])
{
    for(int i=0; i<x; i++)
    {
        for(int j=0; j<y; j++)
        {
            cin>>matrix[i][j];
        }
    }
}

void printValues(int x, int y, double matrix[][100])
{
    for(int i=0; i<x; i++)
    {
        for(int j=0; j<y; j++)
        {
            cout<<matrix[i][j]<<"\t";
        }
        cout<<endl;
    }
}


0 голосов
/ 07 ноября 2019

Если ваше назначение - использовать массивы и ничего более, массив должен быть объявлен с целочисленным литералом, устанавливающим количество элементов для каждого измерения, например,

int main() {

    double matrix[ROWCAP][COLCAP];

Инициализируйте ваши переменные, чтобы сделать ваши начальные сравненияработа для вас:

    int row = 101;
    int col = 101;

    while (row > ROWCAP) {
        cout << "\nEnter the number of rows: ";
        if (!(cin >> row)) {
            cerr << "error: invalid integer input - row\n";
            return 1;
        }
        if (row <= ROWCAP)
            break;
        cerr << "error: exceeds " << ROWCAP << '\n';
    }

(то же самое для col с COLCAP, примечание: вы можете просто непрерывно выполнять цикл, пока не получите требуемый ввод, например, while (1) {...})

Чтобы передать двумерный массив в функцию, у вас есть 2 варианта:

void readValues(int x, int y, double matrix[][COLCAP]);

или

void readValues(int x, int y, double (*matrix)[COLCAP]);

Соответствующая функция определение будетбыть:

void readValues (int x, int y, double matrix[][COLCAP])
{
    for (int i=0; i<x; i++)
    {
        for (int j=0; j<y; j++)
        {
            if (!(cin >> matrix[i][j])) {
                cerr << "error: invalid integer input - matrix[i][j]\n";
                exit (EXIT_FAILURE);
            }
        }
    }
}

или

void readValues (int x, int y, double (*matrix)[COLCAP])

( примечание: вы должны проверить каждый пользовательский ввод )

Когда вы вызываете функцию, передающую 2D-массив, вы передаете только имя массива:

    cout << "Enter the matrix:\n";
    readValues (row, col, matrix);

Если положить его в целом, вы можете сделать:

#include <iostream>

#define ROWCAP 100
#define COLCAP 100

using namespace std;

void readValues(int x, int y, double matrix[][COLCAP]);
void printValues(int x, int y, double matrix[][COLCAP]);

int main() {

    double matrix[ROWCAP][COLCAP];
    int row = 101;
    int col = 101;

    while (row > ROWCAP) {
        cout << "\nEnter the number of rows: ";
        if (!(cin >> row)) {
            cerr << "error: invalid integer input - row\n";
            return 1;
        }
        if (row <= ROWCAP)
            break;
        cerr << "error: exceeds " << ROWCAP << '\n';
    }

    while (col > COLCAP) {
        cout << "\nEnter the number of cols: ";
        if (!(cin >> col)) {
            cerr << "error: invalid integer input - col\n";
            return 1;
        }
        if (col <= COLCAP)
            break;
        cerr << "error: exceeds " << COLCAP << '\n';
    }

    cout << "Enter the matrix:\n";
    readValues (row, col, matrix);
    cout<<"\nThe matrix entered was:\n";
    printValues (row, col, matrix);
    return 0;
}

void readValues (int x, int y, double matrix[][COLCAP])
{
    for (int i=0; i<x; i++)
    {
        for (int j=0; j<y; j++)
        {
            if (!(cin >> matrix[i][j])) {
                cerr << "error: invalid integer input - matrix[i][j]\n";
                exit (EXIT_FAILURE);
            }
        }
    }
}

void printValues (int x, int y, double matrix[][COLCAP])
{
    for (int i=0; i<x; i++)
    {
        for(int j=0; j<y; j++)
        {
            cout << matrix[i][j] << "\t";
        }
        cout << endl;
    }
}

Пример использования / Вывод

$ ./bin/matrix_cin

Enter the number of rows: 3

Enter the number of cols: 3
Enter the matrix:
1 2 3 4 5 6 7 8 9

The matrix entered was:
1       2       3
4       5       6
7       8       9

Посмотрите вещи и дайте мне знать, если у вас есть дополнительные вопросы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...