簡體   English   中英

如何反轉 C 中多維數組的特定行?

[英]How do I reverse a specific row of a multidimensional array in C?

我有一個包含 3 行和 4 列的多維數組。 該程序應使用reverseRow() function 來反轉數組中的特定行。 比如,假設用戶的輸入是 2,那么它應該反轉第二行並打印它。

我試過交換方法,但沒有用。 我也嘗試過使用指針,但效果不佳。 有人可以為我解釋一下嗎? 如何反轉特定行?

#include <stdlib.h>

int arr[3][4] = {
    {1, 2, 3, 4},
    {5, 6, 7, 8},
    {9, 10, 11, 12}};
int n = sizeof(arr) / sizeof(arr[0]);

void reverseRow(int low, int high)
{
    if (low < high)
    {
        int temp = arr[low][0];
        arr[low][0] = arr[high][0];
        arr[high][0] = temp;

        reverseRow(low + 1, high - 1);

        for (int i = 0; i < n; i++)
            for (int j = 3; i > 0; j--)
                printf("%d ", arr[i][j]);
    }
}

void printMenu()
{
    printf("\n");
    printf("You can choose one of these services: \n");
    printf("1. Get the elements of a specific row reversed \n");
    printf("Please select one to try ");
    int answer;
    scanf("%d", &answer);

    switch (answer)
    {

    case 1:
        reverseRow(0, n - 1);
        break;

    case 2:
        printf("Bye!\n");
        break;

    default:
        printf("please select carefully! \n");
        break;
    }
}

int main()
{
    printMenu();

    return 0;
}

最好的祝福。

您正在反轉第一列,而不是用戶選擇的行。

您沒有將行號傳遞給 function。

打印數組的循環以相反的順序打印所有列,它使用n作為行數,而不是列數。 我已將變量重命名為更清晰並修復了打印循環。

#include <stdio.h>
#include <stdlib.h>

int arr[3][4] = {
    {1, 2, 3, 4},
    {5, 6, 7, 8},
    {9, 10, 11, 12}};
int rows = sizeof(arr) / sizeof(arr[0]);
int cols = sizeof(arr[0]) / sizeof(arr[0][0]);

void reverseRow(int rownum, int low, int high)
{
    if (low < high)
    {
        int temp = arr[rownum][low];
        arr[rownum][low] = arr[rownum][high];
        arr[rownum][high] = temp;

        reverseRow(rownum, low + 1, high - 1);
    } else {
        for (int i = 0; i < rows; i++) {
            for (int j = 0; j < cols; j++) {
                printf("%d ", arr[i][j]);
            }
            printf("\n");
        }
    }
}

void printMenu()
{
    printf("\n");
    printf("You can choose one of these services: \n");
    printf("1. Get the elements of a specific row reversed \n");
    printf("Please select one to try ");
    int answer;
    scanf("%d", &answer);

    switch (answer)
    {

    case 1:
        printf("Please select row number: ");
        int row;
        scanf("%d", &row);
        if (row >= rows || row < 0) {
            printf("Invalid row\n");
            break;
        }
        reverseRow(row, 0, cols - 1);
        break;

    case 2:
        printf("Bye!\n");
        break;

    default:
        printf("please select carefully! \n");
        break;
    }
}

int main()
{

    printMenu();

    return 0;
}

二維數組的行是什么?

它是一個一維數組。

所以你需要的是寫一個 function 來反轉一個一維數組。

迭代 function 可以看成下面的樣子

void reverseRow( int *a, size_t n )
{
    for ( size_t i = 0; i < n / 2; i++ )
    {
        int tmp = a[i];
        a[i] = a[n-i-1];
        a[n-i-1] = tmp;
    }
} 

遞歸 function 可以看下面的方式

void reverseRow( int *a, size_t n )
{
    if ( !( n < 2 ) )
    {
        int tmp = a[0];
        a[0] = a[n-1];
        a[n-1] = tmp;

        reverseRow( a + 1, n - 2 );
    }
}

例如,調用 function

reverseRow( arr[1], 4 );

反轉原始數組的第二行。

或者,如果行數(從 0 開始)存儲在某個變量中,例如行,則調用 function

reverseRow( arr[row], 4 );

到output的反行你需要單獨寫一個function。

這是一個演示程序。

#include <stdio.h>

void reverseRowIterative( int *a, size_t n )
{
    for (size_t i = 0; i < n / 2; i++)
    {
        int tmp = a[i];
        a[i] = a[n - i - 1];
        a[n - i - 1] = tmp;
    }
}

void reverseRowRecursive( int *a, size_t n )
{
    if (!( n < 2 ))
    {
        int tmp = a[0];
        a[0] = a[n - 1];
        a[n - 1] = tmp;

        reverseRowRecursive( a + 1, n - 2 );
    }
}

void printRow( const int *a, size_t n )
{
    for (size_t i = 0; i < n; i++)
    {
        printf( "%2d ", a[i] );
    }
    putchar( '\n' );
}

int main( void )
{
    enum { M = 3, N = 4 };

    int arr[M][N] = 
    {
        { 1,  2,  3,  4 },
        { 5,  6,  7,  8 },
        { 9, 10, 11, 12 }
    };

    for ( size_t i = 0; i < M; i++ )
    {
        reverseRowIterative( arr[i], N );
        printRow( arr[i], N );
    }

    putchar( '\n' );

    for (size_t i = 0; i < M; i++)
    {
        reverseRowRecursive( arr[i], N );
        printRow( arr[i], N );
    }

    putchar( '\n' );
}

程序 output 是

 4  3  2  1
 8  7  6  5
12 11 10  9

 1  2  3  4
 5  6  7  8
 9 10 11 12 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM