2016-05-23 34 views
4

所以即時編程相當新,我遇到了一些我無法弄清楚的東西。檢查一個變量,同時調用所需的功能

我會證明我的問題。

int main(void){ 

    int number; 

    if(number == 1){ 
     number1(); 
    }else if(number == 2){ 
     number2(); 
    }else if(number == 3){ 
     number3(); 
    }else if(number == 4){ 
     number4(); 
    }else if(number == 5){ 
     number5(); 
    }else if(number == 6){ 
     number6(); 
    }else if(number == 7){ 
     number7(); 
    }else if(number == 8){ 
     number8(); 
    }else if(number == 9){ 
     number9(); 
    }else if(number == 0){ 
     number0(); 
    } else if (number >= 10 && <= 19){ 
     number1(); 
     number2(25); 
    } 

} 

void number1(int Q){ 
    VGA_box(X + 5 + Q, 20, X+7 + Q, 60, white); 
} 

void number2(int Q){ 
    VGA_box(X + Q, 20, X+ 20 + Q, 22, white);   
    VGA_box(X + 18 + Q, 22, X+ 20 + Q, 38, white);  
    VGA_box(X + Q, 38, X+ 20 + Q, 40, white);   
    VGA_box(X + Q, 40, X+ 2 + Q, 58, white);    
    VGA_box(X + Q, 58, X+ 20 + Q, 60, white);     
} 

請忽略的功能VGA_box(),因爲這只是寫一行/盒的功能。

我正在做一個小遊戲,我想補充一個記分牌,但這裏是我的問題:

因爲我畫的數字(所以它們看起來更好IMO),我不得不調用函數,代表一個數字的函數。所以如果number = 1,函數number1();被調用。 有沒有一種簡單的方法來調用函數number2()number5()number9(),如果數字是259?或者讓我們說; 632.我能想出的唯一可能的方法是使用大量的if語句,但這需要我花些時間去做。

是否可以使用for循環來跟蹤數字的內容並調用所需的函數?

預先感謝您。

+0

'switch-case'和函數指針,但是這已經太廣了...... –

+0

把函數指針放在數組中,並將這些數字用作索引。 – Leandros

回答

9

可以使用指針數組起作用和一個遞歸函數扭轉值:

#include <stdio.h> 

static void func0(void) { printf("0\n"); } 
static void func1(void) { printf("1\n"); } 
static void func2(void) { printf("2\n"); } 
static void func3(void) { printf("3\n"); } 

static void (*func[])(void) = {func0, func1, func2, func3}; 

static void exec(int value) 
{ 
    if (value) { 
     exec(value/10); 
     func[value % 10](); 
    } 
} 

int main(void) 
{ 
    exec(123); 
    return 0; 
} 

輸出:

1 
2 
3 

如評論所指出@ user3078414失敗時exec(012) (第一個0未在遞歸函數中計算),另外,012被解釋爲八進制(不是十進制)。

使用字符串的替代:

#include <stdio.h> 

static void func0(void) { printf("0\n"); } 
static void func1(void) { printf("1\n"); } 
static void func2(void) { printf("2\n"); } 
static void func3(void) { printf("3\n"); } 

static void (*func[])(void) = {func0, func1, func2, func3}; 

int main(void) 
{ 
    char *str = "012"; 
    char *ptr = str; 

    while (*ptr) { 
     func[*ptr - '0'](); 
     ptr++; 
    } 
    return 0; 
} 
+1

很漂亮。 OP案件可能會更新爲func [4,9]。 – totoro

+0

@Nightcrawler謝謝:)只是一個想法,OP可以根據他的要求調整這個 –

+1

看起來不錯,但是我在代碼中有'func0()'的一個小問題,@Alter Mann。如果一個數字從零開始或者是零,那麼'func0()'永遠不會到達。因此,如果在通常的十進制系統內有意義,那麼零被視爲唯一的數字。請嘗試'exec(012)'或'exec(0)'。這是期望的行爲嗎? – user3078414

1

可以使用函數指針,例如:

#include <stdio.h> 

typedef void (*typ_callback)(int); 

static void number1(int Q); 
static void number2(int Q); 

typ_callback my_table[] = { NULL, number1, number2 }; 

int main(void) 
{ 
    size_t number; 

    printf("Entern the number of callback: "); 
    scanf("%zu", &number); 

    if (number <= (sizeof(my_table)/sizeof(my_table[0]))) 
    { 
     if (my_table[number] != NULL) 
     { 
      my_table[number](number); 
     } 
    } 
    else 
    { 
     fprintf(stderr, "Wrong number\n"); 
    } 

    return 0; 
} 

static void number1(int Q) 
{ 
    printf("You called %s function with passing value %d\n", __func__, Q); 
} 

static void number2(int Q) 
{ 
    printf("You called %s function with passing value %d\n", __func__, Q); 
} 
2
  1. 創建函數drawDigit(int digit)其中digit是0和9之間的單個數字。
    可以使用函數指針來選擇哪個number函數來調用,但如果這太複雜,那麼現在就可以使用if/else方法。

  2. 轉換分數線:

    int score = 259; 
    char digits[SIZE]; // Size must be large enough to hold all digits and nul character ('\0') 
    int numDigits = snprintf(digits, SIZE, "%d", score); // snprintf is from "stdio.h" 
    // digits contains now 4 character string "259" with nul character at the end 
    
  3. 遍歷字符串來繪製所有的數字:

    for(int i = 0; i < numDigits; ++i) { 
        int digit = digits[i] - '0'; // Convert character digit to numeric digit 
        drawDigit(digit); 
    } 
    

你可能需要額外的參數,drawDigit功能調整水平放置,但我會把這個練習留給讀者。

1

函數指針和開關/外殼不是解決方案!

問題不是if語句甚至函數。由於你的算法繪製得分在每個函數中都非常不同,所以你不能停止使用很多條件,所以你必須在一些地方用很多if語句調用它們。

解決的辦法是找到一個統一的算法,在屏幕上爲每個數字繪製分數。例如,編寫10個函數在[0..9]之間繪製數字,然後使用此函數繪製任意長度的數字。

2

看起來函數number1(),number2()等非常相似。我會反對創造不同的功能;我寧願創建一個函數(讓我們說數字()),從你的例子中接收整個數字「632」,並逐個數字循環。

創建單個函數更容易處理。只要檢查結果函數是不是太大,但很可能函數number1(),number2()等有很多共同的代碼。如果是這種情況,強烈建議減少代碼中的冗餘和重複!

讓我知道,如果我對這個。

乾杯!

相關問題