Добавление элементов (строки или столбца) в двумерный массив - 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;
- }
Объяснение кода листинга программы
- Подключаются необходимые библиотеки (stdio.h, stdlib.h).
- Определяется размер массива N.
- Выделяется память под массив (размер массива плюс N) с помощью malloc.
- В цикле заполняются элементы массива значениями от 0 до size_Of_Array-1.
- Выполняется некоторый важный код, в результате которого требуется вставить N элементов между индексами 2 и 3.
- Выделяется дополнительная память под новые элементы с помощью realloc.
- Перемещаются элементы, начиная с индекса size_Of_Array-N+2, на одну позицию вправо.
- В цикле вставляются N новых элементов, начиная с индекса 3.
- Выводятся все элементы нового массива.
- Программа возвращает 0, заканчивая свою работу.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д