
发表日期: 2021-04-13 09:22:00 浏览次数:115
邢台企业微信公众号小程序开发公司、邢台企业网页设计方案、邢台做网站开发价格、邢台微信公众号制作运营报价明细表、邢台网站设计公司费用、邢台网站推广大概需要多少钱
邢台,简称“邢”,古称邢州、顺德府,是河北省地级市,河北省政府批复确定的京津冀城市群节点城市、河北省级历史文化名城、冀中南先进制造业基地和物流枢纽 [1] 。截至2020年,全市下辖4个区、12个县、代管2个县级市。 [2] 总面积12400平方千米,市区建成区面积214.84平方千米,常住人口739.52万人,城镇人口401.04万人,城镇化率54.23%。 [3-5]
邢台地处中国华北地区、河北南部,境内京广、京九铁路,京广、京九高铁,京港澳、大广、太行山高速纵贯南北;邢和、邢黄铁路,邢衡、邢汾、邢临、青银高速横贯东西,与邢台国际内陆港、邢台机场构成了“东出西联、南承北接”的交通枢纽。 [6]
邢台拥有3500余年建城史,距今五万至十万年前就有人类栖息繁衍,历史上曾四次建国、五次定都,有“五朝古都、十朝雄郡”之称,是华夏版图上建城历史排名第三的城市 [7] ,华北历史上第一座城市,中国最早的古都之一,历经三千多年行政建制未曾中断、城址未曾迁移。邢台古城是黄河以北地区建城最早的“第一古城”,被誉为“燕赵第一城”。 [8]
邢台悠久的历史涌现出郭守敬、李牧、宋璟、刘秉忠等先贤,走出了郭威、柴荣、孟知祥、孟昶等帝王,千古一帝秦始皇东巡途中驾崩于邢台沙丘 [9-10] 。 邢台也是唐朝皇室祖籍地(唐祖陵) [11-14] ,发生过尧舜禅让、胡服骑射、巨鹿之战、黄巾起义等影响中国历史进程的事件,有破釜沉舟、鹿死谁手、民脂民膏、腹背受敌等近百条成语、典故源自邢台。
在3.6节中,我们简略地描述了一些规则,它们用程序结构各部分的运行时间来定义整个程序结构的运行时间。例如,我们说过for循环的运行时间大致等于循环体所花的时间乘以迭代的次数。隐藏在这些规则背后的概念是,程序是使用归纳规则构成的,复合语句(循环、选择和其他由子语句组成的语句)通过这些规则由诸如赋值、读、写和跳转语句这样的简单语句组成。这些归纳规则涵盖循环的形成、选择语句及程序块等一系列复合语句。
我们要将一些构建C语言语句的句法规则表述为递归定义。这些规则符合经常出现在C语言教材中的那些定义C语言的语法规则。我们在第11章中还将看到,语法可以用作简洁递归表示法,来指明编程语言句法(syntax)。
更具防御性的程序设计
如果大家只是因为相信示例3.18中的数组
A总会存在元素x,就认为它总会存在,那就太天真了。请注意,如果数组中不存在x,图3-10中的循环将最终会出错,因为它要试着访问一个超过数组上限的数组元素。好在有一种简单的方法可以避免这一错误,而且不会给循环的每次迭代增加很多时间。我们允许数组末尾有第n+1个单元,而在开始循环前,将x 放在该单元中。那么确实能确定x 会出现在数组中的某个位置。当循环结束后,我们会测试是否有i=n。如果是,那么x 并非真正在数组中,我们会穿过数组到达作为哨兵(sentinel)的x 的副本。如果i<n,那么i 就表示x 出现的位置。带有这种保护功能的程序如下所示。
A[n] = x;i = 0;while (x != A[i]) i++;if (i == n) /* do something appropriate to the case that x is not in the array */else /* do something appropriate to the case that x is found at position i */复制代码
依据。
C语言中的简单语句如下。
1. 表达式。包括赋值语句以及读和写语句,后者是对printf和scanf等函数的调用;
2. 跳转语句。包含goto、break、continue和return;
3. 空语句。
请注意,在C语言中,简单语句都是以分号结尾的,我们要将分号视为这些语句的一部分。
归纳。
以下规则让我们可以用较小的语句来构建语句。
1. while语句。如果S是语句,而C 是条件(带有算术值的表达式),那么
while (C )S
是语句。只要C 为真(具有非0的值),循环体S 就会执行。
2. do-while语句。如果S 是语句,而C 是条件,那么
do S while(C )
是语句。do-while循环和while循环类似,只不过do-while循环的循环体S至少会执行一次。
3. for语句。如果S 是语句,而E1、E2和E3是表达式,那么
for (E1; E2; E3) S
是语句。第一个表达式E1会进行一次评估,并指定循环体S 的初始化。第二个表达式E2是对循环终止的测试,会在每次迭代前进行评估。如果它的值不为0,那么循环体就会执行,否则该for循环就将终止。第三个表达式E3会在每次迭代后进行评估,并为循环的下一次迭代指定重初始化(递增)。例如,如下常见的for循环
for (i = 0; i < n; i++) S
其中S会迭代n 次,对应i 的值分别为1、2、3、…、n-1。在这里,i = 0是初始化,i < n 是终止测试,i++是重初始化。
4. 选择语句。如果S1和S2是语句,而C 是条件,那么
if ( C ) S1 else S2
是语句,而且
if ( C ) S1
也是语句。在第一种情况中,如果C为真(非0),就执行S1,否则就执行S2。在第二种情况中,只有当C 为真,才执行S1。
5. 程序块。如果S1、S1、…、Sn都是语句,那么
{S1 S2…Sn}
也是语句。
我们在上面没有列出开关语句,它形式复杂,但在分析运行时间时可以被当作嵌套的选择语句。
利用上述对语句的递归定义,就可以通过分辨程序的组成部分来解析程序。也就是说,首先有简单的语句,再进一步将这些简单的语句组成更大的复合语句。
考虑图3-11所示的选择排序程序段。作为根据,第(2)行、(5)行、(6)行、(7)行和第(8)行的每次赋值都各为一条语句;而第(4)行和第(5)行组成了选择语句;第(3)行至第(5)行又组成了for语句;然后第(2)行至第(8)行组成了一个程序块;最后,整个程序段也是for语句。
(1) for (i = 0; i < n-1; i++) {(2) small = i;(3) for (j = i+1; j < n; j++)(4) if (A[j] < A[small])(5) small = j;(6) temp = A[small];(7) A[small] = A[i];(8) A[i] = temp;
}复制代码图 3-11 选择排序程序段
我们可以用如图3-12所示的树表示程序的结构。树叶(那些圆圈)是简单语句,而其他的节点则表示复合语句。6节点会被标记上它们所表示结构的种类,以及构成该节点所表示简单语句或复合语句的代码行。从每个表示复合语句的节点N 都会向下引出到达其“子节点”的连线。节点N 的子节点表示构成N 所表示复合语句的那些子语句。这样的树就称为程序的结构树。
6我们将在第5章中详细讨论树。

图 3-12 表示语句组合的树
图3-12是图3-11所示程序的结构树。每个圆圈分别是表示图3-11中5条赋值语句的树叶。我们在图3-12中没有说明这5条语句是赋值语句。
在树的顶端(也就是“根”)是表示第(1)至第(8)行整个程序段的节点。for循环的循环体是由第(2)行至第(8)行组成的程序块。7该程序块是用根节点下方的节点表示的。而这个表示程序块的节点又有5个子节点,分别表示该程序块的5条语句。其中第(2)、(6)、(7)和第(8)行这4条是赋值语句,而第5条是第(3)行至第(5)行的for循环。
7更为详细的结构树还有表示for循环初始化表达式、终止测试表达式和重初始化表达式的子节点。
第(3)行至第(5)行表示for循环的节点又有表示其循环体(就是第(4)行和第(5)行的if语句)的子节点。而表示第(4)行和第(5)行if语句的节点又具有表示其组成语句(第(5)行的赋值语句)的子节点。
正如递归构建的程序结构那样,我们可以使用类似的递归方法来定义程序运行时间的大O上界。就像在3.6节中那样,我们假定在下列几类表达式中都不存在函数调用。(1)构成赋值语句、打印语句、选择语句条件的表达式;(2)构成while循环、for循环和do-while循环条件的表达式;(3)for循环初始化或重初始化的表达式。唯一的例外是对诸如printf这样的读函数或写函数的调用。
依据。简单语句(也就是赋值、读、写或跳转语句)的边界是O(1)。
归纳。对于我们已经讨论过的5种复合结构,计算其运行时间的规则如下。
1. while语句。设O(f(n))是while语句循环体的运行时间上界,f (n)是通过递归地应用这些规则得到的。再假设g(n)是循环次数的上界。那么O(1+(f (n)+1)g(n))就是整个while循环的运行时间上界,其中O(f (n)+1)是循环体加上循环体后测试的运行时间上界。开头那个多出来的1表示循环开始前的第一次测试。在f (n)和g(n)都至少为1(或者如果不定义其值为1,则其值为0,我们就可以定义它们为1)的平常情况下,可以将该while循环的运行时间记为O(f (n)g(n))。这一运行时间的通用公式如图3-13a所示。
2. do-while语句。如果O(f (n))是循环体运行时间的上界,且g(n)是循环次数的上界,那么O((f (n)+1)g(n))就是该do-while循环的运行时间上界。这里“+1”表示的是循环每次迭代之末计算和测试循环条件的时间。请注意,对do-while循环来说,g(n)总是至少为1。在对所有n 都有f (n)≥1的情况中,do-while循环的运行时间为O(f (n)g(n))。图3-13b表示了计算普通情况下的do-while循环运行时间的方法。
3. for语句。如果O(f (n))是循环体运行时间的上界,且g(n)是循环次数的上界,那么for语句运行时间的上界就是O((1+f (n)+1)g(n))。因子f (n)+1表示每进行一次循环所花的时间。开头的“1+”表示第一次初始化,以及第一次测试为负从而导致循环体不执行这种可能。在f (n)和g(n)都至少为1,或者可重新定义为至少是1的一般情况下,for语句的运行时间是O(f (n)g(n)),如图3-13c所示。

图 3-13 计算不含函数调用的循环语句的运行时间

邢台企业微信公众号小程序开发公司、邢台企业网页设计方案、邢台做网站开发价格、邢台微信公众号制作运营报价明细表、邢台网站设计公司费用、邢台网站推广大概需要多少钱
服务热线
顶部
备案号: 苏ICP备11067224号
CopyRight © 2011 书生商友信息科技 All Right Reserved
24小时服务热线:400-111-6878 E-MAIL:1120768800@qq.com QQ:1120768800
网址: http://www.768800.com 网站建设:上往建站
关键词: 网站建设| 域名邮箱| 服务器空间| 网站推广| 上往建站| 网站制作| 网站设计| 域名注册| 网络营销| 网站维护|
企业邮箱| 虚拟主机| 网络建站| 网站服务| 网页设计| 网店美工设计| 网站定制| 企业建站| 网站设计制作| 网页制作公司|
400电话办理| 书生商友软件| 葬花网| 调温纤维| 海洋馆运营维护| 北京保安公司| 殡仪馆服务| 殡葬服务| 苏州殡葬一条龙| 朝阳殡葬| 苏州殡葬服务|
欢迎您免费咨询,请填写以下信息,我们收到后会尽快与您联系
服务热线:400-111-6878