1、3 顺序结构程序设计,本章重点: C语言基本语句的分类 字符数据输入输出函数 格式化输入输出函数 本章难点 格式化输入输出函数的格式控制字符串 从程序流程的角度来看,程序可以分为三种基本结构,即顺序结构、选择结构、循环结构。这三种基本结构可以组成所有的各种复杂程序,C语言提供了相应的语句。本章介绍C语言中构成顺序结构的一些语句,使读者对C程序有一个初步的认识,为后面各章的学习打下基础。,3.1 C语言语句概述,C语言的语句可分为说明语句和可执行语句两大类。说明语句包括变量定义或说明、数据类型定义、函数声明等语句;可执行语句用来向计算机发出操作指令,一条可执行语句编译后可产生若干条机器指令。在函
2、数或复合语句内的说明语句必须在可执行语句的前面。本节介绍的是可执行语句,主要分为简单语句和复合语句,简单语句主要包括表达式语句、函数调用语句、控制语句和空语句等 。,3.1.1 简单语句,(1) 表达式语句 表达式语句由表达式加上分号“;”组成,其一般形式为: 表达式; 执行表达式语句就是计算表达式的值。例如:i=i+1; /*将i+1的结果存入变量i中*/x+y; /*加法运算语句,但计算结果不能保留,无实际意义*/i+; /*i值增1*/ (2) 函数调用语句 由函数调用加上分号“;”组成。例如: printf(“C Program“);/*调用库函数,输出字符串*/,(3) 控制语句 控
3、制语句用于控制程序的流程,C语言有九种控制语句,可分成以下三类: 1) 条件判断语句:if语句、switch语句等; 2) 循环执行语句:do-while语句、while语句、for语句; 3) 转向语句:break语句、goto语句、continue语句、return语句。 (4) 空语句 只有分号“;”组成的语句称为空语句。程序执行时不产生任何动作。程序设计中有时需要加一个空语句来表示存在一条语句,但随意加分号也会导致逻辑上的错误,需要慎用。 例如:while(getchar()!=n); 本语句的功能是,只要从键盘输入的字符不是回车则重新输入。这里的循环体为空语句。,3.1.2 复合句,
4、把多个语句用括号“”括起来组成的一个语句称复合语句。复合语句也称为“语句块”,复合语句的语句形式如下: 语句1; 语句2;;语句n; 一个复合语句在语法上视为一条语句,在括号“”内的语句数量不限。例如: x=y+z;a=b+c;printf(“%d%d“,x,a);,3.2 字符数据的输入输出,所谓输入输出是以计算机主机为主体而言的。从计算机向外部输出设备(如显示器、打印机、磁盘等)输出数据称为“输出”,从输入设备(如键盘、磁盘、光盘、扫描仪等)向计算机输入数据称为“输入”。本章所述的输入输出设备主要指的是键盘和显示器。与其他高级语言有所不同,C语言没有提供输入输出语句,数据输入输出是由函数来
5、实现的,在调用输入输出函数之前,应使用下面预编译命令对头文件“stdio.h”(stdio是standard input/output的缩写) 进行文件包含说明。 #include 输入输出函数主要包括字符数据的输入输出函数及格式化输入输出函数。本节介绍字符数据的输入输出函数。,3.2.1 字符输出函数(putchar),putchar 函数是字符输出函数,其功能是在默认输出终端(一般为显示器)上输出单个字符。其一般形式为:putchar(ch)其中ch可以是一个字符变量或常量,也可以是一个转义字符。例3-1 输出单个字符。#include main() char ch=B;putchar(c
6、h); /*输出变量的值字符B*/putchar(n); /*输出一个换行符*/putchar(B); /*直接输出字符B*/putchar(n); /*输出一个换行符*/putchar(0x42); /*使用ASCII值输出字符B*/putchar(n); /*输出一个换行符*/程序运行结果如下:BBB,3.2.2 字符输入函数(getchar),getchar函数是字符输入函数,其功能是从系统默认的输入终端(一般为键盘)输入一个字符,可以是字母字符、数字字符和其他字符等。其一般形式为:getchar();要注意的是,getchar函数等待输入直到按回车才结束,回车前所输入的全部字符都会在在
7、屏幕上显示,但只有第一个字符作为函数的返回值。例3-2 输入单个字符。#include main() char c;c=getchar(); putchar(c); 程序运行结果如下:abca,另外,getchar函数得到的字符可以赋给字符变量或整型变量,也可以不赋给任何变量,而作为表达式的一部分。例3-2可以写成:#include main() putchar(getchar();,.3 格式化输入输出函数,3.3.1 格式输出函数(printf) (1) printf函数的一般调用形式printf函数是C语言提供的标准输出函数,它的作用是将数据在终端设备(或系统默认的输出设备上)按指定格式
8、输出。printf函数调用的一般形式为:printf(“格式控制字符串“,输出表列); 其中,输出表列是以逗号隔开的表达式,格式控制字符串的作用如下: 1) 为各输出项提供输出格式输出格式的作用是将要输出的数据转换为指定的格式输出。它总是由“%”符号开始,紧跟其后的是格式描述符,说明输出数据的类型、形式、长度、小数位数等。 2) 原样输出普通字符,在程序运行过程中起提示作用。,例3-3 程序示例#include main() int i=3314;float a=2.1454;printf(“i=%d,a=%f,a*10=%en“,i,a,a*10);程序运行结果为:i=3314,a=2.14
9、5400,a*10=2.145400e+001在上面printf的格式控制串中,“i=”按原样输出,在“%d”的位置上输出变量i的值,接着输出一个逗号“,”和“a=”,在“%f”的位置上输出变量a的值, 又输出一个逗号“,”和“a*10=”,在“%e”的位置上输出a*10的值,最后输出一个换行符,(2) printf函数中常用的输出格式在Turbo C中,printf函数的输出格式的一般形式为:%标志宽度指示符.精度指示符长度修正符格式字符其中,方括号中的项为可选项。1) 格式字符:格式字符用以表示输出数据的类型,格式字符如表3-1所示。表3-1 格式字符表,2) 宽度指示符:用来指定输出数据
10、项的最小字段宽度,通常用十进制表示。省略宽度指示符时,按实际位数输出;若实际位数大于定义的宽度,也按实际位数输出;若实际位数小于定义的宽度,数据右对齐,左边补以空格。如表3-2所示。表3-2 未指定宽度和指定输出宽度时的输出结果,3) 精度指示符:精度指示符以“.”开头,后跟十进制整数。精度指示符通常与宽度指示符结合使用,格式为“m.n”,其中“m”表示输出数据所占总的宽度,“n”表示输出数据的精度。对于浮点数,“n”表示输出数据的小数的位数,当输出数据的小数位数大于“n”时,截去右边多余的小数,并对截去的第一位小数做四舍五入;当输出数据的小数位数小于“n”时,在小数的最右边添0。也可以省略“
11、m.n”中的m,用“.n”表示小数的位数,并对截去的第一位小数进行四舍五入,这时输出数据的宽度由系统决定。若指定“%.0f”,则不输出小数部分,但要对第一位小数进行四舍五入。对于g或G,“.n”表示输出的有效数字,并对截去的第一位进行四舍五入,整数部分并不丢失,隐含的输出有效数字为6位有效数字。对于字符串,“.n”则表示要输出字符的个数;如果实际位数大于所定义的精度时,则截去超过的部分。表3-3列举了一些指定精度的例子。,表3-3 指定精度时的输出结果,4) 标志:标志字符为-、+、#、空格四种,其意义如表3-4所示。表3-5列举了一些使用标志的例子。 表3-4 标志及其意义,表3-5 标志的
12、用法,5) 长度:长度格式符为h、l两种,%hd表示按短整型输出,%ld表示按长整型输出,%lf按双精度输出。例3-4 程序示例#include main() int a=15;float b=123.1234567;double c=12345678.1234567;char d=p;printf(“a=%d,%5d,%o,%xn“,a,a,a,a);printf(“b=%f,%lf,%5.4lf,%en“,b,b,b,b);printf(“c=%lf,%f,%8.4lfn“,c,c,c);printf(“d=%c,%8cn“,d,d); 程序运行结果如下:a=15,15,17,f b=12
13、3.123459,123.123459,123.1235,1.231235e+002c=12345678.123457,12345678.123457,12345678.1235d=p,p,注意:在例3-4中,b是单精度实数,只能保证7位有效数字,因此b=123.123459中,123.1234是准确的,后面几位是不准确的。而c是双精度实数,能保证16位有效数字,因此结果每一位都是准确的。(3) 调用printf函数时的注意事项 1) 输出表列中的各输出项要用逗号隔开,输出项可以是合法的常量、变量或表达式。格式控制字符串中的格式描述符与输出列表的输出项在数量和类型上应该一一对应。如果格式控制字
14、符串中的格式描述符少于输出项的个数,多余的输出项不予输出;如果格式控制字符串中的格式描述符多于输出项的个数,则对于多余的格式将输出不定值(或0值)。2) 如果格式控制字符串中的格式描述符与对应的输出项类型不匹配,将导致数据不能正确输出,这时系统并不报错,例如在输出长整型数据时,一定要使用%ld格式说明,如果使用%d,将输出错误的数据。,例3-5程序示例#include main() long a=80000;printf(“x=%dn“,a); 程序运行后的输出结果是 x=14464 3) 在格式控制字符串中,除了合法的格式说明外,可以包含任意的合法字符(包括转义字符),这些字符在输出时将原样
15、输出。 4) 如果需要输出百分号%,则应该在格式控制字符串中用连续的百分号“%”来表示。 5) printf函数的返回值通常是本次调用中输出项的个数。 6) 在输出时,先对输出表列的各项求值,然后再输出。输出顺序是从左到右,而求值顺序,有的编译系统是从左到右,有的是从右到左,Turbo C是按从右到左进行的,例3-6程序示例#include main() int i=8;printf(“%dt%dn“,i,i+);输出结果为:9 8在Turbo C中运行该程序时,对printf函数的各输出项按自右至左的顺序求值,即先对“i+”求值,结果为8;再对i求值,此时i为9。然后按自左至右输出,得上述结
16、果。,3.3.2 格式输入函数(scanf)(1) scanf函数的一般调用形式scanf函数是C语言提供的标准输入函数,它的作用是从终端设备(或系统默认的输入设备)上输入数据。scanf函数的一般调用形式如下:scanf(“格式控制字符串“,地址列表);例如:scanf(“%d%d“,其中scanf是函数名,“%d%d”为格式控制字符串; &a,&b组成地址列表,表示两个输入项。1) 格式控制字符串的作用是指定输入数据的格式,由“%”符号开始,其后是格式描述符。2) 各输入项只能是合法的地址表达式,例如&a,&b。“&”是C语言中求地址运算符,&a就是取变量a的地址, &b就是取变量b的地址
17、,也就是说各输入项必须是某个存储单元的地址。,(2) scanf函数中常用的格式说明每个格式说明都必须用%开头,以一个“格式字符”作为结束。其一般形式如下:%*输入数据宽度长度格式字符格式字符:表示输入数据的类型,表3-6列出了scanf用到的格式字符。表3-6 scanf格式字符,2) “*”符:表示该输入项读入后不赋予相应的变量,即跳过该输入值。例如:scanf(“%d%*d%d“,当输入12345678时,把1234赋予a,而把5678赋予b。4) 长度:长度格式符为l和h,l表示输入长整型数据(如%ld)和double型数据(如%lf)。h表示输入短整型数据(如%hd)。,(3) 调用
18、scanf函数时的注意事项 1) scanf函数中的格式字符前可以用一个整数指定输入数据所占宽度,但不可以对实型数指定小数位的宽度。如:scanf(“%5.2f“,要求给a=10,b=20,c=30,则数据输入形式应当是:10间隔符20间隔符30此处的间隔符可以是空格、Tab键、回车符。,4) 在输入字符数据时,若格式控制字符串中没有非格式字符,则认为所有输入的字符均为有效字符。例如:scanf(“%c%c%c“,5) 调用scanf函数时,应当注意输入的数据与输出的类型保持一致,否则虽然编译能够通过,但结果将不正确。,例3-8程序示例#include main()long i;scanf(“
19、%d“,运行情况如下:11111111114208071程序中,变量i为长整型,但输入格式描述符为%d(int型),而所键入的数据已超过int型数据的范围,同时输出语句的格式说明为长整型,因此输出结果和输入数据不符,将输入数据改为长整型后,即将scanf(“%d“,&i)改为scanf(“%ld“,&i),就可得到正确结果。,6) scanf函数也有一个返回值,这个返回值就是成功输入的项数。例3-9程序示例#include main() int x,y;printf(“%dn“,scanf(“%d%d“,程序运行的结果为:455427)当输入的数据的个数小于输入项的个数时,程序等待输入,直到满
20、足要求为止。当输入的数据的个数大于输入项的个数时,多于的数据并不消失,而是作为下一个输入操作时的输入数据。,例3-10程序示例#include main() int a,b,c,d;scanf(“%d%d“,程序运行的结果为:45542389a=45,b=54c=23,d=89当程序运行到第一个scanf时,要求输入两个整数,但这里输入了四个整数,输入的数据的个数大于了输入项的个数,这时只将45赋给了a,54赋给了b,23和89并没有消失,当运行到第二个scanf时,23和89作为该输入操作的输入数据。,程序举例,1、输入一个小写字母,打印其大写字母及其前导字母和后续字母,程序举例2,求方程a
21、x2+bx+c=0的根,设b2-4ac0其中a,b,c的值由键盘输入。,3.4 顺序结构程序设计举例,下面介绍几个顺序结构程序设计的例子。例3-11 中国古代数学问题“鸡兔同笼问题”。这个古典的数学问题是这样的:在同一个笼子里养着鸡与兔,但不知道其中鸡有多少只,兔有多少只,只知道鸡和兔的总数是a,鸡与兔共有b只脚,问鸡与兔各有多少只?由已知条件,列出方程组: 其中x为鸡的只数,y为兔的只数。由上面方程组可得到:,该式表明解出方程的办法,于是编制程序如下:#include main() int a,b;int x,y;printf(“Input the head: “);scanf(“%d“,运
22、行情况如下:Input the head:16Input the feet:40The Number of chick is 4The Number of rabbit is 12,例3-12 输入圆的半径,输出圆的周长和面积.周长的计算公式:面积的计算公式:程序如下:#include #define PI 3.14159main() float r,l,s;scanf(“%f“, 运行情况如下:5l=31.4159s=78.5397,本章小结,C语言的语句主要包括简单语句和复合语句。简单语句主要有表达式语句、函数调用语句、控制语句、空语句等四种,复合语句是把多个语句用括号括起来组成的一个语句
23、。C语言中没有提供专门的输入输出语句,所有的输入输出都是调用标准库函数中的输入输出函数来实现。putchar函数主要功能是在系统默认的输出设备(显示器)上输出单个字符,getchar函数主要功能是从系统默认的输入设备(如键盘)输入一个字符。在程序中使用这两个函数时,应使用编译预处理命令“#include ”。printf是格式化输出函数,可按指定的格式显示数据,scanf是格式化输入函数,按照指定的格式输入数据。,习题三,一、选择题1putchar函数可以向终端输出一个 。A) 整型变量表达式值 B) 实型变量值C) 字符串 D) 字符或字符型变量值2以下程序的输出结果是 。A) a=%2,b
24、=%5 B) a=2,b=5 C) a=%d,b=%d D) a=%d,b=%d#include main() int a=2,b=5;printf(“a=%d,b=%dn“,a,b);,3以下C程序正确的运行结果是 。A) y=-43456 B) y=-43456 y=-43456 y=-43456y=-0043456 y=-0043456y=-43456 y=+-43456C) y=-43456 D) y=-43456 y=-43456 y=-0043456y=-0043456 y=00043456y=-43456 y=+43456#include main() long y=-43456
25、;printf(“y=%-8ldn“,y);printf(“y=%-08ldn“,y);printf(“y=%08ldn“,y);printf(“y=%+8ldn“,y);,4以下C程序正确的运行结果是 。A) y=2456 B) y=4630y=2456 y=4630y=#2456 y=#4630C) y=2456 D) y=4630y=2456 y=4630y=02456 y=04630#include main() int y=2456;printf(“y=%3on“,y);printf(“y=%8on“,y);printf(“y=%#8on“,y);5输出语句printf(“*%10.
26、2f*n“,57.666);的输出结果 。A) *0000057.66* B) *57.66* C) *0000057.67* D) *57.67*,6已有程序段和输入数据的形式如下,程序中输入语句的正确形式应当为 。A) scanf(“%d,%f“,Input number:4.52,7已有如下定义和输入语句,若要求a1,a2,c1,c2的值分别为10,20,A和B,当从第一列开始输入数据时,正确的输入方式是 。A) 10A20B B) 10A20B C) 10A20B D) 10A20Bint a1,a2;char c1,c2;scanf(“%d%c%d%c“,9阅读以下程序,若运行结果为
27、如下形式,输入输出语句的正确内容是 。A) scanf(“%d,%f“,输入语句输出语句输入形式 enter x,y:23.4输出形式 x+y=5.4,10当运行以下程序,输入9876543210,则程序的运行结果是 。A) a=98,b=765,c=4321 B) a=10,b=432,c=8765C) a=98,b=765.000000,c=4321.000000 D) a=98,b=765.0,c=4321.0#include main() int a;float b,c;scanf(“%2d%3f%4f“,2执行以下程序时,若从第一列开始输入数据,为使变量a=3,b=7,x=8.5,y=71.82,c1=A,c2=a,请写出正确的数据输入形式。#include main() int a,b;float x,y;char c1,c2;scanf(“a=%d b=%d“,三、编程题1编写程序,输入两个整数,求出它们的商数和余数并进行输出。2. 编写程序,读入三个双精度数,求它们的平均值并保留此平均值小数点后一位数,对小数点后第二位进行四舍五入,最后输出结果。,