《面向对象和组件的C编程ppt课件.ppt》由会员分享,可在线阅读,更多相关《面向对象和组件的C编程ppt课件.ppt(62页珍藏版)》请在三一办公上搜索。
1、面向对象和组件的C#编程教材由科学出版社出版,李 军 武汉大学 测绘学院 “我成长”网站 ,第一章 C#和.NET Framework简介,计算机语言,为什么是C#.NET,C#.NET的发展史,如何学好编程,.NET Framework简介,集成开发环境IDE,创建C#控制台程序的操作步骤,.NET程序集,1.1 计算机语言,计算机语言可分成:机器语言、汇编语言、高级语言。现在有超过2500种计算机语言。如果仅仅使用汇编,估计程序员的思维永远无法跳出“子过程”这个抽象级别。,新的语言出现,老的淘汰掉,从最初与计算机交流的痛苦经历中,人们意识到,应该设计一种语言,接近于数学语言或自然语言,又不
2、依赖于硬件,编出的程序能在所有机器上通用。1 9 5 4年,第一个完全脱离机器硬件的高级语言FORTRAN问世了。5 0多年来,共有几百种高级语言出现,而且在不断的变化:新的语言出现,老的淘汰掉。,有重要意义的计算机语言,有重要意义的有几十种,使用较普遍的有FORTRAN、ALGOL、COBOL、BASIC、LISP、PL / 1、Pascal、C、PROLOG、Ada、C+、VC、VB、Delphi、JAVA、C#、PHP、Python、Ruby等。高级语言可以辅助程序员学习和生产,只有利用高级语言,人们才能有效地把真实事件抽象成计算机能认识的东西。,编程语言排行榜,TIOBE刚刚公布了20
3、11年3月编程语言排行榜。C#连升两级,第一次排名第四,而且市场占有率也逐渐逼近C+。它也是近年来前十语言中一直保持上升趋势的。美国职位搜索网站Indeed的趋势也印证了这一点,C#目前的职位已经超过C+。长期看C#是唯一一个能与Java抗衡的语言。,前20名编程语言排行,C#、PHP、Python、Objective-C是新兴语言的代表,从语言分类来看,以PHP、JavaScript为代表的动态语言和Lisp函数式语言越来越受到重视,但过程式语言和面向对象语言的地位也不可取代。各种编程语言在互相融合,取长补短:静态的和动态的融合,函数式语言和面向对象语言的融合,向多范型的方向发展,C#就是一
4、个典型。,中国的实际情况,程序员杂志联合CSDN网站和各种IT机构所做的大型网络调查(20042006中国程序员大调查),部分结果如下:,转向C#.NET,绝大多数程序员是从其他平台或编程语言转向C#.NET Framework应用开发。其中:来自C/C+的人数最多,达27.29%;来自VB的占22.49%;来自Java的占16.42;来自Delphi的占15.99%(跟着Anders没错)。请注意,.NET Framework似乎对每个领域的开发者都具有吸引力,这的确是它可怕的地方。,1.2 为什么是C#.NET,2000年6月,微软公司向全球宣布其下一代软件和服务,即Microsoft .
5、NET 平台的构想。此外,微软还宣布了基于 .NET 平台的新产品计划,其中包括新一代的Windows 操作系统、Visual Studio 开发系统;而.NET Framework是VS新的编程平台。通过公共语言运行时(CLR),支持多种语言(C#、VB.NET、C+等)的开发。在微软把视窗操作系统和软件向网络迁移的新市场战略中,C#语言是最重要的环节。,微软推.NET背景,考虑一下微软推出.NET时的处境,就会更好的理解它这么做的原因。1)当时,Windows的核心地位不仅正在被互联网所侵蚀,而且受到了Java语言的强力挑战。使用Java编程更轻松,而且具有自己的跨平台运行时,当时已被IB
6、M和甲骨文等IT巨头大力支持。2)而微软的开发工具看上去疲态尽显。VB存在不足,VC+和Windows类库却又对所有人较难。同时,使用COM和ASP的Web开发又显得非常杂乱和不堪一击。,.NET十年得失,1)如果.NET的目标是赶走Java,那么它至少取得了一定程度上的成功。2)C#在不断的变得更加普及,现在已经是多数Windows应用开发的首选语言。3)ASP.NET则已经成为一个倍受欢迎的Web框架。4)市场对C#人才的需求一直在稳步增长,在英国,C#职位数量所占份额已经达到32%,超过了Java的26%。这是C#.NET的成功之处。5)但.NET的不足之处也很明显:.NET绑死在Win
7、dows操作系统下,不是开源的。,.NET为中国程序员带来了什么?,程序员1: 通过.net我找到了工作,还不错! 在公司里我们培训了java、Delphi等 , 所以.net算入门砖吧, 不过初学者很容易通过.net理解编程的内涵,入门语言要容易上手的好。程序员2: 我打算继续深入学习.net,达到一个新的高度,毕竟这孩子也相当不错,尽管那些有钱的企业,大企业都对它没有兴趣,选择了.net你可能会穷一点,但是它的应用领域是越来越清晰了,小型企业应用它肯定长驱直入,我最看好的是移动开发领域,当然这要看WindowsMobile了,它有多成功,那么.net就有多风光,但是我一直坚信在个人终端领域
8、,微软无人可挡其锐。,语言决定思维,选择一门语言,就是选择了一种思维模式。软件开发语言几十年的发展,其实也代表了人们对软件认识的变化。相对于Java的老态龙钟,C#一直蓬勃发展,直到最新的4.5版。Java语言的生产力已经严重落后于C#。自诞生起,C#似乎便和Java有些纠缠不清,因为在当时看来,无论是语言层面还是它们所处平台的目标都十分相似。不过经过了将近10年的发展,如今C#的生产力已经大大领先于Java语言,甚至在近几年的变革中已经成为了Java模仿的对象。,C#首席设计师Anders 谈到:,1) 在设C#期间,我们考察了很多种语言,如C+、Java、C、Smalltalk等,C#混合
9、了以往开发语言的精华。C#和这些别的语言尤其是Java的关键不同点是它非常接近C+。在我们的设计中努力使然。2) 我们希望把C+具备的强大和灵活、VB具备的简单易用同时赋予C#语言。很多语言都有我们感兴趣的相同的核心思想,比如深度面向对象、简化对象等等。3) 在C#语言的几个设计目标中,确保编程人员的高效生产率是最重要的一点。我们在设计C#的时候,就从大家熟悉的C+开始并对该语言进行了简化。,C#首席设计师Anders 谈到:,4) 超越这些传统的语言论题,我们设计语言的一个关键的目标是使C#面向组件。C#是C/C+家族里第一个面向组件的语言。5) 我们努力避免用“象牙塔”的方式设计C#和.N
10、et框架。我们承受不起重写我们所有的软件的负担;你要善于利用你已经拥有的。所以,我认为互操作性也是关键的。6)另一个重要概念是“一站购物式软件”。一旦你用C#写代码,你就在这一个地方写了一切。不再需要头文件、IDL(接口定义语言)文件、GUID和复杂的接口。因为它是自包容的单元。,编程语言的发展趋势及未来方向,2010,Anders在比利时作了一场演讲,阐述了他眼中的编程语言的发展趋势及未来方向:如今影响力较大的趋势主要有三种(下图),它们分别是1)“声明式的编程风格”,包括“领域特定语言”及“函数式编程”,2)过去的五年非常火热的“动态语言”(其最重要的方面是“元编程”能力),3)以及多核环
11、境下的“并发编程”。,1.3 C#.NET的发展史,由于需求的多变性,以及市场竞争的激烈,程序员的压力往往是很大的。他们都希望有高效的语言工具,以在最短时间内制作出最好的软件。这也是应用程序开发的目标。 在.NET出现之前,程序员的生活是痛苦的。1)C程序员:C程序员不得不面对手动内存管理、令人讨厌的指针运算。b) 作为一种结构化语言,C程序员很容易写出冗长的代码,可读性差,不好维护。c) 再加上API定义的数以千计的全局函数,Bug成灾也就不足为怪了!,程序员的生活是痛苦的,2)C+程序员:a) C+程序员得到了面向对象带来的好处。b) 但依然无法摆脱C语言所带来的一些痛苦的方面:手动内存管
12、理、讨厌的指针等等。事实上,C+编程依然是一个艰难并且易犯错误的过程。 3)Java程序员:虽然Java是一种优雅的语言,但是有一个潜在的不足:a) 使用Java意味着在开发周期内从前台到后台都要使用Java。Java基本上不支持与其他语言的集成,因为这有违Java的初始目标: 用单一语言满足所有需要。b) Java的速度也是一个问题。,.NET出现后,应用程序员的生活会得到改善。,什么是.NET?看看微软的定义: .NET基于Internet 标准协议构建, 是一个革命化的新平台, 它融入了计算和通讯的工具和服务。.NET = 新平台 + 标准协议 + 统一开发工具.NET 是一个完全不同的
13、新的模型。.NET 提供的解决方案“改变了所有的东西”。.NET以一种相对激进且蛮横的方式来改善我们的生活。C#是一种基于.NET框架(.NET Framework)的、面向对象的高级编程语言。以框架类库(BCL)作为基础,以Visual Studio.NET为开发平台。,.NET核心功能,1) 对已有代码具有完全的互操作性 已有的COM组件可以和更新的.NET组件共存。 而且平台调用服务允许在.NET的代码里调用基于C的库(包括操作系统的底层API)。2) 完全的语言集成.NET支持跨语言继承、跨语言异常处理和跨语言的调试。一个平台支持多种语言开发,一个程序可由多种语言共同开发。3) .NE
14、T语言共享的公共运行时引擎CLR这个引擎的一个特点是具有一组明确定义的类型CTS,而每一种支持.NET的语言都能“明白”这些类型。,.NET核心功能,4) 全面的基类库BCL这个库除隐藏了原始API调用的复杂性外,还提供了.NET语言所使用的一致的对象模型。5) 简化的部署模型在.NET环境下,不需要将二进制单元注册到系统注册表。另外,.NET允许同一个*.dll的不同版本存在于同一台机器上。 6) 其它优点整个平台基于XML标准,轻松实现WebService,易于开发分布式应用程序;程序运行速度快,可维护行好;学习周期短。,C#,.NET和VS.NET发布情况,注:ECMA是指欧洲计算机制作
15、协会,ISO是指国际标准组织,C#从2.0起突然发力,瞬间将Java语言甩开,2005年底,微软又发布了基于.NET Framework 2.0的C#2.0,植入了适用于大型团队开发的各种优秀的复杂功能。C#2.0有了极大的改善,可以帮助程序员编写更清晰易懂、更容易维护的代码。这种改善来自于不断加入的新功能,例如泛型类型、以及其他大量有用的语言结构。而且,这些改变还伴随着为 .NET Framework 库提供相应的支持。,C#3.0的改进更是堪称经典,1) .NET Framework3.0提供了一套新的内核API,这个版本已经成为Windows Vista操作系统的一部分。2) .NET
16、Framework 3.5 得到增强的功能领域包括基类库、Windows workflow foundation(WF)、Windows Communication Foundation(WCF)、Windows Presentation Foundation(WPF) 和 Windows CardSpace(WC)。3)VS2008主要变化在于强化了对网页应用开发的支持。4)强化了对LINQ开发模式的支持、提供了LINQ to SQL改善数据存取,增加了WPF、WCF、Workflow的设计工具和项目等。5)C#3.0的新特性灵感来自于函数式编程语言,广泛地引入了Language Integ
17、rated Query (LINQ) 模式到通用语言运行库中。6)C# 3.0的其它一些新特性有:匿名类型,Lambda表达式,分部方法等等。,C#4.0的改进,1) C# 4.0 延续了这种不断提高易用性的趋势。2) 大大简化了许多常见任务,包括泛型类型、传统的互操作以及处理动态对象模型。 3) C# 4.0最大的创新点是拥有了动态编程语言的特性。 C#有别于Java的特性并非这么普通,它是凝聚了Anders 这个天才的理想,都是对生产力提高有重大意义的。,1.4 如何学好编程- Anders的回答,1)各个编程语言几乎在每个方面都不相同。语法是你要学习的很大一部分,但这是以前的事了,现在你
18、要学习巨大的框架,这个框架正越变越大,语法只是顶上的一颗“小樱桃”,我认为这方面确实进展很大。2) 实际上起作用的东西是学习所有的API,学习你所基于的,越来越大的平台或者框架。如今,学习曲线的90%都耗费在这上面。3)掌握了这些,你就可以在C+、C#或者VB.NET之间,毫不费力地进行语言转换,将部分项目使用这种语言,部分项目使用那种,并且找出组合这些语言的解决方案。这是个主要的进步。当然,所有这些得以出现,是由于有了通用的类型系统,以及各种语言中的那些抽象。,如何学好编程-李开复的回答,成为一名好的程序员,不是简单地通过学几门课程就能做到的。我个人认为成为一名好的程序员的要素有: 1)扎实
19、的基础知识; 2)很强的解决问题的能力; 3)熟练的编程调试能力; 4)创新能力; 5)团队合作能力; 6)持续的自学能力; 7)好奇心程序 = 语言 + 算法 + 数据结构可能现在要加上更多的内容:项目管理、质量控制、代码规范。用写文章来类比:语言好比文字,算法是文章的思想,数据是文章的内容。所以在经过一个阶段的识字之后,应该试着发表一下自己的思想了。,几个常见误区,1)纸上谈兵:仅通过“看书”和“听课”来学会编程,认为书都看懂了,老师讲的内容都明白了,就是“会编程”了。 评论:“看书”和“听课”仅有20%的作用,80%是编程实践!2)一步登天:一上来就抱本砖头厚的ASP.NET技术内幕 、
20、28天精通C#编程狂啃。选择适合的学习策略1)学习策略的选择建立在对自己的正确认识之上。自己的长处是什么?短处是什么?然后围绕着自己的长处来选择发展方向,确定自己的总体目标。2) 了解社会上人才需求的现状,做到知彼知己。然后制订适合于自己的学习策略:学什么?怎样学?要达到一个什么样的程度?,掌握行之有效的学习方法,1) 观其大略的学习方法 见木又见林,先见林后见木。2)理性知识感性把握,在实践中学习、掌握和应用理论 循序渐进的学习路线,新知识要有附着点,形成知识体系才有用。3)编程的反复学习方法 编程百遍、其义自见。4)快乐编程 接受它的每一面:成功,失败,或各种挫折,.NET学习内容和步骤,
21、.NET有一个庞大的技术体系,初学者如何学习? 1)掌握.NET开发工具, 熟悉开发环境Visual Studio.NET(VS.NET)。 2)理解.NET Framework和CLR 运行机制, 认识内存管理,类型系统, 熟悉框架类库FCL(Framework Class Library)。 3)学习C# 语言基础, 面向对象思想和编程方法, 组件技术。 4)学习Windows Form。 5)学习ADO.NET。 6)学习WPF。有了以上基础知识,再学ASP.NET等就不困难了。,架构、语言、工具 关系图,操作系统,公共语言运行时 CLR(CTS的实现),System(IO,Collec
22、tions, Threading,),ADO.NET and XML,公共语言规范CLS(CTS的子集),类库 BCL,Visual Studio.NET,1.5 .NET Framework简介,1.5.1 公共类型系统CTS,CTS(Common Type System)不是程序系统,它是关于“公共类型”的一个文档说明书。它是微软开发人员编程思想的结晶。CTS体现了核心编程思想面向对象的语言(如C#)把类型推广到整个程序中,函数和数据再也不分离了。C#的编程思想就是:一切都是类型、对象或值。而对象或值也都源自类型,所以C#程序是以类型为中心类型是万物之母。,1.5.1 CTS,不同的高级语
23、言都支持基本类型(int、double等)。.NET的设计者利用这个共性,抽象出公共的类型,并加以规范和推广,形成的结果称为“公共类型系统”,以文档的方式发布出来。类型不是孤立的,它们相互联系,形成了一个庞大的类型系统,该系统还允许用户定义自己的类型。CTS完整地描述了这一切。通俗地讲,CTS就是一个“类型设计说明书” 。这种思想其实非常朴素,一个家庭主妇也可以理解。 主妇自然会把“米和锅”放一起,把“西瓜和刀”放一起;但C程序员会把锅和刀放在“函数库”中 。,公共类型系统CTS,CTS可以分为两个大类:值类型和引用类型,同时这两种类型之间还可以进行强制转换,这种转换被称为Boxing(装箱)
24、和UnBoxing(拆箱)。从下图可以看出CTS的每一种类型都是对象,并继承自一个基类。,公共类型系统CTS,CTS规范完整地描述了CLR支持的所有可能的数据类型和数据结构(class,struct等),指定了这些实体间(对象)如何交互,也规定了它们在.NET元数据格式中的表示。要注意一种特定的支持.NET的语言可能不支持CTS所定义的所有特性。算法 + 数据结构 = 程序,数据结构在.NET中的形式就是公共类型系统。,1.5.2 公共语言规范CLS,公共类型系统过于庞大,无法要求所有的语言都支持它。微软只好缩小规模,从CTS中抽取一个子集-最低标准集(即CLS),任何高级语言只要实现了它,就
25、成为了“公共语言”大家庭中的一员:因为它们都遵守了公共语言的规范要求CLS,所以它们可以进行交流互操作。如图所示。,1.5.3 公共语言运行时CLR,公共语言运行时CLR(Common Language Runtime),也称为运行库。CLR是CTS的实现,为我们定位、加载和管理.NET类型(CTS),是应用程序的执行引擎类库,它严格按照CTS规范实现。作为程序执行引擎,对FCL提供支持,载入和运行用户程序代码,负责内存的分配和管理,代码管理,即时编译JIT,垃圾回收,类型检查,Com封送拆收器(Marshaler)等。,CLR是对Windows系统的补充,CLR的作用与操作系统相似,它是对W
26、indows操作系统的补充。在CLR中运行的程序称为托管代码(managed code),可在操作系统中直接运行的程序称为非托管代码。,1.5.4 基类库BCL,框架类库FCL(Framework Class Library),也称为基类库BCL(Base Class Library)。基类库封装了各种基本类型type,每个类型都暴露出一些功能,如线程、文件输入/输出、图形绘制、数据访问、WEB窗体以及与各种外部硬件设备的交互。类型(type)是一般性的术语,它指的是类,接口,结构,枚举,委托 里的任意一个成员。FCL实现了运行时的各种功能,并通过各种名字空间为开发者提供了所需的各种服务。例如
27、,Collections名字空间包括了链表、哈希表等集合类型;System.IO名字空间就包含了输入/输出基本类。,基类库BCL的用途,虽然CLR实现了CTS基础类型,但开发者如何调用它?基类库解决了这个问题。它封装了每个类型(如int、Console等),暴露出开发者可以调用的功能,如输入输出、图形绘制、数据访问等。基类库BCL提供了数以万计的类型(包括CTS基础类型),可帮助我们完成编程。CTS由CLR实现,但编程人员是通过基类库来使用CTS;这好比米是由农民生产的,但我们在超市买米,基类库就是.NET的超市,它提供了各种类型“积木块”,用户可以像搭积木一样使用它们。,基类库BCL,1)它
28、是.NET 语言共享的标准类库, 任何遵从.NET语言的都可以使用它。 2)它以命名空间组织成树状形式,树的根是System。3)基类库除隐藏了原始API调用的复杂性外, 还提供了支持.NET语言的一致的对象模型。 4)熟悉它是突破设计水平的必经之路,因为其中数以万计的类帮助我们完成了程序设计绝大部分的基础性工作。,总结:,a) 只有符合CTS(公共类型系统)的应用程序才能在CLR下运 行, 而符合CLS的程序或库可以互相调用。b) CTS和CLS是语言系统设计者需要关心的问题; 而初学者只需要对CLR有所了解, 在学习C#语言过程中也自然对CTS和CLS会有了解; BCL才是我们要关心的重点
29、。c) CTS和CLS是描述性的规范文档, 而CLR和BCL是内部 Windows 组件。d) .NET Framework组件 = CLR组件 + BCL组件.NET Framework提供了一个一致的面向对象的编程环境。,.NET Framework平台结构图,.NET Framework2.0的BCL,常用命名空间,1.6 集成开发环境IDE,IDE提供了一个完全的编程环境,用户使用它提供的工具,可完成C#的编程工作 。 VS 2010集成开发环境IDE界面,VS 2010 IDE主界面,创建了一个Windows窗体应用程序。您可看到IDE的主界面,见下图。,IDE中一些概念,1)项目
30、项目是构成某个程序的全部组件的容器, 该程序可能是控制台程序、窗口程序或某种别的程序。 程序通常由一个或多个源文件,加上其他辅助文件组成。 项目文件都存储在相应的项目文件夹中, 该项目的详细信息存储在一个扩展名为.vcproj文件中。2)解决方案 解决方案是存储与一个或多个项目有关的所有信息的文件夹。 与某个解决方案中的项目有关的信息存储在扩展名为.sln和.suo的两个文件中。 创建某个项目时,如果没有选择将该项目添加到现有的解决方案, 那么系统将自动创建一个新的解决方案。,项目和解决方案的关系,解决方案是项目信息的文件夹,项目是它的子文件夹。 右下图表明某解决方案有三个项目:SQX, SQ
31、XDlg和Tool。SQX是VC+.NET语言的项目。,1.7 创建C#控制台程序的步骤,点击菜单:【文件】【新建】【项目】,系统弹出对话框: 1,2,3,4 后,点击【确定】用vs 演示:Console.WriteLine(Hello!);,1.8 .NET程序集,不管选择了哪种.NET语言,尽管.NET二进制文件与非托管Win32二进制文件(*.dll或*.exe)具有相同的文件扩展名,但它们的内部却是完全不同的。 .NET二进制文件不包含特定于平台的指令,它包含的是平台无关的IL(中间语言)和类型元数据。(Intermediate language)下图清楚显示了这个流程。,.NET程序
32、集概览,不管选择了哪种.NET语言,尽管.NET二进制文件与非托管Win32二进制文件(*.dll或*.exe)具有相同的文件扩展名,但它们的内部却是完全不同的。 .NET二进制文件不包含特定于平台的指令,它包含的是平台无关的IL(中间语言)和类型元数据。(Intermediate language)下图清楚显示了这个流程。,.NET编译器生成IL指令和元数据,1) 公共中间语言 CIL,IL的官方术语是MSIL(微软中间语言)。然而在最终发布的.NET中,该术语改为了CIL(公共中间语言)。IL、MSIL和CIL是同一概念。1.1) 第一次编译:使用.NET编译器生成dll或exe文件时,生
33、成的模块会被打包成一个程序集。1.2)第二次编译:程序集包含CIL代码,它只在绝对必需的情况下才编译为特定平台的指令。第二次编译称之为即时编译(JIT)。即时编译器将IL 代码转换为可以直接由 CPU 执行的计算机代码。,第一次编译与第二次(即时编译),CIL的好处,a) 语言的集成性每种支持.NET编译器生成的是几乎完全相同的CIL指令。因此,所有语言都能很好地在定义明确的二进制文件间相互交互。 b)平台无关 .NET Framework本身也是平台无关的。Java程序员早已体会到了这一点好处:一个代码库可以在多种操作系统上运行。实际上,已经存在C#语言的国际标准和大量的.NET平台和实现的
34、子集,它们可以供许多非Windows的操作系统使用。与Java相比不同的是,.NET还允许用户使用自己选择的语言构建应用程序。,2)单文件程序集,2.1)大多数情况下,一个程序集只对应一个二进制文件(dll或exe)。因此,当生成一个可执行文件时,可以简单认为这个exe就是程序集本身。2.2) 单文件程序集是一个独立、单一的包,它包含所有必需的CIL、元数据和相关的程序集清单(manifest)。,3)多文件程序集组件的思想,3.1)多文件程序集则由多个.NET二进制文件组成,其中的每个二进制文件称作模块module。3.2)其中一个模块(称为主模块)一定包含程序集清单(还可能包含CIL指令和
35、各种类型元数据)。3.3)其他相关的模块(dll文件即为组件)包含一个模块级的程序集清单、CIL和类型元数据。3.4)为什么选择创建多文件程序集呢? 当把一个程序集分成几个单独的模块时,你会发现部署时可以更加灵活。 例如,当用户在调用一个需要下载到本地机器的远程程序集时,运行库只会下载所需的模块。,生成应用程序时创建的文件,1) 生成解决方案(或项目)后,方案文件夹中出现一个debug文件夹,该文件夹包含构建项目时产生的输出。其中:*.exe 可执行文件; *.ilk 在重新构建项目时被连接器使用。*.pdb 包含在调试模式中执行程序时要使用的调试信息。在调试模式中(Debug版),可以动态检查程序执行过程中所生成的信息。 2)程序的Debug版本和Release版本Debug版本:包括帮助用户调试程序的信息。使用Debug版,可以在出现问题时单步执行代码,以检查程序中的数据值; Release版本:不包括调试信息,并且打开了编译器的代码优化选项,以提供最高效的可执行模块。,测绘学院的学生为什么喊不会编程?见”我成长”网站的博文。,
链接地址:https://www.31ppt.com/p-1371580.html