Добавление элементов (строки или столбца) в двумерный массив - 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, заканчивая свою работу.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д