第三章 C程序设计初步 3.1 结构化程序设计思想 3.2 C语句概述 3.3 赋值语句 3.4 文件包含 3.5 流和文件初步 3.1 结构化程序设计思想 3.2 C语句概述 3.3 赋值语句 3.4 文件包含 3.5 流和文件初步 3.6 数据输出 3.7 数据输入 3.8 程序举例
3.1 结构化程序设计思想 3.1.1 程序的质量标准 一个好的程序在满足运行结果正确的基本条件之后,首先要有良好的结构,使程序清晰易懂。在此前提之下,才考虑使其运行速度尽可能的快, 运行时所占内存应尽量压缩至合理的范围。也就是说,现在的程序质量标准易读性好是第一位的,其次才是效率。因为从根本上说,只有程序具有了良好的结构,才易于设计和维护,减少软件成本,从整体来说才是真正提高了效率。
3.1.2 结构化程序设计方法 (1) 一个大的程序开发应当采取“自顶向下, 逐步细化, 模块化”的方法。 (2) 任何程序均由具有良好特性的三种基本模块(顺序, 分支,循环)“堆积”搭成,即由基本小单元顺序组成一个大结构,从而避免了使用goto语句的缺点。
3.1.3 结构化程序的标准 (1) 程序符合“清晰第一,效率第二”的质量标准。 (2) 具有良好的特性。 ① 只有一个入口。 ② 只有一个出口(有些分支结构很容易写成多个出口)。 ③ 无死语句(永远执行不到的语句). ④ 没有死循环(永远执行不完的无终止的循环)。
3.1.4 三种基本模块 1. 顺序结构 图 3.1 顺序结构
2. 分支结构 图 3.2 分支结构
3. 循环结构 图 3.3 当型循环结构
图 3.4 直到型循环结构
3.2 C 语 句 概 述 C语言是函数式语言,每一个函数是由数据说明部分和执行语句部分组成。C语言中的所有语句均是执行语句,没有非执行语句。根据C语言的句法, 语句可分为单个语句,复合语句和空语句。根据结构化程序设计的三个模块大致可分为: 用于顺序结构中的表达式语句、赋值语句、函数调用语句等; 用于分支结构中的if语句、switch语句、转移语句、标号语句等;用于循环结构中的while语句、for语句、do-while语句。 另外在后两种结构中还可出现break语句、continue语句、复合语句和空语句等作为其中的一部分。
(1) 逻辑上每个语句最后都必须有一个分号(;), 一个语句可分写成几行, 几个语句也可合写成一行(但不提倡, 因其不利于单步调试)。 (2) 空语句直接由分号(;)组成,常用于控制语句中必须出现语句之处,它不做任何操作,只在逻辑上起到有一个语句的作用。 (3) 复合语句由花括号{ }括起的若干个语句, 语法上可以看成是一个语句。复合语句中最后一个语句的分号不能省略。 如下面是一个复合语句: {z=x+y; y=x/z; x=z-y; }
(4) 表达式语句是在各种表达式后加一个分号(;)形成一个语句。如赋值语句由赋值表达式加一个分号构成: x=x+y; 再如表达式x++后加一个分号构成表达式语句: x++; 表达式和表达式语句的区别是表达式后无分号, 可以出现在其它语句中允许出现表达式的地方;而表达式语句后有分号, 自己独立成一个语句,不能再出现在其它语句的表达式中。 如: if((a=b)<0) min=a;
(5) 控制语句有条件判断语句(if、 switch), 循环语句(for、 while、 do-while),转移语句(goto、 continue、 break、 return)。
3.3 赋值语句 赋值语句是由赋值表达式加上一个分号构成。 如x=a+b;。 C语言的赋值语句具有其它高级语言中赋值语句的一切特点和功能,也有C语言自己的特色: (1) C语言中赋值号“=”作为赋值运算符。 (2) 其它高级语言没有赋值表达式这个概念。作为赋值表达式可以出现在其它表达式能出现的地方,也可出现在其它表达式之中。 例如: if((x=a+b)! =0) t=10;
3.4 文件包含 一个C程序由若干个源文件组成,而一个源文件还可将另一个源文件的全部内容包含进来,即将另外的文件包含到本文件之中,二者合为一个大些的文件。这个包含进来的文件只是一个文件名,在编译时先进行展开,这个文件名我们用预编译命令“#include”来指定,其一般形式为: #include <文件名> 或 #include ″文件名″
3.5 流和文件初步 C语言的输入和输出由库函数来完成。在C语言中没有用于完成I/O操作的关键字,而是采用I/O操作函数。因此数据的输入输出要调用输入输出库函数。 在ANSI C标准中定义了一组完整的I/O操作函数。这些函数调用时所需的一些预定义类型和常数都在头部文件stdio.h和conio.h中。因此调用输入输出函数时,在程序前面应加上 #include <stdio.h> 和(或) #include <conio.h> 如没有该命令指定, 可能造成错误。
C语言I/O系统为C语言编程者提供了一个统一的接口, 与具体的被访问设备无关。也就是说,在编程者和被使用设备之间提供了一层抽象的东西,这个抽象的东西就叫做“流”。 具体的实际设备叫做“文件”。 所有的流具有相同的行为,相当于一个缓冲区,流可分为文字流和二进制流。 一个文字流是一行行的字符,换行符表示这一行的结束。 文字流中某些字符的变换由环境工具的需要来决定。例如一个换行符可以变换为回车换行两个字符。因此所读写的字符与外部设备中的数据没有一一对应的关系。
3.6 数据输出 … 3.6.1 putchar函数(字符输出函数) 函数调用形式: char ch; 3.6 数据输出 3.6.1 putchar函数(字符输出函数) 函数调用形式: char ch; putchar (ch); …
例 3.1 字符数据的输出。 #include <stdio.h> main( ) { char a, b; a=′b′; b=′o′; putchar(a); putchar(b); putchar(′y′); putchar(′\n′); } 经编译后运行, 在屏幕上显示: boy
3.6.2 printf函数(格式输出函数) 函数的调用形式: printf(″控制字符串″, 参量表); 例如: printf(″The output x=%d\n″, x); 若x=10, 则输出为“The output x=10”。
表 3.1 printf()的格式说明
例 3.2 不同类型数据的输出。 程序:
3.6.3 puts函数(字符串输出函数) 函数的原型是: char *puts(char *s) 函数的调用形式是:
… 3.7 数据输入 3.7.1 getche函数与getchar( )和getch( ) getche函数的调用形式: 3.7 数据输入 3.7.1 getche函数与getchar( )和getch( ) getche函数的调用形式: char# ch; ch=getche( ); getche( )用于等待从键盘上键入一个字符, 返回它的值并在屏幕上自动回显该字符。使用该函数必须在程序的头部使用文件包含命令: #include <conio.h> …
例 3.3 单个字符的输入和输出。 #include <conio.h> #include <stdio.h> main( ) { char ch; ch=getche( ); putchar(ch); putchar(′\n′); } 经编译后运行, 输入a, 最后在屏幕上显示: aa
例 3.4 多个字符的输入和输出。 #include <stdio.h> #include <conio.h> 例 3.4 多个字符的输入和输出。 #include <stdio.h> #include <conio.h> main( ) { char# a, b, c; a=getch( ); b=getch( ); c=getch( ); putchar(a); putchar(b); putchar(c); putchar(′\n′); getch( ); }
3.7.2 scanf函数(格式输入函数) scanf函数的调用形式: scanf(″控制字符串″,参量表); 如scanf(″a, b=%d, %d″, &a, &b); 即要在键盘上输入a, b=12, -34 此时12送给变量a,-34送给变量b,而控制字符串中a, b=和两个%d之间的逗号必须原封不动照样输入。
scanf函数括号中的控制字符串包含三类不同的字符内容: (1) 格式说明。 (2) 空白字符。 (3) 非空白字符。
表 3.2 scanf()的格式说明
3.7.3 gets函数(字符串输入函数) 函数的原型是: char *gets(char *s) gets( )函数用来从键盘读入一串字符, 并把它们送到gets函数中的字符数组成字符型指针所指定地址的存贮单元中。 在输入字符串后,必须用回车作为输入结束,该回车符并不属于这串字符,由一个“空操作字符(′\0′)”在串的最后来代替它。此时空格不能结束字符串的输入。gets函数返回一个指针。
#include <stdio.h> 例 3.5 字符串的输入和输出。 程序: #include <stdio.h> main( ) { char str[80]; gets(str); puts(str); } 运算结果: ABC DEF ABC DEF
3.8 程序举例 例 3.6 输入一个小写字母, 按大写输出。 程序一: #include <stdio.h> 3.8 程序举例 例 3.6 输入一个小写字母, 按大写输出。 程序一: #include <stdio.h> #include <conio.h> main() { char ch; ch=getche( ); putchar(ch-32); } 运行: aA
#include <stdio.h> 程序二: #include <stdio.h> #include <conio.h> main( ) { char ch; ch=getch( ); putchar(ch-32); } 运行: A
#include <stdio.h> 程序三: #include <stdio.h> main( ) { char ch; ch=getchar( ); putchar(ch-32); } 运行: abcdefgA
例 3.7 输入三角形的三条边长,求三角形的面积。我们假设输入的三边能构成三角形。 分析: 三角形面积的计算公式如下: s=(a+b+c)/2
程序: #include <math.h> main( ) { float a, b, c, s, area; scanf(″%f, %f, %f″, &a, &b, &c); s=0.5*(a+b+c); area=sqrt(s*(s-a)*(s-b)*(s-c)); printf(″a=%.2f, b=%.2f, c=%.2f\n″, a, b, c); printf(″area=%.2f\n″, area); } 运行: 3, 4, 6 a=3.00, b=4.00, c=6.00 area=5.33