Массив 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); }
Объяснение кода листинга программы
- Подключение необходимых библиотек для работы с файлами и стандартными функциями
- Объявление макросов для определения размера массива и его половины
- Реализация функции сравнения для использования в функции сортировки
- Реализация функции вывода массива на экран
- Реализация функции перемешивания элементов массива
- Основная функция программы, инициализация и вывод массива, сортировка его половины, перемешивание элементов и вывод на экран
- Выход из программы с указанным кодом завершения
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д