还剩138页未读,继续阅读
本资源只提供10页预览,全部文档请下载后查看!喜欢就下载吧,查找使用更方便
文本内容:
习题1及其解答
1.1选择题
1.一个最简单的C++程序,可以只有一个ca库函数b自定义函数cmain函数d空函数
2.用C++语言编制的源程序要变为目标程序必须要经过da解释b汇编c编辑d编译
3.C++程序中的简单语句必须以b结束a冒号b分号c空格d花括号
4.有说明inta=0;doublex=
5.16;以下语句中,c属于编译错误ax=a/x;bx=x/a;ca=a%x;dx=x*a;
5.执行C++程序时出现的“溢出”错误属于c错误a编译b连接c运行d逻辑
6.下列选项中,全部都是C++关键字的选项为cawhileIFStaticbbreakchargocsizeofcaseexterndswitchfloatinteger
7.按C++标识符的语法规定,合法的标识符是aa_abcbnewcπd“age“8.C++语句中,两个标识符之间a不能作为C++的分隔符a数字b;c:d+9.下列正确的八进制整型常量表示是ba0a0b015c080d0x1010.下列错误的十六进制整型常量表示是ca0x11b0xafc0xgd0x1f11.在下列选项中,全部都合法的浮点型数据的选项为ba-1e
3.
515.2e-4b
12.34-1e+
50.1E-12c
0.2e-2-
12345.e-5d
5.0e1+
40.18e+212.下列正确的字符常量为da“a”b‘name’cad‘\101’13.下列选项中,d不能交换变量a和b的值at=b;b=a;a=t;ba=a+b;b=a-b;a=a–b;ct=a;a=b;b=t;da=b;b=a;14.关于下列语句叙述错误的是ainti=10,*p=i;ap的值为10bp指向整型变量ic*p表示变量i的值dp的值是变量i的地址15.有以下变量说明,下面不正确的赋值语句是binta=5b=10c;int*p1=a*p2=b;a*p2=b;bp1=a;cp2=p1;dc=*p1**p2;16.有以下变量说明,下面正确的语句是binta=10b;intpa=apb=b;apb=a;bpb=pa;cpb=pa;d*pb=*pa;17.执行下面语句序列后,a和b的值分别为binta=5b=3t;intra=a;intrb=b;t=ra;ra=rb;rb=t;a3和3b3和5c5和3d5和
518.在下列运算符中,d优先级最高a=b*=c+d*
19.在下列运算符中,d优先级最低a!bc!=d:20.设inti=1j=2;则表达式i+++j的值为ca1b2c3d421.设inti=1j=2;则表达式++i+j的值为da1b2c3d422.在下列表达式选项中,c是正确a++a++ba++bca+++bda++++b23.已知inti=0j=1k=2;则逻辑表达式++i||--j++k的值为ba0b1c2d
324.执行下列语句后,x的值是d,y的值是cintxy;x=y=1;++x||++y;a不确定b0c1d
225.设x为整型变量不能正确表达数学关系1<x<5的C++逻辑表达式是aa1x5bx==2||x==3||x==4c1xx5d!x=1!x=
526.已知intx=5;执行下列语句后,x的值为cx+=x-=x*x;a25b40c–40d
2027.设inta=1b=2c=3d=4;则以下条件表达式的值为aaba:cdc:da1b2c3d
428.以下逗号表达式的值为dx=4*5x*5x+25a25b20c100d
451.2把下列数学表达式写成c++算术表达式1.
2.x{x[xax+b+c]+d}+e
3.ln(1+||10)
4.
5.cot
6.lga2+ab+b2【解答】
1.1/1+1/1+1/x+y
2.x*x*x*a*x+b+c+d+e
3.log1+powfabsa+b/a–b,
104.sqrt1+
3.14159/2*cos48*
3.14159/
1805.1/tan1-x*x/1+x*x或者cos1-x*x/1+x*x/sin1-x*x/1+x*x
6.log10a*a+a*b+b*b
1.3用逻辑表达式表示下列条件
1.i被j整除
2.n是小于正整数k的偶数
3.1≤x
104.x,y其中有一个小于z
5.y[–100–10],并且y
[10100]
6.坐标点(xy)落在以
(1020)为圆心,以35为半径的圆内
7.三条边a,b和c构成三角形
8.年份Year能被4整除,但不能被100整除或者能被400整除【解答】
1.i%j==
02.(nk)(n%2==0)
3.1=xx
104.xz||yz
5.!y=-100y=-10!y=10y=
1006.sqrtpowx-102+powy-
202357.a+bcb+cac+ab
8.year%4==0year%100!=0||year%400==
01.4阅读下列程序,写出执行结果1.#includeiostreamusingnamespacestd;intmain{inta=1b=2;boolxy;couta+++++bendl;couta%bendl;x=!ab;y=a--b;coutxendl;coutyendl;}【解答】42012.#includeiostreamusingnamespacestd;intmain{intxyzf;x=y=z=1;f=--x||y--z++;coutx=xendl;couty=yendl;coutz=zendl;coutf=fendl;}【解答】x=0y=0z=2f=13.#includeiostream#includeiomanipusingnamespacestd;intmain{inta=123;intra=a;int*pa=a;coutsetw5decasetw5octrasetw5hex*paendl;}【解答】1231737b
1.5思考题1.什么叫数据类型?变量的类型定义有什么作用?【解答】数据“类型”是对数据的抽象类型相同的数据有相同的表示形式、存储格式以及相关的操作定义一个变量时,计算机根据变量的类型分配存储空间,并以该类型解释存放的数据2.普通数据类型变量和指针类型变量的定义、存储、使用方式上有何区别?请编写一个程序验证之【解答】变量类型定义存储使用方式数据类型标识符数据值通过名访问即直接访问对变量内容操作指针类型*标识符地址值通过指针变量的地址值间址访问对象验证程序#includeiostreamusingnamespacestd;intmain{intabc;coutabc=;cinabc;//对普通数据类型变量赋值int*pa=a*pb=b*pc=c;//用变量地址值初始化指针变量coutabc=abcendl;//名访问,输出abc的值coutpapbpc=papbpcendl;//输出指针变量的地址值//间址访问,输出papbpc指向的变量的赋值cout*pa*pb*pc=*pa*pb*pcendl;}3.什么叫数据对象的引用?对象的引用和对象的指针有什么区别?请用一个验证程序说明之【解答】引用是为数据对象定义别名引用与指针有以下几点区别
(1)引用名不是内存变量,而指针变量要开辟内存空间
(2)引用名需要在变量定义与变量名绑定,并且不能重定义;指针变量可以在程序中赋给不同的地址值,改变指向
(3)程序中用变量名和引用名访问对象的形式和效果一样;指针变量通过间址访问对象验证程序#includeiostreamusingnamespacestd;intmain{inta;couta=;cina;intra=a;int*pa=a;couta的值aendl;couta的地址aendl;coutra的值raendl;coutra的地址raendl;coutpa所指向的变量的值*paendl;coutpa的地址paendl;}4.数据对象在C++中有什么不同的访问方式?请编写一个程序验证之【解答】数据对象在C++中的访问方式有名访问,引用(别名)访问,间址访问验证程序#includeiostreamusingnamespacestd;intmain{inta;couta=;cina;a=a+5;//名访问coutaendl;//输出变量地址cout*aendl;//地址访问,输出变量值int*pa=a;//说明指针变量,指向变量acout*paendl;//间址访问,输出变量值intra=a;//ra是a的引用coutraendl;//引用访问,输出变量a的值}5.为了约束对数据对象的值做只读操作,C++采用什么方式?请做出简要归纳【解答】约束数据对象只读形式如下约束对象说明形式标识常量const类型常量标识符=常量表达式;指针常量类型*const指针;指向常量的指针const类型*指针;或者类型const*指针;指向常量的指针常量const类型*const指针;或者类型const*const指针;常引用const类型引用名=对象名;6.什么叫表达式?表达式值的类型由什么因素决定?使用不同运算符连接以下3个变量,请写出5个以上获得值等于true的表达式inta=1b=2;doublex=
0.5;【解答】表达式是由数据和运算符,按求值规则,表达一个值的式子表达式值的类型的决定因素为操作数的类型
(1)如果运算符左右操作数类型相同,运算结果也是相同类型
(2)如果运算符左右操作数类型不同,首先把类型较低(存储要求,示数能力较低)的数据转换成类型较高的数据,然后运算
(3)赋值表达式的类型由被赋值变量的类型决定当把一个表达式的值赋给一个变量时,系统首先强制把运算值转换成变量的类型,然后执行写操作6个值等于true的表达式
(1)baax
(2)a+b!=x
(3)a||b+x
(4)a==b*x
(5)a-bx
(6)a/x==b7.阅读以下程序,分析下面语句序列中每一个字符“*”和“”的意义,写出输出结果#includeiostreamusingnamespacestd;intmain{inta=10b=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=*rtendl;}【解答】字符“*”和“”的意义见程序中添加的注释#includeiostreamusingnamespacestd;intmain{inta=10b=20;int*p=a*q=b;//“*”是指针类型说明符,“”是取址运算符*p=*p**q;//第
1、
2、4个“*”是间址访问符,第3个“*”算术乘运算符intra=a;//“”是引用说明符ra=a;int*rt=q;//“*”是指针类型说明符,“”是引用说明符*rt=30;//“*”是间址访问符//输出语句中的“*”是间址访问符couta=a\nb=b\n*p=*p\n*q=*q\nra=ra\n*rt=*rtendl;}程序输出结果为a=200b=30*p=200*q=30ra=200*rt=
301.6编程题
1.输入一个三位整数,将它反向输出【解答】#includeiostreamusingnamespacestd;intmain{intxijk;coutpleaseinputx:;cinx;i=x/100;j=x/10%10;k=x%10;coutkjiendl;}
2.输入平面上某点横坐标x和纵坐标y,若该点在由图
3.1表示的方块区域内,则输出1;否则,输出0图
1.11正方形【解答】#includeiostreamusingnamespacestd;intmain{doublexyb;coutpleaseinputxy:;cinxy;b=-2=xx=2-2=yy=2;coutbendl;}
3.输入三个整数,求出其中最小数(要求使用条件表达式)【解答】#includeiostreamusingnamespacestd;intmain{intabctempmin;coutpleaseinputabc:;cinabc;temp=aba:b;min=tempctemp:c;coutmin=minendl;}习题2及其解答
2.1选择题1.已知inti=0x=1y=0;在下列选项使i的值变成1的语句是caifxyi++;bifx==yi++;cifx||yi++;dif!xi++;2.设有函数关系为y=,下面选项中能正确表示上述关系为(c)ay=1;by=-1;ifx=0ifx!=0ifx==0y=0;ifx0y=1;elsey=-1;elsey=0;cifx=0dy=-1;ifx0y=-1;ifx=0elsey=0;ifx0y=-1;elsey=1;elsey=1;3.假设i=2,执行下列语句后i的值为(b)switchi{case1:i++;case2:i--;case3:++i;break;case4:--i;default:i++;}a1b2c3d44.已知inti=0,x=0;下面while语句执行时循环次数为(d)while!xi3{x++;i++;}a4b3c2d15.已知inti=3;下面do_while语句执行时循环次数为(b)do{i--;coutiendl;}while(i!=1);a1b2c3d无限6.下面for语句执行时循环次数为(b)inti;fori=0,j=5;i=j;{coutijendl;i++;j--;}a0b5c10d无限7.以下死循环的程序段是(b)aintx;forintx=0;x3;{x++;};bintk=0;do{++k;}whilek=0;cinta=5;whilea{a--;};dinti=3;for;i;i--;
2.2阅读下列程序,写出执行结果1.#includeiostreamusingnamespacestd;intmain{intabcdx;a=c=0;b=1;d=20;ifad=d-10;elseif!bif!cx=15;elsex=25;coutdendl;}【解答】202.#includeiostreamusingnamespacestd;intmain{inta=0b=1;switcha{case0:switchb{case0:couta=ab=bendl;break;case1:couta=ab=bendl;break;}case1:a++;b++;couta=ab=bendl;}}【解答】a=0b=1a=1b=23.#includeiostreamusingnamespacestd;intmain{inti=1;whilei=10if++i%3!=1continue;elsecoutiendl;}【解答】47104.#includeiostreamusingnamespacestd;intmain{inti=0j=5;do{i++;j--;ifi3break;}whilej0;couti=i\tj=jendl;}【解答】i=4j=15.#includeiostreamusingnamespacestd;intmain{intij;fori=1j=5;ij;i++{j--;}couti\tjendl;}【解答】336.#includeiostreamusingnamespacestd;intmain{intis=0;fori=0;i5;i++switchi{case0:s+=i;break;case1:s+=i;break;case2:s+=i;break;default:s+=2;}couts=sendl;}【解答】s=77.#includeiostreamusingnamespacestd;intmain{intijx=0;fori=0;i=3;i++{x++;forj=0;j=3;j++{ifj%2continue;x++;}x++;}coutx=xendl;}【解答】x=
162.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-=90B-9080]C-8070]D-7060]E-60#includeiostreamusingnamespacestd;intmain{chargd;coutEnterthegrade:;cingd;//直到输入有效等级,否则程序不继续运行while!gd=Agd=E||gd=agd=e{coutInvalidgrade!Pleaseretry:;cingd;}ifgd==A||gd==acout\nScored90-100!\n;elseifgd==B||gd==bcout\nScored80-89!\n;elseifgd==C||gd==ccout\nScored70-79!\n;elseifgd==D||gd==dcout\nScored60-69!\n;elseifgd==E||gd==ecout\nScoreunder60!\n;elsecoutUnexpecterror!\n;//防止意外错误}程序
(2)//此程序用switch输出等级对应的分数段//A-=90B-9080]C-8070]D-7060]E-60#includeiostreamusingnamespacestd;intmain{chargd;coutEnterthegrade:;cingd;//直到输入有效等级,否则程序不继续运行while!gd=Agd=E||gd=agd=e{coutInvalidgrade!Pleaseretry:;cingd;}switchgd{caseA:casea:cout\nScored90-100!\n;break;caseB:caseb:cout\nScored80-89!\n;break;caseC:casec:cout\nScored70-79!\n;break;caseD:cased:cout\nScored60-69!\n;break;caseE:casee:cout\nScoreunder60!\n;break;default:coutUnexpecterror!\n;//防止意外错误}}
2.什么叫循环控制?归纳比较C++中各种循环控制语句的语法、循环条件和循环结束条件的表示形式及执行流程【解答】循环控制是在特定的条件下,程序重复执行一些特定动作语句语法执行流程使用场合while语句while表达式循环体;循环条件表达式值为非0真循环结束条件表达式值为0假程序中常用于根据条件执行操作而不需关心循环次数的情况先判断形式循环,条件不成立时不进入循环体do-while语句do循环体while表达式;循环条件表达式值为非0真循环结束条件表达式值为0假程序中常用于根据条件执行操作而不需关心循环次数后判断形式循环,至少执行1次循环体一般情况,while语句和dowhile语句可以互换使用for语句for[表达式1];[表达式2];[表达式3]循环体;
(1)表达式1称为初始化表达式,不是循环体执行部分
(2)表达式3称为后置表达式,作为循环体的最后一个执行表达式
(3)循环条件表达式2值为非0(真)循环结束条件表达式2值为0(假)for语句称为步长循环语句,通常用于确定循环次数的情况由于语句的3个表达式均可以缺省,也可以用于条件循环,即循环次数不确定的情况
3.根据一个实际问题,用不同的循环语句编程,分析其优缺点【解答】略
4.用if语句和goto语句组织循环,改写思考题的第3小题编写的程序分析在什么情况下可以适当使用goto语句【解答】在不破坏程序基本流程控制的情况下,可以适当使用goto语句实现从语句结构内部向外的必要跳转,即按特定条件结束结构语句块的执行程序略
5.有以下程序#includeiostreamusingnamespacestd;intmain{charc;cinc;ifc==y||c==Yinta=1;elseinta=0;couta=aendl;}编译错误为errorC2065:a:undeclaredidentifier,指示变量a没有定义请分析原因,并做出修改【解答】变量a的定义不应该放在if-else语句体中说明语句和执行语句的执行时机不同变量说明要求在编译时定义存储空间,而if-else是执行语句,程序运行后才执行正确的程序是#includeiostreamusingnamespacestd;intmain{charc;inta;cinc;ifc==y||c==Ya=1;elsea=0;couta=aendl;}
6.有以下程序,希望判断两个输入的整数是否相等程序通过编译,但不能达到预期结果请分析程序能够通过C++编译而不能得到期望结果的原因#includeiostreamusingnamespacestd;intmain{intab;couta:;cina;coutb:;cinb;ifa=bcouta等于bendl;elsecouta不等于bendl;}程序运行后,输入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”【解答】#includeiostreamusingnamespacestd;intmain{doublescore;coutpleaseinputscore:;cinscore;ifscore=85coutVerygood!;elseifscore=60coutGood!;elsecoutNogood!;}2.输入三个整数,按从小到大的顺序输出它们的值【解答】#includeiostreamusingnamespacestd;intmain{intabct;coutabc=;cinabc;ifab{t=a;a=b;b=t;}ifac{t=a;a=c;c=t;}ifbc{t=b;b=c;c=t;}couta\tb\tcendl;}3.输入三角形的三条边,判别它们能否形成三角形,若能,则判断是等边、等腰、还是一般三角形【解答】#includeiostreamusingnamespacestd;intmain{doubleabc;coutabc=;cinabc;ifa+bcb+cac+ab{ifa==bb==ccout等边三角形!endl;elseifa==b||a==c||b==ccout等腰三角形!endl;elsecout一般三角形!endl;}elsecout不能形成三角形!endl;}4.输入百分制成绩,并把它转换成五级分制,转换公式为【解答】#includeiostreamusingnamespacestd;intmain{doublescore;chargrade;coutscore=;cinscore;ifscore=0score=100{switchintscore/10{case10:case9:grade=a;break;case8:grade=b;break;case7:grade=c;break;case6:grade=d;break;case5:case4:case3:case2:case1:case0:grade=e;break;}}else{cout数据输入错误!endl;gotoend;}coutgradeendl;end:;//分号不能省}5.编程序模拟剪刀、石头和纸游戏游戏规则为剪刀剪纸,石头砸剪刀,纸包石头玩游戏者从键盘上输入s(表示剪刀)或r(表示石头)或p(表示纸),要求两个游戏者交替输入,计算机给出输赢的信息【解答】#includeiostreamusingnamespacestd;intmain{charfirstsecond;coutFirstinputsrorp:;cinfirst;coutSecondinputsrorp:;cinsecond;switchfirst{cases:switchsecond{cases:coutScissortiesscissor.endl;gotoend;caser:coutScissoriscrushedbyrock.endl;gotoend;casep:coutScissorcutspaper.endl;gotoend;default:coutsecondinputerror!endl;gotoend;}caser:switchsecond{cases:coutRockcrushesscissor.endl;gotoend;caser:coutRocktiesrock.endl;gotoend;casep:coutRockiswrappedbypaper.endl;gotoend;default:coutsecondinputerror!endl;gotoend;}casep:switchsecond{cases:coutPaperiscutbyscissor.endl;gotoend;caser:coutPaperwrapstherock.endl;gotoend;casep:coutPapertiespaper.endl;gotoend;default:coutsecondinputerror!endl;gotoend;}default:coutFirstinputerror!endl;gotoend;}end:;}
6.输入一个整数,输出该整数的所有素数因子例如,输入120,输出为
2、
2、
2、3和5【解答】#includeiostreamusingnamespacestd;intmain{intmi=2;coutpleaseinputm:;cinm;whilei=mifm%i==0{couti;m=m/i;}elsei++;}
7.使用迭代公式编程序求某一正整数a的平方根【解答】#includeiostream#includecmathusingnamespacestd;intmain{constdoubleeps=1e-8;doubleax0x;coutpleaseinputa:;cina;x0=a/2;x=x0+a/x0/2;whilefabsx-x0eps{x0=x;x=x0+a/x0/2;}coutxendl;}
8.已知X=0,10,20,…,180,求sinxcosx和tanx的值【解答】#includeiostream#includecmath#includeiomanipusingnamespacestd;intmain{constdoublepi=
3.14159265;inti;doublexy1y2y3;coutsetw2xsetw15sinxsetw15cosxsetw15tgxendl;fori=0;i=18;i++{x=i*10*pi/180;y1=sinx;y2=cosx;y3=y1/y2;coutsetw2isetw15y1setw15y2setw15y3endl;}}
9.在100到200中找出同时满足用3除余2,用5除余3和用7除余2的所有整数【解答】#includeiostreamusingnamespacestd;intmain{inti;fori=100;i=200;i++{ifi%3==2i%5==3i%7==2coutiendl;}}
10.求100到999中的水仙花数所谓水仙花数是指一个三位数,它的每位数字的立方之和等于该数例如,因为153=1+5+3,所以153为水仙花数【解答】#includeiostreamusingnamespacestd;intmain{intiabc;fori=100;i=999;i++{a=i/100;b=i-a*100/10;c=i-a*100-b*10;ifi==a*a*a+b*b*b+c*c*ccoutiendl;}}
11.求1000之内的所有完数所谓完数是指一个数恰好等于它的所有因子之和例如,因为6=1+2+3,所以6为完数【解答】#includeiostreamusingnamespacestd;intmain{intijs;fori=1;i=1000;i++{s=0;forj=1;ji;j++ifi%j==0s=s+j;ifi==scoutiendl;}}
12.编一程序显示由符号组成的三角形图案例如,程序运行后,屏幕显示Howmanylines用户输入5屏幕显示Whatcharacter用户输入*则输出如下图案*************************【解答】#includeiostreamusingnamespacestd;intmain{intijkn;charch;coutHowmanylines\n;cinn;coutWhatcharacter\n;cinch;fori=1;i=n;i++{fork=1;k=n-i;k++cout;forj=1;j=2*i-1;j++coutch;coutendl;}}
13.已知XYZ+YZZ=532,其中X,Y和Z为数字,编一程序求出X,Y和Z的值【解答】#includeiostreamusingnamespacestd;intmain{intxyzi;forx=1;x=9;x++fory=1;y=9;y++forz=0;z=9;z++{i=100*x+10*y+z+100*y+10*z+z;ifi==532coutx=x\ty=y\tz=zendl;}}习题3及其解答
3.1选择题1.以下正确的函数原型为daf1intx;inty;bvoidf1xy;cvoidf1intxy;dvoidf1intint;2.有函数原型voidfun2int;下面选项中,不正确的调用是cainta=21;fun2a;binta=15;fun2a*3;cintb=100;fun2b;dfun2256;3.有函数原型voidfun3int*;下面选项中,正确的调用是cadoublex=
2.17;fun3x;binta=15;fun3a*
3.14;cintb=100;fun3b;dfun3256;4.有函数原型voidfun4int;下面选项中,正确的调用是cainta=
2.17;fun4a;binta=15;fun4a*
3.14;cintb=100;fun4b;dfun4256;5.有声明voidfun5int*;inta*p=a;下面选项中,正确的调用是bafun5a;bfun5p;cfun5*a;dfun5*p;6.有声明intfun6int*pfint=fun6;下面选项中,正确的调用是cainta=15;intn=fun6a;binta=15;coutpfa;ccout*pf256;dcout*pf256;7.在VC中,若定义一个函数的返回类型为void,以下叙述正确的是ca函数返回值需要强类型转换b函数不执行任何操作c函数本身没有返回值d函数不能修改实际参数的值8.函数参数的默认值不允许为ca全局常量b直接常量c局部变量d函数调用9.使用重载函数编程序的目的是aa使用相同的函数名调用功能相似的函数b共享程序代码c提高程序的运行速度d节省存贮空间10.下列的描述中b是错误的a使用全局变量可以从被调用函数中获取多个操作结果b局部变量可以初始化,若不初始化,则系统默认它的值为0c当函数调用完后,静态局部变量的值不会消失d全局变量若不初始化,则系统默认它的值为011.下列选项中,c的具有文件作用域a语句标号b局部变量c全局变量d静态变量
3.2阅读下列程序,写出执行结果1.#includeiostreamusingnamespacestd;#includecmathintfint;intmain{inti;fori=0;i3;i++coutfiendl;}intfinta{intb=0c=1;b++;c++;returninta+powdoubleb2+c;}【解答】3452.#includeiostreamusingnamespacestd;voidfuncintaintbintc=3intd=4;intmain{func10152030;func101112;func1212;}voidfuncintaintbintcintd{couta\tb\tc\tdendl;}【解答】1015203010111241212343.#includeiostreamusingnamespacestd;voidfuncintintint*;intmain{intxyz;func56x;func7xy;funcxyz;coutxyzendl;}voidfuncintaintbint*c{b+=a;*c=b-a;}【解答】6664.#includeiostreamusingnamespacestd;voidfuncintintint;intmain{intx=0y=1z=2;func12x;funcx+yyy;funczx+yz;coutxyzendl;}voidfuncintaintbintc{b+=a;c=b-a;}【解答】2135.#includeiostreamusingnamespacestd;voidfuncint*int*int*;intmain{inta=10b=20;int*p=a*q=b;funcpqp;cout*p=*p*q=*qendl;}voidfuncint*t1int*t2int*rt{*t1+=5;*t2+=5;rt=t1;*rt+=5;cout*t1=*t1*t2=*t2*rt=*rtendl;}【解答】*t1=20*t2=25*rt=20*p=20*q=256.#includeiostreamusingnamespacestd;intf2intint;intf1intaintb{intc;a+=a;b+=b;c=f2a+bb+1;returnc;}intf2intaintb{intc;c=b%2;returna+c;}intmain{inta=3b=4;coutf1abendl;}【解答】157.#includeiostreamusingnamespacestd;intageintn{intf;ifn==1f=10;elsef=agen-1+2;returnf;}intmain{coutage:age5endl;}【解答】age:188.#includeiostreamusingnamespacestd;intf1intaintb{returna+b;}intf2intaintb{returna-b;}intf3int*tintintintaintb{return*tab;}intmain{int*pintint;p=f1;coutf3p48endl;p=f2;coutf3p84endl;}【解答】1249.#includeiostreamusingnamespacestd;intsubintint;inta=1;intmain{intm=1n=2f;f=submn;couta\tfendl;f=submn;couta\tfendl;}intsubintcintd{staticintm=2n=5;coutm\tn\tendl;a=++a;c=m++;d=n++;returnc+d;}【解答】
252736393.3思考题1.函数的作用是什么?如何定义函数?什么叫函数原型?【解答】函数的两个重要作用
(1)任务划分,把一个复杂任务划分为若干小任务,便于分工处理和验证程序正确性;
(2)软件重用,把一些功能相同或相近的程序段,独立编写成函数,让应用程序随时调用,而不需要编写雷同的代码函数的定义形式类型函数名([形式参数表]){语句序列}函数原型是函数声明,告诉编译器函数的接口信息函数名、返回数据类型、接收的参数个数、参数类型和参数顺序,编译器根据函数原型检查函数调用的正确性2.什么叫函数值的返回类型?什么叫函数的类型?如何通过指向函数的指针调用一个已经定义的函数?请写一个验证程序说明【解答】
(1)函数的返回类型是函数返回的表达式的值得类型;
(2)函数类型是指函数的接口,包括函数的参数定义和返回类型;
(3)若有functionTypefunctionName;//functionType是已经定义的函数类型functionType*functionPointer=functionName;//定义函数指针并获取函数地址则可以通过函数指针调用函数*functionPointerargumentList;或functionPointerargumentList;其中argumentList是实际参数表验证程序#includeiostreamusingnamespacestd;intmain{typedefintmyfuncintint;myfuncf*fp;inta=10b=6;fp=f;coutUsingfa:fabendl;//函数名调用函数coutUsingfpa:fpabendl;//函数指针调用函数coutUsing*fpa:*fpabendl;//函数指针调用函数return0;}intfintiintj{returni*j;}3.什么叫形式参数?什么叫实际参数?C++函数参数有什么不同的传递方式?请写一个验证程序说明【解答】参数是调用函数与被调用函数之间交换数据的通道函数定义首部的参数称为形式参数,调用函数时使用的参数称为实际参数C++有三种参数传递机制值传递(值调用);指针传递(地址调用);引用传递(引用调用)验证程序#includeiostreamusingnamespacestd;voidfuncAinti{i=i+10;}voidfuncBint*j{*j=*j+20;}voidfuncCintk{k=k+30;}intmain{inta=1;funcAa;couta=aendl;funcBa;couta=aendl;funcCa;couta=aendl;}程序输出a=1//传值参数,实际参数值不变a=21//指针参数,形式参数通过间址修改实际参数a=51//引用参数,形式参数通过别名方式修改实际参数4.C++函数通过什么方式传递返回值?当一个函数返回指针类型时,对返回表达式有什么要求?若返回引用类型时,是否可以返回一个算术表达式?为什么?【解答】C++首先计算表达式的值,然后把该值赋给函数返回类型的匿名对象,通过这个对象,把数值带回调用点,继续执行后续代码当函数返回指针类型时,返回的地址值所指对象不能是局部变量因为局部变量在函数运行结束后会被销毁,返回这个指针是毫无意义的返回引用的对象不能是局部变量,也不能返回表达式算术表达式的值被储存在匿名空间中,函数运行结束后会被销毁,返回这个变量的引用也是无意义的5.变量的生存期和变量作用域有什么区别?请举例说明【解答】变量的生存期是指程序运行后,变量占有内存的时间;变量作用域指的是指变量声明之后,在程序正文中有效的那部分区域例如,定义函数:voidcount{staticintn=0;//……}该函数中n被定义为static变量,生存期是整个程序运行时期;但作用域只在count函数中6.静态局部变量有什么特点?编写一个应用程序,说明静态局部变量的作用【解答】静态局部变量的生存期是全程的,作用域是局部的程序开始执行时就分配和初始化存储空间(默认初始化值为0)定义静态局部变量的函数退出时,系统保持其存储空间和数值下次调用这个函数时,static变量还是上次退出函数时的值直至整个程序运行结束,系统才收回存储空间程序略7.在一个语句块中能否访问一个外层的同名局部变量?能否访问一个同名的全局变量?如果可以,应该如何访问?请写一个验证程序说明【解答】一个语句块中不能访问外层的同名局部变量可以访问一个同名的全局变量验证程序#includeiostreamusingnamespacestd;inta=0;//全局变量aintmain{inta=1;//外层局部变量a{inta=2;//内层局部变量acoutLocalaisaendl;//输出内层局部变量a}coutMainaisaendl;//输出外层局部变量acoutGlobalais::aendl;//输出全局部变量a}8.有函数原型voidfintn;和函数调用inta;//……fa;有人说,因为n是a的引用,在函数f中访问n相当于访问a,所以,可以在f的函数体内直接使用变量名a这种说法正确吗?为什么?请你写个验证程序【解答】形式参数n的作用域是f函数,实际参数a的作用域是调用f函数的模块(例如main函数),所以在f函数中可见n而不可见a因此,这种说法不正确f函数内不能直接使用变量名a,只能通过别名n访问a验证程序#includeiostreamusingnamespacestd;voidfintn;intmain{inta=1;fa;couta=aendl;}voidfintn{a++;//错误,直接使用an++;//正确}产生编译错误errorC2065:“a”:未声明的标识符9.有函数原型doublefunctionintdouble;函数function的返回值类型是什么?函数的类型是什么?请用typedef定义函数的类型若有函数调用语句x=function102*
0.314+5;其中的括号“”与函数原型中括号有什么语义区别?【解答】函数function的返回值类型是double函数类型是doubleintdouble可以定义为typedefdoublefunTypeintdouble;函数调用function102*
0.314+5中,外层括号表示调用函数匹配的实际参数表,里面的两层括号是表达式运算10.请分析以下各语句的意义int*fun;int**pf;fun;pf=fun;pf;【解答】int*fun;//函数原型声明fun是返回int*类型,没有参数的函数int**pf;//声明指针变量pf是指向函数的指针,函数类型为int*fun;//调用函数语句pf=fun;//向指针变量赋值函数指针pf指向函数funpf;//用指针变量间址调用函数
3.4编程题1.已知,其中sh为双曲正弦函数,即编一程序,输入x的值,求y的值【解答】#includeiostream#includecmathusingnamespacestd;doubleshdoublet;intmain{doublexy;coutx=;cinx;y=sh1+shx/sh2*x+sh3*x;couty=yendl;}doubleshdoublet{returnexpt-exp-t/2;}2.输入m、n和p的值,求s=的值注意判断运算中的溢出【解答】usingnamespacestd;doubleflongklongnum;intmain{longmnp;doublesf1f2f3;coutmnp=;cinmnp;f1=f1m;f2=f3n;f3=f5p;iff1f2f3{s=f1+f2/f3;couts=sendl;}elsecout溢出!\n;}doubleflongklongnum{longi;doublesum=0;fori=1;i=numsum2147483647;i++{sum=sum+powdoubleidoublek;}ifi=numreturn0;//溢出时返回returnsum;}3.输入ab和c的值,编写一个程序求这三个数的最大值和最小值要求把求最大值和最小值编写成一个函数,并使用指针或引用作为形式参数把结果返回main函数【解答】
(1)使用指针参数#includeiostreamusingnamespacestd;voidfmaxmindoubledoubledoubledouble*double*;intmain{doubleabcmaxmin;coutabc=;cinabc;fmaxminabcmaxmin;coutmax=maxendl;coutmin=minendl;}voidfmaxmindoublexdoubleydoublezdouble*p1double*p2{doubleuv;ifxy{u=x;v=y;}else{u=y;v=x;};ifzuu=z;ifzvv=z;*p1=u;*p2=v;}
(2)使用引用参数#includeiostreamusingnamespacestd;voidfmaxmindoubledoubledoubledoubledouble;intmain{doubleabcmaxmin;coutabc=;cinabc;fmaxminabcmaxmin;coutmax=maxendl;coutmin=minendl;}voidfmaxmindoublexdoubleydoublezdoublep1doublep2{doubleuv;ifxy{u=x;v=y;}else{u=y;v=x;};ifzuu=z;ifzvv=z;p1=u;p2=v;}4.用线性同余法生成随机数序列的公式为rk=multiplier*rk-1+increment%modulus序列中的每一个数rk,可以由它的前一个数rk-1计算出来例如,如果有rk=25173*rk-1+13849%65536则可以产生65536个各不相同的整型随机数设计一个函数作随机数生成器,生成一位或两位数的随机数利用这个随机数生成器,编写一个小学生四则运算的练习程序1·可以进行难度选择一级难度只用一位数,二级难度用两位数;2·可以选择运算类型,包括加、减、乘、除等;3·给出错误提示;4·可以统计成绩【解答】#includeiostreamusingnamespacestd;intRandintint;//生成指定范围的随机数intmain{intwirt=0;charopanswer;intabd;while1//练习开始{cout现在开始?Y或N\n;cinanswer;ifanswer==N||answer==nbreak;while1{cout请输入难度1或2:;cinw;ifw!=1w!=2cout输入难度错误,重新输入!endl;elsebreak;}while1{cout请输入运算类型+-*/:;cinop;ifop!=+op!=-op!=*op!=/cout输入运算符错误,重新输入!endl;elsebreak;}//出10道题,每题10分t=0;fori=1;i=10;i++{while1{ifw==1{a=Rand010;b=Rand010;}elseifw==2{a=Rand10100;b=Rand10100;}ifop==-ifabcontinue;//使被减数大于减数ifop==/ifinta/b!=a/bcontinue;//只做结果为整数的除法break;}coutaopb=;cind;switchop{case+:r=a+b;break;case-:r=a-b;break;case*:r=a*b;break;case/:r=a/b;break;}ifr==d{cout你算对了,加10分!endl;t=t+10;}elsecout你算错了!endl;}cout你的成绩是t分endl;}}intRandintmintn{staticintr;//静态变量保留上一个随机数do{r=25173*r+13849%65536;}whilerm||r=n;returnr;}5.已知勒让德多项式为编一程序,从键盘上输入x和n的值,使用递归函数求px的值【解答】#includeiostreamusingnamespacestd;doublepdoublexintn;intmain{intn;doublex;coutpleaseinputxandn:;cinxn;coutpxn=pxnendl;}doublepdoublexintn{doublet1t2;ifn==0return1;elseifn==1returnx;else{t1=2*n-1*pxn-1;t2=n-1*pxn-2;returnt1-t2/n;}}6.把以下程序中的print函数改写为等价的递归函数#includeiostreamusingnamespacestd;voidprintintw{forinti=1;i=w;i++{forintj=1;j=i;j++couti;coutendl;}}intmain{print5;}运行显示122333444455555【解答】#includeiostreamusingnamespacestd;voidprintintw{inti;ifw{printw-1;fori=1;i=w;i++coutw;coutendl;}}voidmain{print5;}7.已知用梯形法求积分的公式为,其中h=b-a/n,n为积分区间的等分数,编程序求如下积分的值要求把求积分公式编写成一个函数,并使用函数指针作为形式参数调用该函数时,给定不同的被积函数作为实际参数求不同的积分
①②③【解答】#includeiostream#includecmathusingnamespacestd;doublef1doublex{return4/1+x*x;}doublef2doublex{returnsqrt1+x*x;}doublef3doublex{returnsinx;}doubletrapdouble*fundoublexdoubleadoubleblongn{doubleth;inti;t=*funa+*funb/
2.0;h=b-a/n;fori=1;i=n-1;i++t+=*funa+i*h;t*=h;returnt;}intmain{doublet1t2t3;t1=trapf10110000;coutt1=t1endl;t2=trapf21210000;coutt2=t2endl;t3=trapsin
03.14159265/210000;coutt3=t3endl;}8.编写一个程序,包含三个重载的display函数和一个主函数要求第一个函数输出double值,前面用字符串“adouble”引导,第二个函数输出一个int值,前面用字符串“aint”引导,第三个函数输出一个char字符值,前面用字符串“achar”引导,在主函数中分别用double、int和char型变量作为实参调用display函数【解答】#includeiostreamusingnamespacestd;voiddisplaydoubled{coutadouble:dendl;}voiddisplayinti{coutaint:iendl;}voiddisplaycharc{coutachar:cendl;}intmain{doubled=
1.5;inti=100;charc=a;displayd;displayi;displayc;}9.使用重载函数编程序分别把两个数和三个数从大到小排列【解答】#includeiostreamusingnamespacestd;voidsortdoublexdoubley;voidsortdoublexdoubleydoublez;intmain{sort
5.679;sort
0.
530.
85.9;}voidsortdoublexdoubley{ifxycoutx\tyendl;elsecouty\txendl;}voidsortdoublexdoubleydoublez{doublet;ifyz{t=y;y=z;z=t;}ifxz{t=x;x=z;z=t;}ifxy{t=x;x=y;y=t;}coutx\ty\tz\tendl;}10.给定求组合数公式为,编一程序,输入m和n的值,求的值注意优化算法,降低溢出可能要求主函数调用以下函数求组合数intFabricateintmintn;//返回的值Fabricate函数内又须调用Multi函数intMultiintmintn;//返回m×m-1×…×n程序由4个文件组成头文件存放函数原型作为调用接口;其他3个cpp文件分别是main、Fabricate和Multi函数的定义【解答】//Fabricate.h#ifndefFABRICATE_H#defineFABRICATE_HintFabricateintmintn;intMultiintmintn;#endif//main.cpp#includeiostreamusingnamespacestd;#includeFabricate.hintmain{intmn;coutinputmandn:;cinmn;coutFabricatemn=Fabricatemnendl;}//Fabricate.cpp#includeFabricate.hintFabricateintmintn{returnMultimm-n+1/Multin1;}//Multi.cppintMultiintmintn{intit=1;fori=n;i=m;i++t=t*i;returnt;}习题4及其解答
4.1选择题1.以下对一维数组a的正确定义是caintn=5a[n];binta5;cconstintN=5;inta[N];dintn;cinn;inta[n];2.下列数组定义语句中,不合法的是aainta
[3]={0123};binta[]={012};cinta
[3]={012};dinta
[3]={0};3.已知inta
[10]={0123456789}*p=a;则不能表示数组a中元素的式子是ca*ab*pcada[p-a]4.已知inta[]={0246810}*p=a+1;其值等于0的表达式是da*p++b*++pc*p--d*--p5.以下不能对二维数组a进行正确初始化的语句是cainta
[2]
[3]={0};binta[]
[3]={{01}{0}};cinta
[2]
[3]={{01}{23}{45}};dinta[]
[3]={012345};6.已知inta[]
[3]={{01}{234}{56}{7}};则a
[2]
[1]的值是ca0b2c6d77.已知inta
[3]
[3]={123456789};则不能表示数组元素a
[2]
[1]的地址是baa
[2]
[1]b*a
[2]+1ca
[2]+1d*a+2+18.已知char*a[]={fortranbasicpascaljavac++};则couta
[3];的显示结果是catb一个地址值cjavadjavac++9.若用数组名作为调用函数的实参则传递给形参的是aa数组存贮首地址b数组的第一个元素值c数组中全部元素的值d数组元素的个数10.设有char*s1=”ABCDE”*s2=”ABCDE”*s3=s1;下列表达式中值等于true的是das1==s2bs1==s3cs2==s3dstrcmps1s3==011.设char*s1*s2;分别指向两个字符串判断字符串s1和s2是否相等的表达式为das1=s2bs1==s2cstrcpys1s2==0dstrcmps1s2==012.设char*s1*s2;分别指向两个字符串,判断字符串s1是否大于字符串s2的表达式为cas1s2bstrcmps1s2==0cstrcmps1s20dstrcmps2s
104.2阅读下列程序,写出执行结果1.#includeiostreamusingnamespacestd;intmain{inticount=0sum=0;doubleaverage;inta[]={12345678910};fori=0;i10;i++{ifa[i]%2==0continue;sum+=a[i];count++;}average=sum/count;coutcount=count\taverage=averageendl;}【解答】conut=5average=52.#includeiostreamusingnamespacestd;intmain{inta
[9]={123456789};int*p=asum=0;for;pa+9;p++if*p%2==0sum+=*p;coutsum=sumendl;}【解答】sum=203.#includeiostream#includeiomanipusingnamespacestd;constintN=5;intmain{inta[N][N]={0}ijk;fork=1i=0;iN;i++forj=i;j=0;j--k++a[j][i-j]=k;fori=0;iN;i++{forj=0;jN;j++coutsetw3a[i][j];coutendl;}}【解答】13610152591404813007120001100004.#includeiostreamusingnamespacestd;intfint[]int;intmain{inta[]={-135-79-11};coutfa6endl;}intfinta[]intsize{intit=1;fori=0;isize;i++ifa[i]0t*=a[i];returnt;}【解答】1355.#includeiostreamusingnamespacestd;intfint[]
[3]intint;intmain{inta[]
[3]={012345678};coutfa33endl;}intfinta[]
[3]introwintcol{intijt=1;fori=0;irow;i++forj=0;jcol;j++{a[i][j]++;ifi==jt*=a[i][j];}returnt;}【解答】456.#includeiostreamusingnamespacestd;voidtest1int*a1{a1=newint5;cout*a1=*a1endl;}voidtest2int*a2{a2=newint5;cout*a2=*a2endl;}intmain{int*p=newint1;test1p;couttest1:*p1=*pendl;test2p;couttest2:*p2=*pendl;}【解答】*a1=5test1:*p1=1*a2=5test2:*p2=57.#includeiostreamusingnamespacestd;intmain{chars[]=abccda;inti;charc;fori=1;c=s[i]!=\0;i++{switchc{casea:cout%;continue;caseb:cout$;break;casec:cout*;break;cased:continue;}cout#endl;}}【解答】$#*#*#%8.#includeiostreamusingnamespacestd;intmain{char*str[]={c++basicpascal};char**p;inti;p=str;fori=0;i3;i++cout*p+iendl;}【解答】c++basicpascal9.#includeiostreamusingnamespacestd;intmain{chars1[]=Fortrans2[]=Foxpro;char*p*q;p=s1;q=s2;while*p*q{if*p==*qcout*p;p++;q++;}coutendl;}【解答】For10.#includecstring#includeiostreamusingnamespacestd;intmain{charstr[]
[10]={vbpascalc++}s
[10];strcpy_ssstrcmpstr
[0]str
[1]0str
[0]:str
[1];ifstrcmpstr
[2]s0strcpy_ssstr
[2];coutsendl;}【解答】C++
4.3思考题1.数组说明语句要向编译器提供什么信息?请写出一维数组、二维数组说明语句的形式【解答】数组说明语句要向编译器提供数组名(标识符),数组元素的类型、数组维数、数组长度(元素的个数)等信息一维数组说明语句为类型数组名[表达式]二维数组说明语句为类型数组名[表达式1][表达式2]2.数组名、数组元素的区别是什么?归纳一维数组元素地址、元素值不同的表示形式若有说明intaa
[3]*pa=aa;请使用aa或pa,写出3个以上与aa
[2]等价的表达式【解答】数组名是一个标识符,执行代码中代表数组的地址,即指向数组起始位置的指针;而数组元素是下标变量,性质相当于普通变量对一维数组aa第i个元素的地址可以表示为aa[i]aa+i;对一维数组aa第i个元素的值可以表示为a[i]*a+i;与aa
[2]等价的表达式*aa+2*a
[2]*pa+2pa
[2]3.要把一维数组inta[m*n]的元素传送到二维数组intb[m][n]中,即在程序中要执行b[i][j]=a[k];请写出kij的下标变换公式,并用程序验证【解答】转换公式i=k/nj=k%n验证程序#includeiostreamusingnamespacestd;intmain{constintM=3N=4;intka[M*N]={123456789101112}b[M][N];intij;coutarraya:endl;fork=0;kM*N;k++b[k/N][k%N]=a[k];fork=0;kM*N;k++couta[k]\t;coutendl;cout**Afterconvert**endl;coutarrayb:endl;fori=0;iM;i++{forj=0;jN;j++coutb[i][j]\t;coutendl;}}4.有以下函数voidquery{int*p;p=newint
[3];//……delete[]p;p=newdouble
[5];//……delete[]p;}出现了编译错误请分析错误的原因,并把上述程序补充完整,上机验证你的判断【解答】在语句p=newdouble
[5];中企图把动态浮点型数组的地址写入整型指针p,造成错误错误为errorC2440:“=”:无法从“double*”转换为“int*”改正方法增加一个double*q指针voidquery{int*p;p=newint
[3];delete[]p;//……double*q;q=newdouble
[5];//……delete[]q;}5.有以下程序根据输入值,设计功能是调用函数create建立并初始化动态数组,令a[i]=i但该程序运行后不能得到期望结果,请分析程序的错误原因并修改之#includeiostreamusingnamespacestd;voidcreateint*int;intmain{int*a=NULLlen;cinlen;createalen;forinti=0;ilen;i++couta[i];coutendl;delete[]a;a=NULL;}voidcreateint*apintn{ap=newint[n];forinti=0;in;i++ap[i]=i;}【解答】函数create中,指针参数int*ap是传地址值的参数调用函数时接受实际参数a的值(地址值)作为初始值ap仅是局部变量,ap=newint[n]获得新的地址值,函数执行完毕返回,ap被释放,完全与实际参数a无关程序没有编译错误,但main不能获得动态数组修改方法是把ap改为指针引用参数voidcreateint*int;//函数原型声明使用引用参数voidcreateint*apintn//函数定义{ap=newint[n];forinti=0;in;i++ap[i]=i;}
4.4编程题1.已知求成绩的平均值和均方差公式,其中n为学生人数,s为第i个学生成绩求某班学生的平均成绩和均方差【解答】#includeiostream#includecmathusingnamespacestd;voidaveMsddouble[]intdoubledouble;//求平均值和均方差值函数intmain{doubles[]={76855477938390678165};doubleavemsd;intin;n=sizeofs/sizeofdouble;//求数组元素的个数cout学生成绩;fori=0;in;i++couts[i];coutendl;aveMsdsnavemsd;cout平均值aveendl均方差值msdendl;}voidaveMsddoubles[]intndoubleavedoublemsd{inti;doublesum1=0sum2=0;fori=0;in;i++//求平均值sum1+=s[i];ave=sum1/n;fori=0;in;i++//求均方差sum2+=pows[i]-ave2;msd=sqrtsum2/n;}2.用随机函数产生10个互不相同的两位整数存放到一维数组中,并输出其中的素数【解答】#includeiostream#includecmath#includecstdlib#includectimeusingnamespacestd;intmain{inta
[10]ij;srandinttime0;//为随机数生成器设置种子值fori=0;i10;i++{l:a[i]=rand;//产生随机数存放到数组中ifa[i]10||a[i]=100//获取指定范围数据gotol;forj=0;ji;j++//排除相同数据ifa[i]==a[j]gotol;}fori=0;i10;i++couta[i];coutendl;fori=0;i10;i++{doublem=sqrtdoublea[i];forj=2;j=m;j++ifa[i]%j==0break;ifjmcouta[i];}cout是素数!endl;}3.将一组数据从大到小排列后输出,要求显示每个元素及它们在原数组中的下标【解答】#includeiostreamusingnamespacestd;intmain{inta[]={38629125206327810};intindex
[10];//记录下标的数组intijtemp;fori=0;i10;i++index[i]=i;fori=0;i=8;i++forj=i+1;j=9;j++ifa[i]a[j]{temp=a[i];a[i]=a[j];a[j]=temp;temp=index[i];index[i]=index[j];index[j]=temp;}fori=0;i10;i++couta[i]\tindex[i]endl;}4.从键盘上输入一个正整数,判别它是否为回文数所谓回文数是指正读和反读都一样的数例如,123321是回文数【解答】#includeiostreamusingnamespacestd;intmain{intb
[10]ijkflag;longnumn;coutnum=;cinnum;k=0;n=num;do//拆分整数,把各数字放入数组b{b[k++]=n%10;n=n/10;}whilen!=0;flag=1;//判断标志i=0;j=k-1;//设置指示下标的指针whileijifb[i++]!=b[j--]//对称位置元素不相等{flag=0;break;}ifflagcoutnum是回文数!endl;elsecoutnum不是回文数!endl;}5.把两个升序排列的整型数组合并为一个升序数组设计好你的算法,以得到较高的运行效率【解答】#includeiostreamusingnamespacestd;voidmergeconstinta[]intnaconstintb[]intnbintc[]intnc;intmain{inta
[4]={1257};intb
[8]={34889101112};intc
[12];inti;mergea4b8c12;fori=0;i12;i++coutc[i];coutendl;}voidmergeconstinta[]intnaconstintb[]intnbintc[]intnc{intijk;i=j=k=0;whileinajnbifa[i]b[j]//当a[i]b[j],把b[i]写入数组c{c[k]=b[j];k++;j++;}else//当a[i]=b[j],把a[i]写入数组c{c[k]=a[i];k++;i++;}whileina{c[k]=a[i];i++;k++;}//把数组a的剩余元素写入数组cwhilejnb{c[k]=b[j];k++;j++;}//把数组b的剩余元素写入数组c}
6.输入一个表示星期几的数,然后输出相应的英文单词要求使用指针数组实现【解答】#includeiostreamusingnamespacestd;intmain{char*weekday
[7]={sundaymondaytuesdaywednesdaythursdayfridaysaturday};intd;coutpleaseinputweekday:;cind;ifd=0d=6coutd---*weekday+dendl;elsecoutinputerror!endl;}7.编写函数
(1)在一个二维数组中形成如以下形式的n阶矩阵
(2)去掉靠边元素,生成新的n-2阶矩阵;
(3)求矩阵主对角线下元素之和;
(4)以方阵形式输出数组在main函数中调用以上函数进行测试【解答】#includeiostreamusingnamespacestd;voidcreateint*appintn;voiddelint*appint*bppintn;intmaindiagonalint*appintn;voidoutputint*appint;intmain{int*ap=NULL*bp=NULLn;cout输入矩阵的阶;cinn;createapn;cout\n形成矩阵\n;outputapn;cout去掉靠边元素生成的矩阵\n;delapbpn;outputbpn-2;cout主对角线元素之和maindiagonalapnendl;}//形成n阶矩阵函数voidcreateint*appintn{app=newint[n*n];intijk=0;fori=0;in;i++forj=0;jn;j++{ifi=japp[k]=1;elseapp[k]=i-j+1;k++;}}//去掉靠边元素生成n-2阶矩阵函数voiddelint*appint*bppintn{intijk=0;bpp=newint[n-2*n-2];fori=0;in;i++{forj=0;jn;j++ifijin-1jn-1{bpp[k]=*app+i*n+j;k++;}}}//求主对角线元素之和函数intmaindiagonalint*appintn{intijk=0sum=0;fori=0;in;i++{forj=0;jn;j++ifi==jsum+=*app+i*n+j;}returnsum;}//以方阵的形式输出数组函数voidoutputint*appintn{intij;fori=0;in;i++{forj=0;jn;j++cout*app+i*n+j\t;coutendl;}coutendl;}8.设某一城市三个百货公司某个季度销售电视机的情况和价格如下表格所示编写程序,将每个表数据以数组存放,求各个百货公司的电视机营业额牌号公司康佳TCL长虹第一百货公司300250150第二百货公司200240200第三百货公司280210180【解答】#includeiostreamusingnamespacestd;intmain{longs[]
[3]={{300250150}{200240200}{280210180}};longp[]={350033003800};intij;doublesum;fori=0;i3;i++{sum=0;forj=0;j3;j++sum+=s[i][j]*p[j];cout第i+1百货公司的电视机营业额:sumendl;}}9.设计函数求一整型数组的最小元素及其下标在主函数中定义和初始化该整型数组,调用该函数,并显示最小元素值和下标值【解答】#includeiostreamusingnamespacestd;intfminint[]int;intmain{inta[]={73856295775681669080};intindex;index=fminasizeofa/sizeofint;coutTheminnumnumberis:a[index]endl;coutTheindexis:indexendl;}intfmininta[]intsize{intimin=a
[0]index=0;fori=0;isize;i++ifa[i]min{min=a[i];index=i;};returnindex;}10.假设有从小到大排列的一组数据存放在一个数组中,在主函数中从键盘输入一个在该数组的最小值和最大值之间的数,并调用一函数把输入的数插入到原有的数组中,保持从小到大的顺序,并把最大数挤出要求在主函数中输出改变后的数组【解答】#includeiostreamusingnamespacestd;voidinsertinta[]intint;intmain{inta[]={10122325484853586078};intxni;coutpleaseinputinsertdata:;cinx;n=sizeofa/sizeofint;//求数组长度insertanx;//插入元素fori=0;in;i++couta[i];coutendl;}voidinsertinta[]intnintx{intipj;ifxa[n-1]{fori=1;in;i++//查找插入位置ifxa[i]{p=i;break;}forj=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#includectimeusingnamespacestd;voidprintarrayint*pintn;voidadverseint*pintn;intmain{int*pni;cout请输入数组长度:;cinn;p=newint[n];//产生动态数组srandtime0;fori=0;in;i++//产生随机数并存放到动态数组中*p+i=rand/1000;cout动态数组;printarraypn;//输出动态数组adversepn;//对数组逆置cout逆置数组;printarraypn;//输出逆置数组}//输出数组函数voidprintarrayint*pintn{inti;fori=0;in;i++{ifi%5==0coutendl;//控制一行输出5个数据coutarray[i]=*p+i;}coutendl;}//对数组逆置函数voidadverseint*pintn{intit;fori=0;in/2;i++{t=*p+i;*p+i=*p+n-i-1;*p+n-i-1=t;}}12.把一个字符串插入到另一个字符串中指定的位置【解答】#includeiostreamusingnamespacestd;intmain{intpijk;chars1
[40]s2
[40]s3
[80];couts1=;cins1;couts2=;cins2;coutinputinsertposition:;cinp;//输入插入位置fori=0;ip;i++s3[i]=s1[i];forj=0;s2[j]!=\0;j++s3[i+j]=s2[j];fork=p;s1[k]!=\0;k++s3[j+k]=s1[k];s3[j+k]=\0;couts3=s3endl;}13.把某班学生的姓名和学号分别存放到两个数组中,从键盘上输入某一学生学号,查找该学生是否在该班,若找到该学生,则显示出相应的姓名【解答】#includeiostreamusingnamespacestd;intmain{charname
[5]
[20]={limingzhangqingliuxiaopingwangyinglupei};longnum
[5]={2003000120030002200300052003000720030010};inti;longsnumber;coutpleaseinputstudentnumber:;cinsnumber;fori=0;i5;i++{ifnum[i]==snumber{coutFound!Thenameis:name[i]endl;break;}}ifi==5coutCan\tfound!endl;}14.将一组C++关键字存放到一个二维数组中,并找出这些关键字的最小者【解答】#includeiostream#includecstringusingnamespacestd;intmain{charstring
[10];charstr[]
[10]={whilebreakifexternvoidautolongstaticdoconst};inti;strcpystringstr
[0];fori=0;i10;i++ifstrcmpstr[i]string0strcpystringstr[i];coutTheminimumstringis:stringendl;}15.使用指针函数编写程序,把两个字符串连接起来【解答】#includeiostreamusingnamespacestd;char*strcatchar*str1char*str2{char*p=str1;while*p!=\0p++;*p=*str2;do{p++;str2++;*p=*str2;}while*str2!=\0;returnstr1;}intmain{charstr1
[80]str2
[80];coutinputstr1:;cinstr1;coutinputstr2:;cinstr2;coutstr1+str2=strcatstr1str2endl;}16.使用string类,写一个简单文本编辑程序,能够实现基本的插入、删除、查找、替换等功能【解答】略习题5及其解答
5.1选择题1.有说明structpoint{intx;inty;}p;正确的赋值语句是(c)apoint.x=1;point.y=2;bpoint={12};cp.x=1;p.y=2;dp={12};2.已知有职工情况结构变量emp定义为structDate{intyear;intmonth;intday;};strnctEmployee{charname
[20];longcode;Datebirth};Employeeemp;下列对emp的birth的正确赋值方法是dayear=1980;month=5;day=1;bbirth.year=1980;birth.month=5;birth.day=1;cemp.year=1980;emp.month=5;emp.day=1;demp.birth.year=1980;emp.birth.month=5;emp.birth.day=1;3.假定有以下说明语句,则下面引用形式错误的是bstructStudent{intnum;doublescore;};Studentstu
[3]={{100180}{100275}{100391}}*p=stu;ap-numbp++.numcp++-numd*p.num4.若有以下说明语句,则下列错误的引用是dstructWorker{intno;charname
[20];};Workerw*p=w;aw.nobp-noc*p.nod*p.no5.s1和s2是两个结构类型变量,若要赋值s1=s2合法,则它们的说明应该是(c)as1只能接受相同类型的数据成员b结构中的成员相同c同一结构类型的变量d存储字节长度一样的变量
5.2阅读下列程序,写出执行结果1.#includeiostreamusingnamespacestd;structData{intn;doublescore;};intmain{Dataa
[3]={100187100272100390}*p=a;coutp++-nendl;coutp++-nendl;coutp-n++endl;cout*p.n++endl;}【解答】10011002100310042.#includeiostreamusingnamespacestd;structEmployee{charname
[20];charsex;};voidfunEmployee*p{if*p.sex==mcout*p.nameendl;}intmain{Employeeemp
[5]={LimingmWangxiaopingfLuweim};inti;fori=0;i3;i++funemp+i;}【解答】LimingLuwei3.#includeiostreamusingnamespacestd;structNode{char*s;Node*q;};intmain{Nodea[]={{Marya+1}{Jacka+2}{Jima}};Node*p=a;coutp-sendl;coutp-q-sendl;coutp-q-q-sendl;coutp-q-q-q-sendl;}【解答】MaryJackJimMary牌号价格康佳3500TCL3300长虹3800。