【转】谈谈C语言教学:应该从一开始就培养学生良好的编程风格和习惯
今天比较空,翻了下前几天的技术支持记录,有一个QQ对话记录比较出乎意料之外:一位同学快毕业了,还不太会或者不习惯写独立函数。仔细想想,感觉也不能怪学生,问题可能出在书本和老师上。回顾一下以前看过的C语言教程,很多示例,功能代码都写在main函数中,输出的系列信息字符串也是直接写在代码中,虽然这样比较简单,对于初学者来说,也比较容易理解,但我认为这对从一开始就培养学生的良好编程习惯是很不好的。我们与很多大学有合作关系,据我了解,在多数大学,学生所学的第一个语言就是C语言。学第一个语言养成的风格和习惯,对未来的学习和工作都会产生重要影响,因此,从一开始就应该培养学生良好的编程风格和习惯。写教程的大牛们也应该注意这一点。
以下是对话录。同学所写的代码,反映了C语言教学中存在的一些问题,我们的当班技术支持修改后的代码,正好可以反映我们的建议。为了保护这位同学,记录中将学生的QQ用户名替换为A同学。
A同学 11:43:54
我想问下为什么我的代码测试不了呢
凯乐技术支持 11:44:10
您用的是什么版本的VU?
A同学 11:44:17
2.6
凯乐技术支持 11:44:26
具体是什么问题?
A同学 11:45:03
就是在VC++6.0下写了一段代码,但是用VU测试时无法输入用例啊
A同学 11:45:26
可能是我不太会用VU吧,所以想问问
凯乐技术支持 11:45:50
通过编译了吗?
A同学 11:46:10
是啊 在VC++6.0下可以运行结果
凯乐技术支持 11:46:56
先在用例代码窗口,点击“生成输入输出代码”:
A同学 11:47:28
我能将代码发给你帮我看看吗?
凯乐技术支持 11:47:50
好的
A同学 11:48:25
#include <stdio.h>
#include <math.h>
main()
{
int a,b,c;
scanf("%d%d%d",&a,&b,&c);
if((a<(b+c))&&(b<(a+c))&&(c<(a+b)))
{
if (a==b||b==c||a==c)
{
if (a==b&&b==c)
printf("等边三角形");
else if(a==b||a==c||b==c)
printf("等腰三角形!");
}
else
printf("一般三角形!");
}
else
printf("不能构成三角形\n");
}
A同学 11:48:29
麻烦你了
凯乐技术支持 11:50:10
呵呵,你这样的代码怎么测试呢,实际项目中不会这样写代码的。
要把三角形函数独立出来,a b c为参数,返回值为一个表示三角形类型的整数。
A同学 11:50:38
那怎么修改啊
凯乐技术支持 11:51:12
把判断三角形的代码独立成一个函数呀
A同学 11:52:10
您能帮我修改下吗?谢谢
凯乐技术支持 11:52:30
你还是个学生吧?
A同学 11:52:51
是的
凯乐技术支持 11:53:48
我觉得你还是先学好写代码吧,单元测试迟一些再学。
A同学 11:54:33
不瞒您说 这是我的毕业课题
凯乐技术支持 11:55:27
毕业了还不会写独立函数啊?你平常写代码,都是把所有代码都写在main函数中的吗?
A同学 11:56:31
我没有好好学习行吗
A同学 11:56:47
您有必要非要这么说话吗
凯乐技术支持 11:59:37
这样的话就受不了啦?我也是善意啊。现在就业环境那么恶劣,我是为你着急呀。
(我的点评:当班技术支持是程序员而不是专职客服,说话不够婉转,这一点应该批评,不过用心是好的。帮学生修改代码也不是技术支持的职责。)
A同学 12:02:01
那您能帮我修改吗
凯乐技术支持 12:03:01
修改是小事情,这不是帮你,是害你。
A同学 12:04:13
您就先帮我修改一下吧
凯乐技术支持 12:06:31
如果你时间很急,我可以帮你改。如果还有时间,我建议你自己解决这些简单问题,并且要养成自己解决问题的习惯,否则以后怎么办呀?等你走上社会,你就会明白我的话了。
A同学 12:07:18
恩 我下午就要交的
凯乐技术支持 12:07:41
那行,我帮你改一下。
A同学 12:07:52
谢谢
凯乐技术支持 12:28:19
收一下文件
凯乐技术支持 12:29:08
然后测试triangle()
12:30:56
成功发送文件“triangle.c”(1.00KB)。
triangle.c文件的内容如下:
#include <stdio.h>
#include <math.h>
enum {
TR_NOT, //非三角形
TR_EQU, //等边
TR_ISO, //等腰
TR_NOR //一般
};
const char* msgs[] =
{
"不能构成三角形\n",
"等边三角形\n",
"等腰三角形\n",
"一般三角形\n"
};
int triangle(int a, int b, int c)
{
if((a<(b+c))&&(b<(a+c))&&(c<(a+b)))
{
if (a==b||b==c||a==c)
{
if (a==b&&b==c)
return TR_EQU;
else if(a==b||a==c||b==c) //这个判断多余,感谢yboy8指出这一点
return TR_ISO;
}
else
return TR_NOR;
}
return TR_NOT;
}
int main()
{
int a,b,c, ret;
scanf("%d%d%d",&a,&b,&c);
ret = triangle(a, b, c);
printf(msgs[ret]);
return 0;
}
良好的可测试性和可维护性是代码的基本要求,应该一开始就培养学生这方面的意识。我在《电脑编程技巧与维护》杂志上看过一篇文章,其中有这样的代码:
if(var == 0)
showmsg(“*********”); //信息1
else if(var == 1)
showmsg(“************”); //信息2
….
else if(var == 40)
showmsg(“**************”); //信息41
如果把信息字符串独立出去,这七八十行代码,就可以用一行代码来代替。这可是在一个老牌的编程杂志上发表的文章,也许可以进一步说明,从一开始培养良好的编程风格和习惯是很重要的,要不然,这个很糟糕的风格和习惯可能很长时间都改不掉。