- 1、本文档共97页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
[IT认证]北大裘宗燕《从问题到程序》第五章C程序结构
第五章C程序结构 求弦线与坐标轴交点的公式: 这里牵涉到许多问题:函数原型,不同函数的同名局部参数,局部自动变量初始化,程序的函数分解等。 写程序时考虑定义几个函数: 被求根数学函数是独立实体。给出原型说明。 求数学函数两端点的弦线是独立工作,定义crossp,以端点坐标为参数算弦线与坐标轴的交点。 求根计算定义为独立函数,可用在任何程序里,只要有被求根函数,以端点作为参数调用。 #include stdio.h #include math.h double f (double x) {/* 例子,根据需要定义 */ return x * sin(x) - 2 * x * x; } double crossp (double x1, double x2) { double y1 = f(x1), y2 = f(x2); return (x1*y2 - x2*y1) / (y2 - y1); } double root (double x1, double x2) { double x, y, y1 = f(x1); do { x = crossp(x1, x2); y = f(x); if (y * y1 0) { /* y与y1同符号,新区间[x,x2] */ x1 = x; y1 = y; } else x2 = x; /*异号,新区间[x1,x]*/ } while (fabs(y) = 1E-6); /* 继续 */ return x; } int main () { /* 定义从略 */ } 5.5 预处理 C程序加工分为三步:预处理,编译,连接。 预处理程序是C系统的一部分,处理源程序的预处理命令行,产生修改后的源程序。 提供预处理命令是为了编程方便。 第一个非空白字符是 # 的行就是预处理命令行。 文件包含命令 把指定文件内容包含到当前源文件 #include 文件名 形式1 #include 文件名 形式2 形式1用于包含系统头文件,预处理程序到指定目录找文件(通常指定几个系统文件目录)。 形式2用于包含自己的文件。预处理程序先在源文件所在的目录里找,找不到时再到指定目录中去找。 函数是独立的逻辑实体。定义后可以调用执行。由此形成对函数的两种观察方式: 1)从函数外(以函数使用者的角度)看函数; 2)在函数内(以函数定义者的角度)看函数。 计划函数时,要同时从两个观点看:需要什么函数/参数/返回值?分析确定函数头部,定好公共规范。 写函数定义时应站在内部观点思考/解决问题; 使用函数时应站在外部立场上思考/解决问题。 功能描述清楚,接口定义好以后,函数定义和使用可由不同人做。要求双方遵循共同规范,对函数功能有一致理解。自己写函数时也要保证两种观点的一致性。 函数定义 解决实现函数的算法问题和语言问题。关注函数调用时应该做什么,如何描述有关的计算过程。 参数是局部变量,调用时用对应实际参数赋初值,然后开始执行函数体。参数像其他局部变量一样可以赋值。 return语句的执行导致函数结束。 return语句的两种形式: return; return 表达式; 函数体里可有多个return语句。在带不带表达式/所带表达式的类型方面必须与函数头部一致。 执行到函数体末端时函数结束(无返回值的函数)。 函数调用 调用函数时必须提供数目正确/类型合适的实参。调用无参函数时也需要写圆括号。 无返回值函数用在独立的函数调用语句里: pc_area(x + 3); 有返回值的函数通常用在表达式里。返回值也可不用。 例:printf返回int。工作正常时返回实际输出的字符数,出错时返回负值。前面例子都没用。 值传递与赋值和初始化类似,可能出现转换。要求实参值可转换到形参类型,否则是类型错。 语言没有规定调用时的实参求值顺序,对求值顺序敏感的函数调用是错误(与二元运算类似)。例: n = ...; m = gcd(n += 15, n); 另一错误调用: printf(%d, %d, n++, n); C函数的参数是值参数。函数调用时先计算实参表达式的值,把值复制给对应形参,而后执行函数体。函数内对形参的操作与实参无关。这种参数意义清晰。 函数原型 命名对象(变量/函数等)有一个定义点,以及可能多个使用点。基本规则是先定义后使用。 保证正确编译的基本原则:从每个对象的每个使用点向前看,能得到使用该对象的完备信息。 局部变量:变量定义在语句前,保证了先定义后使用。后面变量定义可引用前面已经定义的变量。 函数:使用点所需信息就是函数的类型特征,包括函数名/参数个数和类型/返回值类型
文档评论(0)