《现代设计方法及其应用》
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
编译出错 编译不出错 图 3 没有进行函数声明的两段代码
(10) 格式化的输出 printf printf()和 scanf()函数使我们能够与程序通信,它们被称为输入输出函数,或 者被称为 I/O 函数。printf()是输出函数,scanf()是输入函数,它们都包含在头文 件 stdio.h 中。本课程的程序只需用到 printf()函数,因此只对 printf()进行介绍。 printf()的使用格式如下: printf(control-string,item1,item2,....); 这里的 item1,item2 等等都是要打印的项目,它们可以是变量,也可以是常 量, 甚至可以是在打印之前的表达式。 控制字符串(control-string)是一个描述项目 如何打印的字符串,控制字符串应该为每个要打印的项目包含一个转换说明符。 来看一下 我们程序中的例子,第一个 printf()如下: 在双引号之间的部分就是控制字符串,可以看到这句代码只包含控制字符 串,没有需要打印的 item1、item2 等。因此它在执行的时候就只打印双引号里面 的这一句话,当然其中的非打印字符不会再屏幕上显示出来,而是转换成相应的 结果。双引号中的非打印字符就是\n,这代表了换行。因此执行完之后屏幕上显 示的就是
例:用二分法求一元三次方程 x3 x 1 0 在区间 [1.0,1.5] 内的一个实根。
பைடு நூலகம்
图 2 例程代码
(1) #include <stdio.h> #include 指示和头文件,该行告诉编译器包含文件 stdio.h 中的全部信息。该 语句的作用相当于在这一行粘贴了文件 stdio.h 中的全部代码。文件 stdio.h 是所 有 C 语言编译包的一个标准部分,它包含了有关输入输出函数的信息。(如格式 化输入函数 scanf 和格式化输出函数 printf) (2) int main() 这行代码声明了一个 main 函数,C 程序中可以包含一个或多个函数,但其 中必须有且仅有一个 main 函数。一个 C 程序总是从被称为 main 的函数开始执 行,这个函数是 C 程序的基本模块。int 表明该函数的返回值为整型。main 后面 的()中为空表明该函数不接受任何参数,也就是形参为空。另外 main 函数还有 一种写法 int main(int argc, char *argv[]),这种情况下 main 函数就接受两个参数。 因为 main 函数的返回值为 int 型,因此在函数执行完毕要加上一句 return 0。 (3) double min=1.0,max=1.5; double middle=(max+min)*0.5; int num=1; 这三行代码定义了四个变量并对它们进行了初始化:三个 double 型的变量 min、max 和 middle;一个 int 型的变量 num。C 语言的基本内置数据类型有 int、 long、float、double、short、char、bool 等,关于这些数据类型的具体介绍可参考 C 语言的相关资料。 注意以下区别: int num;//声明语句,声明一个名为 num 的 int 类型的变量 num=1;//将这个变量赋值为 1 并将其值初始化为 1(复制初始化) int num=1;//定义一个 int 型的名为 num 的变量, int num(1);//直接初始化 声明不分配内存,定义分配内存。初始化不是赋值,初始化是创建变量并给 它赋初始值。赋值是擦除对象的当前值并用新值代替。内置类型的成员初始值依 赖于对象的作用域:在局部作用域中这些成员不被初始化,在全局作用域中它们 被初始化为 0。 (4) {...} 花括号划定了函数以及控制语句的界限, 用来表示函数体或者控制语句的开 始与结束。 (5) while(fabs(max-min)>0.00001) while 语句是 C 语言的循环控制语句,跟在 while 后面括号中的部分为判断 表达式。当括号中的判断表达式产生一个非零的结果时,就会执行 while 之后花 括号内的部分。然后再次判断括号中的表达式,如果非零就继续循环,如果为零 则跳出循环。对 while 循环至关重要的一点是:当构建一个 while 循环时,循环 中必须包含能改变判断表达式的值来使表达式的值变为零, 否则循环永远不会终 止。 除了 while 以外,C 语言的循环控制语句还有 for 语句和 do...while 语句。具 体用法参考 C 语言的相关资料,至于选择哪种循环要根据实际要编写的程序而 定,当然有些也是个人爱好的问题。 另外要说明一点 while 语句的循环体部分如果只有一条语句,可以不用加花
double 型的值。本课程所编写的函数都非常简单,关于函数其他的内容可以参考 C 语言资料。 这里需要注意的是这个函数分为两部分代码:在 main 函数前面有一条语句 double getFuncValue(double x); 这条语句是该函数原型的声明,下面的语句 double getFuncValue(double x) { return pow(x,3)-x-1; } 是函数的定义。先声明再定义这是一种规范的写法。还有一种写法可能不会导致 出现编译错误,那就是没有对函数进行声明,只有函数的定义。这是一种不规范 的写法,在某些情况下并不会出现错误。我们来看图 3 所示的两段代码,这两段 代码中的函数 getFuncValue 都是直接定义而没有声明。 左侧函数的定义放在 main 函数的后面,因为 main 函数中有函数的调用语句,而 C 语言是自上而下的运行 机制,在调用函数时该函数还没有定义,因此就会出现编译错误。而右侧函数的 定义放在 main 函数前面,在调用函数的语句出现之前就已经定义了,因此不会 出现编译错误。规范的写法就像本例中所示,先在文件头部进行函数声明,这样 就告诉编译器这个函数已经存在了, 至于函数的定义就可以放在文件的任意位置 了。
int a; int b=1; a=b++; 上面两段程序执行结果是不一样的,第一段程序执行完毕后 a=2,b=2;第二段 程序执行完毕后 a=1,b=2。这是因为++运算符如果放在变量 b 的前面,表示先 将 b 的值++,然后再将 b 的值赋值给变量 a。而++放在 b 的后面,则表示先将 b 的值赋值给变量 a,然后将 b 的值++。 3) 不要混淆赋值运算符=和相等符号==。例如对于循环 while(i==10),意思是只 要变量 i==10 ,就会执行循环中的语句,直到 i!=10 为止。而如果错写成了 while(i=10), 那么这个循环就会一直执行下去, 因为表达式 i=10 就是个赋值语句, 它的结果是真,因此循环不会退出。这样的错误是逻辑错误,不是语法错误,因 此编译器不能找出。为了避免这种错误,可以把 i==10 写成 10==i,对于这里也
用于《现代设计方法及其应用》课程的 C 程序设计语言基础
1. C 语言的起源 1972 年,贝尔实验室的 Dennis Ritchie 开发了 C 语言,经过 40 多年的发展, C 已经成为最重要和最流行的编程语言之一。
图 1 TIOBE 2016 年 2 月编程语言排行榜
2. 使用 C 语言的理由 (1) C 语言的设计特性使得用户可以自然地采用自顶向下的规划, 结构化的编程, 以及模块化的设计。这种做法使得编写出的程序更可靠、更易懂。 (2) C 是一种高效的语言。 (3) C 是一种可移植的语言,在一个系统上编写的 C 程序经过很少改动或者不修 改就可以在其他系统上运行。 (4) 强大的功能和灵活性。UNIX 操作系统就是用 C 编写的,其他很多语言如 FORTRAN、Perl、Python、Pascal 和 BASIC 等的许多编译器和解释器都是用 C 编写的。 (5) 面向编程人员的需要,给予编程人员很大自由。 3. C 语言实例说明 我们来看一个简单的 C 程序, 并通过对这个程序的解析来讲解本门课程所用 到的 C 语言的最基本的语法。
就是 while(10==i)。这样一旦少写了一个等号变成了 while(10=i),编译器就会报 错。因为赋值运算符的左端必须是个可修改的左值,而 10 是一个常数,自然不 能修改,因此编译器会报错,有助于检查错误。 (8) 数学函数 本例中的 while(fabs(max-min)>0.00001)和 return pow(x,3)-x-1;两句用到了两 个数学函数 fabs 和 pow。这两个函数都包含在头文件 math.h 中。函数 fabs 的原 型是 double fabs(double x),作用是返回 x 的绝对值,另外还有一个绝对值函数是 int abs(int x),这个函数适用于整数求绝对值。如果在本例中使用 abs,就会把小 数点后面的部分去掉了,结果就不对了。函数 pow 的原型是 double pow(double x,double y),作用是返回 x 的 y 次幂。另外还有很多常用的函数如各种三角函数 反三角函数 sin、cos、tan、asin、acos、atan(注意三角函数的角度都是弧度制的) 以及指数函数 exp、平方根函数 sqrt 等。需要的时候可以去查相关资料。 (9) double getFuncValue(double x); 函数是用于完成特定任务的程序代码的自包含单元。像上面讲的数学函数 fabs 等都是 C 语言标准为我们定义好的,我们只需要在需要的时候调用就可以 了,不需要去了解函数的实现过程也不需要编写函数体。而此处的这个 double getFuncValue(double x) 是 我 们 自 己 编 写 的 , 其 作 用 就 是 返 回 表 达 式 f ( x) x 3 x 1 的值。从该函数需要实现的功能可知需要接受一个参数 x ,然后 通过计算返回一个值 f ( x) ,因此该函数有一个 double 型的形参 x,返回一个
括号,例如 while(1) printf("Hello World!\n"); 但是如果循环体内有多条语句,就必须要放在花括号中。 (6) if(getFuncValue(min)*getFuncValue(middle)<0) max=middle; else min=middle; if 语句是 C 语言的分支控制语句,如果 if 后面的括号中的判断表达式为非 零结果,就会执行 if 后面花括号中的语句。与 while 语句类似,如果只有一条语 句,可以不用加花括号,像本例程序所示。但是如果需要执行多条语句就一定要 放在花括号里面。简单形式的 if 语句使我们可以选择执行一条语句或者忽略它。 C 还可以通过使用 if...else 形式来在两个语句间做出选择。另外还有多重选择 if...else if...语句,以及多重选择语句 switch(break)语句,具体的用法也请参考相 关的 C 语言资料。 此外 C 语言中还有一个跳转语句 goto 语句,不过原则上 C 程序根本不需要 使用 goto 语句。goto 语句使跟踪程序控制流程变得很困难,并且使程序难以理 解,也难以修改。所有使用 goto 的程序都可以改写为不用 goto 语句,因此没有 必要使用 goto 语句。 (7) 运算符 C 使用运算符来代表算术运算。主要有:赋值运算符=,加法运算符+,减法 运算符 ,乘法运算符 ,除法运算符/,取模运算符%(求余数的运算符,只能用 于整数运算), 增量运算符++和减量运算符 。 另外还有关系操作符和逻辑操作 , 符:小于<、大于>,相等==,不相等!=,小于等于<=,大于等于>=,逻辑非! 逻辑与&&,逻辑或||。 注意事项: 1) 运算符的优先级()括号最高,++、 次之,*/%再次之,+ 最低。 2) 增量运算符++和 放在变量的前面或者后面是不一样的,举下例说明 int a; int b=1; a=++b;