第3章顺序结构程序设计本章要点:C语言的语句类型输入/输出函数及其调用3.1C语句概述一、C程序结构C程序源程序文件1源程序文件2源程序文件n••••••预处理命令全局变量声明函数1函数n••••••函数首部函数体局部变量声明执行语句二、C语句概述C语句分类:1.控制语句2.函数调用语句3.表达式语句4.空语句5.复合语句一条完整的C语句必须以“;”结束。“;”是一个语句不可缺少的一部分。1.控制语句:完成一定的控制功能。C有9种控制语句:⑴if()~else~(条件语句)⑵for()~(循环语句)⑶while()~(循环语句)⑷do~while()(循环语句)⑸continue(结束本次循环语句)⑹break(中止执行switch或循环语句)⑺switch(多分支选择语句)⑻goto(转向语句)⑼return(从函数返回语句)2.函数调用语句由一次函数调用加一个“;”构成。如:printf(“HelloWorld!”);函数调用分号3.表达式语句由表达式加上“;”构成。如:x+4*y;算术表达式语句4*7,4+8;逗号表达式语句x=4*7;赋值表达式语句(赋值语句)4.空语句由一个“;”构成。即:;作用:①程序转向点;②什么也不做的循环体。while(i=11);5.复合语句用{}括起的一组语句。如:if(x1x2){y=x1*x1+x2;printf(y=%d,y);}不能省略不能加“;”说明:(1)复合语句中的每一个语句还可以是复合语句;(2)复合语句尽管可由多个语句组合,但它只相当于一个语句,在任何单一语句可以存在的地方,复合语句都可以存在。(3)在复合语句内,不仅可以有执行语句,还可以有定义部分,定义部分应该出现在可执行语句的前面。3.2数据的输出一、数据输入输出的概念计算机的输入输出是以计算机主机为主体而言。输入:从外部通过输入设备(如,键盘、磁盘、光盘、扫描仪等)向计算机输入数据。输出:从计算机向外部设备(如,显示屏、打印机、磁盘等)输出数据。二、数据输入输出在C语言中的实现1.调用输入输出函数实现输入输出操作C语言本身不提供输入输出语句,输入和输出操作是通过调用C语言库函数中输入输出函数来实现的。如:putchar函数——输出字符getchar函数——输入字符printf函数——格式输出scanf函数——格式输入puts函数——输出字符串gets函数——输入字符串1、C语言库函数已被编译成目标文件(二进制形式)2、源程序必须先编译成目标文件。源程序中的输入输出函数等库函数,在编译时并不被翻译成目标指令。3、生成好的目标文件(.OBJ)必须与与系统的函数库(以及其他的目标文件)进行连接,,形成可执行文件(EXE)4、运行EXE文件时,调用已被连接的函数库中的系统函数。2.文件开头应有“#include”命令在调用标准输入输出库函数时,文件开头应有预编译命令:#includestdio.h或#include“stdio.h”其中,stdio.h是“头文件”,包含了与用到的标准输入输出函数有关的信息。系统允许在使用printf和scanf两个函数时可不加“#include”命令。3.3字符数据的输入与输出一、putchar函数(字符输出函数)一般格式:putchar(c)必须有预编译命令∶#includestdio.h功能∶从终端输出一个字符,且转换成ASCII码返回。说明:其中c可以是字符型常量、字符型变量、整型常量、整型变量表达式。一、putchar函数(字符输出函数)例:#includestdio.hmain(){chara,b,c;a=‘B’;b=‘O’;c=‘Y’;putchar(a);putchar(b);putchar(c);putchar(‘\’’);}输出结果:BOY’#include”stdio.h”main(){charc;c=getchar();putchar(c);}a例:一般格式:getchar()——没有参数必须有预编译命令∶#includestdio.h功能∶从终端输入一个字符。a二、getchar函数(字符输入函数)3.5格式输入输出函数printf();scanf();格式字符说明d,i用来输入有符号的十进制整数u用来输入无符号的十进制整数o用来输入无符号的八进制整数x,X用来输入无符号的十六进制整数c用来输入单个字符s用来输入字符串f用来输入实数(小数或指数)e,E,g,G与f作用相同,e与f,g可以互相替换4.5.1printf函数(格式输出函数)功能:向终端输出若干个任意类型的数据。(一)printf函数的一般格式printf(格式控制,输出表列)如果在printf函数调用之后加上“;”,就构成了输出语句。例如:printf(a=%d,b=%d,a,b);举例:main(){inta=3,b=4;printf(“a=%db=%d\n”,a,b);}输出结果:a=3b=4格式说明(格式字符)普通字符输出表列转义字符main(){charc1=‘a’,c2=‘b’,c3=‘c’,c4=‘101’,c5=‘116’;printf(“a%cb%c\tc%c\tabc\n”,c1,c2,c3);printf(“\t\b%c%c”,c4,c5);}aabbccabcAN(二)格式字符对不同类型的数据用不同的格式字符。1.d格式符——用来输出十进制整数。(1)%d:按整型数据的实际长度输出。如:inta=123;printf(“%d”,a);结果:123(2)%md:m为指定的输出字段的宽度。若数据位数小于m,则左端补以空格;若大于m,则按实际位数输出。(3)%ld:输出长整型数据。也可以对长整型数据指定字段宽度。2.o格式符——以8进制数形式输出整数.输出的数值不带符号,即将符号也一起作为八进制数的一部分输出。如:inta=-1;printf(“%d,%o”,a,a);结果:-1,177777o格式符同d格式符一样,可以输出长整型数据,也可以指定字段宽度。11111111111111113.x格式符——以16进制数形式输出整数。同样不会出现负的十六进制数。4.u格式符——以十进制形式输出unsigned型数据如:main(){unsignedinta=65535;intb=-2;printf(“a=%d,%o,%x,%u\n”,a,a,a,a);printf(“b=%d,%o,%x,%u\n”,b,b,b,b);}输出结果:a=-1,177777,ffff,65535b=-2,177776,fffe,655345.C格式符——用来输出一个字符。一个整数,只要它的值在0~255范围内,也可以用字符形式输出,在输出前,将该整数转换成相应的ASCII字符;反之,一个字符数据也可以用整数形式输出。如:main(){charc=‘a’;inti=97;printf(“%c,%d\n”,c,c);printf(“%c,%d\n”,i,i);}输出结果:a,97a,976.s格式符——用来输出一个字符串。(1)%s:按原长度输出字符串。如:printf(“%s”,“CHINA”)输出结果:CHINA(2)%ms:输出的字符串占m列,如字符串本身长度大于m,则突破m的限制,将字符串全部输出,若串长小于m,则左补空格。(3)%–ms:如果串长小于m,则在m列范围内,字符串向左靠,右补空格。(4)%m.ns:输出占m列,但只取字符串中左端n个字符。输出在列的右侧,左补空格。如果nm,则自动取值,即保证个字符正常输出。(5)%–m.ns,其中m、n含义同上,n个字符输出在m列范围的左侧,右补空格。如:printf(“%3s,%7.2s,%.4s,%-5.3s\n”,“CHINA”,“CHINA”,“CHINA”,“CHINA”);输出结果:CHINA,CH,CHIN,CHI7.f格式符——以小数形式输出实数。(1)%f:不指定字段宽度,由系统自动指定,使整数部分全部如数输出,并输出6位小数。注意float型和double型数据的有效位数,如:floatx=123456.123;printf(“%f”,x);输出结果:123456.125000main(){doublex,y;x=1111111111111.111111111;y=1111111111111.111111111;printf(“%f”,x+y);}2222222222222.222170(2)%m.nf:指定输出的数据共占m列,其中有n位小数。若数据长度小于m,则左端补空格。(3)%–m.nf:与%m.nf基本相同,只是使输出的数值向左端靠,右端补空格。如:floatf=123.456;printf(“%10.2f,%-10.2f”,f);输出结果:123.46,123.468.e格式——以指数形式输出实数。(1)%e如:printf(“%e”,123.456);输出结果:1.234560e+0026位3位一般共占13列宽度(2)%m.ne和%–m.ne:m、n和“–”字符含义与前相同。此处n指数据的数字部分(又称尾数)的小数位数。9.g格式符——用来输出实数,它根据数值的大小,自动选f格式或e格式(选择输出时占宽度较小的一种),且不输出无意义的零。如:f=123.468;printf(“%f,%e,%g”,f,f,f);输出如下:123.468000,1.234680e+002,123.46810列13列如:f=123.468;printf(“%f,%e,%g”,f,f,f);输出如下:123.468000,1.234680e+002,123.46810列二、scanf函数(格式输入函数)(一)scanf(格式控制,地址表列)1015main(){inta,b,c;scanf(“%d,%d”,&a,&b);printf(“a=%d,b=%d”,a,b);输入:10,15输出:a=10,b=15ab如:inta,b,c;scanf(“%d%d%d”,&a,&b,&c);输入形式:1017181inta,b,c;scanf(“%d,%d,%d\n”,&a,&b,&c);输入形式:10,11,12scanf(“%3d%3d%c”,&a,&b,&ch);输入形式:123456abc结果:a=123b=456ch=‘a’scanf(“%d%d%c”,&a,&b,&ch);输入形式:123456abc结果:a=123b=456ch=‘a’main(){charc1,c2;scanf(“c1=%c,c2=%c”,&c1,&c2);printf(“%c%c”,c1,c2);}输入数据:c1=a,c2=b输出数据:abmain(){intx,y,z;charch;scanf(“%7.2d%d%d%c”,x,y,z,ch);}main(){intx,y;scanf(“%5d,%3d”,&x,&y);}输入数据:345,567有错吗?1.%后的“*”附加说明符,用来表示跳过它相应的数据。如:scanf(“%2d,%*3d,%2d”,&a,&b);输入:12,456,67结果:a=12b=672.输入数据时不能规定精度。╳Scanf(“%7.2f”,&a);3、scanf(“a=%d,b=%d”,&a,&b);输入:a=12,b=134、scanf(“%c%c%c”,&a,&b,&c);输入:abc空格和转义字符都作为有效字符输入说明:main(){inta,b;floatx,y;charc1,c2;scanf(“a=%db=%d”,&a,&b);scanf(“%f%e”,&x,&y);scanf(“%c%c”,&c1,&c2);printf(“%d,%d,%f,%f,%c,%c”,a,b,x,y,c1,c2);}输入数据:a=10b=201010ab输出数据:10,20,10.00000,20.00000,a,b输入方式2:a=10b=201020abmain(){inta,b;floatx,y;charc1,c2;sc