测品娱乐
您的当前位置:首页c语言的答案

c语言的答案

来源:测品娱乐


C语言程序设计(第二版)

语言程序设计 C 语言程序设计 习 题 1 一、判断题

1.在计算机中,小数点和正负号都有专用部件来保存和表示。 2.二进制是由 0 和 1 两个数字组成的进制方式。

3.二进制数的逻辑运算是按位进行的,位与位之间没有进位和借位的关系。 4.在整数的二进制表示方法中,0 的原码、反码都有两种形式。 5.有符号数有三种表示法:原码、反码和补码。

6.常用字符的 ASCII 码值从小到大的排列规律是:空格、阿拉伯数字、大写英文字母、 小写英文字母。 2.T 3.T 4.T 5.T 6.T 解:1.F 二、单选题

1.在计算机中,最适合进行数值加减运算的数值编码是 。 A. 原码 B. 反码 C. 补码 D. 移码

2.已知英文小写字母 m 的 ASCII 码为十进制数 109,则英文小写字母 y 的 ASCII 码为 十进制数 。 A. 112 B. 120 C. 121 D. 122

3.关于 ASCII 码,在计算机中的表示方法准确地描述是 。 A. 使用 8 位二进制数,最右边一位为 1 B. 使用 8 位二进制数,最左边一位为 1 C. 使用 8 位二进制数,最右边一位为 0 D. 使用 8 位二进制数,最左边一位为 0

4. 设在机器字长 4 位, X=0111B, Y=1011B, 则下列逻辑运算中, 正确的是___________。 A. X∧Y=1000 B. X∨Y=1111 C. X⊕Y=0011 D. Y =1000 ? 5.下列叙述中正确的是( ) 。 A.高级语言就是机器语言 B.汇编语言程序、高级语言程序都是计算机程序,但只有机器语言程序才是计算 机可以直接识别并执行的程序 C.C 语言因为具有汇编语言的一些特性,所以是汇编语言的一种 D.C 源程序经过编译、连接,若正确,执行后就能得到正确的运行结果 6.用 C 语言编写的源程序经过编译后,若没有产生编译错误,则系统将( ) 。 A.生成可执行文件 B.生成目标文件 C.输出运行结果 D.自动保存源文件 7.下列叙述中不正确的是( ) 。 A.main 函数在 C 程序中必须有且只有一个 B. C 程序的执行从 main 函数开始,所以 main 函数必须放在程序最前面 C. 函数

可以带参数,也可以不带参数。 D. 每个函数执行时,按函数体中语句的先后次序,依次执行每条语句 解:1.C 2.C 3.D 4.B 5.B 6.B 7.B 三、填空题 1. (87.625)10=( )2=( )8=( )16 )8=( )16=( 2. (1001010111001.10111)2=( 3.输入三个数,计算并输出三个数的和与三个数的乘积。 程序如下: #include void main() { int a,b,c,s,z; printf(\"Please input a b c:\\n\"); s=a+b+c; printf(\"%d\\n\输入三角形三条边的边长,计算并输出三角形的面积。 根据三条边的边长,计算三角形面积的公式如下: x+ y+z? ? 面积 = s ( s ? x)( s ? y )( s ? z ) ? 其中 s = ? 2 ? ? 程序如下: #include #include void main() { double x,y,z,s,dime; scanf(\"%lf%lf%lf\

dime=sqrt(s*(s-x)*(s-y)*(s-z)); } 127.5 57.A 解:1.1010111.101 2.11271.56 12B9.B8 4793.71875 3.scanf(\"%f%f%f\.s=(x+y+2)/2; printf(\"%f\四、编程题 1.仿照例 1.1,编程序在屏幕上显示: ***************************** Merry Christmas! Happy New Year! ***************************** 解:#include void main() { printf(\"*****************************\\n\"); printf(\" Merry Christmas!\\n\"); 1 )10 printf(\"%f\2.仿照例 1.2 编程,输入一个整数,计算这个数的平方。 解:#include void main() { int a,z; printf(\"请输入一个整数:\\n\"); scanf(\"%d\*3.仿照例 1.3 编程,输入两个数后,输出其中较小值。 解:#include float min(float x, float y) { float m; if (x void main() { float a,b,x; printf(\"请输入 a、b:\\n\"); scanf(\"%f %f\

printf(\"x=%f\\n\.仿照例 1.2 编程,输入圆柱体的半径和高,计算并输出圆柱体的体积。 解:#include void main() { float r,h,s,v; printf(\"Please input r and h:\\n\"); scanf(\"%f %f\习 题2 一、判断题 1.任何变量都必须要定义其类型。 2.C 语言的 double 类型数据在其数值范围内可以表示任何实数。 3.C 语言的任何类型数据在计算机内都是以二进制形式存储的。 4.isdigit(‘5’)的结果为 0。 5.printf 函数中格式符“%c”对应的参数只能是字符类型。 6.按格式符“%d”输出 float 类型变量时,截断小数位取整后输出。 7.在 C 语言程序中,ABC 与 abc 是两个相同的变量。 8.scanf 函数中的格式符“%d”不能用于输入实型数据。 9.格式符“%f”不能用于输入 double 类型数据。 10.当格式符中指定宽度时,输出的信息完全取决于所指定的宽度。 解:(1)T (2)F (3)T (4)F (5)F (6)F (7)F (8)T (9)T (10)F 二、指出下列各项中哪些是 C 语言中的常量,并指出其类型 10,150 007 ‘x’ ‘xo’ 1.414E+2 2.54 解:合法的 C 常量有: 整型常量: 007

实型常量: 1e0 字符型常量:‘x’ –0x3d 1.52e0.5 ‘\\\\’ –0x3d 1.414E+2 ‘\\a’ π sin(3) ‘a’+2 0xf16 ‘\\\\’ 1e0 0xf16 0x100h e1 ‘\\a’ 0128 o7o8 ‘\\009’ 10L 10L 三、指出下列各项中哪些是 C 语言中的用户标识符 x_1 X_2 High printf e2 -e2 count Int sizeof IF sum_12 _123# X_2 High 解:C 的用户标识符有:x_1 next_ IF sum_12 四、单项选择题 1.C 语言中,char 型数据在内存中的存储形式是( ) 。 A.原码 B.反码 C.补码 D.ASCII 码 2.若有定义语句“char c='\\72'; ”则变量 c( ) 。 A.包含 1 个字符 B.包含 2 个字符 C.包含 3 个字符 D.定义不合法 3.C 语言中的基本数据类型包括( ) 。 A.整型、实型、逻辑型 B.整型、实型、字符型 C.整型、逻辑型、字符型 D.整型、实型、逻辑型、字符型 4.设 c1、c2 为字符型变量,执行语句“c1=getchar( );c2=getchar( ); ”时,从键盘输 入 A↙,c1 和 c2 的值分别为( ) 。 A.都是‘A’ B.c1 是‘A’ ,c2 未输入 3 β 3DS number $23 NO1: double e2 count Int i/j next_ for number C.c1 未输入,c2 是‘A’ D.c1 是‘A’ ,c2 是‘\\n’ 5.a、b 是整型变量,执行语句“scanf(\"a=%d,b=%d\",&a,&b);,使 a 和 b 的值分 ” 别为 1 和 2,正确的输入是( ) 。 A.1 2 B.1,2 C.a=1,b=2 D.a=1 b=2 6. c 为字符型变量值为 设 ‘A’ a 为整型变量值为 97, , 执行语句 “putchar(c); putchar(a); ” 后,输出结果为( ) 。 A.Aa B.A97 C.A9 D.aA 7.已知字母 A 的 ASCII 码值为 65,以下语句段的输出结果是( ) 。 char c1='A',c2='Y'; printf(\"%d,%d\\n\.输出格式非法,输出错误信息 B.65,90 C.A,Y D.65, 8.若要使用输入语句“scanf(\"%4d%4d%10f\",&i,&j,&x);,为 i 输入-10,为 j ” 输入 12,为 x 输入 345.67,则正确的输入形式是( ) 。 A.–1012345.67↙ B.–10 12 345.67↙ C.–10001200345.67↙ D.–10,12,345.67↙ 9.能正确地定义符号常量的是( ) 。 A.#define n=10 B.#define n 10 C.#define n 10; D.#DEFINE N 10 10.在 C 语言中,int、char、short 三种类型数据在内存中所占的字节数( ) 。 A.由用户自己定义 B.均为 2 个字节 C.是任意的 D.由机器字长决定 解:(1) D (2) A (3) B (4) D (5) C (6) A (7) D (8) B (9) B (10) D 五、填空题 1.char ch='$';float x=153.4523; 。 语句“printf(\"%c%–8.2f\\\\n\; ”的输出结果是 解:$153.45 \\n 2.int i=123;float x= – 1234.567; 语句“printf(\"i=%5d x=%7.3f\\n\; ”的输出结果是 。 解:i= 123 x=-1234.568 3.char c='a';int a=65; 语句“putchar(c+1);putchar(a); ”的输出结果是 。 解:bA 4.int a=98; 语句“printf(“%d,%c,%o,%x”,a,a+1,a+2,a+3);”的输出结果是 解:98,c,144,65 5.int k; float f; 语句“scanf(“%3d%*4d%6f”,&k,&f);”执行时输入 12345678765.43↙ 则 k= ,f= 。 f=8765.4 解:k=123 6.使用 pow()函数时,程序的开头必须写一条预处理命令: 解:#include 5.填空题。 (1)int i=123,j=45; 函数 printf(\"%d,%d\\n\的输出结果是 。 解:123,45 。 。 4 (2)int i=123; float x=-45.678; 语句 printf(\"i=%5d x=%7.4f\\n\的输出结果是 解:i= 123 x=-45.6780 (3)float alfa=60,pi=3 。 习 题 3 一、根据下列数学式,写出 C 的算术表达式。

2 + 10 2 tan ?1 x + π 4 ? (a + b ) × y 2 3 4 | sin( x ) | 3 .5 x ?e 6 5 1 ab + c + d 2 c+d a + 2b ? cd 2 2 解:-(a +b )×y 的 C 表达式:-(a*a+b*b)*pow(y,4) 2 + 10 2 的 C 表达式:

(sqrt(2)+10*10)/(pow(tan(x),-1)+3.141593) tan ?1 x + π | sin( x) | 3.5 的 C 表达式:sqrt(pow (fabs (sin(x)),3.5)) x 6 ? e 5 的 C 表达式:pow(x,6)-exp(5) 1 ab + c + d 2 的 C 表达式:(1.0/2*a*b+c+d)/(a+2*b-(c+d)/c/d) c+d a + 2b ? cd 二、按照要求,写出下列 C 的表达式。 1.写出 int 类型变量 x 为“奇数”的表达式。 解:x%2==1 2.Int 类型变量 x、y、z,写出描述“x 或 y 中有且仅有一个小于 z”的表达式。 解:x=z||x>=z&&y=0?1:-1)*(y>=0?y:-y) 5.条件“-5≤x≤3”所对应的 C 逻辑表达式。 解:-5<=x&&x<=3 6.a、b 是字符变量,已知 a 的值为大写字母、b 的值为小写字母,写出判断 a、b 是否为 同一字母(不区分大小写)的逻辑表达式 解:a+32==b 或 b-a==32?1:0 7.int 类型变量 a、b 均为两位正整数,写出判断 a 的个位数等于 b 的十位数、且 b 的个 位数等于 a 的十位数的逻辑表达式。 解:

a%10==b/10&&a/10==b%10 8.写出判断某个人是否是成年人(年龄大于 21),且不是老年人(年龄大于 65)的逻辑表达 式。 5 解:y>21&&y<=65 9.写出取变量 a、b、c 中最大值的条件表达式。 解:(a>b?a:b)>c?(a>b?a:b):c 10.若字符变量 ch 为小写字母,则将其转换为对应的大写字母。 解:ch=ch>='a'&&ch<='z'?ch-32:ch 三、单项选择题 1.设 int x=3,y=4,z=5; ,下列表达式中值为 0 的是( ) 。 A.'x'&&'y' B. x<=y C.x||y+z&&y–z D. !((x=y&&ch<'B'&&!y”的值是( ) 。 A.0 B. 1 C. “假” D. “真” 3.判断 char 型变量 c 为数字字符的正确表达式为( ) 。 A.'0'<=c<='9' B.'0'<=c&&c<='9' C.c>='0'||c<='9' D.c>=0&&c<=9 4.下列运算符中,优先级最低的是( ) 。 A.?: B.&& C.= = D.*= 5.若有条件表达式“x?a++:b--” ,则以下表达式中( )等价于表达式 x。 A.x==0 B.x!=0 C.x==1 D.x!=1 6.有定义 int k=4,a=3,b=2,c=1; ,表达式“k法中,错误的是( ) 。 A. “5.0”不是表达式 B. “x”是表达式 C. “!x”是表达式 D. “sqrt(x)”是表达式 解:(1)D (2)B (3)B (4)D (5)B (6)D (7)B (8)C (9)D (10)C (11)A (12)A 四、填空题。 1.设 float x=2.5,y=4.7; int a=7;,表达式 x+a%3*(int)(x+y)%2/4 值为 解:2.5 2.设 int x=2,y=3; ,执行语句“x*=x+y”后 x 的值为 。 解:10 3.设 int x=17,y=5; ,执行语句“x%=x–y”后 x 的值为 解:5 6 。 。 4.设 int a=6,b=4,c=2;,表达式 !(a-b)+c-1&&b-c/2 的值为 。 解:1 。 5.设 int a=2,b=4,x,y;,表达

式!(x=a)||(y=b)&&!(2-3.5) 的值为 解:0 6.判断变量 a、b 是否绝对值相等而符号相反的逻辑表达式为 。 解:a==-b 。 7.判断变量 a、b 中必有且只有一个为 0 的逻辑表达式为 解:a*b==0&&a+b!=0 8.设 int m=2,n=2,a=1,b=2,c=3;执行语句 d=(m=a==b)&&(n=b>c);后,m 和 n 的值分别 为 。 解:m 为 0,n 为 2 。 9.设 int a=2; ,表达式“a%2!=0”的值为 解:0 10.设 char c='y'; ,表达式“c>='a'&&c<='z'|| c>='A'&&c<='Z'”的值为 。 解:1 x+2 11.写出与代数式 (x+2)e 对应的 C 表达式 。 解:(x+2)*exp(x+2) 。 12.设 int a=2;执行语句 a=3*5,a*4;后 a 的值为 解:15 五、写出下列程序的输出结果。 1. #include void main() { unsigned k,n; scanf(\"%u\输入数据为:69 k=n%10*10+n/10; printf(\"n=%d k=%d\\n\解:n=69 k=96 2. #include void main() { int x=2,y=3; x*=y+4; printf(\"%d,%d\\n\解:14,3 7 2,5 1,5 3. #include void main() { int a, b; a=8; b=7; a=(a-- ==b++)? a%3 : a/3; printf(\"a=%d b=%d\\n\解:a=2 b=8 六、程序填空题。 1.以下程序输入三个整数值给 a,b,c,程序把 b 中的值给 a,把 c 中的值给 b,把 a 中 的值给 c,交换后输出 a、b、c 的值。例如输入 1 2 3,输出 a=2 b=3 c=1。 #include void main() { int a,b,c, ① ; printf(“Enter a,b,c:”); scanf(“%d%d%d”, ② ); ④ ; ③ ; a=b; b=c; printf(“a=%d b=%d

c=%d\\n”,a,b,c); } 解:① t ② &a,&b,&c ③ t=a ④ c=t 2.以下程序不借助任何变量把 a、b 中的值进行交换。 #include void main() { int a,b; printf(“Input a,b:”); scanf(“%d%d”, ① ); a+= ② ; b=a- ③ ; a- = ④ ; printf(“a=%d b=%d\\n”,a,b); } 解:① &a,&b ② b ③ b ④ b 七、编程题。 1.输入 3 个字符后,按各字符 ASCII 码从小到大的顺序输出这些字符。 解:#include void main() { char c1,c2,c3,t,min,mid,max; c1=getchar(); c2=getchar(); c3=getchar(); min=(t=c1c2?c1:c2)>c3?t:c3;

mid=c1+c2+c3-min-max; putchar(min); putchar(mid); putchar(max); } 2.输入两点坐标(x1,y1)(x2,y2) 、 ,计算并输出两点间的距离。 解:#include #include void main() { double x1,y1,x2,y2,d; printf(“请输入两点坐标 (x1,y1),(x2,y2)\\n”);

scanf(“(%lf,%lf),(%lf,%lf)”,&x1,&y1,&x2,&y2); d=sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2)); printf(“两点间距离=%f\\n”,d); } 3.编写程序,计算球体积并输出它的值。要求输入半径值,

计算结果保留三位小数。 解:#include #include #define PI 3.1415926 void main() { double r,gv; printf(“请输入半径值:\\n”); scanf(“%lf”,&r); gv=4.0/3*PI*pow(r,3); printf(“半径为%f 的球的体积为:%.3f\\n”,r,gv); } 4.输入三角形的底和高,求三角形面积。 解:#include #define PI 3.14159 void main() { double a,h,s; printf(“请输入三角形的底,高\\n”); scanf(“%lf,%lf”,&a,&h); s=a*h/2; printf(“三角形面积=%f\\n”,s); } 5.编写程序,输入一个实数后输出该数的绝对值。 解:#include void main() { double x,y; 9 printf(“请输入一个实数\\n”); scanf(“%lf”,&x); y=x>=0?x:-x; printf(“|%g|=%g\\n”,x,y); } 6.输入梯形的上底、下底和高,求梯形面积。 解:#include void main() { double a,b,h,s; printf(“请输入梯形的上底,下底,高\\n”); scanf(“%lf,%lf,%lf”,&a,&b,&h); s=(a+b)*h/2; printf(“ 梯形面积=%f\\n”,s); } 7. 输入矩形的边长,求矩形面积。 解:#include void main() { double a,b,s; printf(“请输入矩形的长,宽\\n”); scanf(“%lf,%lf”,&a,&b); s=a*b; printf(“ 矩形面积=%f\\n”,s); } 8. 已知等差数列的第一项为 a,公差为 d,求前 n 项之和,a、d、n 由键盘输入。 解:#include void main() { int a,d,n,sum; printf(“请输入等差数列的首项 公差 项数\\n”); scanf(“%d%d%d”,&a,&d,&n); sum=a*n+n*(n-1)*d/2; printf(“ sum=%d\\n”,sum); } 9. 编写程序,将 d 天 h 小时 m 分钟换算成分钟,输入 d、h、m,输出换算结果。 解:#include void main() { int d,h,m,t; printf(“请输入天 小时 分钟\\n”);

scanf(“%d%d%d”,&d,&h,&m); t=d*24*60+h*60+m; printf(“%d 天%d 小时%d 分钟=%d 分钟\\n”,d,h,m,t); } 10 10. 编写程序,求出给定半径 r 的圆以及内接正 n 边形的面积,输出计算结果。r 和 n 的值 由键盘输入。 解:#include #include #define PI 3.14159 void main() { double r,s1,s2; int n; printf(“Input r n\\n”); scanf(“%lf%d”,&r,&n); s1=PI*r*r; s2=n/2.0*r*r*sin(2*PI/n); printf(“圆面积=%f,正内接%d 边形面积=%f\\n”,s1,s2); } 习 题 4 一、单项选择题 1.下列语句将小写字母转换为大写字母,其中正确的是( ) 。 A.if(ch>='a'&ch<='z')ch=ch-32; B.if(ch>='a'&&ch<='z')ch=ch-32;

C.ch=(ch>='a'&&ch<='z')?ch-32:' '; D.ch=(ch>'a'&&ch<'z')?ch-32:ch; 2.下列各语句中,能够将变量 u、s 中最大值赋给变量 t 的是( ) 。 A.if(u>s)t=u;t=s; B.t=s;if(u>s)t=u; C.if(u>s)t=s;else t=u D.t=u;if(u>s)t=s; 3.假设变量 x、k 都已定义,下列语句片段中,无语法错误的是( ) 。 A. switch(x){ case x>=90: putchar('A'); case x<60: putchar('E'); } B. switch(x) { case 1+2: defualt: case 2*4: } C. switch(x){ case 2+x: case 3*x: default: } D. switch(x){ case 3.5: case 7.8: default: } *4.与语句 while(!s )中的条件等价的是( ) 。 11 k='A'; k='E'; k='B'; k=x-2; k=x+3; k=0; k=0.5*x; k=8*x; k=0; A.s==0 B.s!=0 C.s==1 5.下列语句中,哪一个可以输出 26 个大写英文字母( A.for(a='A';a<='Z';printf(\"%c\",++a)); B.for(a='A';a<'Z';a++)printf(\"%c\",a); C.for(a='A';a<='Z';printf(\"%c\",a++)); D.for(a='A';

a<'Z';printf(\"%c\",++a)); 6.判断下面的 while 循环体的执行次数( ) 。 i=0; k=10; while( i=8 ) i=k––; A.8 次 (2) B 解:(1) B B.10 次 C.2 次 (3) B (4) A (5) C D.s=0 ) 。 D.无数次 (6) D 二、写出下列程序的输出结果 1.#include void main() { char x; int n=0,k=0; while((x=getchar())!='#'){ //运行时输入: a the there# switch(x){ case 't': k++; break; case 'h': if(k==1) k++; break; case 'e': if(k==2) k++; break; default: k=0; } if(k==3) n++; } printf(\"%d\\n\解:3 *2. #include ftheth e void main( ) { int k=0; char c='A'; do { switch (c++) { case 'A': k++; break; case 'B': k--; case 'C': k+=2; break; case 'D': k=k%2; break; case 'E': k=k*10; break; default: k=k/3; 12 } k++; }while(c<'G'); printf(\"k=%d\\n\解:k=8 *3. #include #include void main() { char a,b,x; int i; do x=getchar(); while (isupper(x)==0); //运行时输入:2abcD for(a='A'; a<=x; a++){ for(b='A'; b<'A'+x-a; b++) putchar(' '); for(i=1;i<=2*(a-'A')+1;i++) putchar(a); putchar('\\n'); } } 注:isupper(x)是判断 x 是否大写字母的函数,如果 x 是大写字母函数值为 1 否则为 0。 解: A BBB CCCCC DDDDDDD 4. #include void main() { int i,n; scanf(\"%d\if(n%i==0){ printf(\"%d\\输入 2520 解: 2 2 2 3 3 5 7 三、填空题 1.求 1~10 的乘积,写作: for( 解: s=1 2.下面程序段执行后,x、y 的值分别为 y=1; x=5; while(x) { x--; y++; } 解: x、y 分别为 0 和 6 *3.输入若干个以问号结束的字符,同时输出这串字符(不包括问号) ; while( !='?') putchar(ch); 解: (ch=getchar()) *4.有以下程序片段: s=1.0; for(k=1;k<=n; k++) s+=1.0/(k*(k+1)); printf(\"%f\\n\填空,使下程序段与上程序段功能完全相同。 s=0.0; ; k=0; do { s+=d; ; d=1.0/(k*(k+1)); } while( ); printf(\"%f\\n\解: d=1 k++ k<=n 5.下列程序输出 6~10000 之间的亲密数对,填空将程序补充完整。若 a、b 是亲密数对, 则 a 的因子和等于 b,b 的因子和等于 a,且 a 不等于 b。 #include void main() { int a,b,c,i; for(a=6;a<=10000;a++) { b=1;

for(i=2;i<=a/2;i++) ) b+=i; if( for(i=2;i<=b/2;i++) if(b%i==0) c+=i; 14 , i=1; i<=10; ++i) s*=i; 。 //注意外面的这对括号不能少 if( &&a!=b) printf(\"%d %d\\n\解:a%i==0 c=1; c==a 6.计算 2+22+222+2222+…+22+…+2 的和。 n #include n void main() { int s=1,t=1,a,n; scanf(\"%d\"&n); for(int i=2;i<=n;i++) { t=t*10+1; } printf(\"SUM=%d\\n\解:a=2; 四、编程题 1.输入一个实数,输出它的平方根值,如果输入数小于 0,则输出“The number is error!” 的提示。 解:#include #include void main() { double a,x; printf(“Input data:\\n”); scanf(“%lf”,&a); if(a>=0){ x=sqrt(a); printf(“%g 的平方根值

为%g\\n”,a,x); } else printf(“The number is error!\\n”); } 2.用 if 语句编程序,输入 x 后按下式计算 y 值,并输出结果。 x+2*x2 +10 0≤x≤8 y= x-3*x3-9 x<0 或 x>8 解:#include void main() { double x,y; 15 s+=t; s*=a; printf(“Input x:\\n”); scanf(“%lf”,&x);

if(x>=0&&x<=8) y=x+2*x*x+10; else y=x-3*x*x*x-10; printf(“x=%f,y=%f\\n”,x,y); } 3.输入一个百分制的成绩 t 后,按下式输出它的等级,要求分别写成 if 结构和 switch 结构。等 级为:90~100 为“A” ,80~ 为“B” ,70~79 为“C” ,60~69 为“D” ,59~0 为“E” 。 if 结构 解:#include void main() { double t; printf(“Input score:\\n”); scanf(“%lf”,&t); if(t>=90&&t<=100) putchar(‘A’); else if(t>=80&&t<90) putchar(‘B’); else if(t>=70&&t<80) putchar(‘C’); else if(t>=60&&t<70) putchar(‘D’); else if(t>=0&&t<60) putchar(‘E’); else printf(“error!\\n”); } switch 结构 解:#include void main() { double t; printf(“Input score:\\n”); scanf(“%lf”,&t); switch((int)(t/10)){ case 10: case 9:putchar(‘A’);break; case

8:putchar(‘B’);break; case 7:putchar(‘C’);break; case 6:putchar(‘D’);break; case 5: case 4: 16 case 3: case 2: case 1: case 0:putchar(‘E’);break; default:printf(“error!\\n”); } } 4.输入 x、y,计算 f(x,y)的函数值。 f(x,y)定义如下: ?x + y ? x2 ? y2 ? f ( x, y ) = ? ?x +y ? x ?y ? 2 2 x >= 0 x<0 x >= 0 x<0 y >= 0 y<0 y<0 y >= 0 解:#include void main() { double x,y,f;

printf(“Input x y:\\n”); scanf(“%lf%lf”,&x,&y); if(x>=0&&y>=0) f=x*x+y*y; else if(x<0&&y<0) f=x*x-y*y; else if(x>=0&&y<0) f=x+y; else if(x<0&&y>=0) f=x-y;

printf(“f(%f,%f)=%f\\n”,x,y,f); } 5.输入三角形的三条边长 a、b、c,计算并输出三角形的面积。要求判断输入的三条边 a、 b、c 三个数是否能构成三角,如果不能构成三角形,则输出提示信息告诉用户。 根据三条边的边长,计算三角形面积的公式如下: s= x+ y+z 面积 = s ( s ? x )( s ? y )( s ? z ) 2 解:#include #include void main() { double a,b,c,s,area; printf(“Input a b c:\\n”); scanf(“%lf%lf%lf”,&a,&b,&c);

if(a+b>c&&a+c>b&&b+c>a){ s=(a+b+c)/2; area=sqrt(s*(s-a)*(s-b)*(s-c)); 17

printf(“area=%.3f\\n”,area); } else printf(“线段%f,%f,%f 不能构成三角形\\n”,a,b,c); } 6.输入 1~7,输出对应的星期一~星期天。 解:#include void main() { int s; printf(“Input s(1~7):\\n”); scanf(“%d”,&s); switch(s){ case 1:printf(“星期一\\n”);break; case 2:printf(“星期二\\n”);break; case 3:printf(“星期三\\n”);break; case 4:printf(“星期四\\n”);break; case 5:printf(“星期五\\n”);break; case 6:printf(“星期六\\n”);break; case 7:printf(“星期天\\n”);break;

default:printf(“The s is error!\\n”); } } 7.输入年、月、日,输出是该年的第几天。 解:#include void main() { int y,m,d,days; printf(“Input 年 月 日:\\n”);

scanf(“%d%d%d”,&y,&m,&d); days=d; switch(m){ case 12:days+=30; case 11:days+=31; case 10:days+=30; case 9:days+=31; case 8:days+=31; case 7:days+=30; case 6:days+=31; case 5:days+=30; case 4:days+=31; case 3: if(y%4==0&&y%100!=0||y%400==0) days+=29; 18 else days+=28; case 2:days+=31; } printf(“%d 月%d 日是%d 年的第%d 天\\n”,m,d,y,days); } 8.输入 n 和相应的 n 个数,输出它们中所有奇数的乘积。 解:#include void main() { int

n,i,t,x; printf(“请输入 n:\\n”); scanf(“%d”,&n); printf(“请输入%d 个数:\\n”,n);

for(i=1,t=1;i<=n;i++){ scanf(“%d”,&x); if(x%2==1) t*=x; } printf(“%d\\n”,t); } 9.输入一个正整数,求它们所有数字之和。 解:#include void main() { int a,sum=0; printf(“请输入一个正整数:\\n”); scanf(“%d”,&a); a=a>=0?a:-a; while(a!=0){ sum+=a%10; a/=10; }

printf(“%d\\n”,sum); } 10.输入 n 和相应的 n 个数,统计输入的数中负数、零及正数的个数。 解:#include void main() { int n,i,t,s,k; double x; t=s=k=0; 19 printf(“请输入 n:\\n”); scanf(“%d”,&n); printf(“请输入%d 个数:\\n”,n); for(i=1;i<=n;i++){ scanf(“%lf”,&x); if(x>0) t++; else if(x<0) s++; else k++; } printf(“负数:%d\ 零:%d\ 正数:%d\\n”, s, k, t); } 11.输入 10 个学生的成绩,输出最低分数。 解:#include void main() { int i; double score,min; printf(“请输入 10 个学生成绩:\\n”); scanf(“%lf”,&score); min=score; // 给 min 赋初值 for(i=1;i<10;i++){ scanf(“%lf”,&score); if(min>score) min=score; } printf(“min=%g\\n”, min); } 或 解:#include void main() { int i; double score,min; printf(“请输入 10 个学生成绩:\\n”); for(i=1;i<=10;i++){ scanf(“%lf”,&score); if(i==1) min=score; if(min>score) min=score; } printf(“min=%g\\n”, min); 20 } 12.青年歌手大奖赛中,10 个评委给参赛选手打分。选手得分规则为去掉一个最高分和一 个最低分,然后计算平均得分。计算并输出选手张三的得分。 (注:如果最高分或最低分有 多个相同时,去掉其中一个) 解:#include void main() { int i; double score,min,max,sum,aver; printf(“请输入 10 个评委给张三的评分:\\n”); scanf(“%lf”,&score); min=max=sum=score;

for(i=1;i<10;i++){ scanf(“%lf”,&score); if(min>score) min=score; if(max void main() { int i; double score,min,max,sum=0,aver; printf(“请输入 10 个评委给张三的评分:\\n”); for(i=1;i<=10;i++){ scanf(“%lf”,&score); if(i==1) max=min=score; if(min>score) min=score; if(max void main() { char c; for(c=’A’;c<=’Z’;c++) printf(“%c\%d\\n”,c,c); } 或 解:#include void main() { char ch='A'; while( ch<='Z'){ printf(\"(%c,%d)\\n\ch++; } } 14.输出所有的“水仙花数” ,水仙花数是指一个三位数,其各位数字的立方和等于其本身, 如:153=13+53+33。 解:#include void main() { int x,a,b,c; printf(“水仙花数:\\n”); for(x=100;x<1000;x++){ a=x/100; b=x%100/10; c=x%10;

if(x==a*a*a+b*b*b+c*c*c) printf(“%d\”, x); } printf(“\\n”); } 1 1 1 1 1 + ? + ? + n前 40 项的和。 2 3 4 5 6 解:#include void main() { int i; double sum=0,flag=1; for(i=1;i<=40;i++){ 15.求算式 1 ? sum+=flag/i; flag=-1*flag; // 或 flag=-flag 22 }

printf(“sum=%g\\n”,sum); } 16. 输出一张华氏与摄氏温度对照表, 将华氏温度从 30°~40°F 之间的每度转换对应的摄 氏温度输出。张华氏转化为摄氏温公式:c=5/9(F-32) 解:#include void main() { double f,c; for(f=30;f<=40;f++){ c=5.0/9*(f-32);

printf(“%g\%g\\n”,f,c); } } *17.求数列的和。设数列的首项为 81,以后各项为前一项的平方根(如 81,9,3, 1.732,…) ,求前 20 项和。 解:#include #include void main() { int i; double sum=0,a=81; for(i=1;i<=20;i++){ sum+=a; a=sqrt(a); // 下一项为前一项的平方根 } printf(“sum=%g\\n”,sum); } 18.输出一个如下的乘法口诀表。 1×1=1 1×2=2 1×3=3 ……… 1×9=9 2×9=18 3×9=27 ……… 解:#include void main() { int i,j; for(i=1;i<=9;i++){ for(j=1;j<=i;j++) printf(“%d*%d=%d\”,j,i,i*j); 2×2=4 2×3=6 3×3=9 9×9=81 23 printf(“\\n”); } } *19.猴子吃桃子。第 1 天猴子吃掉桃子总数一半多一个,第 2 天又将剩余的桃子吃掉 一半多一个, 以后每天吃掉前一天剩下的一半多一个, 到第十天准备吃的时候只剩下一个桃 子。请问第 1 天开始吃的时候桃子的总数。 //递推公式 x=2*(x+1) 解:#include void main() { int n,x; x=1; //第 10 天的挑子数 for(n=9; n>=1; n--) { x=2*(x+1); } } *20.用循环体编程序,分别输出如下两个图形,如图 4.15 所示。* //计算第 n 天的桃子数 printf(\"第 1 天吃前挑子总数=%d\\n\* * * * * * * * * * * * * * * * * * * * * * 左图 解:#include void main() { int i,j; for(i=1;i<=4;i++) { for(j=1;j<=8-2*i;j++) putchar(' '); for(j=1;j<=2*i-1;j++) printf(\"%c \putchar('\\n'); } } 右图 解:#include void main() { 24 int i,j; for(i=1;i<=4;i++) //图上半部分 { for(j=1;j<=8-2*i;j++) putchar(' '); for(j=1;j<=2*i-1;j++) printf(\"%c \for(i=3;i>=0;i--) //图下半部分 { for(j=1;j<=8-2*i;j++) putchar(' '); for(j=1;j<=2*i-1;j++) printf(\"%c \.输入正整数 a、b,输出 a、b 之间所有素数之和。 解:#include void main() { int i,j,a,b,sum=0; printf(“请输入 a b (a≤b)\\n”);

scanf(“%d%d”,&a,&b); for(i=a;i<=b;i++) { for(j=2;j<=i/2;j++) if(i%j==0)break; // 此时可判定 i 不是素数 if(j>i/2&&i!=1) sum+=i;// 满足此条件表示除 1 和自身外, 其它数均不能整除 i } printf(“%d 至%d 之间的素数和=%d\\n”,a,b,sum); } 或 解:#include void main() { int i,j,a,b,sum=0,flag; printf(“请输入 a b (a≤b)\\n”); scanf(“%d%d”,&a,&b); for(i=a;i<=b;i++) { flag=1; // 要判别当前 i 是否素数,先将标志变量赋值为 1 25 for(j=2;j<=i/2;j++) if(i%j==0){ flag=0;break; }// 此时可判定 i 不是素数,退出循环 if(flag==1&&i!=1) sum+=i;//满足此条件表示除 1 和自身外,其它数均不能整除 i } printf(“%d 至%d 之间的素数和=%d\\n”,a,b,sum); } *22.当 x 为–2,–1.5,–1,…,1.5,2 时,求函数 f(x)=x2–3.14x–6 的解所取的最大值、 最小值。 解:#include void main() { double x,y,max,min; max=min=(-2)*(-2)-3.14*(-2)-6; //f(-2)作为 max、min 的初始值 for(x=-1.5;x<=2;x+=0.5)

{ y=x*x-3.14159*x-6; if(y>max) max=y; else if(yprintf(\"max=%f,min=%f\\n\.当 n 取值在–39~40 范围内时,判断表达式 n2+n+41 的值是否都是素数。 解:#include #include void main() { int i,j,y,count=0; for(i=-39;i<=40;i++) { y=i*i+i+41; for(j=2;j<=sqrt(y);j++) if(y%j==0) { printf(\"当 i 为%d 时,y=%d,结论不成立!\\n\共有%d 个 i 值,使结论不成立!\\n\结论成立,都是素数!\\n\"); } 26 *24.用区间对分法求 x2+xsinx–5=0 在区间[0,5]内的一个实根(设ε=10–5) 。 【说明】 在[a, b]区间连续的函数 f(x) 若满足条件 f(a) f(b) , · <0, 则必有 a<ξ #include void main() { float a,b,c; a=0; b=5; do { //初始化区间 a、b 值 c=(a+b)/2; //计算 a、b 区间的中值 if((a*a+a*sin(a)-5)*(c*c+c*sin(c)-5)<0 ) b=c; //以 c 代替区间 b 值 else a=c; //以 c 代替区间 a 值 }while(fabs(c*c+c*sin(c)-5)>=1e-5&&fabs(b-a)>=1e-5); printf(\"%f\\n\习 题 5 一、单项选择题 1.下列叙述中,正确的叙述项是( ) 。 A.定义函数时,必须要有形参 B.函数中可以没有 return 语句,也可以有多条 return 语句 C.函数 f 可以用 f(f(x))形式调用,这种调用形式是递归调用 D.函数必须有返回值 2.下列叙述中,不正确的叙述项是( ) 。 A.函数调用时,形参变量只有在被调用时才被创建(分配存储单元) B.函数调用时,实参可以是常量、变量或表达式 C.定义变量时,省略对变量的存储类别定义,则变量是自动型变量 D.语句 return(a,b);则函数可以返回两个值 3.传值调用的特点是( ) 。 A.实参传给形参变量的数据是地址 B.在函数中形参变量值改变后,不改变实参变量的值 C.在函数中形参变量值改变后,实参变量的值随之也改变 D.实参必须是变量 4.如果在函数中定义一个变量,有关该变量作用域正确的是( ) 。 A.只在该函数中有效 B.在该文件中有效 C.在本程序中有效 D.为非法变量 5.根据下面函数 print 的定义,选出调用函数 print(5378)的值是( ) 。 void print(long n) { 27 if (n==0) return ; else{ print(n/10); printf(\"% d\.5 3 7 8 B.8 7 3 5 C.3 5 7 8 D.8 7 5 3 *6.根据下面函数 f,选出 f(f(3))的值是( ) 。 int f(int x) { static int k=0; x=x+k; k--; return x; } A.5 解:(1)B (2)D B.3 (3)B C.2 (4)A (5)A D.4 (6)C 二、写出下列程序的输出结果 *1. #include int f1(int,int),f11(int); void f2(int); void main() { int i,j; for(i=0;i<5;i++) { f2((5-i)*3); for(j=0;j<=i;j++) printf(\"%3d\

f11(m)/f11(n)/f11(m-n); } int f11(int k) { if(k<=1) return 1; return k*f11(k-1); } void f2(int n) { for(int i=1;i<=n;i++) putchar(' '); } 解: 1 1 1 1 2 1 28 1 3 3 1 1 4 6 4 1 *2. #include

int f(int m,int n) { if(m%n==0) return n; else return f(n,m%n); } void main()

{ printf(\"%d\\n\解:24 3. #include void fun(int a,int b,int c,int add,int mult) { add=a+b+c; mult=a*b*c; printf(\"add=%d mult=%d\\n\x=y=0; fun(9,12,-4,x,y); printf(\"add=%d mult=%d\\n\解:add=17 add=0 4. mult=-432 mult=0 #include int add, mult; void fun(int a,int b,int c,) { add=a+b+c; mult=a*b*c; printf(\"add=%d mult=%d\\n\

mult=%d\\n\解:add=17 add=17 5. mult=-432 mult=-432 #include int a; void main() { int i; void fun(); 29 for(i=1;i<=4;i++){ a++; printf(\"In main: a=%4d\void fun() { int a=0; a++; printf(\"In fun:a=%d\\n\解:In In In In 6. main: main: main: main: a= a= a= a= 1In 2In 3In 4In fun:a=1 fun:a=1 fun:a=1 fun:a=1 #include void main() { int x=2,i; int f(int x); for(i=0;i<3; i++) printf(\"%4d\z++; return(x+y+z); } 解: 4 5 6 三、程序填空题 1. 输入若干个正整数, 判断每个数从高位到低位各位数字是否按值从小到大排列。 其中 input ()返回输入的数据,且保证输入的数据是一个正整数。fun1()函数是判断正整数 n 是否 按数字从小到大排列。 #include int input(); int fun1(int m); void main() { int n; if(fun1(n)==1) printf(\"%d 中各位数字按是从小到大排列\\n\请输入 n:\\n\"); scanf(\"%d\(n>0) ; do{ printf(\"n 必须正整数,请重新输入 n:\\n\"); scanf(\"%d\int fun1( { int k; ) k=m%10; while(m!=0) if( m/10%10>k) return 0; else { k=m%10; } return 1; } return n int m m=m/10 解:n=input(); 2.输入一个末尾数非 0 的正整数,输出它的逆序数。其中,input 是数据输入函数,reverse 是数据逆序函数。 #include long input(); long reverse(long n); void main() { int n; n=input(); printf(\"逆序数是:%d\\n\printf(\"请输入 n:\\n\"); scanf(\"%d\必须正整数,且末尾数非 0,请重新输入 n:\\n\"); }while(n<0||n%10==0); return n; } long reverse(long { long k=0; while(n){ n/=10; } 31 n) ); return k; } 解:reverse(n) 五、编程题 n>0&&n%10!=0

scanf(“%d”,&n) k=k*10+n%10 1.输入一个 x,输出下面分段函数 f(x)的值。要求将分段函数的计算定义成函数。 ?1 ? f ( x) = ? 0 ?? 1 ? x>0 x=0 x<0 解:#include int f(double x) // 函数定义 { int y=0; if(x>0) y=1; else if(x==0) y=0; else y=-1; return y; } void main() { double x; int y; scanf(“%lf”,&x); y=f(x); // 函数调用 printf(\"f(%g)=%d\\n\.输入一个正整数,输出该数的各个数字之和。要求编写函数,计算整数的各个数字之和。 解:#include int sum(int a) { int s=0; while(a!=0){ s+=a%10; a=a/10; } return s; } void main() { int x; scanf(“%d”,&x); printf(\"%d\\n\.编写函数,判断一个正整数 a 是否为完数,如果是完数,函数返回值为 1;否则为 0。 (完 数:一个数的所有因子之和等于该本身,如

6、28 都是完数;6=1+2+3;28=1+2+4+7+14。 ) 32 解:#include int wanshu(int n) { int i,a=0; for(i=1;i<=n/2;i++) if(n%i==0) a+=i; if(a==n) return 1; else return 0; } void main() { int n; scanf(“%d”,&n); if(wanshu(n)==1) printf(\"%d 是完数\\n\不是完数\\n\.输入三个数,输出它们的最小值。要求定义一个函数,返回两个数的最小值。 解:#include double min(double x,double y) { if(x void prn(char,int); // 函数声明 void main() { char c; int m; printf(“Input c m:\\n”); scanf(“%c%d”,&c,&m); prn(c,m); } void prn(char c,int m) { int i; for(i=1;i<=m;i++) putchar(c); printf(“\\n”); 33 } 6.输入一个年、月、日输出它是这年的第几天。要求定义函数,根据年月日计算是第几天 的函数。 解:#include int days(int year,int month,int date) { int d=date; switch(month-1) { case 11: d+=30; case 10: d+=31; case 9: d+=30; case 8: d+=31; case 7: d+=31; case 6: d+=30; case 5: d+=31; case 4: d+=30; case 3: d+=31; case 2:

if((year%4==0&&year%100!=0)||(year%400==0)) d+=29; else d+=28; case 1: d+=31; } return d; } void main() { int year,month,date; int d; printf(“请输入 年 月 日:\\n”);

scanf(\"%d%d%d\月%d 日是%d 年的第%d 天! month,date,year,d); \.定义一个函数将正整数 n 转换成文字形式输出星期几(n 值 0~6 分别转换成星期天,星 期一,…,星期六) 。 解:#include void week(int n) { switch(n) { case 0: printf(“星期天”); break; case 1: printf(“星期一”); break; case 2: printf(“星期二”); break; case 3: printf(“星期三”); break; case 4: printf(“星期四”); break; case 5: printf(“星期五”); break; case 6: printf(“星期六”); break; } } void main() { int num; printf(“请输入一个整数 0~6:\\n”); scanf(\"%d\.输入一个整数 n,计算 3.2n 的值。要求定义函数计算 xn 值。 解:#include 34 double fact(double x,int n); void main() { double x,y; int n; printf(“Input x n:\\n”); scanf(“%lf%d”,&x,&n); y=fact(x,n);

printf(“%f\\n”,y); } double fact(double x,int n) { int i; double t=1; for(i=1;i<=n;i++) t=t*x; return t; } 8.输入平面上 p1(x1,x2)、p2(x2,y2)两点坐标,计算两点间的距离输出。要求定义一个函数 计算平面上两点间的距离。 解:#include #include double f(double,double,double,double); void main() { double x1,x2,y1,y2,d; printf(“Input (x1,y1),(x2,y2):\\n”); scanf(“(%lf,%lf),(%lf,%lf)”,&x1,&y1,&x2,&y2); d=f(x1,y1,x2,y2); printf(“%f\\n”,d); } double f(double x1,double y1,double x2,double y2) { double d;

d=sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2)); return d; } 9.在主函数中输出 1!+2!+3!+…

+10!的值。要求将计算阶乘的运算写成函数。 解:#include int fact(int k) { int i,res=1; for(i=1; i<=k; i++) res=res*i; return res ; } void main( ) { int n,sum=0;

for(n=1;n<=10;n++) 35 sum+=fact(n); printf(“1!+2!+3!+…+10!=%d\\n”,sum); } 10.编写函数 int digit(int n,int k),函数返回 n 中从右边开始的第 k 位数字的值。如: digit(231456,3)=4;digit(1456,5)=0。 解:#include #include int digit(int n,int k) { long s; if (log10(n)+1 int huiwen(int n) { int k=0,m=n; while(m!=0) // 将 n 的逆序数放入 k 中 { k=k*10+m%10; m=m/10; } if(n==k) return 1; // n 与 k 相同则 n 是回文数 else return 0; } void main() { int a,b,i; printf(\"输入整数 a 和 b:\\n\"); scanf(\"%d%d\printf(“%d、%d 之间所有回文数:\\n”,a,b); for(i=a;i<=b;i++) if(huiwen(i)==1) printf(\"%d\\printf(“\\n”); } 12.定义函数 main(),输入正整数 n,当精度 e 分别取值为 10 、 10 、 10 、……、 10 时, 分别计算并输出下列算式的值,直到最后一项的绝对值小于精度 e,以比较不同精度下算出 的结果。要求调用函数 cal(e)计算下列算式的值。 s = 1+ 1 1 1 + + + ..... 2! 3! 4! -1 -2 -3 -n 解:#include #include double jiecheng(int a) { double f; 36 if(a==1) f=1; else f=a*jiecheng(a-1); return f; } double cal(double e) { double s=0,t; int i=1; t=1/jiecheng(i); while(t>=e) { t=1/jiecheng(i); s=s+t; i++; } return s; } void main() { int n,e; double p; printf(\"输入正整数 n:\\n\"); scanf(\"%d\{ p=cal(1.0/e); printf(\"%f\\n\.年份信息查询程序,输入年份,查询相应的信息。采用菜单选择功能,输入 1 或 2 其 功能分别是:闰年信息查询、元旦是星期几信息查询,输入 3 程序结束。 要求根据结构化程序设计方法,把问题分解成四个子问题(1)输入年份,判断输入数据的 合法性。 (2)判断是否闰年。 (3)计算元旦是星期几。 (4)输出文字形式的星期几。然后再 把这些子问题组合起来,完成整个大问题的求解 (仿照书上例 6.7) 。 其中元旦是星期几的计算公式: w=(y+(y-1)/4-(y-1)/100+(y-1)/400)%7; w 值 0~6,分别表示星期天、星期 1,…星期六。 解:#include int legal(int y); void leapyear(int y); int judgeweeknumber(int y); void judgeweekchinese(int y); void main() { int

number,week,year; printf(“功能菜单:”); printf(“1.闰年信息查询 2.元旦是星期几信息查 3. 程序结束\\n”); printf(“请输入年份:\\n”); scanf(“%d”,&year); printf(“请选择功能:\\n”); scanf(“%d”,&number); if(number==1) { year=legal(year); leapyear(year); } if(number==2) { week=judgeweeknumber(year); 37 judgeweekchinese(week); } if(number==3) return; } int

legal(int y) { if(y<0) do { printf(“请重新输入一个年份:”); scanf(“%d”,&y); } while(y<0); return y; } void leapyear(int y) { if(y%4==0&&y%100!=0||y%400==0) printf(“%d 是闰年\\n”,y); else printf(“%d 不是闰年\\n”,y); } int judgeweeknumber(int y) { int week;

week=(y+(y-1)/4-(y-1)/100+(y-1)/400)%7; return week; } void judgeweekchinese(int week) { switch(week) { case 0: printf(“星期天”); break; case 1: printf(“星期一”); break; case 2: printf(“星期二”); break; case 3: printf(“星期三”); break; case 4: printf(“星期四”); break; case 5: printf(“星期五”); break; case 6: printf(“星期六”); break; } } *14.输入 n、x,计算 xn 输出。要求定义一个递归函数计算 xn 。 解:#include double mypow(double x,int n) { double y=1; if (n>0) return(x*mypow(x,n-1)); else if (n<0) return(1/x*mypow(x,n+1)); else return 1; } void main() { double x; int n; printf(“请输入 x n:\\n”); scanf(\"%lf%d\printf(\"%f\\n\.数列的第 1、2 项为 1,此后各项为前两项之和。编制求数列中任何一项值的递归 38 函数。 解:此数列为 1、1、2、3、5、8、13 ……。 #include int f(int n) { if (n==1||n==2) return (1); else return (f(n-1)+f(n-2)); } void main() { int n;

while(scanf(\"%d\数列第%d 项为:%d\习 题 5 一、单项选择题 1.下列能正确定义一维数组 a 的语句是( ) 。 A.int a(10); B.int n=10,a[n]; C.int n;scanf(\"%d\",&n); D.#define n 10 int a[n]; int a[n]; 2.若有定义语句“int a[10]; ”则下列对 a 中数组元素正确引用的是( ) 。 A.a[10/2–5] B.a[10] C.a[4.5] D.a(1) 3.能对一维数组正确初始化的语句是( ) 。 A.int a[6]={6*1}; B.int a[6]={1,,,3}; C.int a[6]={}; D.int a[6]=(0,0,0); 4.以下能正确定义二维数组的语句为( ) 。 A.int a[][]; B.int a[][4]; C.int a[3][]; D.int a[3][4]; 5.若有数组定义语句“int a[4][5];,则对 a 中数组元素的正确引用是( ) ” 。 A.a[4][1] B.a[2,1] C.a[4][5] D.a[4–1][5–5] 6.以下能对二维数组 a 进行正确初始化的语句为( ) 。 A.int a[2][]={{1},{4,5}}; B.int a[2][3]={1,2,3,4,5,6,7}; C.int a[][]={1,2,3,4,5,6}; D.int a[][3]={1,2,3,4,5}; 7.下列对字符数组 s 的初始化不正确的是( ) 。 A.char s[5]=\"abc\"; B.char s[5]={'a','b','c','d','e'}; C.char s[5]=\"abcde\"; D.char s[]=\"abcde\"; 8. 下列程序段的运行结果为( ) 。 char s[]=\"ab\\0cd\"; printf(\"%s\.ab0 B.ab C.Abcd 9.下列数组 s 中所存放字符串的长度为( ) 。 char s[]=\"a\\128b\\\\\cd\\xdg\\n\"; D.ab cd A.9 B.10 C.11 D.18 10.有数组定义语句“char a[20];,则正确的输入语句为( ) ” 。 A.scanf(\"%s\",&a); B.scanf(\"%s\",a[]); C.gets(a[20]); D.gets(a); 11.下面程序执行后的正确输出项是( ) 。 39 #include void swap1(int a[ ]) { int t; t=a[0]; a[0]=a[1]; a[1]=t; } void swap2(int a,int b) { int t; t=a; a=b; b=t; } void main() { int x[2]={1,5}; int y[2]={1,5}; swap1(x); swap2(y[0],y[1]); printf(\"x: %d %d\\n\:5 1 B.

x:1 5 y:1 5 y:5 1 12.执行下列程序后的输出结果是( ) 。 #include char f(char s[],int n) { return (s[n]); } C. x:1 5 y:1 5 D. x:5 1 y:5 1 main() { char a[]=\"ABCD\"; printf(\"%c\.D B.C 13.执行下列程序后的输出结果是( ) 。 #include int f(int a[],int n) { if(n==0) return a[0]; else return f(a,n-1)+a[n]; } main() { int x[]={1,3,5,7,9}; printf(\"%d\\n\.B D.A A.1 解:1.D 2.A B.4 C.9 3.A 4.D 5.D 6.D 7.C 8.B 9.C 10.D D.16 11.A 12.A 13.D 二、填空题 1.构成数组的各个元素必须具有相同的 解:数据类型 。 40 2.若有定义“int a[10]={1,2};,则数组元素 a[2]的值为 ” 解:0 3.若有定义“int a[3][4]; ,则数组 a 行下标的上限为 ” 为 。 。 ,列下标的下限 0 解:2 4.C 语言程序在执行过程中,不检查数组下标是否 。 解:越界 。 5.C 语言中,二维数组元素在内存中的存放顺序是 解:按行存放 6.若有定义“int a[3][4];,则在数组元素 a[2][2]前有 ” 个元素。 解:10 。 7.若用数组名作为函数调用的实参,传递给形参的是 解:数组第一个元素的地址 8.若有定义语句“char s1[ ]=\"abc\",s2[ ]={'a','b','c'};,则数组 s1 有 ” 数组 s2 有 个元素。 3 解:4 三、写出下列程序的输出结果 1.#include void main() { int a[6]={2,3,7,1,9,6},i,j,k,m; for(i=5;i>=0;i--){ k=a[5]; for(j=4;j>=0;j--) a[j+1]=a[j]; a[0]=k; for(m=0;m<6;m++) printf(\"%2d\解:6 9 1 7 3 2 2 6 9 1 7 3 3 2 6 9 1 7 7 3 2 6 9 1 1 7 3 2 6 9 9 1 7 3 2 6 个元素, 2.#include void main() { int n[3],i,j,k; for(i=0;i<3;i++) n[i]=0; 41 k=3; for(i=0;i void main() { int a[6][6],i,j; for(i=1;i<6;i++) for(j=1;j<6;j++) a[i][j]=(i/j)*(j/i); for(i=1;i<6;i++){ for(j=1;j<6;j++) printf(\"%3d\解:1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 1 4.#include void main() { int x[10]; int i,m=1; void sort(int a[],int n);

for(i=0;i<10;i++){ m=-m; x[i]=m*i; } sort(x,10); for(i=0;i<10;i++) printf(\"%3d\sort(int a[],int n) { int i,j,t; 42 for(i=1;i<10;i++){ t=a[i]; for(j=i-1; j>=0; j--) if(t>a[j]) break; else a[j+1]=a[j]; a[j+1]=t; } } 解: -8 -6 -4 -2 0 1 3 5 7 9 5.#include void main() { char s1[]=\"aex\break; } if(s2[i2]=='\\0'){ flag=2; break; } if(s1[i1] void main() { char h[11]; int d[10]; 43 int i,n=0,x=1; gets(h); //输入 FF for(i=0;h[i]!='\\0';i++) if(h[i]>='0'&&h[i]<='9') d[i]=h[i]-'0'; else if(h[i]>='a'&&h[i]<='f') d[i]=h[i]-'a'+10; else if(h[i]>='A'&&h[i]<='F') d[i]=h[i]-'A'+10; for(i--;i>=0;i--){ n+=d[i]*x; x=x*16; } printf(\"%sH=%dD\\n\解:FFH=255D 四、程序填空题 1.假设数组 a 中的数按从小到大的顺序存放,以下程序把 a 数

组中相同的数删得只剩一个, 然后以每行 5 个数的形式输出 a 数组中的数。 #include #define N 20 void main() { int a[N],i,j,n; for(i=0;ifor(i=0;i<=n;i++){ if( )printf(\"\\n\"); printf(\"%3d\解:① i>0 ② i ③ j-1 ④ n-1 ⑤ i-1 ⑥ i%5==0 2.输入一个 6 行、6 列的数组,将每一行的所有元素都除以该行的主对角线元素,然后以 行列对齐格式输出该数组。 #include void main() 44 { int a[6][6],t,i,j; for(i=0; i<6;i++) for(j=0;j<6;j++) ; for(i=0; i<6;i++){ t= ; for(j=0;j<6;j++) a[i][j]= ; } for(i=0; i<6;i++){ for(j=0;j<6;j++) printf(\"%3d\② a[i][i] 解:① scanf(“%d”,&a[i][j]) ④printf(“\\n”)或 putchar(‘\\n’) ③ a[i][j]/t 3.以下程序的功能是将字符串 a 中下标值为偶数的元素由小到大排序,其他元素不变。 #include #include void main() { char a[81],t; int i,j,n; gets(a); for(n=0; ; n++); for(i=0; ;i+=2) for(j=i+2;j void main() { int a[32],x,i,m; int change(int x,int a[]); scanf(\"%d\m=change(x,a); for(i=0;ia[j] ⑤ a[i]=a[j] } int change( { int n=0,t,k; do { a[n]=x%2; ) ; n++; }while(x!=0); for(k=0;k #define N 6 yahuei(int a[ ][N]) { int i, j; a[0][0]=1; for(i=0; iprintf(\"\\n\"); } } 解:① i=2 ② j 46 void main() { char s[80]; int i, ; printf(\"input a string:\\n\"); gets(s); for(i=0; ;i++) if( ) a[0]++; else if(s[i]=='e'||s[i]=='E') a[1]++; else

if(s[i]=='i'||s[i]=='I') a[2]++; else if(s[i]=='o'||s[i]=='O') a[3]++; else if(s[i]=='u'||s[i]=='U') a[4]++; printf(\" A E I O U\\n\"); for(i=0;i<5;i++) } ① 解: a[5] ②s[i]!= '\\0' ③s[i]== 'a'|| s[i]== 'A' ④ printf(“%5d”,i) 五、编程题 1.在数组 x 的 10 个数中求平均值 v,找出与 v 相差最小的数组元素。 解:#include #include void main() { double x[10],v,d; int i; for(i=0,v=0;i<10;i++) { scanf(\"%lf\if(fabs(d-v)>fabs(x[i]-v)) d=x[i]; printf(\"平均值:%-8.2f,与平均值最近元素:%-8.2f\\n\2.输入 n(n≤20)个数放在一维数组中,找出其中最小的数,将它与数组最前面的元素交 换后输出这些数。 解:#include void main() 47 { int i,k,temp,n,a[20]; printf(\"Input n:\\n\"); scanf(\"%d\

temp=a[0];a[0]=a[k];a[k]=temp; for(i=0;i void main() { char s[80]; int i,n=0; gets(s); for(i=0;s[i]!='\\0';i++) if(s[i]>='0'&&s[i]<='9') n++; printf(\"%s 中包含%d 个字符\\n\.设有一头母牛,它每年年初生一头小母牛。每头小母牛从第四个年头开始,每年年初也 生一头小母牛。 问在第 20 年时, 共有多少头牛?分别输出从第 1 年至第 20 年每年的母牛数。 解:#include #define N 20 void main() { int x[N+1]={1},i; // x[0]存放初始母牛头数,即 1 头母牛 // x[i]存放第 i 年的母牛头数,其中 1≤i≤20 for(i=1;i void main() { int i,n,a[21],x; 48 printf(\"Input n≤20 :\"); scanf(\"%d\printf(\"Input %d numbers:\\n\scanf(\"%d\

for(i=0;i #define M 10 void main() { int n; int a[M],i,k,t; // t 存放出圈的人数,k 存放报数 printf(\"输入 n 的值:\\n\"); scanf(\"%d\初始化数组 a,每个数组元素中存放编号(1~M) a[i]=i+1; // 数组元素 a[i]非 0 时,代表该人在圈中;a[i]为 0 时,代表该人出圈 i=0; t=0; k=0; while(t void main() { int a[50],b[6]={0},c[6]; int n,i,j,s=0; printf(“输入职工数 n≤50:\\n”); while(scanf(“%d”,&n),n>50); for(i=0;ic[5]=a[i]-c[0]*100-c[1]*50-c[2]*20-c[3]*10-c[4]*5; for(j=0;j<6;j++) b[j]+=c[j]; } printf(“ 壹佰元 伍拾元 贰拾元 拾元 伍元 for(j=0;j<6;j++) printf(“%7d”,b[j]); printf(“\\n”); } 壹元\\n”);

8.输入一个 5 行、6 列的数组,找出该数组中绝对值最大的元素、输出该元素及其两个下 标值。 解:#include #include void main() { int a[5][6],i,j,max,maxi,maxj; for(i=0;i<5;i++) for(j=0;j<6;j++) scanf(\"%d\for(i=0;i<5;i++) for(j=0;j<6;j++) if(abs(a[i][j])>max) { max=abs(a[i][j]); maxi=i; maxj=j; } printf(\"max: %d\\n\.输入一个 3×4 矩阵 A 和一个 4×3 矩阵 B,计算并输出 A×B 的结果。 解:#include #define M 3 #define N 4 void main() 50 { int a[M][N],b[N][M],c[M][M]; // c 数组存放 a、b 两矩阵的乘积 int i,j,k; printf(“输入 a 矩阵(3×4) :\\n”); for(i=0;iscanf(“%d”,&a[i][j]); printf(“输入 b 矩阵(4×3) :\\n”); for(i=0;i #define N 10 void main() { int a[N][N],n,i,j,max,maxj,flag=0; printf(\"Enter n:\"); scanf(\"%d\

array %d×%d:\\n\{ max=a[i][0]; // 求该行的最大值 maxj=0; for(j=1;ja[j][maxj]) break; if(j==n) // 表示上面的循环不是 break 语句退出的 { flag=1;printf(“\\n 鞍

点:a[%d][%d]=%d\\n\\\n NO!\\n\"); } 11.输入一个字符串,判断其是否是 C 的合法标识符。 解:#include #include void main() { char str[80]; int i,flag=1; gets(str); if(isalpha(str[0])==0&&str[0]!=’_’) flag=0; else

for(i=1;str[i]!=’\\0’;i++) if(isalnum(str[i])==0&&str[i]!=’_’) { flag=0; break; } if(flag) printf(“%s 是 C 的合法标识符!”,str); else printf(“%s 不是 C 的合法标识符!”,str); } 12.从键盘输入一个字符串,查找其中的最大元素,在该元素后面插入字符串“ (max)。 ” 解:#include #include void main() { char str[80],t[80],max; int i,k; gets(str); max=str[0]; k=0; for(i=0;str[i]!=’\\0’;i++) if(str[i]>max) { max=str[i]; k=i; } strcpy(t,str+k+1);

strcpy(str+k+1,”(max)”); strcat(str+strlen(str),t); puts(str); } 13.输入一个英文句子,要求将每个单词的第一个字母改成大写字母。 解:#include #include void main() { char str[80]; int i,flag=1; 52 gets(str); for(i=0;str[i]!=’\\0’;i++) if(islower(str[i])&&flag==1) { str[i]-=32; flag=0; } else if(str[i]==’ ’) flag=1; puts(str); } 14.判别一字符串是否是另一字符串的子串,如是则输出第一次出现的位置。 解:#include void main() { char

parent_str[100],child_str[100]; int i=0,j=0,k=0,flag=0; // flag 标记父串中是否包含子串 printf(“请输入父串:\\n”); gets(parent_str); printf(“请输入子串:\\n”); gets(child_str); while(parent_str[i]!=’\\0’) { k=i; // 从 parent_str[i]开始匹配子串

for(j=0;child_str[i]!=’\\0’;j++,k++) if(parent_str[k]!=child_str[j]) break; if(child_str[j]==’\\0’) { flag=1; break; } i++; } if(flag==0) printf(“字符串%s 不是字符串%s 的子串!\\n”,child_str,parent_str); else printf(“子串%s 在字符串%s 第%d 个字符出现!

\\n”,child_str,parent_str,i+1); } 15.输入三行文字,找出每个元音字母在其中出现的次数。 解:#include #include void main() { char str[3][81]; int i,j,y[5]={0}; for(i=0;i<3;i++) { gets(str[i]); for(j=0;str[i][j]!=’\\0’;j++) switch(toupper(str[i][j])) 53

{ case ’A’:y[0]++; break; case ’E’:y[1]++; break; case ’I’:y[2]++; break; case ’O’:y[3]++; break; case ’U’:y[4]++; } } printf(“元音字母 A、E、I、O、U 出现的次数分别为:\\n”); for(i=0;i<5;i++) printf(“%4d”,y[i]); } 16.输入 10 个数,要求编写一个排序函数,能够实现按绝对值从大到小排序。在主函数中 输入 10 个数、输出排序后的 10 个数。 解:#include #include void sort(float a[],int n) { int i,j,k; float temp; for(i=0;ifabs(a[k])) k=j; temp=a[i];a[i]=a[k];a[k]=temp; } } void main() { float a[10]; int i,j; for(i=0;i<10;i++) scanf(\"%f\

printf(\"%.2f,\.统计学生成绩:某班有 30 人,每人学 4 门课,求每个人的总分和平均分。要求编三个 函数:①输入成绩函数 input()。②计算每人总分及各课平均分函数 process()。 ③输出该班 同学每人各课成绩,总成绩和各课平均分函数 output()。 解:#include void input(float a[][5],int n,int m) { int i,j; for(i=0;iprintf(\"%f,%f,%f,%f,%f\\n\input(a,3,4); process(a,3,4); output(a,3); } 18.在主函数中输入一个字符串,再输入一个字符,编写函数 count(),统计该字符在字符 串中出现的次数。要求在主函数中输出统计结果及字符串。 解:#include int count (char str[],char ch) { int i,num=0; for(i=0;str[i]!=’\\0’;i++) // 查看字符串中的每一个字符 if(str[i]==ch) num++; // 若是要统计字符,则 num 加 1 return num; // 返回统计结果 } void main() { char s[100],c; int n; printf(“请输入字符串:\\n”); gets(s); printf(“请输入字符:\\n”); scanf(“%c”,&c); n=count(s,c); // 调用函数 printf(“%c 在字符串%s

中出现了%d 次\\n”,c,s,n); } 55 19.在主函数中输入一个字符串,再输入一个字符,编写函数 delete(),将字符串中该字符 删除。 解:#include #include void delete (char s[],char ch) { int i; for(i=0;s[i]!=’\\0’;) // 查看字符串中的每一个字符 if(s[i]==ch) // 若是要删除的字符 strcpy(s+i,s+i+1); // 删除字符 else i++; // 查看下一个字符 } void main() { char s[100],c; int n; printf(“请输入字符串:\\n”); gets(s); printf(“请输入字符:\\n”); c=getchar(); delete(s,c); // 调用函数 puts(s); } 习 题7 一、单项选择题 1.下列宏定义命令中,哪一个格式是正确的( ) 。 A.#define pi=3.14159; C.#define pi=\"3.14159\" 2.宏定义为“#define div(x,y) 3)); ”作宏替换后为( ) 。 A.printf(\"x/y=%d\\n\",(x+3)/(y-3)); B.printf(\"x/y=%d\\n\",x+3/y-3); C.printf(\"div(x,y)=%d\\n\",x+3/y-3;);

D.printf(\"x/y=%d\\n\",x+3/y-3;); 3.程序中调用了库函数 exit,必须包含头文件( ) 。 A.string.h B.stdlib.h C.ctype.h D.math.h 4.定义带参数的宏计算两个表达式的乘积,下列定义中哪个是正确的( ) 。 A.#define muit(u,v) u*v B.#define muit(u,v) u*v; B.define pi=3.14159 D.#define pi(3.14159) x/y;,若语句“printf(\"div(x,y)=%d\\n\",div(x+3,y- ” C.#define muit(u,v) (u)*(v) D.#define muit(u,v)=(u)*(v) 5.程序中调用了库函数 strcmp,必须包含头文件( ) 。 A.stdlib.h B.math.h C.ctype.h (1)D (2) C (3)B (4) C (5)D 解: D.string.h 56 二、填空题 1.定义一个宏,用于判断所给出的年份 year 是否为闰年: #define LEAP_YEAR(y) 。 (y%4==0 && y%100!=0) || (y%400==0 ) 解: 说明: (1)能被 4 整除,但不能被 100 整除。 (2)能被 4 说明:闰年的条件是符合下面二者之一: 整除,能被 400 整除。 2.定义带参数的宏为“#define max(a,b)

((a)>(b)?(a):(b))” 。对表达式“max(a,max(b, max(c,d)))”作宏替换为(用文字描述) : 。 b、 d 表达式是调用宏函数, 两个参数分别是 a,max(b,max(c,d)), 解: 计算 a、 c、 中的最大值。 其第二个参数又是一个调用宏函数,参数分别是 b,max(c,d)。 3.定义带参数的宏,计算两个数中绝对值最小的数 。 解: #define min(a,b) fabs(a)='A'&&c<='Z'? c:c+32 三、写出下列程序的输出结果 #define PT 5.5 #define S(x) PT*x*x #include int main(void) { int a = 1, b = 2; printf(“%4.1f\\n”, S(a+b)); } 解:9.5 四、编程题 1.输入 5 个数后,输出其中绝对值最小的数。要求定义带参数的宏,计算两个数中绝对值 最小的数。 解:#include #include #define min(a,b) (fabs(a) #include #define f(x) (x)*(x)-asin(x) 57 void main() { double

x=0,y=0; for(int i=1;i<=10;i++) { y=y+(f(x)+f(x+0.1))/20; x=x+0.1;} printf(\"%f\\n\习 题8 一、单项选择题 1.下列语句定义 p 为指向 float 型变量 d 的指针,其中正确的是( ) 。 A.float d,*p=d; B.float *p=&d,d; C.float d,*p=&d; D.float d,p=d; *2.指针变量 p1、p2 类型相同,要使 p2、p1 指向同一变量,哪一个语句是正确的( ) 。 A.p2=*&p1; B.p2=**p1; C.p2=&p1; D.p2=*p1; 3.若有“float a=1.5,b=3.5,*pa=&a;*pa*=3;pa=&b;,则正确的是( ) ” 。 A.pa 的值是 1.5 B.*pa 的值是 4.5 C.*pa 的值是 3.5 D.pa 的值是 3.5 4.数组定义为“int a[4][5];,下列哪一个引用是错误的( ) ” 。 A.*a B.*(*(a+2)+3) C.&a[2][3] D.++a 5.表达式“c=*p++”的执行过程是( ) 。 A.复制*p 的值给 c 后再执行 p++ B.复制*p 的值给 c 后再执行(*p)++ C.复制 p 的值给 c 后再执行 p++ D.执行 p++后将*p 的值复制给 c *6.声明语句为“char s[4][15],*p1,**p2;int x,*y;,下列语句中正确的是( ) ” 。 A.p2=s; B.y=*s; C.*p2=s; D.y=&x; *7.定义函数 int *max()的正确含义是( ) 。 A.返回整型值的函数 B.返回指向整型变量的指针 C.返回指向函数 max()的指针 D.上面的叙述都不正确。 *8.若有定义“int(*ptr)(float);,其正确的含义是( ) ” 。 A.ptr 是指向一维数组的指针变量 B.ptr 是指向 int 型数据的指针变量 C.ptr 是指向函数的指针变量,该函数有一个 float 型参数,返回值是整型 D.ptr 是一个函数名,该函数的返回值是指向 int 型数据的指针 9.指出正确的程序是( ) 。程序 (1) #include void main() { char *p; char s[80]; p=s[0]; scanf(\"%s\程序 (3) #include 程序 (2) #include void main() { double x,y, *p; x=3.45; p=&x; y=*p; printf(\"%f\\n\程序 (4) #include 58 void main() { int x,*p; *p=x; printf(\"%d\\n\printf(\"%d\\n\.下面程序的输出结果是( ) 。 void main() { int

a[12]={1,2,3,4,5,6,7,8,9,10,11,12},*p[4],i; for(i=0;i<4;i++) p[i]=a+i*3; // 或 p[i]=&a[i*3]; printf(\"%d\或 printf(\"%d\.8 B.12 C.6 D.程序有错 解:(1)C (2)A (3)C (4)D (5)A (6)D (7)B (8)C (9)程序(2) (10)B 二、写出下列程序的输出结果

1. #include void main() { double a=3.5,b=6,*pa,*pb; pa=&a; pb=&b; *pa=4.5; pa=&b; printf(\"%f %f %f %f\\n\解: 4.50000 6.000000 6.000000 6.000000

2. #include void main() { int a[]={2,4,6,8,10}; int x,y=0, *p; p=a; for(x=0;x<5;x++) y+=*p++; printf(\"%d\解: 30 3. #include void ast(int x,int y,int *cp,int *dp) { *cp=x+y; *dp=x-y; x=*cp+*dp; y=*cp-*dp; } void main() { int x,y,c,d; 59 x=4; y=3; ast(x,y,&c,&d); printf(\"%d,%d,%d,%d\\n\解: 4,3,7,1 *4. #include #include void del_bk(char *p) { char *p1; p1=p; while(*p1!='\\0') if(*p1==' '&&*(p1+1)==' ') strcpy(p1,p1+1); else p1++; } void main() { char *aa=\"aa bb cccc ddd efg

printf(\"%s\\n\解:aa bb aa bb cccc ddd efg h *5. h #include void swap1(int x, int y) { int t; t=x; x=y; y=t; } void swap2(int *x, int *y) { int *t; t=x; x=y; y=t; } void swap3(int *x,int *y) { int t; t=*x; *x=*y;*y=t; } void main() { int x,y,*px,*py; x=100; y=300; swap1(x,y); printf(\"x=%d y=%d\\n\py=&y; swap2(&x,&y); printf(\"x=%d y=%d *px=%d *py=%d\\n\", x,y,*px ,*py); x=100; y=300; px=&x; py=&y; swap3(px,py); printf(\"x=%d y=%d *px=%d *py=%d\\n\", x,y,*px,*py); } 解:x=100 y=300 60 x=100 y=300 *px=100 *py=300 x=300 y=100 *px=300 *py=100 *6. #include #include void main() { char

*a[3]={\"morning\i++) if(strcmp(a[k],a[i])>0) k=i; t=a[k];a[k]=a[j];a[j]=t; } for(i=0;i<3;i++) printf(\"%c\\n\解: a m e 三、填空题 *1.设对变量、数组或函数已有如下定义或声明: int *pa,m,y=4, x[3][4]; char a[10]={\"HELLO\利用上述已给出的定义或声明,选择适当的项目给下列定义的变量分别赋初值: int **px ,*pm,n *pz[3]; float (*pb)[4]; char *s; float (*p)(float,float) ; px= ;pm= ;n= ; pz[0]= ;pz[1]= ;pz[2]= pb= ; s= ; p= ; ; 解: px=&pa; pm=&m ; n=y pz[0]=x0];pz[1]=x[1];pz[2]=x[2]; pb=b; s=a ; p=g ; 2.函数 int fun(char *s),判断输入的字符串是否“回文” 。若是回文,函数返回 1;否则 函数返回 0。 (注:字符串顺读和倒读都一样,则是回文。如: “asxsa”是回文, “asxdsa” 不是回文。 ) #include \"string.h\" int fun( char *s ) { char *p, *q; int n; n=strlen(s); q= ; for(p=s; p<=q; q--, if (*p!=*q) break; ; if ( p #include float find_max( ) { int i,j; float max=**x; for(i=0;imax) max= return max; } void main() { float a[5][5],b[6][4], int i,j; for(i=0;i<5;i++) pa[i]=a[i]; ; for(i=0;i<5;i++) for(j=0;j<5;j++) scanf(\"%f\for(i=0;i<6;i++) for(j=0;j<4;j++) scanf(\"%f\

printf(\"%f\\n\② max=*(*(x+i)+j) 解:①find_max(float *x[],int m,int n ③ *pa[5],*pb[6] ④ for(i=0;i<6;i++) pb[i]=b[i]; //或 max=x[i][j]; *4.有 n 个人围成一圈,顺序排号,从第 1 个人开始报数,从 1 报到 m,凡报到 m 的人退 出圈子,问最后留下的是原来第几号的人?下列函数完成上述处理,其中 m、n 的(mb 和二个指针变量 qa、qb,输入 2 个整数,通过指针 qa、qb,将 两个整数分别存储到变量 a、b 后,通过指针 qa、qb 操作,使 qa 指向较小的整数,qb 指向 较大的整数,并输出。 解:#include void main() { int a,b,*qa=&a,*qb=&b; scanf(“%d%d”,qa,qb); if(*qa>*qb) { qa=&b; qb=&a; } printf(“%d,%d\\n”,*qa,*qb); } 2.输入 10 个数,按绝对值从小到大排序后输出。要求定义一个函数 sort,完成绝对值从小 到大排序。 解:#include #include void main() { float a[10],*p,temp; int i,j; for(p=a,i=0;i<10;i++)

scanf(\"%f\{ p=a+i; for(j=i+1;j<10;j++) if(fabs(*(a+j)) void value(double *a,int n,double x) { int i; for(i=0;i void main() { char a[80],*p; int i,j; gets(a); for(p=a;*p!='\\0';p++) if (*p>='a' && *p<='z') *p-=32; puts(a); } 5.定义一个函数,将数组中最大值及最小值交换位置。 解:#include void f(int *a,int n) { int i,*p,*q,t; for(i=0,p=q=a;i*(a+i)) q=a+i; } t=*p;*p=*q;*q=t; } void main() { int a[10],i; for(i=0;i<10;i++)

scanf(\"%d\.定义一个函数,计算两个数的和与乘积。 解:#include void f(double x,double y,double *p,double *q) { *p=x+y; *q=x*y; } void main() { double a,b,add,mult; printf (\"Input a b:\\n\");

scanf(\"%lf%lf\*7.输入一个年号,输出它是否润年及元旦星期几。要求定义一个函数同时返回是否闰年和 元旦星期几。 解:#include int leap(int year) // 函数判断是否是闰年,是返回 1,不是返回 0 { return (year%4==0&&year%100!=0 || year%400==0); } int week(int year,int *res) { int sum=0,i; for(i=1;i是%s\\n\.定义一个函数,将字符串复制到字符数组中,并返回该字符

串指针。 解:#include char *mystrcpy(char *s1,char *s2 ) // 指针变量 s1 指向目的数组,s2 指向字符串 { char *p=s2; // p 指向字符串 while(*s2!=’\\0’) { *s1=*s2; 65 s1++; s2++; } *s1=’\\0’; return p; } void main() { char str1[100],*ps=”aaa bbbbb ss p=mystrcpy(str1,ps); // 调用函数 puts(str1); puts(p); } dd ttt”,*p; *9.编写函数,将字符串中连续的相同字符仅保留 1 个(字符串“a bb cccd d 为“a b cd d ef”。 ) 解:#include void del(char s[]) { int i; char *p,*q,c; p=s; q=s+1; for(;*p!='\\0';q++) if (*p!=*q) { *(p+1)=*q; p++; } return; } void main() { char a[80]; gets(a); del(a); puts(a); } ef”处理后 10.编写函数,将 double 类型二维数组的每一行同除以该行上绝对值最大的元素。 解:#include #include void fun(float a[][4],int n,int m) { float max; int i,j; for(i=0;ifabs(max)) max=*(*(a+i)+j); 66 for(j=0;jscanf(\"%f\printf(\"\\n\"); } } 11.编写函数,将 5×5 的矩阵转置。 解:#include void fun(float a[][5]) { int i,j; float temp; for(i=0;i<5;i++) { for(j=0;jfor(i=0;i<5;i++) for(j=0;j<5;j++) scanf(\"%f\printf(\"%.0f\.编写函数,将 5×5 的二维数组每行中最大值,按一一对应的顺序放入一维数组中。如 int a[5][5],s[5],即将 a 中的第 1 行最大值存放于 s[0],将 a 中的第 2 行最大值存放于 s[1], 以此类推。 解:#include 67 void fun(int a[][5],int m[]) { int i,j,max; for(i=0;i<5;i++) { max=**(a+i); for(j=0;j<5;j++) if (max<*(*(a+i)+j)) max=*(*(a+i)+j); *(m+i)=max; } } void main() { int i,j; int a[5][5],b[5]; for(i=0;i<5;i++) for(j=0;j<5;j++) scanf(\"%d\每行最大值:%d \13.编写函数,根据星期几的数值(0~6) ,输出该星期几的英文名。 解:#include void findweek(int week) { char *p[]={\"SUN\puts(p[week]); } void main() { int w; printf(\"请输入星期几(0~6)\\n\"); scanf(\"%d\(w>=0&&w<=6) findweek(w); else printf(\"数据输入错误!\\n\"); } 14.编写函数,根据月份号,输出该月的英文名。 解:#include void findmonth(int m) { char

*p[]={\"Jan.\puts(p[m-1]); } void main() { int no; printf(\"请输入月份(1--12)\\n\"); scanf(\"%d\(no>=1&&no<=12) findmonth(no); else printf(\"数据输入错误!\\n\"); } 15.输入 5 个字符串,输出其中最长的字符串。 解:#include \"stdio.h\" #include \"string.h\" void main() { char str[5][100],*p[5]; int i,k; // // 用 k 记录最长字符串所在的行下标 for(i=0;i<5;i++) // 指针数

组的每一个元素分别指向一个字符串 p[i]=str[i]; printf(“输入 5 个字符串:\\n”);

for(i=0;i<5;i++) gets(p[i]); for(k=0,i=1;i<5;i++) // 设 p[k]所指的字符串最长,k 的初始值为 0 if(strlen(p[i])>strlen(p[k])) k=i; printf(“最长的字符串是:%s\\n”,p[k]); } 习 题9 一、选择题 1.有以下的结构变量定义语句: struct student { int num; char name[9]; } stu; 则下列叙述中错误的是( ) 。 A.结构类型名为 student B.结构类型名为 stu C.num 是结构成员名 D.struct 是 C 的关键字 2.有以下的定义语句: struct student { int num; char name[9]; }; 则不能正确定义结构数组并赋初始值的是( ) 。 A.struct student stu[2]={1,\"zhangsan\",2,\"li si\.struct student stu[2]={{1,\"zhangsan\,{2,\"li si\.struct stu[2]={{1,\"zhangsan\,{2,\"li si\.struct student stu[ ]={{1,\"zhangsan\,{2,\"li si\.若有以下定义语句: struct date { int y,m,d; }; struct student { int num; char name[9]; struct date bir;}stu,*p=&stu; 则以下对结构变量 stu 成员的引用错误的是( ) 。 A.p–>bir–>y B.p–>bir.y C.stu.bir.y 4.若有以下定义语句: struct student { int num; char name[9]; D.stu.name 69 }stu[2]={1, \"zhangsan\则以下能输出字符串“lisi”的语句是( ) 。 A.printf(\"%s\",stu[0].name); B.printf(\"%s\",&stu[1].name); C.printf(\"%s\",stu[1].name[0]); D. printf(\"%s\",&stu[1].name[0]); *5.以下程序的输出结果是( ) 。 #include void main() { int x=1,y=2,z=3; struct aa { int a; int *p; } s[ ]={4,&x,5,&y,6,&z}; struct aa *q=s+1; printf(\"%d\\n\–>p)++); } A.1 B.2 C.3 D.4 6.有以下定义语句: struct node { int n; struct node *next; } x,y,*p=&x,*q=&y; 则能将 y 节点链接到 x 节点之前的语句是( ) 。 A.x.next=p B.x.next=q C.y.next=p D.y.next=q *7.以下程序的输出结果为( ) 。 #include void main() { struct node{ int n; struct node *next; }a[4]; int i; for(i=0;i<3;i++){ (a+i)–>n=i+1; (a+i)->next=a+i+1; } (a+i)->next=a;

printf(\"%d,%d\\n\.1,2 B.2,1 C.1,3 D.3,1 8.已建立一单向链表,指针变量 p1 指向链表中某一节点,p2 指向下一节点,将 p2 所指节 点从链表中删除并释放的语句为( ) 。 A.p1=p2;free(p2); B.p1–>next=p2–>next;free(p2); C.*p1.next=*p2.next;free(p2); D.p1=p2–>next;free(p2); 9.已建立一单向链表,指针变量 p1 指向链表中某一节点,p2 指向下一节点;指针变量 p 指向新申请节点,将 p 所指节点插入到链表中 p1 与 p2 之间的语句为( ) 。 A.p–>next=p2;p1–>next=p; B.p1–>next=p;p–>next=p2; C.p=p2;p1–>next=p; D.p1=p;p–>next=p2; 10.若要利用下面的程序片段使指针变量 p 指向一个整型变量的存储单元则括号中需填 入的内容是( ) 。 int *p; 70 p=( A.int 解:(1)B (2)C )malloc(sizeof(int)); B.*int (3)A (4)D (5)B C.&int (6)C (7)D D.int * (8)B (9)A (10)D 二、写出下列程序的输出结果 1. #include struct st { int num; char name[10]; int

age; }x[3]={{1,\"zhang\

{ printf(\"%s,%d\\n\解:wang,19 *2. #include #include struct s { int a[4]; char *pa[4]; }x,*p=&x; void main() { int i; char y[4][8]={\"A\\"ABC\

printf(\"%d,%d,%s\\n\解:2,4,BC *3. #include struct ks {int a;int *b;}s[4],*p; void main() { int n=1,i; for(i=1;i<4;i++){ s[i].a=n; s[i].b=&s[i].a; n+=2; } p=&s[0]; p++; printf(\"%d,%d\\n\解:3,1 4. #include 71 struct s {int a;float b;char *c;}; void main() { struct s x={19,83.5, \"zhang\printf(\"%d,%.1f,%s\\n\

printf(\"%c,%s\\n\解:19,83.5,zhang 19,83.5,zhang y,hang 三、程序填空题 1. 已知 head 指向一个单向链表, 链表中每个节点包含整型数据域 (data) 和指针域 (next) 。 以下函数 max 求出链表中数据域值最大节点的位置,由指针 s 传回主调函数。 #include struct link { int data;struct link *next;}; void main() { struct link *head,*q; struct link *max(struct link *); q=max(head); printf(\"max=%d\\n\*max(struct link *head) { struct link *p,*s; ; s=p; while( ) { p= ; if(p->data> ) s=p; } return s; } 解:① p=head ② p->next!=NULL ③ p->next ④ s->data // 省略建立链表程序 2.已知 head 指向一个单向链表,链表中每个节点包含整型数据域(data)和指针域(next) 。 以下函数 sum 求出链表中所有节点的数据域的和值,并作为函数值返回。 #include struct link { int data;struct link *next;}; void main() { struct link *head; int s,sum(struct link *); 72 // 省略建立链表程序 s=sum(head); printf(\"sum=%d\\n\*p; int s=0; p=head; ) { while( s+= ; p= ; } return( ); } 解:① p!=NULL ② p->data ③ p->next ④ s *3.下列函数用于向一非空链表插入节点(由 stud 指向) ,链表按照节点 no 域的升序排 列。 struct tab insert(struct tab *head, struct tab *stud) { struct tab *p0, *p1, *p2;

p1=head;p0=stud; while((p0->no>p1->no)&&( )) { p2=p1; p1=p1->next; } if(p0->no<=p1->no) if(head==p1) { p0->next=head; head=p0;} else { p2->next=p0; } else { p1->next=p0; return (head); } 解:① p1->next!=NULL ② p0->next=p1 ③ p0->next=NULL } 四、编程题 1.编写程序,输入某一时刻的时间,加一秒后输出新时间。时间以时、分、秒表示(利用 结构类型) 。 解:#include “stdio.h” struct {int hour,minute,second;} time; void main() { printf(“请输入当前时间 时:分:秒\\n”); scanf(“%d :%d: %d”,&time.hour,&time.minute,&time.second); time.second++; if(time.second ==60){ time.minute++; time.second=0; if(time.minute==60){ 73 time.hour++;time.minute=0; if(time.hour==24 )time.hour=0; } } printf(“%d: %d:%d\\n”, time.hour, time.minute, time.second); } 2.编写程序,输入当天日期,要求输出明天日期(利

用结构类型) 。 解:#include #include void main() { struct date { int y,m,d;}d; printf(\"请输入日期: mm/dd/yy\\n\"); scanf(\"%d/%d/%d\switch(d.m) { case 1:case 3:case 5:case 7:case 8:case 10: if(d.d>31){d.m++;d.d=1;} break; case 4:case 6:case 9:case 11: if(d.d>30){d.m++;d.d=1;} break; case 2:

if((d.y%4==0&&d.y%100!=0)||d.y%400==0) { if(d.d>29){d.m++;d.d=1;} } else if(d.d>28) {d.m++;d.d=1;} break; case 12: if(d.d>31) { d.m++;d.d=1; if(d.m>12) {d.m=1;d.y++;} } break; default: printf(\"error!\\n\"); exit(0); } printf(\"第二天日期为:%d/%d/%d\\n\.编写程序,计算两个时刻之间的时间差,并将其值返回。时间以时、分、秒表示,两个 时刻的差小于 24 小时(利用结构类型) 。 解:#include “stdio.h” #include “math.h” 74 void main() { struct clock { int hour,minute,second; } clock1,clock2,clock3; int time1,time2,time; printf(“请输入时间 1 时:分:秒\\n”); scanf(“%d :%d: %d”,&clock1.hour,& clock1.minute,& clock1.second); printf(“请输入时间 2 时:分:秒\\n”); scanf(“%d :%d: %d”,&clock2.hour,& clock2.minute,& clock2.second); time1= clock1.hour*3600+clock1.minute*60+clock1.second; time2= clock2.hour*3600+clock2.minute*60+clock2.second; time=fabs(time1-time2); clock3.hour=time/3600; clock3.minute=time%3600/60; clock3.second=time%60;

printf(“%d: %d:%d\\n”, clock3.hour, clock3.minute, clock3.second); } 4.输入一组数据,将它们按从大到小的顺序输出,并给出每个数据所对应的原来输入次序 (利用结构类型) 。 解:#include struct s {int num;double x;} ; void main() { struct s a[10],t; int i,j; for(i=0;i<10;i++) { a[i].num=i+1;scanf(\"%lf\if(a[j].xprintf(\"%d, %.3f\\n\.有 10 个学生,每个学生的数据包括学号、姓名、三门课的成绩。数据从键盘输入,要求 打印出每个学生的总分、三门课的总平均成绩,以及总分最高的学生数据。 解:#include \"stdio.h\" struct student { char num[6]; // 学号 char name[8]; //姓名 int score[4]; //成绩 float avr; //每人平均成绩 }stu[10]; void main() 75 { int i,j,max=0,maxi=0,sum; float aver=0; for(i=0;i<10;i++) { scanf(\"%s\

scanf(\"%s\姓名 总分\\n”); for(i=0;i<10;i++) { sum=0; for(j=0;j<3;j++) sum+=stu[i].score[j]; stu[i].avr=sum/3.0; aver+=stu[i].avr; if(sum>max){max=sum;maxi=i;} printf(“%-8s %-7d\\n”,stu[i].name,sum); } aver=aver/10; for(i=0;i<10;i++) { printf(\"%8s%10s\printf(\"%7d\平均成绩是%5.2f\\n\printf(\"最好成绩的学生是%s,总分是 %d\\n\.建立一个链表,每个结点包括:学号、姓名、性别、年龄。输入一个年龄,如果链表中 的结点所包含的年龄等于

此年龄,将此结点删除。 解:#include \"stdio.h\" #define NULL 0 #define LEN sizeof(struct student) struct student { char num[6]; //学号 char name[8]; //姓名 char sex[2]; //性别 int age; //年龄 struct student *next; } stu[10]; void main() { struct student *p,*pt,*head; int

i,length,iage,flage=1; int find=1; 76 scanf(\"%d\输入链表长度 for(i=0;inext=p; pt=p; scanf(\"%s\scanf(\"%s\while(p!=NULL) { printf(\"%8s%8s%6s%6d\\n\输出链表 p=p->next; } scanf(\"%d\输入年龄 pt=head; p=pt; if(pt->age==iage) { p=pt->next; head=pt=p; find=1; } else pt=pt->next; while(pt!=NULL) { if(pt->age==iage) { p->next=pt->next; find=1;} else p=pt; pt=pt->next; } if(!find) printf(\"没找到 %d\\n\{ printf(\"%8s%8s\7.用一个结构数组存放一个班学生的信息(包括学号、姓名、性别、年龄、五门课成绩) , 要求先输入学生人数。 将其中所有的女生信息复制到另一个结构数组中, 并按平均成绩的降 序输出女生信息。 解:#include #define N 50 void main() { struct student { char num[8],name[10]; char sex; int age; float score[5]; float aver; }stu[N],girl[N],temp; int i,j,n,m,k; float sum; printf(“请输入学生人数:”); while(scanf(“%d”,&n),n>50); printf(“请输入%d 个学生信息:\\n”,n); for(i=0;iscanf(“%c%d”,&stu[i].sex,&stu[i].age); sum=0; for(j=0;j<5;j++) { scanf(“%f”,&stu[i].score[j]); sum+=stu[i].score[j]; } stu[i].aver=sum/5; } for(i=0,j=0;igirl[j++]=stu[i]; m=j; for(i=0;igirl[k].aver) k=j; temp=girl[i]; girl[i]=girl[k]; girl[k]=temp; } for(i=0;i{ printf(“%10s%10s”,girl[i].num,girl[i].name); printf(“%2c%3d”,girl[i].sex,girl[i].age); for(j=0;j<5;j++) printf(“%3.0f”,girl[i].score[j]); printf(“%3.0f\\n”, girl[i].aver); } } 78 *8.输入不超过 100 个通讯录数据(姓名、电话号码,电话号码为 7 位数字) ,要求输入 通讯录个数。将原 7 位的电话号码改为 8 位,规则是原来以 2、4 开头的号码的在前面加一 位 6,原来以 1、5 开头的号码的在前面加一位 9,其他在原号码前面加一位 8。输出处理后 的通讯录数据。 解:#include #define N 100 void main() { struct { char name[10],tel[9]; } addr[N]; int i,j,n; printf(“请输入通讯录数:”); while(scanf(“%d”,&n),n>100); for(i=0;i=0;j--)addr[i].tel[j+1]=addr[i].tel[j]; addr[i].tel[0]=’6’; } else

if(*addr[i].tel==’1’||*addr[i].tel==’5’) { for(j=6;j>=0;j--)addr[i].tel[j+1]=addr[i].tel[j]; addr[i].tel[0]=’9’; } else { for(j=6;j>=0;j--)addr[i].tel[j+1]=addr[i].tel[j]; addr[i].tel[0]=’8’; } }

printf(“新的通讯录:\\n”); for(i=0;i #include struct link { int data; struct link *next; }; struct ling *find(struct link *head,int x) { struct link *p,*q,*s; if(head->data==x) head=head->next; else if(xdata) 79 { s=(struct link

*)malloc(sizeof(struct link)); s->data=x; s->next=head; head=s; } else { q=head; p=head->next; while(p!=NULL) { if(p->data==x){ q->next=p->next; break; } else if(xdata) { s=(struct link *)malloc(sizeof(struct link)); s->data=x; s->next=p; q->next=s; break; } p=p->next; } if(p==NULL) { s=(struct link *)malloc(sizeof(struct link)); s->data=x; s->next=NULL;

q->next=s; } } return head; } *10.输入一英文句子(以“.”结束) ,输出其中所包含的英文字母,要求用链表完成, 每一节点的数据成员存放一个所出现的字母。 解:#include #include struct node { char c; struct node *next; }; void main() { struct node *head,*p,*q; char str[81]; int i=0; head=NULL; while((str[i]=getchar())!=’.’) { if(str[i]>=’A’&& str[i]<=’Z’|| str[i]>=’a’&& str[i]<=’z’) { p=head; while(p!=NULL) if(p->c==str[i]) break; else { q=p; p=p->next; } if(p==NULL) { p=(struct node *)malloc(sizeof(struct node)); p->c=str[i]; p->next=NULL; if(head==NULL) head=p; else q->next=p; } 80 } i++; } p=head;

while(p!=NULL) { printf(“%2c”,p->c); p=p->next; } } *11.将一个链表按逆序排列,即将原来链头当作新链表的链尾,而原链尾当作链头。 解:#include struct link { int data; struct link *next;}; struct link *f(struct link *head) { struct link *p,*q,newhead=NULL,*s; while(head->next!=NULL) { p=head; while(p->next!=NULL) { q=p; p=p->next;}

if(newhead==NULL) newhead=p; else s->next=p; s=p; q->next=NULL; } s->next=head; return newhead; } 习 题 10 一、计算下列表达式的值 1.3&6 2.-12&7 5. (x=13)^9 6.15/2^1 9.7<<2 10.-9<<2 解:(1) 3&6 值为 2 (3) 3|9 值为 11 (5) (x=13)^9 值为 4 (7) ~-14 值为 13 (9) 7<<2 值为 28 (11) (x=13)>>2 值为 3 3.3|9 7.~-14 11. (x=13)>>2 (2) -12&7 值为 4 (4) -02||12 值为 1 (6) 15/2^1 值为 6 (8) ~15/3 值为 -5 (10) -9<<2 值为 -36 (12) -9>>3 值为 –2 4.-02||12 8.~15/3 12.-9>>3 二、若有语句“short a,b;,分别写出执行下列语句后 a、b 的值 ” 1.a=2;b=7;a&b; 2.a=-3;b=a|4; 81 3.a=5;b=a<<2; 解:(1) a 为 2,b 为 7 (3) a 为 5,b 为 20 4.a=-15;b=~a>>2 (2) a 为 -3,b 为 –3 (4) a 为 -15,b 为 3 三、写出下列程序的输出结果 1. #include int main(void) { union { char s[2]; int i; }g; g.i=0x4142; printf(\"g.i=%x\\n\g.s[0]=1; g.s[1]=0; printf(\"g.s=%x\\n\解:g.i=4142 g.s[0]=42 g.s=1 2. g.s[1]=41 #include void main() { union { char n[12];int m[4];double x[2];} a;

printf(\"%d\\n\解:16 3. void main() { int x=3,y=9; x=x^y; y=x^y; x=x^y; printf(\"%d,%d\\n\解:9,3 4. #include void swp(int *x,int *y) { *x=*x^*y; *y=*x^*y; *x=*x^*y; } void main() { int a,b,i; for(i=0;i<4;i++){ scanf(\"%d%d\swp(&a,&b); 82 printf(\"%d,%d\\n\运行时输入: 9 8 1 23 –9↙ 4↙ –5↙ –1↙ 解:-9,9 4,8 -5,1 -1,23 四、编程题 1.输入一个整数,并输出该数的机内码。 解:#include void main() { int a; scanf(“%d”,&a); printf(“%xH”,a); } 2.输入一个整数,将其低 8 位全置为 1,高 8 位保留原样,并以十六进制输出该数。 解:#include void main() { int a; scanf(“%d”,&a); a|=0xff; printf(“%xH”,a); } 3.输入一个字符串,删除字符串中的所有非汉字的字符,并输出该字符串。 解:#include #include void main() { char str[81]; int i; gets(str); for(i=0;str[i]!=’\\0’;) if((str[i]&0x80)==0) strcpy(str+i,str+i+1); else i++; puts(str); } *4. 对文本的简单加密与解密。输入一个文本及任意一个密码值,对该文本加密后,输出密 文;重新输入密值后,输出解密后的原文。 解:#include 83 void main() { char s[81]; int m1,m2,i; printf(“请输入要加密的文本:\\n”); gets(s); // 输入原文 printf(“请输入密码(1~255) :\\n”); scanf(“%d”,&m1); // 输入密码 for(i=0;s[i]!=’\\0’;i++) s[i]^=m1; // 对原文加密 printf(“密文:\\n%s\\n”,s); // 输出加密文 printf(“请重新输入密码(1~255) :\\n”); scanf(“%d”,&m2); // 输入密码 for(i=0;s[i]!=’\\0’;i++) // 解密 s[i]^=m2; printf(“解密后的原文:\\n%s\\n”,s); // 输出解密文 if(m1!=m2) { printf(“密码无效!\\n”); printf(“解密后的文本不是原文本!\\n”); } } 习 题 11 一、写出下列 fopen 函数调用所打开文件的读写方式与文件存储格式 1.fpt = fopen(\"d:\\\\\\dat\\\\ex1.dat\",\"w\")。 解:新建文本文件 2.fpt = fopen(\"d:\\\\\\dat\\\\ex1.dat\",\"wb\")。 解:新建二进制文件 3.fpt = fopen(\"d:\\\\\\dat\\\\ex1.dat\",\"r+\")。 解:可读写文本文件 4.fpt = fopen(\"d:\\\\\\dat\\\\ex1.dat\",\"ab\")。 解:追加记录二进制文件 5.fpt =

fopen(\"d:\\\\\\dat\\\\ex1.dat\",\"w+\")。 解:新建可读写文本文件 二、填空题 1.fopen 函数的返回值是 。 解:文件读写的首地址或 NULL。 2.文件打开方式为“r+” ,文件打开后,文件读写位置在 解:文件的第一个记录前。 3.文件打开方式为“a” ,文件打开后,文件读写位置在 解:文件的最后一个记录后。 或 。 4.表达式“fgetc(fpn)”的值为 84 。 。 解:所读入字符的 ASCII 值或文件结束标志 EOF。 或 。 5.表达式“fgets(a,10,fpn)”的值为 解:字符串 a 的地址或 NULL。 6.函数 fscanf 的返回值为 或 。 解:所读入的数据个数或 EOF。 7.函数 fread 的返回值为所读入数据的个数或 。 解:0 。 8.表达式“fscanf(fpn,\"%f\",&x)”的值为-1 时,函数 feof()的值为 解:1 9.文本文件 a.dat、b.dat 中每行存放一个数且均按从小到大存放。下列程序将这两文件中数 据合并到 c.dat,文件 c.dat 中数据也要从小到大存放。请填空将程序补充完整、正确(若文 件 a.dat 数据为 1、

6、9、18、27、35,文件 b.dat 数据为 10、23、25、39、61,则文件 c.dat 中数据应为 1、6、9、10、18、23、25、27、35、39、61) 。 #include #include void main() { FILE *f1,*f2,*f3; int x,y; if((f1=fopen(\"a.dat\文件 a.dat 不能打开!\\n \"); exit(0); } if((f2=fopen(\"b.dat\文件 b.dat 不能打开!\\n \"); exit(0); } if(( )==NULL) { printf(\"文件 c.dat 不能打开!\\n \"); exit(0); } fscanf(f1,\"%d\while(!feof(f1)&&!feof(f2)) if( ) { fprintf(f3,\"%d\\n\{ fprintf(f3,\"%d\\n\

while(!feof(f2)){ fscanf(f2,\"%d\

fprintf(f3,\"%d\\n\解:①f3=fopen(\"c.dat\③ x #include void main() 85 { char name[9],na[9]; int score,sc,i,pt1,pt2,flag;; FILE *p1; if((p1=fopen(\"d:\\\\file1.dat\文件不能打开!\\n\"); exit(0); } scanf(\"%s%d\读入第一个人的姓名、成绩并写入文件

fprintf(p1,\"%8s%3d\\n\读入其他人的姓名、成绩 rewind(p1); //将读写位置移动到文件头

while(fscanf(p1,\"%8s%3d\\n\–13,1); pt1=ftell(p1); //确定数据的插入位置 ; pt2=ftell(p1); //确定文件尾部位置 for(i=pt2-13;i>=pt1; i=i-13) { fseek(p1,i,0); fscanf(p1,\"%8s%3d\\n\

fprintf(p1,\"%8s%3d\\n\键盘输入数据已插入,标志位置 0 break; } if( ) { //若数据未插入,则在文件末尾插入 //移动文件读写位置到文件末尾

fprintf(p1,\"%8s%3d\\n\解:①flag=1 ④ flag==1 ② fseek(p1,0,2) ③ fprintf(p1,\"%8s%3d\\n\⑤ fseek(p1,0,2) 三、编程题 1.输入若干同学的姓名、学号、三门功课成绩,写入到磁盘文件中(文件名自定) 。 解:#include #include struct stu { char name[9],num[9]; int sc[3]; }; void main() { FILE *fp; struct stu x; if((fp=fopen(“a.txt”,”w”))==NULL) { printf(“不能打开文件 a.txt !”); exit(0); } while(scanf(“%s%s%d%d%d”,x.name,x.num,&x.sc[0],&x.sc[1],&x.sc[2])!=EOF)

fprintf(fp,“%s %s %d %d %d\\n”,x.name,x.num,x.sc[0],x.sc[1],x.sc[2]); fclose(fp); } 86 2.编程,顺序读入题 1 所建立磁盘文件中各个同学的姓名、学号、成绩,显示输出。 解:#include #include struct stu { char name[9],num[9]; int sc[3]; }; void main() { FILE *fp; struct stu x; if((fp=fopen(“a.txt”,”r”))==NULL) { printf(“不能打开文件 a.txt !”); exit(0); }

fscanf(fp,“%s%s%d%d%d”,x.name,x.num,&x.sc[0],&x.sc[1],&x.sc[2]); while(!feof(fp)) { printf(“%s %s %d %d %d\\n”,x.name,x.num,x.sc[0],x.sc[1],x.sc[2]);

fscanf(fp,“%s%s%d%d%d”,x.name,x.num,&x.sc[0],&x.sc[1],&x.sc[2]); } fclose(fp); } 3.编程,输入一个同学的学号,从题 1 所建立的磁盘文件中删除该同学的信息。 解:#include #include #include struct stu { char name[9],num[9]; int sc[3]; }; void main() { FILE *fp1,*fp2; struct stu x; char num[9]; gets(num);

if((fp1=fopen(“a.txt”,”r”))==NULL) { printf(“不能打开文件 a.txt !”); exit(0); } if((fp2=fopen(“b.txt”,”w”))==NULL) { printf(“不能打开文件 b.txt !”); exit(0); } fscanf(fp1,“%s%s%d%d%d”,x.name,x.num,&x.sc[0],&x.sc[1],&x.sc[2]); while(!feof(fp1)) { if(strcmp(x.num,num)!=0)

fprintf(fp2,“%s %s %d %d %d\\n”,x.name,x.num,x.sc[0],x.sc[1],x.sc[2]);

fscanf(fp1,“%s%s%d%d%d”,x.name,x.num,&x.sc[0],&x.sc[1],&x.sc[2]); 87 } fclose(fp1); fclose(fp2); remove(“a.txt”); rename(“b.txt”,”a.txt”); } 4.编程,读入若干行字符(每行不超过 80 个) ,写入文本文件(文件名自定) 。 解:#include #include void main() { FILE *fp; char str[81],name[80]; printf(“请输入文件名:”); gets(name); if((fp=fopen(name,”w”))==NULL) { printf(“不能打开文件%s !”,name); exit(0); } while(gets(str)!=NULL) { fputs(str,fp); fputc(‘\\n’,fp); } fclose(fp); fp=fopen(name,”r”); while(fgets(str,80,fp)!=NULL) puts(str); fclose(fp); } 5.编程,合并文件,将第二个文本文件的所有字符顺序添加到第一个文本文件之后,变成 一个文件。 解:#include #include void main() { FILE *fp1,*fp2; char file1[80],file2[80]; char ch; printf(“请输入第一个文件名(例如 a.txt) :\\n”); gets(file1); printf(“请输入第二个文件名(例如 b.txt) :\\n”); gets(file2); if((fp1=fopen(file1,”a”))==NULL) { printf(“不能打开文件%s !\\n”,file1); exit(0); } if((fp2=fopen(file2,”r”))==NULL) { printf(“不能打开文件%s !\\n”,file2); exit(0); } while((ch=fgetc(fp2))!=EOF) fputc(ch,fp1); 88 fclose(fp1); fclose(fp2); } 6.编程,修改题 4 所建立的文本文件,在每一个字符“.”后面增加一个空格符。 【提示】参考例 11.8,逐个读入字符写入到临时文件,当读到“.”时多写一个空格符到临 时文件。 解:#include #include void main() { FILE *fp1,*fp2; char str[81],name[80],c; printf(“请输入文件名:”); gets(name); if((fp1=fopen(name,”r”))==NULL) { printf(“不能打开文件%s !”,name); exit(0); } if((fp2=fopen(“d:\\\\ls.txt”,”w”))==NULL) { printf(“不能打开文件 d:\\\\ls.txt!”); exit(0); } while((c=getc(fp1))!=EOF) { fputc(c,fp2); if(c==’.’) putc(‘ ‘,fp2); } fclose(fp1); fclose(fp2); remove(name); rename(“d:\\\\ls.txt”,name); fp1=fopen(name,”r”); while(fgets(str,80,fp1)!=NULL) puts(str); fclose(fp1); }

因篇幅问题不能全部显示,请点此查看更多更全内容