0

我刚开始从 Head First C 学习 C,但我很难理解如何将我的代码重构为多个函数,更具体地说,我不知道如何让函数工作并且对如何接受用户输入感到困惑.

我如何将像下面这样的功能合并到主要功能中?我可以使用哪些其他函数示例来重构?非常感谢!

void get_card_name(char *prompt, char *card_name)

主功能

int main()
{
char card_name[3];
int count = 0;
while ( card_name[0] != 'X' ) {
    puts("Enter the card_name: ");
    scanf("%2s", card_name);
    int val = 0;
    switch(card_name[0]) {
    case 'K':
    case 'Q':
    case 'J':
        val = 10;
        break;
    case 'A':
        val = 11;
        break;
    case 'X':
        continue;
    default:
        val = atoi(card_name);
        if ((val < 1) || (val > 10)) {
            puts("I dont understand that value!");
            continue;
        }
    }
    if ((val > 2) && (val < 7)) {
        count++;
    } else if (val == 10) {
        count--;
    }
    printf("Current count: %i\n", count);
}
return 0;
}
4

1 回答 1

1

重构时的通用答案是“如果它看起来很复杂或难以阅读,请尝试将其分解成更易于阅读(和理解)的小块。”。

在你的情况下,你有这个:

int main() {
  /* Initial state needed later on */

  /* Do some complicated stuff */
}

要重构这一点,您需要找出初始状态的哪些部分需要保持接近您将要移入其自身功能的任何部分。在您的示例中,card_nameandcount都在复杂位中使用,而在其他任何地方都没有。因此,您可以并且应该将那些关闭复杂的位:

void do_card_stuff() {
  char card_name[3];
  int count = 0;

  /* Do some complicated stuff */
}

int main() {
  do_card_stuff();
}

而且,你瞧,你已经重构了你的代码。如果您仍然认为卡片内容看起来很复杂,请尝试将其分解为更多部分:

int get_card_value(char card) {
  /* Do some complicated stuff */

  return value;
}

int do_card_stuff() {
  char card_name[3];
  int count = 0;
  int value;

  /* Loop */
    /* Get card value from user */
    value = get_card_value(card_name[0]);

}

int main() {
  do_card_stuff();
}

只要坚持下去,直到把它分成更小的部分只是愚蠢的,你就完成了。另外,请记住,您分解的代码应该尽可能通用,因为这将使您以后可以重用此代码(可能在其他项目中)。

于 2012-09-14T10:16:32.903 回答