第3章 顺序结构 本章首先介绍C语言的语句,之后详细讨论C语言中输入输出函数的使用 方法和规则,通过程序案例使读者理解什么是顺序结构程序。 本章学习目标 (1)了解输入输出函数的使用方法。 (2)掌握输入输出格式控制方法。 (3)掌握应用顺序结构程序解决问题的方法。 第3章案例代码 3.1 顺序结构简介 ●1.语句 C语言程序是以函数为基本单位的,函数是由一个一个的C语句构成。C语句必须 以分号结束。 C语言的语句主要分为以下6类。 (1)说明语句。说明语句一般用来定义变量数据类型等。例如: int a=5,b; float f1,f2; (2)表达式语句。表达式语句是指由一个C表达式加上分号构成的语句。例如: a=b+1; /*赋值表达式a=b+1 加上分号*/ i=1,j=2; /*逗号表达式i=1,j=2 加上分号*/ i++; /*表达式i++加上分号*/ (3)函数调用语句。函数调用语句是由一个函数调用加上分号。例如: printf("\n"); srand(time(NULL)); 这类语句也可以归属于表达式语句,因为函数调用本身也是一个表达式。 (4)空语句。空语句是仅由一个分号构成的语句,没有任何动作。例如: ; (5)复合语句。复合语句是指将一组语句用大括号({})括起来,从而使整个大括号 变成一个整体(复合语句)。整体上看,复合语句是一个语句。例如: { a=5; b=6; c=7; } 复合语句在C语言程序中的用处很大,在以后的学习中大家会逐渐体会到。有的书 中也将复合语句称为分程序或语句块。 (6)控制语句。控制语句完成一定的控制功能,实现程序流程的跳转。C语言提供 的控制语句有: ·56· goto 无条件转向语句 if( ) … else … 选择语句 switch( ){ } 多分支选择语句 while( ) 循环语句 for( ) 循环语句 do{ }while() 循环语句 break 循环控制语句 continue 循环控制语句 return 从函数返回语句 ●2.顺序结构案例 顺序结构是最简单的程序结构,也是最常见的程序结构。顺序结构程序的执行顺序 是自上而下,依次执行。之前章节中编写的所有程序都是顺序结构。 案例03-01-01 考考你 案例代码03-01-01.c #include <stdio.h> #include <stdlib.h> #include <time.h> int main(){ int a,b,c,d,r; srand((unsigned)time(NULL)); printf("*********两位数四则运算测试*********\n"); printf("请输入以下算式的结果:\n"); a=rand()%89+11; b=rand()%89+11; c=rand()%4+1; (c==1)? ( printf("%d+%d=",a,b),d=a+b):1; (c==2)? ( printf("%d-%d=",a,b),d=a-b):1; (c==3)? ( printf("%d*%d=",a,b),d=a*b):1; (c==4)? ( printf("%d/%d=",a,b),d=a/b):1; scanf("%d",&r); printf(d==r? "答对了,你真棒!":"真对不起,你答错了!"); return 0; } 程序分析: 此例程序是顺序结构的程序,程序从第一条语句开始,依次向下一条一条语句执行, 直到最后一个语句。请运行并分析此程序的功能。 案例拓展考考计算机 请仿照以上案例编写顺序结构的程序,请设计由你输入一个加法或减法算式,然后由程 序输出这个算式的结果。例如,你输入1+2时,程序输出3;你输入10-6时,程序输出4。 ·57· 3.2 标准输入输出函数 C语言数据的输入输出都是通过函数调用实现的。标准函数库stdio.h中包括标准 输入输出函数scanf()和printf(),以及字符输入输出函数getchar()和putchar()等,使用 这些函数的C程序中,应该在程序的开头处加上下面的编译预处理命令: #include<stdio.h> ●1.标准格式输出函数printf() 标准格式输出函数printf()一般用于向标准输出设备(显示器)按规定的格式输出信 息。调用printf()函数的一般形式为: printf(格式控制字符串,输出值参数列表); 功能说明: (1)格式控制字符串是一串用双引号括起来的字符,其中包括普通字符和格式转化 说明符。格式转化说明符以%开头,后跟一个或几个规定字符,简称格式说明符。一个格 式说明符用来代表一个输出的数据,并规定了该数据的输出格式。 例如,在语句:printf("a=%d,b=%d",a,b);中,字符串"a=%d,b=%d"是格式控 制字符串。a,b是输出值参数列表。在格式控制字符串"a=%d,b=%d"中,a=和b=是 普通字符,%d是格式说明符。 (2)格式控制字符串中的普通字符要按原样输出。 (3)一个格式说明符用来代表一个输出的数据,所代表的数据在输出值参数列表中。 输出值参数列表是一系列用逗号分开的表达式,表达式的个数和顺序与前面的格式说明 符要一一对应。 例如,有inta=3,b=8;,则执行以下语句:printf("a=%d,b=%d",a,b);输出结果 是:a=3,b=8。 ●2.格式说明符 不同类型的数据在输出时应该使用不同的格式说明符。C语言提供的格式说明符及 其含义见表3-1。 表3-1 C语言提供的格式说明符及其含义 格式说明符所代表的数据类型;输出形式 %d int型;十进制有符号整数,正数符号省略 %ld long型;十进制有符号长整数,正数符号省略 ·58· 续表 格式说明符所代表的数据类型;输出形式 %u int型;十进制无符号整数 %o int型;无符号八进制整数,不输出前导0 %x,%X int型;无符号十六进制整数,不输出前导0x %#o、%#x、%#X 八进制和十六进制整型数据的输出须加上前导0或0x或0X %c int型(char型);一个字符 %f float型;十进制小数,默认小数位数为6位 %lf double型;十进制小数,默认小数位数为6位 %e double型;指数形式,输出浮点数 %g double型;自动在%f和%e之间选择输出宽度小的表示法,且不输出小数末 尾的0 %s 字符串;顺序输出字符串的每个字符,不输出\' 0' %% %本身 说明: (1)在"%"和字母之间加上一个整数表示最大场宽,即输出数据在输出设备(屏幕) 所占据的最大宽度(字符个数)。例如: %3d 表示输出场宽区为3的整数,若不够3位,则右对齐,左补空格。 %8s 表示输出8个字符的字符串,若不够8个字符,则右对齐,左补空格。 (2)在"%"和字母之间加上一个由'.'分隔的两个整数(例如%9.2f),前一个整数表示 最大场宽,后一个整数表示小数位数。例如: %9.2f表示输出场宽为9的浮点数,其中小数位为2,小数点占1位,整数部分自然只 余下6位,若整数部分不够6位,则右对齐,左补空格。 (3)如果数据的实际值超过所给的场宽,则将按其实际长度输出。但是,对于浮点 数,若整数部分位数超过给定的整数位宽度,则将按实际整数位输出,若小数部分位数超 过给定的小数位宽度,则按给定的宽度以四舍五入输出。 (4)如果想在输出数据前补0来补足场宽,就应在场宽前加0。例如,%04d表示在 输出一个小于4位的整数时,将在前面补0,使其总宽度为4位。 (5)如果用类似6.9的形式表示字符串的输出格式(如%6.9s),那么小数点后的数字 代表最大宽度,小数点前的数字代表最小宽度。 例如,%6.9s表示输出一个字符串,其输出所占的宽度不小于6且不大于9。若字符 个数小于6,则左补空格补至6个字符;若字符个数大于9,则第9个字符以后的内容将不 被显示。 (6)控制输出的数据是左对齐或右对齐。方法是:在"%"和字母之间加入一个"-"号 说明输出为左对齐,否则为右对齐。例如: %-7d 表示输出整数占7位场宽,若不足7位,则左对齐,右补空格 %-10s表示输出字符串占10位场宽,若不足10位,则左对齐,右补空格 ·59· 案例03-02-01 使用格式说明符输出数据 案例代码03-02-01.c #include <stdio.h> int main(){ int a=1234, i; char c; float f=3.141592653589; double x=0.12345678987654321; i=12; c='\x41'; printf("\n01.a=%d.", a); printf("\n02.a=%6d.", a); printf("\n03.a=%06d.", a); printf("\n04.a=%2d.", a); printf("\n05.a=%-6d.",a); printf("\n06.f=%f.", f); printf("\n07.f=%6.4f.", f); printf("\n08.x=%lf.",x); printf("\n09.x=%18.16lf.", x); printf("\n10.c=%c.", c); printf("\n11.c=%x.", c); printf("\n12.%s." ,"ABCDEFGHIJK"); printf("\n13.%4s." ,"ABCDEFGHIJK"); printf("\n14.%14s.","ABCDEFGHIJK"); printf("\n15.%-14s.","ABCDEFGHIJK"); printf("\n16.%4.6s.","ABCDEFGHIJK"); return 0; } 执行程序,输出: 案例拓展格式说明代码分析 请分析以下程序的输出结果,并理解相关格式说明符的功能。 ·60· #include <stdio.h> int main(){ int a=1234; printf("\n01.a=%d.a=%#d", a,a); printf("\n02.a=%o.a=%#o", a,a); printf("\n03.a=%x.a=%#x", a,a); printf("\n05.a=%-8X.a=%#8X", a,a); printf("\n06.a=%08X.a=%#08X", a,a); return 0; } ●3.标准格式输入函数scanf() C语言中的标准格式输入函数是scanf(),功能为:从标准输入设备(键盘)上读取用 户输入的数据,并将输入的数据赋值给相应的变量。 调用输入函数scanf()的一般形式为: scanf(格式控制字符串,变量地址列表) 功能说明: (1)格式控制字符串是用来规定以何种形式从输入设备上接收数据,也就是规定用 户以何种格式输入数据。格式控制字符串中包含以下三种字符。 ① 格式说明符:这里的格式说明符与printf()函数中的格式说明符基本相同,一个 格式说明符代表一个输入的数据。 ② 空白字符:空白字符会使scanf()函数在读取数据时略去输入数据中的一个或多 个空白字符。空白字符包括空格、回车和制表符(Tab键)。 ③ 普通字符:在输入数据时普通字符要原样输入。 (2)变量地址列表是用逗号分隔的变量地址,与格式说明符一一对应。取变量地址 的运算符为&。 (3)函数从前向后读取数据,如果突然读到非法数据,则函数结束,程序会往下运行 并不报错。但从遇到非法数据的变量开始,以后的变量将得不到输入的值,通常它们的值 是随机的(内存中原有的值)。 (4)格式说明中也可以规定场宽,用来表示接收数据的最大位数。 (5)读取某个具体整型或实型数据时,遇到第一个不是空白的字符便开始,遇到下列 情况时认为该数据结束:空白字符、达到指定宽度、非法输入。 案例03-02-02 使用格式说明符输入整数 案例代码03-02-02.c #include <stdio.h> int main(){ int a,b,c,d; scanf("%d%d",&a,&b); ·61· scanf("%d,%d",&c,&d); printf("a=%d,b=%d,c=%d,d=%d\n",a,b,c,d); printf("a+b+c+d=%d",a+b+c+d); return 0; } 执行程序输入: 12□34□56,78 ↙(□表示一个空格,↙表示一个回车,下同) 程序输出: a=12,b=34,c=56,d=78 a+b+c+d=180 程序分析: scanf("%d%d",&a,&b);语句中,"%d%d"的意义是:首先读取一个整数赋给变量a, 然后忽略若干空白字符(空格、回车、TAB),最后再读入另一个整数赋给变量b。 scanf("%d,%d",&c,&d);语句中,"%d,%d"的意义是:读一个整数赋给c,再读一 个逗号,再读一个整数赋给变量d,逗号作为普通字符要原样读入。 再次执行该程序,输入: 12□34□56□78 ↙ 程序输出: a=12,b=34,c=56,d=32767 a+b+c+d=32869 程序分析: 简单地说,当读完整数56并赋给变量c之后,程序要求读一个逗号,而此时输入数据 (输入流)中剩下的第一个字符是空格,所以scanf()函数因发生内部错误而结束,变量d 并没有得到赋值,它的值是不可预期的(内存中原有的值)。 案例拓展使用格式说明符输入实数 请编程输入4个实数,并输出它们的方差,结果保留4位小数。请注意格式说明符 %lf的使用。(提示:方差是各个数据与平均数之差的平方的平均数) ●4.字符型数据输入输出 通过scanf()函数输入数据时,用户从键盘上输入的一串字符,可以看作一个字符流, 程序从该字符流中依次读取数据。 当用scanf()函数输入字符数据时,如果格式说明符%c前面没有空格,则输入流中的 空白字符将会被当作一个字符读走;如果格式说明符%c前面有空格,则输入流中的空白 ·62· 字符将会被忽略,从而读取下一个非空白字符。 C语言还提供了以下专门的字符输入输出函数。 字符输出函数putchar(表达式c)的功能是在标准输出设备(显示器)上输出一个字 符,表达式c的值为将要输出的字符或其ASCII码。 字符输入函数getchar()的功能是从标准输入设备(键盘)上读入一个字符,返回值为 读入的字符(ASCII码)。 案例03-02-03 读取字符 案例代码03-02-03.c #include <stdio.h> int main(){ int a1,a2; char c1,c2; scanf("%d%c",&a1,&c1); scanf("%d %c",&a2,&c2); printf("a1=%d,c1=%c,c1=%d\n",a1,c1,c1); printf("a2=%d,c2=%c,c2=%d\n",a2,c2,c2); return 0; } 执行程序,输入: 5□□□6□□□A□↙ 输出: a1=5,c1= ,c1=32 a2=6,c2=A,c2=65 程序分析: 语句scanf("%d%c",&a1,&c1);在正确读入整数5给a1后,又读取到输入流中的 字符空格给c1。 语句scanf("%d%c",&a2,&c2);在正确读入整数6给a2后,由于格式说明符%c前有 一个空格,所以忽略掉若干空白字符后,读取到输入流中的第一个非空白字符A给c2。 案例拓展字符输入分析 对于以上案例,请分析以下输入时的执行结果,积极思考并参与研讨。 输入样例1: 5,6. 输入样例2: □□□5678□□□90 ·63· ●5.从输入流中跳过某些数据 字符'*'用于格式说明中(例如%*d),表示在输入流中读入数据后不做赋值处理,直 接忽略。 案例03-02-04 某些输入被忽略 案例代码03-02-04.c #include<stdio.h> int main(){ int a,b; scanf("%d%*d%*2d%d",&a,&b); printf("a=%d,b=%d",a,b); return 0; } 执行程序,输入: 123 4 56789 ↙ 输出: a=123,b=789 程序分析: 格式说明"%d%*d%*2d%d"的含义是:先读1个整数123给a,再读1个整数4 忽略,再读1个2位整数56忽略,再读整数789给b。 对于上例程序,再次执行程序,输入:123 45 6 789↙,同样输出:a=123,b=789。 请分析执行结果。 案例拓展输入定制 输入数据是一大串数字,要求读取五个数,但要求只处理其中的第1、3、5个数,输出 这三个数的和。第一个数只读1位数,第二个数只读2位数,第三个数只读3位数,第四 个数只读4位数,第五个数只读5位数。 输入样例: 1234567890123456789 输出样例: 12802 (注:实际为1+456+12345 的和) ●6.scanf()函数的返回值 scanf()函数有返回值,具体为成功读入数据的个数。如果开始读入数据时就遇到 ·64· “文件结束”(后面没有数据了,在线评测时非常有用),则返回EOF(-1)。 案例03-02-05scanf()函数的返回值 案例代码03-02-05.c #include<stdio.h> int main(){ int a,b,s; s=scanf("%d%d",&a,&b); printf("a=%d,b=%d,s=%d",a,b,s); return 0; } 执行程序,几组输入输出结果如下: 输入样例1: 23 54 89 ↙ 输出样例1: a=23,b=54,s=2 输入样例2: 23,54 ↙ 输出样例2: a=23,b=5064,s=1 输入样例3: X23A54 ↙ 输出样例3: a=356,b=5064,s=0 输入样例4: ^Z^Z ↙ 输出样例4: a=1,b=0,s=-1 程序分析: 第1组输入数据,程序成功读入两个数据,scanf()函数的返回值为2; 第2组输入数据,程序成功读入一个数据,scanf()函数的返回值为1。变量b没有读 到数据,其值是不确定的,也是没意义的; 第3组数据没有读入成功,scanf()函数的返回值为0。变量a和b没有读到数据,其 值是不确定的,也是没意义的; 第4组数据中输入的是两次CTRL+Z,CTRL+Z在Windows操作系统中表示文件 结束符(输入流结束,通常按两次才好使)。因为读第一个数据时就遇到了文件结束符,输 入流中无数据可读,所以此时scanf()函数的返回值为-1,变量a和b没有读到数据,其 值是不确定的,也是没意义的。 案例拓展输出几个数的和 编程输入最少1个最多不超过4个整数,输出它们的和。 输入样例1:5 6 7 8 输出样例1:26 输入样例2:1 5 输出样例2:6 输入样例3:1 5 4 输出样例3:10 输入样例4:5 输出样例4:5 温馨提示:输入数据时可以在最后一个数据后输入CTRL+Z两次,再按回车键表示 输入流结束。请使用条件运算符完成不同情况的判断。 ·65· 3.3 顺序结构的应用 案例03-03-01 统计三个数 编程输入三个整数,输出这三个整数的和及平均值。 这是一个比较简单的问题,但请读者朋友注意三个整数的平均值可能是一个实数,所 以在定义变量时,要将代表平均值的变量定义成浮点数。程序如下: 案例代码03-03-01.c #include<stdio.h> int main(){ int num1,num2,num3,sum; double 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=%lf\n",sum,aver); return 0; } 执行程序,在提示信息后输入: Please input three numbers:11 12 13 ↙ 输出: num1=11,num2=12,num3=13 sum=36,aver=12.000000 案例03-03-02 三角形面积 输入三角形的三边长a、b、c,输出其面积s(假设用户输入的a、b、c 可以构成三 角形)。 已知三角形的三边长,可以利用海伦公式计算它的面积。设三角形的三边长分别为a、 b 和c,p=(a+b+c) 2 ,则计算该三角形面积的海伦公式为s= p(p-a)(p-b)(p-c)。 由此,就能得到以下程序。 案例代码03-03-02.c #include<stdio.h> #include<math.h> int main(){ ·66· double a,b,c,p,s; scanf("%lf%lf%lf",&a,&b,&c); p=(a+b+c)/2.0; s=sqrt(p*(p-a)*(p-b)*(p-c)); printf("s=%lf",s); return 0; } 执行程序,输入: 3 4 5 ↙ 输出: s=6.000000 再次执行程序,输入: 6 8 10 ↙ 输出: s=24.000000 因为在程序中使用了开平方的函数sqrt(),所以要在程序开始处加上预处理命令# include<math.h>。 案例03-03-03 一元二次方程的两个根 输入一元二次方程的三个系数a、b、c 的值,输出其两个根(假设方程有实根)。 一元二次方程的求根公式大家一定不陌生,请先编写解决该问题的程序,通过上机运 行检验程序的正确性,然后再和下面的程序对比,相信读者朋友们一定会很快地掌握和理 解这一问题。 案例代码03-03-03.c #include<stdio.h> #include<math.h> int main(){ double a,b,c,deta,x1,x2; scanf("%lf %lf %lf",&a,&b,&c); deta=b*b-4*a*c; x1=(-b+sqrt(deta))/(2*a); x2=(-b-sqrt(deta))/(2*a); printf("\nX1=%lf\nX2=%lf",x1,x2); return 0; } ·67· 执行程序,输入: 1 4 3 ↙ 输出: X1=-1.000000 X2=-3.000000 执行程序,输入: 1 2 1 ↙ 输出: X1=-1.000000 X2=-1.000000 程序分析: 对于上面的程序,请大家一定要注意避免经常有人会犯的一个错误,那就是将求根的 语句写成: x1=-b+sqrt(deta)/2*a; x2=-b-sqrt(deta)/2*a; 请大家分析一下,这样书写程序,会得到正确的结果吗? 应该怎样避免出现此类错 误呢? 案例03-03-04 倒序4位数 输入一个4位的正整数,倒序输出。 关于这个问题,可以这样考虑:要想倒序输出一个整数,需要知道这个整数的每位数 字是多少,然后将这些数字倒序输出就可以了。可以在输入语句中依次读入每一位数字, 程序如下: 案例代码03-03-04-A.c #include<stdio.h> int main(){ int a,b,c,d; scanf("%1d%1d%1d%1d",&a,&b,&c,&d); printf("\n%d%d%d%d",d,c,b,a); } 执行程序,输入: 1234 ↙ ·68· 输出: 4321 再次执行程序,输入: 1 23 4567 ↙ 输出: 4321 可以看出,通过输入4个1位正整数实现输入一个4位正整数,所以才会出现后一种 输入输出结果。 也可以采取一次读取整个4位整数,然后通过运算处理得到它的各个数位上的数字。 案例代码03-03-04-B.c #include<stdio.h> int main(){ int n,a,b,c,d; scanf("%d",&n); /* 输入整数 */ a=n/1000; /* 取得千位数字 */ b=n%1000/100; /* 取得百位数字 */ c=n%100/10; /* 取得十位数字 */ d=n%10; /* 取得个位数字 */ printf("%d%d%d%d",d,c,b,a); return 0; } 执行程序,输入: 1234 ↙ 输出: 4321 执行程序,输入: 2500 ↙ 输出: 0052 执行程序,输入: ·69· 123 4 ↙ 输出: 3210 此程序一次性读取一个完整的4位整数,通过取余数和除法操作的解析方法取得各 位数字(1位数),最后反序一位一位输出。 也可以根据解析出的4位数字构造一个新的4位数,然后输出(见下例)。 案例代码03-03-04-C.c #include<stdio.h> int main(){ int n,a,b,c,d; scanf("%d",&n); /* 输入整数 */ a=n/1000; /* 取得千位数字 */ b=n%1000/100; /* 取得百位数字 */ c=n%100/10; /* 取得十位数字 */ d=n%10; /* 取得个位数字 */ n=d*1000+c*100+b*10+a; /* 重新组合成一个新的4 位数 */ printf("\n%04d",n); /* 输出结果,若不足4 位,则前补0 */ return 0; } 程序执行结果同上例,请读者自行试验其他输入输出案例。 关于如何取得一个整数的各位数字,本程序中已经给读者做出了示范,这一应用技巧 在以后还会多次用到,请大家一定掌握。 案例03-03-05 大小写转换 输入一字母(大写或小写),输出其对应的另一字母(小写或大写)。 案例分析: 字符型数据和整型数据可以混合运算。一个字符其实就是一个整数,在数值上等于 它的ASCII码。而一个大写字符的ASCII码和其对应的小写字符的ASCII码总是相差 32。输入一个字符后,在输出结果以前应该首先判断它是否为一个大写字符,如果是,则 输出它加上32后的值;如果不是,则输出它减去32后的值(前提是用户输入的必须是字 母)。具备判断功能的运算符只有条件运算符,所以得到如下程序: 案例代码03-03-05.c #include<stdio.h> int main(){ char n; n=getchar(); putchar(n>=65&&n<=65+25? n+32:n-32); return 0; } ·70· 执行程序,输入: ABCD ↙ 输出: a 执行程序,输入: abcd ↙ 输出: A 案例03-03-06 辛巳蛇宝男 2001年01月24日是农历辛巳蛇年的春节(大年初一),2002年02月11日是辛巳蛇 年的除夕。赵中瑞同学的生日是2002年01月07日,所以称他为“辛巳蛇宝男”,赵中瑞 想知道还有谁和他一样是“辛巳蛇宝男”,试帮他找出来。 输入格式:一行中给出一个中华人民共和国的二代身份证号和姓名,中间没有空格。 注意:身份证号倒数第2位若为奇数,则为男生;若为偶数,则为女生。为保密,样例中的 身份证号前6位统一设为239999。 输出格式:若是“辛巳蛇宝男”,则输出YES,否则输出NO。 输入样例1:239999200003132617 于龙 输出样例1:NO 输入样例2:239999200002210832 杨冰 输出样例2:NO 输入样例3:239999200201131429 张玮娜输出样例3:NO 输入样例4:239999200201210017 刘哲 输出样例4:YES 案例代码:03-03-06.c #include<stdio.h> int main(){ int t,date,y; scanf("%*6d%8d%*2d%1d",&date,&y); printf( date>=20010124&&date<=20020211&&y%2==1? "YES":"NO" ); return 0; } 案例03-03-07X 在哪里 X同学是好学生。他每天严格按作息时间过着“宿舍—食堂—教室”三点一线的生 活。他早6点前,晚6点后在宿舍学习,早上6点至7点、中午12点至1点、下午5点至6 点在食堂吃饭,其余时间在教室上课。你知道X 现在在哪里吗? (不许用if语句和 switch语句) ·71· 输入格式:一行中给出当天的一个时间点,形如:HH:MM:SS,HH 表示小时,MM 表示分,SS表示秒,全天时间采用24小时制表示。 输出格式:根据不同情况,输出一行文本,若确定在宿舍,则输出dormitory;若确定 在食堂,则输出canteen;若确定在教室,则输出classroom;两段时间交接处不确定在哪里 时,则输出ontheway。 输入样例1:20:10:20 输出样例1:dormitory 输入样例2:06:00:00 输出样例2:on the way 输入样例3:08:00:00 输出样例3:classroom 输入样例4:17:30:00 输出样例4:canteen 案例代码:03-03-07.c #include<stdio.h> int main(){ int h,m,s,t; scanf("%d%*c%d%*c%d",&h,&m,&s); t=h*10000+m*100+s; t>60000&&t<70000 || t>120000&&t<130000 || t>170000&&t<180000 ? printf("canteen"):0; t>70000&&t<120000 || t>130000&&t<170000 ? printf("classroom"):0; t<60000 || t>180000 ? printf("dormitory"):0; t==60000||t==70000||t==120000||t==130000||t==170000||t==180000 ? printf("on the way"):0; return 0; } 案例03-03-08 日期格式化 世界上不同国家有不同的写日期的习惯。例如,美国习惯写成“月-日-年”,而中国习惯 写成“年-月-日”。于龙同学在写一些日期时不小心把年份写错位置了,可能在最前,可能在 中间,也可能在最后。请写一个程序,自动把读入的于龙日期改写成中国习惯的日期。 输入格式:在一行中按照“mm-dd-yyyy”或“mm-yyyy-dd”或“yyyy-mm-dd”的格式给 出年、月、日。题目保证给出的日期是1900年元旦至今合法的日期,保证月在前日在后, 保证年份是4位数。 输出格式:在一行输出正确的中国人习惯的日期格式,要求月份和日期都用2位输 出,若不足2位,则前补0。 输入样例:5-1-2019 输出样例:2019-05-01 输入样例:11-2019-05 输出样例:2019-11-05 案例代码03-03-08.c #include<stdio.h> int main(){ int a,b,c,y,m,d; ·72· scanf("%d%*c%d%*c%d",&a,&b,&c); a>=1000? (y=a,m=b,d=c): b>=1000? (y=b,m=a,d=c): (y=c,m=a,d=b); printf("%4d-%02d-%02d",y,m,d); return 0; } 习题3 一、单项选择题 1.C语言的程序在编写源文件时, 。 (A)一行只能写一个语句 (B)一个语句只能写在一行 (C)一个语句可以写在多行 (D)语句可在任意处断开写在多行 2.执行下列程序片段时输出结果是。 float x=-1023.012; printf("%8.3f,",x); printf("%10.2f",x); (A)1023.012, -1023.012 (B)-1023.012, -1023.01 (C)1023.012,-1023.012 (D)-1023.012,-1023.012 3.已有如下定义和输入语句,若要求a1,a2,c1,c2的值分别为10,20,A 和B,当从第 一列开始输入数据时,正确的数据输入方式是。 int a1,a2; char c1,c2; scanf("%d%c%d%c",&a1,&c1,&a2,&c2); (A)10A 20↙B↙ (B)10 A 20 B↙ (C)10A20B↙ (D)10A20 B↙ 4.执行下列程序片段时,输出结果是。 int x=13,y=5; printf("%d",x%=(y/=2)); (A)3 (B)2 (C)1 (D)0 5.若定义x为double型变量,则能正确输入x值的语句是。 (A)scanf("%f",x); (B)scanf("%d",&x); (C)scanf("%lf",&x); (D)scanf("%o",&x); 二、写出程序的运行结果 1.写出下列程序的运行结果。 ·73· #include<stdio.h> int main(){ int x=3,y=5,z=7; printf("%d,%d\n",(x++,--y),++z); return 0; } 2.写出下列程序的运行结果。 #include<stdio.h> int main(){ int a=12345; double b=-198.345, c=6.5; printf("a=%4d,b=%-10.2e,c=%6.2f\n",a,b,c); return 0; } 三、编程题 1.编程输入圆柱体的底半径r,高h,输出其体积。 2.输入一个华氏温度F,要求输出摄氏温度c。转换公式为c=59 (F-32)。 3.从键盘输入5个整数,求它们的和、平均值并输出。 4.编写程序,从键盘上输入一个大的秒数,将其转换为几小时几分钟几秒的形式。例 如输入5000,得到的输出为1小时23分钟20秒。 5.编程,让计算机生成一个1~6的随机整数来表示骰子的点数,由用户输入1个字 符猜大小(规定1、2、3点小,4、5、6点大),输入字符'1'猜大,输入字符'2'猜小,输出用户猜 的是否正确。 ·74·