Bii 發問時間: 電腦與網際網路程式設計 · 1 0 年前

(急)DEV C++二維陣列向右或向左位移幾個位置的程式

讓使用者輸入欲把陣列向右或向左位移幾個位置的程式。

請宣告一個5*6的二維陣列,並利用亂數產生1~30的數字放至陣列中,但是數字不可重覆。

Example:

原始陣列

1 2 3 10

4 5 6 11

7 8 9 12

使用者選擇:向左位移2個位置

則新陣列為

3 10 1 2

6 11 4 5

9 12 7 8

(我只做到亂數不重覆而已,向右或向左位移做不出來

請高手幫忙,謝謝!!!!)

1 個解答

評分
  • 1 0 年前
    最佳解答

    你會做亂數不重覆,應該會把 printf 改成 cout 吧?(如果你要的是 C++)

    也應該能把

     x = rand()*(COL-1) / (RAND_MAX+1) +1;

    改成使用者輸入的 scanf 或 cin 吧?

    下面的程式用了二種不同的方法來做 shift left 和 shift right。

    ShiftXX 是〝較〞進階的方法,會快一小點。

    ShiftX_ 是〝較〞基本的方法。

    它只是較,並不是我知道的〝最〞。

    就先看著學學吧。

    #include <memory.h> // memcpy

    #include <string.h> // memmove

    #include <stdio.h>

    #include <stdlib.h>

    #include <time.h> // time

    #define ROW 5

    #define COL 6

    void matPrint(int mat[ROW][COL], char *msg)

    { int x, y;

    puts(msg);

    for (y=0; y<ROW; ++y)

    { for (x=0; x<COL; ++x)

    printf("%3d", mat[y][x]);

    putchar('\n');

    }

    putchar('\n');

    }

    void matShiftLeft(int mat[ROW][COL])

    { int y, tmp = **mat;

    memcpy(*mat, *mat+1, sizeof(int)*(ROW*COL-1));

    for (y=ROW; --y; )

    mat[y][COL-1] = mat[y-1][COL-1];

    mat[0][COL-1] = tmp;

    }

    void matShiftRight(int mat[ROW][COL])

    { int y, tmp = mat[ROW-1][COL-1];

    memmove(*mat+1, *mat, sizeof(int)*(ROW*COL-1));

    for (y=0; y<ROW-1; ++y)

    *mat[y] = *mat[y+1];

    *mat[ROW-1] = tmp;

    }

    void matShiftLeft_(int mat[ROW][COL])

    { int x, y;

    for (y=ROW; --y>=0; )

    { int tmp = *mat[y];

    for (x=0; x<COL-1; ++x)

    mat[y][x] = mat[y][x+1];

    mat[y][COL-1] = tmp;

    } }

    void matShiftRight_(int mat[ROW][COL])

    { int x, y;

    for (y=ROW; --y>=0; )

    { int tmp = mat[y][COL-1];

    for (x=COL; --x; )

    mat[y][x] = mat[y][x-1];

    *mat[y] = tmp;

    } }

    int main(void)

    { int mat[ROW][COL], x, y;

    char buf[32];

    for (x=ROW*COL; --x>=0; )

    (*mat)[x] = x+1;

    matPrint(mat, "Original");

    x = ROW*COL;

    srand((unsigned) time(NULL)); rand(); // 放棄一個 rand 會比較好

    do // 我所知道最好的亂數不重覆法:Knuth Shuffle

    { int r = rand()*x / (RAND_MAX+1);

    y = (*mat)[--x];

    (*mat)[x] = (*mat)[r];

    (*mat)[r] = y;

    } while (x);

    matPrint(mat, "Randomized");

    y = 5;

    do

    { x = rand()*(COL-1) / (RAND_MAX+1) +1;

    sprintf(buf, "Shift left for%2d cell%s", x, x!=1 ? "s." : ".");

    do

    matShiftLeft_(mat);

    while (--x);

    matPrint(mat, buf);

    } while (--y);

    y = 5;

    do

    { x = rand()*(COL-1) / (RAND_MAX+1) +1;

    sprintf(buf, "Shift right for%2d cell%s", x, x!=1 ? "s." : ".");

    do

    matShiftRight_(mat);

    while (--x);

    matPrint(mat, buf);

    } while (--y);

    system("pause");

    return 0;

    }

    2010-06-12 10:02:49 補充:

    字數已滿,只能用補充的。

    哪有問題請補問。^_^

    加油 ^_^

還有問題?馬上發問,尋求解答。