добавить строку или столбец в C ++, когда значения строки и столбца определяются пользователем - PullRequest
0 голосов
/ 03 ноября 2019

Я написал этот код для выполнения следующей задачи, используя класс, когда размер матрицы определяется во время выполнения, то есть я хочу создать прямоугольную матрицу в квадратную матрицу, так чтобы в добавляемом столбце или строке все элементы имели значение 1 * 1001. *

5 4 5
2 3 1

до

5 4 5
2 3 1
1 1 1
class Array{
    int **p,r,c;
    public:
        void setsize();
        void read();
        void print();
        void createsqm();
};
void Array :: setsize()
{
    cout<<" Enter rows and cols "<<endl;
    cin>>r>>c;
    if(r>c)
    {
        p = new int *[r];
        for(int i =0; i<r; i++)
        {
            p[i] = new int [r];
        }
    }
    else
    {
        p = new int *[c];
        for(int i =0; i<c; i++)
        {
            p[i] = new int [c];
        }   
    }
}
void Array :: read()
{
    int i,j;
    for(i=0;i<r;i++)
    {
        for(j=0; j<c; j++)
        {
            cin>>p[i][j];
        }
    }
}

void Array :: createsqm()
{
    if (r>c)
    {
        int i,j;
        for(i=0;i<r;i++)
        {
            for(j=c; j<r; j++)
                p[i][j]=1;
        }   

    }
    else
    {   int i,j;
        for(j=0;j<c;j++)
        {
            for(i=r; i<c;i++)
               p[i][j]=1;

        }   
    }   
}

Я хочу знать, где я совершаю ошибку

1 Ответ

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

Ваш вопрос:

Я хочу знать, где я делаю ошибку

Есть несколько слоев, где вы делаете ошибку.

  • Требования:

Вы хотите реализовать массив в C ++, хотя все (std::array, std::vector и т. Д.) Доступно. Не делайте этого, кроме как в академических целях.

  • Дизайн

Вы действительно используете new и указатели (для собственной памяти) и простые массивы C-Style в C ++. Вы не должны (не должны) использовать new. А также, пожалуйста, никогда не используйте указатели для ресурсов, таких как собственная память. Не делай этого. Избегайте использования массивов C-Style. В этом нет необходимости, и они подвержены ошибкам.

  • Реализация

Тяжелые ошибки:

createqm запишет за пределы. Это испортит память. Ваш массив имеет начальный размер, и вы обращаетесь к несуществующим строкам или кулонам.

Вы не инициализируете свои переменные

Вы используете память, которая может быть не выделена. Нет проверки

Нет проверки границ перед доступом к необработанной памяти. Что приведет к проблеме в вашем коде.

  • Прочее

Держите ограниченную область видимости. Например. Определите цикл varaible в операторе for, а не выше.

Назовите свои переменные, чтобы кто-нибудь (например, вы через 3 месяца) мог понять код.

Не открывайте полный текст std-namespace

Следуйте некоторым стандартам кодирования и стандарту отступов.

...