《C--语言程序设计》第3次作业讲评

上传人:38****5 文档编号:70594451 上传时间:2022-04-06 格式:DOC 页数:11 大小:99KB
收藏 版权申诉 举报 下载
《C--语言程序设计》第3次作业讲评_第1页
第1页 / 共11页
《C--语言程序设计》第3次作业讲评_第2页
第2页 / 共11页
《C--语言程序设计》第3次作业讲评_第3页
第3页 / 共11页
资源描述:

《《C--语言程序设计》第3次作业讲评》由会员分享,可在线阅读,更多相关《《C--语言程序设计》第3次作业讲评(11页珍藏版)》请在装配图网上搜索。

1、精选优质文档-倾情为你奉上C+语言程序设计第三次作业讲评说明:本次作业对应教材第六、七章的内容。【讲评】本章主要考核大家对指针的概念的理解,要求掌握指针变量的定义和初始化、指针的各种操作、一维数组元素的下标访问方式与指针访问方式及其之间的转换、引用的概念以及动态空间管理等内容。内容相对前面章节比较难,希望通过作业讲评能够帮助大家把学习中的难题一一解决。下面是对部分问题的讲评。一、填空题1假定p所指对象的值为28,p+1所指对象的值为62,则* p + +的值为 28 。【讲评】这中题目比较难,因为前+和后+的操作本来对大家来说就很迷糊,再加上指针的操作就更乱了,其实只要理清思路,这中问题不难做

2、,最好在纸上画一个图更容易理解。为了便于理解,我们先将p这个指针所指的地址假设为1000,那么在内存1000处,就存放这28这个值,而下一个单元即1004处存放着62这个值。如下左图: 这里*p+的操作相当于*(p+),先执行括号内的操作p+,注意无论是p+还是+P,最终的结果都会使p增1,因为p是一个指针,那么增1的操作实际上就是使得p的值增加一个单元的字节数4,p的值变为1004,也就是使p指向下一个单元。但注意这里是后增1的操作所以表达式(p+)取值应该取增1之前的原来p的值1000,在执行*的操作,就是取1000处的数据,显而易见为28。但执行完成后,p的所指的值为62,如上右图所示。

3、注意题目的问法。2假定p所指对象的值为28,p+1所指对象的值为62,则* + + p的值为 62 。【讲评】同上一题比较,这里将原来的后+操作变成了前+,具体的就不阐述了,这次表达式在取值的时候取得是p增1之后的值即1004处的数据62。3假定p所指对象的值为25,p+1所指对象的值为50,则执行“(*p)+ +;”语句后,p所指对象的值为 26 。【讲评】注意这个题目的问法和上面两个不一样,这个问执行整个语句后,p所指的值,而上面两题的问法是整个表达式的值。你在完成时,还是用上面的方法画图。 (*p)+ +的执行过程,应该先执行括号内的操作。取当前p所指对象的值25,再另其进行后增1的操作

4、,那么此处的25应该变为26,注意这里没有问“(*p)+ +的值是什么”,如果问了,那么(*p)+ +的值应该是增1之前的值25,而这个题问你的是,语句执行后,p所指对象的值,所以为26。4假定p所指对象的值为25,p+1所指对象的值为50,则执行“*(p+ +);”语句后,p所指对象的值为 50 。【讲评】根据上面的方法可自己分析。5假定a是一个指针数组,则a+i所指对象的地址比a地址大 4*i 字节。【讲评】参看教学辅导第六章的内容,里面有图帮助理解,后面的几个题目也是如此。6假定a是一个一维数组,则ai的指针访问方式为 *(a+i) 。7假定a是一个二维数组,则ai j的指针访问方式为

5、*(ai+j) 或*(*(a+i)+j) 。8假定a是一个一维数组,则ai对应的存储地址(以字节为单位)为 a+i*sizeof(a0) 。9假定一个二维数组为aM N,则ai j对应的存储地址(以字节为单位)为 a+(i*N+j)*sizeof(aij) 。10假定一个二维数组aM N,则ai的地址值(以字节为单位)为 a+(i*N)*sizeof(a00) 或a+i*sizeof(ai) 。11假定p是一个指向float型数据的指针,则p+1所指数据的地址比p所指数据的地址大 4 字节。12假定a为一个字符数组名,则元素a8的字节地址为 a+8 。13假定a为一个整型数组名,则元素a4的字

6、节地址为 a+16 。14假定一个结构类型的定义为“struct Aint a,b;short c;A*d;”,则该类型的大小为 14 字节。【讲评】这种题目考题中经常出现,先把结构中有几个成员搞清楚,结构类型的大小就是它的所有成员所占空间大小之和。这里结构体A中共有4个成员:整型变量a和b,短整型变量c,结构体A型指针变量d,a、b、c共占有4+4+2=10个字节的空间,容易搞错的是d所占字节数,记住不管是什么类型的指针变量永远占有4个字节。所以答案是14个字节。15假定一个结构类型的定义为“struct Bint a8;char* b;”,则该类型的大小为 36 字节。【讲评】这个应该不难

7、理解,48+4=3616假定一个结构类型的定义为“struct Dint a;unionint b;double c;D*d3;”,则该类型的大小为 24 字节。【讲评】这里容易错的是中间的联合体union部分,注意结构体D中只有三个成员而不是四个,因为中间的联合体只取其中一个成员,所占空间就是它的所有成员中占空间最大的那个,所以联合所占空间为8个字节(来自double c)。对于指针数组d所占的空间,不要搞错,这个数组共有3个元素,每个元素都是指针,而每个指针都占4个字节,所以该数组所占空间为43=12个字节,本题答案是:4+8+12=24字节17假定要动态分配一个类型为Worker的具有n

8、个元素的数组,并由r指向这个动态数组,则使用的语句为 Worker *r=new Workern; 。18假定要访问一个结构x中的由a指针成员所指向的对象,则表示方法为 *(x.a) 。19假定要访问一个结构指针p所指对象中的b指针成员所指的对象,则表示方法为 *(p-b) 。二、给出下列程序运行后的输出结果1includevoid main()int a8=7,9,11,13,3,8,15,17;int *p = a;for(int i =0;i8;i + +)coutsetw(5) * p + +;if(i +1)%4 = =0)coutendl;791113381517【讲评】这个程序的

9、关键之处在于指针p和数组a的关系,第一条语句定义了一个整型数组a并进行初始化,第二条语句定义了一个整型指针p,并用数组名对其赋值,这就使得p指向数组,成为a0的地址,第三条语句是一个for循环,通过*p+的操作依次访问数组中的元素,循环体中的第一条语句是按照规定格式(setw(5)是另其后面输出的数据占据5个字符的位置)输出当前p所指的数组元素,然后使得p指向下一个单元,第二条语句是控制每行输出四个元素后输出一个回车换行。2includevoid main()int a5=3,6,15,7,20;int *p = a;for(int i = 0;i5;i + +)coutsetw(5) * p

10、 + +;coutendl;for(i =0;i5;i + +)coutsetw(5) * p;coutendl;36157202071563【讲评】这个程序的第一个循环和上面一题的访问数组元素并输出是一样的,执行第二个循环时,p已经指向数组最末元素20的下一个单元,通过-p,先将p向前移动一个单元,指向20,在利用*操作将当前元素输出,达到反序输出数组元素的目的。3includevoid main()int a8 =4,8,12,16,20,24,28,32;int *p = a;docout *p ;p + =3;while(pa+8);coutendl; 41628【讲评】前两条语句不用

11、说了,第三条语句是一个do循环,第一次进入循环输出当前p所指的元素是4,通过p+=3的操作,使得p向后移动3个单元,指向a3即16,判断当前的循环条件pa+8吗?当前p的值相当于a+3,所以条件成立,第二次进入do循环,输出当前p所指向的元素16,再向后移动3个单元,指向a6即28,当前p的值相当于a+6仍然满足循环条件,再次进入循环,继续输出28,再向后移动3个单元,此时p的值相当于a+9,不再满足pa+8的循环条件,结束循环。4includevoid main()int x =20,y =40, * p;p =&x;/此时的状态参看图1cout * p ; * p= x +10;/此时的状

12、态参看图2p =&y;/此时的状态参看图3cout * pendl;* p = y +20;/此时的状态参看图4cout x y endl;20403060【讲评】这个题目可以根据下图完成,具体参看上面的注释。 5includeint LA(int * a,int n)int s = 0;for(int i =0;in;i + +)s + = ai;return s;void main()int a =5,10,15,20,25,30;int b =LA(a,5);int c =LA(a+3,2);cout b c b +2 * cendl;结果:7545165【讲评】这是一个具有子函数的程序

13、,需要理解函数调用以及参数传递的原理。首先应该能看懂子函数的功能,它是对指针a所指处的n个元素进行累加后返回累加和。其次回到主函数中看函数调用中的实参,第一次函数调用为LA(a,5),这就需要对数组a的前5个元素进行累加,可得结果75赋值给变量b。第二次函数调用为LA(a+3,2),这时第一个参数为a+3,应该指向a3,第二个参数为2,那么应该完成从a3起的2个单元元素的累加,也就是20+25结果为45赋值给变量c,最后输出结果中有一个表达式为b+2*c,把值代入后计算即可。6includevoid LC(int a,int b)int x = a;/此时状态看图3a = b;/此时状态看图4

14、b = x;/此时状态看图5cout a b endl;void main()int x =15,y =36;/此时状态看图1LC(x,y);/调用函数,跳转到子函数处进行参数传递,并参看状态图2cout x y endl;结果:36151536【讲评】这是一个典型的值传递的函数调用的实例。子函数的功能是对参数a和b的值进行互换。主函数中通过函数调用想达到对实参x和y值的对换,但是结果却没有达到,为什么?从主函数入口开始执行程序,请结合注释和下图来看。 图1图2图3图4图57includevoid LF(int & x, int y)x = x + y;/此时状态看图3y = x + y;/此

15、时状态看图4cout”x =” x ”,y =” y endl;/图4中红色x和yvoid main()int x =5,y =8;/此时状态看图1cout”x =” x ”,y =” y endl;LF(x,y);/调用函数,跳转到子函数处进行参数传递,并参看状态图2cout”x =” x ”,y =” y endl;/图4中蓝色x和y结果:x=5,y=8 x=13,y=21 x=13,y=8【讲评】这是一个引用作为参数的实例。注意引用作为形参后,那么形参的改变将导致实参的改变。还是结合图来看,在图2中,为形参(红色)分配空间时候,因为第一个形参x是引用方式,所以不会为x分配空间,而是和实参

16、x占用同一个空间 8includevoid LG(int * & a, int & m)a = new intm;int * p = a;/此时状态看图1for(int i = 0;im;i + +)* p + + =2 * i +1;void main()int * p, n =5;LG(p,n);for(int i = 0;in;i + +)cout pi ;coutendl;delete p;结果:13579【讲评】在下图中红色的p为主函数中的指针p,黑色p为子函数中的p,前者始终没有移动,后者在子函数的for循环中向后移动。主函数第二条语句为函数调用,此时转到子函数处开始执行,前两条语

17、句后状态如图所示: 图1子函数中的for循环的执行过程,内存中的变化如以下几图所示: 子函数执行完毕后,其中的两个参数生存周期结束,黑色的a和p消失,如下图所示在这个基础上通过for循环,再以为p作为数组名一次访问数组中的元素输出。9includevoid LH(int * a, int n)int * p = a + n1;whlie(ap)int x = * a;* a = * p;* p = x;a + +;p ;void main()int * d = new int5;int i;for(i = 0;i5;i + +)di=2 * i +3;coutsetw(5)di ;couten

18、dl;LH(d,5);for(i = 0;i5;i + +)coutsetw(5)di ;coutendl;delete d;结果: 357911 119753【讲评】此题的解法可参考上面的方法。10includestruct Workerchar name15;/ /姓名int age;/ /年龄float pay;/ /工资;void main()Worker x =”weirong”,55,640;Worker y, * p;y = x;p =&x;cout y. name y. age y. payendl;coutname age+5 pay10”,具体内容参看第七章教学辅导。11i

19、ncludeincludestruct Workerchar name15;/ /姓名int age;/ /年龄float pay;/ /工资;void main()Worker x;char * t =”liouting”;int d =46;float f =725;strcpy(x. name, t);x. age = d;x. pay = f;cout x. name x. age x. payendl;结果:liouting46725三、写出下列每个函数的功能1includevoid LI(int n)int * a = new intn, * p = a + n;for(int i

20、 =0;i ai;for(i = n1;i =0;i )cout *( p) ;cout n;delete a;把从键盘上输入的n个整数按与输入相反的顺序显示出来。【讲评】这个题目的关键之处在于对于指针p的初始化p = a + n,这就使得p指向数组a的末元素的下一单元。在第二个循环的循环体中通过*( p)使得p向前逐一移动一个单元并将其中元素输出。2includevoid LK(int a , int n, int * & b, int& m)float s =0;int i;for(i =0;in;i + +)s + = ai;s/= n;m = 0;for(i =0;i = s)m +

21、+;b = new intm;int * p = b;for(i =0;i = s)* p + + = ai;把数组a的n个元素中大于等于平均值的所有元素值依次写入到由引用参数b所指向的动态数组中,其元素个数由引用参数m返回。【讲评】函数第一行定义了两个变量,浮点型变量s并赋值为0,整型变量i,通过一个for循环完成数组中n个元素的累加,这里s之前初始化为0是必然的。通过s/= n;即s=s/ n完成求平均数,注意这里的s类型为float,说明这个除法不是整除。形参m是一个引用,初始化为0,实际上它是一个计数器,通过for循环,对数组a中的n个元素进行判断,如果比平均数s大,那么就是计数器m加

22、1。形参b是一个指针引用,通过new操作动态申请了m个单元的数组空间指针变量p初始化为b,则使得p指向了刚刚申请的数组空间的首个元素最后,通过for循环,将数组a的n个元素中大于等于平均值的所有元素值依次写入到动态数组中。3/ /struct Worker/ / char name15;/ /姓名/ / int age;/ /年龄/ / float pay;/ /工资/ /;istream & operator(istream& istr,Worker& x)cout”请输入一个职工记录:姓名、年龄、工资” x. name x. age x. pay;return istr;重载提取操作符,用

23、于从输入流中输入一个Worker类型的记录到x中。【讲评】程序很简单,但是比较难记,主要这里涉及到输入流的概念,在后面第九章中有介绍。4/ / struct StrNode/ / char name15;/ /字符串域/ / StrNode * next;/ /指针域/ /;void QB(StrNode * & f, int n)if(n = = 0)f =NULL;return;f =new StrNode;cinfname;StrNode * p = f;whlie( n)p = pnext= new StrNode;cinpname;pnext=NULL;建立一个具有n个结点的链表,每个结点的字符串值由键盘输入,链表的表头指针由引用变量f带回。【讲评】动态空间的一个典型应用,具体讲解参看书中解释。5/ / struct StrNodechar name15;StrNode * next;void QC(StrNode * f)whlie(f)coutnamenext;遍历f单链表,即从表头结点开始依次输出f单链表中每个结点的值。【讲评】同上题。专心-专注-专业

展开阅读全文
温馨提示:
1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
2: 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
3.本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!