Запись одномерного массива в двумерный в разных комбинациях - C (СИ)

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

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

задача такая: у нас есть отсортированный массив, из n эл-тов (например 6) и надо его забить в двумерный разными комбинациями, при этом порядок сортировки не должен нарушаться т.е: исх массив 1,2,3,4,5,6 должны получить: если выбираем разбить на 2: 123 124 125 126 134 135 136 145 146 156 234 235 236 245 246 256 345 346 456 если выбираем разбить на 3: 12 13 14 15 16 23 24 25 26 34 35 36 45 46 56 параметр n может быть разный и деления тоже могут быть разными на пары, тройки, четверки и тд подскажите кто нибудь плз..а то уже третий день сижу над этим

Решение задачи: «Запись одномерного массива в двумерный в разных комбинациях»

textual
Листинг программы
#include <stdio.h>
#include <stdlib.h>
 
void Recursion(int *, int, int, int *, int, int)
int main()
{
//В main'е пояснять нечего, я думаю. Всего лишь массивы динамически выделяются.
    int * Array;
    int i, SizeOfArray, SplitNumber;
    printf("Input size of array: ");
    scanf("%d", &SizeOfArray);
    Array = (int*)malloc(SizeOfArray * sizeof(int));
    for(i = 0; i < SizeOfArray; i++)
    {
        Array[i] = i + 1;
    }
    printf("Input number of split: ");
    scanf("%d", &SplitNumber);
    int * String;
    String = (int*)malloc(SplitNumber * sizeof(int));
    Recursion(Array, 0, SplitNumber - 1, String, SizeOfArray, SplitNumber);
    free(Array);
    free(String);
    Array = NULL;
    String = NULL;
}
 
void Recursion(int * Array, //Массив
                 int index, //Текущий индекс
                  int deep, //Глубина рекурсии
              int * String, //Строка на вывод
           int SizeOfArray, //Размер массива
           int SplitNumber) //Количество разбиений
{
    int i = 0; //Просто счётчик
//Смысл такой, инициируем внешний цикл, из него вызываем несколько внутренних,
//Пока глубина рекурсии не достигнет нужной.
//Потом начинаем выводить всё, что получилось.
//Каждый следующий цикл начинается со следующих элементов массива
    for(index; index < SizeOfArray - deep; index++)
    {
//В строку помещаем элемент на текущем уровне рекурсии
        String[SplitNumber - 1 - deep] = Array[index];
//Если уровень ненулевой, то вызываем функцию из самой себя,
        if(deep != 0)
        {
//но со следующего индекса и уровнем рекурсии меньше на единицу
            Recursion(Array, index + 1, deep - 1, String, SizeOfArray, SplitNumber);
        }
//Дошли до нулевого уровня, выводим.
        else
        {
            for(i = 0; i < SplitNumber; i++)
            {
                printf("%d", String[i]);
            }
            printf("\n");
        }
    }
}

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

  1. Объявлены внешние переменные:
    • int * Array;
    • int i, SizeOfArray, SplitNumber;
    • int * String;
  2. В main() выполняются следующие действия:
    • Выделяется динамическая память под массив Array;
    • В цикле заполняются элементы массива значениями от 1 до SizeOfArray;
    • Затем запрашивается количество разбиений SplitNumber;
    • Выделяется динамическая память под массив String;
    • Вызывается функция Recursion() с аргументами Array, 0, SplitNumber - 1, String, SizeOfArray, SplitNumber;
    • Освобождается память, выделенная под массив Array;
    • Освобождается память, выделенная под массив String;
    • Array и String устанавливаются в значение NULL.
  3. В функции Recursion() выполняются следующие действия:
    • Если deep = 0, то выводится строка, сформированная из элементов массива;
    • Если deep > 0, то выполняется рекурсивный вызов функции Recursion() с аргументами Array, index + 1, deep - 1, String, SizeOfArray, SplitNumber;
    • Цикл for генерирует строку, которая передается в рекурсивный вызов;
    • Переменная i инициализируется значением 0.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

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

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