}
(2009年3月)程序段:
int x=12; double y=3.141593;printf("%d%8.6f",x,y);的输出结果是( A )
A)123.141593
B)12 3.141593
C)12,3.141593
D)123.1415930
数据输入
3.3 数据输入
scanf函数是C语言提供的标准输入函数,其作用是从终端键盘上读入数据。
3.3.1 scanf函数的一般调用形式
scanf函数的一般调用形式如下:
scanf(格式控制,输入项l,输入项2,…)
在scanf函数调用之后加上“;”,则构成输入语句。
例如,若k为int型变量,a为float型变量,y为double型变量,可通过以下函数调用语句进行输入:
scanf(”%d%f%lf”,&k,&a,&y);
其中scanf是函数名,双引号括起来的字符串部分为格式控制部分,其后的&k,&a,&y为输入项。
格式控制的主要作用是指定输入时的数据转换格式,即格式转换说明。
scanf的格式转换说明与printf的类似,也是由“%”开始,其后是格式字符。
上例的%d、%f(或%e)、%lf(或%le)分别用于int、float和double型数据的输入。
输入项之间用逗号隔开。
对于int、float和double型变量,在变量之前必须加&符号作为输入项(&是C语言中的求地址运算符,输入项必须是地址表达式,读者在此只需正确表示,不必深究)。
3.3.2 scanf函数中常用的格式说明
每个格式说明都必须用%开头,以一个“格式字符”作为结束。
通常允许用于输入的格式字符及其相应的功能如下表所示。
说明:
(1)在格式串中,必须含有与输入项一一对应的格式转换说明符。
若格式说明与输入项的类型不一一对应匹配,则不能正确输入,而且编译时不会报错。
若格式说明个数少于输入项个数,scanf函数结束输入,则多余的输入项将无法得到正确的输入值;若格式转换说明个数多于输入项个数,scanf函数也结束输入,多余的数据作废,不会作为下一个输入语句的数据。
(2)在VC 6.0环境下,输入short型整数,格式控制要求用%hd。
要输入double型数据,格式控制必须用%lf(或%le)。
否则,数据不能正确输入。
(3)在scanf函数的格式字符前可以加入一个正整数指定输入数据所占的宽度,但不可以对实数指定小数位的宽度。
(4)由于输入是一个字符流,scanf从这个流中按照格式控制指定的格式解析出相应数据,送到指定地址的变量中。
因此当输入的数据少于输入项时,运行程序将等待输入,直到满足要求为止。
当输入的数据多于输入项时,多余的数据在输入流中没有作废,而是等待下一个输入操作语句继续从此输入流读取数据。
(5)scanf函数有返回值,其值就是本次scanf调用正确输入的数据项的个数。
3.3.3 通过scanf函数从键盘输入数据
当用scanf函数从键盘输入数据时,每行数据在未按下回车键(Enter键)之前,可以任意修改。
但按下回车键(Enter键)后,scanf函数即接受了这一行数据,不能再回去修改。
1.输入数值数据
在输入整数或实数这类数值型数据时,输入的数据之间必须用空格、回车符、制表符(Tab键)等间隔符隔开,间隔符个数不限。
即使在格式说明中人为指定了输入宽度,也可以用此方式输入。
例如:
若k为int型变量,a为float型变量,y为double型变量,有以下输入语句:
scanf(“%d%f%le”, &k,&a,&y);
若要给k赋值10,a赋值12.3,y赋值l234567.89,输入格式可以是(输入的第一个数据之前可有任意空格):
10 12.3 1234567.89
此处表示回车。
也可以是:
10
12.3
1234567.89
只要能把3个数据正确输入,就可以按任何形式添加间隔符。
2.指定输入数据所占的宽度
可以在格式字符前加入一个正整数指定输入数据所占有宽度。
例如上例中改为:
scanf(“%3d%5f%5le”,&k,&a,&y);
若从键盘上从第1列开始输入:
123456.789.123
用printf(“%d %f %f\n”,k,a,y);打印的结果是:
123 456.700000 89.120000
可以看到,由于格式控制是%3d,因此把输入数字串的前三位123赋值给了k;由于对应于变量a的格式控制是%5f,因此把输入数字串中随后的5位数(包括小数点)456.7赋值给了a;由于格式控制是%5e,因此把数字串中随后的5位(包括小数点)89.12赋值给了y。
由以上示例可知,数字之间不需要间隔符,若插入了间隔符,系统也将按指定的宽度来读取数据,从而会引起输入混乱。
除非数字是“粘连”在一起,否则不提倡指定输入数据所占的宽度。
3.跳过某个输入数据
可以在%和格式字符之间加入“*”号,作用是跳过对应的输入数据。
例如:
int x,y,z;
scanf("%d%*d%d%d",&x,&y,&z);
printf("%d%d%d\n",x,y,z);
若是输入:
12 34 56 78
则输出是:
12 56 78
系统将12赋给X,跳过34,把56赋给y,把78赋给2。
4.在格式控制字符串中插入其他字符
(1)scanf函数中的格式控制字符串是为了输入数据用的,无论其中有什么字符,也不会输出到屏幕上,因此若想在屏幕上输出提示信息,应该首先使用printf函数输出。
例如:
int x,y,z;
scanf(“Please input x,y,z:
%d%d%d”,&x,&y,&z);
屏幕上不会输出“Please input x,y,z:
”,而是要求输入数据时按照一一对应的位置原样输入这些字符,必须从第一列起以下面的形式进行输入:
Please input x,y,z:
12 34 56
包括字符的大小写、字符间的间格等必须与scanf中的完全一致。
这些字符又被称为通配符。
但如果使用以下的形式:
int X,y,2;
printf(“Please input x,y,z:
”);
scanf(“%d%d%d”, &x,&y,&z);
运行时,由于printf语句的输出,屏幕上将出现提示“Please input x,y,z:
”,只需按常规输入下面的数据即可:
12 34 56
(2)如果在上面的scanf函数中,在每个格式说明之间加一个逗号作为通配符:
scanf(”%d,%d,%d”,&x,&y,&z);
则输入数据时,必须在前两个数据后面紧跟一个逗号,以便与格式控制中的逗号一一匹配,否则就不能正确读入数据。
例如,输入:
12,34,56
能正确读入。
输入:
12, 34, 56
也能正确读入。
因为空格是间隔符,将全部被忽略掉。
但输入:
12 ,34 ,56
将不能正确读入,因为逗号没有紧跟在输入数据后面。
需要提醒的是,为了减少不必要的麻烦,尽量不要使用通配符。
◆ 【例题分析】
(习题)若变量已正确定义为int型,要给a、b、c输入数据,正确的输入语句是( D )
A)read(a,b,c);
B)scanf(“%d%d%d”,a,b,c);
C)scanf(“%D%D%D”,&a,%b,%c);
D)scanf(“%d%d%d”,&a,&b,&c);
(习题)若变量已正确定义为float型,要通过输入语句:
scanf(“%f %f%f”,&a,&b,&c);给a赋值11.0,b赋值22.0,c赋值33.0,不正确的输入形式是( B )
A)11
22
33
B)11.0,22.0,33.0
C)11.0
22.0 33.0
D)11 22
33
3.4 复合语句和空语句
3.4.1 复合语句
在C语言中,一对花括号“{}”不仅可用作函数体的开头和结尾的标志,也可用作复合语句的开头和结尾的标志。
复合语句也可称为“语句块”,其语句形式如下:
{语句l
语句2
……语句n
}
用一对花括号把若干语句括起来构成一个语句组。
一个复合语句在语法上视为一条语句,在一对花括号内的语句数量不限。
在复合语句中,可以定义本复合语句中的局部变量。
3.4.2 空语句
c程序中的所有语句都必须由一个分号“;”作为结束。
如果只有一个分号,这个分号也是一条语句,称为“空语句”,程序执行时不产生任何动作。
程序设计中有时需要加一个空语句来表示存在一条语句,但随意加分号也会导致逻辑上的错误,而且这种错误十分隐蔽,编译器也不会提示逻辑错误,初学者一定要小心,需要慎用。
◆ 【例题分析】
(习题)下列选项中不是C语句的是( C )
A){int i;i++;printf("%d\n",i);}
B);
C)a=5.C=10
D){;}
3.5 程序举例
例3.2 下程序由终端输入两个整数给变量x和y;然后输出x和y;在交换中的值后,再输出x和y。
验证两个变量中的数是否正确地进行了交换。
#include
Main()
{ int x,y,t;
printf(“Enter x&y:
\n”); //输入提示
scanf(“%d%d”,&x,&y);
printf(“x=%d y=%d\n”,x,y);
t=x;x=y;y=t; //交换
printf(“x=%d y=%d\n”,x,y);
}
以下是程序运行情况:
Enter x&y:
(由第4行的printf输出)
123 456 (从键盘输入两个整数,代表按Enter键)
x=123 y=456 (由第6行的printf输出)
x=456 y=123 (由第8行的printf输出)
例3.3 输入一个double类型的数,使该数保留小数点后两位,对第三位小数进行四舍五入处理,然后输出此数,以便验证处理是否正确。
main()
{ double x;
printf("Enter x:
\n");
seanf("%lf",&x);
printf("
(1)x=%f\n",x);
x=x*100;
x=x+0.5