版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
國家二級C++機試(操作題)模擬試卷33(共9套)(共27題)國家二級C++機試(操作題)模擬試卷第1套一、基本操作題(本題共1題,每題1.0分,共1分。)1、使用VC6打開考生文件夾下的源程序文件modil.cpp,該程序運行時有錯誤,請改正程序中的錯誤,使得程序輸出:1,2,3,4,5,注意:不要改動main函數,不能增行或刪行,也不能更改程序的結構,錯誤的語句在//********error********的下面。#includeClassTeStClass{//********error********TestClass(inti){mi=i;}voidprint(){cout<<++mi<<‘,’;}public:intmi;},intmain(){∥********error********inti();TeStClassdata(0);while(i>5){//********error********i++;data.print();}cout<標準答案:(1)public:TestClass(inti)(2)inti(10);(3)i一一;知識點解析:程序要求輸出1,2,3,4,5,。主函數main()中有while循環(huán),調用類TestClass中的成員函數print()實現函數功能。二、簡單應用題(本題共1題,每題1.0分,共1分。)2、使用VC6打開考生文件夾下的源程序文件modi2.cpp。閱讀下列函數說明和代碼,補充空出的代碼。sum(intn1計算所有n的因子之和(不包括1和自身)。注意:不能修改程序的其他部分,只能補充sum()函數。{}includeintsum(intn){}voidmain(){cout<標準答案:intall=0;for(inti=2;i知識點解析:函數sum(intn)主要功能是實現計算所有n的因子之和(不包括1和自身),函數中定義變量all保存最終求和結果,可利用循環(huán)方式查找n的因子,根據題目要求循環(huán)變量從2開始至n—1。三、綜合應用題(本題共1題,每題1.0分,共1分。)3、使用VC6打開考生文件夾下的源程序文件modi3.cpp,其中定義了用于表示坐標的類TestClassl,但類TestClassl的定義并不完整,按要求完成下列操作,將類的定義補充完整。(1)聲明TestClass2類為TestClassl類的友元類,請在注釋∥********1********后添加適當的語句。(2)完成類的構造函數,分別對成員變量賦值,請在注釋∥********2********后添加適當的語句。(3)完成類的構造函數,分別對成員變量賦值,請在注釋∥********3********后添加適當的語句。(4)完成計算平面上兩點之間的距離函數Distance,計算的方法如下:X坐標之差的平方與Y坐標之差的平方之和的開方。請在注釋∥********4********后添加適當的語句。注意:僅在函數指定位置添加語句,請勿改動主函數main與其他函數中的任何內容。#include#includeusingnamespaceStd;classTeStClassl{∥********1********public:∥********2********{X=a;y=b;}∥********3********{X=a;Y=0;}voidprint(){cout<<“x=”<標準答案:(1)添加語句:friendclasSTestClass2;(2)添加語句:TestClassl(floata,floatb)(3)添加語句:TestClassl(floata)(4)添加語句:result=sqrt((p.X—q.X)*(p.X—q.X)+(p.Y—q.Y)*(p.Y—q.Y));知識點解析:在VC環(huán)境下打開程序,根據題干給出的幾條功能要求,對程序中給出注釋下的內容逐個補全或修改。從已給定源程序的main主函數開始入手,可以看出程序通過調用類TestClass實現各種輸出操作。國家二級C++機試(操作題)模擬試卷第2套一、基本操作題(本題共1題,每題1.0分,共1分。)1、使用VC6打開考生文件夾下的源程序文件modi1.cpp,但該程序運行時有錯,請改正程序中的錯誤,使程序輸出的結果為:Number=7Number=12注意:錯誤的語句在//******error******的下面,修改該語句即可。#includeclassCMyClass{public://********error********CMyClass(inti):Number=i{//********error********returnNumber;}voidSet(inti){Number=i;}voiddisplay(){cout<<"Number="<display();P->set(12);P->display();return;}標準答案:(1)CMyClass(inti):Number(i)(2)應刪除:returnNumber;(3)CMyClass*p=newCMyClass(7);知識點解析:(1)第1個標識下是聲明構造函數,并使用初始化列表完成成員變量的初始化,可知第1標識下的初始化列表錯誤,正確的應該是“CMyClass(inti):Number(i)”。(2)構造函數不能有返回值,不能用return來返回值,故第2個標識下應將“returnNumber;”刪除。(3)類實例在不指定構造函數的情況下,調用的是默認無參數的構造函數,此時成員變量Number是不確定的,在定義對象時應使用已定義的構造函數,,根據輸出結果可知P指向的對象的Number初始化值為7,故第3個標識下應改為“CMyClass*P=newCMyClass(7);”。二、簡單應用題(本題共1題,每題1.0分,共1分。)2、使用VC6打開考生文件夾下的源程序文件modi2.cpp。閱讀下列函數說明和代碼,完成空出部分程序。該程序從鍵盤讀入整數,并按從大到小的順序輸出輸入整數中互不相等的那些整數。程序一邊讀入整數,一邊構造一個以大到小順序鏈接的鏈表,直至輸入0時結束。然后順序輸出鏈表上各表元的整數值。主函數每讀入一個整數,就調用函數fun(),函數fun()將還未出現在鏈表上的整數按從大到小的順序插入到鏈表中。為了插入方便,鏈表在表首有一個輔助表元。注意:不能修改程序的其他部分,只能修改fun()函數。#includeClassNODE{public:intdata;NODE*next;};Voidfun(NODE*list,intx){}Voidmain(){intx;NODE*head,*p;/*首先建立只有輔助表元的空鏈表*/head=newNODE;head->next=NULL;std::cout<<"Enterintegers,endwith0"<>x;if(x==0)break;fun(head,x);}for(p=head->next;p!=NULL;p=p->next、std::cout<data<<’’;Std::cout<next;deletehead;head=p;}while(p);}標準答案:NODE*u,*v,*p;u=list;V=u->next;while(v!=NULL&&xdata)//尋找插入的位置{u=v;v=v->neXt;}if(v==NULL||x>v->data)//判斷是否為新的元素{p=newNODE;p->data=x;//生成新的元素p->next。V;u->next=p;//插入新的元素}知識點解析:(1)首先利用while循環(huán)尋找插入元素的位置。(2)然后判斷要插入的元素是否為新元素。(3)如果為新元素,那么執(zhí)行單鏈表的操作,插入元素。三、綜合應用題(本題共1題,每題1.0分,共1分。)3、使用VC6打開考生文件夾下的源程序文件modi3.cpp。其中定義的類并不完整,按要求完成下列操作,將類的定義補充完整。(1)完成類TestClass1的成員函數seta定義,定義seta對象x為int類型,請在注釋//********1********后添加適當的語句。(2)完成類TestClass1(共有)和類TestClass2(私有)派生類TestClass3的定義,請在注釋//********2********后添加適當的語句。(3)定義類TestClass3中的私有成員C為int,請在注釋//********3********添加適當的語句。(4)完成setc中對基類的變量a的賦值,請在注釋//********4********后添加適當的語句。注意:增加代碼,或者修改代碼的位置已經用符號表示出來。請不要修改其他的程序代碼。#includeClassTestClass1{inta;public://********1********{returna=x:}Voidshowa(){cout<標準答案:(1)添加語句:intseta(intx)(2)添加語句:classTestClass3:publicTestClass1,privateTestClass2(3)添加語句:intc;(4)添加語句:seta(x);知識點解析:(1)題目1要求“完成類TestClass1的成員函數seta定義,定義seta對象X為int類型”。類的成員函數是函數的一種,它與一般函數的區(qū)別只是,它是一個類的成員,出現在類體中。所以類TestClass1中的成員函數,就是在TestClass1中定義題目中要求的參數為imX的seta函數,即“intseta(intx)”。(2)題目2要求“完成類TestClass1(公有)和類TestClass2(私有)派生類TestClass3的定義”。從已有的類產生一個新的子類,稱為類的派生。聲明派生類的一般形式為:class派生類名:[繼承方式]基類名。根據聲明派生類的一般形式,這里補全“classTestClass3:publicTestClass1,privateTestClass2”。(3)題目3要求“定義類TestClass3中的私有成員C為int”。在類TestClass3中的private數據成員區(qū)域,定義intC,即在第3個標識下補全“intc:”。(4)題目4要求“完成setc中對基類的變量a的賦值”?;悶門estClass1,setc對于該類a的賦值,是intseta(intx)函數的賦值,即“seta(x);”。國家二級C++機試(操作題)模擬試卷第3套一、基本操作題(本題共1題,每題1.0分,共1分。)1、請打開考生文件夾下的解決方案文件proj1,其中在編輯窗口內顯示的主程序文件中定義有類AAA和主函數main。程序文本中位于每行“//ERROR****found****”下面的一行有錯誤,請加以改正。改正后程序的輸出結果應該是:sum=60注意:只修改每個“//ERROR****found****”下面的一行,不要改動程序中的其他任何內容。#include<iostream>usingnamespacestd;classAAA{inta[10];intn;//ERROR*******found*******private:AAA(intaa[],intnn):n(nn){//ERROR*******found*******for(inti=0;i<rl;i++)aa[i]=a[i];}intGeta(inti){returna[i]};};intmain(){inta[6]={2,5,8,10,15,20};AAAx(a,6);intsum=0;//ERROR*******found*******for(inti=0;i<6;i++)sum+=x.a[i];cout<<"sum="<<sum<<endl;return0;}標準答案:(1)public:(2)for(inti=0;i<n;i++)a[i]=aa[i];(3)for(inti=0;i<6;i++)sum+=x.Geta(i);知識點解析:(1)構造函數肯定是公有成員,所以應使用public。(2)主要考查考生對賦值語句的掌握,因為數組a是私有成員,因此a應該在左邊,而數組aa是形參,要賦值給數組a。(3)主要考查考生對成員函數調用的掌握,數組a是類的私有成員,因此不能被main函數直接調用,要通過成員函數Geta來調用數組a。二、簡單應用題(本題共1題,每題1.0分,共1分。)2、請打開考生文件夾下的解決方案文件proj2,此工程中包含一個頭文件shape.h,其中包含了類Shape、Point和Triangle的聲明;包含程序文件shape.cpp,其中包含了類Triangle的成員函數和其他函數的定義;還包含程序文件proj2.cpp,其中包含測試類Shape、Point和Triangle的程序語句。請在程序中的橫線處填寫適當的代碼并刪除橫線,以實現上述功能。此程序的正確輸出結果應為:此圖形是一個抽象圖形,周長=0,面積=0此圖形是一個三角形,周長=6.82843,面積=2注意:只能在橫線處填寫適當的代碼,不要改動程序中的其他內容,也不要刪除或移動“//****found****”。//shape.hclassShape{public:virtualdoubleperimeter()const{return0;}//返回形狀的周長virtualdoublearea()const{return0;}//返回形狀的面積virtualconstchar*name()const{return"抽象圖形";}//返回形狀的名稱};classPoint{//表示平面坐標系中的點的類doublex;doubley;public://*******found*******Point(doublex0,doub2ey0):_______{}//用x0、y0初始化數據成員x、ydoublegetX()const{returnx;}doublegetY()const{returny;}};classTriangle:publicShape{//*******found*******_______;//定義3個私有數據成員public:Triangle(Pointp1,Pointp2,Pointp3):point1(p1),point2(p2),point:3(p3){}doubleperimeter()const;doublearea()const;constchar*narne()const{return"三角形";}};//shape.cpp#include"shape.h"{}include<cmath>doublelength(Pointp1,Pointp2){returnsqrt((p1.getX()-p2.getX())*(p1.getX()-p2.getX())+(p1.getY()-p2.getY())*(p1.getY()-p2.getY()));}doubleTriangle::perimeter()const{//一個return語句,它利用length函數計算并返回三角形的周長//*******found*******_______;}doubleTriangle::area()const{doubles=perimeter()/2.0;returnsqrt(s*(s-length(point1,point2))*(s-length(point2,point3))*(s-length(point3,pointl)));}//proj2.cpp#include"shape.h"#include<iostream>usingnamespacestd;//*******found*******_______//show函數的函數頭(函數體以前的部分){cout<<"此圖形是一個"<<shape.name()<<",周長="<<shape.perimeter()<<",面積:"<<shape.area()<<endl;}intmsin(){Shapes;Triangletri(Point(0,2),Point(2,0),Point(0,0));show(s);Show(tri);return0;}標準答案:(1)x(x0),y(y0)(2)Pointpoint1,point2,point3(3)returnlength(point1,point2)+length(point1,point3)+length(point2,point3)(4)voidshow(Shape&shape)知識點解析:(1)主要考查考生對構造函數的掌握,題目要求用x0、y0初始化數據成員x、y,因此在這里使用成員列表初始化,即Point(doublex0,doubley0):X(x0),y(y0){}。(2)主要考查考生對構造函數的掌握,題目要求定義3個私有數據成員。由構造函數可知3個私有數據成員的類型都是Point,名稱分別為point1、point2和point3,因此空格處填寫:Pointpoint1,point2,point3。(3)主要考查考生對成員函數的掌握,題目要求使用return語句,利用length函數計算并返回三角形的周長。length函數返回的是兩點間的距離,因此return語句只要返回三角形三條邊的距離和,即為三角形的周長。(4)主要考查考生對成員函數的掌握,這里要定義show函數的函數頭(函數體以前的部分)。由主函數main中show函數的使用情況show(S)和show(tri)可知,S是Shape類,tri是Triangle類,因為Triangle是Shape類的派生類,所以可知show函數的參數是Shape類型,無返回值,得出語句voidshow(Shape&shape)。三、綜合應用題(本題共1題,每題1.0分,共1分。)3、請打開考生文件夾下的解決方案文件proj3,其中包含主程序文件main.cpp和用戶定義的頭文件Array.h,整個程序包含有類Array的定義和主函數main的定義。請把主程序文件中的Array類的成員函數Contrary()的定義補充完整,經補充后運行程序,得到的輸出結果應該是:585,4,3,2,10,0,8.4,5.6,4.5,3.4,2.3,1.2注意:只允許在“//********333********”和“//********666********”之間填寫內容,不允許修改其他任何地方的內容。//Array.h#include<iostream>usingnamespacestd;template<classType,intm>classArray{//數組類public:Array(Typeb[],intmm){//構造函數for(inti=0;i<m;i++)if(i<mm)a[i]=b[i];elsea[i]=0;}voidContrary();//交換數組a中前后位置對稱的元素的值intLength()const{returnm;}//返回數組長度Typeoperator[](inti)const{//下標運算符重載為成員函數if(i<0||i>=m){cout<<"下標越界!"<<endl;exit(1);}returna[i];}private:Typea[m];};voidwriteToFile(constchar*);//不用考慮此語句的作用//main.cpp#include"Array.h"//交換數組a中前后位置對稱的元素的值template<classType,intm>voidArray<Type,m>::Contrary(){//補充函數體//********333********//********666********}intmain(){ints1[5]={1,2,3,4,5};doubles2[6]={1.2,2.3,3.4,4.5,5.6,8.4};Array<int,5>d1(s1,5);Array<double,8>d2(s2,6);inti;d1.Contrary();d2.Contrary();cout<<d1.Length()<<’’<<d2.Length()<<endl;for(i=0;i<4;i++)cout<<d1[i]<<",";cout<<d1[4]<<endl;for(i=0;i<7;i++)cout<<d2[i]<<",";cout<<d2[7]<<endl;writeToFile("");//不用考慮此語句的作用return0;}標準答案:for(inti=0,j=m-1;i<j;i++,j--){//i從0開始自加,j從數組最一位開始自減,條件是i<j,開始遍歷數組aTypetemp=a[i];//把a[i]賦值給變量tempa[i]=a[j];//把a[j]賦值給[j]a[i]=temp;//把temp賦值給a[j],最終使a[i]與a[j]值的互換}知識點解析:主要考查考生對交換算法的掌握情況,根據題目對要完成的函數Contrary的要求:交換數組a中前后位置對稱的元素的值。這里取下標j=0,即為數組中的第一個元素,j=m-1,即為數組中的最后一個元素,利用中間值temp交換元素的值,然后i逐次遞增的同時j逐次遞減,再交換,循環(huán)到i>j時停止交換即可。國家二級C++機試(操作題)模擬試卷第4套一、基本操作題(本題共1題,每題1.0分,共1分。)1、使用VC6打開考生文件夾下的源程序文件modi1.cpp,請修改程序中的錯誤,使程序能得出正確的結果:num:0num:1num:10注意:不要改動main函數,不能增行或刪行,也不能更改程序的結構,錯誤的語句在//******error******的下面。#includeinti=10;ClassTestClass{public:TestClass(inti){cout<<"num:"<標準答案:(1)this->i=i+1;或TestClass::i=i+1:或(*this).i=i+1:(2)TestClassprint(0);(3)cout<<"num:"<<::i<知識點解析:(1)打開modi1.cpp,調試程序,顯示錯誤提示為第二標識下“modi1.cpp(22):errorC2512:TestClass’:noappropriatedefaultconstructoravailable”,主函數中首先調用的就是第2個標識下的TestClassprint函數,構造函數的名字和類的名字是一樣的,而程序中給出的“TestClassprint;”沒有給出參數,所以程序調試時無法確定調用的函數。根據TestClass構造函數“TestClass(inti)”的定義,應該存在int型參數,并且題目要求第一次輸出的值為“0”,所以第2個標識正確的調用函數為“TestClassprint(0);”。(2)運行,發(fā)現第一次的輸出正確,但是第二次的輸出值為“-858993460”,并不是題目中要求的“1”。在主函數中,可知第二次輸出調用的是“print.Print();”,即類TestClass的成員函數“Print()”。成員函數Print的定義“voidPrintoconst”中的輸出語句為“cout<<”num:”<i=i+l;”或“TestClass::i=i+1;”或“(*this).i=i+1;”。(3)主函數中通過“cout<<"num:"<二、簡單應用題(本題共1題,每題1.0分,共1分。)2、使用VC6打開考生文件夾下的源程序文件modi2.cpp。閱讀下列函數說明和代碼,完成空出部分程序,使函數fun()實現以下功能:找出一個整數,它加上100后是一個完全平方數,再加上268又是一個完全平方數,請問該數是多少?程序分析:在10萬以內判斷,先將該數加上100后再開方,再將該數加上268后開方,如果開方后的結果滿足條件,即是結果。#include#includeVoidfun(){}intmain(){fun();return0;}標準答案:longinti,x,y,z;for(i=1;i<100000;i++){x=Sqrt(i+100);//x為加上100后開方后的結果y=sqrt(i+268);//y為再加上268后開方的結果if(x*x==i+100&&y*y==i+268)//如果一個數的平方根的平方等于該數。說明此數是完全平方數cout<知識點解析:(1)利用循環(huán)找到滿足條件的整數。(2)首先計算X加上100和Y加上268的開方。(3)一個數的平方根的平方等于該數,說明此數是完全平方數。三、綜合應用題(本題共1題,每題1.0分,共1分。)3、使用VC6打開考生文件夾下的源程序文件modi3.cpp。其中定義的類并不完整,按要求完成下列操作,將類的定義補充完整。完成以下功能:(1)聲明類objA1,請在注釋//********1********后添加適當的語句。(2)為類objA0增加友元函數func(),請在注釋//********2********后添加適當的語句。(3)為類objA1增加友元函數func(),請在注釋//********3********后添加適當的語句。(4)函數func()返回objA1對象中的變量和objA0的靜態(tài)變量的乘積,請在注釋//********4********后添加適當的語句。注意:增加代碼,或者修改代碼的位置已經用符號表示出來。請不要修改其他的程序代碼。#include//********1********classobjA0{private:staticintmA0;//********2********};intobjA0..m_A0=10;classobjA1{private:intm_A1;//********3********public:objA1(inti){m_A1=i;}};intfunc(objA1&obj){//********4********}intmain(){objA1obj0(10);cout<標準答案:(1)添加語句:classobjA1;(2)添加語句:friendintfunc(objA1&obj);(3)添加語句:friendintfunc(objA1&obj);(4)添加語句:returnobj.m_A1*objA0::m_A0;知識點解析:(1)類的聲明格式為:“class<類名>;”,因此第1個標識下應添加“classobjA1;”。(2)按照友元的定義格式,友元函數是在類聲明中由關鍵字friend修飾的非成員函數,func函數在類外部給出了具體的實現形式,即“intfunc(objA1&obj)”,因此第2個標識下應添加“friendintfunc(objA1&obj);”,這里參數是0bjA1類對象obj。(3)第3個標識下和題目2要求一樣,均是聲明友元函數,因此第2標識下應添加“friendintfunc(objA1&obj);”。(4)通過參數obj對象可以直接訪問obj.mA1,objA0的靜態(tài)變量m_A0是所有對象的共享成員,其訪問形式為:objA0::mA0,因此第4個標識下應添加“returnobj.m_A1*objA0::m_A0;”。國家二級C++機試(操作題)模擬試卷第5套一、基本操作題(本題共1題,每題1.0分,共1分。)1、使用VC6打開考生文件夾下的源程序文件modil.cpp,但該程序運行時有錯,請改正程序中的錯誤,使程序輸出的結果為:Number=7Numbe=12注意:錯誤的語句在//********error********的下面,修改該語句即可。1#include2classCMyClass3{4public:5//******error******6CMyClass(inti):Number=i7{8//******error******9returnNumber;10}11voidset(inti)12{13Number=i;14}15voiddisplay()16{17cout<<"Number="<display();27P->set(12);28P->display();29return;30}標準答案:(1)CMyClass(inti):Number(i)(2)應刪除:returnNumber;(3)CMyClasS*P=newCMyClass(7);知識點解析:CMyClass類含有成員變量Number和多個成員函數,set(inti)函數可改變成員變量的值,display()~數在屏幕上打印成員變量的值。[解題思路](1)第1個標識下是聲明構造函數,并使用初始化列表完成成員變量的初始化,可知第1標識下的初始化列表錯誤,正確的應該是“CMyClass(inti):Number(i)”。(2)構造函數不能有返回值,不能用return來返回值,故第2個標識下應將“returnNumber;”刪除。(3)類實例在不指定構造函數的情況下,調用的是默認無參數的構造函數,此時成員變量Number是不確定的,在定義對象時應使用已定義的構造函數,,根據輸出結果可知P指向的對象的Number初始化值為7,故第3個標識下應改為“CMyClass*P=newCMyClass(7);”。二、簡單應用題(本題共1題,每題1.0分,共1分。)2、使用VC6打開考生文件夾下的源程序文件modi2.cpp。閱讀下列函數說明和代碼,補充空出的代碼。sum(intn)計算所有n的因子之和(不包括1和自身)。注意:不能修改程序的其他部分,只能補充sum()函數。1#include2intsum(intn)3{45}6voidmain()7{8cout<標準答案:1inta11=0;2for(inti=2;i知識點解析:函數sum(intn)主要功能是實現計算所有n的因子之和(不包括1和自身),函數中定義變量an保存最終求和結果,可利用循環(huán)方式查找n的因子,根據題目要求循環(huán)變量從2開始至n-1。[解題思路](1)數n的因子是指為整除n等于0的所有自然數的集合。(2)為了實現計算所有n的因子之和且不包含l和自身,函數中定義一個變量all用來保存求和結果,并為最終結果在函數結束時返回;(3)在循環(huán)中逐個尋找n的因子,為了在計算中排除掉1和n本身,因此循環(huán)變量i的變化范圍為從2到n-1。(4)如果n%i=0,說明i是n的因子,因此將i加到all上。三、綜合應用題(本題共1題,每題1.0分,共1分。)3、使用VC6打開考生文件夾下的源程序文件modi3.cpp。其中定義的類并不完整,按要求完成下列操作,將類的定義補充完整。完成以下功能:(1)聲明類objAl,請在注釋//********1********后添加適當的語句。(2)為類objA0增加友元函數func(),請在注釋//********2********后添加適當的語句。(3)為類objAl增加友元函數func(),請在注釋//********3********后添加適當的語句。(4)函數funcO返回objAl對象中的變量和0bjA0的靜態(tài)變量的乘積,請在注釋//********4********后添加適當的語句。注意:增加代碼,或者修改代碼的位置已經用符號表示出來。請不要修改其他的程序代碼。1#include2//********1********34classobjA05{6private:7staticintm_A0;8//********2********910};11intobjA0::m_A0=10;12classobjAl13{14private:15intm_A1;16//********3********1718public:19objA1(inti)20{21m_A1=i;22}23};24intfunc(objAl&obj)25{26//********4********2728}29intmein()30{31objA1obj0(10);32COUt<標準答案:(1)添加語句:C1assobjA1;(2)添加語句:friendintfunc(objA1&obj);(3)添加語句:friendintfunc(objAl&obj);(4)添加語句:returnobj.mA1*objA0::mA0;知識點解析:友元提供了不同類或對象的成員函數之間、類的成員函數與一般函數之間進行數據共享的機制,友元不是本類的成員函數,在它的函數體內部可以通過對象名來訪問類的私有成員和保護成員。友元函數是在類聲明中由關鍵字friend修飾的非成員函數。func()函數為類0bjAl的友元,因此可以通過對象名直接訪問到objAl的私有成員變量。[解題思路](1)類的聲明格式為:“class<類名>:”,因此第1個標識下應添加“classobiAl;”。(2)按照友元的定義格式,友元函數是在類聲明中由關鍵字friend修飾的非成員函數,func函數在類外部給出了具體的實現形式,即“intfunc(objAl&obj)”,因此第2個標識下應添加“friendintfunc(objAl&obj);”,這里參數是objAl類對象obi。(3)第3個標識下和題目2要求一樣,均是聲明友元函數,因此第2標識下應添加“friendintfunc(0bjAl&obj);”。(4)通過參數Obj對象可以直接訪問obj.mA1,objA0的靜態(tài)變量mA0是所有對象的共享成員,其訪問形式為:objA0::mA0,因此第4個標識下應添加“retumobj.mAl*objA0::m_A0;”。國家二級C++機試(操作題)模擬試卷第6套一、基本操作題(本題共1題,每題1.0分,共1分。)1、請使用VC6或使用【答題】菜單打開考生文件夾projl下的工程proj1,此工程中含有一個源程序文件projl.epp。其中位于每個注釋“//ERROR****found****”之后的一行語句存在錯誤。請改正這些錯誤,使程序的輸出結果為:Thisobjectisno.1注意:只修改注釋“//ERROR****found****”的下一行語句,不要改動程序中的其他內容。/Jprojl.cpp#includeusingnamespacestd;classNyClass{public:NyClass():count(0){tout<<“Thisobjectis”;}//ERROR*********found*********voidInc()const{tout<<“no.”<<++count<標準答案:(1)voidInc()(2)intcount;(3)0bj一>Inc();知識點解析:主要考查的是MyClass類,其中涉及構造函數、成員函數、私有成員及類的指針。const用于限定變量的值不發(fā)生改變,const函數的定義要謹慎,確保函數體內沒有成員值的改變。私有成員只能聲明不能初始化,只有通過構造函數或者成員函數來初始化?!窘忸}思路】(1)考查考生對const的掌握,在Inc函數的函數體{cout<<”n0.”<<++count<”,而不能使用“.”?!窘忸}寶典】主要考查考生對const語法、私有成員及類的指針的理解。私有成員在類中只能聲明不能初始化,這是最基礎的知識,只要認真看程序一般沒問題。判斷一個函數是否為eonst函數關鍵看函數體內是否有成員值發(fā)生改變,如果發(fā)生改變,則不能用corot修飾。二、簡單應用題(本題共1題,每題1.0分,共1分。)2、請使用VC6或使用【答題】菜單打開考生文件夾proj2下的工程proj2,此工程中含有一個源程序文件proj2.epp。函數char*GetNum(char’lc8rc,char*buf)從src開始掃描下一個數字字符序列,并將其作為一個字符串取出放人字符串空間buf中。函數返回掃描的終止位置,如果返回NULL表示沒有掃描到數字字符序列。運行程序時,如果輸入的一行字符序列是ABC012XYZ378MN274WS則輸出為:Diotstring1is012Digitstung2is378DiotstriIlg3is274注意:只在橫線處編寫適當代碼,不要刪除或移動“//****found****”。//proj2.cpp#includeusingnamespacestd;char*GetNum(char*src,char*bur){while(*SrC!=‘\0’){if(isdigit(*SrC))break;SrC++;}if(*SrC=‘\0’)//*********found*********_________;while(*src!=‘\0’&&isdigit(*SEC)){//*********found*********_____;:bur++;SrC++;}*bur=‘\0’;returnSrC;}intmain(){charstr[100],digits[20];cin.getline(str,100);char*p=str;inti=1;while((p=GetNurn(p,digits))!=NULL){cout<<“Digitstring”<標準答案:(1)returnNULL(2)*buf=*src(3)i++知識點解析:主要考查的是GetNum函數、while循環(huán)語句、if語句和字符數組。從該函數的聲明中,可以得到如下信息:該函數的返回值為字符指針,形參為兩個字符指針SYC和bufo該函數的功能是,函數從sre開始掃描下一個數字字符序列,并將其作為一個字符串取出放入字符串空間buf中?!窘忸}思路】(1)主要考查考生對if語句的掌握,由判斷條件if(*src==‘\0’),說明字符串SIC為空,則返回NULL即可。(2)主要考查考生對while循環(huán)語句的掌握,while語句的循環(huán)條件為/src!=’\0’&&isdigit(*src),該條件是指,若字符串sic不為空并且*src指向的字符為數字字符,則進行循環(huán)。題目要求把數字字符放人字符串buf中,因此為*buf=*src。(3)主要考查考生對while循環(huán)語句的掌握,從上一行語句cout<<“Digitstring”<三、綜合應用題(本題共1題,每題1.0分,共1分。)3、請使用VC6或使用【答題】菜單打開考生目錄proj3下的工程文件pmj3,該文件中定義了用于表示日期的類Date、表示人員的類Person和表示職員的類Staff;程序應當顯示:張小麗123456789012345但程序中有缺失部分,請按以下提示把缺失部分補充完整:(1)在“//**1******found****”的下方是析構函數定義中的語句,它釋放兩個指針成員所指向的動態(tài)空間。(2)在“//**2******found****”的下方是rename函數中的一個語句,它使指針name指向申請到的足夠容納字符串new_name的空間。(3)在“**3******found****”的下方是構造函數定義的一個組成部分,其作用是利用參數表中前幾個參數對基類Person進行初始化。注意:只在指定位置編寫適當代碼,不要改動程序中的其他內容,也不要刪除或移動“****found****”。填寫的內容必須在一行中完成,否則評分將產生錯誤。//proj3.cpp#includeusingnamespacestd;ClassPerson{char*idcardno;//用動態(tài)空間存儲的身份證號char*name;//用動態(tài)空間存儲的姓名boolismale;//性別:true為男.false為女public:Person(constchar*pid,constchar*pname,boolpmale);一Person(){//**1***********found*********——;:}constchar*getIDCardNO()const{returnidcardno;)constchar*getName()const{returnname;)voidrename(constchar*newname);boolisMale()const{returnismale;)};classStaff:publicPerson{char*department;doublesalary;public:Staff(constchar*idcardno,constchar*P—name,boolis—male,constchar*dept,doublesal);一Staff(){delete[]department;}constchar*getDepartment()const{returndepartment;)voidsetDepartment(constchar*d);doublegetSalary()const{returnsalary;}voidsetSalary(doubleS){salary=S;}};Person::Person(constchar*idcardno,constchar*P—name,boolismale):ismale(iSmale){idcardno=newchar[strlen(idcardno)+1];strcpy(idcardno,id—card—no);name=newchar[strlen(p_name)+1];strcpy(name,p_name);}voidPerson::rename(constchar‘new_name){delete[]name;//**2************found**********_________;;strcpy(name,newname);}Staff::Staff(constchar*idcardno,constchar*P—name,boolis—male,//**3*************found*************constchar*dept,doublesal):________{department=newchar[strlen(dept)+1];strcpy(department,dept);salary=sal;}voidStaff::setDepartment(constchar*dept){delete[]department;department=newchar[strlen(dept)+1];strcpy(department,dept);}intmain(){StaffZhangsan(“123456789012345”,“張三”,false,“人事部”,1234.56);Zhangsan.rename(”張小麗”);cout<標準答案:(1)delete[].idcardno,nallle(2)name=newchar[strlen(new—name)+1](3)Person(i(1_card_no,p—name,is—male)知識點解析:主要考查的是Person類及其派生類Staff,其中涉及構造函數、析構函數、動態(tài)數組及派生類的構造函數?!窘忸}思路】(1)主要考查考生對析構函數的掌握,題目要求釋放兩個指針成員所指向的動態(tài)空間。釋放動態(tài)空間應使用delete語句,因為要釋放兩個指針,使用語句:delete[]idcardno,name;實現。注意當釋放多個指針時,中間用逗號隔開。(2)考查動態(tài)數組分配空間,題目要求指針name指向申請到的足夠容納字符串new—name的空間。使用strlen(new—name)得到字符串new—name的長度,但是這里要注意加1。(3)主要考查考生對派生類構造函數的掌握,題目要求利用參數表中前幾個參數對基類Person進行初始化。派生類的構造函數要使用成員列表初始化法對基類初始化,因此為constchar木dept,doublesal):Person(id—card—n0,p—name,is—male)。【解題寶典】使用new語句為字符串分配空間時,應注意分配的空間大小為字符串長度+1。國家二級C++機試(操作題)模擬試卷第7套一、基本操作題(本題共1題,每題1.0分,共1分。)1、使用VC6打開考生文件夾下的源程序文件modil.cpp,但該程序運行時有錯,請改正程序中的錯誤,使該程序的輸出結果為:20,1515.20注意:錯誤的語句在∥********error********的下面,修改該語句即可。#include∥********error********voidExchangel(intm,intn){intt=m;m=n;n=t;}∥********error********voidExchange2(intm,intn){intt=*m:*m=*n;*n=t:}voidmsin(){intb=20;inta=15;Exchangel(a,b);cout<標準答案:(1)voidExchangel(int&m,int&n)(2)voidExchange2(int*m,int*n)(3)Exchange2(&a,&b);知識點解析:程序中定義了兩個交換函數,分別采用傳地址和傳引用的方式來實現交換。(1)由程序的運行結果可知,分別調用Exchangel()和Exchange20后,a和b的值兩次發(fā)生交換,因此Exchangel()函數和Exchange20函數均為實現交換的函數。參數傳遞方式有多種,將變量名作為實參和形參、傳遞變量的指針和傳送引用方式,將變量名作為實參和形參方式,這種傳遞是單向的,在函數執(zhí)行過程中形參的值發(fā)生變化不會傳回實參,而指針和引用方式在函數執(zhí)行過程中形參會影響實參。顯然這里不是采用變量名作為實參和形參的單向傳遞方式,而是采用的傳地址或傳引用的方式,在Exchange10體內沒有出現指針運算符“*”,因此可知Exchange10函數是采用的傳引用的方式,因此第1個標識下應改為“voidExchangel(int&m,int&n)990(2)由1分析可知,Exchange20~數內有指針運算符“*”,可知其是采用的傳指針的方式作為參數傳遞,因此第2個標識下應改為“voidExchange2(int*m,int*n)99。(3)Exchange20參數為int型數據指針,因此調用Exchange20時應傳入指針而不是變量名,故第3個標識下應改為“Exchange2(&a,&b);”。二、簡單應用題(本題共1題,每題1.0分,共1分。)2、使用VC6打開考生文件夾下的源程序文件modi2.cpp。閱讀下列函數說明和代碼,補充空出的代碼。函數convert(cha*des,char*str)實現的功能是:(1)如果字符串最后面有空格,則全部刪除:(2)轉換后的數據放到des,并且指針作為返回值返回。注意:不能修改程序的其他部分,只能補充convert()函數。#include#include#defineMAXLEN1024char*convert(char*des,char*str){}voidmain(){chardeSt[MAXLEN];char*string=“abcdef”;cout<<String<<“<一一”<標準答案:Intlength=0;inti;for(1ength=0;Str[1ength]!=NULL;length++);//求數組長度length一一;//下標從0~len一1,下標減1表示最后一個字符的下標值for(i=length;i>=0;i一一){if(str[i]!=‘’)//判斷結尾是否有空格,從后往前判斷直到不是不是空格了跳出循環(huán)break;}for(length=0;length<=i;length++){des[length]=Str[length];//從前面開始,逐個將str中的字符拷貝到des數組中,不含最后面的空格}des[1ength]=NULL;//最后一個字符為NULLreturndes;知識點解析:函數convert(cha*des,char*str)實現的功能是將字符串最后面有空格刪除,并將轉換后的數據放到des,返回指針,可以將字符串最后空格前的所有所有字符拷貝到des中,關鍵是確定下標從那開始到最后都是空格。三、綜合應用題(本題共1題,每題1.0分,共1分。)3、使用VC6打開考生文件夾下的源程序文件modi3.cpp。其中定義的類并不完整,按要求完成下列操作,將類的定義補充完整。(1)定義類的公有數據成員函數No、Name[32],其中No是int型的數據,Name[32]為字符型。請在注釋∥********1********后添加適當的語句。(2)完成函數set的定義,分別設置NO和Name的值,請在注釋∥********2********后添加適當的語句。(3)完成函數print(),請在注釋∥********3********后添加適當的語句,打印的輸出如下:No=111Name=Garfield(4)加缺省構造函數,設置No為0,Name為空,請在注釋∥********4********后添加適當的語句。注意:增加代碼,或者修改代碼的位置已經用符號表示出來。請不要修改其他的程序代碼。#includeClassTestClass{public:∥********1********∥********2********{No=no;for(inti=0;strName[i]!:0;i++){Name[i]=strName[i];Name[i+1]=0;}}voidprint(){∥********3********}TeStClass(){∥********4********}},intmain(){TestClasSStu;stu.Set(111,“Garfield”);stu.print();return0;}標準答案:(1)添加語句:intNo;charName[32];(2)添加語句:voidSet(intno,char*StrName)(3)添加語句:cout<<“No=”<知識點解析:本題程序的功能是利用成員函數set設置類成員數據數值,并利用成員函數print輸出成員數值。在VC環(huán)境下打開程序,根據題干給出的幾條功能要求,對程序中給出注釋下的內容逐個補全或修改。從已定源程序的main主函數開始入手,可以看出程序通過調用類TestClass和其構造函數實現各種輸出操作。國家二級C++機試(操作題)模擬試卷第8套一、基本操作題(本題共1題,每題1.0分,共1分。)1、請使用”答題”菜單或使用VC6打開考生文件夾pmjI下的工程pmjl,程序中位于每個//ERROR**********found**********水下的語句行有錯誤,請加以更正,不得修改程序的其他部分。更正后程序的輸出應該是:ATme注意:只能修改每個//ERROR**********found**********下的那一行,不要改動程序中的其他內容。#includeusingnamespacestd;classChoice{private:constcharanswer,public://ERROR**********found**********Choice(charC){answer=C;)一Choice(){)voidcheck(charx){cout<check(’A’);deleteC;return0;}標準答案:(1)Choice(charc):answer(c){}(2)if(answer=:x)(3)Choice*c=newChoice(’A’);知識點解析:主要考查類中const成員變量的初始化,容易出錯的是=與==運算符,以及指針的使用?!窘忸}思路】(1)C++約定:初始化eonst對象或引用類型的對象,但不能對他們賦值。在開始執(zhí)行構造函數的函數體之前,必須完成初始化。初始化const或引用類型數據成員的唯一機會是在構造函數初始化列表中。(2)判斷相等使用==運算符,不是賦值號“=”。(3)new操作符返回的是一個指針,因此使用指針變量來接收。二、簡單應用題(本題共1題,每題1.0分,共1分。)2、請使用”答題”菜單或使用VC6打開考生文件夾proj2下的工程proj2,本程序中有兩個類:一是日期類(Date),用于表示一天的日期(年、月、日);另一個是截止日期類(Dead.1ine),用于表示一個任務的截止日期,超過該日期即為超時。Deadline類中有Date類的數據成員。這里對Deadline類的數據成員和成員函數做一下說明:intid;//截止日期的idDateend—date;//截止日期,表示允許完成該任務的最后一天voidfinish(Datedate);//date未超過截止日期時,輸出”Finished!”,否則輸出”Timeout.”boolcheck(Datedate);//date未超過截止日期時返回true,否則返回false。程序正確情況下輸出:Finished!Timeout.注意:只能在橫線處填寫適當的代碼,不要改動程序中的其他內容,也不能刪除或移動“//**********found**********”。#includeusingnamespacestd;classDate(private:intyear;intmonth;intday.ofmonth;public:Date(intY,intm,intd){this一>year=Y;.this一>month:m;this一>dayOfmonth=d;}booloperator<=(Date&dt)const{if(this一>yearyear==dt.year&&this一>monthyear==dt.year&&this一>month==dt.month&&this一>day—of—month<=dt.day_of_month))//**********found**********};returnfalse;}};classDeadline{private:intid;Dateenddate;public:Deadline(intid,intyear,intmonth,intday_of_month)//**********found**********{this一>id=id;}voidfinish(Datedate){if(check(date))//**********found**********cout<<<finish(currenttime);d2一>finish(currenttime);deleted1,deleted2;return0;}標準答案:(1)returntrue(2):end—date(year,month,day-0f_month)(3)”Finshed”(4)(end—date<=date)?false:true知識點解析:主要考查類構造函數定義,初始化列表;條件運算符的使用?!窘忸}思路】(1)根據題設可知比較兩個日期的大小,由if語言的判斷,可知this的日期大于date,返回真。(2)構造函數的初始化列表,使用基類的構造函數完成子類成員的初始化。(3)根據題意可知,沒有超過deadline,故輸出“Finshed”。(4)檢查當前日期是否超過截止時間。超過deadline,返回false,否則返回true。三、綜合應用題(本題共1題,每題1.0分,共1分。)3、請使用“答題”菜單或使用VC6打開考生文件夾proj3下的工程proj3,其中定義了BaseX類(X進制整數類),其中成員函數print輸出該整數指定數制的表示形式。使用展轉相除法,可從低位到高位逐位求出所需要的表示形式,例如,求十制數231的四進制表示形式,方法如下:231/4=57……357/4=14……114/4=3……2結果是:3213在main函數中給出了一組測試數據,正確的輸出是:2001注意:只需在//**********333**********和//**********666**********,之間填入所編寫的若干語句,不要改動程序中的其他內容。#include#include#include”BaseX.h”usingnamespacestd;BaseX::BaseX(intn)(thiS一>num=n;}BaseX::一BaseX(){)voidBaseX::print(intx){//輸出整數num的X進制表示形式intarr[100];//存放轉換結果,arr[0]存放最低位intindex=0;//當前數組arr中元素的個數//**********333**********//**********666**********for(inti=、index一1;i>=0;i—一){//從高位到低位輸出所需表示形式cout<標準答案:while(aura){art[index++]=num%x;Bum/=x;}知識點解析:主要考查將一個數轉化為x進制,使用輾轉相除法來處理?!窘忸}思路】將一個數轉化為x進制,使用輾轉相除法,將余數放在arr[]數組中,對商繼續(xù)使用輾轉相除法來處理,直到商為0。最后反向輸出數組中的值,即為x進制的數。國家二級C++機試(操作題)模擬試卷第9套一、基本操作題(本題共1題,每題1.0分,共1分。)1、請打開考生文件夾下的解決方案文件proj1,此工程包含一個源程序文件proj1.cpp。文件中將表示數組元素個數的常量Size定義為4,并用int類型對類模板進行了實例化。文件中位于每個注釋“//ERROR****found****”之后的一行語句存在錯誤。請改正這些錯誤,使程序的輸出結果為:1234注意:模板參數名用T。只修改注釋“//ERROR********found********”的下一行語句,不要改動程序中的其他內容。//proj1.cpp#include<iostream>usingnamespacestd;//將數組元素個數size定義為4//ERROR********found********constintsize;template<typenameT>classMyClasS{public:MyClass(T*p){for(inti=0;i<Size;i++)arrays[i]=p[j];}voidPrint();private:Tarray[size];};template<typenameT>//ERROR*******found*******voidMyClass::Print(){for(inti=0;i<size;i++)cout<<array[i]<<’\t’;}intmain(){intintArray[Size]={1,2,3,4};//ERROR*******found*******MyClass<double>obj(intArray);obj.Print();cout<<endl;return0;}標準答案:(1)constintSize=4;(2)voidMyClass<T>::Print()(3)MyClass<inl>obj(intArray);知識點解析:(1)主要考查考生對eonst變量的掌握,因為const變量不能修改,所以在定義的同時必須仞始化。(2)主要考查考生對模板類的成員函數定義的掌握,因為MyClass類是模板類,所以在定義該函數時要加上模板標識符“<T>”,即語句voidMyClass<T>::Print()。(3)主要考查考生對模板類構造函數的調用的理解,從上一條語句intintArray[Size]={1,2,3,4};中可以知道intArray為int型,因此定義obj時要使用<int>,即MyClass<int>obj(intArrav);。二、簡單應用題(本題共1題,每題1.0分,共1分。)2、請打開考生文件夾下的解決方案文件proj2,該工程中包含一個程序文件main.cpp,其中有日期類Date、人員類Person及排序函數sortByName和主函數main的定義。請在程序中的橫線處填寫適當的代碼并刪除橫線,以實現上述類定義和函數定義。此程序的正確輸出結果應為:按姓名排序排序前張三男出生日期:1978年4月20日王五女出生日期:1965年8月3日楊六女出生日期:1965年9月5日李四男出生日期:1973年5月30日排序后:李四男出生日期:1973年5月30日王五女出生日期:1965年8月3日楊六女出生日期:1965年9月5日張三男出生日期:1978年4月20日注意:只能在橫線處填寫適當的代碼,不要改動程序中的其他內容,也不要刪除或移動“//****found****”。#include<iostream>usingnamespacestd;classDate{//日期類intyear,month,day;//年、月、日
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 智慧餐廳推廣方案
- 智慧養(yǎng)老系統(tǒng)解決方案
- 2023年電子銀漿資金籌措計劃書
- 卡通襪子課件教學課件
- 武術課件制作教學課件
- 印染剪紙課件教學課件
- 誠子書課件教學課件
- 4.1 原電池 第2課時 課件高二上學期化學人教版(2019)選擇性必修1
- 酒店用品解決方案
- 不負人民課件教學課件
- ??谑邪踩a事故應急救援預案(中安科修編稿)
- 淺談鋼-混凝土疊合板組合梁
- 23001料倉制作安裝施工工藝標準修改稿
- 學習的最高境界叫巔峰學習狀態(tài)
- 3211 城市公交企業(yè)安全風險分級管控指南
- 行政管理 外文翻譯 外文文獻 英文文獻 全球媒體和政治:跨國溝通制度和公民文化
- 北京市房屋建筑和市政基礎設施工程危險性較大的分部分項工程安全管理實施細則
- 議論文段落寫作——茹清平
- (完整版)駕駛員違章違規(guī)處罰辦法
- “六項機制”工作實施方案
- 精神病問診過程示例
評論
0/150
提交評論