第一题:
成功:非单项选择杜绝了机会主义,要求了对知识掌握的精度。
失败:下次要叫“不定项选择”,以免落人口实。
教训:很多同学在这里失去的并不是分数,而是时间。算是没有开卷考试的经验吧
- Thompson和Ritchie一起创造了UNIX和C,但两人的工作有所侧重,所以Ritchie才是绝对的Father
- 不了解变量如何占用内存是用不好C语言的。占用的字节数是和编译器息息相关的,而编译器又是主要根据机器特性和用户设定来决定占用方式的。
- 软件工程届普遍接受的观点是“程序只能被证明有错,不能被证明无错”。当然,这话并不严密。假如我们需要一个什么都不干的程序,那么就写一个空的main,这个程序也有错吗?怎么证明它无错呢?
- 总的来说,只要存在于内存中的,就必有地址
- 声明只说明存在,定义就要占内存了
第二题:
成功:通过一些略显古怪的用法考查对知识的理解程度。如果只是从表面记忆C,很难答好这道题。
失败:一道题里涵盖太多知识点,却都通过一个结果来评价,导致一个小失误就满盘皆输。以后应该把知识点拆开考查
- printf("%d", (1-(2+8/6)*4%3*1)/2);
这个有些过于繁杂了,应该再简化一下。有些同学的不细心也挺让人遗憾的。但面对诸如“1/2”、“0.XXXX”这样的答案,我除了无奈摇头,也做不出别的表情了。
- if关心的只是括号内的运算结果是否非零,从不关心这个结果由哪种运算得到。while、for等等均是如此。千万不要只看表面呀
- 大家对递归的掌握超出了我的预料。看来大家的数学基础和对函数调用的理解都是很不错的。答案是15。
- 这道题可能是第一个有必要翻书的地方。strcat和strlen的功能都需要确认一下。关键的知识点:
- 每个汉字占2个字节
- \t只是一个字符,占一个字节。\n也是
- strcat进行字符串连接的工作
- strlen不把\0计算在内
- strlen("天下无贼\t刘德华\t刘若英\n")的结果是23(BTW:天下无贼挺好看。刘若英越看越pp)
- sizeof用于一个数组时,得到的是整个数组所占的字节数。字符数组初始化时加上的那个\0当然也是数组的一个成员。
如果给数组的下标是负数,就会向数组首址之前访问。这个主要考对数组下标的理解,需要拓展自己的思维来解决此问题,但现实中不要使用这种用法。
- 这是整份考卷中最难的一道题,做出的人不超过5个。
#include
main()
{
struct {int m; int n} s = {0x70706168, 0x79};
printf("%s", &(s.m));
}
32位x86平台,决定了int占4个字节,且整数0x70706168在内存保存为“68 61 70 70”,0x79保存为“79 00 00 00”。根据struct的特点,n紧挨在m之后,所以s所占内存内容为“68 61 70 70 79 00 00 00”。这样一段内存,被当作字符串打印,会打印出happy。发现很多同学不会用16进制查数,于是给出类似hajj这样的答案。
第三题:
成功:看似平淡无奇,其实是需要周全的思维和对语法的深刻理解
失败:还没想好
- #define min(A,B) (((A)<(B)) ? (A) : (B))
像这种求值类的宏,多加括号几乎是标准。
- 要点:
- getchar()的返回值是int类型,要用int型的变量赋值,否则不能处理好EOF
- 要精准地防止下标越界问题,而且对字符数组必须给'\0'留好地方
- 在每次使用一个字符串之前,都先想想,'\0'在不在
- 如果指针指向的内存是确定的,而且那块内存可由你控制,则把指针传到哪里都是可行的。反之,就不行。
malloc申请的内存不会随着函数的退出而释放,绝对不会
第四题:
成功:能看到大家对程序设计的认识
失败:不知道大家的解答是不是发自肺腑的,因为是开卷考试
-
正确
-
对各种情况考虑周全
-
模块化
-
能适应未来的变化可能
-
能复用
-
效率高(包括算法效率和代码效率)
-
跨平台,可移植
-
安全
-
易测试
-
易维护(包括代码风格、注释、文档等)
答出其中四个就可得满分。
第五题:
成功:5个题目难度相当,都属于那种有1-2个关键点的程序,只要关键点能想通,就很容易做出,代码量不大。而且几乎与平时实验课的程序大相径庭,考查考生临场思考能力和综合运用知识解决问题的能力。
失败:很多同学就选三个做,一点不多作,哪怕有时间的情况下
- 与实验课最贴近的一道题。用指针访问二维数组是实验课练习过的内容,但能做好的人并不多。至于不知道什么是对称矩阵,那就怪不得别人了。
- 静态变量和全局变量是两种解决此问题的方法。静态变量因为只作用于局部,封装得更好,所以是更好的选择。
- 通过返回值返回三个数,那就要用到结构。至于找最大值和最小值,挨个比较就可以了。算平均值要小心溢出问题。
- 用递归来算更好。这倒不是因为递归容易实现云云,而是因为这里给出的递归算法不涉及到大量运算。如果用公式一,阶乘不仅速度慢,而且是非常容易溢出的。
- 首先,一行不超过80个字符,但必须给'\0'也留好空间。因为以行为单位进行处理,所以fgets()是最合适的选择。strstr()的用法不肖说了。最后别忘了fclose()