10043. Advanced Function Pointer

I'm a slow walker, but I never walk backwards.

背景描述

我們中出了個叛徒,現在開始進行異端審問會我們中出了個叛徒,現在開始進行異端審問會

題目描述

學會 function 和 pointer 之後,總要來點 function pointer 才行。你的目標要完成 myint.c 中三個函數。在 madd()msub()getmyheart() 三個函數中,其中 madd()msub() 只需要完成兩個整數的加法和減法即可。而在 getmyheart() 中,你必須將 myint.c 函數封裝到 int (*FUNC[])(int, int) 函數指標陣列。

特別注意 getmyheart() 的前兩行 secret();test_heart(); 不需要更動,用來輸出 Morris 的秘密以及測試你寫的 madd()msub 的函數是否正確。Morris 藏在 singletest.c 的秘密不需理會。

AC 的通關密語當然要讓 Morris 說出秘密!

main.c

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#include <stdio.h>
#include <assert.h>
#include "myint.h"
 
int madd(int a, int b) {
    return a + b;
}
int msub(int a, int b) {
    return a - b;
}
 
int main() {
    int (*FUNC[8])(int, int);
    int ret = getmyheart(FUNC);
    int a, b;
    scanf("%d %d", &a, &b);
    printf("#function = %d\n", ret);
 
    printf("test function add\n");
    assert(FUNC[0](a, b) == madd(a, b));
    printf("test function sub\n");
    assert(FUNC[1](a, b) == msub(a, b));
 
    return 0;
}

myint.h

1
2
3
4
5
6
7
#ifndef MYINT_H
#define MYINT_H
 
int getmyheart(int (*FUNC[])(int, int));
static int madd(int a, int b);
static int msub(int a, int b);
#endif

myint.c

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include "myint.h"
#include "singletest.c"
 
static int madd(int a, int b) {
    // please match main function
}
static int msub(int a, int b) {
    // please match main function
}
int getmyheart(int (*FUNC[])(int, int)) {
    secret();
    test_heart();
    // set your function into FUNC[0] and FUNC[1]
    return 2;
}

singletest.c

#include <stdio.h>
#include <assert.h>
#include "myint.h"
 
static void test_heart() {
    printf("run test heart\n");
    // Morris' secret block, don't care about this.
}
 
static void secret() {
     // Morris' secret block, don't care about this.
}

Discussion