Массив 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
Листинг программы
  1. #include <stdio.h>
  2. #include <string.h>
  3. #include <stdlib.h>
  4.  
  5. #define ARRAY_SIZE (10)
  6. #define HALF (ARRAY_SIZE / (2))
  7.  
  8. int
  9. compare (const void * i, const void * j) {
  10.     return *((int*) j) - *((int*) i);
  11. }
  12.  
  13. void
  14. dump (int * a)
  15. {
  16.     int i = 0;
  17.    
  18.     while(i < ARRAY_SIZE) {
  19.         fprintf(stdout, "%d  ", a[i]);
  20.         ++i;
  21.     }
  22.     putchar('\n');
  23. }
  24.  
  25. void
  26. mixShuffle (int * ptr)
  27. {
  28.     char i = 0, j = 0, count = HALF;
  29.     int tmpArray[ARRAY_SIZE];
  30.    
  31.     memmove(tmpArray, ptr, sizeof(int) * ARRAY_SIZE);
  32.    
  33.     for(;i < ARRAY_SIZE; ++i, ++j, ++count){
  34.         ptr[i] = tmpArray[j];
  35.         ++i;
  36.         ptr[i] = tmpArray[count];
  37.     }
  38. }
  39.  
  40. int
  41. main(int argc, char ** argv)
  42. {
  43.     int array[ARRAY_SIZE] = {10, 20, 30, 40, 50, 60, 70, 80, 90, 100};
  44.    
  45.     dump(array);
  46.     qsort(&array[0] + HALF, HALF, sizeof(int), compare);
  47.     dump(array);
  48.     mixShuffle(array);
  49.     dump(array);
  50.    
  51.     exit(EXIT_SUCCESS);
  52. }

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

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

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


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

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

7   голосов , оценка 4.143 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы