1

Тема: Реалізуйте меню. Помилка в функції add__pos (С++)

Попередня назва: допоможіть(С++)

Реалізуйте меню.
Написати функцію, яка:
Створює двовимірний динамічний масив.
Заповнює масив випадковими числами.
Виводить масив на екран.
Добавляє рядок в кінець масиву.
Добавляє рядок напочаток масиву.
Добавляє рядок у вказану позицію.
Добавляє декілька рядків починаючи зі вказаної позиції.
Видаляє рядок зкінця масиву.
Видаляє рядок з початку масиву.
Видаляє двовимірний масив.
ось мій код

#include <iostream>
#include <time.h>
#include <iomanip>
using namespace std;
void func(int**&ar, int m, int n);
void set(int** ar, int m, int n);
void print(int** ar, int m, int n);
void add_end(int** &ar, int &m, int n);
void add_p(int** &ar, int &m, int n);
void add_pos(int** &ar, int &m, int n, int pos);
void add__pos(int** &ar, int &m, int n, int pos, int num);
void del_end(int** &ar, int &m, int n);
void del_p(int** &ar, int &m, int n);
void delet(int** ar, int &m, int &n);
void main() {
    setlocale(LC_ALL, "ru");
    srand(time(0));
    int m, n, choice, pos, num;
    cout << "Введiть кiлькiсть рядкiв: ";
    cin >> m;
    cout << "Введiть кiлькiсть стовпцiв: ";
    cin >> n;
    int** ar = nullptr;
    func(ar, m, n);
    set(ar, m, n);
    print(ar, m, n);
    cout << "1 - створити двовимiрний масив \n2 - заповнити масив \n3 - вивести масив на екран \n4 - добавити рядок в кiнець масиву \n5 - добавити рядок на початок масиву \n6 - добавити рядок в вибрану позицiю \n7 - добавити декiлька рядкiв в вибрану позицiю \n8 - видалити рядок з кiнця масиву \n9 - видалити рядок з початку масиву \n10 - видалити двовимiрний масив \n0 - вийти \nВведiть вибiр:";
    cin >> choice;
    for (; choice ;) {
        switch (choice) {
        case 1:
            func(ar, m, n);
            break;
        case 2:
            set(ar, m, n);
            break;
        case 3:
            print(ar, m, n);
            break;
        case 4:
            add_end(ar, m, n);
            break;
        case 5:
            add_p(ar, m, n);
            break;
        case 6:
            cout << "Введiть позицiю: ";
            cin >> pos;
            add_pos(ar, m, n, pos);
            break;
        case 7:
            cout << "Введiть позицiю: ";
            cin >> pos;
            cout << "Введiть кiлькiсть: ";
            cin >> num;
            add__pos(ar, m, n, pos, num);
            break;
        case 8:
            del_end(ar, m, n);
            break;
        case 9:
            del_p(ar, m, n);
            break;
        case 10:
            delet(ar, m, n);
            break;
        }
            cout << "1 - створити двовимiрний масив \n2 - заповнити масив \n3 - вивести масив на екран \n4 - добавити рядок в кiнець масиву \n5 - добавити рядок на початок масиву \n6 - добавити рядок в вибрану позицiю \n7 - добавити декiлька рядкiв в вибрану позицiю \n8 - видалити рядок з кiнця масиву \n9 - видалити рядок з початку масиву \n10 - видалити двовимiрний масив \n0 - вийти \nВведiть вибiр:";
            cin >> choice;
    }
    system("pause");
}
void add__pos(int** &ar, int &m, int n, int pos, int num) {
    int** p = new int*[m + num];
    for (int i = 0; i < pos; i++) {
        p[i] = ar[i];
    }
    for (int i = pos + num; i <= m + num; i++) {
        p[i] = ar[i - 1];
    }
    for (int i = pos; i < pos + num; i++) {
        p[i] = new int[n];
        for (int j = 0; j < n; j++) {
            p[i][j] = rand() % 101 - 50;
        }
    }
    delete[]ar;
    ar = p;
    m += num;
}
void add_pos(int** &ar, int &m, int n, int pos) {
    int** p = new int*[m + 1];
    p[pos] = new int[n];
    for (int i = 0; i < n; i++) {
        p[pos][i] = rand() % 101 - 50;
    }
    for (int i = 0; i < pos; i++) {
            p[i] = ar[i];
    }
    for (int i = pos + 1; i <= m; i++) {
        p[i] = ar[i - 1];
    }
    delete[]ar;
    ar = p;
    m++;
}
void del_p(int** &ar, int &m, int n) {
    m--;
    int** p = new int*[m];
    for (int i = 0; i < m; i++) {
        p[i] = ar[i + 1];
    }
    delete[]ar;
    ar = p;
}
void add_p(int** &ar, int &m, int n) {
    int** p = new int*[m + 1];
    p[0] = new int[n];
    for (int i = 0; i < n; i++) {
        p[0][i] = rand() % 101 - 50;
    }
    for (int i = 1; i <= m; i++) {
        p[i] = ar[i - 1];
    }
    delete[]ar;
    ar = p;
    m++;
}
void del_end(int** &ar, int &m, int n) {
    m--;
    int** p = new int*[m];
    for (int i = 0; i < m; i++) {
        p[i] = ar[i];
    }
    delete[]ar;
    ar = p;
    
}
void add_end(int** &ar, int &m, int n) {
    int** p = new int*[m + 1];
    for (int i = 0; i < m; i++) {
        p[i] = ar[i];
    }
    p[m] = new int[n];
    for (int i = 0; i < n; i++) {
        p[m][i] = rand() % 101 - 50;
    }
    delete[]ar;
    ar = p;
    m++;
}
void delet(int** ar, int &m, int &n) {
    for (int i = 0; i < m; i++) {
        delete[] ar[i];
    }
    delete[] ar;
    m = n = 0;
    ar = nullptr;
}
void print(int** ar, int m, int n) {
    for (int i = 0; i < m; i++) {
        for (int j = 0; j < n; j++) {
            cout << setw(5) << ar[i][j];
        }
        cout << "\n";
    }
}
void set(int** ar, int m, int n) {
    for (int i = 0; i < m; i++) {
        for (int j = 0; j < n; j++) {
            ar[i][j] = rand() % 101 - 50;
        }
    }
}
void func(int**&ar, int m, int n) {
    ar = new int*[m];
    for (int i = 0; i < m; i++) {
        ar[i] = new int[n];
    }
}

в Добавляє декілька рядків починаючи зі вказаної позиції.
коли добавляє декілька то вибиває помилка коли 1 то працює нормально допоможіть вирішити цю проблему,ось код цієї функції(якщо комусь лінь шукати в цілому коді)

void add__pos(int** &ar, int &m, int n, int pos, int num) {
    int** p = new int*[m + num];
    for (int i = 0; i < pos; i++) {
        p[i] = ar[i];
    }
    for (int i = pos + num; i <= m + num; i++) {
        p[i] = ar[i - 1];
    }
    for (int i = pos; i < pos + num; i++) {
        p[i] = new int[n];
        for (int j = 0; j < n; j++) {
            p[i][j] = rand() % 101 - 50;
        }
    }
    delete[]ar;
    ar = p;
    m += num;
}
Подякували: koala1

2

Re: Реалізуйте меню. Помилка в функції add__pos (С++)

Хочу подякувати вам за добре побудоване питання.

трохи модераторського буркотіння

Довгий код краще в спойлер брати, і ще бажано вказувати, яку саме помилку, але тут ніби очевидно, що не в ту пам'ять залізли; але це дрібниці, не зважайте

А помилка тут:

    for (int i = pos + num; i <= m + num; i++) {
        p[i] = ar[i - 1];
    }

а має бути

    for (int i = pos + num; i < m + num; i++) {
        p[i] = ar[i - num];
    }

ніби, тільки обережно перевірте крайові умови, я не тестував. Бо так, як у вас, беруться pos+num-1, pos+num і т.д. до m+num-1 рядки, а їх там немає, якщо num>1.

Подякували: Parsifal, leofun01, Chemist-i3

3

Re: Реалізуйте меню. Помилка в функції add__pos (С++)

Дякую коало допомогло.