分享

计算导论与C语言基础6理性认识C程序设计语言

 山峰云绕 2022-04-04

https://m.toutiao.com/is/Nqg6Dk5/?=理性认识C程序设计语言 



理性认识C程序 导论

本次课帮助大家了解C语言的历史,了解C语言规范(Specification)的版本演进,了解C语言的规范是一个“宽松”的规范;在此基础上,我们将阐述一门程序设计语言所包含的四种基本成分(如上所述)。 焦点问题:为什么相同的C程序在不同的C程序编译器上,会编译出不同的结果?

明确学习进度
好,同学们,我们 继续往前推进我们的学习,那么在开始这个新的部分之前 我们先来明确一下我们接下来的学习进度 明确一下我们处在什么地方,将来 会怎么去走,大家看这个图,在这个图上有两条线 一条线是讲课內容, 也就是在我们的课程里头要讲述的知识 包含这些怎样的进度 第二条线呢是作业练习。它的一个进度。在讲课內容里头,我们把它分成了四个阶段 分別是感性认识,理性认识,函数,以及指针等等其它的部分,分成了这几个阶段 那么作业练习,

跟这个不同, 作业练习呢,我们把它大致分两个阶段,一个叫初级阶段的作业练习 一个叫正常的作业练习,那么在作业练习的初级阶段 我不要求大家能够独立地写出正确的计算机程序,我不作这个要求 在这个阶段,我只希望你拿出你的兴趣来 通过一种感性的方式尽可能多地去了解,去感受计算机程序 这是我在这一阶段给大家的要求,

从时间上讲 虽然我们接下来讲课内容要进入理性阶段了, 但是我们的作业练习将长期处于初级阶段,给大家 一个比较长的缓冲时间,利用这段时间去充分地感受程序,然后我们再慢慢地过渡到 正常的作业练习 我相信大家通过这个图能够明白我们目前所处的进度,总而言之,接下来讲课内容要进入 理性认识机程序这个阶段,但是我们作业练习將长期处于初级阶段 在这个阶段,我只希望你们通过感性的方式充分地去了解程序,就可以了

C语言的由来


那好,在真正开始我们理性认识C程序之前, 我们这次课呢,我们先花一点时间来做一些预热和准备 跟大家介绍一下,我们即将学习的 C程序设计语言。 OK。那么C程序设计语言首先是一门高级程序设计语言。 什么叫高级程序设计语言,待会我们再说。而且呢,根据这个网站的综合统计, C程序设计语言仍然是全世界最通用的程序设计语言。 我们通过这个数据呢我们看的出来,接下来还有java,还有C++ PHP等等等等一系列的程序设计语言。

那么有一种程序设计语言就是python。 python呢发展比较快,虽然比较新。但是呢,迅速地 受到人们的关注。如果有兴趣的同学可以去关注一下python。 那在这个课上呢,当然我们要学的就是C语言了。 那我就想问一个问题。你知道,它为什么要叫C语言吗? 它为什么不叫B语言,为什么不叫D语言, 为什么它要叫C语言呢?

那么接下来我们就来说一下这件事情。 要说这件事情,我们得从最基本的计算机语言开始说起 那计算机能够接受的最基本的语言就是机器语言, 也就是010101这样的字符串。我们可以看到比方说这一串字符串表示 把数据装入寄存器0,底下这一串,表示数据装入寄存器1, 然后呢以此类推。我们可以看到由0101这样的字符串所构成的语言, 它也是一种语言,只不过它比较低级。我们把它叫做低级计算机语言。 看了这个呢大家可以感受到,如果我们每天写程序,都写0101这样的字符串, 那是不是痛苦死啦,但是有一个人并不觉得这样是痛苦的,待会我们再说他。 至少我们觉得这样是,实在是痛苦死了。

所以人们为了提高写程序的效率,不断地去改良这些语言。 比方说在低级语言的基础上,我们又发明出了汇编语言。像这样的句子就是汇编语言。 load 0 a表示把数据a装入寄存器0; load 1 b表示把数据b装入寄存器1; mult 0 1把这两个寄存器的数进行一个相乘的运算。 然后呢,把一个新的数据c装入到寄存器1里头。寄存器0和1的数据相加, 结果保存在寄存器0里头,通过这种方式。 这个呀,比刚才我们看到的01字符串强多了, 至少我们能看懂这串是什么意思了。有了很大的进步,但它仍然属于低级语言。 那什么叫高级语言啊?对比一下你就知道什么叫高级语言了。 看这个,这是刚才的那一堆,二进制的字符串。 这是刚才我们所看到的,汇编语言的那段程序。

这个呢,是功能等价的c程序。d等于a乘以b加c。所以c程序看上去是不是比上面两种语言 要简单的多容易理解得多? 相对于刚才所谓的低级语言,这种语言 更有利于人们去理解和书写它, 有利于提高程序开发的效率,所以我们把c语言称作高级语言。 那么在历史上曾经诞生过很多 很多很多门的高级语言。在这呢,有一张图。 这张图呢,列出了,到目前为止,被人们提出过的各种高级程序设计语言 以及它们之间的演化关系。

由于这张图实在是太大了,我没办法在这呈献给大家, 于是呢我在这给了一个链接,大家如果感兴趣的话,可以到这个链接来,去打开这张图去看。 那这么多的高级程序设计语言,我们不可能一一列数了。 那么我们就来看一下,第一门高级程序设计语言。那这门程序设计语言叫什么呢? 叫做FORTRAN, 是在1954到1956年,由IBM的一位非常著名的计算机学家, 叫做John Backus,他领导一个团队创立出来的。

在那个时候啊,人们还不是特别看好,高级程序设计语言。比方说有一个人就觉得john backus所做的事情实在是没有意义。 这个人是谁呢,是大家非常熟悉的,冯诺伊曼。 在john backus在IBM工作的时候, 冯诺伊曼已经是一个非常著名的计算机学家了。 于是呢,IBM就邀请冯诺伊曼去公司担任顾问。 他经常来审查公司的各种的新的研究计划。那么当冯诺伊曼看到 john backus所做的这个研究的时候,看到他们正在搞一个叫fortran语言的时候, 他觉得丝毫没有兴趣。他反而去问john backus说你为什么除了机器语言之外你总想搞点别的呢? 这种东西有用吗?

所以他非常质疑john backus所做的这样一件事情。 其实冯诺伊曼反对高级程序设计语言的这个观点早就被人们所熟知了。 他有一个学生曾经设计了一个编译程序,辅助人们把汇编语言编译成二进制的代码。 那么冯诺伊曼发现这件事情之后,甚至跟这个学生说, 哎呀你把这么宝贵的计算资源拿用来干这个,干这么琐碎的事情, 实在是没有意义。这是冯诺伊曼当时对john bakus的评价。 但是呢,john backus这个人啊, 是一个非常有性格而倔强的人, 他小的时候是一个相当顽劣的人。 那个时候他觉得去上学最有意思的一件事情就是,学校里有那么多的规矩可以去破坏, 他觉得这件事情非常的有意思。

后来它参军进入了医学院。他又觉得医学院所教授的那些东西不鼓励人们去 思考,只是死记硬背,于是呢,很快就退学了。 那么退学以后呢,他又想去搞一些高保真的音响,那个时候还没有高保真的音响, 他想自己去搞,于是呢对电路等等产生了很强的兴趣。 随着他对电路的研究呢,他发现其实 真正有用的东西是数学,于是他又去学习数学。之后呢,非常偶然的一次机会, 那么john backus得到了一个面试机会进入了ibm。 对于这样的一个人来说,他想做的事情你是挡不住的。于是john backus 还是领导他的团队搞出了fortran语言。

那么fortran语言呢在整个计算机发展历史上具有非常非常重要的地位, 他是第一门高级程序设计语言。那么到目前为止, fortran这门语言人们仍然在使用,特别是在数学计算领域。 因为fortran它是特别适合用来做数学计算, 这是1954年前后所发生的事情。那么到了1960年, 有一个非常著名的计算机学家,叫做alan perlis。 他呢,在1960年巴黎的软件专家讨论会上, 发表了一篇著名的报告。叫做算法语言 algol 60报告。 这篇报告宣告了一门新的编程语言的诞生,这就是algol 60。.algol 60呢在计算机程序设计语言的发展史上 具有非常重要的地位,它的诞生具有很大的影响力。

甚至于,后来有的计算机学家, 比方说迪杰斯特拉他就讲过一句话:“algol 60的提出 标志着计算科学的诞生。 通过这个呢我们就可以感受到algol 60在整个计算机科学的发展史上,重要的地位。 那么在这呢,还值得一提的就是这篇报告。 alan perlis的这篇报告写的非常的好。 那么有报道就说,这篇报告的优雅一致和连贯使得alan perlis 立刻确立了他在计算机领域的地位。那么这篇报告呢在英特网上就可以找得着, 大家如果感兴趣的话可以拿这篇报告来观摩一下。 那么正因为algol 60所具有的重要地位和影响力,人们又把它简称为A语言。 那么有了A语言以后呢,1963年剑桥大学又在algol 60的基础上,推出了 一门新的语言,叫做combined programming language, 简称CPL。

但是当时呢他们搞得这个语言太复杂了。后来到1967年的时候有一个非常著名的教授,叫做martin richards。 他呢又对CPL做了一个简化, 提出来了basic CPL。basic CPL呢在当时迅速的引起了人们的关注, 成为当时比较流行第一门程序设计语言。 那么时间再往前发展,到了1970年, 在1970年的时候在贝尔实验室, 又是贝尔实验室。我曾经讲过在计算机的发展史上,贝尔实验室 做出了巨大的贡献。那个时候呢贝尔实验室有一个人,叫做ken thompson, 就是左边的这位老兄了,他呢,ken thompson当时在贝尔实验室工作。 那么在一个项目结束以后,ken thompson有一些时间上的空余。

于是他就想, 我能不能写一个游戏玩一玩,于是呢他就找来了一台机器, 叫做PDP-7,这是一台当时被淘汰的机器。 当时呢已经被淘汰了,闲置那儿不用。于是呢, ken thompson就把这台机器找来,说想要在这台机器上写个游戏玩一玩。 但是他发现这台机器上没有一个合用的机器操作系统,于是呢他就想出来说, 我干嘛不在这台机器上写个新的操作系统呢。写操作系统又发现没有特别合用的语言, 于是,ken thompson就在刚才我们提到的basic BPL的基础上进行进一步的简化, 简化出来一门新的语言叫做B语言. 然后利用这个B语言在那台已经被淘汰的机器上写了一个操作系统。这个操作系统的名字叫做UNIX. UNIX在计算机操作系统的发展史上具有不可撼动的地位。

UNIX是当时,甚至现在,最先进的操作系统之一。那么说到这呢我们不禁要感叹一下, 你看 ken thompson为了玩一个游戏带来了多少的成果啊。 那么接下来有时间的时候我们会再推出一个专题, 就是关于操作系统的。到时候我们就可以讲授一下操作系统的发展历史。那么到了1972年的时候, 贝尔实验室的另一位同事,叫做Dennis Ritchie, 就是右边的这位老兄了, 他呢,发现ken thompson做的事情非常的有意思,于是他也加入进来。 于是呢两个人在ken thompson所开发的这个b语言的基础上, 继续发展和完善, 提出了一门新的语言,后来把它称为C语言。 并且呢,他们用C语言重写了UNIX。 那么用C语言所重新开发的这个UNIX的版本, 成为后来在全世界,具有巨大影响力的操作系统。

那么,成为, 用C语言重新编写的这个UNIX的版本, 成为后来在全世界有巨大影响力的操作系统。 这就是C语言和UNIX的来历。 为了表彰这两位计算机科学家所作出的巨大贡献, 那么在1999年的时候呢,当时的美国总统克林顿授予他们国家技术奖章。 那么在网上有一个关于UNIX的一个简单的介绍,大家可以通过这个网址去访问一下。 在这,我想提示大家一点。你观察到了没? 这两位老兄都留有巨大的胡子。这个在计算机语言的发展历史上是一个特别有意思的现象。 后来人们发现,所有,留有大胡子的人所提出来的程序设计语言, 都会在后来变得特别的流行,这是一个特别有意思的现象。 甚至于呢,后来有一些程序语言的发明者, 为了能够使自己发明的语言更加的流行,也留起了大胡子。

C语言的标准

那么c语言提出之后呢,随着技术的不断发展,曾经衍生过不同的版本。什么叫做版本呢? 作为一门程序设计语言, 为了保证人们写出来的语言都能够满足统一的要求 也同时保证编译器 能够按照统一的标准来进行编译,那人们必须要给程序设计语言 立一个规范,制定一个标准,来说明到底这门语言长成什么样子 那么在C语言的发展历史上就有过不同的版本 比方说,在C语言刚刚提出的时候,在1978年的时候,Ritchie 和另外一个人就写了一本书 叫The C Programming Language。这是一本非常有名的书了。

虽然当时还没有任何一个国际组织出来给 C 语言立一个规范 但是当时这本书却成为 C 语言事实上的一个规范 后来人们把这一版的 C 称为 K & R C。 那么到了1989年的时候有一个标准化组织ANSI


ANSI是美国国家标准学会的简称,就是 America National Standards Institute ANSI 大家可以理解是为专门制定标准的这么一个组织。 在1989年的时候ANCI首先对 C 语言进行了标准化,也就是说,制定了一个标准 它对 K & R C 进行了扩展,增加了一些新的特性 也规定了一套标准的函数库,形成了一个新的标准。 同时呢,另外一个组织是ISO。ISO我相信大家比较熟悉了,就是国际标准化组织 那么前面我们提到的ANSI实际上是国际标准化组织(ISO)的一个成员。国际标准化组织 专门成立了一个工作组,叫做WG14工作组。它呢 来制定国际标准的 C 语言规范。这个小组在ANSI标准的基础上,进行了少量的修改,在1990年的时候通过了第一个关于 C 语言的国际化标准叫做 ISO 9899:1990。

这是第一个国际化的 C 语言标准。 在1989年,人们又对这个标准进行了比较大的修改 推出了一个新的版本,就是ISO 9899:1999。 那么这个版本后来变成特别通行的一个版本,人们把它俗称为 C 99版。 那么目前为止最新的 C 语言国家标准是哪个呢? 是2001年12月8日通过的一个新的版本 叫做ISO IEC 9899:2011 那么目前为止关于 C 语言的国际规范最新的版本就是C11 在这里我给了一个链接,通过这个链接,大家就可以访问到国际标准化组织 关于 C 语言的这个规范。当然,如果你如果要 download 这个规范的话是要付钱的 不过,你可以在 Internet 上找到 free 版本下来观摩一下 那么在这里有一个情况需要特别说明一下。

什么事情呢?在这需要特别说明的是 虽然我们有一个国际标准来定义 C 语言,也就是说, C 语言长成什么样子,这个国际标准应该是清清楚楚定义的 但是,现有的国际标准对 C 语言的定义 却是相当的宽泛。也就是说,定义的方式相当宽泛。 什么叫宽泛,举个例子,比如说关于数据类型,它定义 long型数据 长度不短于 int 型就可以了。 再比如,short 型不长于 int 型就可以了。这会导致一个什么状况呢 举个简单的例子,比方说,对于整型的变量 int 型

int 型是我们写程序里面定义整数变量经常遇到的一种类型。对于int 型的变量,在 Turbo C 里面 Turbo C是一个 C 程序的编译平台。 在这个平台里面,它占多大空间呢?占16个 bit,16位。 然而在VC 里面,我们都知道,一个整型变量却占有32位 没关系,听不明白没关系,你只要知道在不同的开发平台上关于整型变量的定义是不同的 那会导致一个什么结果呢?相同的程序在不同的编译器上运行 可能会有不同的解释 从而造成相同的程序在不同的平台上的 运行结果也有可能是不同的 我们经常会碰到一个作业题,为什么我在这个编译器上编译通过了,在另一个编译器上就编译不通过了呢 就是这个原因,因为 C 语言的规范定义的太宽泛 所以,造成了不同的编译器实际的标准是不同的。

所以呢在不同编译器上编译出来的结果是不同的,在不同平台上运行的结果也是不同的。 当然了,这个情况不会经常发生。 比方说,在我们已知的这几个编译平台上,可能在这几点上存在一些不同。 比方说,刚刚我们讲过的,整型变量的定义。 对于++、- - 这样运算符的解释,还有呢,在输入输出赋值顺序方面也有点不同 再就是,浮点计算精度方面也可能存在一些不同。 有同学可能问了,存在这么多不同,那在写程序的时候很容易 造成在这个平台上通过了在那个平台上就通过不了啊 不是的。首先,我们所使用的这几个平台是非常非常接近的,不太容易出现这样的状况 第二呢,在布置作业或让大家写程序的时候 我们会有意识地避开可能编译上存在不同规范的地方 以避免造成这样的问题。这里特别说明,让大家知道这个事情

下面,我们接着说 C 程序设计语言的发展历史。 有了 C 程序设计语言了, 我们就知道很快也会有 C++了。 在1979年的时候,又是贝尔实验室的一位科学家,叫做Bjarne Stroustrup,简称 BS 他开发了一门语言,被称为 C with Classes。 这门语言就是在 C 语言的基础上,增加了面向对象的特性 于是,后来演变为 C++。 在这门语言成熟以后呢,在1985年的时候,Bjarne博士完成了一部巨著,就是 C++ Programming Language 这也是一本非常非常著名的书。这本著作把 C++语言推向了全世界 与 C 语言相同,人们也为 C++ 语言定义了相应的国际标准 比如说,在1998年的时候ISO颁布了第一份 C++ 的国际标准,叫做 ISO/IEC 14882-1998。

这是第一份关于C++ 的标准 有的同学可能要问,ISO我们知道是国际标准化组织的简称,那IEC是什么呢 IEC是国际电工委员会的简称,就是International Electro Technical Commission IEC也是一个国际标准化的组织,它经常和 ISO 联合发布一些标准 比方说,C++ 的标准就是 ISO 和 IEC 联合发布的 关于C++ 最新的国际标准是2011年9月1日发布的 这个标准的号码是ISO/IEC 14882-2011 也就是,人们经常说的 C++ 2011标准 这是关于 C++的最新标准 那么关于这个标准,我同样是给了一个链接,是国际标准化组织下面的链接 通过这个链接大家可以访问到这个标准。

当然,阅读关于一个程序设计语言的标准是一件非常痛苦的事情 比方说,C++ 这份标准它的正文的长度大约有1180页 加上附录以后,大概有1330多页,所以阅读这样一份标准确实需要很多的时间 OK,这是关于 C 语言和 C++ 语言的发展历史 那么接下来,我们就要明确一个问题了,我们学的到底是 C 语言还是 C++ 语言啊? 虽然在讲课的过程中我们提到过这个问题 但是,我看到有的同学在问,所以,我们在这里再做一个回答 C 语言和 C++ 语言有一个这样的关系,也就是说,C 语言可以看做是 C++ 语言的一个部分 当然,就它的发展历史而言也确实是这样的。C++ 语言是在原有 C 语言的基础上扩展起来的 但是值得注意的是,C++ 语言规范和 C 语言规范是两个不同的规范


它们之间是互相独立的。也就是说,准确的说法应该是 C++ 语言支持了 C 语言所有的特性,应该这样说 为了便于大家理解,我们就可以告诉他,我们要学习的是在 C++ 语言的环境中,学习 C++ 语言中C语言的部分。这就是我们的学习目标。 OK

C语言的构成


那在明确了我们的学习目标之后啊,接下来我们就要讨论 一个很重要的问题,那就是到底应该如何学习一门编程语言呢 那有的同学会说了,这个问题不是 讨论过了吗?啊,为什么现在又要来讨论呢,我在这儿做一个特别的说明,这儿我们所说的 如何学习一门编程语言,指的是如何学习一门编程语言的语法知识

语法知识,而且呢,我们需要做一个特别的说明,就是说 我们底下所给出来的这个建议,不仅适用于C语言, 啊,也同样适用于其他高级程序设计语言 我们应该按照一个什么样的思路去学习呢? 那我们当然就要看一下,在编程语言里头,到底有哪些东西 在中国的计算机界,有这样一本书,叫做,计算机科学技术百科全书 那这本书呢,在中国的计算机科学技术领域 是具有一定的权威性的,那在这本书里面 关于程序设计语言的构成,就有一段这样的描述 这个描述是这样来说的,语言的种类啊,千差万别 但是,一般说来,基本的成分,不外四种,哪四种呢?

第一种,数据成分 第二种,运算成分,第三种,控制成分,第四种,传输成分 啊,这个话,我觉得,讲的非常的精辟,这就告诉我们 你如果,想要学习一门编程语言的话 那么,你就应该学习它的这四个部分,当你熟悉了 一门编程语言的这四个部分之后,你对这一门编程语言也就有一 个比较全面的了解了,那通过这个定义,我们同样可以明白 这样一件事情,也就是说啊, 如果你想学习一门高级程序设计语言,你关注这四个部分就可以了 啊,你比方说,让我现在去学一门新的程序设计语言,我就会主动的从这 四个方面来了解这一门编程语言 哪四个方面呢?在数据成分,我会关注到底有哪些数据类型啊 这些数据类型是如何被使用的啊,它是怎么去定义的呀, 在使用过程中,应该遵守一些什么样的规则呀?

这是第一个方面。第二个方面,在运算方面,我到底有哪一些运算符号,是我可以使用的啊 这些符号应该怎样去使用啊,这是运算方面 控制成分,控制成分我很清楚,因为我们讲过,所有的控制成分不外乎三种,顺序,分支,循环 那我就会关注,对于这一门程序设计语言而言 这三种类型的控制语句,到底是如何写的呀 它们到底按什么格式去写的啊?应该怎么去使用啊 第四个部分,关于传输成分,也就是说,我想知道,在这一门 语言里头啊,在程序中,是如何输入和输出数据的 啊,也就是说,如果让我来学习一门语言的话 那我就会从这四个方面去 寻找这些答案,

在这呢,我特别想跟大家推荐啊,这种方法,如果我们学习一门 编程语言,我们就可以从这四个方面去了解这个程序设计语言 就OK了,了解了这四个部分之后,你对这个程序设计语言就已经有一个相对比较 全面的认识了,那么好,接下来呢,就让我们开 始从C程序设计语言的这四个方面来理性的 认识一下C程序设计语言,接下来,我们要进入理性认识 C程序阶段的这个学习了,好,那么今天的课呢 就到这,那么我们还会在编程作业部分,给大家 布置相应的程序抄写题和练习题

编程作业: 理性认识C程序 导论 抄写题
抄写题#1:细菌实验分组
来源: POJ (Coursera声明:在POJ上完成的习题将不会计入Coursera的最后成绩。)

注意: 总时间限制: 1000ms 内存限制: 65536kB

描述
有一种细菌分为A、B两个亚种,它们的外在特征几乎完全相同,仅仅在繁殖能力上有显著差别,A亚种繁殖能力非常强,B亚种的繁殖能力很弱。在一次为时一个小时的细菌繁殖实验中,实验员由于疏忽把细菌培养皿搞乱了,请你编写一个程序,根据实验结果,把两个亚种的培养皿重新分成两组。

细菌繁殖能力(繁殖率)的量化标准为一个小时内细菌数量增长的比例(繁殖率 = 一小时后细菌数量 / 原本细菌数量)。

两个亚种繁殖能力差异很大,这意味着对于任意两个同种细菌培养皿的繁殖率的测量值之间的差异要小于任意两个异种细菌培养皿繁殖率的测量值之间的差异。即:

输入
输入有多行,第一行为整数n(n≤100),表示有n个培养皿。

其余n行,每行有三个整数,分别代表培养皿编号,试验前细菌数量,试验后细菌数量。假设试验没有误差。

输出
输出有多行:

第一行输出A亚种培养皿的数量,其后每行输出A亚种培养皿的编号,按繁殖率升序排列。

然后一行输出B亚种培养皿的数量,其后每行输出B亚种培养皿的编号,也按繁殖率升序排列。

样例输入

51 10 34562 10 56443 10 45664 20 2345 20 232

样例输出

3132254

提示
亚种内部,细菌繁殖能力差异远远小于亚种之间细菌繁殖能力的差异。

也就是说,亚种间任何两组细菌的繁殖率之差都比亚种内部两组细菌的繁殖率之差大。

请完全按照如下的程序书写代码,并在书写的过程中体会优秀的代码风格:

#include <iostream>using namespace std;int main() { int n; // n为细菌的数量 // id记录细菌的编号, rate记录细菌的繁殖率,第i个细菌对应id[i]和rate[i] int id[100]; double rate[100]; cin >> n; for (int i = 0; i < n; i++) { int initial, final; cin >> id[i] >> initial >> final; rate[i] = (double)final / initial; } // 对整个细菌排序 for (int i = 0; i < n; i++) { for (int j = 0; j < n - i - 1; j++) { if (rate[j + 1] > rate[j]) { int tmpId = id[j]; id[j] = id[j + 1]; id[j + 1] = tmpId; double tmpRate = rate[j]; rate[j] = rate[j + 1]; rate[j + 1] = tmpRate; } } } // 记录最大的差 double maxDiff = 0; // 和最大差的下标 int maxDiffIndex = 0; for (int i = 0; i < n - 1; i++) { double diff = rate[i] - rate[i + 1]; if (maxDiff < diff) { maxDiff = diff; maxDiffIndex = i; } } //输出繁殖率较大的那组细菌 cout << maxDiffIndex + 1 << endl; for (int i = maxDiffIndex; i >= 0; i--) { cout << id[i] << endl; } //输出繁殖率较小的那组细菌 cout << n - maxDiffIndex - 1 << endl; for (int i = n - 1; i >= maxDiffIndex + 1; i--) { cout << id[i] << endl; } return 0;}

编程作业: 理性认识C程序 导论 编程题
编程题#1:苹果和虫子
来源: POJ (Coursera声明:在POJ上完成的习题将不会计入Coursera的最后成绩。)

注意: 总时间限制: 1000ms 内存限制: 65536kB

描述
你买了一箱n个苹果,很不幸的是买完时箱子里混进了一条虫子。虫子每x小时能吃掉一个苹果,假设虫子在吃完一个苹果之前不会吃另一个,那么经过y小时你还有多少个完整的苹果?

输入
输入仅一行,包括n,x和y(均为整数)。

输出
输出也仅一行,剩下的苹果个数

样例输入

第一组10 4 9第二组10 4 36第三组10 4 100

样例输出

第一组7第二组1第三组0

提示
注意:是要求完整的苹果数。

编程题#2:大象喝水
来源: POJ (Coursera声明:在POJ上完成的习题将不会计入Coursera的最后成绩。)

注意: 总时间限制: 1000ms 内存限制: 65536kB

描述
一只大象口渴了,要喝20升水才能解渴,但现在只有一个深h厘米,底面半径为r厘米的小圆桶(h和r都是整数)。问大象至少要喝多少桶水才会解渴。

输入
输入有一行:包行两个整数,以一个空格分开,分别表示小圆桶的深h和底面半径r,单位都是厘米。

输出
输出一行,包含一个整数,表示大象至少要喝水的桶数。

样例输入

第一组23 11第二组1 1

样例输出

第一组3第二组6367

提示
如果一个圆桶的深为h厘米,底面半径为r厘米,那么它最多能装Pi * r * r * h立方厘米的水。(设Pi=3.14159)

1升 = 1000毫升

1毫升 = 1 立方厘米

来源
计算概论化学学院期末考试

编程题#3:最高的分数

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多