C++基础知识-练习三(题目)-c++程序填空题及答案_第1页
C++基础知识-练习三(题目)-c++程序填空题及答案_第2页
C++基础知识-练习三(题目)-c++程序填空题及答案_第3页
C++基础知识-练习三(题目)-c++程序填空题及答案_第4页
C++基础知识-练习三(题目)-c++程序填空题及答案_第5页
已阅读5页,还剩27页未读, 继续免费阅读

付费下载

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

C++基础知识——练习三(题目)_c++程序填空题及答案【程序填空1】以下程序实现功能:定义圆周率常量PI为3.1415926,从键盘输入圆的半径r,计算并输出圆的周长和面积,输出结果保留2位小数。请将程序中【1】【2】【3】处的代码补充完整,使程序逻辑正确、语法合规。```cpp【1】//引入输入输出流操纵算子头文件,用于设置输出精度usingnamespacestd;intmain(){constdoublePI=3.1415926;doubler,perimeter,area;cout<<"请输入圆的半径:";cin>>r;perimeter=【2】;//计算圆的周长area=PI*r*r;cout<<fixed<<【3】(2);//设置输出保留2位小数cout<<"圆的周长为:"<<perimeter<<endl;cout<<"圆的面积为:"<<area<<endl;return0;}```【程序填空2】以下程序实现分段函数的计算:从键盘输入整数x,按照如下规则计算y的值并输出:当x<0时,y=-1;当x=0时,y=0;当x>0时,y=1。程序通过多分支if结构实现逻辑判断,请补充【1】【2】【3】处的代码。```cppusingnamespacestd;intmain(){intx,y;cout<<"请输入整数x的值:";cin>>x;if(【1】){y=-1;}【2】(x==0){y=0;}else{y=【3】;}cout<<"计算得到的y值为:"<<y<<endl;return0;}```【程序填空3】以下程序实现功能:输出100到200之间所有的素数,每行输出5个,统计素数的总个数并输出。素数的判定规则是:大于1的自然数,除了1和它本身之外没有其他正因数。请补充【1】【2】【3】【4】处的代码。```cppusingnamespacestd;intmain(){intcount=0;//统计素数个数for(intnum=100;num<=200;num++){boolisPrime=【1】;//初始化素数标记为真for(inti=2;i*i<=num;i++){//优化:只需遍历到根号num即可if(num%i==0){isPrime=false;【2】;//找到因数后提前退出内层循环,减少无效计算}}if(【3】){//判断当前数为素数cout<<num<<"\t";count++;if(【4】){//每输出5个素数换行cout<<endl;}}}cout<<endl<<"100-200之间共有"<<count<<"个素数"<<endl;return0;}```【程序填空4】以下程序实现冒泡排序功能:从键盘输入10个整数存入一维数组,通过冒泡排序算法将数组元素按从小到大的顺序排序后输出。冒泡排序的核心逻辑是重复遍历待排序序列,比较相邻元素大小,若顺序错误则交换,每一轮遍历会将当前未排序区间的最大值“冒泡”到区间末尾。请补充【1】【2】【3】【4】处的代码。```cppusingnamespacestd;intmain(){intarr[10];cout<<"请输入10个整数:";for(inti=0;i<10;i++){cin>>arr[i];}//冒泡排序核心逻辑for(inti=0;i<【1】;i++){//外层循环控制排序轮数,共需n-1轮for(intj=0;j<【2】;j++){//内层循环控制每轮比较的相邻元素对if(arr[j]>arr[【3】]){//相邻元素比较,若前大后小则交换inttemp=arr[j];arr[j]=arr[j+1];arr[j+1]=temp;}}}cout<<"排序后的数组为:";for(inti=0;i<10;i++){cout<<arr[i]<<"";}cout<<endl;【4】;//主函数正常结束返回值}```【程序填空5】以下程序实现两个功能:一是编写交换函数实现两个整数变量值的交换,二是编写逆置函数实现整型数组元素的首尾逆置。程序中涉及函数的定义、传参方式的选择,请补充【1】【2】【3】【4】处的代码。```cppusingnamespacestd;//函数前置声明voidswap(int&a,int&b);voidreverse(intarr[],intn);intmain(){intx=10,y=20;cout<<"交换前x="<<x<<",y="<<y<<endl;swap(x,y);cout<<"交换后x="<<x<<",y="<<y<<endl;intarr[6]={1,3,5,7,9,11};cout<<"逆置前的数组:";for(inti=0;i<6;i++)cout<<arr[i]<<"";cout<<endl;reverse(arr,6);cout<<"逆置后的数组:";for(inti=0;i<6;i++)cout<<arr[i]<<"";cout<<endl;return0;}//交换函数:交换两个整数的值voidswap(int&a,【1】){inttemp=a;a=b;【2】;}//逆置函数:将长度为n的数组arr首尾逆置voidreverse(intarr[],intn){for(inti=0;i<【3】;i++){swap(arr[i],【4】);}}```【程序填空6】以下程序实现指针基础操作:定义一个包含8个整数的数组,通过指针遍历数组元素,找到数组中的最大值和最小值并输出,不允许使用数组下标访问元素,所有元素访问必须通过指针偏移实现。请补充【1】【2】【3】处的代码。```cppusingnamespacestd;intmain(){intarr[8]={12,45,9,23,67,3,89,34};int*p=arr;//指针p指向数组首元素intmaxVal=*p,minVal=*p;//初始化最大最小值为首元素值for(inti=1;i<8;i++){【1】;//指针向后移动1个单位,指向下一个元素if(*p>maxVal){maxVal=*p;}if(*p<minVal){【2】;//更新最小值为当前指针指向的元素值}}cout<<"数组中的最大值为:"<<maxVal<<endl;cout<<"数组中的最小值为:"<<【3】<<endl;return0;}```【程序填空7】以下程序实现结构体应用:定义学生结构体类型Student,包含学号(id,整型)、姓名(name,字符数组,长度20)、三门课程成绩(score,长度为3的浮点型数组)三个成员。从键盘输入3名学生的信息,计算每名学生的平均分,输出所有平均分低于60分的学生的完整信息。请补充【1】【2】【3】【4】处的代码。```cppusingnamespacestd;【1】Student{//定义结构体类型Studentintid;charname[20];floatscore[3];};intmain(){Studentstus[3];//定义包含3个学生的结构体数组for(inti=0;i<3;i++){cout<<"请输入第"<<i+1<<"名学生的学号、姓名、三门课成绩:";cin>>stus[i].id>>stus[i].name;for(intj=0;j<3;j++){cin>>【2】;//输入第i名学生的第j门课成绩}}cout<<endl<<"平均分低于60分的学生信息如下:"<<endl;for(inti=0;i<3;i++){floatavg=0;for(intj=0;j<3;j++){avg+=stus[i].score[j];}avg=avg/3;if(avg<60){cout<<"学号:"<<stus[i].id<<",姓名:"<<stus[i].name<<",三门课成绩:";for(intj=0;j<3;j++){cout<<stus[i].score[j]<<"";}cout<<",平均分:"<<【3】<<endl;}}return【4】;}```【程序填空8】以下程序实现类和对象的入门应用:定义一个矩形类Rectangle,包含私有成员length(长,浮点型)、width(宽,浮点型),包含公有成员函数setParams用于设置长和宽的值,成员函数getPerimeter用于计算并返回矩形周长,成员函数getArea用于计算并返回矩形面积。在主函数中创建Rectangle类的对象,设置长和宽为用户输入的值,输出矩形的周长和面积。请补充【1】【2】【3】【4】【5】处的代码。```cppusingnamespacestd;classRectangle{【1】://私有成员访问限定符floatlength;floatwidth;public://设置长和宽的成员函数voidsetParams(floatl,floatw){length=l;width=w;}//计算周长的成员函数floatgetPerimeter(){return【2】;//周长公式:2*(长+宽)}//计算面积的成员函数floatgetArea(){return【3】;//面积公式:长*宽}};intmain(){【4】rect;//创建Rectangle类的对象rectfloatl,w;cout<<"请输入矩形的长和宽:";cin>>l>>w;rect.【5】(l,w);//调用成员函数设置长和宽cout<<"矩形的周长为:"<<rect.getPerimeter()<<endl;cout<<"矩形的面积为:"<<rect.getArea()<<endl;return0;}```参考答案与解析程序填空1参考答案与解析【1】答案:`#include<iomanip>`解析:C++标准库中,用于控制输出格式的操纵算子(如fixed、setprecision、setw等)定义在`<iomanip>`头文件中,如果程序中需要设置输出精度、域宽等格式,必须引入该头文件,否则编译阶段会报错。很多初学者容易将其与`<iostream>`混淆,`<iostream>`仅包含cin、cout等基本输入输出流对象的定义,不包含格式操纵算子的实现。【2】答案:`2*PI*r`解析:圆的周长计算公式为周长=2×圆周率×半径,程序中已经定义了常量PI存储圆周率值,变量r存储输入的半径,因此直接代入公式计算即可。需要注意算术表达式的书写规范:乘号*不能省略,常量和变量名严格区分大小写,PI不能写成pi或者Pi,否则会因未定义变量触发编译错误。【3】答案:`setprecision`解析:setprecision是C++的输出格式操纵算子,当与fixed配合使用时,setprecision(n)的作用是设置输出浮点数保留n位小数;如果不搭配fixed,setprecision(n)表示设置输出浮点数的有效数字位数为n位,不符合题目要求保留2位小数的需求。程序填空2参考答案与解析【1】答案:`x<0`解析:多分支if结构的判断顺序从上到下,第一个分支处理x小于0的情况,此时y赋值为-1,因此判断条件为x<0。需要注意关系运算符的写法,小于号<方向不能写反,更不要误写为赋值运算符=,否则会将x赋值为0,导致所有输入都判定为x==0的分支,逻辑完全错误。【2】答案:`elseif`解析:多分支结构中,当前一个分支条件不满足时,需要使用elseif引出下一个判断条件。如果直接写if,会形成独立的if语句,可能出现多个分支同时满足的逻辑错误,也不符合分段函数互斥的判断逻辑(x的值只能满足x<0、x==0、x>0三种情况中的一种)。【3】答案:`1`解析:当前两个条件(x<0、x==0)都不满足时,说明x的值一定大于0,按照分段函数的规则y赋值为1。此处不需要额外写判断条件,else分支已经覆盖了所有x>0的情况,可以减少不必要的判断,提升程序效率。程序填空3参考答案与解析【1】答案:`true`解析:isPrime是布尔类型的标记变量,用于记录当前遍历的数是否为素数。初始状态下默认当前数是素数(标记为true),后续如果找到能整除该数的因数,再将标记改为false。如果初始值误设为false,无论后续是否找到因数,所有数都会被判定为非素数,逻辑完全错误。【2】答案:`break`解析:内层循环的作用是查找当前数是否存在除了1和自身之外的因数,一旦找到一个因数(即num%i==0),就可以确定该数不是素数,此时不需要继续遍历后续的i值,使用break语句提前退出内层循环,能够减少无效计算,提升程序运行效率。如果遗漏break,程序会继续循环判断后续的i值,虽然最终逻辑结果正确,但会产生冗余计算。【3】答案:`isPrime`(或`isPrime==true`)解析:内层循环结束后,如果isPrime的值仍为true,说明遍历完所有可能的因数后都没有找到能整除num的数,该数是素数,需要执行输出和计数操作。此处直接写isPrime即可,因为布尔类型变量的值本身就是条件判断的结果,不需要额外和true做相等比较,书写更简洁。【4】答案:`count%5==0`解析:题目要求每行输出5个素数,count变量记录已经输出的素数个数,每当count的值是5的倍数时,说明已经输出了5个素数,此时输出换行符即可实现每行5个的格式要求。需要注意换行的判断时机是在count自增之后,否则会出现第一行输出4个、后续每行5个的格式错误。本题中100-200之间共有21个素数,最终程序会输出5行,前4行每行5个素数,最后一行输出1个素数。程序填空4参考答案与解析【1】答案:`9`(或`10-1`)解析:冒泡排序的外层循环控制排序轮数,对于长度为n的数组,经过n-1轮排序后,所有元素都可以排列到正确位置,因为最后剩下的一个元素必然是最小值,不需要额外一轮排序。本题中数组长度为10,因此外层循环执行9轮即可,即i从0到8,循环条件为i<9。【2】答案:`9-i`(或`10-1-i`)解析:每完成一轮排序,当前未排序区间的最大值就会被移动到未排序区间的末尾,成为已排序区间的一部分,因此第i轮排序时,需要比较的区间是数组前(10-i)个元素,内层循环中j的取值范围是0到(9-i-1),即循环条件为j<9-i。如果省略-i,每轮循环都会比较整个数组的相邻元素,虽然最终排序结果正确,但会产生大量无效比较,甚至在算法优化不足的情况下对已排序的元素重复交换,降低效率。【3】答案:`j+1`解析:冒泡排序的核心是比较相邻位置的元素,即j位置的元素和j+1位置的元素,如果前一个元素大于后一个元素则交换,实现大元素逐步向后移动的“冒泡”效果。此处如果误写为j-1,会出现数组下标越界的问题(j=0时j-1=-1,访问非法内存),导致程序运行崩溃。【4】答案:`return0`解析:main函数是C++程序的入口函数,返回值类型为int,程序正常执行结束后需要返回0值,表示程序运行状态正常,返回非0值通常对应程序运行出现异常的情况。程序填空5参考答案与解析【1】答案:`int&b`解析:swap函数的功能是交换两个实参变量的值,因此形参必须采用引用传递的方式。引用是变量的别名,对引用的操作会直接作用于原变量,如果形参不写&,采用值传递的方式,形参只是实参的副本,函数内对形参的修改不会影响实参的值,无法实现交换功能。两个形参的传递方式必须一致,因此第二个形参是int类型的引用b。【2】答案:`b=temp`解析:交换两个变量值的标准三步骤为:第一步将a的值存入临时变量temp保存;第二步将b的值赋值给a;第三步将temp中保存的原a值赋值给b。如果遗漏b=temp这一步,最终a和b的值都会变成原b的值,原a的值会丢失,无法完成交换。【3】答案:`n/2`解析:数组逆置的逻辑是将第i个元素和倒数第i个元素交换,交换只需要遍历数组前一半的元素即可,因此循环条件为i<n/2。如果循环条件写为i<n,那么前半段交换完成后,后半段会将已经交换过的元素再次交换回原位置,最终数组和逆置前完全一致,逻辑错误。例如长度为6的数组,i=3时会交换下标3和下标2的元素,正好把i=2时交换的元素换回原位。【4】答案:`arr[n-1-i]`解析:数组中与第i个位置对称的位置下标是n-1-i,例如长度为6的数组,下标0对应下标5,下标1对应下标4,下标2对应下标3,正好覆盖所有需要交换的元素对。调用swap函数交换这两个位置的元素,即可完成首尾逆置的操作。需要注意数组下标从0开始,最后一个元素的下标是n-1而非n,否则会出现数组下标越界的问题。程序填空6参考答案与解析【1】答案:`p++`(或`++p`、`p=p+1`)解析:题目要求所有元素访问必须通过指针实现,不能使用数组下标。指针p初始指向数组首元素(arr[0]),每次循环需要将指针向后移动一个int类型的存储单元,指向下一个数组元素。C++中指针的算术运算p++的含义不是将p存储的地址值加1,而是加上一个int类型的存储长度(通常为4字节),正好指向数组的下一个元素。如果直接写p+1而不赋值,指针的位置不会发生变化,会导致死循环或重复判断首元素的逻辑错误。【2】答案:`minVal=*p`解析:如果当前指针指向的元素值*p小于当前记录的最小值minVal,说明找到了更小的元素,需要将minVal更新为当前指针指向的元素值*p。此处必须对指针解引用(写*p),如果直接写p,会将指针存储的地址值赋值给minVal,出现类型不匹配和逻辑错误。【3】答案:`minVal`解析:遍历完所有数组元素后,minVal中存储的就是数组的最小值,直接输出minVal即可。本题中将maxVal和minVal初始化为首元素值是一种通用的写法,相比将maxVal初始化为0、minVal初始化为一个很大的数的写法,这种方法不受数组元素取值范围的限制,即使数组元素全为负数或者全为很大的正数,也能正确得到最大最小值。程序填空7参考答案与解析【1】答案:`struct`解析:C++中定义结构体类型必须以struct关键字开头,后面跟结构体类型名,大括号内是结构体的成员列表。和C语言不同的是,C++中结构体类型定义完成后,声明变量时可以直接使用结构体类型名,不需要在前面加struct,但定义类型本身时struct关键字不能省略。【2】答案:`stus[i].score[j]`解析:访问结构体数组中元素的成员时,首先通过数组下标i找到第i个学生的结构体元素,再通过成员访问运算符.访问该学生的score成员(成绩数组),最后通过下标j访问第j门课程的成绩。C++中结构体成员访问运算符.的优先级高于数组下标,因此书写时不需要额外加括号。【3】答案:`avg`解析:变量a

温馨提示

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

评论

0/150

提交评论