106. 以下程序运行后,输出结果是段运行后屏幕输出为

您所在位置: &
&nbsp&&nbsp&nbsp&&nbsp
VFP考试题库(印刷有答案)要点分析.doc 78页
本文档一共被下载:
次 ,您可全文免费在线阅读后下载本文档。
下载提示
1.本站不保证该用户上传的文档完整性,不预览、不比对内容而直接下载产生的反悔问题本站不予受理。
2.该文档所得收入(下载+内容+预览三)归上传者、原创者。
3.登录后可充值,立即自动返金币,充值渠道很便利
你可能关注的文档:
··········
··········
Visual FoxPro程序设计
计算机基础教研室编写
根据教学内容和教学大纲,本着提高计算机公共课程的教学质量和教学效果,提高等级考试通过率的目的出发,特编写此书以期能指导学生上机实验及参考。读者在做习题时,应重点理解和掌握与题目相关的知识点,不要死记硬背答案,希望通过做题达到理解概念、强化命令的使用及提高编程能力。
(1)成绩评定方式:成绩由“笔试成绩、作业、实验和考勤”四部分组成。笔试70%,作业10%、实验10%、考勤10%。
(2)实验及作业要求。为促使学生课后能主动自觉学习,教师能掌握学生的学习状态及存在的问题,要求学生完成教案中指定的实验(即P214教材第2部分实验指导第1章到第5章的实验内容)。课后完成本习题集指定上交的作业,请任课教师务必敦促学生认真完成。除题后特别说明上交电子作业外,其余为纸质作业。不交作业者不得计平时成绩和作业成绩。
(3)上机要求。除教学计划的16上机学时外,可以考虑另增加自由上机10学时,用于完成实验教程的实验和作业。
(4)教学资源网站:30:8080/homeworksys/
(5)本书第7章、第12章、第13章为自学内容,不做考查。
班级:________姓名________学号________
1.写出教材P8~P9中表1-1-3、表1-1-4、表1-1-5三个表的关系模型
例;Student_tcbiao(学号,专业,外语水平,特长)
2.简述数据库、数据库管理系统、数据库系统三者的关系。
班级:________姓名________学号________
1.简述Visual FoxPro设置系统默认目录的操作步骤。
2.每次实验请设置好上机的默认工作目录。
班级:________姓名________学号________
1.建立数据库xsgl.dbc
2.在数据库xsgl.dbc中添加数据表文件student.dbf,course.dbf,cj.dbf。这三表的结构见教材P38表1-4-2,表1-4-3,表1-4-4。记录内容自拟,每个表的记录至少要十条以上。
(1)每个同学自拟的记录不得相同,否则视为拷贝。
(2)上述两题上交电子作业。
班级:________姓名________学号________
写出下列操作命令:
1.列表显示student.dbf表中性别为“男”且所在学院为“信息学院”的学生记录。
2.查询student.dbf表中是党员的学生。
3.在student.dbf表中删除姓名 “李”的学生。
4.将cj.dbf表中成绩小于60分的学生统一加10分。
5.求出课程号为1的平均成绩。
6.给student.dbf建立以学号为主索引的索引。
班级:________姓名________学号________
1.编程求N!,N由键盘输入。
2.输出200以内能被3和7整除的整数。
3.编程求任意10个数的和,并求其最大数和最小数。
班级:________姓名________学号________
1.编程查找student.dbf中姓名为李清照的学生,若找到则显示该条记录,若没找到,提示查无此人。
2. 在主程序中调用子程序、函数的方法求任一圆的面积。半径由键盘输入。
班级:________姓名________学号________
1.建立下图所示的表单包含一个标签(label1),两个命令按钮。表单的功能是:当单击“变标签”命令按钮后,标签label1的文字由“南方冶金学院”变成“江西理工大学”。当单击“退出”命令按钮后,释放表单。请写出“变标签”及“退出”命令按钮的Click事件代码。
说明:上交电子作业
2.从"学生资料"表中查询所有年龄大于22岁的学生并显示其姓名和年龄,写出SQL命令。
班级:________姓名________学号________
创建如图所示的表单,该表单的功能是:若在Text1中输入一个除数(整数),然后点击“开始”按钮,就能求出1~500之间能被此除数整除的数(整数)及这些数之和,并将结果分别在Edit1和Text2中输出。单击“清除”按钮,则清除Text1、Edit1和Text2中的内容。请将以下操作步骤和程序填写完整。上交电子作业
(1)在表单上显示文本“输入除数”,应使用(
(2)创建对象Text1,应使用(
②)控件。
(3)创建对象Edit1,应使用(
③)控件。
(4)创建“开始”按钮,应使用(
正在加载中,请稍后...表达式值的类型的决定因素为操作数的类型
时间: 20:09:06
习题1及其解答&&&&1.1选择题&&&&1.一个最简单的C++程序,可以只有一个((a)库函数(a)解释(a)冒号(a)x=a/x;(a)编译(a)whileIF(b)自定义函数d(b)汇编b)结束。(c)空格(c)a=a%x;cc)错误。(d)逻辑)。floatinteger(d)“age“(d)+(d)0x10(d)0x1fb)。-1e+50.10.1E-128e+2(c)运行(d)花括号(d)x=x*a;)属于编译错误。(b)分号(b)x=x/a;(b)连接Staticc)。(c)main函数)。(d)编译(c)编辑(d)空函数&&&&2.用C++语言编制的源程序要变为目标程序必须要经过(3.C++程序中的简单语句必须以(&&&&4.有说明inta=0;doublex=5.16;以下语句中,(c5.执行C++程序时出现的“溢出”错误属于(6.下列选项中,全部都是C++关键字的选项为((c)sizeofcaseextern(a)_abc(b)new8.C++语句中,两个标识符之间(a(a)数字(a)0a0(a)0x11(a)-1e3.5(c)0.2e-215.(b);b(b)015c(b)0xaf2e-4e-5)。&&&&(b)breakchargo(d)switcha)。&&&&7.按C++标识符的语法规定,合法的标识符是(&&&&(c)π)不能作为C++的分隔符。..(c):)。(c)080)。(c)0xg(b)12.34&&&&9.下列正确的八进制整型常量表示是(&&&&10.下列错误的十六进制整型常量表示是(&&&&11.在下列选项中,全部都合法的浮点型数据的选项为(-12345.&&&&(d)5.0e(1+4)&&&&12.下列正确的字符常量为(d&&&&(a)“a”(b)?name?(c)a13.下列选项中,(d)不能交换变量a和b的值。..(a)t=b;(c)t=a;b=a;a=b;a=t;b=t;(b)a=a+b;(d)a=b;a)。(b)p指向整型变量ib=a-b;b=a;&&&&(d)?\101?a=a–b;&&&&14.关于下列语句叙述错误的是(inti=10,*p=i;(a)p的值为10&&&&(c)*p表示变量i的值(d)p的值是变量i的地址15.有以下变量说明,下面不正确的赋值语句是(b)。...inta=5,b=10,c;int*p1=a,*p2=b;(a)*p2=b;(b)p1=a;&&&&1&&&&&&&&(c)p2=p1;16.有以下变量说明,下面正确的语句是(inta=10,b;(a)pb=a;intpa=a,pb=b;(b)pb=&&&&(d)c=*p1*(*p2);b)。(c)pb=b)。(d)*pb=*&&&&17.执行下面语句序列后,a和b的值分别为(inta=5,b=3,t;intra=a;intrb=b;t=ra=rb=t;(a)3和3(a)=(a)!(a)1(a)1(a)++(a++)(a)0intx,y;x=y=1;++x||++y;(b)3和5)优先级最高。(b)*=(b)(b)2(b)2(b)a++b(b)1d&&&&(c)5和3(c)+(c)!=c)。(c)3d)。(c)3&&&&(d)5和5(d)*(d)?:(d)4(d)4(d)a++++bb)。(d)3&&&&18.在下列运算符中,(d19.在下列运算符中,(&&&&d)优先级最低。&&&&20.设inti=1,j=2;则表达式i+++j的值为(21.设inti=1,j=2;则表达式++i+j的值为(22.在下列表达式选项中,(c)是正确。&&&&(c)a+++b(c)2),y的值是(c&&&&23.已知inti=0,j=1,k=2;则逻辑表达式++i||--j++k的值为(24.执行下列语句后,x的值是()。&&&&(a)不确定(b)0(c)1(d)225.设x为整型变量,不能正确表达数学关系1<x<5的C++逻辑表达式是(..(a)1x5(c)1xx5x+=x-=x*x;(a)25(b)40(c)–40(d)20a)。(d)427.设inta=1,b=2,c=3,d=4;则以下条件表达式的值为(ab?a:cd?c:d(a)1(b)2)。(c)100(d)45(c)328.以下逗号表达式的值为(d(a)25(b)20(b)x==2||x==3||x==4(d)!(x=1)!(x=5)c)。&&&&a&&&&)。&&&&26.已知intx=5;执行下列语句后,x的值为(&&&&(x=4*5,x*5),x+25&&&&2&&&&&&&&1.2把下列数学表达式写成c++算术表达式&&&&1.&&&&11?1?11x?y&&&&2.x{x[x(ax+b)+c]+d}+e&&&&3.ln(1+|5.cot(【解答】&&&&a?b10|)a?b&&&&4.&&&&1?&&&&2&&&&?&&&&2&&&&cos48?&&&&2&&&&1?x2)1?x2&&&&6.lg(a+ab+b)&&&&1.1/(1+1/(1+1/(x+y)))2.x*(x*(x*(a*x+b)+c)+d)+e3.log(1+pow(fabs((a+b)/(a–b)),10)4.sqrt(1+3.14159/2*cos(48*3.))5.1/tan((1-x*x)/(1+x*x))或者cos((1-x*x)/(1+x*x))/sin((1-x*x)/(1+x*x))6.log10(a*a+a*b+b*b)&&&&1.3用逻辑表达式表示下列条件&&&&1.i被j整除3.1≤x105.y2.n是小于正整数k的偶数4.x,y其中有一个小于z[10,100]&&&&?[–100,–10],并且y?&&&&6.坐标点(x,y)落在以(10,20)为圆心,以35为半径的圆内7.三条边a,b和c构成三角形8.年份Year能被4整除,但不能被100整除或者能被400整除【解答】1.i%j==03.1=xx102.(nk)(n%2==0)4.xz||yz&&&&5.!(y=-100y=-10)!(y=10y=100)6.sqrt(pow((x-10),2)+pow((y-20),2))357.a+bcb+cac+ab8.(year%4==0)(year%100!=0)||(year%400==0)&&&&1.4阅读下列程序,写出执行结果&&&&1.#includeiostrintmain(){inta=1,b=2;boolx,y;cout(a++)+(++b)&&&&3&&&&&&&&couta%x=!y=a--b;}【解答】42012.#includeiostrintmain(){intx,y,z,f;x=y=z=1;f=--x||y--z++;coutx=couty=coutz=coutf=}【解答】x=0y=0z=2f=13.#includeiostream#includeiomaintmain(){inta=123;intra=a;int*pa=a;coutsetw(5)decasetw(5)octrasetw(5)hex*}【解答】&&&&4&&&&&&&&123&&&&1737b&&&&1.5思考题&&&&1.什么叫数据类型?变量的类型定义有什么作用?【解答】数据“类型”是对数据的抽象。类型相同的数据有相同的表示形式、存储格式以及相关的操作。定义一个变量时,计算机根据变量的类型分配存储空间,并以该类型解释存放的数据。2.普通数据类型变量和指针类型变量的定义、存储、使用方式上有何区别?请编写一个程序验证之。【解答】&&&&变量类型数据指针定义类型标识符类型*标识符存储数据值地址值使用方式通过名访问即直接访问对变量内容操作通过指针变量的地址值间址访问对象&&&&验证程序:#includeiostrintmain(){inta,b,c;couta,b,c=;//对普通数据类型变量赋值//用变量地址值初始化指针变量//名访问,输出a,b,c的值//输出指针变量的地址值int*pa=a,*pb=b,*pc=c;couta,b,c=a,b,//间址访问,输出pa,pb,pc指向的变量的赋值cout*pa,*pb,*pc=*pa,*pb,*}3.什么叫数据对象的引用?对象的引用和对象的指针有什么区别?请用一个验证程序说明之。【解答】引用是为数据对象定义别名。引用与指针有以下几点区别:(1)引用名不是内存变量,而指针变量要开辟内存空间。(2)引用名需要在变量定义与变量名绑定,并且不能重定义;指针变量可以在程序中赋给不同的地址值,改变指向。(3)程序中用变量名和引用名访问对象的形式和效果一样;指针变量通过间址访问对象。验证程序:#includeiostrintmain(){couta=;intra=a;&&&&coutpa,pb,pc=pa,pb,&&&&5&&&&&&&&int*pa=a;couta的值:couta的地址:coutra的值:coutra的地址:coutpa所指向的变量的值:*coutpa的地址:}4.数据对象在C++中有什么不同的访问方式?请编写一个程序验证之。【解答】数据对象在C++中的访问方式有:名访问,引用(别名)访问,间址访问。验证程序:#includeiostrintmain(){couta=;a=a+5;cout*(a)int*pa=a;cout*intra=a;}5.为了约束对数据对象的值做只读操作,C++采用什么方式?请做出简要归纳。【解答】约束数据对象只读形式如下:&&&&约束对象标识常量指针常量指向常量的指针指向常量的指针常量常引用说明形式const类型常量标识符=常量表达式;类型*const指针;const类型*指针;或者类型const*指针;const类型*const指针;或者类型const*const指针;const类型引用名=对象名;&&&&//名访问//输出变量地址//地址访问,输出变量值//说明指针变量,指向变量a//间址访问,输出变量值//ra是a的引用//引用访问,输出变量a的值&&&&6.什么叫表达式?表达式值的类型由什么因素决定?使用不同运算符连接以下3个变量,请写出5个以上获得值等于true的表达式。inta=1,b=2;doublex=0.5;&&&&6&&&&&&&&【解答】表达式是由数据和运算符,按求值规则,表达一个值的式子。表达式值的类型的决定因素为操作数的类型。(1)如果运算符左右操作数类型相同,运算结果也是相同类型。(2)如果运算符左右操作数类型不同,首先把类型较低(存储要求,示数能力较低)的数据转换成类型较高的数据,然后运算。(3)赋值表达式的类型由被赋值变量的类型决定。当把一个表达式的值赋给一个变量时,系统首先强制把运算值转换成变量的类型,然后执行写操作。6个值等于true的表达式:(1)baax(4)a==(b*x)(2)(a+b)!=x(5)a-bx(3)a||(b+x)(6)(a/x==b)&&&&7.阅读以下程序,分析下面语句序列中每一个字符“*”和“”的意义,写出输出结果。#includeiostrintmain(){inta=10,b=20;int*p=a,*q=b;*p=*p**q;intra=a;ra=a;int*rt=q;*rt=30;couta=a\nb=b\n*p=*p\n*q=*q\nra=ra\n*rt=*}【解答】字符“*”和“”的意义见程序中添加的注释。#includeiostrintmain(){inta=10,b=20;int*p=a,*q=b;*p=*p**q;intra=a;ra=a;int*rt=q;*rt=30;//“*”是指针类型说明符,“”是引用说明符//“*”是间址访问符//“*”是指针类型说明符,“”是取址运算符//第1、2、4个“*”是间址访问符,第3个“*”算术乘运算符//“”是引用说明符&&&&//输出语句中的“*”是间址访问符couta=a\nb=b\n*p=*p\n*q=*q&&&&7&&&&&&&&\nra=ra\n*rt=*}程序输出结果为:a=200b=30*p=200*q=30ra=200*rt=30&&&&1.6编程题&&&&1.输入一个三位整数,将它反向输出。【解答】#includeiostrintmain(){intx,i,j,k;coutpleaseinputx:;i=x/100;j=x/10%10;k=x%10;}2.输入平面上某点横坐标x和纵坐标y,若该点在由图3.1表示的方块区域内,则输出1;否则,输出0。&&&&图1.11正方形【解答】#includeiostrintmain(){doublex,y,b;&&&&8&&&&&&&&coutpleaseinputx,y:;b=(-2=x)(x=2)(-2=y)(y=2);}3.输入三个整数,求出其中最小数(要求使用条件表达式)。【解答】#includeiostrintmain(){inta,b,c,temp,coutpleaseinputa,b,c:;temp=(ab)?a:b;min=(tempc)?temp:c;coutmin=}&&&&习题2及其解答&&&&2.1选择题&&&&1.已知inti=0,x=1,y=0;在下列选项使i的值变成1的语句是((a)if(xy)i++;(c)if(x||y)i++;2.设有函数关系为y=?(b)if(x==y)i++;(d)if(!x)i++;c)。&&&&1?0?1?&&&&x?0x?0x?0&&&&,下面选项中能正确表示上述关系为(c)。&&&&(a)y=1;if(x=0)if(x==0)y=0;elsey=-1;(c)if(x=0)if(x0)y=-1;elsey=0;elsey=1;&&&&(b)y=-1;if(x!=0)if(x0)y=1;elsey=0;(d)y=-1;if(x=0)if(x0)y=-1;elsey=1;)。&&&&3.假设i=2,执行下列语句后i的值为(bswitch(i){case1:i++;case2:i--;&&&&9&&&&&&&&case3:++i;case4:--i;default:i++;}(a)1(b)2(c)3(d)4)。(d)1)。(d)无限4.已知inti=0,x=0;下面while语句执行时循环次数为(dwhile(!xi3){x++;i++;}(a)4(b)3(c)25.已知inti=3;下面do_while语句执行时循环次数为(bdo{i--;}while(i!=1);(a)1for(i=0,j=5;i=j;){i++;j--;}(a)0(b)5)。(c)10(d)无限7.以下死循环的程序段是(b(b)2(c)3)。6.下面for语句执行时循环次数为(b&&&&(a)for(intx=0;x3;){x++;};(b)intk=0;do{++k;}while(k=0);(c)inta=5;while(a){a--;};(d)inti=3;for(;i;i--);&&&&2.2阅读下列程序,写出执行结果&&&&1.#includeiostrintmain(){inta,b,c,d,x;a=c=0;b=1;d=20;if(a)d=d-10;elseif(!b)if(!c)x=15;elsex=25;}【解答】20&&&&10&&&&&&&&2.#includeiostrintmain(){inta=0,b=1;switch(a){case0:switch(b){case0:couta=ab=case1:couta=ab=}case1:a++;b++;couta=ab=}}【解答】a=0b=1a=1b=23.#includeiostrintmain(){inti=1;while(i=10)if(++i%3!=1)}【解答】47104.#includeiostrintmain(){inti=0,j=5;do{i++;j--;if(i3)}while(j0);&&&&11&&&&&&&&couti=i\tj=}【解答】i=45.#includeiostrintmain(){inti,j;for(i=1,j=5;i++){j--;}couti\}【解答】36.#includeiostrintmain(){inti,s=0;for(i=0;i5;i++)switch(i){case0:case1:case2:}couts=}【解答】s=77.#includeiostrintmain(){inti,j,x=0;for(i=0;i=3;i++){x++;for(j=0;j=3;j++)s+=i;s+=i;s+=i;3j=1&&&&default:s+=2;&&&&12&&&&&&&&{if(j%2)x++;}x++;}coutx=}【解答】x=16&&&&2.3思考题&&&&1.C++中有什么形式的选择控制语句?归纳它们语法形式、应用场合。根据一个实际问题使用不同的条件语句编程。【解答】&&&&语句if语句使用方式if(表达式)语句1;else语句2;使用场合需要对给定的条件进行判断,并根据判断的结果选择不同的操作。适用于复杂的条件表达式判断。switch语句switch(表达式){case常量表达式1:语句1;case常量表达式2:语句2;case常量表达式n;语句n;[default:语句n+1;]}根据整型表达式的不同值决定程序分支的情况。适用于判断表达式简单,需要多个分支处理的情况。&&&&演示程序:程序(1)//此程序用if输出等级对应的分数段//A-=90,B-(90,80],C-(80,70],D-(70,60],,E-60#includeiostrintmain(){coutEnterthegrade:;//直到输入有效等级,否则程序不继续运行while(!((gd=Agd=E)||(gd=agd=e))){coutInvalidgrade!Pleaseretry:;}&&&&13&&&&&&&&if(gd==A||gd==a)cout\nScored90-100!\n;elseif(gd==B||gd==b)cout\nScored80-89!\n;elseif(gd==C||gd==c)cout\nScored70-79!\n;elseif(gd==D||gd==d)cout\nScored60-69!\n;elseif(gd==E||gd==e)cout\nScoreunder60!\n;elsecoutUnexpecterror!\n;//防止意外错误}程序(2)//此程序用switch输出等级对应的分数段//A-=90,B-(90,80],C-(80,70],D-(70,60],,E-60#includeiostrintmain(){coutEnterthegrade:;//直到输入有效等级,否则程序不继续运行while(!((gd=Agd=E)||(gd=agd=e))){coutInvalidgrade!Pleaseretry:;}switch(gd){caseA:casea:cout\nScored90-100!\n;caseB:caseb:cout\nScored80-89!\n;caseC:casec:cout\nScored70-79!\n;caseD:cased:cout\nScored60-69!\n;caseE:casee:cout\nScoreunder60!\n;default:coutUnexpecterror!\n;//防止意外错误}}2.什么叫循环控制?归纳比较C++中各种循环控制语句的语法、循环条件和循环结束条件的表示形式及执行流程。【解答】循环控制是在特定的条件下,程序重复执行一些特定动作。&&&&14&&&&&&&&语句&&&&while语句&&&&语法&&&&while(表达式)循环体;&&&&执行流程&&&&使用场合&&&&程序中常用于根据条件执行操作而不需关心循环次数的情况。先判断形式循环,条件不成立&&&&循环条件:表达式值为非0(真)循环结束条件:表达式值为0(假)&&&&时不进入循环体。&&&&do-while语句&&&&do循环体while(表达式);&&&&程序中常用于根据条件执行操作而不需关心循环次数。后判断形式循环,至少执行1次循环体。&&&&循环条件:表达式值为非0(真)循环结束条件:表达式值为0(假)&&&&一般情况,while语句和dowhile语句可以互换使用。&&&&for语句&&&&for([表达式1];[表达式2];[表达式3])循环体;&&&&for语句称为步长循环语句,通常用于确定循环次数的情况。由于语句的3个表达式均可以&&&&(1)表达式1称为初始化表达式,不是循环体执行部分。(2)表达式3称为后置表达式,作为循环体的最后一个执行表达式。(3)循环条件:表达式2值为非0(真)循环结束条件:表达式2值为0(假)&&&&缺省,也可以用于条件循环,即循环次数不确定的情况。&&&&3.根据一个实际问题,用不同的循环语句编程,分析其优缺点。【解答】略。4.用if语句和goto语句组织循环,改写思考题的第3小题编写的程序。分析在什么情况下可以适当使用goto语句。【解答】在不破坏程序基本流程控制的情况下,可以适当使用goto语句实现从语句结构内部向外的必要跳转,即按特定条件结束结构语句块的执行。程序略。5.有以下程序#includeiostr&&&&15&&&&&&&&intmain(){if(c==y||c==Y)inta=1;elseinta=0;couta=}编译错误为:errorC2065:a:undeclaredidentifier,指示变量a没有定义。请分析原因,并做出修改。【解答】变量a的定义不应该放在if-else语句体中。说明语句和执行语句的执行时机不同。变量说明要求在编译时定义存储空间,而if-else是执行语句,程序运行后才执行。正确的程序是:#includeiostrintmain(){if(c==y||c==Y)a=1;elsea=0;couta=}6.有以下程序,希望判断两个输入的整数是否相等。程序通过编译,但不能达到预期结果。请分析程序能够通过C++编译而不能得到期望结果的原因。#includeiostrintmain(){inta,b;couta:;coutb:;if(a=b)couta等于elsecouta不等于}&&&&16&&&&&&&&程序运行后,输入a的值为4,b的值为9,显示结果如下:a:4b:99等于9【解答】在if语句的判断表达式(a=b)中,赋值号“=”应该是逻辑等“==”。从语法上,C++的if语句把a=b这个赋值表达式视为逻辑表达式,没有编译错误。a=b的值决定于b。若b的输入值不等于0,if作为逻辑真(true),否则作为逻辑假(false)。所以,题目中输入b的值虽然不等于a,但表达式a=b为逻辑true,执行了if语句的第1个分支。&&&&2.4编程题&&&&1.输入某学生成绩,若成绩在85分以上输出“verygood”若成绩在60分到85分之间输出,“good”,若成绩低于60分输出“nogood”。【解答】#includeiostrintmain(){coutpleaseinputscore:;if(score=85)coutVerygood!;elseif(score=60)coutGood!;elsecoutNogood!;}2.输入三个整数,按从小到大的顺序输出它们的值。【解答】#includeiostrintmain(){inta,b,c,t;couta,b,c=;if(ab){t=a;a=b;b=t;}if(ac){t=a;a=c;c=t;}if(bc){t=b;b=c;c=t;}couta\tb\}3.输入三角形的三条边,判别它们能否形成三角形,若能,则判断是等边、等腰、还是一般三角形。【解答】&&&&17&&&&&&&&#includeiostrintmain(){doublea,b,c;couta,b,c=;if(a+bcb+cac+ab){if(a==bb==c)cout等边三角形!elseif(a==b||a==c||b==c)cout等腰三角形!elsecout一般三角形!}elsecout不能形成三角形!}4.输入百分制成绩,并把它转换成五级分制,转换公式为:&&&&grade(级别)&&&&【解答】#includeiostream&&&&A(优秀)B(良好)C(中等)D(合格)E(不合格)&&&&90??&&&&intmain(){coutscore=;if(score=0score=100){switch(int(score)/10)10:9:grade=a;8:grade=b;7:grade=c;6:grade=d;5:4:3:{casecasecasecasecasecasecasecase&&&&18&&&&&&&&casecasecase}}else&&&&2:1:0:grade=e;&&&&{cout数据输入错误!}end:}5.编程序模拟剪刀、石头和纸游戏。游戏规则为:剪刀剪纸,石头砸剪刀,纸包石头。玩游戏者从键盘上输入s(表示剪刀)或r(表示石头)或p(表示纸),要求两个游戏者交替输入,计算机给出输赢的信息。【解答】#includeiostrintmain(){charfirst,coutFirstinput(s,rorp):;coutSecondinput(s,rorp):;switch{case(first)s:{casecasecase}caser:(second)s:coutRockcrushesscissor.r:coutRocktiesrock.p:coutRockiswrappedbypaper.switch{casecasecase}s:coutScissortiesscissor.r:coutScissoriscrushedbyrock.p:coutScissorcutspaper.;//分号不能省&&&&switch(second)&&&&default:coutsecondinputerror!&&&&default:coutsecondinputerror!&&&&19&&&&&&&&case&&&&p:(second)s:coutPaperiscutbyscissor.r:coutPaperwrapstherock.p:coutPapertiespaper.{casecasecase}&&&&switch&&&&default:coutsecondinputerror!default:coutFirstinputerror!}end:;}6.输入一个整数,输出该整数的所有素数因子。例如,输入120,输出为2、2、2、3和5。【解答】#includeiostrintmain(){intm,i=2;coutpleaseinputm:;while(i=m)if(m%i==0){couti,;m=m/i;}elsei++;}7.使用迭代公式xn?1?(xn?a/xn)/2(n?0,1,2,?;x0?a/2)编程序求某一正整数a的平方根。【解答】#includeiostream#includecmintmain(){constdoubleeps=1e-8;doublea,x0,x;coutpleaseinputa:;x0=a/2;x=(x0+a/x0)/2;while(fabs(x-x0)eps)&&&&20&&&&&&&&{}&&&&x0=x;x=(x0+a/x0)/2;&&&&}8.已知X=0,10,20,?,180,求sinx,cosx和tanx的值。【解答】#includeiostream#includecmath#includeiomaintmain(){constdoublepi=3.;doublex,y1,y2,y3;coutsetw(2)xsetw(15)sin(x)setw(15)cos(x)setw(15)tg(x)for(i=0;i=18;i++){x=i*10*pi/180;y1=sin(x);y2=cos(x);y3=y1/y2;coutsetw(2)isetw(15)y1setw(15)y2setw(15)y3}}9.在100到200中找出同时满足用3除余2,用5除余3和用7除余2的所有整数。【解答】#includeiostrintmain(){for(i=100;i=200;i++){if((i%3==2)(i%5==3)(i%7==2))}}&&&&&&&&21&&&&&&&&10.求100到999中的水仙花数。所谓水仙花数是指一个三位数,它的每位数字的立方之和等于该数。例如,因为153=1+5+3,所以153为水仙花数。【解答】#includeiostrintmain(){inti,a,b,c;for(i=100;i=999;i++){a=i/100;b=(i-a*100)/10;c=i-a*100-b*10;if(i==a*a*a+b*b*b+c*c*c)}}11.求1000之内的所有完数。所谓完数是指一个数恰好等于它的所有因子之和。例如,因为6=1+2+3,所以6为完数。【解答】#includeiostrintmain(){inti,j,s;for(i=1;i=1000;i++){s=0;for(j=1;j++)if(i%j==0)s=s+j;if(i==s)}}12.编一程序显示由符号组成的三角形图案。例如,程序运行后,屏幕显示:Howmanylines?用户输入:5屏幕显示:Whatcharacter?用户输入:*则输出如下图案。****************&&&&333&&&&22&&&&&&&&*********【解答】#includeiostrintmain(){inti,j,k,n;coutHowmanylines?\n;coutWhatcharacter?\n;for(i=1;i=n;i++){for(k=1;k=n-i;k++)for(j=1;j=2*i-1;j++)}}13.已知XYZ+YZZ=532,其中X,Y和Z为数字,编一程序求出X,Y和Z的值。【解答】#includeiostrintmain(){intx,y,z,i;for(x=1;x=9;x++)for(y=1;y=9;y++)for(z=0;z=9;z++){i=100*x+10*y+z+100*y+10*z+z;if(i==532)coutx=x\ty=y\tz=}}&&&&习题3及其解答&&&&3.1选择题&&&&1.以下正确的函数原型为((a)f1(inty);(c)voidf1(intx,y);d)。(b)voidf1(x,y);(d)voidf1(int,int);c)。&&&&2.有函数原型voidfun2(int);下面选项中,不正确的调用是(&&&&23&&&&&&&&(a)inta=21;fun2(a);(c)intb=100;fun2(b);(a)doublex=2.17;fun3(x);(c)intb=100;fun3(b);&&&&(b)inta=15;fun2(a*3);(d)fun2(256);c)。(b)inta=15;(d)fun3(256);c)。(b)inta=15;(d)fun4(256);fun4(a*3.14);fun3(a*3.14);&&&&3.有函数原型voidfun3(int*);下面选项中,正确的调用是(&&&&4.有函数原型voidfun4(int);下面选项中,正确的调用是((a)inta=2.17;fun4(a);(c)intb=100;5.有声明voidfun5(int*);inta,*p=a;下面选项中,正确的调用是((a)fun5(a);6.有声明intfun6(int),(*pf)(int)=fun6;下面选项中,正确的调用是(c)。(a)inta=15;intn=fun6(a);(c)cout(*pf)(256);(a)函数返回值需要强类型转换(c)函数本身没有返回值8.函数参数的默认值不允许为((a)全局常量9.使用重载函数编程序的目的是((c)提高程序的运行速度10.下列的描述中(b)是错误的。ca)。(c)局部变量(b)直接常量)。b)。(b)fun5(p);fun4(b);&&&&(c)fun5(*a);&&&&(d)fun5(*p);&&&&(b)inta=15;cout(pf)(a);(d)cout*pf(256);c)。(b)函数不执行任何操作(d)函数不能修改实际参数的值(d)函数调用&&&&7.在VC中,若定义一个函数的返回类型为void,以下叙述正确的是(&&&&(a)使用相同的函数名调用功能相似的函数&&&&(b)共享程序代码(d)节省存贮空间&&&&(a)使用全局变量可以从被调用函数中获取多个操作结果(b)局部变量可以初始化,若不初始化,则系统默认它的值为0(c)当函数调用完后,静态局部变量的值不会消失(d)全局变量若不初始化,则系统默认它的值为011.下列选项中,(c(a)语句标号1.#includeiostr#includecmathintf(int);intmain())的具有文件作用域。(b)局部变量(c)全局变量(d)静态变量&&&&3.2阅读下列程序,写出执行结果&&&&24&&&&&&&&{for(i=0;i3;i++)coutf(i)}intf(inta){intb=0,c=1;b++;c++;returnint(a+pow(double(b),2)+c);}【解答】3452.#includeiostrvoidfunc(inta,intb,intc=3,intd=4);intmain(){func(10,15,20,30);func(10,11,12);func(12,12);}voidfunc(inta,intb,intc,intd){couta\tb\tc\}【解答】1010123.#includeiostrvoidfunc(int,int,int*);intmain(){intx,y,z;func(5,6,x);func(7,x,y);func(x,y,z);coutx,y,044&&&&25&&&&&&&&}voidfunc(inta,intb,int*c){b+=a;}【解答】6,6,64.#includeiostrvoidfunc(int,int,int);intmain(){intx=0,y=1,z=2;func(1,2,x);func(x+y,y,y);func(z,x+y,z);coutx,y,}voidfunc(inta,intb,intc){b+=a;}【解答】2,1,35.#includeiostrvoidfunc(int*,int*,int*);intmain(){inta=10,b=20;int*p=a,*q=b;func(p,q,p);cout*p=*p,*q=*}voidfunc(int*t1,int*t2,int*rt){*t1+=5;rt=t1;*rt+=5;cout*t1=*t1,*t2=*t2,*rt=*}【解答】*t2+=5;c=b-a;*c=b-a;&&&&26&&&&&&&&*t1=20,*t2=25,*rt=20*p=20,*q=256.#includeiostrintf2(int,int);intf1(inta,intb){a+=a;b+=b;c=f2(a+b,b+1);}intf2(inta,intb){c=b%2;returna+c;}intmain(){inta=3,b=4;coutf1(a,b)}【解答】157.#includeiostrintage(intn){if(n==1)f=10;elsef=age(n-1)+2;}intmain(){coutage:age(5)}【解答】age:188.#includeiostream&&&&27&&&&&&&&intf1(inta,intb){returna+b;}intf2(inta,intb){returna-b;}intf3(int(*t)(int,int),inta,intb){return(*t)(a,b);}intmain(){int(*p)(int,int);p=f1;coutf3(p,4,8)p=f2;coutf3(p,8,4)}【解答】1249.#includeiostrintsub(int,int);inta=1;intmain(){intm=1,n=2,f;f=sub(m,n);couta\f=sub(m,n);couta\}intsub(intc,intd){staticintm=2,n=5;coutm\tn\a=++a;c=m++;d=n++;returnc+d;}【解答】&&&&3.3思考题&&&&1.函数的作用是什么?如何定义函数?什么叫函数原型?&&&&28&&&&&&&&【解答】函数的两个重要作用:(1)任务划分,把一个复杂任务划分为若干小任务,便于分工处理和验证程序正确性;(2)软件重用,把一些功能相同或相近的程序段,独立编写成函数,让应用程序随时调用,而不需要编写雷同的代码。函数的定义形式:类型{语句序列}函数原型是函数声明,告诉编译器函数的接口信息:函数名、返回数据类型、接收的参数个数、参数类型和参数顺序,编译器根据函数原型检查函数调用的正确性。2.什么叫函数值的返回类型?什么叫函数的类型?如何通过指向函数的指针调用一个已经定义的函数?请写一个验证程序说明。【解答】(1)函数的返回类型是函数返回的表达式的值得类型;(2)函数类型是指函数的接口,包括函数的参数定义和返回类型;(3)若有functionTypefunctionN则可以通过函数指针调用函数:(*functionPointer)(argumentList);或functionPointer(argumentList);其中argumentList是实际参数表。验证程序:#includeiostrintmain(){typedefintmyfunc(int,int);myfuncf,*inta=10,b=6;fp=f;coutUsingf(a):f(a,b)coutUsingfp(a):fp(a,b)return0;}intf(inti,intj){returni*j;}//函数名调用函数//函数指针调用函数//函数指针调用函数//functionType是已经定义的函数类型//定义函数指针并获取函数地址functionType*functionPointer=functionN函数名([形式参数表])&&&&coutUsing(*fp)(a):(*fp)(a,b)&&&&29&&&&&&&&3.什么叫形式参数?什么叫实际参数?C++函数参数有什么不同的传递方式?请写一个验证程序说明。【解答】参数是调用函数与被调用函数之间交换数据的通道。函数定义首部的参数称为形式参数,调用函数时使用的参数称为实际参数。C++有三种参数传递机制:值传递(值调用);指针传递(地址调用);引用传递(引用调用)。验证程序:#includeiostrvoidfuncA(inti){i=i+10;}voidfuncB(int*j){*j=*j+20;}voidfuncC(intk){k=k+30;}intmain(){inta=1;funcA(a);couta=funcB(a);couta=funcC(a);couta=}程序输出:a=1a=21a=51//传值参数,实际参数值不变//指针参数,形式参数通过间址修改实际参数//引用参数,形式参数通过别名方式修改实际参数&&&&4.C++函数通过什么方式传递返回值?当一个函数返回指针类型时,对返回表达式有什么要求?若返回引用类型时,是否可以返回一个算术表达式?为什么?【解答】C++首先计算表达式的值,然后把该值赋给函数返回类型的匿名对象,通过这个对象,把数值带回调用点,继续执行后续代码。当函数返回指针类型时,返回的地址值所指对象不能是局部变量。因为局部变量在函数运行结束后会被销毁,返回这个指针是毫无意义的。返回引用的对象不能是局部变量,也不能返回表达式。算术表达式的值被储存在匿名空间中,函数运行结束后会被销毁,返回这个变量的引用也是无意义的。5.变量的生存期和变量作用域有什么区别?请举例说明。【解答】变量的生存期是指程序运行后,变量占有内存的时间;变量作用域指的是指变量声明之后,在程序正文中有效的那部分区域。例如,定义函数:&&&&30&&&&&&&&voidcount(){staticintn=0;//……}该函数中n被定义为static变量,生存期是整个程序运行时期;但作用域只在count函数中。6.静态局部变量有什么特点?编写一个应用程序,说明静态局部变量的作用。【解答】静态局部变量的生存期是全程的,作用域是局部的。程序开始执行时就分配和初始化存储空间(默认初始化值为0)。定义静态局部变量的函数退出时,系统保持其存储空间和数值。下次调用这个函数时,static变量还是上次退出函数时的值。直至整个程序运行结束,系统才收回存储空间。程序略。7.在一个语句块中能否访问一个外层的同名局部变量?能否访问一个同名的全局变量?如果可以,应该如何访问?请写一个验证程序说明。【解答】一个语句块中不能访问外层的同名局部变量。可以访问一个同名的全局变量。验证程序:#includeiostrinta=0;intmain(){inta=1;{inta=2;}coutMcoutGlobalais::}8.有函数原型voidf(intn);和函数调用//……f(a);有人说,因为n是a的引用,在函数f中访问n相当于访问a,所以,可以在f的函数体内直接使用变量名a。这种说法正确吗?为什么?请你写个验证程序。【解答】形式参数n的作用域是f函数,实际参数a的作用域是调用f函数的模块(例如main函数),所以在f函数中可见n而不可见a。因此,这种说法不正确。f函数内不能直接使用变量名a,只能通过别名n访问a。//输出外层局部变量a//输出全局部变量a//外层局部变量a//内层局部变量a//输出内层局部变量a//全局变量a&&&&coutL&&&&31&&&&&&&&验证程序:#includeiostrvoidf(intn);intmain(){inta=1;f(a);couta=}voidf(intn){}产生编译错误:errorC2065:“a”:未声明的标识符9.有函数原型doublefunction(int,double);函数function的返回值类型是什么?函数的类型是什么?请用typedef定义函数的类型。若有函数调用语句x=function(10,(2*(0.314+5));其中的括号“()”与函数原型中括号有什么语义区别?【解答】函数function的返回值类型是double函数类型是:double(int,double)可以定义为:括号是表达式运算。10.请分析以下各语句的意义。int*fun();int*(*pf)();fun();pf=pf();【解答】int*fun();int*(*pf)();fun();pf=pf();//函数原型声明。fun是返回int*类型,没有参数的函数//声明指针变量。pf是指向函数的指针,函数类型为int*()//调用函数语句//向指针变量赋值。函数指针pf指向函数fun//用指针变量间址调用函数typedefdoublefunType(int,double);函数调用function(10,(2*(0.314+5))中,外层括号表示调用函数匹配的实际参数表,里面的两层a++;n++;//错误,直接使用a//正确&&&&32&&&&&&&&3.4编程题&&&&1.已知值,求y的值。【解答】#includeiostream#includecmdoublesh(doublet);intmain(){doublex,y;coutx=;y=sh(1+sh(x))/(sh(2*x)+sh(3*x));couty=}doublesh(doublet){return(exp(t)-exp(-t))/2;}&&&&3332.输入m、n和p的值,求s=1?2?m?1?2?n的值。注意判断运算中的溢出。&&&&y?&&&&et?e?t。编一程序,输入x的sh(1?shx),其中sh为双曲正弦函数,即sh(t)?2sh2x?sh3x&&&&15?25?p5&&&&【解答】doublef(longk,longnum);intmain(){longm,n,p;doubles,f1,f2,f3;coutm,n,p=;f1=f(1,m);f2=f(3,n);f3=f(5,p);if(f1f2f3){s=(f1+f2)/f3;couts=}elsecout溢出!\n;}doublef(longk,longnum){doublesum=0;for(i=1;i=numsum;i++){sum=sum+pow(double(i),double(k));&&&&33&&&&&&&&}if(i=num)return0;}3.输入a,b和c的值,编写一个程序求这三个数的最大值和最小值。要求把求最大值和最小值编写成一个函数,并使用指针或引用作为形式参数把结果返回main函数。【解答】(1)使用指针参数#includeiostrvoidfmaxmin(double,double,double,double*,double*);intmain(){doublea,b,c,max,couta,b,c=;fmaxmin(a,b,c,max,min);coutmax=coutmin=}voidfmaxmin(doublex,doubley,doublez,double*p1,double*p2){doubleu,v;if(xy){u=x;v=y;}else{u=y;v=x;};if(zu)u=z;if(zv)v=z;*p1=u;*p2=v;}(2)使用引用参数#includeiostrvoidfmaxmin(double,double,double,double,double);intmain(){doublea,b,c,max,couta,b,c=;fmaxmin(a,b,c,max,min);coutmax=//溢出时返回&&&&34&&&&&&&&coutmin=}voidfmaxmin(doublex,doubley,doublez,doublep1,doublep2){doubleu,v;if(xy){u=x;v=y;}else{u=y;v=x;};if(zu)u=z;if(zv)v=z;p1=u;p2=v;}4.用线性同余法生成随机数序列的公式为:rk=(multiplier*rk-1+increment)%modulus序列中的每一个数rk,可以由它的前一个数rk-1计算出来。例如,如果有:rk=(25173*rk-1+1则可以产生65536个各不相同的整型随机数。设计一个函数作随机数生成器,生成一位或两位数的随机数。利用这个随机数生成器,编写一个小学生四则运算的练习程序:①②③④·可以进行难度选择。一级难度只用一位数,二级难度用两位数;·可以选择运算类型,包括加、减、乘、除等;·给出错误提示;·可以统计成绩。#includeiostrintRand(int,int);intmain(){intw,i,r,t=0;charop,inta,b,d;while(1)if(answer==N||answer==n)while(1){cout请输入难度(1或2):;if(w!=1w!=2)cout输入难度错误,重新输入!//练习开始{cout现在开始?(Y或N)\n;//生成指定范围的随机数&&&&【解答】&&&&35&&&&&&&&}while(1){cout请输入运算类型(+,-,*,/):;if(op!=+op!=-op!=*op!=/)cout输入运算符错误,重新输入!}//出10道题,每题10分t=0;for(i=1;i=10;i++){while(1){if(w==1){a=Rand(0,10);b=Rand(0,10);}elseif(w==2){a=Rand(10,100);b=Rand(10,100);}if(op==-)if(ab)if(op==/)if(int(a/b)!=(a/b))}coutaopb=;switch(op){case+:r=a+b;case-:r=a-b;case*:r=a*b;case/:r=a/b;}if(r==d){cout你算对了,加10分!t=t+10;}elsecout你算错了!//只做结果为整数的除法//使被减数大于减数&&&&36&&&&&&&&}cout你的成绩是:t分}}intRand(intm,intn){do{r=(25173*r+1;}while(rm||r=n);}5.已知勒让德多项式为&&&&1pn(x)x?((2n?1)p(x)?(n?1)p(x))/nn?1n?2?n?0n?1n?1&&&&//静态变量保留上一个随机数&&&&编一程序,从键盘上输入x和n的值,使用递归函数求pn(x)的值。【解答】#includeiostrdoublep(doublex,intn);intmain(){coutpleaseinputxandn:;coutp(x,n)=p(x,n)}doublep(doublex,intn){doublet1,t2;if(n==0)return1;elseif(n==1)else{t1=(2*n-1)*p(x,n-1);t2=(n-1)*p(x,n-2);return(t1-t2)/n;}}6.把以下程序中的print()函数改写为等价的递归函数。&&&&37&&&&&&&&#includeiostrvoidprint(intw){for(inti=1;i=w;i++){for(intj=1;j=i;j++)}}intmain(){print(5);}运行显示:12345【解答】#includeiostrvoidprint(intw){if(w){print(w-1);for(i=1;i=w;i++)}}voidmain(){print(5);;&&&&}&&&&n?17.已知用梯形法求积分的公式为:T?h(f(a)?f(b))?h?f(a?ih),其中h=(b-a)/n,n&&&&2&&&&i?1&&&&n为积分区间的等分数,编程序求如下积分的值。要求把求积分公式编写成一个函数,并使用函数指针作为形式参数。调用该函数时,给定不同的被积函数作为实际参数求不同的积分。&&&&38&&&&&&&&①&&&&4?1?x2dx0&&&&1&&&&②&&&&?&&&&1&&&&2&&&&?&&&&1?xdx&&&&2&&&&③&&&&?sinxdx&&&&0&&&&2&&&&【解答】#includeiostream#includecmdoublef1(doublex){}doublef2(doublex){}doublef3(doublex){}doubletrap(double(*fun)(doublex),doublea,doubleb,longn){doublet,h;t=((*fun)(a)+(*fun)(b))/2.0;h=(b-a)/n;for(i=1;i=n-1;i++)t+=(*fun)(a+i*h);t*=h;}intmain(){doublet1,t2,t3;t1=trap(f1,0,1,10000);coutt1=t1t2=trap(f2,1,2,10000);coutt2=t2t3=trap(sin,0,3.,10000);coutt3=t3}8.编写一个程序,包含三个重载的display函数和一个主函数。要求第一个函数输出double值,前面用字符串“adouble:”引导,第二个函数输出一个int值,前面用字符串“aint:”引导,第三个函数输出一个char字符值,前面用字符串“achar:”引导,在主函数中分别用double、int和char型变量作为实参调用display函数。【解答】#includeiostreamreturnsin(x);returnsqrt(1+x*x);return4/(1+x*x);&&&&39&&&&&&&&voiddisplay(double{}voiddisplay(inti){}voiddisplay(charc){}intmain(){doubled=1.5;inti=100;charc=a;display(d);display(i);display(c);}9.使用重载函数编程序分别把两个数和三个数从大到小排列。【解答】#includeiostrvoidsort(doublex,doubley);voidsort(doublex,doubley,doublez);intmain(){sort(5.6,79);sort(0.5,30.8,5.9);}voidsort(doublex,doubley){if(xy)coutx\elsecouty\}voidsort(doublex,doubley,doublez){if(yz){t=y;y=z;z=t;}if(xz){t=x;x=z;z=t;}if(xy){t=x;x=y;y=t;}coutx\ty\tz\}10.给定求组合数公式为:cn?m&&&&nm!,编一程序,输入m和n的值,求cm的值。注意优化算n!(m?n)!&&&&d)&&&&coutadouble:&&&&coutaint:&&&&coutachar:&&&&40&&&&&&&&法,降低溢出可能。要求主函数调用以下函数求组合数:intFabricate(intm,intn);Fabricate函数内又须调用Multi函数:intMulti(intm,intn);和Multi函数的定义。【解答】//Fabricate.h#ifndefFABRICATE_H#defineFABRICATE_HintFabricate(intm,intn);intMulti(intm,intn);#endif//main.cpp#includeiostr#includeFabricate.hintmain(){intm,n;coutinputmandn:;coutFabricate(m,n)=Fabricate(m,n)}//Fabricate.cpp#includeFabricate.hintFabricate(intm,intn){returnMulti(m,m-n+1)/Multi(n,1);}//Multi.cppintMulti(intm,intn){inti,t=1;for(i=n;i=m;i++)t=t*i;}//返回m×m-1×…×n程序由4个文件组成。头文件存放函数原型作为调用接口;其他3个cpp文件分别是main、Fabricate//返回cm的值&&&&n&&&&41&&&&&&&&习题4及其解答&&&&4.1选择题&&&&1.以下对一维数组a的正确定义是((a)intn=5,a[n];(c)constintN=5;inta[N];(a)inta[3]={0,1,2,3};c)。(b)inta(5);(d)inta[n];(b)inta[]={0,1,2};&&&&2.下列数组定义语句中,不合法的是(a)。(c)inta[3]={0,1,2};(d)inta[3]={0};3.已知inta[10]={0,1,2,3,4,5,6,7,8,9},*p=a;则不能表示数组a中元素的式..子是(c)。(b)*p(b)*(++p)(c)a(c)*(p--)c)。(d)a[p-a]d)。(d)*(--p)(a)*a(a)*(p++)&&&&4.已知inta[]={0,2,4,6,8,10},*p=a+1;其值等于0的表达式是(5.以下不能对二维数组a进行正确初始化的语句是((a)inta[2][3]={0};(b)inta[][3]={{0,1},{0}};(c)inta[2][3]={{0,1},{2,3},{4,5}};(d)inta[][3]={0,1,2,3,4,5};&&&&6.已知inta[][3]={{0,1},{2,3,4},{5,6},{7}};则a[2][1]的值是((a)0(a)a[2][1]是(c)。(a)t(a)数组存贮首地址(c)数组中全部元素的值(a)s1==s2(a)s1=s2(c)strcpy(s1,s2)==0(a)s1s2(c)strcmp(s1,s2)0(b)s1==s3(b)一个地址值(c)javaa)。(b)数组的第一个元素值(d)数组元素的个数)。(c)s2==s3(b)s1==s2(d)strcmp(s1,s2)==0(d)strcmp(s1,s3)==0(d)javac++(b)2(b)*(a[2]+1)(c)6(c)a[2]+1(d)77.已知inta[3][3]={1,2,3,4,5,6,7,8,9};则不能表示数组元素a[2][1]的地址是((d)*(a+2)+1&&&&c)。b)。&&&&8.已知char*a[]={fortran,basic,pascal,java,c++};则couta[3];的显示结果&&&&9.若用数组名作为调用函数的实参,则传递给形参的是(&&&&10.设有char*s1=”ABCDE”,*s2=”ABCDE”,*s3=s1;下列表达式中值等于true的是(d&&&&11.设char*s1,*s2;分别指向两个字符串。判断字符串s1和s2是否相等的表达式为(d&&&&)。&&&&12.设char*s1,*s2;分别指向两个字符串,判断字符串s1是否大于字符串s2的表达式为((b)strcmp(s1,s2)==0(d)strcmp(s2,s1)0&&&&c)。&&&&42&&&&&&&&4.2阅读下列程序,写出执行结果&&&&1.#includeiostrintmain(){inti,count=0,sum=0;inta[]={1,2,3,4,5,6,7,8,9,10};for(i=0;i10;i++){if(a[i]%2==0)sum+=a[i];count++;}average=sum/coutcount=count\taverage=}【解答】conut=52.#includeiostrintmain(){inta[9]={1,2,3,4,5,6,7,8,9};int*p=a,sum=0;for(;pa+9;p++)if(*p%2==0)sum+=*p;coutsum=}【解答】sum=203.#includeiostream#includeiomaconstintN=5;intmain(){inta[N][N]={0},i,j,k;for(k=1,i=0;iN;i++)average=5&&&&43&&&&&&&&for(j=i;j=0;j--,k++)a[j][i-j]=k;for(i=0;iN;i++){for(j=0;jN;j++)coutsetw(3)a[i][j];}}【解答】124114.#includeiostrintf(int[],int);intmain(){inta[]={-1,3,5,-7,9,-11};coutf(a,6)}intf(inta[],intsize){inti,t=1;for(i=0;i++)if(a[i]0)t*=a[i];}【解答】1355.#includeiostrintf(int[][3],int,int);intmain(){inta[][3]={0,1,2,3,4,5,6,7,8};coutf(a,3,3)}intf(inta[][3],introw,intcol)0000000&&&&8130&&&&712&&&&44&&&&&&&&{inti,j,t=1;for(i=0;i++)for(j=0;j++){a[i][j]++;if(i==j)t*=a[i][j];}}【解答】456.#includeiostrvoidtest1(int*a1){a1=newint(5);cout*a1=*a1}voidtest2(int*a2){a2=newint(5);cout*a2=*a2}intmain(){int*p=newint(1);test1(p);couttest1:*p1=*test2(p);couttest2:*p2=*}【解答】*a1=5test1:*p1=1*a2=5test2:*p2=57.#includeiostrintmain(){chars[]=&&&&45&&&&&&&&for(i=1;(c=s[i])!=\0;i++){switch(c){casea:cout%;caseb:cout$;casec:cout*;cased:}cout#}}【解答】$#*#*#%8.#includeiostrintmain(){char*str[]={c++,basic,pascal};char**p;p=for(i=0;i3;i++)cout*(p+i)}【解答】c++basicpascal9.#includeiostrintmain(){chars1[]=Fortran,s2[]=Fchar*p,*q;p=s1;q=s2;while(*p*q){if(*p==*q)&&&&46&&&&&&&&cout*p;p++;q++;}}【解答】For10.#includecstring#includeiostrintmain(){charstr[][10]={vb,pascal,c++},s[10];strcpy_s(s,(strcmp(str[0],str[1])0?str[0]:str[1]));if(strcmp(str[2],s)0)strcpy_s(s,str[2]);}【解答】C++&&&&4.3思考题&&&&1.数组说明语句要向编译器提供什么信息?请写出一维数组、二维数组说明语句的形式。【解答】数组说明语句要向编译器提供数组名(标识符),数组元素的类型、数组维数、数组长度(元素的个数)等信息。一维数组说明语句为:类型数组名[表达式]二维数组说明语句为:类型数组名[表达式1][表达式2]2.数组名、数组元素的区别是什么?归纳一维数组元素地址、元素值不同的表示形式。若有说明intaa[3],*pa=请使用aa或pa,写出3个以上与aa[2]等价的表达式。【解答】数组名是一个标识符,执行代码中代表数组的地址,即指向数组起始位置的指针;而数组元素是下标变量,性质相当于普通变量。对一维数组aa第i个元素的地址可以表示为:aa[i]对一维数组aa第i个元素的值可以表示为:与aa[2]等价的表达式:*(aa+2)*(a[2])*(pa+2)pa[2]3.要把一维数组inta[m*n]的元素传送到二维数组intb[m][n]中,即在程序中要执行a[i]aa+i;*(a+i);&&&&47&&&&&&&&b[i][j]=a[k];请写出k?i,j的下标变换公式,并用程序验证。【解答】转换公式:i=k/nj=k%n验证程序:#includeiostrintmain(){constintM=3,N=4;intk,a[M*N]={1,2,3,4,5,6,7,8,9,10,11,12},b[M][N];inti,j;coutarraya:for(k=0;kM*N;k++)b[k/N][k%N]=a[k];for(k=0;kM*N;k++)couta[k]\t;cout**Afterconvert**coutarrayb:for(i=0;iM;i++){for(j=0;jN;j++)coutb[i][j]\t;}}4.有以下函数voidquery(){int*p;p=newint[3];//delete[]p;p=newdouble[5];//delete[]p;}出现了编译错误。请分析错误的原因,并把上述程序补充完整,上机验证你的判断。【解答】在语句p=newdouble[5];中企图把动态浮点型数组的地址写入整型指针p,造成错误。错误为errorC2440:“=”:无法从“double*”转换为“int*”。改正方法:增加一个double*q指针。&&&&48&&&&&&&&voidquery(){int*p;p=newint[3];delete[]p;//……double*q;q=newdouble[5];//……delete[]q;}5.有以下程序根据输入值,设计功能是调用函数create建立并初始化动态数组,令a[i]=i。但该程序运行后不能得到期望结果,请分析程序的错误原因并修改之。#includeiostrvoidcreate(int*,int);intmain(){int*a=NULL,create(a,len);for(inti=0;i++)couta[i]delete[]a;a=NULL;}voidcreate(int*ap,intn){ap=newint[n];for(inti=0;i++)ap[i]=i;}【解答】函数create中,指针参数int*ap是传地址值的参数。调用函数时接受实际参数a的值(地址值)作为初始值。ap仅是局部变量,ap=newint[n]获得新的地址值,函数执行完毕返回,ap被释放,完全与实际参数a无关。程序没有编译错误,但main不能获得动态数组。修改方法是把ap改为指针引用参数。voidcreate(int*,int);voidcreate(int*ap,intn){ap=newint[n];for(inti=0;i++)ap[i]=i;}//函数原型声明,使用引用参数//函数定义;&&&&49&&&&&&&&4.4编程题&&&&1.已知求成绩的平均值和均方差公式:ave?&&&&?s&&&&i?1&&&&n&&&&i&&&&n&&&&,dev?&&&&?(s&&&&i?1&&&&n&&&&i&&&&?ave)2&&&&,其中n为学生人数,&&&&n&&&&si为第i个学生成绩。求某班学生的平均成绩和均方差。【解答】#includeiostream#includecmvoidaveMsd(double[],int,double,double);intmain(){doubles[]={76,85,54,77,93,83,90,67,81,65};doubleave,inti,n;n=sizeof(s)/sizeof(double);cout学生成绩:;for(i=0;i++)couts[i];aveMsd(s,n,ave,msd);cout平均值:aveendl均方差值:}voidaveMsd(doubles[],intn,doubleave,doublemsd){doublesum1=0,sum2=0;for(i=0;i++)sum1+=s[i];ave=sum1/n;for(i=0;i++)msd=sqrt(sum2/n);}2.用随机函数产生10个互不相同的两位整数存放到一维数组中,并输出其中的素数。【解答】#includeiostream#includecmath#includecstdlib#includectime//求均方差sum2+=pow(s[i]-ave,2);//求平均值//求数组元素的个数//求平均值和均方差值函数&&&&50&&&&&&&&intmain(){inta[10],i,j;srand(int(time(0)));for(i=0;i10;i++){l:a[i]=rand();for(j=0;j++)if(a[i]==a[j])}for(i=0;i10;i++)couta[i]for(i=0;i10;i++){doublem=sqrt(double(a[i]));for(j=2;j=m;j++)if(a[i]%j==0)if(jm)couta[i]}cout是素数!}3.将一组数据从大到小排列后输出,要求显示每个元素及它们在原数组中的下标。【解答】#includeiostrintmain(){inta[]={38,6,29,1,25,20,6,32,78,10};intindex[10];inti,j,for(i=0;i10;i++)index[i]=i;for(i=0;i=8;i++)for(j=i+1;j=9;j++)if(a[i]a[j]){temp=a[i];a[i]=a[j];a[j]=temp=index[i];index[i]=index[j];index[j]=//记录下标的数组;;//排除相同数据//产生随机数存放到数组中//获取指定范围数据if(a[i]10||a[i]=100)//为随机数生成器设置种子值&&&&51&&&&&&&&}for(i=0;i10;i++)couta[i]\tindex[i]}4.从键盘上输入一个正整数,判别它是否为回文数。所谓回文数是指正读和反读都一样的数。例如,123321是回文数。【解答】#includeiostrintmain(){intb[10],i,j,k,longnum,n;coutnum=;k=0;n=do{b[k++]=n%10;n=n/10;}while(n!=0);flag=1;i=0;j=k-1;while(ij)if(b[i++]!=b[j--]){flag=0;}if(flag)coutnum是回文数!elsecoutnum不是回文数!}5.把两个升序排列的整型数组合并为一个升序数组。设计好你的算法,以得到较高的运行效率。【解答】#includeiostrvoidmerge(constinta[],intna,constintb[],intnb,intc[],intnc);intmain(){inta[4]={1,2,5,7};intb[8]={3,4,8,8,9,10,11,12};intc[12];//对称位置元素不相等//判断标志//设置指示下标的指针//拆分整数,把各数字放入数组&&&&52&&&&&&&&merge(a,4,b,8,c,12);for(i=0;i12;i++)coutc[i]}voidmerge(constinta[],intna,constintb[],intnb,intc[],intnc){inti,j,k;i=j=k=0;while(inajnb)if(a[i]b[j]){c[k]=b[j];k++;j++;}else{c[k]=a[i];k++;i++;}while(ina){c[k]=a[i];i++;k++;}while(jnb){c[k]=b[j];k++;j++;}}6.输入一个表示星期几的数,然后输出相应的英文单词。要求使用指针数组实现。【解答】#includeiostrintmain(){char*weekday[7]={sunday,monday,tuesday,wednesday,thursday,friday,saturday};coutpleaseinputweekday:;if(d=0d=6)coutd---*(weekday+d)elsecoutinputerror!}7.编写函数:(1)在一个二维数组中形成如以下形式的n阶矩阵://把数组b的剩余元素写入数组c//把数组a的剩余元素写入数组c//当a[i]=b[j],把a[i]写入数组c//当a[i]b[j],把b[i]写入数组c;&&&&&&&&??54321&&&&(2)去掉靠边元素,生成新的n-2阶矩阵;&&&&53&&&&&&&&(3)求矩阵主对角线下元素之和;(4)以方阵形式输出数组。在main函数中调用以上函数进行测试。【解答】#includeiostrvoidcreate(int*app,intn);voiddel(int*app,int*bpp,intn);intmaindiagonal(int*app,intn);voidoutput(int*app,int);intmain(){int*ap=NULL,*bp=NULL,n;cout输入矩阵的阶:;create(ap,n);cout\n形成矩阵:\n;output(ap,n);cout去掉靠边元素生成的矩阵:\n;del(ap,bp,n);output(bp,n-2);cout主对角线元素之和:maindiagonal(ap,n)}//形成n阶矩阵函数voidcreate(int*app,intn){app=newint[n*n];inti,j,k=0;for(i=0;i++)for(j=0;j++){if(i=j)app[k]=1;elseapp[k]=i-j+1;k++;}}//去掉靠边元素生成n-2阶矩阵函数voiddel(int*app,int*bpp,intn){inti,j,k=0;bpp=newint[(n-2)*(n-2)];for(i=0;i++){for(j=0;j++)&&&&54&&&&&&&&if(ijin-1jn-1){bpp[k]=*(app+i*n+j);k++;}}}//求主对角线元素之和函数intmaindiagonal(int*app,intn){inti,j,k=0,sum=0;for(i=0;i++){for(j=0;j++)if(i==j)sum+=*(app+i*n+j);}}//以方阵的形式输出数组函数voidoutput(int*app,intn){inti,j;for(i=0;i++){for(j=0;j++)cout*(app+i*n+j)}}8.设某一城市三个百货公司某个季度销售电视机的情况和价格如下表格所示。编写程序,将每个表数据以数组存放,求各个百货公司的电视机营业额。\t;&&&&牌公司第一百货公司第二百货公司第三百货公司&&&&号&&&&康佳&&&&TCL&&&&长虹&&&&牌号康佳&&&&价格&&&&&&&&&&&&&&&&TCL长虹&&&&【解答】#includeiostrintmain()&&&&55&&&&&&&&{longs[][3]={{300,250,150},{200,240,200},{280,210,180}};longp[]={00};inti,j;for(i=0;i3;i++){sum=0;for(j=0;j3;j++)sum+=s[i][j]*p[j];cout第i+1百货公司的电视机营业额:}}9.设计函数求一整型数组的最小元素及其下标。在主函数中定义和初始化该整型数组,调用该函数,并显示最小元素值和下标值。【解答】#includeiostrintfmin(int[],int);intmain(){inta[]={73,85,62,95,77,56,81,66,90,80};index=fmin(a,sizeof(a)/sizeof(int));coutTheminnumnumberis:a[index]coutTheindexis:}intfmin(inta[],intsize){inti,min=a[0],index=0;for(i=0;i++)if(a[i]min){}10.假设有从小到大排列的一组数据存放在一个数组中,在主函数中从键盘输入一个在该数组的最小值和最大值之间的数,并调用一函数把输入的数插入到原有的数组中,保持从小到大的顺序,并把最大数挤出。要求在主函数中输出改变后的数组。【解答】#includeiostrvoidinsert(inta[],int,int);intmain()min=a[i];index=i;};&&&&56&&&&&&&&{inta[]={10,12,23,25,48,48,53,58,60,78};intx,n,i;coutpleaseinputinsertdata:;n=sizeof(a)/sizeof(int);insert(a,n,x);for(i=0;i++)couta[i]}voidinsert(inta[],intn,intx){inti,p,j;if(xa[n-1]){for(i=1;i++)if(xa[i]){}for(j=n-1;j=p;j--)a[j]=a[j-1];a[p]=x;}}11.编写程序,按照指定长度生成动态数组,用随机数对数组元素赋值,然后逆置该数组元素。例如,对数组A[5],初值为{6,3,7,8,2},逆置后的值是{2,8,7,3,6}。程序输出逆置前、后的数组元素序列。【解答】#includeiostream#includecstdlib#includectvoidprintarray(int*p,intn);voidadverse(int*p,intn);intmain(){int*p,n,i;cout请输入数组长度:;p=newint[n];srand(time(0));for(i=0;i++)//产生随机数并存放到动态数组中//产生动态数组//插入元素//后移元素,挤出最大值p=i;//查找插入位置;//求数组长度//插入元素&&&&57&&&&&&&&*(p+i)=rand()/1000;cout动态数组:;printarray(p,n);adverse(p,n);cout逆置数组:;printarray(p,n);}//输出数组函数voidprintarray(int*p,intn){for(i=0;i++){if(i%5==0)}}//对数组逆置函数voidadverse(int*p,intn){inti,t;for(i=0;in/2;i++){t=*(p+i);*(p+i)=*(p+n-i-1);*(p+n-i-1)=t;}}12.把一个字符串插入到另一个字符串中指定的位置。【解答】#includeiostrintmain(){intp,i,j,k;chars1[40],s2[40],s3[80];couts1=;cins1;couts2=;cins2;coutinputinsertposition:;for(i=0;i++)//输入插入位置//控制一行输出5个数据coutarray[i]=*(p+i);//输出逆置数组//输出动态数组//对数组逆置&&&&58&&&&&&&&s3[i]=s1[i];for(j=0;s2[j]!=\0;j++)s3[i+j]=s2[j];for(k=p;s1[k]!=\0;k++)s3[j+k]=s1[k];s3[j+k]=\0;couts3=s3}13.把某班学生的姓名和学号分别存放到两个数组中,从键盘上输入某一学生学号,查找该学生是否在该班,若找到该学生,则显示出相应的姓名。【解答】#includeiostrintmain(){charname[5][20]={liming,zhangqing,liuxiaoping,wangying,lupei};longnum[5]={05,30010};coutpleaseinputstudentnumber:;for(i=0;i5;i++){if(num[i]==snumber){coutFound!Thenameis:name[i]}}if(i==5)coutCan\tfound!}14.将一组C++关键字存放到一个二维数组中,并找出这些关键字的最小者。【解答】#includeiostream#includecstrintmain(){charstring[10];charstr[][10]={while,break,if,extern,void,auto,long,static,do,const};&&&&59&&&&&&&&strcpy(string,str[0]);for(i=0;i10;i++)if(strcmp(str[i],string)0)strcpy(string,str[i]);coutTheminimumstringis:}15.使用指针函数编写程序,把两个字符串连接起来。【解答】#includeiostrchar*strcat(char*str1,char*str2){char*p=str1;while(*p!=\0)p++;*p=*str2;do{p++;str2++;*p=*str2;}while(*str2!=\0);return(str1);}intmain(){charstr1[80],str2[80];coutinputstr1:;cinstr1;coutinputstr2:;cinstr2;coutstr1+str2=strcat(str1,str2)}16.使用string类,写一个简单文本编辑程序,能够实现基本的插入、删除、查找、替换等功能。【解答】略。&&&&习题5及其解答&&&&5.1选择题&&&&1.有说明structpoint{}p;正确的赋值语句是(c(a)point.x=1;)。(b)point={1,2};point.y=2;&&&&60&&&&&&&&(c)p.x=1;structDate{&&&&p.y=2;&&&&(d)p={1,2};&&&&2.已知有职工情况结构变量emp定义为:&&&&};strnctEmployee{charname[20];long};E下列对emp的birth的正确赋值方法是((a)year=1980;month=5;day=1;(b)birth.year=1980;(c)emp.year=1980;d)。Datebirth&&&&birth.month=5;birth.day=1;emp.month=5;emp.day=1;emp.birth.month=5;emp.birth.day=1;b)。&&&&(d)emp.birth.year=1980;structStudent{};&&&&3.假定有以下说明语句,则下面引用形式错误的是(&&&&Studentstu[3]={{1001,80},{1002,75},{1003,91}},*p=(a)p-numstruct(b)(p++).numWorker(c)(p++)-numd)。(d)(*p).num4.若有以下说明语句,则下列错误的引用是({charname[20];};Workerw,*p=w;(a)w.no(b)p-no(c)(*p).no(b)结构中的成员相同(d)存储字节长度一样的变量(d)*p.no)。5.s1和s2是两个结构类型变量,若要赋值s1=s2合法,则它们的说明应该是(c(a)s1只能接受相同类型的数据成员(c)同一结构类型的变量&&&&5.2阅读下列程序,写出执行结果。&&&&1.#includeiostr&&&&61&&&&&&&&structData{};intmain(){Dataa[3]={2,72,1003,90},*p=a;cout(p++)-cout(p++)-coutp-n++cout(*p).n++}【解答】10042.#includeiostrstructEmployee{charname[20];};voidfun(Employee*p){if((*p).sex==m)cout(*p).}intmain(){Employeeemp[5]={Liming,m,Wangxiaoping,f,Luwei,m};for(i=0;i3;i++)fun(emp+i);}【解答】LimingLuwei3.#includeiostr&&&&62&&&&&&&&structNode{char*s;Node*q;};intmain(){Nodea[]={{Mary,a+1},{Jack,a+2},{Jim,a}};Node*p=a;coutp-coutp-q-coutp-q-q-coutp-q-q-q-}【解答】MaryJackJimMary&&&&5.3思考题&&&&1.分析以下说明结构的语句structNode{NNode*};error和ok分别属于什么数据类型?有什么存储要求?error出错的原因是什么?【解答】error是Node结构类型数据成员,错误。原因是结构定义的数据成员若为本身的结构类型,是一种无穷递归。ok是指向Node类型的指针,定义正确,占4字节。2.本章例5-5中用辅助数组对结构数组做关键字排序,有定义person*index[100];index数组存放结构数组元素的地址。如果把index定义改为intindex[100];用于存放结构数组元素的下标。可以实现对结构数组的索引排序吗?如何修改程序?请你试一试。【解答】可以。关键是通过整型索引数组元素作为下标访问结构数组。表示为:all[pi[i]].name有关程序如下:#includeiostrall[pi[i]].idall[pi[i]].salary//错误//正确&&&&63&&&&&&&&structperson{charname[10];};&&&&//说明结构类型&&&&voidInput(person[],constint);voidSort(person[],int[],constint);voidOutput(constperson[],int[],constint);intmain(){personallone[100];intindex[100];for(inti=0;i100;i++)//索引数组元素值初始化为结构数组元素下标index[i]=i;cout输入职工人数:;cout输入职工信息:\n;Input(allone,total);cout以工资做关键字排序\n;Sort(allone,index,total);cout输出排序后信息:\n;Output(allone,index,total);}voidInput(personall[],constintn){for(i=0;i++){couti:姓名:;cinall[i].cout编号:;cinall[i].cout工资:;cinall[i].}}voidSort(personall[],intpi[],constintn){inti,j;for(i=1;i++){for(j=0;j=n-1-i;j++)//交换用中间变量//以成员salary做关键字排序//输入数据//说明结构数组//说明索引数组&&&&64&&&&&&&&if(all[pi[j]].salaryall[pi[j+1]].salary){t=pi[j];pi[j]=pi[j+1];pi[j+1]=t;}}}&&&&//通过索引数组访问结构数组元素//交换索引数组元素值&&&&voidOutput(constpersonall[],intpi[],constintn){for(inti=0;i++)}3.有以下结构说明和遍历单向链表的函数。函数内有错误吗?是什么性质的错误?请上机验证你的分析。structNode{Node*};voidShowList(Node*head){while(head){couthead-date\n;head++;}}【解答】head++错误,原因是动态链表的结点存放不是连续顺序的内存空间,它们是逐个结点通过new建立的,所以不能用++做地址偏移运算。应该用:head=head-next//输出排序后数据coutall[pi[i]].name\tall[pi[i]].id\tall[pi[i]].&&&&5.4编程题&&&&1.使用结构类型表示复数。设计程序输入两个复数,可以选择进行复数的+、-、×或÷运算,并输出结果。【解答】#includeiostream#includeiomastructcomplex{};intmain(){complexa,b,c;cout输入复数a的实部和虚部:;doublere,&&&&65&&&&&&&&cina.rea.cout输入复数b的实部和虚部:;cinb.reb.cout输入运算符:;switch(oper){case+:c.re=a.re+b.c.im=a.im+b.case-:c.re=a.re-b.c.im=a.im-b.case*:c.re=a.re*b.re-a.im*b.c.im=a.im*b.re+a.re*b.case/:c.re=(a.re*b.re+a.im*b.im)/(b.re*b.re+b.im*b.im);c.im=(a.im*b.re-a.re*b.im)/(b.re*b.re+b.im*b.im);default:coutinputerror!return0;}coutc=c.coutsetiosflags(ios::showpos);coutc.return0;}2.把一个班的学生姓名和成绩存放到一个结构数组中,寻找和输出最高分者。【解答】#includeiostrintmain(){structdata{charname[12];}a[]={李小平,90,何文章,66,刘大安,87,汪立新,93,罗建国,78,陆丰收,81,杨勇,85,吴一兵,55,伍晓笑,68,张虹虹,93};doublemax=a[0].inti,n=sizeof(a)/sizeof(data);for(i=1;i++)if(a[i].scoremax)max=a[i].for(i=0;i++)if(a[i].score==max)couta[i].}3.使用结构表示X—Y平面直角坐标系上的点,编写程序顺序读入一个四边形的四个顶点坐标,判别&&&&66&&&&&&&&由这四个顶点的连线构成的图形是否为正方形、矩形或其它四边形。要求定义求两个点距离的函数使用结构参数。【解答】#includeiostream#includecmstructpoint{};doubled(pointp1,pointp2){}intmain(){pointp[5];for(i=1;i=4;i++){cout输入第i个顶点的横坐标和纵坐标:;cinp[i].xp[i].y;}if(fabs(d(p[1],p[2])-d(p[3],p[4]))=1e-8fabs(d(p[1],p[4])-d(p[2],p[3]))=1e-8fabs(d(p[1],p[3])-d(p[2],p[4]))=1e-8)if(fabs(d(p[1],p[2])-d(p[2],p[3]))1e-8)cout四个顶点构成的图形为正方形!elsecout四个顶点构成的图形为矩形!elsecout四个顶点构成的图形为其它四边形!}4.建立一个结点包括职工的编号、年龄和性别的单向链表,分别定义函数完成以下功能:(1)遍历该链表输出全部职工信息;(2)分别统计出男女性职工的人数;(3)在链表尾部插入新职工结点;(4)删除指定编号的职工结点;(5)删除年龄在60岁以上的男性职工或55岁以上的女性职工结点,并保存在另一个链表中。用主函数建立简单菜单选择,测试你的程序。【解答】#includeiostrstructemployee{returnsqrt(pow(p1.x-p2.x,2)+pow(p1.y-p2.y,2));&&&&67&&&&&&&&employee*};employee*head,*head1;//建立单向链表employee*create(){employee*head,*p,*head=NULL;cout\t输入数据?(y/n);if(ch==y){p=cout\t编号:;cinp-cout\t年龄:;cinp-cout\t性别:;cinp-}elsegotoL0;while(ch==y){if(head==NULL)head=p;elsepend-next=p;pend=p;cout\t输入数据?(y/n);if(ch==y){p=cout\t编号:;cinp-cout\t年龄:;cinp-cout\t性别:;cinp-}}pend-next=NULL;L0:;}//显示单向链表中全部职工信息voidshow(employee*head){employee*p=if(!head){cout\t空链表!gotoL1;}cout\t链表中的数据是:\n;&&&&68&&&&&&&&while(p){cout\tp-num,p-age,p-p=p-}L1:;}//统计男女职工人数voidcount(employee*head){employee*p=intm,f;m=0;f=0;while(p){if(p-sex==m)m++;elsef++;p=p-}cout\t男职工人数:cout\t女职工人数:}//在链表尾部插入新结点employee*insert(){employee*pend=head,*p;//在空链表尾部插入新结点if(!head){p=cout\t编号:;cinp-cout\t年龄:;cinp-cout\t性别:;cinp-head=p;p-next=NULL;}//在链表尾部插入新结点while(pend-next!=NULL){pend=pend-}p=cout\t编号:;cinp-cout\t年龄:;cinp-&&&&69&&&&&&&&cout\t性别:;cinp-pend-next=p;pend=p;pend-next=NULL;}//删除指定编号的结点employee*del(intbh){employee*p,*q;if(!head){cout\t空链表!gotoL2;}//删除链首结点if(head-num==bh){p=head=head-cout\t结点已被删除!gotoL2;}//删除非链首结点q=while(q-next!=NULL){if(q-next-num==bh){p=q-cout\t结点已被删除!gotoL2;}q=q-}cout\t找不到需删除结点!L2:;return(head);}//删除指定年龄段的结点,并把被删除结点保存在另一链表中employee*delcreate()//待删除结点q-next=p-&&&&70&&&&&&&&{employee*p,*pd,*p1,*q;//建立新链表if(head==NULL){cout\t空链表!gotoL3;}head1=NULL;pd=p=flag=0;while(p!=NULL){if(p-age=55p-age=60){pd-num=p-pd-age=p-pd-sex=p-if(head1==NULL)head1=elsep1-next=p1=pd=flag=1;}p=p-}if(flag==0){cout\t没有需删除的结点!gotoL3;}p1-next=NULL;//显示新链表cout\t新链表中的数据是:\n;p=head1;while(p){cout\tp-num,p-age,p-p=p-}//删除指定年龄的结点p=q=p;while(p!=NULL){if(p-age=55p-age=60)&&&&71&&&&&&&&if(head-age==p-age){pd=head=head-p=}elseif(p-next==NULL){pd=p;q-next=NULL;gotoL3;}else{pd=p;q-next=p-p=q-}q=p;p=p-}L3:return(head);}intmain(){intchoice,L:cout\n\t\t请键入操作选择\cout\t1---建立单向链表cout\t2---显示单向链表中全部职工信息cout\t3---统计男女职工人数cout\t4---在职工尾部插入新结点cout\t5---删除指定编号的结点cout\t6---删除指定年龄的结点,并把被删除结点保存在另一链表中cout\t0---退出cout\t\t;//待删除结点//待删除结点//待删除结点&&&&72&&&&&&&&switch(choice){case1:head=create();gotoL;case2:show(head);gotoL;case3:count(head);gotoL;case4:head=insert();gotoL;case5:cout\t输入需删除结点编号:;head=del(bh);gotoL;case6:head=delcreate();gotoL;case0:cout\t退出程序的运行!\default:cout\t输入错误,请重新输入!\gotoL;}}5.输入一行字符,按输入字符的反序建立一个字符结点的单向链表,并输出该链表中的字符。【解答】#includeiostrstructnode{node*};voidshow(node*head);intmain(){node*head,*p;head=NULL;while((c=getchar())!=\n){p=p-ch=c;p-next=head=p;}show(head);}voidshow(node*head){node*p=cout链表中的字符是:\n;while(p)//输出链表//插入表头//输入一行字符//建立新结点&&&&73&&&&&&&&{coutp-p=p-}}6.设有说明语句:structList{};List*head是有序单向链表的头指针。请编写函数:voidCount(List*head);计算并输出链表数据相同值的结点及个数。例如,若数据序列为:899则输出结果:data3569【解答】略number3242List*&&&&请用本章例5-8的程序生成有序链表,测试你的函数。&&&&习题6及其解答&&&&6.1选择题&&&&1.若有以下说明,在类外使用对象objX成员的正确语句是(classX{voidfun1();public:voidfun2();};XobjX;(a)objX.a=0;classY{//……;public:(b)objX.fun1();b(c)objX.fun2();)。(d)X::fun1();2.若有以下说明,对n的正确访问语句是(c)。&&&&74&&&&&&&&};intY::n;YobjY;(a)n=1;classZ{public:staticvoidfStatic();};intZ::a=0;ZobjZ;(a)voidZ::fStatic(){objZ.a=1;}(c)voidZ::fStatic(){this-a=0;}4.若有以下类W说明,函数fConst的正确定义是(aclassW{public:voidfConst(int)};(a)voidW::fConst(intk)const{k=a;}(b)voidW::fConst(intk)const{k=a++;}(c)voidW::fConst(intk)const{}(d)voidW::fConst(intk)const{a=k;}5.若有以下类T说明,函数fFriend的错误定义是(classT{friendvoidfFriend(T,int);};(a)voidfFriend(TobjT,intk){objT.i=k;}(b)voidfFriend(TobjT,intk){k=objT.i;}(c)voidT::fFriend(TobjT,intk){k+=objT.i;}(d)voidfFriend(TobjT,intk){objT.i+=k;}6.在类定义的外部,可以被访问的成员有((a)所有类成员(c)public的类成员7.关于this指针的说法正确的是((a)this指针必须显式说明cc)。(b)private或protected的类成员(d)public或private的类成员)。(b)定义一个类后,this指针就指向该类c)。(b)voidZ::fStatic(){a=1;}(d)voidZ::fStatic(){Z::a=0;})。(b)Y::n=1;(c)objY::n=1;c)。(d)Y-n3.若有以下类Z说明,函数fStatic中访问数据a错误的是(&&&&75&&&&&&&&(c)成员函数拥有this指针(a)成员函数(b)构造函数&&&&(d)静态成员函数拥有this指针b)。);撤消对象时,系统自动调用((d)友员函数c)。(c)析构函数b&&&&8.说明一个类的对象时,系统自动调用(9.下面对构造函数的不正确描述是((a)系统提供默认的构造函数(c)构造函数可以重载10.下面对析构函数的正确描述是((a)系统不提供默认的析构函数(c)析构函数没有参数,也没有返回值11.关于类的静态成员的不正确描述是((b)静态数据成员要在类外定义和初始化d&&&&(b)构造函数可以有参数,所以也可以有返回值(d)构造函数可以设置默认参数c)。(b)析构函数必须由用户定义(d)析构函数可以设置默认参数)。&&&&(a)静态成员不属于某个对象,是类的共享成员(c)静态成员函数不拥有this指针,需要通过类参数访问对象成员(d)只有静态成员函数可以操作静态数据成员12.下面选项中,(c(a)构造函数)不是类的成员函数。(c)友元函数(d)复制构造函数d)。(b)析构函数&&&&13.下面对友员的错误叙述是((a)关键字friend用于声明友员&&&&(b)一个类中的成员函数可以是另一个类的友员(c)友员函数访问对象的成员不受访问特性影响(d)友员函数通过this指针访问对象成员14.若classB中定义了一个classA的类成员Aa,关于类成员的正确叙述是((a)在类B的成员函数中可以访问A类的私有数据成员(b)在类B的成员函数中可以访问A类的保护数据成员(c)类B的构造函数可以调用类A的构造函数做数据成员初始化(d)类A的构造函数可以调用类B的构造函数做数据成员初始化c)。&&&&6.2阅读下列程序,写出执行结果&&&&1.#includeiostrclassA{public:intf1();intf2();voidsetx(intm){x=m;}voidsety(intn){y=n;}intgetx(){}intgety(){}private:&&&&76&&&&&&&&intx,y;};intA::f1(){returnx+y;}intA::f2(){returnx-y;}intmain(){Aa;a.setx(10);a.sety(5);couta.getx()\ta.gety()couta.f1()\ta.f2()}【解答】.#includeiostrclassT{public:T(intx,inty){a=x;b=y;cout调用构造函数.couta\}T(Td){cout调用构造函数.coutd.a\td.}~T(){cout调用析构函数.}intadd(intx,inty=10){returnx+y;}private:inta,b;};intmain(){Td1(4,8);Td2(d1);coutd2.add(10)55&&&&77&&&&&&&&}【解答】调用构造函数1.4420调用析构函数.调用析构函数.3.#includeiostrclassT{public:T(intx){a=x;b+=x;};staticvoiddisplay(Tc){couta=c.a\tb=c.}private:staticint};intT::b=5;intmain(){TA(3),B(5);T::display(A);T::display(B);}【解答】a=3a=54.#includeiostr#includecmathclassPoint{public:Point(doublex,doubley){a=x;b=y;cout点(a,b);}frienddoubled(PointA,PointB)b=13b=13b;88调用构造函数2.&&&&78&&&&&&&&{returnsqrt((A.a-B.a)*(A.a-B.a)+(A.b-B.b)*(A.b-B.b));}private:doublea,b;};intmain(){Pointp1(2,3);cout到;Pointp2(4,5);cout的距离是:d(p1,p2)}【解答】点(3,4)到点(4,5)的距离是:2.828435.#includeiostrclassA{public:A(){a=5;}voidprinta(){coutA:a=}private:friend};classB{public:voiddisplay1(At){t.a++;coutdisplay1:a=t.};voiddisplay2(At){t.a--;coutdisplay2:a=t.};};intmain(){Aobj1;Bobj2;obj1.printa();obj2.display1(obj1);obj2.display2(obj1);obj1.printa();}【解答】classB;&&&&79&&&&&&&&A:a=5display1:a=6display2:a=4A:a=56.#includeiostrclassA{public:A(intx):a(x){}voidgetA(intA){A=a;}voidprintA(){couta=}private:};classB{public:B(intx,inty):aa(x){b=y;}voidgetAB(intA,intoutB){aa.getA(A);outB=b;}voidprintAB(){aa.printA();coutb=}private:A};intmain(){AobjA(5);objA.getA(m);coutobjA.a=coutobjB:\n;BobjB(12,56);objB.printAB();}&&&&80&&&&&&&&【解答】objA:a=5objB:a=12b=56&&&&6.3思考题&&&&1.结构和类有什么区别?如果把程序中定义结构的关键字struct直接改成class,会有什么问题?用教材上的一个例程试一试,想一想做什么修改能使程序正确运行?【解答】结构是数据的封装,类是数据和操作的封装。可以把结构看成是类的特例。结构和类都可以用关键字struct或class定义。区别是,struct定义的结构或类的全部成员都是公有的,用class定义的结构或类不做声明的成员是私有的。若把struct改成class,只需要把全部成员定义为public就可以了。2.有说明classA{public:funMember();};Aa1,a2,a3;编译器为对象a1、a2和a3开辟了什么内存空间?它们有各自的funMember函数的副本吗?C++通过什么机制调用类的成员函数?【解答】开辟的存储空间有a1.a,a1.x,a2.a,a2.x,a3.a,a3.x。各对象没有funMember函数的副本,C++通过this指针调用成员函数。3.C++提供了默认版本的构造函数,为什么还需要用户自定义构造函数?编写一个验证程序,说明自定义构造函数的必要性。【解答】类的默认构造函数可以建立基本类型数据成员的存储空间。基于以下两个原因,需要用户定义构造函数:(1)对数据成员的值做指定初始化;(2)类的数据是由指针管理的堆。程序略。4.试从定义方式、访问方式、存储性质和作用域分析类的一般数据成员和静态数据成员的区别,并编写一个简单程序验证它。【解答】&&&&定义方式访问方式存储性质作用域&&&&81&&&&&&&&一般数据成员静态数据成员&&&&类中定义类中声明,类外定义&&&&对象.数据成员对象.数据成员类::数据成员&&&&局部数据全局数据&&&&由访问属性&&&&public,&&&&protected,private决定&&&&程序略。5.试从定义方式、调用方式分析常成员函数、静态成员函数和友员函数的区别。考察教材的例6-15,若classGoods的指针域Goods*被声明为私有(private)成员,程序会出现什么错误?做什么最小修改能使程序正确运行?请你试一试。【解答】&&&&定义方式常成员函数函数原型以const做后缀this指针被约束为指向常量的常指针静态成员函数以static做函数原型前缀没有this指针友员函数以friend做函数原型前缀没有this指针调用方式与一般成员函数调用形式相同对数据成员只读通过类或对象调用用于操作静态数据成员通过参数访问对象可以访问对象的不同属性的成员&&&&在例6-15中,若把next声明为私有数据成员,只须把有关指针操作的函数定义为友员函数就可以了:friendvoidpurchase(Goods*f,Goods*r,intw);friendvoidsale(Goods*f,Goods*r);6.设有classM{};classN{Mm;voidfun(){/*……*/}};intmain(){Nn;N*p=n;/*……*/}描述在N::fun中如何访问M类的数据成员a;在main函数中又如何访问对象n的全部数据成员?【解答】在N::fun中访问M类的数据成员a的形式是:m.a在main函数中访问M类的数据成员的形式是:n.b,n.m.a&&&&6.4编程题&&&&1.定义一个Book(图书)类,在该类定义中包括数据成员:bookname(书名)、price(价格)和number(存书数量);成员函数:display()显示图书的情况;borrow()将存书数量减1,并显示当前存书数量;restore()将存书数量加1,并显示当前存书数量。在main函数中,要求创建某一种图书对象,并对该图书进行简单的显示、借阅和归还管理。【解答】#includeiostrclassBook&&&&82&&&&&&&&{public:voidsetBook(char*,double,int);voidborrow();voidrestore();voiddisplay();private:charbookname[40];};//在类外定义Book类的成员函数voidBook::setBook(char*name,doublepri,intnum){strcpy(bookname,name);price=number=}voidBook::borrow(){if(number==0){cout已没存书,退出!abort();}number=number-1;cout借一次,现存书量为:}voidBook::restore(){number=number+1;cout还一次,现存书量为:}voidBook::display(){cout存书情况:endlbookname:booknameendlprice:priceendlnumber:}intmain(){charflag,Bcomputer.setBook(c++程序设计基础,32,1000);computer.display();&&&&83&&&&&&&&ch=y;while(ch==y){cout请输入借阅或归还标志(b/r):;switch(flag){caseb:computer.borrow();caser:computer.restore();}cout是否继续?(y/n);}computer.display();}2.定义一个Box(盒子)类,在该类定义中包括数据成员:length(长)、width(宽)和height(高);成员函数:构造函数Box,设置盒子长、宽和高三个初始数据;用函数volume计算并输出盒子的体积。在main函数中,要求创建Box对象,并求盒子的体积。【解答】#includeiostrclassBOX{public:BOX(doublel,doublew,doubleh){length=l;width=w;height=h;}voidvolume(){coutvolume=length*width*}private:doublelength,width,};intmain(){BOXbox1(1,3,5);box1.volume();BOXbox2(2,4,6);box2.volume();&&&&84&&&&&&&&}3.定义一个Student类,在该类定义中包括:一个数据成员score(分数)及两个静态数据成员total(总分)和学生人数count;成员函数scoretotalcount(doubles)用于设置分数、求总分和累计学生人数;静态成员函数sum()用于返回总分;静态成员函数average()用于求平均值。在main函数中,输入某班同学的成绩,并调用上述函数求全班学生的总分和平均分。【解答】#includeiostrclassstudent{public:voidscoretotalcount(doubles){score=s;total=total+count++;}staticdoublesum(){}staticdoubleaverage(){}private:};doublestudent::total=0;doublestudent::count=0;intmain(){inti,n;cout请输入学生人数:;for(i=1;i=n;i++){cout请输入第i个学生的分数:;stu.scoretotalcount(s);}cout总分:student::sum()cout平均分:student::average()returntotal/&&&&85&&&&&&&&}4.定义一个表示点的结构类型Point和一个由直线方程y=ax+b确定的直线类Line。结构类型Point有x和y两个成员,分别表示点的横坐标和纵坐标。Line类有两个数据成员a和b,分别表示直线方程中的系数。Line类有一个成员函数print用于显示直线方程;友员函数setPoint(Linel1,Linel2)用于求两条直线的交点。在main函数中,建立两个直线对象,分别调用print函数显示两条直线的方程,并调用函数setPoint求这两条直线的交点。【解答】#includeiostrstructpoint{};classline{public:line(doubleu,doublev){a=u;}voidprint(){couty=ax+}friendpointsetpoint(linel1,linel2);private:doublea,b;};pointsetpoint(linel1,linel2){p.x=(l2.b-l1.b)/(l1.a-l2.a);p.y=(l1.a*l2.b-l2.a*l1.b)/(l1.a-l2.a);}intmain(){linel1(2,3),l2(4,5);cout直线l1:;l1.print();cout直线l2:;l2.print();setp=setpoint(l1,l2);cout直线l1和直线l2的交点:(setp.x,setp.y)}b=v;&&&&86&&&&&&&&5.用类成员结构修改习题6.4第4小题的程序,使其实现相同的功能。定义Point类和Line类,表示点和线;定义setPoint类,包含2个Line类成员和1个表示直线交点的Point成员,并定义类中求直线交点的成员函数。编写每个类相应的成员函数和测试用的主函数。【解答】略。&&&&习题7及其解答&&&&7.1选择题&&&&1.在下列运算符中,不能重载的是((a)!(b)sizeofd2.下列关于运算符重载的描述中,((a)可以改变参与运算的操作数个数(c)可以改变运算符原来的结合性(a)成员函数(a)=(a)=(b)构造函数ac(b)==)。(c)a)。(d)()(b)[]b)。(c)new)是正确的。(b)可以改变运算符原来的优先级(d)不能改变原运算符的语义b)。(d)友员函数(d)++(c)普通函数)。(c)=(d)delete&&&&3.下列函数中,不能重载运算符的函数是(4.要求用成员函数重载的运算符是(5.要求用友员函数重载的运算符是(&&&&6.下面关于类型转换的描述中,错误的是(&&&&(a)任何形式的构造函数都可以实现数据类型转换。(b)带非默认参数的构造函数可以把}

我要回帖

更多关于 若希望下面的程序运行后输出45 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信