Сформировать из массива другой массив, содержащий цифры, расположенные по возрастанию - C (СИ)
Формулировка задачи:
Здравствуйте!
Дан массив чисел Сформировать из этого массива другой массив, содержащий цифры, расположенные по возрастанию, т.е. получится Я анализировал методы сортировки, но видимо опыта не хватает на реализацию данной задачи. Заранее спасибо!
a=[1,4,0,3,7,3,5,8,10,6,2,7,8]
a=1,4,3,7,3,5,8,10,2,7,8
#include <stdio.h> #include <locale.h> void input_keyboard(int s) { int a[s]; printf("Введите элементы матрицы А: \n"); for (int i=0; i<s; i++) scanf ("%d", &a[i]); } void sort(int s) { int a[s],i,j,tmp; for(i = 0 ; i < s - 1; i++) { for(j = 0 ; j < s - i - 1 ; j++) { if(a[j] > a[j+1]) { tmp = a[j]; a[j] = a[j+1]; a[j+1] = tmp; } } } printf("\n Результат Матрица: \n"); for (i=0; i<s; i++) printf ("%d ", a[i]); } void vyvod (int s) { int a[s]; printf("\n Матрица: \n"); for (int i=0; i<s; i++) printf ("%d ", a[i]); } int main() { int n; setlocale (LC_ALL, "Russian"); printf("Введите размерность матрицы: \n"); scanf("%d",&n); input_keyboard(n); vyvod(n); sort(n); }
Решение задачи: «Сформировать из массива другой массив, содержащий цифры, расположенные по возрастанию»
textual
Листинг программы
#include <stdio.h> #include <stdlib.h> #include <string.h> int* GetAscendingSequences(const int* const arr, const int n, int* const resArrLength) { int* res = NULL; int* temp = NULL; int newLength = 0; int i = 0; int flag = 0; res = malloc(n * sizeof(*res)); if (res != NULL) { memset(res, 0, n * sizeof(*res)); i = 0; flag = 0; while (i < n) { if (flag && (i == (n - 1))) { /* there can be a not closed sequence at the end */ res[newLength] = arr[i]; newLength++; flag = 0; } else { if (arr[i] < arr[i+1]) { /* we have a sequence */ flag = 1; res[newLength] = arr[i]; newLength++; } else { if (flag) { /* ending sequence */ res[newLength] = arr[i]; newLength++; flag = 0; } } } i++; } if (newLength < n) { temp = realloc(res, newLength * sizeof(temp)); if (temp == NULL) { free(res); res = NULL; } else { res = temp; temp = NULL; } } (*resArrLength) = newLength; } return res; } int main(void) { int a[13] = {1,4,0,3,7,3,5,8,10,6,2,7,8}; int* b = NULL; int N = 0; int i = 0; b = GetAscendingSequences(a, 13, &N); if (b != NULL) { for(i = 0; i < N; i++) printf("%d ", b[i]); } return 0; }
Объяснение кода листинга программы
В данном коде представлен алгоритм, который получает на вход массив чисел и формирует из него массив, содержащий цифры, расположенные по возрастанию. Алгоритм работает следующим образом:
- Инициализируем новый массив res нулями.
- Проходим по исходному массиву arr.
- Если текущий элемент arr[i] меньше следующего элемента arr[i+1], то мы нашли последовательность чисел, которая убывает. Добавляем текущий элемент в конец нового массива и помечаем флаг=1.
- Если текущий элемент arr[i] больше следующего элемента arr[i+1], то мы нашли конец предыдущей последовательности. Добавляем текущий элемент в начало нового массива и помечаем флаг=0.
- Если мы уже прошли весь исходный массив и длина нового массива меньше, чем количество элементов в исходном массиве, значит, в конце исходного массива есть не законченная последовательность. Добавляем последний элемент в новый массив и помечаем флаг=0.
- Если длина нового массива равна количеству элементов в исходном массиве, то мы нашли все возможные последовательности.
- Возвращаем новый массив. Пример работы алгоритма: Входные данные: a = [1, 4, 0, 3, 7, 3, 5, 8, 10, 6, 2, 7, 8] Результат работы алгоритма: [0, 1, 2, 3, 3, 4, 5, 6, 7, 7, 8, 8] Пояснение к коду:
- В функции GetAscendingSequences используется динамическое выделение памяти под массив res с помощью malloc. При этом, если память не может быть выделена, то выделяется нулевой указатель.
- В функции main создается массив a, инициализированный значениями [1, 4, 0, 3, 7, 3, 5, 8, 10, 6, 2, 7, 8].
- Затем вызывается функция GetAscendingSequences, передавая ей массив a и его размер, а также указатель на переменную N, в которую будет записана длина полученного массива.
- Результат работы функции GetAscendingSequences сохраняется в переменной b.
- Затем происходит вывод полученного массива на экран с помощью цикла for и функции printf.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д