3.1 本章要点 本章简要介绍了算法的概念、算法的表示方法、结构化程序设计方法和C语句的基本 类型,并重点介绍了C语言的基本输入输出函数的使用,主要内容有: (1)算法的概念:为解决一个问题而采取的方法和步骤,称为“算法”。对于要解决的 问题,可以使用算法来描述出解决问题的方法,然后再编写代码。算法描述常用的有三种方 法:自然语言描述、传统流程图和N-S流程图。 (2)结构化程序设计的思想是:任何程序都可以用三种基本结构表示,即顺序结构、选 择结构和循环结构。由这三种基本结构经过反复嵌套构成的程序称为结构化程序。 (3)C语言的语句可分为以下五类:表达式语句、函数调用语句、控制语句、复合语句、 空语句。要充分理解“复合语句是一个语句组,但在语法上被视为一条语句”这句话的含义。 这里要注意空语句,由一个分号组成,经常被用到空循环体中。 (4)数据的输入与输出。 ①格式输出函数printf。 一般形式:printf(输出格式字符串,输出表列); 输出数据时,要根据要输出数据的类型选择恰当的输出格式符,原则上不可用%d 格式 输出实数,也不可使用%f 格式输出整型数据。printf的输出规则是:将输出格式字符串的 内容是从左往右依次输出,格式控制字符和数据表列的数据一一对应,其他字符按原样 输出。 下面是几种常用的printf格式控制字符 : %md:经常用来输出多个数据,达到间隔数据的目的 。 %m.f:用来限定输出的实数保留几位小数,然后对数据四舍五入之后输出 。 n ②格式输入函数scanf。 一般形式:scanf(输入格式字符串,输入表列)。 需要从键盘输入数据赋值给变量时,使用scanf函数,要根据变量的数据类型选择适当 的格式控制字符,例如,输入数据给整型变量要使用%d,而输入数据给float型变量,要使 用%f 格式,double类型要使用%lf格式,不能交叉使用,否则会出错。 运行程序时,数据的输入方法是:对输入格式字符串的数据,从左往右依次输入,其中 18 格式字符需要输入对应类型的数据,其他字符原样输入,需要特别注意scanf的格式串中最 好不要加转义字符\' n'。 以下是常用的scanf使用方法: scanf("%d%d",&ia,&ib); /*ia、ib 都是int 类型变量,输入时使用空格或回车间隔数据*/ scanf("%f,%f",&f1,&f2); /* f 1、f2 是float 类型变量,输入时使用逗号间隔数据*/ scanf("%lf",&d1); / * d1 是double 类型变量,格式符使用lf*/ ③ 字符输入输出函数getchar、putchar。 getchar函数的使用方法为: 变量=getchar(); /* 从键盘输入一个字符赋值给变量;*/ getchar(); / * 从 键盘输入一个字符,而不赋值给任何变量。*/ putchar函数用来输出一个字符,使用方法为putchar(char),例如: putchar('A'); /*输出字符'A'*/ putchar(67); /*输出ASCII 码值是67 的字符'C'*/ putchar(a); /*输出字符变量a 存储的字符*/ (5)顺序结构程序设计是三种基本结构的一种,其执行方法是从上至下依次执行每一 条语句。 3.2 习题与解析 一、单项选择题(题目中□表示空格。) (1)若有语句:inta,b,c;则下面输入语句正确的是(C )。 A.scanf("%D%D%D",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); 解析:%d不能写成大写形式%D,所以AD错误,选项B中,变量没加上地址符,地址 列表错误。 (2)有以下程序: int main( ) { int a=10,b=20; printf("a+b=%d\n",a+b); /*输出计算结果*/ return 0; } 程序运行后的输出结果是(B )。 A.a+b=10 B.a+b=30 C.30 D.出错 解析:输出语句规则是:除了格式符和转义字符外,其他字符原样输出,所以输出: a+b=输出参数运算结果,将输出参数a+b计算后,输出a+b=30。 19 (3)以下程序段的输出结果是(A )。 int a=1234; printf("%3d\n",a); A.1234 B.123 C.34 D.提示出错,无结果 解析:这是输出格式%md形式,当数据占据少于m 个字符位置时,左补空格,反之全 部输出。1234超出了3个字符位置,全部输出。 (4)设变量均已正确定义,若要通过scanf("%d%c%d%c",&a1,&c1,&a2,&c2);语 句为变量a1和a2赋值10和20,为变量c1和c2赋字符X和Y。以下所示的输入形式中正 确的是(B )。 A.10□X□20□Y↙ B.10X20Y↙ C.10□X↙ D.10X↙ 20□Y↙ 20□Y↙ 解析:使用%c格式输入数据时,输入的空格或回车均作为有效数据给字符变量赋值, 而使用%d输入数据时,遇到空格或回车等字符会自动略掉,所以选项A 中10后的空格会 赋值给变量c1,这样输入的赋值是这样的:10→a1,□→c1,X→a2,□→c2; 同理,选项C的赋值结果是:10→a1,□→c1,X→a2,回车符→c2; 选项D的赋值结果是:10→a1,X→c1,20→a2,□→c2,如果选项D的空格符去掉也 能正确赋值。 (5)已知字符'A'的ASCII代码值是65,字符变量c1的值是'A',c2的值是'D'。执行语句 printf("%d,%d",c1,c2-2);后,输出结果是:(C ) A.A,B B.A,68 C.65,66 D.65,68 解析:输出的两个数据c1和c2-2都是以%d格式输出,所以选项AB均不正确。字符 变量c1以%d输出,结果为c1的ASCII码值65,根据字符ASCII码值表,'D'也就是c2的 ASCII码值是68,所以c2-2为66,答案为C选项。 (6)若有如下语句: int a; float b; 以下能正确输入数据的语句是(C )。 A.scanf("%d%6.2f",&a,&b); B.scanf("%c%f",&a,&b); C.scanf("%d%f",&a,&b); D.scanf("%d%d",&a,&b); 解析:该题考查不同类型变量从键盘输入数据时使用何种格式符。scanf的格式符不 能加精度,所以选项A 不正确;int类型数据的格式符为%d,float类型变量的输入格式符 为%f,所以C正确。 (7)有如下语句: int k1,k2; scanf("%d,%d",&k1,&k2); 20 要给k1、k2分别赋值12和34,从键盘输入数据的格式应该是(B )。 A.12□□34 B.12,34 C.12□□,34 D.%12,%34 解析:该题考查根据scanf格式字符串的形式,从键盘应该怎样输入数据。 格式字符串的两个整数格式%d之间以逗号隔开,所以输入时,两个整数也以逗号隔 开,所以选项A 错误;而逗号必须紧紧跟在数据后面,即数据和逗号之间不能有其他字符, 例如空格,所以C错误;C语言没有百分制常量,%会当做字符来处理,所以D错误。 (8)有如下语句: int m=546, n=765; printf(" m=%5d,n=%6d",m,n); 则输出的结果是(D )。 A.m=546,n=765 B.m=546□□,n=□□□765 C.m=%546,n=%765 D.m=□□546,n=□□□765 解析:546需要3个字符位置,使用%5d输出该数字,左补2个空格;765需要3个字符 位置,使用%6d输出,左补3个空格。故选项D正确。 (9)有如下程序,输入数据25,12,14↙之后,正确的输出结果是(D )。 #include int main( ) { int x,y,z; scanf("%d%d%d",&x,&y,&z); printf("x+y+z=%d\n",x+y+z); return 0; } A.x+y+z=51 B.x+y+z=41 C.x+y+z=60 D.不确定值 解析:根据scanf代码,数据间应以空格或回车间隔,故不能正确赋值。 (10)有以下语句: char c1,c2; c1=getchar(); c2=getchar(); putchar(c1);putchar(c2); 若输入为:a,b↙,则输出为(A )。 A.a, B.a,b C.b,a D.b, 解析:使用getchar函数输入字符时,空格和逗号,回车等都作为有效字符给变量赋值, 所以,赋值结果是:a' '→c1,',' →c2。 (11)有定义:intd;doublef;要正确输入,应使用的语句是(D )。 A.scanf("%f%lf",&d,&f); B.scanf("%ld%ld",&d,&f); C.scanf("%ld%f",&d,&f); D.scanf("%d%lf",&d,&f); 解析:略 (12)根据题目中已给出的数据的输入和输出形式,程序中输入输出的语句的正确内容 21 是(B )。 #include int main( ) { int x;float y; printf("enter x,y:"); /*此处为输入和输出语句*/ return 0; } 输入为:2□3.4输出为:x+y=5.40 A.scanf("%d,%f",&x,&y); printf("\nx+y=4.2f",x+y); B.scanf("%d%f",&x,&y); printf("\nx+y=%.2f",x+y); C.scanf("%d%f",&x,&y); printf("\nx+y=%6.1f",x+y); D.scanf("%d%3.1f",&x,&y); printf("\nx+y=%4.2f",x+y); 解析:输入的两个数字以空格间隔,所以scanf代码中两个格式符中间没有其他符号, 选项A 错误。scanf格式符不可以加m.n,选项D 错误。输出结果保留2位小数,选项C 错误。 (13)已知i、j、k为int型变量,若从键盘输入:1,2,3<回车>,使i的值为1、j的值为2、 k的值为3,以下选项中正确的输入语句是(C )。 A.scanf("%2d%2d%2d",&i,&j,&k); B.scanf("%d%d%d",&i,&j,&k); C.scanf("%d,%d,%d",&i,&j,&k); D.scanf("i=%d,j=%d,k=%d",&i,&j,&k); 解析:键盘输入的3个数以逗号间隔,scanf代码的三个格式符对应也以逗号间隔。选 项C正确。输入仅有3个数据,没有其他字符,选项D错误。 (14)已知inta,b;,用语句scanf("%d%d",&a,&b);输入a,b的值时,不能作为输入 数据分隔符的是(A )。 A.逗号B.空格C.回车D.[Tab]键 解析:格式符中间没有其他字符,输入多个数据时以空格、回车或Tab间隔开。 (15)以下程序不用第三个变量,实现将两个数进行对调的操作,请填空(B )。 #include main() { int a,b; scanf("%d%d",&a,&b); 22 printf("a=%d b=%d",a,b); a=a+b;b=a-b;a= ; printf("a=%d b=%d\n",a,b); } A.a=b B.a-b C.b*a D.a/b 解析:这是两个数对调的另外一种算法。分为三步执行: a=a+b /*a 保存二者之和*/ b=a-b /*和减去b,剩下a,赋给b, b 获取到原来a 的值*/ a=a-b /*和减去b(原来a 值),剩下原来b 的值,给了a*/ (16)下列程序段的输出结果为(C )。 float x=213.82631; printf("%3d",(int)x); A.213.82 B.213.83 C.213 D.3.8 解析:略 (17)设变量定义为"inta,b;",执行下列语句时,输入(D ),则a和b的值都是10。 scanf("a=%d, b=%d",&a, &b); A.1010 B.10,10 C.a=10 b=10 D.a=10,b=10 解析:scanf格式字符串中固定字符在输入时需要原样输入,格式符位置输入一个类型 一致的数字,即这样输入a=10,b=10。 二、阅读程序题 (1)以下程序运行时若从键盘输入:102030↙。输出结果是: 102030 。 #include int main( ) { int i=0,j=0,k=0; scanf("%d%d%d",&i,&j,&k); printf("%d %d %d\n",i,j,k); return 0; } (2)以下程序运行后的输出结果是 88 。 #include int main( ) { int x=0210; printf("%x\n",x); return 0; } 23 三、程序设计题 (1)从键盘上输入两个浮点数,计算和、差、积、商,将结果保留两位小数输出。 参考程序如下: #include int main( ) { double a,b; printf("请输入一个浮点数:\n"); scanf("%lf%lf",&a,&b); printf("%g+%g=%.2f\n",a,b,a+b); printf("%g-%g=%.2f\n",a,b,a-b); printf("%g*%g=%.2f\n",a,b,a*b); printf("%g/%g=%.2f\n",a,b,a/b); return 0; } (2)使用printf函数编写程序,运行时显示如下界面: 参考程序如下: #include int main( ) { printf(" *********************************\n"); printf(" * 学生信息维护子菜单 *\n"); printf(" * 1.新增 *\n"); printf(" * 2.按学号删除 *\n"); printf(" * 3.按学号修改 *\n"); printf(" *********************************\n"); printf(" 请选择:\n"); return 0; } (3)从键盘输入两个字符,并输出它们的后序字符。例如:输入aP,输出bQ。 参考程序如下: #include int main( ) { 24 char ch1,ch2; printf("请输入两个字符:"); ch1=getchar(); ch2=getchar(); printf("%c%c\n",ch1+1,ch2+1); return 0; } 3.3 练习与答案 一、单项选择题 (1)以下程序的输出结果是( )。 #include int main( ) { int k=17; printf("%d,%o,%x\n",k,k,k); return 0; } A.17,021,0x11 B.17,17,17 C.17,0x11,021 D.17,21,11 (2)下面程序的输出结果是( )。 #include int main( ) { int x=10,y=3; printf("%d\n",y=x/y); return 0; } A.0 B.1 C.3 D.不确定的值 (3)若变量已正确说明为float类型,要通过语句scanf("%f%f%f",&a,&b,&c);给 a赋予10.0,b赋予22.0,c赋予33.0,不正确的输入形式是( )。 A.10↙ 22↙ 33↙ B.10.0,22.0,33.0↙ C.10.0↙ 22.033.0↙ D.1022↙ 33↙ 参考答案 25 (4)X、Y、Z被定义为int型变量,若从键盘给X、Y、Z输入数据,正确的输入语句是( )。 A.INPUTX,Y,Z; B.scanf("%d%d%d",&X,&Y,&Z); C.scanf("%d%d%d",X,Y,Z); D.read("%d%d%d",&X,&Y,&Z); (5)若有定义:inta,b;,通过语句scanf("%d;%d",&a,&b);若是把整数3赋给变量 a,5赋给变量b,则正确的输入数据方式是( )。 A.35 B.3,5 C.3;5 D.35 (6)以下不能输出字符'A'的语句是( )。(注:字符'A'的ASCIl码值为65,字符'a'的 ASCIl码值为97) A.printf("%c\n",a' -'32); B.printf("%d\n",'A'); C.printf("%c\n",65); D.printf("%c\n",B' -'1); (7)有程序如下: #include int main( ) { char a,b,c,d; scanf("%c%c",&a,&b); c=getchar(); d=getchar(); printf("%c%c%c%c\n",a,b,c,d); return 0; } 当执行程序时,按下列方式输入数据: 12↙ 34↙ 则输出结果是( )。 A.1234 B.12 C.12↙3 D.12↙34 (8)有输入语句:scanf("a=%d,b=%d,c=%d",&a,&b,&c);为使变量a的值为1, b为3,c为2,从键盘上输入数据的正确形式应是( )。 A.132↙ B.1,3,2↙ C.a=1□b=3□c=2↙ D.a=1,b=2,c=3↙ (9)已有程序段和输入数据的形式,程序中输入语句的正确形式应当为( )。 #include int main( ) { int a;float f;printf("\nInput number:"); /*此处为输入语句*/ printf("\nf=%.2f,a=%d\n",f,a); return 0; } 输入的数据为4.5↙2↙,输出结果为f=4.50,a=2。 A.scanf("%d,%f",&a,&f); B.scanf("%f,%d",&f,&a); 26 C.scanf("%d%f",&a,&f); D.scanf("%f%d",&f,&a); 二、阅读程序题 (1)阅读下面的程序,其输出结果是。 #include int main( ) { int i; long a; float f; double d; i=f=a=d=20/3; printf("%d %ld %3.1f %3.1f\n",i,a,f,d); return 0; } (2)阅读下面的程序,其输出结果是。 #include int main( ) { float a; int b; a=b=24.5/5; printf("%f,%d\n",a,b); return 0; } (3)运行下面程序,观察输出结果。 #include int main( ) { int a,b,c; long int u,n; float x,y,z; char c1,c2; a=3;b=4;c=5; x=1.2;y=2.4;z=-3.6; u=51274;n=128765; c1='a';c2='b'; printf("\n"); printf("a=%2d b=%2d c=%2d\n",a,b,c); printf("x=%8.6f,y=%8.6f,z=%9.6f\n",x,y,z); printf("x+y=%5.2f y+z=%5.2f z+x=%5.2f\n",x+y,y+z,z+x); printf("u=%ld n=%ld\n",u,n); printf("c1='%c' or %d(ASCII)\n",c1,c1); printf("c2='%c' or %d(ASCII)\n",c2,c2); return 0; } (4)运行下面程序,观察输出结果。 #include 参考答案 27 int main( ) { int a=5,b=7; float x=67.8564,y=-789.124; char c='A'; long n=1234567; unsigned u=65535; printf("%d%d\n",a,b); printf("%3d%3d\n",a,b); printf("%f,%f\n",x,y); printf("%10f,%10f\n",x,y); printf("%8.2f,%8.2f,%.4f,%.4f,%3f,%3f\n",x,y,x,y,x,y); printf("%e,%10.2e\n",x,y); printf("%c,%d,%o,%x\n",c,c,c,c); printf("%ld,%lo,%x\n",n,n,n); printf("%u,%o,%x,%d\n",u,u,u,u); return 0; } (5)用下面的scanf函数输入数据,问在键盘上应如何输入才能使a=3,b=7,x=8.5, y=71.82,c1='A',c2='B'。 #include int main( ) { int a,b; float x,y; char c1,c2; scanf("a=%d b=%d",&a,&b); scanf("%f %e",&x,&y); scanf(" %c %c",&c1,&c2); printf("a=%d,b=%d\n",a,b); printf("x=%f,y=%f\n",x,y); printf("c1=%c,c2=%c\n",c1,c2); return 0; }