Reversing an array In place

后端 未结 11 904
温柔的废话
温柔的废话 2020-12-21 04:20

Okay so I\'ve tried to print and Array and then reverse is using another array But I\'m trying to create a For Loop that will take an array and reverse all of the elements i

11条回答
  •  再見小時候
    2020-12-21 05:22

    If you are not interested in writing functions for any numeric type, try macros for this task. This code same working with any built-in numeric type: int, float, double.

    It has not a support for strings, since any string is ending on the character the NULL character \0. More a controlled version my similar answer is here https://stackoverflow.com/a/42063309/6003870 and contains solution for reverse a string.


    A full code

    #include 
    
    // print items of an array by a format
    #define PRINT_ARRAY(array, length, format) \
    { \
        putchar('['); \
        for (size_t i = 0; i < length; ++i) { \
            printf(format, array[i]); \
            if (i < length - 1) printf(", "); \
        } \
        puts("]"); \
    }
    
    
    // reverse an array in place
    #define REVERSE_ARRAY(array, length, status) \
        if (length > 0) { \
            for (int i = 0; i < length / 2; ++i) { \
                double temp; \
                temp = array[i]; \
                array[i] = array[length - i - 1]; \
                array[length - i - 1] = temp; \
            } \
            *status = 0; \
        } \
        else if (length < 0) *status = -1; \
        else *status = 1;
    
    #define SUCCESS_REVERSE_ARRAY_MSG "An array succefully reversed"
    #define FAILED_REVERSE_ARRAY_MSG "Failed reverse for an array"
    #define NO_CHANGED_REVERSE_ARRAY_MSG "An array no changed"
    
    
    /*
        Print message about status reverse an array
     */
    static void
    print_msg_reverse_array_status(const int status)
    {
        if (status == 0) printf("Status: %s\n", SUCCESS_REVERSE_ARRAY_MSG);
        else if (status == -1) printf("Status: %s\n", FAILED_REVERSE_ARRAY_MSG);
        else if (status == 1) printf("Status: %s\n", NO_CHANGED_REVERSE_ARRAY_MSG);
    }
    
    
    int
    main (const int argc, const char *argv[])
    {
        // keep value of status
        int status;
    
        puts("\tExample reverse of an integer array");
        int arr_int[5] = {1, 2, 3, 4, 5};
    
        status = 0;
        PRINT_ARRAY(arr_int, 5, "%d");
        REVERSE_ARRAY(arr_int, -1, &status);
    
        // will be an error, since a length is less 0, and the array is not changed
        print_msg_reverse_array_status(status);
        PRINT_ARRAY(arr_int, 5, "%d");
    
        status = 0;
        REVERSE_ARRAY(arr_int, 0, &status);
    
        // a length is equal to 0, so an array is not changed
        print_msg_reverse_array_status(status);
        PRINT_ARRAY(arr_int, 5, "%d");
    
        status = 0;
        REVERSE_ARRAY(arr_int, 5, &status);
        print_msg_reverse_array_status(status);
        PRINT_ARRAY(arr_int, 5, "%d");
    
        puts("\n\tExample reverse of an float array");
        float arr_float[5] = {0.78, 2.1, -3.1, 4, 5.012};
    
        status = 0;
        PRINT_ARRAY(arr_float, 5, "%5.3f");
        REVERSE_ARRAY(arr_float, 5, &status);
        print_msg_reverse_array_status(status);
        PRINT_ARRAY(arr_float, 5, "%5.3f");
    
        puts("\n\tExample reverse of an double array");
        double arr_double[5] = {0.00001, 20000.002, -3, 4, 5.29999999};
    
        status = 0;
        PRINT_ARRAY(arr_double, 5, "%8.5f");
        REVERSE_ARRAY(arr_double, 5, &status);
        print_msg_reverse_array_status(status);
        PRINT_ARRAY(arr_double, 5, "%8.5f");
        return 0;
    }
    

    I am used the GCC for compilation and your result must be as next

        Example reverse of an integer array
    [1, 2, 3, 4, 5]
    Status: Failed reverse for an array
    [1, 2, 3, 4, 5]
    Status: An array no changed
    [1, 2, 3, 4, 5]
    Status: An array succefully reversed
    [5, 4, 3, 2, 1]
    
        Example reverse of an float array
    [0.780, 2.100, -3.100, 4.000, 5.012]
    Status: An array succefully reversed
    [5.012, 4.000, -3.100, 2.100, 0.780]
    
        Example reverse of an double array
    [ 0.00001, 20000.00200, -3.00000,  4.00000,  5.30000]
    Status: An array succefully reversed
    [ 5.30000,  4.00000, -3.00000, 20000.00000,  0.00000]
    

    Testing environment

    $ lsb_release -a
    No LSB modules are available.
    Distributor ID: Debian
    Description:    Debian GNU/Linux 8.6 (jessie)
    Release:    8.6
    Codename:   jessie
    $ uname -a
    Linux localhost 3.16.0-4-amd64 #1 SMP Debian 3.16.36-1+deb8u2 (2016-10-19) x86_64 GNU/Linux
    $ gcc --version
    gcc (Debian 4.9.2-10) 4.9.2
    

提交回复
热议问题