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