请评价一下这段代码,并提出需要改进的地方
- C/C++ code
#include <stdio.h>char get_choice (void);void Add (void);void Subtract (void);void Multiply (void);void Divide (void);char get_first (void);float get_num (void);int main (void){ char choice; do { printf ("Enter the operation of your choice:\n"); printf ("a. add s. subtract \n"); printf ("m. multiply d. divide \n"); printf ("q. quit \n"); choice = get_choice (); switch (choice) { case 'a': Add (); break; case 's': Subtract (); break; case 'm': Multiply (); break; case 'd': Divide (); break; case 'q': break; default: printf ("Programe error!\n"); break; } }while (choice != 'q'); printf ("Bye.\n"); system ("pause"); return 0;}char get_choice (void){ char ch; ch = get_first (); while (ch != 'a' && ch != 's' && ch != 'm' && ch != 'd' && ch != 'q') { printf ("Enter again: \n"); ch = get_first (); } return ch;}void Add (void){ float first, second; printf ("Enter first number: "); first = get_num (); printf ("Enter second number: "); second = get_num (); printf ("%.1f + %.1f = %.1f\n", first, second, first + second);}void Subtract (void){ float first, second; printf ("Enter first number: "); first = get_num (); printf ("Enter second number: "); second = get_num (); printf ("%.1f - %.1f = %.1f\n", first, second, first - second);}void Multiply (void){ float first, second; printf ("Enter first number: "); first = get_num (); printf ("Enter second number: "); second = get_num (); printf ("%.1f * %.1f = %.1f\n", first, second, first * second);}void Divide (void){ float first, second; printf ("Enter first number: "); first = get_num (); printf ("Enter second number: "); while ((second = get_num ()) == 0) { printf ("Enter a number other than 0: "); } printf ("%.1f / %.1f = %.1f\n", first, second, first / second);}char get_first (void){ char ch; while ((ch = getchar ()) == '\n') continue; while (getchar () != '\n') continue; return ch;}float get_num (void){ char ch; float num; while (scanf ("%f", &num) != 1) { while ((ch = getchar ()) != '\n') { putchar (ch); } printf (" is not an number.\n"); printf ("Please enter a number , such as 2.5, -1.78E8, or 3: "); } return num;}
唔...程序的作用我就不解释了,大家都看得懂的。我想知道作为一个C的初学者,这段代码是否符合要求了,还有什么需要改进的吗?
另外本人有个疑惑:是否应该在主函数里定义first, second,而给计算函数Add和其他加上形式参数?这两种方法哪种好些?
[解决办法]
应该把first,second的读取放到方面,
界面,控制,和逻辑分开实现 是一个基本要求吧。
[解决办法]
挺好,
[解决办法]
在每个最后不带\n的printf后面加fflush(stdout);
在每个不想受接收缓冲区旧内容影响的scanf前面加rewind(stdin);
另外请检查scanf的返回值。
不要使用
while (条件)
更不要使用
while (组合条件)
要使用
while (1) {
if (条件1) break;
//...
if (条件2) continue;
//...
if (条件3) return;
//...
}
因为前两种写法在语言表达意思的层面上有二义性,只有第三种才忠实反映了程序流的实际情况。
典型如:
下面两段的语义都是当文件未结束时读字符
whlie (!feof(f)) {
a=fgetc(f);
//...
b=fgetc(f);//可能此时已经feof了!
//...
}
而这样写就没有问题:
whlie (1) {
a=fgetc(f);
if (feof(f)) break;
//...
b=fgetc(f);
if (feof(f)) break;
//...
}
类似的例子还可以举很多。
[解决办法]
看你什么要求咯,一个程序永远不可能完美,总有可以改进的地方。
在什么地方定义,个人觉得PC上没啥关系吧,不过传值会好一些。
个人觉得 初学 考虑下 怎么让代码简练 就可以了吧。
参考赵老师的+-*/代码。可以找楼上要。
[解决办法]
程序,简单易懂,易维护。。。