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

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

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

Добрый день! В данном коде возможность добавления элементов (строки или столбца) в двумерный массив реализована посредством создания нового массива, копирования туда элементов из старого массива и добавления в необходимом месте новых элементов.
Листинг программы
  1. #define _CRT_SECURE_NO_WARNINGS
  2. #define SIZE_OF_STRING 256
  3. #include <stdio.h>
  4. #include <stdlib.h>
  5. #include <ctype.h>
  6. #include <stdbool.h>
  7. #include <string.h>
  8. #include <time.h>
  9. bool is_String_Digit(char *Array);
  10. size_t input_Variables(void);
  11. void fill_Binary_Matrix(int **Binary_Matrix, int Amount_of_Elements);
  12. void show_Binary_Matrix(int *Binary_Matrix, int Amount_of_Elements, int Columns);
  13. int *adding_Elements(int *Binary_Matrix, int Strings, int Columns, int Choice);
  14. int select_Action(void);
  15. int main()
  16. {
  17. srand((int)time(NULL));
  18. //-------------------------------------------------------------------------------- Создание и заполнение двумерного массива
  19. puts("Enter amount of strings of array: ");
  20. size_t variable_For_Strings = input_Variables();
  21. //--------------------------------------------------------------------------------
  22. puts("Enter amount of columns of array: ");
  23. size_t variable_For_Columns = input_Variables();
  24. //--------------------------------------------------------------------------------
  25. int *binary_Matrix = (int *)malloc(sizeof(int) * (variable_For_Columns * variable_For_Strings));
  26. fill_Binary_Matrix(&binary_Matrix, (variable_For_Columns * variable_For_Strings));
  27. show_Binary_Matrix(binary_Matrix, (variable_For_Columns * variable_For_Strings), variable_For_Columns);
  28. //-------------------------------------------------------------------------------- Добавление строк и стобцов путём уничтожения старого массива и создания нового
  29. int choice = 0; //Переманная для выбора добавления строки или столбца
  30. (1 == (choice = select_Action())) ? (variable_For_Strings++) : (variable_For_Columns++); // Вызываем функцию предлагающую сделать выбор, после чего, в зависимости от выбора, увеличиваем значение переменной хранящей количество стобцов, или строк, на единицу
  31. binary_Matrix = adding_Elements(binary_Matrix, variable_For_Strings, variable_For_Columns, choice); // Собственно само добавление
  32. show_Binary_Matrix(binary_Matrix, (variable_For_Columns * variable_For_Strings), variable_For_Columns);
  33. puts("");
  34. return 0;
  35. }
  36. size_t input_Variables(void)
  37. {
  38. char array[SIZE_OF_STRING] = { 0 };
  39. size_t variable_For_Input_Variables = 0;
  40. //--------------------------------------------------------------------------------
  41. for (;;) {
  42. fgets(array, SIZE_OF_STRING, stdin);
  43. array[2] = '\0';
  44. if (is_String_Digit(array)) {
  45. variable_For_Input_Variables = atoi(array);
  46. break;
  47. }
  48. else {
  49. puts("W A R N I N G ! ! !\a\nIncorrect values!");
  50. puts("Enter correct values: ");
  51. continue;
  52. }
  53. }
  54. //--------------------------------------------------------------------------------
  55. return variable_For_Input_Variables;
  56. }
  57. bool is_String_Digit(char *Array)
  58. {
  59. if (!isdigit(Array[0])) {
  60. return false;
  61. }
  62. for (int i = 0; (Array[i] != '\0') && (Array[i] != '\n'); i++) {
  63. if (!isdigit(Array[i])) {
  64. return false;
  65. }
  66. }
  67. return true;
  68. }
  69. void fill_Binary_Matrix(int **Binary_Matrix, int Amount_of_Elements)
  70. {
  71. //--------------------------------------------------------------------------------
  72. puts("Enter:\n\t1 - fill matrix only 0;\n\t2 - fill matrix random numbers.");
  73. int choice = 0;
  74. for (;;) {
  75. choice = (int)input_Variables();
  76. if ((choice < 1) || (choice > 2)) {
  77. puts("W A R N I N G ! ! !\a\nIncorrect values!");
  78. puts("Enter:\n\t1 - fill matrix only 0;\n\t2 - fill matrix random numbers.");
  79. continue;
  80. }
  81. else break;
  82. }
  83. //--------------------------------------------------------------------------------
  84. if (1 == choice) {
  85. for (int i = 0; i < Amount_of_Elements; i++) {
  86. (*Binary_Matrix)[i] = 0;
  87. }
  88. }
  89. //--------------------------------------------------------------------------------
  90. else {
  91. for (int i = 0; i < Amount_of_Elements; i++) {
  92. (*Binary_Matrix)[i] = 1 + rand() % 99;
  93. }
  94. }
  95. //--------------------------------------------------------------------------------
  96. }
  97. void show_Binary_Matrix(int *Binary_Matrix, int Amount_of_Elements, int Columns)
  98. {
  99. puts("-----------------------------------------------------------------------------");
  100. for (int i = 1; i <= Amount_of_Elements; i++) {
  101. printf("%-3d", Binary_Matrix[i-1]);
  102. if ((0 == (i % Columns)) && (i > 2)) {
  103. puts("");
  104. }
  105. }
  106. }
  107. int select_Action(void)
  108. {
  109. 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.");
  110. int choice = 0;
  111. for (;;) {
  112. choice = (int)input_Variables();
  113. if ((choice < 1) || (choice > 2)) {
  114. puts("W A R N I N G ! ! !\a\nIncorrect values!");
  115. puts("Enter:\n\t1 - fill matrix only 0;\n\t2 - fill matrix random numbers.");
  116. continue;
  117. }
  118. else break;
  119. }
  120. return (1 == choice) ? 1 : 2;
  121. }
  122. int *adding_Elements(int *Binary_Matrix, int Strings, int Columns, int Choice)
  123. {
  124. int *new_Binary_Matrix = NULL;
  125. //--------------------------------------------------------------------------------
  126. if (1 == Choice) {
  127. int after_String = 0;
  128. //-------------------------------------------------------------------------------- Проверка на превышение количества строк
  129. for (;;) {
  130. puts("Select the string after which you want to paste new string: ");
  131. after_String = (int)input_Variables();
  132. if ((after_String < 1) || (after_String > Strings)) {
  133. puts("W A R N I N G ! ! !\a\nIncorrect values!");
  134. continue;
  135. }
  136. else break;
  137. }
  138. //-------------------------------------------------------------------------------- Алгоритм добавления строки (Копируес старые эелементы в новую матрицу, на месте новой строки вставляем нули)
  139. new_Binary_Matrix = (int *)malloc(sizeof(int) * (Strings * Columns));
  140. for (int i = 0, j = 0, k = 0; i < (Strings * Columns); i++) {
  141. //--------------------------------------------------------------------------------
  142. if ((0 == (i % Columns)) && (i > 2)) {
  143. j++;
  144. }
  145. //--------------------------------------------------------------------------------
  146. if (j != after_String) {
  147. new_Binary_Matrix[i] = Binary_Matrix[k];
  148. k++;
  149. }
  150. else {
  151. new_Binary_Matrix[i] = 0;
  152. }
  153. }
  154. }
  155. //--------------------------------------------------------------------------------
  156. else {
  157. int after_Column = 0;
  158. //-------------------------------------------------------------------------------- Проверка на превышение количества стобцов
  159. for (;;) {
  160. puts("Select the column after which you want to paste new string: ");
  161. after_Column = (int)input_Variables();
  162. if ((after_Column < 1) || (after_Column > Strings)) {
  163. puts("W A R N I N G ! ! !\a\nIncorrect values!");
  164. continue;
  165. }
  166. else break;
  167. }
  168. //-------------------------------------------------------------------------------- Алгоритм добавления стобца (Копируес старые эелементы в новую матрицу, на месте нового столбца вставляем нули)
  169. new_Binary_Matrix = (int *)malloc(sizeof(int) * (Strings * Columns));
  170. for (int i = 0, j = 0, k = 0; i < (Strings * Columns); i++, j++) {
  171. //--------------------------------------------------------------------------------
  172. if ((0 == (i % Columns)) && (i > 2)) {
  173. j = 0;
  174. }
  175. //--------------------------------------------------------------------------------
  176. if (j != after_Column) {
  177. new_Binary_Matrix[i] = Binary_Matrix[k];
  178. k++;
  179. }
  180. else {
  181. new_Binary_Matrix[i] = 0;
  182. }
  183. }
  184. }
  185. free(Binary_Matrix);
  186. //--------------------------------------------------------------------------------
  187. return new_Binary_Matrix;
  188. }
Вопрос, возможно ли сделать эту операцию просто изменив старый массив. Если учесть, что массив в памяти занимает последовательное количество ячеек, которые выделяются при его создании, то это означает, что нужно выделить кусок памяти, на который нужно перенести указатель из определённого элемента старого массива, а также из нового куска памяти нужно сделать указатель из последнего элемента на старый массив. Это сложно, и я не знаю, какими средствами Си это вообще можно сделать. Собственно, имеет ли это вообще некий смысл, или предложенный предыдущий вариант является оптимальным?

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

textual
Листинг программы
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #define N 7
  4. int main()
  5. {
  6.     size_t size_Of_Array = 0;
  7.     scanf("%d", &size_Of_Array);
  8.  
  9.     int *arrayPtr = (int *)malloc(sizeof(int) * size_Of_Array);
  10.  
  11.  
  12.     for (size_t i = 0; i < size_Of_Array; i++) {
  13.         arrayPtr[i] = i;
  14.         printf("%d ", arrayPtr[i]);
  15.     }
  16.  
  17.     //тут какой-то важный код при исполнении которого выяснилось что вам
  18.     //необходимо вставить между элементами 2 и 3 еще N значений
  19.  
  20.     arrayPtr = realloc(arrayPtr, sizeof(int) * size_Of_Array + N);
  21.     size_t i, j, Z = size_Of_Array + N;
  22.     for (i = Z - 1, j = size_Of_Array - 1; i > N + 2; i--, j--)//смещаем
  23.         arrayPtr[i] = arrayPtr[j];
  24.     printf("\nNew array:\n");
  25.     for (i = 3; i < N + 3; i++)//вставляем,вернее,перезаписываем
  26.         arrayPtr[i] = i + 30;
  27.     for (i = 0; i < Z; i++)
  28.         printf("%d ", arrayPtr[i]);
  29.  
  30.     return 0;
  31. }

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

  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

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы