所以我对编程很新,我碰到了一些我无法弄清楚的东西。
我会证明我的问题。
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循环来跟踪数字是什么并调用所需的函数?
提前谢谢。
答案 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)
创建函数drawDigit(int digit)
,其中digit
是0到9之间的单个数字
您可以使用函数指针来选择要调用的number
函数,但如果它太复杂,您现在可以使用if
/ else
方法。
将得分转换为字符串:
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
循环遍历字符串以绘制所有数字:
for(int i = 0; i < numDigits; ++i) {
int digit = digits[i] - '0'; // Convert character digit to numeric digit
drawDigit(digit);
}
您可能需要额外的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]之间绘制数字,然后使用此函数绘制任意长度数字。