简单程序设计文档格式.docx
《简单程序设计文档格式.docx》由会员分享,可在线阅读,更多相关《简单程序设计文档格式.docx(12页珍藏版)》请在冰豆网上搜索。
执行语句
}
C的执行语句共有六种:
●表达式语句
●复合语句
●标号语句
●选择语句(if和switch)
●循环语句(while,for,do-while)
●转移语句(break,continue,goto,return)
3.2标准的文件输入与输出函数
一个C的源程序要能够从外部设备(文件)输入数据并将执行(或处理)的结果输出到外部设备上。
C语言的输入和输出操作是通过调用C标准函数库中的函数来实现的,标准函数库是由C编译程序提供的。
以编译后的目标代码形式存储的函数的集合。
用户程序可根据需要按规定的格式调用其中的函数来完成相应的功能。
C语言中从标准输入和输出文件(设备)中进行读(写)的四个标准函数是:
格式输出函数printf、格式输入函数scanf、字符输入函数getchar和字符输出函数putchar。
其他函数以后讲。
3.2.1字符输入和输出函数
1.字符输入函数getchar
函数原型为:
intgetchar(void)
其中int说明函数的返回值的类型,void说明函数没有参数,该函数的调用格式为:
getchar()
系统将输出设备和输入设备都看成文件,标准输入设备(键盘)和标准输出设备(显示器)是由字符的序列(字符流)组成的文本文件,称为输入流和输出流。
getchar每调用一次则从终端(键盘)读取一个字符。
这个字符的字符码就是getchar的返回值(即函数值),其类型为由unsignedchar转换的int。
c=getchar();
执行时键入字符a赋值后变量c的值为97即字符‘a’的值。
输入文件的结束标志称为文件尾。
DOS系统中键入ctrl+z时产生文件结束标志。
getchar遇到文件结束标志时返回值EOF,EOF是在头文件〈stdio.h〉中定义的符号常量,其值通常为-1。
程序中如果要测试getchar()的值是否文件尾应使用EOF而不用-1,这样做可使程序不依赖于某个特定环境。
2.字符输出函数putchar
函数原型为:
intputchar(charch)
putchar函数将所要输出的字符码转换为unsignedchar送到标准输出设备中去,返回值是被输出的字符,如果出错则返回EOF,调用形式为:
putchar(ch)
其中ch为实际参数,可以是char、short或int类型的表达式,其值是要被输出字符的字符码。
每调用一次则将字符c输出到标准输出设备上。
inti=7;
charch;
说明:
(1)下面四个语句是等价的,同为输出一个响铃字符:
putchar(i);
putchar(7);
putchar(‘\07’);
putchar(‘\a’);
(2)下面三个语句分别输出字符a,3和换行
putchar(‘a”);
putchar(‘3’);
putchar(‘\n’);
注:
putchar(3)输出是♥而不是整数3。
(3)putchar(((c=getchar())>
=’a’&
&
c<
=’z’)?
c-‘a’+’A’:
c);
该语句先输入一个字符存入变量c,如果c是小写字母则将其转换成大写字母后输出,否则直接输出原字符。
注意:
凡是程序中调用了输入、输出库函数,必须在函数第一次调用之前写上#include<
stdio.h>
或#include“stdio.h”,预处理控制(对于DOS上的scanf和printf可省略)。
3.2.2格式输出函数(printf)
getchar和putchar函数用于输入和输出单个字符,输入和输出过程中不进行格式上的任何转换。
printf和scanf函数在数据的输入和输出过程中能够将计算机内部形式的数据和输入输出任务上的数据相互转换,称为格式输出和格式输入。
1.printf函数的原型
intprintf(charformat,args)
参数的数目可变,中间用“,”分隔,是要被转换并写到输出设备的数据。
函数的返回值是实际输出字符的数目。
2.调用形式
printf(格式字符串,输出参数1,输出参数2,……,);
调用printf函数时至少要给出第一个参数,即格式字符串。
格式字符串式是用“”括起来的字符串;
输出参数1,…输出参数n是n个表达式,可以为任何基本类型,也可以是指针或枚举类型(较少使用)。
输出数据项的数目任意,末尾加“;
”表示printf函数通常作为语句使用。
printf函数将参数的值按格式字符串规定的格式从内部形式转换成外部字符形式并输出设备,返回值是实际输出字符的数目。
printf("
%d%8.3f"
i,x);
参数中的格式为"
%d%8.3f"
。
i和x是要输出的数据%d表示i要用十进制整数形式输出,宽度为数据实际宽度。
%8.3f表示x要用小数形式浮点数格式输出,输出总宽度为8个字符,其中小数部分保留3位,若i=15,X=-8.2该语句输出为
15-8.200
3.格式字符串
格式字符串包含两种字符:
普通字符和用于转换说明的字符,普通字符照原样输出,转换说明用于说明数据输出格式。
其形式为:
%[域宽]转换字符
一个转换说明以%开头。
域宽部分是可选的,用于指定输出数据的宽度。
每个转换说明对应于一个输出参数,该参数被转换成由转换说明规定的数据格式后输出。
普通字符通常用作输出提示信息,它可以与转换说明交替出现,例如
printf("
i=%d,x=%8.3f\n"
,i,x);
输出为:
i=15,x=-8.200
ANSIC的转换字符及其规定的输出格式见教材p44。
如果%后面是一个%字符,则标准C无此定义,将它作为普通字符输出。
在%和转换字符之间可以加域宽说明,用于指定输出时的对齐方向、输出数据的域宽度、小数部分的位数等要求。
用于域宽说明的字符列于下表中,域宽说明可以是其中之一或多个字符的组合。
表3.1printf域宽说明字符
域宽说明符号
意义
-(减号)
+
空格
0(零)
#
m(正整数)
.(小数点)
n(正整数)
h
l
L
在指定的区域内以左对齐方式输出(默认右对齐)
输出正值时前面冠以符号+
输出的第一个字符不是符号时,要输出一个空格作参照
在域宽范围内用前导0填补空位
对于o格式输出前导0,对于x或X格式要输出0x或0X前缀,对于g或G格式不删除尾部零。
指出输出数据的最小宽度。
如果实际宽度>
m,则按实际宽度;
如果实际宽度<
m,则左边(左对齐时为右边)补上空格或零(当有0域宽说明字符时)。
分隔域宽与精度。
小数点前面可以没有域宽说明。
指出输出数据的精度。
对于e、E、f格式为小数部分的位数,对于g或G格式为有效字的个数,对于整数为至少应输出的数字的个数(添加前导0来满足所需宽度)。
指出输出参数是短整型
指出输出参数是长整型
指出输出参数是高精度浮点型
在域宽说明中还可以使用字符*,*代表一个整型值,这个整型值是由包含*的转换说明对应的参数决定的。
%.*s"
,max,s);
该语句执行时从串s中打印至多max个字符。
域宽说明示例见教材p45
注意
(1):
printf函数根据格式串中的转换说明来决定输出数据的数目和类型,如果转换说明项数多于参数个数,或参数类型不正确,则会输出错误的数据(不报语法错);
如果输出参数的数目多于转换说明项数则多余的参数不被输出。
例.Printf(“%d%d,%d”,3,4);
结果为:
%d,3
例:
inti=-6;
doublex=5.7,y=123.4567;
%-4d,%g"
,i,y,x);
输出形式为:
-6,123.457
(2)printf中参数右结合,如设inti=1;
则printf("
%d,%d,%d"
,++i,++i,++i);
输出结果为4,3,2
,i++,i++,i++);
输出结果为3,2,1
3.2.2格式输入函数(scanf)
1.scanf函数的原型
intscanf(char*format,args)
scanf函数是具有int类型返回值(返回读入参数的个数)的函数。
第一个参数format是格式字符串,它指出输入数据的数目、类型和格式,args为指向存放输入数据的变量的指针,输入参数的数目可变。
2.scanf函数的调用格式
scanf(格式字符串,输入参数1,…输入参数n);
scanf函数是printf函数的逆过程,它从标准输入设备(键盘)读入字符流,并按照格式字符串中转换字符规定的格式转换成相应类型的值后赋予由输入参数所指的变量。
format串可以包含如下字符:
(1)空格或制表符,它们被忽略
(2)非%普通字符,它需要输入流中有同样的非空白字符与之匹配
(3)以%为开头以转换字符为结尾的转换说明符,常见的转换字符与printf类似
(4)在%与转换字符之间可以有下列选项
·
赋值抑制符*
说明最大域宽的整数
指出参数所指变量类型的字母h,l或L
具体形式为:
格式字符与printf中使用方式相同,把输入数据分为整型(int*用d、o、x指定)、字符型(char*,用c指定)、实型(float*,用f,e指定)。
在整型和实型中可再加长度修正说明符:
加h(短整型)、加l(长整型)、加L(高精度型)、m(注意没有n)用以指定输入数据的宽度。
输入参数1至输入参数n可以为简单变量的地址或字符串变量的地址,简单变量的地址用变量前面加取地址运算符&
表示,字符串变量的地址用字符数组名(或指向字符串变量的指针)表示。
scanf函数被正确执行时返回被转换并赋值的数据项的数目,遇到文件尾或出错时返回EOF。
inti;
floatx;
charname[10];
scanf("
%d%f%s"
&
i,&
x,name);
输入:
2561.37e-1program
⏹输入字符串时不加双引号,因双引号也会作为字符号的内容。
⏹不能用赋值语句给数组赋值如:
name="
program"
因为name不是变量而是一个地址常量。
⏹不能将scanf(%d"
i)写成scanf(“%d"
i)也不能将scanf("
%s"
name)写成scanf("
name);
3.输入形式
(1)构成一个被转换数据的字符序列称为一个输入域,输入域为下面三种情况之一。
●以输入流中当前字符开始直到第一个空白字符之前。
●根据转换说明不能被转换的字符之前。
●指定域宽用完。
输入域之间一般可用空白字符(空白、换行、制表符)隔开,整型、浮点型或字符型后的字符型数据不用空白字符分隔(注意字符型数据同样不用单引号),在整型、浮点型或字符型后的字符串数据可以有或无空白符(因为字符串前无前导空白符),当遇到空白符时表示一个字符串结束(见后面内容)。
例1inti;
charc;
%d%c"
执行时输入:
1234a
则i被赋值1234,c为'
a'
.
但若输入1234a,则i值同上,c为'
'
若要读入一个非空白字符了可用下面形式:
scanf("
%d%1s"
1234a,则i为1234,c为'
例2charc1,c2;
%c%c"
c1,&
c2);
输入:
12
则c1为'
1'
c2为'
2'
例3:
intday,year;
charmonth[10];
%d,%s%d"
dat,month,&
year);
执行时输入:
25dec1996
输入流还可以是时下列形式
25Dec1996(回车)
但不能为
25Dec1996
例4.Charname[20];
scanf(“%s”,name);
执行时输入programminglanguage(回车)
则字符串“programming”将被赋予name。
用gets函数时,串中可含有空格,此时以回车键表示输入的结束。
(2)当键入回车时scanf开始执行,当固定格式字符串中的转换说明项或者某个输入域与转换说明项不能匹配时scanf停止执行,返回已成功匹配且被赋值的输入数据个数;
当遇到文件结尾时返回EOF。
当下一次调用scanf时从上一次scanf调用以被匹配转换的最后一个字符的后面那一个字符开始读取。
例1.inti,j;
floatx,y;
j,&
x);
scanf(“%f”,&
y);
执行时输入
123456.789
执行第一个scanf调用时i被赋值为12,j为34,x未被赋值。
Scanf返回值为2;
输入流中的56.7未被读取,该指针处于34后面的第一个空格字符。
执行第2个scanf时,将56.7赋予y,89多余,scanf返回值为1。
转换说明应与输入参数所指变量的类型一致,否则,输入数据不是所需要的结果;
转换说明项个数也应与输入参数个数相同,如果转换说明项个数少于输入参数个数,右边多出的输入参数所指变量将不被赋值,反之,数据不存放。
例2.inti,j;
scanf(“%d%d”,&
j);
执行时输入12a
则i为12,j未被赋值,scanf返回值为1。
(3)当scanf的格式字符串包含有普通字符时,在输入流中相应位置必须有相同的字符与之匹配;
对于空白字符,格式字符串的一个空白字符可以与输入流中0个或多个连续的空白字符匹配;
对于非空白字符的普通字符则要求一一对应。
设i,j,k为int类型。
例1.Scanf(“%d%d%d”,&
k);
执行是应输入
102030
其中10,20,30之间可以是一个或多个空白字符、制表符或换行符。
例2.Scanf(“%d,%d,%d”,&
执行时应输入
10,20,30
其中10,20,30之间必须有且仅有一个逗号。
例3.Scanf(“i=%d;
j=%d;
k=%d”,&
k)
输入应输入
i=10;
j=20;
k=30
4.转换说明中的可选项
scanf转换说明中的可选项有指定域宽的整数:
h、l、L、*。
如果一个输入域前面有空行,scanf全自动跳过空行直到发现输入域。
1指定域宽的整数:
如果说明了域宽,则输入域直到域宽用完时为止。
例1.inti,j;
scanf(“%3d%d”,&
执行时输入12345678。
整数123被赋值i,4被赋值j。
例2.charname[20]
scanf(“%8s”,name);
若输入abcdefghi则字符串“abcdefgh”被赋给数组name。
2h,l,L:
如果参数是short*(而不是int*),则转换字符d、i、n、o、u和x的前面要加h;
如果参数是long*则加l;
如果参数是double*(而不是float*)则转换字符e,f和g的前面要加l;
如果参数是longdouble*,则加L。
例1.shorti;
longj;
doublex;
scanf(%hd%ld”,&
scanf(“%lf”,&
例2.longdoubley;
scanf(“%lf”,&
③*:
如果指定了*,则输入域被跳过,不赋值。
*指出按转换说明匹配相应的输入域。
但转换结果不被赋值给任何变量,因此称为“虚读”。
虚读用于从输入流中有选择的读取部分内容。
doublev1,v2,v3;
scanf(“%lf%*d%lf%*d%lf%*d”,&
v1,&
v2,&
v3);
2233445566
11.0赋予v1,33.0赋予v2,55.0赋予v3;
输入域22,44,66被跳过。
3.3简单程序设计举例
一个简单的c程序仅包含一个main函数且程序流程是顺序结构,程序的执行部分通常含三种基本操作的语句,即输入、输出、赋值语句或用于计算的其他表达式语句。
程序中出现的任何变量必须进行变量说明;
如果有常量最好定义成符号常量;
如果需要将处理结果暂时保存还要说明所须的辅助变量。
例1.从终端输入一个字符,如果是小写字母,则转换成大写后输出,否则原样输出。
#include<
voidmain(void)
{intc;
pintf(“intputacharctor:
”);
c=getcher();
c>
=‘a’&
=‘z’?
putcher(c+‘A’-‘a’):
putchar(c);
putcher(‘\n’);
用putchar和printf输出换行的参数不同,前者是‘\n’而后者是”\n”.
程序中的输入提示很重要,一个没有输入提示的程序在运行时用户不知道何时应输入何值。
例2输入一个字符,输出该字符的字符码、该字符的前导字符(字符码域少1)及后续字符(字符码增1)、字符码。
{intc,c1,c2;
printf(“intputacharctor:
c1=c-1;
c2=c+1;
printf(“Thevalueof‘%c’is%4d\n”,c,c);
printf(“%c:
%d--%c:
%d\n”,c1,c1,c,c,c2,c2);
输入s并回车则输出
Thevalueof‘s’is115
r:
114—s:
115—t:
116
例3输入三个浮点数,找出其中的最大值
{floata,b,c,m;
printf(inputthreenumber:
scanf(“%f%f%f”,&
a,&
b,&
m=(a>
b)?
a:
b;
m=(m>
c)?
m:
c;
printf(“max=%.2f\n”,m);
例4输入无符号短整数k和p,将k的低字节作为结果的高字节,p的低字节作为结果的低字节组成一个新的无符号数。
#include<
main()
{unsignedshortk,p,t;
printf(inputk[hex:
],p[oct.]:
scanf(“%hx%ho”,&
k,&
p);
t=(p&
0xff)|(k&
0377)<
<
8;
/*t为保存结果的辅助变量*/
printf(“new=%hx\n”,t);
作业:
P522.72.102.112.152.172.222.14
P983.53.63.8