第1章程序设计ABC东莞理工学院计算机学院计算机科学与技术教研室谢伟鹏159929351812019/12/20C语言大学实用教程课件2Whatisacomputer?•AComputerisadevicecapableofperformingcomputationsandmakelogicaldecisionsatspeedsmillions(evenbillions)oftimesfasterthanhumanbeingscan.2019/12/20C语言大学实用教程课件3Whatisacomputer?•目前最快的supercomputers可每秒执行trillionsofadditions•红杉超级计算机,每秒16324万亿次运算.•天河一号每秒1750万亿次•目前的PC机可每秒执行十亿次加法–人用计算器一生也完不成PC机1秒钟完成的计算量00000000000000002019/12/20C语言大学实用教程课件4Whatisacomputer?•硬件(hardware)–键盘、鼠标、显示器、硬盘、DVDs、内存、CPU…–硬件成本下降很快–摩尔定律•计算机性能每18个月翻一番,而芯片价格保持不变•软件(software)–运行于计算机之上的程序(Program)–如何降低软件开发成本?2019/12/20C语言大学实用教程课件5Whatisacomputerprogram?•很像厨师的菜谱,定义了执行某个任务所需的步骤•但不幸和不同的是,你不能使用你自己的母语来写Code•计算机能读懂的语言——–机器语言(MachineLanguage)•由一系列二进制0和1组成2019/12/20C语言大学实用教程课件6计算机与人工智能•计算机行业的梦想–与人自然交流,像人一样地思考–人工智能(ArtificialIntelligence)•图灵测试–1950年,英国数学家A.M.Turing在思想(mind)杂志上发表“计算机与人工智能”一文,提出判定机器是否具有智能的测试方法2019/12/20C语言大学实用教程课件7计算机与人工智能•博弈被认为是智能活动,AI之初主要研究下棋程序•1997年,IBM公司研制的深蓝超级计算机在一场“人机大战”中打败了国际象棋大师卡斯帕罗夫–被誉为“人工智能的一大胜利”–世界排名第二的棋手印度人阿南得说:•这是一个像人的机器和一个像机器的人之间的战斗•深蓝的主要研制者之一许峰雄博士:–胜利靠的只是不知疲倦地高速运算,并不是什么智能–深蓝中输入了近200万棋谱2019/12/20C语言大学实用教程课件8计算机与人工智能•AI的先驱者之一CarnegieMellon大学(CMU)的HerbertSimon回忆说:–最令他惊讶的是做“难”的事情是多么的容易,而做“容易”的事情是多么的“难”–至今仍无人造出可自动穿越拥挤的房间或理解儿童故事的机器来•Comput+er——计算的机器2019/12/20C语言大学实用教程课件9Whatisprogramminglanguage?•计算机能读懂的语言——–机器语言(MachineLanguage)•由一系列二进制0和1组成–机器语言编写的1+1程序–低级语言101110000000000100000000000001010000000100000000像不像天书?2019/12/20C语言大学实用教程课件10Whatisprogramminglanguage?PRINT1+1结果显示在屏幕上#includestdio.hmain(){printf(%d\n,1+1);}•程序设计语言(programminglanguage)–BASIC语言编写的1+1程序–C语言编写的1+1程序–既不是英语,也非机器语言•但更像英语–高级语言•比写机器语言程序容易,但比使用英语难2019/12/20C语言大学实用教程课件11Whatisprogrammer?•编写程序源代码(SourceCode)的人–程序员(Programmer)•计算机、程序员、程序之间的关系–乐队、指挥家、乐谱–军队、总司令、作战计划2019/12/20C语言大学实用教程课件12怎样让计算机读懂高级语言?•编译器(Compiler)–把源代码转换为可被计算机理解的机器代码•把机器代码以可执行文件(ExecutableFile)的形式保存在磁盘上•一种程序设计语言对应一种编译器2019/12/20C语言大学实用教程课件13怎样让计算机读懂高级语言?•程序员按照该语言的语法编写程序源代码–把自己的意图写入源代码中•编译器读入源代码–把程序员的意图转换成可执行程序,供他人使用C语言可执行程序编译器2019/12/20C语言大学实用教程课件14怎样让计算机读懂高级语言?•程序设计语言是人与计算机进行交流的语言–有很多种,分别适合做不同的事情•现在人还只能主动学计算机的语言–做不到计算机学会人的语言•当计算机懂了人的自然语言……2019/12/20C语言大学实用教程课件15程序是如何运行的?•计算机把机器代码读入到内存(Memory)–由CPU运行这些代码–读取输入(Input)–产生输出(Output)–完成程序员预定的功能•计算机专业后续课程–计算机原理–编译原理–操作系统程序和数据执行结果2019/12/20C语言大学实用教程课件16程序开发步骤–Whatistobedone?–可执行文件–扩展名为.exe的文件分析(Analysis)设计(Design)编码(Write)编辑(Edit)•编译(Compile)链接(Link)•运行(Run)•调试(Debug)–Howisittobedone?–扩展名为.c的文件(对C而言)–扩展名为.obj的文件2019/12/20C语言大学实用教程课件17计算机为什么用二进制呢?•为什么不用我们日常熟悉的十进制呢?–二进制在在电器元件中容易实现–计算机进行二进制运算比进行十进制运算简单–•1946年,冯.诺伊曼在计算机中引入二进制,提出著名的冯.诺伊曼结构,至今仍被采用,被誉为“计算机之父”2019/12/20C语言大学实用教程课件18“冯·诺依曼机”结构输入/输出设备存储器运算器控制器源程序和输入数据输出结果取出数据存入数据操作命令存取命令取出程序指令输入输出命令计算结果CPU大脑记忆装置眼睛和耳朵2019/12/20C语言大学实用教程课件19高级语言的魅力•易学、易用、易读、易懂、强大、可移植•百家争鸣,据不完全统计2500种,绝大多数是高级语言–~nkinners/LangList/Extras/langlist.htm可看到其列表和简介–影响最大、寿命最长的是C语言2019/12/20C语言大学实用教程课件20流行的高级语言•应用编程语言–机器语言–汇编语言–Basic–Pascal–C–C++–Java–C#•专项编程语言–LotusNotes–PowerBuilder•Web编程语言–HTML–XML–PHP–ASP–JSP–JavaScript–VBScript•其他–perl–python–VBA搜集了大约50种极具代表性的语言的故事和资料2019/12/20C语言大学实用教程课件21C程序设计语言•20世纪60年代,贝尔实验室,KenThompson开始开发一个叫做UNIX的操作系统•70年代,将BCPL语言改造成更适合开发UNIX的B语言•1971年,DennisM.Ritchie开始和Thompson合作开发UNIX,将B语言改造成C语言2019/12/20C语言大学实用教程课件22C语言的设计者DennisM.Ritchie2019/12/20C语言大学实用教程课件23和Unix的设计者KenThompson接受美国国家技术勋章2019/12/20C语言大学实用教程课件24Ritchie和Thompson在开发UNIX2019/12/20C语言大学实用教程课件25Ritchie漫画像2019/12/20C语言大学实用教程课件26C程序设计语言•是一种高级语言–高级语言并不是“高级”,只是相对低级语言,在一个高的级别上进行编程•历史悠久,战勋卓著–诞生于上世纪70年代初,成熟于80年代–“ANSIC”标准的发布是C语言成熟的标志–很多重量级软件都是用C写的•上天入地,无所不能–几乎没有不能用C写出来的软件,没有不支持C的系统2019/12/20C语言大学实用教程课件27C程序设计语言硬件(Hardware)操作系统(OS)应用程序(Application)应用平台基于平台的应用程序低级语言的地盘高级语言的地盘C语言的地盘2019/12/20C语言大学实用教程课件28C程序设计语言•C语言被分类为高级语言,但实际上它是一种介于高级语言和低级语言之间的语言。•很多流行语言、新生语言都借鉴了它的思想、语法–从C++,到Java,再到C#•正确地学好C语言,是学习这些流行语言的基础。2019/12/20C语言大学实用教程课件29几个需要思考的问题•有最好的编程语言吗?•编程是一门艺术吗?•编程时应该使用过多的技巧吗?•如果软件运行速度慢,是换更快的计算机还是换更快的算法?•错误是否应该分等级?•运行正确的程序就一定是高质量的程序吗?2019/12/20C语言大学实用教程课件30有最好的编程语言吗?•Pascal的学院气息•Java的效率问题•C#的中庸之道,个性不鲜明•VisualBasic的稚嫩面孔•Smalltalk的实验风格•Ada的集大成,但又琐碎和繁冗2019/12/20C语言大学实用教程课件31有最好的编程语言吗?•能很好的解决问题的语言就是好语言。•在最恰当的地方,最恰当的时候,选择最恰当的语言,同时防止跌入语言自身的陷阱。2019/12/20C语言大学实用教程课件32编程是一门艺术吗?•随心所欲,不可把握•满足客户需求–不是为自己享受,不能“削足适履”•规范化编程–在一定程度上压抑了“艺术”,但它能提高程序质量和生产率2019/12/20C语言大学实用教程课件33编程时应该使用过多的技巧吗?•技巧的优点:–能另辟蹊径的解决问题•缺点:–不为人所熟知,可读性差,容易留下隐患•不能滥用技巧,否则不是锦上添花,而是画蛇添足–失败的技巧常被讽刺为“伎俩”–《卖油翁》的故事2019/12/20C语言大学实用教程课件34如果软件运行速度慢,是换更快的计算机还是换更快的算法?•改进算法可以从根本上提高软件的运行速度,但是可能引入Bug以及延误进度•如果软件已经用于商业,则须谨慎考虑•类似的问题:–是买现成的程序,还是彻底由自己开发?•技术人员和商业人士会有不同的决策。2019/12/20C语言大学实用教程课件35错误是否应该分等级?•一级严重:–错误导致软件崩溃•二级严重:–错误导致一个特性不能运行,且没有替代方案•三级严重:–错误导致一个特性不能运行,但是有替代方案•四级严重:–错误是表面化的,或是微小的。2019/12/20C语言大学实用教程课件36错误是否应该分等级?•错误分等级的好处:–便于统计分析•缺点:–带有严重的技术倾向,并非普遍适用•例:财务软件–错误A:导致系统死机–错误B:导致工资计算错误•再如:航空软件操作手册写错2019/12/20C语言大学实用教程课件37错误是否应该分等级?•所有错误都是严重的,不存在微不足道的错误。•质量的最高境界:–“零缺陷”•假设某系统的总质量=10个开发人员的工作质量之积,即最高分1.0,最低分0–如果每个人的质量目标0.95,则总质量不会超过0.598–只有每个人都做到1.0,总质量才会是12019/12/20C语言大学实用教程课件38运行正确的程序就一定是高质量的程序吗?•正确性只是反映软件质量的一个因素而已•长得结实、饭量大的人就健康吗?•不贪污的官就是好官吗?2019/12/20C语言大学实用教程课件39软件的质量属性•正确性(correctness)•健壮性(robus