检查变量同时调用所需的功能

时间:2016-05-23 14:45:39

标签: c

所以我对编程很新,我碰到了一些我无法弄清楚的东西。

我会证明我的问题。

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();。 如果数字为259,是否可以轻松调用函数number2()number5()number9()?或者让我们说;我唯一可能弄清楚的方法就是使用很多if语句,但这需要一段时间才能完成。

是否可以使用for循环来跟踪数字是什么并调用所需的函数?

提前谢谢。

5 个答案:

答案 0 :(得分: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 *ptr = "012";

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

答案 1 :(得分: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);
    }
    
  4. 您可能需要额外的drawDigit功能参数来调整水平位置,但我会将该练习留给读者。

答案 2 :(得分:2)

似乎函数number1(),number2()等非常相似。我反对创造不同的功能;我宁愿创建一个单一的功能(让我们说数字())接收整数&#34; 632&#34;从你的例子中,逐个循环。

创建单个函数更容易处理。只需检查生成的函数是否太大,但函数number1(),number2()等很可能有很多共同的代码。如果是这种情况,强烈建议减少代码中的冗余和重复!

如果我对此感到满意,请告诉我。

干杯!

答案 3 :(得分: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);
}

答案 4 :(得分:1)

功能指针和开关/案例不是解决方案!

问题不在于 if-statement 甚至是函数。由于您在每个函数中绘制得分的算法都非常不同,因此您无法停止使用大量条件,因此您必须通过大量if语句来调用它们。

解决方案是找到统一的算法,在屏幕上为每个数字绘制分数。例如,写10个函数在[0..9]之间绘制数字,然后使用此函数绘制任意长度数字。