Динамический массив: группу элементов с заданными свойствами переписать в «хвост» массива - 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;
}

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

В этом коде решается задача переписывания наибольшей группы подряд идущих отрицательных элементов в хвост динамического массива.

  1. #include , #include , #include , #include - подключаются необходимые библиотеки для работы с массивами, временем, памятью и вводом/выводом.
  2. #define MAX_VALUE 100 - определяется максимальное значение элемента массива.
  3. *void initArray(int list, int size)** - функция инициализации массива. Задаёт случайные значения элементов массива от -MAX_VALUE до MAX_VALUE.
  4. int searchSeq(int list, int size, int len_seq) - функция поиска наибольшей подпоследовательности отрицательных чисел в массиве. Возвращает индекс первого элемента подпоследовательности и записывает её длину в переменную len_seq.
  5. *void copySeq(int list, int size, int len_seq, int start)** - функция копирования подпоследовательности из отрицательных чисел в хвост массива.
  6. *void printArray(int list, int size)** - функция печати массива.
  7. int main(void) - главная функция программы. Считывает размер массива, инициализирует его, печатает, затем ищет наибольшую подпоследовательность отрицательных чисел и копирует её в хвост массива, после чего печатает массив ещё раз.
  8. *int list;** - указатель на первый элемент массива.
  9. size_t size; - переменная для хранения размера массива.
  10. int len_seq;, int start; - переменные для хранения длины подпоследовательности и её первого элемента.
  11. printf(input array size:);, scanf(%u, &size); - ввод размера массива с клавиатуры.
  12. list = (int) malloc(sizeof(int) size); - выделение памяти под массив.
  13. srand(time(NULL)); - инициализация генератора случайных чисел текущим временем.
  14. initArray(list, size); - инициализация массива.
  15. printArray(list, size); - печать массива.
  16. start = searchSeq(list, size, &len_seq); - поиск подпоследовательности.
  17. copySeq(list, size, len_seq, start); - копирование подпоследовательности в хвост массива.
  18. printArray(list, size); - печать массива.
  19. free(list); - освобождение памяти.
  20. _getch(); - ожидание нажатия клавиши.
  21. return 0; - завершение программы.

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

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