大学为何从C语言学起,C++为何没讲STL

简介: 【来信】  我是一名普通的大学生,来自(  )大学。很抱歉这么晚打扰您,刚做完几个计算几何学的题目,还没来得及整理,看到您C++课堂系列的博客,想着,酝酿已久的邮件也该写了。  我有两个疑问,为什么学校不以C++作为入门语言?我现在正在搞ACM,知道C++在很多情况下不如C语言灵活,尤其是stl等工具的使用上,不能随心所欲编写想要的算法。但是,C++作为C语言的超集,面向对象的思想等等都是C语
【来信】
  我是一名普通的大学生,来自(  )大学。很抱歉这么晚打扰您,刚做完几个计算几何学的题目,还没来得及整理,看到您C++课堂系列的博客,想着,酝酿已久的邮件也该写了。
  我有两个疑问,为什么学校不以C++作为入门语言?我现在正在搞ACM,知道C++在很多情况下不如C语言灵活,尤其是stl等工具的使用上,不能随心所欲编写想要的算法。但是,C++作为C语言的超集,面向对象的思想等等都是C语言不可及的。它兼具其他面向对象语言的特性,并向下兼容C语言,在我看来应该拿它作为入门语言。当然,初读C++ Primer这类书的时候很难啃下来,但是如果结合上课讲解的知识,对C++有个大致的了解是没有问题的。像我们学校,仍旧拿C语言作为入门计算机语言,C++课程名字直接就是面向对象,有些不可思议。
  我的第二个疑问是,为什么学校不会介绍一个重要的工具——STL?它的正确性、稳定性和高效性已经被无数次验证,为什么学校不介绍它。我相信STL在真正的软件设计里面应用十分广泛的。

【回信】
  来信收到。你问了一个非常好的问题。不过我的回答也许让你失望,我今年1月去过你们学校调研交流,对你们学校在程序设计教学中的做法还是认可,并且作为一段时间以来要学习的。在我所在的学校,尽管第一门程序设计课称为程序设计基础或C++程序设计,在这个为时两学期的课中,第一个学期基本还是C的内容,讲C++中面向过程的程序设计,第二个学期是面向对象的部分。你们学校的分两门课的教学,中间还要插入一个以实践能力提高为主的短学时课程,其好处是明显的。
  要回答你的问题,必须明确,在大学里第一门程序设计课程中要解决的主要问题是:学会编程序。因此名为XX语言程序设计,重点在于程序设计方法,然而现实的考虑中也不得不将很大的精力投入到语言本身中来。学习第一门语言,首先在于能设计程序,至于用这个语言解决工程中实际问题的方案,倒是要放在其次了。在我的教学中,STL也只是会提及,并不作为要求。
  大学的课程是一个体系,想要实现的某一个目标常体现在多门课程中,并且各门课程之间能够形成承接关系。举一个例子,排序在学科中很重要,数据结构中有专门的内容,在程序设计入门课程中,也要初次尝试。这些尝试要比学会用STL中的sort算法更有意义,更应该放在优先的地位。再如,你正在做的计算几何问题,以及图形学课程中将要学习的算法,不是也有现成的图形包可以直接使用吗?实际上,大学的课程从用的角度有两方面的兼顾,一是能够直接用,二是要通过这种体系,为你将来进一步地理解STL、图形包之类的机制、工具提供支持。而后者,你应该意识到,这是专业人员,无论在思维方式上,还是对适应行业变化,甚至是引领行业变化的资本所在。
  有一句大家相传甚广的话你没有说出来:大学,有用的不教,尽教没有用的。从某种意义上这句话对,但是,在“用”的层次上多加区分之后,你会发现,直接用于工程,以及直接用于学习能力提高与思维方式改变,间接用于形成终身学习能力,适应技术的可能变化,这都是大学之用。在此当中,“直接用于工程”没有太多的突出,也不见怪。学习计算机的另外一些路子,市场用什么就学什么,想转做另外一个方向的工作,必须接受培训,他们所学的全部就是直接用于工程的知识。
  做了如上的解释,我不能回避学校教育中的缺失。我们正处在这个时期,其实真实的世界中,补上这个缺失,又会在新的发展阶段遇到新的不足。其中还有一个缺失是,没有让同学们体会到直接用和间接用之间的关系。我当老师多年,也深知在“读高中是为了考大学”,“上大学是为了找工作”这样的直接思维甚浓的条件下,大学在改变学生的学习方面,不只是只坚持目前该有的做法就算可以的了。C++课中是需要有STL的内容的,但在有限学时,以及不少学生在学习上的投入问题,其中的取舍,作为老师是有纠结的,当学生的,不同的人,根据情况,可以有不同的应对。
  意识到这一点,也就知道了,大学的教学计划只是一个公共的要求,是一个获得毕业证的最低标准,要知道除了老师教的,课外必须要有自己额外加的。这一部分是可以有充分的自主性的。你另加STL就是一个很好的做法。参加ACM竞赛要额外做大量练习,这也是一个超越教学计划的做法。在某个时期,需要,也可在应用能力提高上投入了,自行安排学习即是。如果届时选择用的语言是C++,把STL用熟,那是不可回避的事。上过了大学,就要有准备,也要练出自学能力,需要学的东西,并不一定需要人教。如果不去摆脱总让人教的思维,结果就是当技术发展了,你将不能主动地站到前沿,在等人教的过程中,面临无情的淘汰。
  回到你问的问题上,在工程中用哪种语言,根据需要去定。而实际上,在大学中程序设计入门,选用哪种语言,是可以有多种选择的。比如还有的学校用Java,国外开始有用Python的。这都是多种选择中的一种,各有利弊。作为学生,你的选择是,照你的学校安排的路线去执行。其中的不足,还要有课外的学习作为补足。上课只造就所有同学共性的地方,课外却使你拥有了自己的精彩。不同的同学在课外有了不同的选择,于是分出了水平上的阶梯,以及出现了各具特色的人才。

  用好你当前的教学计划中提供给你的帮助,开创出自己有效的自学,让你的大学更精彩。  


    

==================== 迂者 贺利坚 CSDN博客专栏=================

|==  IT学子成长指导专栏  专栏文章分类目录(不定期更新)    ==|

|== C++ 课堂在线专栏   贺利坚课程教学链接(分课程年级)   ==|

======== 为IT菜鸟起飞铺跑道,和学生一起享受快乐和激情的大学 =======

  
目录
打赏
0
0
0
0
67
分享
相关文章
|
3月前
|
C++ STL 初探:打开标准模板库的大门
C++ STL 初探:打开标准模板库的大门
137 10
C++入门1——从C语言到C++的过渡
C++入门1——从C语言到C++的过渡
86 2
【c++丨STL】list模拟实现(附源码)
本文介绍了如何模拟实现C++中的`list`容器。`list`底层采用双向带头循环链表结构,相较于`vector`和`string`更为复杂。文章首先回顾了`list`的基本结构和常用接口,然后详细讲解了节点、迭代器及容器的实现过程。 最终,通过这些步骤,我们成功模拟实现了`list`容器的功能。文章最后提供了完整的代码实现,并简要总结了实现过程中的关键点。 如果你对双向链表或`list`的底层实现感兴趣,建议先掌握相关基础知识后再阅读本文,以便更好地理解内容。
31 1
【c++丨STL】list的使用
本文介绍了STL容器`list`的使用方法及其主要功能。`list`是一种双向链表结构,适用于频繁的插入和删除操作。文章详细讲解了`list`的构造函数、析构函数、赋值重载、迭代器、容量接口、元素访问接口、增删查改操作以及一些特有的操作接口如`splice`、`remove_if`、`unique`、`merge`、`sort`和`reverse`。通过示例代码,读者可以更好地理解如何使用这些接口。最后,作者总结了`list`的特点和适用场景,并预告了后续关于`list`模拟实现的文章。
55 7
【c++丨STL】vector的使用
本文介绍了C++ STL中的`vector`容器,包括其基本概念、主要接口及其使用方法。`vector`是一种动态数组,能够根据需要自动调整大小,提供了丰富的操作接口,如增删查改等。文章详细解释了`vector`的构造函数、赋值运算符、容量接口、迭代器接口、元素访问接口以及一些常用的增删操作函数。最后,还展示了如何使用`vector`创建字符串数组,体现了`vector`在实际编程中的灵活性和实用性。
104 4
【c++丨STL】string模拟实现(附源码)
本文详细介绍了如何模拟实现C++ STL中的`string`类,包括其构造函数、拷贝构造、赋值重载、析构函数等基本功能,以及字符串的插入、删除、查找、比较等操作。文章还展示了如何实现输入输出流操作符,使自定义的`string`类能够方便地与`cin`和`cout`配合使用。通过这些实现,读者不仅能加深对`string`类的理解,还能提升对C++编程技巧的掌握。
105 5
【c++丨STL】string类的使用
本文介绍了C++中`string`类的基本概念及其主要接口。`string`类在C++标准库中扮演着重要角色,它提供了比C语言中字符串处理函数更丰富、安全和便捷的功能。文章详细讲解了`string`类的构造函数、赋值运算符、容量管理接口、元素访问及遍历方法、字符串修改操作、字符串运算接口、常量成员和非成员函数等内容。通过实例演示了如何使用这些接口进行字符串的创建、修改、查找和比较等操作,帮助读者更好地理解和掌握`string`类的应用。
80 2
【c++】STL简介
本文介绍了C++标准模板库(STL)的基本概念、组成部分及学习方法,强调了STL在提高编程效率和代码复用性方面的重要性。文章详细解析了STL的六大组件:容器、算法、迭代器、仿函数、配接器和空间配置器,并提出了学习STL的三个层次,旨在帮助读者深入理解和掌握STL。
83 0
【c++丨STL】vector模拟实现
本文深入探讨了 `vector` 的底层实现原理,并尝试模拟实现其结构及常用接口。首先介绍了 `vector` 的底层是动态顺序表,使用三个迭代器(指针)来维护数组,分别为 `start`、`finish` 和 `end_of_storage`。接着详细讲解了如何实现 `vector` 的各种构造函数、析构函数、容量接口、迭代器接口、插入和删除操作等。最后提供了完整的模拟实现代码,帮助读者更好地理解和掌握 `vector` 的实现细节。
50 0
【C语言】C++ 和 C 的优缺点是什么?
C 和 C++ 是两种强大的编程语言,各有其优缺点。C 语言以其高效性、底层控制和简洁性广泛应用于系统编程和嵌入式系统。C++ 在 C 语言的基础上引入了面向对象编程、模板编程和丰富的标准库,使其适合开发大型、复杂的软件系统。 在选择使用 C 还是 C++ 时,开发者需要根据项目的需求、语言的特性以及团队的技术栈来做出决策。无论是 C 语言还是 C++,了解其优缺点和适用场景能够帮助开发者在实际开发中做出更明智的选择,从而更好地应对挑战,实现项目目标。
82 0

热门文章

最新文章

AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等