制 作:方 斌
C语言程序设计教程郧阳师范高等专科学校计算机科学系方 斌 制作制 作:方 斌第 3章 顺序结构程序设计为了让计算机处理各种数据,首先就应该把源数据输入到计算机中;计算机处理结束后,再将目标数据信息以人能够识别的方式输出。 C语言中的输入输出操作,是由 C语言编译系统提供的库函数来实现。
制 作:方 斌
3.1 赋值语句
① C语言中的,=”作为赋值运算符,不是“等于”。
② 赋值语句和赋值表达式是不同的概念,赋值表达式使 C语言非常灵活。
例、
if ((a = b) > 0) t = a;
if ((a = b; ) > 0) t = a;
制 作:方 斌
3.2 数据输出
printf():输出到终端(系统标准输出设备 stdout,指显示器)。
C语言不提供输入输出语句,输入输出由开发系统提供的函数实现,
函数的原型(函数名、返回值类型、形式参数)在文件 stdio.h中定义,
因此,使用输入输出函数时,应在源程序的开头使用如下语句,
#include "stdio.h" 或 #include <stdio.h>
#include是一个预编译命令。
stdio.h放在程序的开头,因此称为“头文件”;又由于使用
#include(包含)命令,又称为“包含文件”。
开发系统提供很多函数,它们的原型在不同的头文件中定义,因此,
在程序开头,总是包含需要的头文件。
制 作:方 斌
3.2.1 printf()函数作用:格式化输出任意数据列表,
一,printf()的一般格式
printf(格式控制,输出列表) ;
例、
int i = 3;
double f = 4.56;
printf("i = %d,f = %f\n",i,f);
printf()是函数,“格式控制”和“输出列表”是其参数。可以表示为:
printf(参数 1,参数 2,参数 3,....,参数 n);
其中“参数 1”表示“格式控制”;其余参数表示“输出列表”。
制 作:方 斌
[案例 3.1] 已知圆半径 radius=1.5,求圆周长和圆面积。
/*案例代码文件名,AL3_1.C。 */
main()
{float radius,length,area,pi=3.1415926;
radius=1.5;
length=2*pi*radius; /*求圆周长 */
area=pi*radius*radius; /*求圆面积 */
printf(“radius=%f\n”,radius); /*输出圆半径 */
printf(“length=%7.2f,area=%7.2f\n”,length,area);
/*输出圆周长、面积 */
}
程序运行结果如下:
radius=1.500000
length= 9.42,area= 7.07
制 作:方 斌
3.2.2 格式字符
1,d或 i格式符:按十进制格式输出。
%d 输出数字长度为变量数值的实际长度
%md 输出 m位 (不足补空格,大于 m位时按实际长度输出 )
%ld,%mld l(小写字母 )表示输出“长整型”数据
%0md,%0mld 0(数字 0)表示位数不足 m时补 0
注,%后面的 m(位数控制 ),0(位数不足补 0)对于其他格式符也适用。
例,(□ 表示空格 )
int i = 123;
long j = 123456;
printf("%d□ 5d□ 05d,□ ld□ 8ld□ 08ld",i,i,i,j,j,j);
123□□□ 123□ 00123,□ 123456□□□ 123456□ 00123456
制 作:方 斌
2,o(字母 )格式符:按无符号八进制格式输出。 (不会出现负数格式 )
3,x格式符:按无符号十六进制格式输出。 (不会出现负数格式 )
4,u格式符:用于输出 unsigned类型数据。
[例 3.2]
main()
{ unsigned int a = 65535;
int b = -2;
printf("a=%d,%o,%x,%u\n",a,a,a,a);
printf("a=%d,%o,%x,%u\n",b,b,b,b);
}
a=-1,177777,ffff,65535
b=-2,177776,fffe,65534
制 作:方 斌
[例 3.2]
main()
{
char c = 'a';
int i = 97;
printf("%c,%d\n",c,c);
printf("%c,%d\n",i,i);
}
运行结果为:
a,97
a,97
5,c格式符:以字符形式输出。例、
char c;
printf("%c",c);
一个整数,若其值在 0~
255范围内,也可以用字符形式输出,在输出前,
将该整数转换为对应的
ASCII字符。反之,一个字符数据也可以用整数形式输出。
制 作:方 斌
6,s格式符:以字符串格式输出。
%s 例,printf("%s","CHINA");
%ms m指定宽度(不足时左补空格,大于时按实际宽度输出)
%-ms 左对齐,不足 m时右补空格
%m.ns 输出占 m个字符位置,其中字符数最多 n个,左补空格
%-m.ns 同上,右补空格
7,f格式符:按实数格式输出。
%f 按实数格式输出,整数部分按实际位数输出,6位小数
%m.nf 总位数 m(含小数点),其中 n位小数
%-m.nf 同上,左对齐制 作:方 斌
[例 3.3]
main()
{
float x,y;
x = 111111.111; y = 222222.222;
printf("%f",x+y);
}
程序输出:
333333.328152(实数运算中误差不可避免)
[例 3.4]
main()
{
double x,y; double x2,y2;
x = 1111111111111.111111111;
y = 2222222222222.222222222;
x2= 1111111111111.111; y2= 2222222222222.222;
printf("%f %f",x+y,x2+y2); /* 13位整数,9位小数 */
}
程序输出:
3333333333333.333010 3333333333333.333010(相同)
制 作:方 斌从 [例 3.3]和 [例 3.4]可以看出:
( 1)实数运算中误差不可避免。
( 2) double(例 3.7)比 float(例 3.6)精度高。
( 3) float实数(单精度)的有效位数是 7位,double实数(双精度)的有效位数是 16位,超过有效位数的输出和输入均无意义。
[例 3.5]
main()
{
float f = 123.456;
printf("%f□□ %10f□□ %10.2f□□ %.2f□□ %-10.2f",f,f,f,f,f);
}
输出结果:
123.455994□□ 123.455994□□□□□□ 123.46□□ 123.46□□ 123.46
制 作:方 斌
8,e格式符:以指数形式输出实数。
%e 输出 13位,其中,1位整数,1位小数点,6位小数,
5位指数(含字符 e和指数的符号)
%m.ne
%-m.ne
9,g格式符:根据数值大小,自动选择 f或 e格式输出。
三、使用注意
%是 printf()的格式说明符,若要直接输出字符 %,在格式控制中使用两个连续的 %。
例、
printf("%f%%",1.0/3)
输出,0.333333%。
制 作:方 斌
[案例 3.6] 类型转换字符 d的使用。
/*案例代码文件名,AL3_2.C。 */
main()
{int num1=123;
long num2=123456;
/*用 3种不同格式,输出 int型数据 num1的值 */
printf("num1=%d,num1=%5d,
num1=%-5d,num1=%2d\n",
num1,num1,num1,num1);
/*用 3种不同格式,输出 long型数据 num2的值 */
printf("num2=%ld,num2=%8ld,
num2=%5ld\n",num2,num2,num2);
printf("num1=%ld\n",num1);
}
制 作:方 斌程序运行结果如下:
num1=123,num1=□□ 123,
num1=123□□,num1=123
num2=123456,num2=□□ 1
23456,num2=123456
num1=16908411
制 作:方 斌
3,数据输入
scanf():从系统标准输入设备 stdin(一般指键盘)
输入数据。
4.5.2 scanf()函数一、一般格式
scanf(格式控制,地址列表 )
作用:按规定格式输入 "地址列表 "是输入信息存放地址的列表,一般是变量地址。
原型定义 stdio.h
制 作:方 斌
例如:
int a,b;
scanf(“%d%d”,&a,&b);
float x,y;
scanf(“%f%e”,&x,&y);
double p,q;
scanf(“%lf%le”,&p,&q);
说明,&是取地址运算符,&a就是取变量 a在内存的地址;
scanf函数中的格式控制符与 printf函数中的格式控制符作用相同。
制 作:方 斌
[例 3.7]
#include "stdio.h" (只有 printf和 scanf函数可以不要头文件 )
main()
{
int a,b,c;
scanf("%d%d%d",&a,&b,&c);
printf("%d,%d,%d\n",a,b,c);
}
运行时按如下方式输入三个值:
3□ 4□ 5↙ (输入 a,b,c的值)
3,4,5 ( printf输出的 a,b,c的值)
制 作:方 斌
( 1) &a,&b,&c中的 &是地址运算符,分别获得这三个变量的内存地址。
( 2) "%d%d%d"是按十进值格式输入三个数值。输入时,在两个数据之间可以用一个或多个空格,tab键、回车键分隔。
以下是合法输入方式:
① 3□□ 4□□□□ 5↙
② 3↙
4□ 5↙
③ 3( tab键) 4↙
5↙
制 作:方 斌二、格式说明与 printf()的格式控制类似。
格式字符 说明
d 用于输入十进制数
o (字母)用于输入八进制数
x 用于输入十六进制数
c 用于输入单个字符
S 用于输入字符串(非空格开始,空格结束,字符串变量以 '\0'结尾)
f 用于输入实数(小数或指数均可)
e 与 f相同(可与 f互换)
格式的附加说明符字符 说明
l(字母 ) 用于长整型数( %ld,%lo,%lx)或 double型实数( %lf,%le)
h 用于短整型数( %hd,%ho,%hx)
域宽 (一个正整数) 指定输入所占列宽
* 表示对应输入量不赋给一个变量制 作:方 斌
3.3.3 通过 scanf函数从键盘输入数据
1,scanf()中不使用 %u说明符。对 unsigned型数据,以 %d,%o、
%x格式输入。
2、可以指定输入数据的列数,系统自动按它截取所需数据。例、
scanf("%3d%3d",&a,&b);
输入 123456↙
系统自动将 123赋给 a,456赋给 b。
3,*格式用于跳过一个数据域,例、
scanf("%2d□ %*3d□ %2d",&a,&b);
输入,12□ 345□ 67↙
12→ a,345被跳过,67→ b。
*主要用于利用现有数据时,跳过某些数据项。
4、输入实数不能规定精度,如、
scanf("%7.2f",&a);
制 作:方 斌三、使用 scanf()函数的注意事项
1,sacnf()中的变量必须使用地址。
int a,b;
scanf("%d,%d",a,b); //Erorr
scanf("%d,%d",&a,&b); //OK
2,scanf()的“格式控制中”,可以使用其它字符,但在输入时必须输入这些相同的字符。
例、
scanf("%d,%d",&a,&b);
输入,3,4 ↙ (逗号与 "%d,%d"中的逗号对应)
例、
scanf("%d□□ %d",&a,&b);
输入,3□□ 4 ↙ (两个或以上空格)
例、
scanf("%d,%d,%d",&h,&m,&s);
输入,12,23,36 ↙ (与格式控制中的冒号对应)
制 作:方 斌例、
scanf("a=%d,b=%d,c=%d",&a,&b,&c);
输入,a=12,b=24,c=36 ↙ ( a=,b=,c=及逗号与格式控制相对应)
3、在用 "%c"输入时,空格和“转义字符”均作为有效字符。
例、
scanf("%c%c%c",&c1,&c2,&c3);
输入,a□ b□ c↙
结果,a→ c1,□ → c2,b→ c3 (其余被丢弃 )
4、输入数据时,遇以下情况结束一个数据的输入:(不是结束该 scanf
函数,scanf函数仅在每一个数据域均有数据,并按回车后结束)。
① 遇空格、“回车”、“跳格”键。
② 遇宽度结束。
③ 遇非法输入。
制 作:方 斌
3.4 复合语句和空语句
在程序中,用 { … } 包含的语句代码就是复合语句
没有任何代码而只有语句结束符,;”的语句就是空语句制 作:方 斌
3.5 程序举例
[例 3.8] 输入三角形的三边长,计算其面积。
设三边长 a,b,c,面积 area的算法是:
制 作:方 斌求平方根函数 sqrt()在 math.h中定义。
#include "math.h"
main()
{
float a,b,c,s,area;
scanf("%f,%f,%f",&a,&b,&c);
s = 1.0/2*(a+b+c);
area = sqrt(s*(s-a)*(s-b)*(s-c));
printf("a=7.2f,b=%7.2f,c=%7.2f\n",a,b,c);
printf("area = %7.2f\n",area);
}
运行情况如下:
3,4,6↙
a= 3.00,b= 4.00,c=6.00
area = 5.33
制 作:方 斌注意:
1、程序设计必须先设计算法、画出框图。
2、设计反应物理量的程序变量。
3、注意使用头文件。( Ctrl+F1的帮助信息中指出了头文件名)。
4、对于实用的程序,必须检查用户(使用程序的人)输入数据的有效性,如本例中,检查输入的边长是否大于零(不能为负或零)。
但本程序仅是示例性的,未作数据有效性检查。
制 作:方 斌
[例 3.9] 求 方程的根。 a,b,c由键盘输入,设算法:
制 作:方 斌程序:
#include "math.h"
main()
{
float a,b,c,disc,x1,x2,p,q;
scanf("a=%f,b=%f,c=%f",&a,&b,&c);
disc = b*b - 4*a*c;
p = -b/(2*a); q = sqrt(disc)/(2*a);
x1 = p + q; x2 = p - q;
printf("\n\nx1=%5.2f\nx2=%5.2f\n",x1,x2);
}
制 作:方 斌
[案例 3.10] 输入任意三个整数,求它们的和及平均值。
/*案例代码文件名,AL3_10.C */
main()
{ int num1,num2,num3,sum;
float aver;
printf(“Please input three numbers:”);
scanf(“%d,%d,%d”,&num1,&num2,&num3); /*输入三个整数 */
sum=num1+num2+num3; /*求累计和 */
aver=sum/3.0; /*求平均值 */
printf("num1=%d,num2=%d,num3=%d\n",
num1,num2,num3);
printf("sum=%d,aver=%7.2f\n",sum,aver);
}
思考题,能否将,aver=sum/3.0;”中,3.0”改为,3”?
制 作:方 斌在顺序结构程序中,一般包括以下几个部分:
1,程序开头的编译预处理命令 。
在程序中要使用标准函数 ( 又称库函数 ),
除 printf()和 scanf()外,其它的都必须使用编译预处理命令,将相应的头文件包含进来 。。
2,顺序结构程序的函数体中,是完成具体功能的各个语句和运算,主要包括:
( 1) 变量类型的说明 。
( 2) 提供数据语句 。
( 3) 运算部分 。
( 4) 输出部分 。
制 作:方 斌良 好 的 源 程 序 书 写 风 格
──顺序程序段左对齐顺序程序段中的所有语句(包括说明语句),
一律与本顺序程序段的首行左对齐。
作业:
3.29 3.30 3.31 3.32 3.33
其他类型的题目请大家自己完全,一定要多做题目。
上机要求:例题和作业,