112年高考三級程式設計第一題

一、關於以下 C 程式碼:

01

02

03

04

05

06

07

08

09

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

#include<stdio.h>

#define SIZE 10

#define THREE 3

unsigned int f1(unsigned int a, unsigned int b) { return (a&&!b); }

unsigned int f2(unsigned int a, unsigned int b) { return (a<<b); }

unsigned int f3(unsigned int a, unsigned int b) { return (a&~b); }

int f4(int a, int b) { return a*b+a-b; }

int f5(int a, int b) {

    int data[SIZE];

    for (int i = 1, k = 0; i < a; i++) {

        if (i%3 == 0) data[k++] = f4(i, i+1);

    }

    return data[b];

}

int f6(int a, int b) {

    int data[ ][THREE] = {{4, 3, 2}, {3, 4, 2}, {2, 3, 3}};

    for (int i = 0; i < THREE; i++) {

        for (int j = 0; j < THREE; j++) {

        if (i > a || j > b)

            data[i][j] = data[j][i]+b;

        }

    }

    return data[a][b];

}

int main( ) {

    printf("%u\n", f1(6, 2));

    printf("%u\n", f2(6, 2));

    printf("%u\n", f3(7, 2));

    printf("%d\n", f4(3, 12));

    printf("%d\n", f5(15, 3));

    printf("%d\n", f5(3, 15));

    printf("%d\n", f6(1, 1));

    printf("%d\n", f6(3, 2));

    return 0;

}

    請說明程式執行後,程式碼編號26~33的輸出,以及其運算邏輯。25

()printf("%u\n", f1(6, 2))

1.輸出0

2.運算邏輯

  unsigned int f1(unsigned int a, unsigned int b) { return (a&&!b); }

  a = 6b = 2!b = 0

  && 是邏輯運算子,就是用來判斷 true false 的狀態。a && b = 0,因為任何數字與0進行邏輯 && 操作結果都為0

()printf("%u\n", f2(6, 2))

1.輸出24

2.運算邏輯

  unsigned int f2(unsigned int a, unsigned int b) { return (a<<b); }

  a = 610 = 01102

  b = 210 = 00102

  a << (b = 01102) << 2 => 110002 = 2410

()printf("%u\n", f3(7, 2))

1.輸出5

2.運算邏輯

  unsigned int f3(unsigned int a, unsigned int b) { return (a&~b); }

  a = 710 = 01112

  b = 210 = 00102

  ~b = 11012

        01112

  AND) 11012

        01012

()printf("%d\n", f4(3, 12))

1.輸出:27

2.運算邏輯:

  int f4(int a, int b) { return a*b+a-b; }

  3×12+3-12 = 36+3-12 = 27

()printf("%d\n", f5(15, 3))

1.輸出:155

2.運算邏輯:

  data

 

0

1

2

0

4

3

2

1

3

4

2

2

2

3

3

  f4

int f4(int a, int b) {

    return a*b+a-b;

}

f5

int f5(int a, int b) {

    int data[SIZE];

    for (int i = 1, k = 0; i < a; i++) {

        if (i%3 == 0)

            data[k++] = f4(i, i+1);

    }

    return data[b];

}

  a = 15, b = 3

  i = 1 時,1%3 = 1

  i = 2 時,2%3 = 2

  i = 3 時,3%3 = 0

  data[0] = f4(1, 3+1) = f4(1, 4) = 1×4+1-4 = 4+1-4 = 1

  i = 4 時,4%3 = 1

  i = 5 時,5%3 = 2

  i = 6 時,6%3 = 0

  data[1] = f4(6, 6+1) = f4(6, 7) = 6×7+6-7 = 42+6-7 = 41

  i = 7 7%3 = 1

  i = 8 8%3 = 2

  i = 9 9%3 = 0

  data[2] = f4(9, 9+1) = f4(9, 10) = 9×10+9-10 = 90+9-10 = 89

  i = 10 10%3 = 1

  i = 11 11%3 = 2

  i = 12 12%3 = 0

  data[3] = f4(12, 12+1) = f4(12, 13) = 12×13+12-13 = 156-1 = 155

  i = 13 13%3 = 1

  i = 14 14%3 = 2

()printf("%d\n", f5(3, 15))

1.輸出:空值。

2.運算邏輯:

  f4

int f4(int a, int b) {

    return a*b+a-b;

}

f5

int f5(int a, int b) {

    int data[SIZE];

    for (int i = 1, k = 0; i < a; i++) {

        if (i%3 == 0)

            data[k++] = f4(i, i+1);

    }

    return data[b];

}

  a = 3, b = 15

  i = 1 時,1%3 = 1

  i = 2 時,2%3 = 2

  data[15] = 空值。

()printf("%d\n", f6(1, 1))

1.輸出:4

2.運算邏輯:

  data

 

0

1

2

0

4

3

2

1

3

4

2

2

2

3

3

f6

int f6(int a, int b) {

    int data[ ][THREE] = {{4, 3, 2}, {3, 4, 2}, {2, 3, 3}};

    for (int i = 0; i < THREE; i++) {

        for (int j = 0; j < THREE; j++) {

        if (i > a || j > b)

            data[i][j] = data[j][i]+b;

        }

    }

    return data[a][b];

}

  a = 1, b = 1

  i = 0 時:

j = 0if (i > a || j > b) => if (0 < 1 || 0 < 1)不成立

  j = 1if (i > a || j > b) => if (0 < 1 || 1 == 1)不成立

  j = 2if (i > a || j > b) => if (2 > 1 || 2 > 1)成立

  data[0][2] = data[2][0]+1 = 2+1 = 3

  i = 1

j = 0if (i > a || j > b) => if (1 == 1 || 0 < 1)不成立

j = 1if (i > a || j > b) => if (1 == 1 || 1 == 1)不成立

j = 2if (i > a || j > b) => if (1 == 1 || 2 > 1)成立

  data[0][2] = data[1][2]+1 = 2+1 = 3

  i = 2

j = 0if (i > a || j > b) => if (2 > 1 || 0 < 1)成立

  data[2][0] = data[0][2]+1 = 2+1 = 3

j = 1if (i > a || j > b) => if (2 > 1 || 1 == 1)成立

  data[2][1] = data[1][2]+1 = 2+1 = 3

j = 2if (i > a || j > b) => if (2 > 1 || 2 > 1),成立

  data[2][2] = data[2][2]+1 = 3+1 = 4

  data[1][1] = 4

()printf("%d\n", f6(3, 2))

1.輸出:空值

2.運算邏輯:

  data

 

0

1

2

0

4

3

2

1

3

4

2

2

2

3

3

f6

int f6(int a, int b) {

    int data[ ][THREE] = {{4, 3, 2}, {3, 4, 2}, {2, 3, 3}};

    for (int i = 0; i < THREE; i++) {

        for (int j = 0; j < THREE; j++) {

        if (i > a || j > b)

            data[i][j] = data[j][i]+b;

        }

    }

    return data[a][b];

}

  a = 3, b = 2

  i = 0 時:

  j = 0if (i > a || j > b) => if (0 < 3 || 0 < 2)不成立

j = 1if (i > a || j > b) => if (0 < 3 || 1 < 2)不成立

j = 2if (i > a || j > b) => if (0 < 3 || 2 == 2)不成立

  i = 1

  j = 0if (i > a || j > b) => if (1 < 3 || 0 < 2)不成立

  j = 1if (i > a || j > b) => if (1 < 3 || 1 < 2)不成立

  j = 2if (i > a || j > b) => if (1 < 3 || 2 == 2)不成立

  i = 2

  j = 0if (i > a || j > b) => if (2 < 3 || 0 < 2)不成立

  j = 1if (i > a || j > b) => if (2 < 3 || 1 < 2)不成立

  j = 2if (i > a || j > b) => if (2 < 3 || 2 == 2)不成立

  data[3][2] = 空值

arrow
arrow
    文章標籤
    高考三級程式設計
    全站熱搜

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