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 = 0:ptr+0×4+0 = ptr[0][0]
j = 1:ptr+0×4+1 = ptr[0][1]
j = 2:ptr+0×4+2 = ptr[0][2]
j = 3:ptr+0×4+3 = ptr[0][3]
當 i = 1 時:
j = 0:ptr+1×4+0 = ptr[1][0]
j = 1:ptr+1×4+1 = ptr[1][1]
j = 2:ptr+1×4+2 = ptr[1][2]
j = 3:ptr+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 |