460 likes | 658 Views
第四章 顺序程序设计. 4.1 C 语言语句 4.2 字符输入 / 输出函数 4.3 格式输入 / 输出函数 4.4 顺序结构程序设计举例 4.5 作业与实验. 4.1 C 语言语句. 4.1.1 控制语句 ① 条件语句 : if - else 语句 ② 多分支选择语句 : switch 语句 ③ 当型循环语句 : while 语句 ④ 直到型循环语句 : do - while 语句 ⑤ 计数型循环语句 : for 语句 ⑥ 中止本次循环语句 : continue 语句 ⑦ 中止整个循环语句 : break 语句
E N D
第四章 顺序程序设计 4.1 C语言语句 4.2 字符输入/输出函数 4.3 格式输入/输出函数 4.4 顺序结构程序设计举例 4.5 作业与实验
4.1 C语言语句 4.1.1 控制语句 ① 条件语句: if-else语句 ② 多分支选择语句: switch语句 ③ 当型循环语句: while语句 ④ 直到型循环语句: do-while语句 ⑤ 计数型循环语句: for语句 ⑥ 中止本次循环语句: continue语句 ⑦ 中止整个循环语句: break语句 ⑧ 函数返回语句: return语句 ⑨ 无条件转移语句: goto语句
4.1.2 表达式语句 在C语言中, 任何表达式都可以加上分号而成为相应的表达式语句,存在于程序中。 例如: ① i++; ② a=b=c=1; ③ x=y=1, x*x+y*y; ④ sin(0.75);
相应的赋值语句有基本赋值语句与复合赋值语句。例如: ① S=1+2+3+4+5; ② x+=1; ③ y*=a; ④ x=y=z=a=b=c=1; 函数调用语句由函数调用表达式加分号构成。 例如: ① exp(x); /*求eX*/ ② fabs(x); /*求|x|*/ ③ sqrt(x); /*求 */
4.1.3 特殊语句 1. 复合语句 当if语句中的选择体、while语句中的循环体需多条语句描述时,就必须采用复合语句。 复合语句是放在一对花括号中的一组语句。 复合语句在语法上是一个整体,相当于一个语句。凡是能使用简单语句的地方,都可以使用复合语句。 复合语句又称为分程序,它可以有属于自己的数据说明部分,即可在复合语句中定义变量。 复合语句的后花括号之后不能加分号,最后一个语句的分号不能漏掉。
2. 空语句 空语句是一种概念, C语言的空语句仅由分号构成,在编译时不产生任何指令, 在执行时不产生任何操作。只作为形式上的语句,被填充在控制结构之中。 空语句常用于: (1) 构成标号语句, 标识程序中相关位置。 (2) 循环语句中空循环体。 (3) 模块化程序中未实现的模块及暂不联入的模块。
4.2 字符输入/输出函数 C语言提供了两个标准的字符输入/输出函数,它们分 别是getchar和putchar。 4.2.1 putchar函数(字符输出函数) 该函数形式为: putchar(<字符对象>) putchar是函数名,其参数可以是一个字符常量或字符变量。该函数的功能是向终端输出一个字符。因整型和字符型是通用的,所以putchar函数也能够把代表某个字符编码的整数作为一个字符输出。
4.2.2 getchar函数(字符输入函数) 该函数形式为: getchar( ) getchar是函数名,后面圆括号内是空的,说明该函数没有参数。该函数的一般使用形式是: <字符变量>=getchar( ); 功能是从键盘上敲入一个字符,然后把它赋给字符变量,单独调用getchar( )函数没有实际意义。
#include<stdio.h> /*文件包含命令*/ main( ) {char c; c=getchar( ); putchar(98); putchar(c) ; putchar(‘y’); putchar(‘\n’); } 经编译后运行如下: o ↙ boy
4.3 格式输入/输出函数 4.3.1 printf函数 一般格式: printf(格式控制字符串,输出项列表) printf函数将输出项的值按指定的格式输出,不同类型的数据使用不同的格式说明符。
表4―1 输出的数据类型与其控制格式的对应关系
1. %d格式 (1)%d格式用来输出十进制整数,按数据的实际长度输出。 (2)可以对输出数据所占的列数加以限制,方法是在%和d之间加一整数,整数可正可负。例如: printf(″a=%5d″,13); 输出为:a=□□□13 printf(″a=%-5d″,13); 输出为:a=13□□□ printf(″a=%3d″,12345); 输出为:a=12345
整数m为正时,左补空格;m为负时,右补空格。若m小于实际位数,则按实长输出。整数m为正时,左补空格;m为负时,右补空格。若m小于实际位数,则按实长输出。 (3)当输出的数据大于32767时,不能再用%d格式,这时应该用长格式%ld来输出: printf(″a=%ld″,1234567); 输出为:a=1234567 也可以对长格式的位数加以限制,方法同(2)。
2. %o格式 %o以八进制形式输出整数,其机理是把整数在内存中的ASCII编码由低位向高位三位一组进行分节,每一节用一个八进制数码表示。这样如果原来的数据为负,则符号位的1也被作为八进制数的一部分加以处理了。 3. %x格式(或%X) 这是以十六进制形式输出整数,其机理和八进制输出一样,只是它是对二进制编码按四位一组进行分节,每节用一个十六进制数码表示,同样也不考虑符号。
例如: int a = -1; printf(″%d,%o,%x\n″, a, a, a); 输出结果为: -1,177777,ffff。 a = -1的内存形式为
4. %u格式 %u以十进制形式输出无符号整数。 一般,在输出整数时,均用相应的格式输出,但也 可用其它格式输出。此时,按不同类型的整型数据间的 赋值规则来处理。
main( ) {unsigned a=65535; int b= -1; long c=32768; printf(“a=%d,%u\n”, a, a); printf(“b=%d,%u\n”, b, b); printf(“c=%d,%ld\n”, c, c); } 编译后运行结果为: a= -1,65535 b= -1,65535 c= -32768,32768
5. %c格式 这种格式输出一个字符,和字符ASCII编码对应的整数也以字符形式输出,并可以为其指定宽度。如: char ch=‘a’; printf(″%c,%c\n″,ch,97); printf(″%5c\n″,ch); 则结果为: a,a □□□□a
6. %s格式 这个格式用来输出字符串。 (1)%s格式将字符串中的字符逐个输出,直到遇到第一个‘\0’字符为止,即并不一定把双引号中的内容全部输出。例如: printf(″s=%s\n″, ”China”); 输出为:s=China printf(″s=%s\n″, ”China\0Japan”); 输出为:s=China 字符‘\0’后的内容被舍掉,‘\0’本身也不输出。如果字符串中有控制字符,则控制字符也会发挥作用。
(2) 可指定输出字符串的长度,规则如前。如: printf(″s=%6s″,″book″); 输出:s=□□book(正数,左补空格) printf(″s=%-6s″,″book″); 输出:s=book□□(负数,右补空格) printf(″s=%2s″,″book″); 输出:s=book(突破限制)
(3)输出字符串前端的部分字符格式%<m>.<n>s。这种格式指明:在m列宽度中输出字符串的前n个字符,当m<n时,有m=n。如: printf(″s=%5.3s″,″China″); 输出为:s=□□Chi printf(″s=%-5.3s″,″China″); 输出为:s=Chi□□ printf(″s=%2.3s″,″China″); 输出为:s=Chi
7. %f格式 这个格式以小数形式输出单精度、双精度类型的浮点数。 (1)以%f格式输出浮点数时,整数部分全部输出,小数部分输出6位,但输出的不一定全是有效数字。对单精度数只有左边7位有效,而对双精度只有前16位有效。 (2)也可以指定输出的宽度和小数位数,如: printf(″f=%10.2f\n″,123.456); 输出:f=□□□□123.46 输出宽度中包含小数点和正负号位数,小数部分进行四舍五入。
8. %e格式(或%E) 这种格式是以指数形式输出浮点数,包括单精度和双精度数。输出时,尾数的整数部分只有1位,系统自动指定尾数的小数部分宽度和指数部分的宽度。对此不同的系统有不同的规定。对Turbo C来说,小数部分5位,指数部分4位(包括字母e或E,1位阶符,2位阶码)。例如: printf(“%e\n”,123.4567); 输出为:1.23457e+02 printf(“%e\n”,123.4); 输出为:1.23400e+02
9. %g格式(或%G) 这种格式用于输出尾数中不带无效0的浮点数,以尽可能地少占输出宽度。例如: printf(″g=%g″,123.4); 输出:g=123.4 这种输出更符合人们的阅读习惯。 10. printf函数的控制字符的进一步说明 (1)以上我们介绍了9种控制字符的一般用法,为了满足特殊的要求,还可以对控制字符加一些特殊的修饰。修饰符或标志共有6种,如表4―2所示。
main( ) {printf(″%+d,%+d\n″,786, -786); /*输出:+786,-786*/ printf(″a=%d,a=%d\n″,5, -5); /* 输出:a=5,a=-5*/ printf(″%#o\n″,1427); /*输出:02623*/ printf(″%#x\n″,1427); /*输出:0x593*/ printf(″%g\n″,1427.00); /*输出:1427*/ printf(″%#g\n″,1427.00); /*输出:1427.00*/ printf(″%+09d″,125); /*输出:+00000125*/ printf(″%*.*f″,7, 2, 87.4573); /*输出:□□87.46*/ }
(2)精度说明。 (3)程序中易出现的错误: ①把除%X,%G,%E外的控制字符写成大写,如%D等。 ②试图用%c格式输出字符串的第一个字符。如: printf(″%c″,″China″); 这样输出不了′C′。 试图用%s格式输出字符。如: printf(″%s\n″,′a′); 结果也是错误的。
C 1. 以下程序的输出是( )。 main( ) {int a=011, b=101; printf(“%x,%o”, ++a, b++); } A.12,145 B.9,144 C.a,145 D.a,5 2.以下语句的输出是( )。 int x= -1; printf(“%d,%u,%o”, x, x, x); A.-1,-1,-1 B.-1,32767,-177777 C.-1,32768,177777 D.-1,65535,177777 D
D 3. 以下程序的输出是( )。 main( ) {int x=02, y=3; printf((“x=%%d,y=%%d”, x, y); } A.x=2,y=3 B.x=%2,y=%3 C.x=%%d,y=%%d D.x=%d,y=%d
4.3.2 scanf函数 scanf函数能对各种类型的数据进行格式化输入,变量将在程序执行过程中得到从键盘输入的值。 scanf函数的一般格式为: scanf(格式控制字符串,输入项地址列表) 前面我们已知,scanf的输入项列表中是以逗号分开的变量的地址,即每个变量名前面须加一个取地址运算符&。
例如: 假定已有相应变量定义 (1) scanf(″%2d%3d″, &i, &j); 如输入: 12345 则 i 得到值12, j 得到值345。 (2) scanf(″%2d%*3d%2d″, &a, &b); 如输入: 1234567 则 a得到值12, b得到值67。
说明: 1. 分隔符的使用 (1)输入数据默认用空格、 回车或TAB键分隔。 (2)利用格式字符串中普通字符在输入时要原样输入,常引入特定的普通字符如逗号等,作为输入数据的分隔符。 (3)如果数据本身可以将数据分隔时,输入数据不需用分隔符。如: scanf(″%d%c%d″, &v1, &v2, &v3); 要使v1的值为30, v2的值为′a′, v3的值为18。 可输入:30a18,这样字符数据a能起到分隔数据30、18的作用。
2. 按Enter键结束数据的输入。 3. 输入函数中格式控制字串中一般不允许使用转义字符。 4. 变量得到值有三种方法: 定义时赋给初值,在编译时得到;在执行时利用赋值语句得到;在执行时通过调用输入函数得到。利用输入函数得到值更具一般性和通用性。 注意: C语言本身并不提供输入/输出语句,数据的输入/输出是通过调用输入/输出库函数而实现,该语句是函数调用语句,而非输入/输出语句。 输入数据时,可以规定数据所占的列数,但不能规定数据的精度。
D 1.若有:int k1, k2, k3, k4; 要通过以下的语句,使k1、k3 的值为10,k2、k4的值为20,则正确的输入形式是( )。 scanf(“%d%d”, &k1, &k2); scanf(“%d,%d”, &k3, &k4); 其中<CR>表示回车,□表示空格。 A.1020<CR> B.10□20<CR> 1020<CR> 10□20<CR> C.10,20<CR> D.10□20<CR> 10,20<CR> 10,20<CR>
C 2.若有:int x; float y; 那么,以下输入语句中( )是正确的。 A.scanf(“%f%f ”, &x, &y); B.scanf(“%d%f ”, x, y); C.scanf(“%d%f ”, &x, &y); D.scanf(“%2d%5.2f ”,&x, &y); 3. 若有: int a ; char c ; float f ; 要通过以下的语句, 使a的值为2, f的值为3.4, c的值为3.4, 则正确的输入形式是( )。 scanf(“%d%f%c”, &a, &f, &c); A.2□3.4□c B. 2□3.4’c’ C.2,3.4,c D. 2□3.4c D
4.4 顺序结构程序设计举例 关于程序设计的过程可分三步走:分析问题(Question)、设计算法(Algorithm)及实现程序(Program),简称QAP方法。
例 4.1输入三角形的三条边长,求三角形的面积。我们 假设输入的三边能构成三角形。 ①数据分析:找出和问题有关的量,每个量用一个变量表示(注意考虑数据类型)。 输入量:三边a、b、c 中间量:s 输出量:面积area ②算法分析: S1:输入有效的三边 S2:计算三角形面积 S3:输出三角形面积
s=(a+b+c)/2 细化S2可得三角形面积的计算公式: 因此,还要定义一个中间变量s,并且要把代数公式转换 成合法的C语言表达式。在C语言中要求某个量的平方根, 就必须调用库函数sqrt,同时还要在程序的开头加一条文 件包含命令:#include<math.h>。 s=(a+b+c)/2 area=sqrt(s*(s-a)*(s-b)*(s-c))
③ 算法实现: #include <math.h> /*包含数学函数头文件*/ main( ) { float a, b, c, s, area; scanf(″%f, %f, %f″, &a, &b, &c); s= (a+b+c)/2; 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); }/*规定结果的精度*/
例4.2从键盘输入一个大写字母,要求改用小写字母输出。例4.2从键盘输入一个大写字母,要求改用小写字母输出。 ①数据分析: 输入量:大写字母c1 输出量:小写字母c2 ②算法分析: S1:输入大写字母c1 S2:得到与c1相应的小写字母c2 S3:输出小写字母c2 S2可由表达式c2=c1+32来实现。
③ 算法实现: #include<stdio.h> /*包含标准输入/输出函数头文件*/ main( ) {char c1, c2; c1=getchar( ); /* scanf(“%c”, &c1); */ c2=c1+32; printf(“%c→%c\n”, c1, c2); }
例4.3求一元二次方程ax2 +bx+c=0的两个实根。a, b, c 由 键盘输入,设b2 - 4ac>0。 ①数据分析: 输入量:三个系数a, b, c 中间量:d 输出量:两个实根x1, x2 ②算法分析: S1:输入三个系数a, b, c S2:求两个实根x1, x2 S3:输出两个实根x1, x2
③ 算法实现: #include<math.h> main( ) {float a, b, c, d, x1, x2; scanf(“%f,%f,%f”, &a, &b, &c); d=sqrt(b*b - 4*a*c); x1=(-b+d)/(2*a); x2=(-b-d)/2/a; printf(“x1=%.2f, x2=%.2f\n”, x1, x2); }
4.5 作业与实验 1. 习题4.4 2. 习题4.6 若第5、6、7行改为: scanf(“a=%d,b=%d”,&a,&b); scanf(“%f%e”,&x,&y); scanf(“%c_%c”,&c1,&c2); /*_表示空格*/ 则又应在键盘上如何输入数据? 3. 从键盘上输入一个数字字符,要求输出与之相应的整型数据。如:输入字符2,输出整数2。 4. 习题4.8 5. 习题4.9