这段代码是一个很小的游戏,可以看你玩了多长时间的FizzBuzz游戏而不搞砸。
的顶部
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
typedef enum {false, true} boolean;
typedef enum {FIZZ, BUZZ, FIZZBUZZ} FB;
int n = 0; // the number that is being incremented
char input[256];
boolean user_turn(void);
FB n_fizz_buzz_fizzbuzz(void); // is n or fizz or buzz or fizzbuzzmain函数int main(void) {
boolean should_loop = true;
while(should_loop) {
n++;
printf("Number: %d\n", n);
should_loop = user_turn();
}
return 0;
}user_turn函数/*
Prompts the user for the answer
*/
boolean user_turn(void) {
FB correct = n_fizz_buzz_fizzbuzz();
scanf("%s", input);
if(!((strcmp(input, "fizzbuzz") == 0 && correct == FIZZBUZZ) || (strcmp(input, "fizz") == 0 && correct == FIZZ) || (strcmp(input, "buzz") == 0 && correct == BUZZ) || (atoi(input) == n && correct == n))) {
printf("Sorry! That is incorrect.\nScore: %d\n", n - 1);
return false;
}
return true;
}n_fizz_buzz_fizzbuzz函数/*
Returns the correct answer either:
FIZZBUZZ(2)
BUZZ(1)
FIZZ(0)
n
*/
FB n_fizz_buzz_fizzbuzz(void) {
if(n % 15 == 0)
return FIZZBUZZ;
if(n % 5 == 0)
return BUZZ;
if(n % 3 == 0)
return FIZZ;
return n;
}任何其他建议都受到欢迎和鼓励。
发布于 2015-02-06 01:33:45
我的建议:
fgets代替不安全的scanf("%s",...)user_turn()中的长行拆分为几行。static,以避免链接时的麻烦。for循环而不是while循环: for (n=1;should_loop;n++) {我很抱歉地说,我不同意你的自我代码审查的三点,关于这个特定的程序。
Linux源代码示例: github.com/torvalds/linux/blob/master/kernel/events/core.c Linus给出了一些关于编码风格的非常好的建议,它的幽默和智慧值得一读。一些最好的部分:
首先,我建议打印一份GNU编码标准的副本,而不是阅读它。烧掉它们,这是一个伟大的象征姿态。如果你需要超过3个等级的缩进,你无论如何都会失败,并且应该修复你的程序。“
enum放在一行中,就像您最初做的那样。好吧,我本来打算引用Plan 9的源代码,但是他们似乎更喜欢按你的方式做,把最短的enum分割成四行!我检查了“编程的实践”,在这个例子中,Kernighan和Pike似乎同意我的观点,他们用一个简短的enum一行行,然后用注释将事情分割成一个更长的enum (这很有道理)。n++在printf中可能会被忽略。我会使用一个for循环,把所有的循环控制都放在一个地方是很好的。发布于 2015-02-02 21:15:34
在您的n_fizz_buzz_fizzbuzz函数中,我注意到在if/and语句之前和/或之后没有{s或}s。您应该始终拥有这些,因为bug可能会引起如果它们不存在。
这个函数应该写成这样:
FB n_fizz_buzz_fizzbuzz(void) {
if(n % 15 == 0) {
return FIZZBUZZ;
}
if(n % 5 == 0) {
return BUZZ;
}
if(n % 3 == 0) {
return FIZZ;
}
return n;
}这是没有必要的,但有时缩进会使事情看起来更好。
例如,您的枚举可以缩进:
typedef enum {
FIZZ,
BUZZ,
FIZZBUZZ
} FB;唯一的缺点是,如果这让你感到困扰的话,这件事现在占用了更多的空间。
这也不是完全必要的,但它从您的main功能中删除了一行。
这是:
n++;
printf("Number: %d\n", n);会变成这样:
printf("Number: %d\n", ++n);注意,n++变成了++n。一定是这样写的。
n++将n递增1,并在其增量之前返回n的值。
++n将n递增1,并返回n的新值。
例如,
int n = 7;
printf("%d\n", n++); // ==> 7
// n = 8
printf("%d\n", ++n); // ==> 9https://codereview.stackexchange.com/questions/79389
复制相似问题