109年地方特考四等程式設計概要

一、下列 C 程式的執行結果為何?(15分)

    #include <stdio.h>

    #include <stdlib.h>

    #define X 3

    #define Y 4

    void funA(int *, int, int), funB(int *, int, int);

    int main(void) {

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

        printf("輸出1\n");

        funA(*arr, X, Y);

        funB(*arr, X, Y);

        printf("輸出2\n");

        funA(*arr, X, Y);

        system("pause");

        return 0;

    }

    void funA(int *ptr, int x, int y) {

        int i, j;

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

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

                printf("%3d ", *(ptr+i*y+j));

            printf("\n");

        }

    }

    void funB(int *ptr, int x, int y) {

        int i, j;

        int arr[x][y];

        for(i = 0; i < x; i++)

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

                arr[x-i-1][y-j-1] = *(ptr+i*y+j);

        for(i = 0; i < x; i++)

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

                *(ptr+i*y+j) = arr[i][j];

    }

答:

#include <stdio.h>

#include <stdlib.h>

#define X 3

#define Y 4

void funA(int *, int, int), funB(int *, int, int);

int main(void) {

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

    printf("輸出1\n");

    funA(*arr, X, Y);

    funB(*arr, X, Y);

    printf("輸出2\n");

    funA(*arr, X, Y);

    system("pause");

    return 0;

}

void funA(int *ptr, int x, int y) {

    int i, j;

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

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

            printf("%3d ", *(ptr+i*y+j));

        printf("\n");

    }

}

void funB(int *ptr, int x, int y) {

    int i, j;

    int** arr = new int* [x];

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

        arr[i] = new int[y];

    }

    for(i = 0; i < x; i++)

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

            arr[x-i-1][y-j-1] = *(ptr+i*y+j);

    for(i = 0; i < x; i++)

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

            *(ptr+i*y+j) = arr[i][j];

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

        delete[ ] arr[i];

    }

    delete[ ] arr;

}

執行結果:

輸出1

  1   2   3   4

  5   6   7   8

  9  10  11  12

輸出2

 12  11  10   9

  8   7   6   5

  4   3   2   1

注意:

funB 函數中的 int arr[x][y]; 這行在 C++ 中,這是不允許的。在這裡,x y 是函數參數,它們的值在編譯時是未知的。因此,不能用作陣列的大小。可以使用動態記憶體分配來解決此問題。

說明:

void funA(int *ptr, int x, int y) {

    int i, j;

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

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

            printf("%3d ", *(ptr+i*y+j));

        printf("\n");

    }

}

funA(arr, 3 , 4)

i = 0 時:

j = 0ptr+0×4+0 = ptr[0][0]

j = 1ptr+0×4+1 = ptr[0][1]

j = 2ptr+0×4+2 = ptr[0][2]

j = 3ptr+0×4+3 = ptr[0][3]

i = 1 時:

j = 0ptr+1×4+0 = ptr[1][0]

j = 1ptr+1×4+1 = ptr[1][1]

j = 2ptr+1×4+2 = ptr[1][2]

j = 3ptr+1×4+3 = ptr[1][3]

void funB(int *ptr, int x, int y) {

    int i, j;

    int arr[x][y];

    for(i = 0; i < x; i++)

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

            arr[x-i-1][y-j-1] = *(ptr+i*y+j);

    for(i = 0; i < x; i++)

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

            *(ptr+i*y+j) = arr[i][j];

}

funB(arr, 3, 4)

i = 0 時:

j = 0

arr[3-0-1][4-0-1] = ptr[0][0] => arr[2][3] = 1

j = 1

arr[3-0-1][4-1-1] = ptr[0][1] => arr[2][2] = 2

j = 2

arr[3-0-1][4-2-1] = ptr[0][2] => arr[2][1] = 3

j = 3

arr[3-0-1][4-3-1] = ptr[0][3] => arr[2][0] = 4

i = 1 時:

j = 0

arr[3-1-1][4-0-1] = ptr[1][0] => arr[1][3] = 5

j = 1

arr[3-1-1][4-1-1] = ptr[1][1] => arr[1][2] = 6

j = 2

arr[3-1-1][4-2-1] = ptr[1][2] => arr[1][1] = 7

j = 3

arr[3-1-1][4-3-1] = ptr[1][2] => arr[1][0] = 8

i = 2 時:

arr[0][3] = 9

arr[0][2] = 10

arr[0][1] = 11

arr[0][0] = 12

arr[3][4]

 

0

1

2

3

0

12

11

10

9

1

8

7

6

5

2

4

3

2

1

 

 

arrow
arrow
    文章標籤
    地方特考四等程式設計概要
    全站熱搜

    jacksaleok 發表在 痞客邦 留言(0) 人氣()