Массив int разбить на две половины, вторую переписать в обратном порядке - C (СИ)

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

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

Здравствуйте! Мучаюсь вторые сутки, не могу решить одно упражнение. Задача такова - есть int массив из 10 чисел. Его нужно разбить на две половины, вторую переписать в обратном порядке и затем вернуть обе половины в исходный массив через одно. То есть: Исходный массив - 10,20,30,40,50,60,70,80,90,100 Первая половина - 10,20,30,40,50 Вторая половина - 100,90,80,70,60 Результат - 10,100,20,90,30,80,40,70,50,60 Задача разбита на две части: - Первая, сделать это обычным путем, не вдаваясь в void-поинтеры, что быстро, легко и просто. - Вторая, написать функцию void arr_mix_x(void *arr, int n, size_t size) ,над которой бьюсь вторые сутки. Проблемы две: - если я передаю int-поинтер через void-поинтер в вызове функции в char-поинтер в теле функции и работаю внутри с char-массивом с тем же sizeof(), то функция берет int как 4-х байтовое значение, переписывает его в 1 байт char-a, а в остальные три байта записывает нули. Ладно, допустим, сделал заданное упражнение с массивом, где каждый элемент отстоит от другого через три байта с нулями... Теперь возникает главная проблема - как все это извращение вернуть обратно в main() в int- массив. Если поможете, буду вам очень благодарен! Максим P.S Конечно же могу скинуть код, если нужно...
Заработало!!! Блин, не понимаю я этот Eclipse! Бьешся над кодом, думаешь код неисправный, а оказывается это в Эклипсе глюк какой то был! До сих пор какие то ошибки при компиляции и запуске вылазят..

Решение задачи: «Массив int разбить на две половины, вторую переписать в обратном порядке»

textual
Листинг программы
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
 
#define ARRAY_SIZE (10)
#define HALF (ARRAY_SIZE / (2))
 
int
compare (const void * i, const void * j) {
    return *((int*) j) - *((int*) i);
}
 
void
dump (int * a)
{
    int i = 0;
    
    while(i < ARRAY_SIZE) {
        fprintf(stdout, "%d  ", a[i]);
        ++i;
    }
    putchar('\n');
}
 
void
mixShuffle (int * ptr)
{
    char i = 0, j = 0, count = HALF;
    int tmpArray[ARRAY_SIZE];
    
    memmove(tmpArray, ptr, sizeof(int) * ARRAY_SIZE);
    
    for(;i < ARRAY_SIZE; ++i, ++j, ++count){
        ptr[i] = tmpArray[j];
        ++i;
        ptr[i] = tmpArray[count];
    }
}
 
int
main(int argc, char ** argv)
{
    int array[ARRAY_SIZE] = {10, 20, 30, 40, 50, 60, 70, 80, 90, 100};
    
    dump(array);
    qsort(&array[0] + HALF, HALF, sizeof(int), compare);
    dump(array);
    mixShuffle(array);
    dump(array);
    
    exit(EXIT_SUCCESS);
}

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

  1. Подключение необходимых библиотек для работы с файлами и стандартными функциями
  2. Объявление макросов для определения размера массива и его половины
  3. Реализация функции сравнения для использования в функции сортировки
  4. Реализация функции вывода массива на экран
  5. Реализация функции перемешивания элементов массива
  6. Основная функция программы, инициализация и вывод массива, сортировка его половины, перемешивание элементов и вывод на экран
  7. Выход из программы с указанным кодом завершения

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


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

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

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