《C语言程序设计项目化教程(周雅静第3版) 训练及综合练习答案 项目6 训练与作业参考答案.docx》由会员分享,可在线阅读,更多相关《C语言程序设计项目化教程(周雅静第3版) 训练及综合练习答案 项目6 训练与作业参考答案.docx(24页珍藏版)》请在第一文库网上搜索。
1、项目6用指针优化学生成绩排名任务1了解指针实践训练初级训练1 .若有说明:inta=2,*p=&a,*q=p;则以下非法的赋值语句是(D)解释:a是整型数Int*p,*q定义了指针,p,q是指向整型的指针P取得a的地址,而q取得P的地址,p,q是指针(也就是一个地址),而*p,*q是这个指针指向的整型数值(存放在这个地址的值)。A)把q的地址给p,则P和q完全一样了,都指向一个数2。B)把q中的数据给p。C)把q中的数据给a。D)a中数据是2,不能给一个地址,除非*q=a.答案:D2 .若定义:inta=511,*b=&a;则Printfr%dn*b);输出结果为:(D)解释:inta=511
2、,*b=&a;表示a是整型变量,b是整型指针变量,指向a。Prindr%dn”,*b);就是输出指针变量b所指向变量的值输出结果51U答案:D3 .已有定义inta=2,*p1=&a,*p2=&a;下面不能正确执行的赋值语句是(B)。解释:a是整型变量,p1是指针变量,故B错。答案:B4 .已知在程序中定义了如下的语句:int*p1,*p2;intk;p1=&k;p2=k;则下列语句中不能正确执行的是(B)解释:p1,p2是指针,k是整型变量,变量不可以赋值给指针。A)其实是执行了k=k+k(p1,p2都指向k,所以*p1,*p2其实都是k)C)是赋值语句D)其实执行了k=k*k答案:B5 .
3、若有说明语句:ima,b,c,*d=&c;,则能正确从键盘读入三个整数分别赋给变量a,b,C的语句是(A)解释:intc,*d=&c;表示C是整型变量,d是指针,它指向变量c(即d=&c,*是指针类型的说明符),所以,C的值可以用SCanfr%d”,&c);也可以用SCanfe%d”,d);答案:A6 .若已定义inta=5;下面对(1)、(2)两个语句的正确解释是(D)(1) int*p=&a;(2)*p=a;解释:A:(I)中的*p定义P为int类型指针,(2)中的*表示P指向的变量a。B:(1)把变量a的地址赋给指针变量p,(2)是把变量a的值赋值给P所指的变量。C:前半句正确,后半句错
4、误,(2)是把变量a的值赋值给P所指向的变量。答案:D7 .若有语句int*p,a=10;P=&a;下面均代表地址的一个选择项是(D)解释:int*p是定义一个指针,p=&a,P指向a的地址,*p=a,是指向该指针所指地址中的内容,&a为a的地址,&*P=&a,P中放的是a的地址。答案:D8 .若需要建立健全如图所示的存储结构,且己有说明doub1e*p,x=0.2345;,则正确的赋值语句是:(B解释:PXA:明显是错误的,因为一个是指针变量,一个是整型变量。B:是将X的地址赋给指针变量p,所以是正确的。C:只定义了指针变量p,而没有给指针变量赋初值,给*p赋值就是给一个没有开辟的地址赋值了
5、,这样会导致程序运行是出现错误。D:明显是错误的,因为&x是地址,正确的应该为P=&x。答案:B9 .若有说明:int*p,a=1,b;以下正确的程序段是(D)解释:A:P是b的地址,所以输入语句应该是:SCanfr%d”,p)。B:没有给指针变量赋初值,给*p赋值就是给一个没有开辟的地址赋值了,所以是错误的。C:同A一样,P是b的地址,所以输入语句应该是:SCanf(%d,p)D:是正确的。答案:D10 .以下程序的输出结果是(B)深入训练1 .输入小王、小张、小李的工资,用指针的方法输出他们的工资单。程序运行结果如图6-12所示,将程序补充完整.EKF个人C语言DebugCpp1.exe届
6、入小壬K臊、小李的工资,以逗号分隔:2345,4567,4322输出小王、小张、小李的工资:234545674322PressanykeytoContinuea图672程序运行结果方法1#inc1udestdio.hmain()(inta,b,c;Printf(输入小王、小张、小李的工资,以逗号分隔:n);scanf(%d,%d,%d,&a,&b,&c);Printf(输出小王、小张、小李的工资:n*);printf(%9d%9d%9dn,*&a,*&b,*&c);要求用指针的方法)方法2ttinc1udestdio.hmain()(inta,b,c;int*aa,*bb,*cc;Printf
7、(输入小王、小张、小李的工资,以逗号分隔:n);scanf(,%d,%d,%d,&a,&b,&c);aa=&a;bb=&b;CC=Ac;Printf(输出小王、小张、小李的工资:r);printf(%9d%9d%9dn”,*aa,*bb,*cc);)2.输入小王、小张、小李的工资,用指针的方法输出他们的工资单,要求按从大到小排序。程序运行结果如图6T3所示,补充完整程序。BwD:个人C语言DebgCpp1exew4566,4322,5433排序后三位员工的工资单:543345664322Pressanykeytocontinue图6T3程序运行结果方法1ttinc1ude*stdio.hmai
8、n()inta,b,c,t;int*aa,*bb,*cc;Printf(输入小王、小张、小李的工资,以逗号分隔:n);scanf(z,%d,%d,&a,&b,&c);aa=&a;bb=&b;cc=&c;if(*aa*bb)(t=*aa;*aa=*bb;*bb=t;Jif(*aa*cc)t=*aa;*aa=*cc;*cc=t;)if(*bb*cc)t=*bb;*bb=*cc;*cc=t;)Printf(排序后三位员工的工资单:n);printf(%9d%9d%9dn”,*aa,*bb,*cc);)方法2#inc1ude*stdio.hmain()inta,b,c;int*aa,*bb,*cc,*
9、t;Printf(输入小王、小张、小李的工资,以逗号分隔:n);scanf(%d,%d,%d”,&a,&b,&c);aa=&a;bb=&b;cc=&c;if(*aa*bb)t=aa;aa=bb;bb=t;)if(*aa*cc)t=aa;aa=cc;cc=t;)if(*bb*cc)t=bb;bb=cc;cc=t;)Printf(排序后三位员工的工资单:n);printf(%9d%9d%9dn”,*aa,*bb,*cc);)方法3#inc1udevoidswap(int*a,int*b)intt;t=*a;*a=*b;*b=t;)voidmain()inta,b,c,*p1,*p2,*p3;Pri
10、ntf(请输入3个员工的工资,以逗号隔开:);scanf(%d,%d,%d,&a,&b,&c);p1=&a;p2=&b;p3=&c;if(ab)swap(p1,p2);if(ac)swap(p1,p3);if(bc)swap(p2,p3);Printf(“员工工资从高到低的顺序为:);printf(%d,%d,%dn*,*p1,*p2,*p3);)3.请写出以下程序的运行结果:程序运行结果:4 .写出程序的运行结果()程序的运行结果是:3,45 .以下程序的输出结果是()程序的运行结果是:7,16 .以下4个程序中不能对两个整型值进行交换的是(CD)任务2用指针优化全班同学一门课成绩的输入输出
11、实践训练初级训练1有以下程序程序运行后输出的结果是(5)分析:因为p指向数组a地址,所以*p=2,而q=p+1表示q指数组a2地址,所以*q=3,故*p+*q=52 .有以下程序程序运行后输出的结果是(y=7)分析:因为P指向数组a1地址,所以p0=a1=2p1=a2=3,p2=a3=4,故p1+p2=4+4=7,所以程序输出结果是y=73 .有以下程序:程序运行后输出的结果是(3456)分析:for(p=a+2;pva+6;p+)中的p=a+2,表示P指向a2的地址,*p=3,所以最后输出3456o4 .有以下程序:程序运行后输出的结果是(611)分析:因为P指向a5地址,*p=a5;而*q
12、=*(p+5),表示q指向a10的地址,*q=a10,程序运行后输出的结果是(611)o5 .以下程序的输出结果是(5)分析:因为P+,是指P指向了a1的地址,而P+3,则说明指向了a4的地址,故输出5o6 .有以下定义,则不移动指针p,且通过指针P引用值为98的数组元素的表达式为(p5或*(p+5)7 .以下程序的输出结果是(8)分析:p+表示P指向了a1的地址,p+=3表示此时的P已指向a4的地址,所以p3就与a7等同。8 .以下程序的输出结果是(b)分析:s是指针变量,s+k就是字符串的成员地址,即abode的地址。9 .以下程序的输出结果是(bcde)分析:同上10 .以下程序的输出结
13、果是(101)分析:chars=abcde)*p=s;表示指针变量是指向字符数组s的地址,p+就是字符数组b的地址,p+3是指向字符数组e的地址而e的ASCn码是101,故输出101,如果要想输出字符e,则将%d改为c。11 .以下程序的输出结果是(17)深入训练1 .小王所在小组有io位员工,现要用指针实现全体员工工资的输入输出。参考程序:#inc1udemain()itgz10,*p,i;Printf(”请输入10个员工的工资n);for(i=0;i10;i+)scanf(%d,Sgzi);Printf(输出的10个员工的工资n);for(p=gz;pgz+i;p+)printf(,%3d
14、,*p);printf(,n);)2 .有以下说明:inta=0,1,2,3,4,5,6,7,8,9,*p=a,i;则数值为4的表达式是(B)A.*p+3B.*(p+4)C.*p+=3D.p+3提示:p=a;就是让P存放数组a的首地址,是a0的内存地址,所以*p=0。3 .写出程序运行结果。提示:*p=a表示P指向数组a的首地址,*(p+5)表示a5=22,p+表示P指向数组a1的首地址,所以p+4是指向a5的首地址。程序的运行结果是:1, 224 .有以下程序,执行后的结果是(PRO)。5 .指针的方法编程:从键盘上读入20个数据到数组中,统计其中正数的个数,并计算它们之和。参考程序为:#inc1udemain()inta20,*p=a,i,s=0,n=0;Printf(”请输入20个整数n);for(i=0;i20;i+