Динамический массив: группу элементов с заданными свойствами переписать в «хвост» массива - C (СИ)
Формулировка задачи:
Надо переделать стандартный массив в динамический.
Помогите пожалуйста.
/*В одномерном массиве A=(a1, а2, ..., аn) группу элементов, содержащую наибольшее число подряд идущих отрицательных элементов, переписать в «хвост» массива. Элементы массива вводить с клавиатуры.*/ #include <stdio.h> #include <time.h> #include <stdlib.h> #include <conio.h> #define SIZE 20 #define MAX_VALUE 100 //инициализация массива void initArray(int *list, int size) { int i, sgn; for(i = 0; i < size; i++){ sgn = rand() % 2; list[i] = rand() % MAX_VALUE; if(sgn) list[i] *= (-1); } } //поиск самой длинной последовательности отрицательных чисел int searchSeq(int *list, int size, int *len_seq) { int max_len = 0, start = -1; int i, j, len; for(i = 0; i < size; i++){ if(list[i] < 0){ len = 0; for(j = i; list[j] < 0; j++) len++; if(len > max_len){ max_len = len; start = i; } i += len - 1; } } *len_seq = max_len; return start; } //копирование отрицательной подпоследовательности в хвости списка void copySeq(int *list, int size, int len_seq, int start) { int i, j; for(i = start + len_seq - 1, j = size - 1; i >= start ; i--, j--) list[j] = list[i]; } //печать массива void printArray(int *list, int size) { int i; for(i = 0; i < size; i++) printf("%i ", list[i]); putchar('\n'); } int main(void) { int list[SIZE]; int len_seq, start; srand(time(NULL)); initArray(list, SIZE); //инициализация массива случайными значениями printArray(list, SIZE); //печать массива start = searchSeq(list, SIZE, &len_seq); //поиск подпоследовательности из отрицательных чисел if(start < 0) puts("no negative element.\n"); else copySeq(list, SIZE, len_seq, start); //копирование найденной подпоследовательности в хвост printArray(list, SIZE); //печать массива _getch(); return 0; }
Решение задачи: «Динамический массив: группу элементов с заданными свойствами переписать в «хвост» массива»
textual
Листинг программы
/*В одномерном массиве A=(a1, а2, ..., аn) группу элементов, содержащую наибольшее число подряд идущих отрицательных элементов, переписать в «хвост» массива. Элементы массива вводить с клавиатуры.*/ #include <stdio.h> #include <time.h> #include <stdlib.h> #include <conio.h> #define MAX_VALUE 100 //инициализация массива void initArray(int *list, int size) { int i, sgn; for(i = 0; i < size; i++){ sgn = rand() % 2; list[i] = rand() % MAX_VALUE; if(sgn) list[i] *= (-1); } } //поиск самой длинной последовательности отрицательных чисел int searchSeq(int *list, int size, int *len_seq) { int max_len = 0, start = -1; int i, j, len; for(i = 0; i < size; i++){ if(list[i] < 0){ len = 0; for(j = i; list[j] < 0; j++) len++; if(len > max_len){ max_len = len; start = i; } i += len - 1; } } *len_seq = max_len; return start; } //копирование отрицательной подпоследовательности в хвости списка void copySeq(int *list, int size, int len_seq, int start) { int i, j; for(i = start + len_seq - 1, j = size - 1; i >= start ; i--, j--) list[j] = list[i]; } //печать массива void printArray(int *list, int size) { int i; for(i = 0; i < size; i++) printf("%i ", list[i]); putchar('\n'); } int main(void) { int* list; size_t size; int len_seq, start; printf("input array size: "); scanf("%u", &size); list = (int*) malloc(sizeof(int) * size); srand(time(NULL)); initArray(list, size); //инициализация массива случайными значениями printArray(list, size); //печать массива start = searchSeq(list, size, &len_seq); //поиск подпоследовательности из отрицательных чисел if(start < 0) puts("no negative element.\n"); else copySeq(list, size, len_seq, start); //копирование найденной подпоследовательности в хвост printArray(list, size); //печать массива free(list); _getch(); return 0; }
Объяснение кода листинга программы
В этом коде решается задача переписывания наибольшей группы подряд идущих отрицательных элементов в хвост
динамического массива.
- #include
, #include , #include , #include - подключаются необходимые библиотеки для работы с массивами, временем, памятью и вводом/выводом. - #define MAX_VALUE 100 - определяется максимальное значение элемента массива.
- *void initArray(int list, int size)** - функция инициализации массива. Задаёт случайные значения элементов массива от -MAX_VALUE до MAX_VALUE.
- int searchSeq(int list, int size, int len_seq) - функция поиска наибольшей подпоследовательности отрицательных чисел в массиве. Возвращает индекс первого элемента подпоследовательности и записывает её длину в переменную len_seq.
- *void copySeq(int list, int size, int len_seq, int start)** - функция копирования подпоследовательности из отрицательных чисел в
хвост
массива. - *void printArray(int list, int size)** - функция печати массива.
- int main(void) - главная функция программы. Считывает размер массива, инициализирует его, печатает, затем ищет наибольшую подпоследовательность отрицательных чисел и копирует её в
хвост
массива, после чего печатает массив ещё раз. - *int list;** - указатель на первый элемент массива.
- size_t size; - переменная для хранения размера массива.
- int len_seq;, int start; - переменные для хранения длины подпоследовательности и её первого элемента.
- printf(
input array size:
);, scanf(%u
, &size); - ввод размера массива с клавиатуры. - list = (int) malloc(sizeof(int) size); - выделение памяти под массив.
- srand(time(NULL)); - инициализация генератора случайных чисел текущим временем.
- initArray(list, size); - инициализация массива.
- printArray(list, size); - печать массива.
- start = searchSeq(list, size, &len_seq); - поиск подпоследовательности.
- copySeq(list, size, len_seq, start); - копирование подпоследовательности в
хвост
массива. - printArray(list, size); - печать массива.
- free(list); - освобождение памяти.
- _getch(); - ожидание нажатия клавиши.
- return 0; - завершение программы.