Добавление элементов (строки или столбца) в двумерный массив - C (СИ)

Узнай цену своей работы

Формулировка задачи:

Добрый день! В данном коде возможность добавления элементов (строки или столбца) в двумерный массив реализована посредством создания нового массива, копирования туда элементов из старого массива и добавления в необходимом месте новых элементов.
#define _CRT_SECURE_NO_WARNINGS
#define SIZE_OF_STRING 256
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <stdbool.h>
#include <string.h>
#include <time.h>
 
bool is_String_Digit(char *Array);
size_t input_Variables(void);
void fill_Binary_Matrix(int **Binary_Matrix, int Amount_of_Elements);
void show_Binary_Matrix(int *Binary_Matrix, int Amount_of_Elements, int Columns);
int *adding_Elements(int *Binary_Matrix, int Strings, int Columns, int Choice);
int select_Action(void);
 
int main()
{
    srand((int)time(NULL));
    //-------------------------------------------------------------------------------- Создание и заполнение двумерного массива
    puts("Enter amount of strings of array: ");
    size_t variable_For_Strings = input_Variables();
    //--------------------------------------------------------------------------------
    puts("Enter amount of columns of array: ");
    size_t variable_For_Columns = input_Variables();
    //--------------------------------------------------------------------------------
    int *binary_Matrix = (int *)malloc(sizeof(int) * (variable_For_Columns * variable_For_Strings));
    fill_Binary_Matrix(&binary_Matrix, (variable_For_Columns * variable_For_Strings));
    show_Binary_Matrix(binary_Matrix, (variable_For_Columns * variable_For_Strings), variable_For_Columns);
    //-------------------------------------------------------------------------------- Добавление строк и стобцов путём уничтожения старого массива и создания нового
    int choice = 0; //Переманная для выбора добавления строки или столбца
    (1 == (choice = select_Action())) ? (variable_For_Strings++) : (variable_For_Columns++); // Вызываем функцию предлагающую сделать выбор, после чего, в зависимости от выбора, увеличиваем значение переменной хранящей количество стобцов, или строк, на единицу
    binary_Matrix = adding_Elements(binary_Matrix, variable_For_Strings, variable_For_Columns, choice); // Собственно само добавление
    show_Binary_Matrix(binary_Matrix, (variable_For_Columns * variable_For_Strings), variable_For_Columns);
    puts("");
    return 0;
}
 
size_t input_Variables(void)
{
    char array[SIZE_OF_STRING] = { 0 };
    size_t variable_For_Input_Variables = 0;
    //--------------------------------------------------------------------------------
    for (;;) {
        fgets(array, SIZE_OF_STRING, stdin);
        array[2] = '\0';
        if (is_String_Digit(array)) {
            variable_For_Input_Variables = atoi(array);
            break;
        }
        else {
            puts("W A R N I N G ! ! !\a\nIncorrect values!");
            puts("Enter correct values: ");
            continue;
        }
    }
    //--------------------------------------------------------------------------------
    return variable_For_Input_Variables;
}
 
bool is_String_Digit(char *Array)
{
    if (!isdigit(Array[0])) {
        return false;
    }
    for (int i = 0; (Array[i] != '\0') && (Array[i] != '\n'); i++) {
        if (!isdigit(Array[i])) {
            return false;
        }
    }
    return true;
}
 
void fill_Binary_Matrix(int **Binary_Matrix, int Amount_of_Elements)
{
    //--------------------------------------------------------------------------------
    puts("Enter:\n\t1 - fill matrix only 0;\n\t2 - fill matrix random numbers.");
    int choice = 0;
    for (;;) {
        choice = (int)input_Variables();
        if ((choice < 1) || (choice > 2)) {
            puts("W A R N I N G ! ! !\a\nIncorrect values!");
            puts("Enter:\n\t1 - fill matrix only 0;\n\t2 - fill matrix random numbers.");
            continue;
        }
        else break;
    }
    //--------------------------------------------------------------------------------
    if (1 == choice) {
        for (int i = 0; i < Amount_of_Elements; i++) {
            (*Binary_Matrix)[i] = 0;
        }
    }
    //--------------------------------------------------------------------------------
    else {
        for (int i = 0; i < Amount_of_Elements; i++) {
            (*Binary_Matrix)[i] = 1 + rand() % 99;
        }
    }
    //--------------------------------------------------------------------------------  
}
 
void show_Binary_Matrix(int *Binary_Matrix, int Amount_of_Elements, int Columns)
{
    puts("-----------------------------------------------------------------------------");
    for (int i = 1; i <= Amount_of_Elements; i++) {
        printf("%-3d", Binary_Matrix[i-1]);
        if ((0 == (i % Columns)) && (i > 2)) {
            puts("");
        }
    }
}
 
int select_Action(void)
{
    puts("Now you can add new string or new column in matrix.\nEnter: \n\t1 - you will create new string;\n\t2 - you will create new column.");
    int choice = 0;
    for (;;) {
        choice = (int)input_Variables();
        if ((choice < 1) || (choice > 2)) {
            puts("W A R N I N G ! ! !\a\nIncorrect values!");
            puts("Enter:\n\t1 - fill matrix only 0;\n\t2 - fill matrix random numbers.");
            continue;
        }
        else break;
    }
    return (1 == choice) ? 1 : 2;
}
 
int *adding_Elements(int *Binary_Matrix, int Strings, int Columns, int Choice)
{
    int *new_Binary_Matrix = NULL;
    //--------------------------------------------------------------------------------
    if (1 == Choice) {
        int after_String = 0;
        //-------------------------------------------------------------------------------- Проверка на превышение количества строк
        for (;;) {
            puts("Select the string after which you want to paste new string: ");
            after_String = (int)input_Variables();
            if ((after_String < 1) || (after_String > Strings)) {
                puts("W A R N I N G ! ! !\a\nIncorrect values!");
                continue;
            }
            else break;
        }
        //-------------------------------------------------------------------------------- Алгоритм добавления строки (Копируес старые эелементы в новую матрицу, на месте новой строки вставляем нули)
        new_Binary_Matrix = (int *)malloc(sizeof(int) * (Strings * Columns));
        for (int i = 0, j = 0, k = 0; i < (Strings * Columns); i++) {
            //--------------------------------------------------------------------------------
            if ((0 == (i % Columns)) && (i > 2)) {
                j++;
            }
            //--------------------------------------------------------------------------------
            if (j != after_String) {
                new_Binary_Matrix[i] = Binary_Matrix[k];
                k++;
            }
            else {
                new_Binary_Matrix[i] = 0;
            }
        }
    }
    //--------------------------------------------------------------------------------
    else {
        int after_Column = 0;
        //-------------------------------------------------------------------------------- Проверка на превышение количества стобцов
        for (;;) {
            puts("Select the column after which you want to paste new string: ");
            after_Column = (int)input_Variables();
            if ((after_Column < 1) || (after_Column > Strings)) {
                puts("W A R N I N G ! ! !\a\nIncorrect values!");
                continue;
            }
            else break;
        }
        //-------------------------------------------------------------------------------- Алгоритм добавления стобца (Копируес старые эелементы в новую матрицу, на месте нового столбца вставляем нули)
        new_Binary_Matrix = (int *)malloc(sizeof(int) * (Strings * Columns));
        for (int i = 0, j = 0, k = 0; i < (Strings * Columns); i++, j++) {
            //--------------------------------------------------------------------------------
            if ((0 == (i % Columns)) && (i > 2)) {
                j = 0;
            }
            //--------------------------------------------------------------------------------
            if (j != after_Column) {
                new_Binary_Matrix[i] = Binary_Matrix[k];
                k++;
            }
            else {
                new_Binary_Matrix[i] = 0;
            }
        }
    }
    free(Binary_Matrix);
    //--------------------------------------------------------------------------------
    return new_Binary_Matrix;
}
Вопрос, возможно ли сделать эту операцию просто изменив старый массив. Если учесть, что массив в памяти занимает последовательное количество ячеек, которые выделяются при его создании, то это означает, что нужно выделить кусок памяти, на который нужно перенести указатель из определённого элемента старого массива, а также из нового куска памяти нужно сделать указатель из последнего элемента на старый массив. Это сложно, и я не знаю, какими средствами Си это вообще можно сделать. Собственно, имеет ли это вообще некий смысл, или предложенный предыдущий вариант является оптимальным?

Решение задачи: «Добавление элементов (строки или столбца) в двумерный массив»

textual
Листинг программы
#include <stdio.h>
#include <stdlib.h>
#define N 7
int main()
{
    size_t size_Of_Array = 0;
    scanf("%d", &size_Of_Array);
 
    int *arrayPtr = (int *)malloc(sizeof(int) * size_Of_Array);
 
 
    for (size_t i = 0; i < size_Of_Array; i++) {
        arrayPtr[i] = i;
        printf("%d ", arrayPtr[i]);
    }
 
    //тут какой-то важный код при исполнении которого выяснилось что вам
    //необходимо вставить между элементами 2 и 3 еще N значений
 
    arrayPtr = realloc(arrayPtr, sizeof(int) * size_Of_Array + N);
    size_t i, j, Z = size_Of_Array + N;
    for (i = Z - 1, j = size_Of_Array - 1; i > N + 2; i--, j--)//смещаем
        arrayPtr[i] = arrayPtr[j];
    printf("\nNew array:\n");
    for (i = 3; i < N + 3; i++)//вставляем,вернее,перезаписываем
        arrayPtr[i] = i + 30;
    for (i = 0; i < Z; i++)
        printf("%d ", arrayPtr[i]);
 
    return 0;
}

Объяснение кода листинга программы

  1. Подключаются необходимые библиотеки (stdio.h, stdlib.h).
  2. Определяется размер массива N.
  3. Выделяется память под массив (размер массива плюс N) с помощью malloc.
  4. В цикле заполняются элементы массива значениями от 0 до size_Of_Array-1.
  5. Выполняется некоторый важный код, в результате которого требуется вставить N элементов между индексами 2 и 3.
  6. Выделяется дополнительная память под новые элементы с помощью realloc.
  7. Перемещаются элементы, начиная с индекса size_Of_Array-N+2, на одну позицию вправо.
  8. В цикле вставляются N новых элементов, начиная с индекса 3.
  9. Выводятся все элементы нового массива.
  10. Программа возвращает 0, заканчивая свою работу.

Оцени полезность:

13   голосов , оценка 4.154 из 5
Похожие ответы