关于C程序设计语言教学的讨论

2017-07-11 07:29徐风张丹威
电脑知识与技术 2017年15期
关键词:数据结构C语言程序设计

徐风 张丹威

摘要:梳理c程序设计语言、数据结构的历史发展脉络,揭示c语言在计算机科学中的重要地位,说明学习c语言的重要性。帮助学习者了解c语言的语法规则是如何应对编程实际需要的,这可使语言的学习与实际编程紧密联系。另外,根据教学实际,提出了一个关于c语言学习的考核方案,并提出了c语言终生学习的理念。

关键词:c语言;程序设计;数据结构;教学;实践;考核

1概述

C程序设计语言(The C Programming Language,以下简称“C语言”)是一种通用的编程语言,于1969年至1973年,在贝尔实验室由丹尼斯·里奇(Dennis Ritchie)设计并开发出来。C语言灵活高效、功能丰富、表现力强、移植性好,在程序设计人员中备受青睐,在系统软件与应用软件的开发中被广泛采用,成为近年来使用最为广泛的编程语言之一。

二十世纪八十年代,美国国家标准协会(ANSI)为C语言规定了一套完整的语法规范,称为ANSI C,作为C语言的标准(该标准于1990年,被国际标准化组织(IS0)接受),并不再发展新的C语言标准。当下,有关C语言程序开发工具,一般都支持ANSI C,国内的C语言教程也基本都是以ANSI C为蓝本编撰。

2学习C语言的重要性

C语言以一种简易的方式编译、处理底层存储器,只产生少量机器代码,同时不需要任何运行环境支持便能高效运行。c语言很适合搭配汇编语言使用。尽管c语言提供许多底层服务,但仍保持自身良好的跨平台特性,一个标准的c程序可在许多计算机平台上进行编译,即使是一些嵌入式处理器或者超级计算机。

C语言是我国高等学校理工科学生的公共基础课,是学习计算机专业基础课的先修课程,是全国计算机二级考试语言类考核科目之一,是国家软考(程序员方向)的必考科目。肩负计算机编程语言的推广与普及,结构化设计思想训练与培养的重任!

3C语言教学中遇到的问题

C语言既有严格规范的程序编制逻辑,又有具体全面的语法表达细节,学生在最初接触c语言时,常常充满好奇、大胆尝试,但随着课程的深入,难度的加大,总是暴露出这样那样的问题:

当表达式、语句单独出现时尚能理解使用,但当语法点多了,程序规模大了,前面的基础知识掌握不牢,后边的新内容又接踵而至,同学们对这些缺少基本的心理准备,常常手足无措,导致知識衔接失环。

C语言是一门实践性很强的课程,不少同学,遇到即使是最简单的编程问题,首先想到的是去找现成的答案、查前人的代码,而不愿尝试自己动手编制,他们只起到一个文档录入员的作用,基本达不到编程思维训练的目的。

在对习题的处理上,同学们也往往局限于固定的题目或书本的例题,局限于靠记忆积累的知识分布,缺乏起码的能动性,题目只要稍有变通,他们就不知道从何人手,找不到解题办法,思维一直处于线性阶段,思路始终难以打开。

随着课程的推进,特别是到了函数和指针部分,逻辑思维门槛提高,抽象概念出现频繁,致使学生学习的兴趣迅速衰退,动力急剧减弱,特别是学习心态发生根本性变化:有些同学过于浮躁,对C语言的学习流于表面,稍有挫折,立即放弃;有些同学认为C语言已经过时,内容与社会脱节,在当今ITAT产业中已经派不上用场;部分学生认为大学毕业后不会从事软件开发及相关职业,学的好与不好,对以后就业、发展没有任何影响

4C语言教学方法的探讨

当前,科学技术突飞猛进,新生事物层出不穷,体现在校园里:知识的传播手段丰富多彩,教育教学方式不再限于课堂,MOOC、电教、公开课……俯拾皆是。

在开放式教育扑面而来的今天,如何上好一堂传统的C语言课,倒更值得基层计算机教育者深思。笔者结合多年的学习体会和实践经验,谈谈如何更好地进行C语言教学—个人的粗浅认识,敬请斧正!

4.1历史的深度——C语言的发明

计算机科学与技术界有些里程碑式的人物、划时代的事件必须被刻骨铭记,这里面就有肯·汤普逊(Ken Thompson)、丹尼斯·里奇、Unix的出现、C语言的发明等。

美国的贝尔实验室一直聚集着世界上最有天分的科学家和最富创造力的工程师。1966年,24岁的肯·汤普逊加入贝尔实验室,参与了基于GE-645电脑的Multics操作系统项目开--发。期间,肯·汤普逊编写了+名为"SpaceTravel”的游戏,运行在GE-645上。

后来Muhics项目因为推进缓慢而被终止。为了能够继续玩游戏,汤普逊找到一台老式PDP-7机器,重写了他的"SpaceTravel"游戏。那时候的PDP-7计算机和其他计算机一样,还没有操作系统。把游戏移植好之后,汤普逊与同事丹尼斯·里奇带领一些贝尔实验室的成员在PDP-7上面进行开发,写出了一个名为“Unix”的操作系统,(与“Muhics”名字相对应)。Unix最早运行在PDP-7上,用汇编语言写成。为适应Unix系统工作环境,汤普逊创造了B语言,B语言没有数据类型。

1970年,PDP-11出现,丹尼斯·里奇与肯·汤普逊着手将Unix移植到PDP-11上,无类型的B语言在PDP-11上很不适应,丹尼斯·里奇就在B语言的基础上创造了C语言。

1973年,Unix操作系统的核心正式用C语言改写。

1975年C语言开始被移植到其他机器上使用。从最小的微型计算机到CRAY-2超级计算机。

1983年,因为发展了通用操作系统理论并实现了UNIX操作系统,丹尼斯·里奇和肯·汤普逊二人一起获得了图灵奖(计算机科学界的“诺贝尔奖”)。

道格拉斯·麦克罗伊曾经评价:“你可以安全地把丹尼斯·里奇和肯·汤普逊的名字放到计算机科学界几乎所有未经他人署名的地方!”

4.2现实的广度——C语言无处不在

C语言发明于40多年前,经过时间的检验与历练,依旧历久弥新、光彩照人。可以说掌握了c语言,你就掌握了很多门语言,经过简单的学习,你就可以用这些新型的语言去写代码、搞开发了,这么说是不是太夸张了?

现在可供学习的编程语言非常多,新的语言还在不断涌现,有人自然要问,当下,哪种编程语言最受欢迎?我该学习那种语言?C语言现在用得多吗,是不是过时了?

4.2.1统计规律

当然,以上问题每个人的看法可能都会有所差异,还是用数据说话比较客观:

由图l可以看出,虽然2016年以来C语言受欢迎程度有所下降,但C语言排名始终处于前两位。该图中,2008年C语言的受欢迎程度也曾一度下降,但最终仍迎来反弹,甚至在2013年前后超过iava,蹿升到第一位。

因为功勋卓著,所以c语言至今仍备受推崇。一个最直观的例证是,上图最受欢迎的10种语言排行中,除了c语言自身,其他9种语言,有7种都或多或少借鉴了c语言的语法规范,而Java、C++、C#、PeA则直接衍生自C语言,只有VB和Python不怎么受C的影响。

科学上有句话,叫“先实现、后优化”,先实现意味着从无到有,后优化意味着进一步的完善,c语言明显属于前者。到这,大家该知道C语言的魅力了吧!

4.2.2我们被c语言包围

大家知道的操作系统,Microsoft Windows、Unix、Linux、Mac 0Sx都是用C語言写的,无一例外。比如Linux:

目前大家的生活已经离不开智能手机,而手机上运行的Android就是基于LintLx操作系统。低成本、移植性好、定制功能强,使得Linux在嵌入式系统领域应用广泛。Linux发行版一直被用来作为服务器、主机和超级计算机的操作系统,根据2010年11月公布的数据,超级计算机前500强,有459个(91.8%)运行Linux。

必须强调的是:Linux的绝大部分代码是用C语言写的,少部分用了汇编语言。

4.3数据(结构)的高度——C语言是对数据结构的具体表达

丹尼斯·里奇于1967年加入贝尔实验室。第二年发表博士论文《程序结构与计算复杂性》(Program Structure and Computational Complexity),(耐人寻味的是里奇最终没有正式获得博士学位)。当时,里奇已经对(数据)结构、计算(后来称为算法)等等有了深刻的认识,他所发明的C语言其实是对这些认识的具体实现!

无独有偶,瑞士计算机科学家尼克劳斯·维尔特(德语:Niklaus Emil Wirth)于1976年出版过一本书Algorithms+DataStructures=Programs,这本书的书名《算法+数据结构=程序》成为后来计算机科学特别是软件科学的指导思想。

4.3.1起初,我们把计算机定义为研究算法的科学

早期,一些非常复杂的公式计算,是很难通过人脑在短时间内完成的,另外,如果需要人脑重复去运算这些公式,出错的几率非常高。这时,需要借助一种工具来帮助人们高效、准确、快速地完成公式计算,做一些重复性工作,这就是计算机出现的原因。

那个时候的计算机非常庞大,功能简单,速度相对较低,运算能力有限,人们通过编制高效的算法简化复杂的公式运算,期望较快的得出结果,所以,当时人们称计算机是研究算法的科学。

4.3.2现在,计算机是研究数据(结构)的科学

随着科技的进步,超大规模集成电路的出现、Internet的异军突起,这些迅速推动了计算机的普及,此时的计算机早已超越了原始的公式计算,转而用来代替人们从事复杂单调的劳动以及对大批量数据的处理。

广义上的数据实际上是非常复杂的,远不止中学时学到的整数、复数、虚数等。现在的数据实际上包含了现实世界中所有能被计算机处理的信息,我们要对这些信息进行抽象,分析它们的特性,进行高效的存储,还要编制算法对它进行统计、查询、输出等等。

为满足人机交互、速度快、可视化等要求,计算机必须具有对大批量数据进行高效分类处理的能力。所以我们称现在的计算机科学是研究数据(结构)的科学。

4.3:3C语言与数据结构(算法)的联系

程序就是大家用程序设计语言编制出来的语句流程。你编写一个程序,首先就要对数据进行定义。在C语言中所定义的数据,包括了整型、浮点型以及字符型等,还包括了一些较为复杂的数据比如:数组、结构、记录等,这些,被我们称为数据类型。

在编写程序之前,我们必须确定要面对哪些数据,这些数据的类型是什么,这些数据之间的关系是什么,这实质上就是数据结构的具体体现。当然纯粹的数据结构比C语言处理的范围更广,难度更大,更抽象;另外,很多数据结构不是由程序设计语言提供给你,而是要由你自己来编写的。

大家用C语言编写程序,对定义的数据进行相应的运算,加上顺序语句、循环语句、判断语句等程序流的控制,这就构成了算法。

总之,我们的C语言程序确实就包括了数据结构和算法这两个部分。

4.4实践的厚度——C语言“干”比“知”重要

从事C语言教学的朋友都知道,这门课程的核心概念是结构化、三个基本流程、优先级、数组、函数、指针、结构体、作用域、文件等,这些概念把整个c语言的逻辑体系贯穿起来,只有明白了这些才能在今后的学习中扎实把握C语言的精髓。

当然我们也知道,光靠听课和看书是学不好以上概念的,c语言的学习既要掌握概念,更要动手编程,还要亲自上机运行调试,要十分重视实践环节,学得好与坏,不是看你“知不知道”,而是“会不会干”。

4.5考核的宽度——C语言要宽进宽出

学校整个教学大纲的安排,C语言的课时相对较少,一般64学时(包括16学时上机),在这么短的时间内要学生们掌握c语言,着实不是一件轻松的事。反映在课程的考核上,就是期末考试不及格率高,接下来的补考通过率低。

鉴于c语言自身的特点,这着实让任课老师伤透脑筋。撇开学生如何学习,老师如何讲授不谈,这里谈谈本人对考核体系的一些思考与尝试(本门课学生的构成不做要求:可以是专业的、选修的、重修的、留级的……),即,用2-3-5的原则把整个考核分为论文、平时成绩、期末考试三个部分。

4.5.1论文(20%)

以当下计算机科学为主题,写一篇文章。内容不限、形式不限、字数不限,可以是自己的看法、观点、思想,可以是程序、算法、数据抽象,但有一点要强调:就是必须是自己的原创。

4.5.2平时成绩(30%)

平时成绩主要用来记载课前测验、课堂提问、作业完成、实习效果等情况,这也是最考验教师智慧的地方,因为这意味着对每个学生的学习情况进行“跟踪”,工作量加大。当然,如果这个环节处理好了,那就能把握学生梯度,因材施教,这个也是对学生们最负责任的做法。

4.5.2期末考试(50%)

该课程尽量早结束,晚考试,空出的时间,留给同学们做模拟题。本课程参考驾照考试模式,编选出20套题,其中10套留给学生模拟,另外10套作为期末试题库,以考督学,如果有部分同学在第二个环节(平时成绩)做得不够好,通过模拟题,可以让他们及时发现问题,找出差距,迎头赶上。

以上是一种个性化设计,体现出老师的人文关怀,通过以上方法,学习效果普遍好转,考试通过率明显提高!

4.6成长的跨度——C语言需要终生学习

第一次接触C语言,往往是在高校,学习的目的是学分。当然,学了以后,有部分朋友会喜欢上它,特别是等你踏上工作岗位,接触了其他语言,这时你再回头来看C语言,你会被它的美所征服,c语言是天才的作品,是丹尼斯·里奇留给计算机界的宝贵遗产,短时间内掌握不了它是很正常的,本人每读一遍教材,就会有一次新的体会。所以,个人认为C语言需要用一辈子来学习。

4.6.1对效率的追求

在计算机相当昂贵,速度相对较慢,内存以KB计算的年代,人们对程序效率的要求是苛刻的。c语言精心设计的代码可以极大地节约计算机资源,同时又比汇编语言容易理解,所以受到程序员的普遍欢迎。

C语言留给编程人员最大的自由度,让他们不受约束地张扬个性、发挥创意,基本不用去质疑代码的危害性,因为c相信程序员是正确的,即便有错误,也一定能够自我修复。当然,无限制的自由,一面释放出创造欲,另一面则制造出混乱。

4.6.2谁制造了灾难

隨着硬件性能的提升、软件规模的扩大,程序的运行效率让位于安全性、稳定性、维护性,这时编程人员数量剧增,编程水平降低,出错概率加大,程序关联陛加强,一个不起眼的错误就可能引发系统性灾难。很多人把这种灾难产生的原因归咎于c语言,开始怀疑它、畏惧它、逃避它,却很少反省自己糟糕的编程能力。

4.6.3倔强的c语言

有人提出给C语言戴上枷锁,C语言拒绝了。于是很多语言罩上c的外衣,自己戴上枷锁出现了。它们看上去很像c,所以容易被大家接受;因为它们戴上枷锁,所以不再听命于程序员,而是朝程序员发号施令,如果程序员拒绝,它们干脆就躺倒不干。这样灾难事件减少了,开发步伐加快了,团队合作容易了,代码错误减少了,编程能力降低了……

有那么些程序员,他们坚持信念、喜欢挑战,他们颠覆传统,打碎枷锁,他们向往黑客的自由生活,渴望C语言激发出自己的内在潜力。为了达到这种高度,你愿不愿意用一辈子来完成?

5结束语

2006年3月,卡内基·梅隆大学计算机科学系主任周以真(Jeannette M.Wing)教授在《计算思维》一文中指出:

计算机科学的教授们应当为大学新生开一门“怎么像计算机科学家一样思维”的课程,面向所有专业,而不仅仅是计算机科学专业。我们应当使入学前的大学生接触计算的方法和模型。激发公众对于计算机科学领域探索之兴趣,而不是悲叹对其兴趣的衰落或者哀泣其研究经费的下降。所以,我们应当传播计算机科学的快乐、崇高和力量,致力于使计算思维成为常识……

——谁能担纲此任,唯C程序语言!

猜你喜欢
数据结构C语言程序设计
基于Visual Studio Code的C语言程序设计实践教学探索
从细节入手,谈PLC程序设计技巧
基于C语言的计算机软件编程
高职高专院校C语言程序设计教学改革探索
“翻转课堂”教学模式的探讨——以《数据结构》课程教学为例
PLC梯形图程序设计技巧及应用
论子函数在C语言数据格式输出中的应用
TRIZ理论在“数据结构”多媒体教学中的应用
《数据结构》教学方法创新探讨