您好,欢迎访问三七文档
当前位置:首页 > 高等教育 > 习题/试题 > 2-C++期末考试试题及答案
2002年春季软件学院C++期末考试试题及答案考试时间:120分钟1.(10)分现有两种实体:“矩形”(Rectangle)和“旗杆”(Flagpole)。其中,“矩形”的属性为长度与宽度,“旗杆”的属性为高度(指地面以上)和深度(指地面以下),且均为整数。若有:structRectangle{intlength,width;};structFlagpole{intheight,depth;};intrectangleArea(intx,inty){return(x=0&&y=0)?x*y:0;}//计算矩形的面积intflagpoleLength(intx,inty){return(x=0&&y=0)?x+y:0;}//计算旗杆的高度voidf(){structRectanglerect;structFlagpoleflgp;rect.length=20;rect.width=5;flgp.height=20;flgp.depth=5;intarea=rectangleArea(rect.length,rect.width);intlength=flagpoleLength(flgp.height,flgp.depth);}试续写函数f,以各举一例说明,对函数rectangleArea和flagpoleLength的调用都可能出现语法上合法,但结果与函数的语义不一致的情况,并指出其原因。答案:续写的二句如下:area=rectangleArea(flgp.height,flgp.depth);length=flagpoleLength(rect.length,rect.width);原因:在函数调用时,只需实参和形参类型相容即可,而不管语义如何?如上例二句语法上是合法的,但结果与函数的语义不一致。若欲使该情况不发生,必须将数据及其上的操作绑定在一起,这必须用类来定义。2.(15分)阅读下面的程序,写出main的输出。#includestdio.hintf(inti,constint*j,int&k){if(i%3==0)if(*j=6)k*=i;k+=i;k-=i;return*j+k;}intmain(){inti,j=1,k=2,m;for(i=0;i10;i++,j*=2){真的不掉线吗??、????????????m=f(i,&j,k);printf(i=%2d,j=%2d,k=%2d,m=%2d.\n,i,j,k,m);}return0;}答案:i=0,j=1,k=2,m=3.i=1,j=2,k=2,m=4.i=2,j=4,k=2,m=6.i=3,j=8,k=6,m=14.i=4,j=16,k=6,m=22.i=5,j=32,k=6,m=38.i=6,j=64,k=36,m=100.i=7,j=128,k=36,m=164.i=8,j=256,k=36,m=292.i=9,j=512,k=324,m=836.3.(15分)根据main程序的输出结果,定义并实现max函数。intmain(){cout“max=”max(1.0,67.3)endl;//max=67.3cout“max=”max(102,90)endl;//max=102cout“max=”max(‘a’,‘z’)endl;//max=zcout“max=”max(“abc”,“bd”)endl;//max=bdcout“max=”max(50,82.3)endl;//max=82.3cout“max=”max(1.0,21.5,87.4)endl;//max=87.4cout“max=”max(“gh”,“tye”,“zs”)endl;//max=zscout“max=”max(23,7,62)endl;//max=62return0;}(假定所有的赋值、比较运算符都已定义)答案:templateclassTTmax(Tx,Ty){returnx=y?x:y;}templateclassTTmax(Tx,Ty,Tz){Ttemp;temp=max(x,y);returntemp=z?temp:z;}floatmax(intx,floaty){returnx=y?x:y;}4.(20分)真的不掉线吗??、????????????定义堆栈类模板Stack,栈的大小由使用者确定。要求该类模板对外提供如下二种基本操作:(1)push(2)pop(假定赋值操作已定义)答案:#includeiostream.htemplateclassT,intsizeclassStack{Ts[size];intiCurrentElem;public:Stack();boolpush(Tx);Tpop();voidprint(){for(inti=0;isize;i++)couts[i]endl;}};templateclassT,intsizeStackT,size::Stack(){for(inti=0;isize;i++)s[i]=0;iCurrentElem=-1;}templateclassT,intsizeboolStackT,size::push(Tx){if(iCurrentElem==(size-1)){coutIt'sfull.endl;returnfalse;}else{s[++iCurrentElem]=x;returntrue;}}templateclassT,intsizeTStackT,size::pop(){Ttemp;if(iCurrentElem==-1){coutIt'sempty.endl;return-1;}else{temp=s[iCurrentElem];s[iCurrentElem]=0;iCurrentElem--;returntemp;}}voidmain(){floatt;Stackfloat,3s1;s1.push(10);s1.push(20);s1.push(30);s1.push(40);s1.print();t=s1.pop();s1.print();couttendl;}5.(2真的不掉线吗??、????????????5分)用C++语言定义MyString(包括成员函数的实现代码),使之能符合下面程序及在注释中描述的运行结果的要求:main(){MyStrings1=0123456789,s2(5),s3,s4(s1);s1.display();//此时显示出:0123456789s2.display();//此时显示出(之间是五个空格):s3.display();//此时显示出:s4.display();//此时显示出:0123456789s3=s1;s3.display();//此时显示出:0123456789s3=3+s3;s3.display();//此时显示出:0123456789999s2=s1[2];s2.display();//此时显示出:23456789s1.display();//此时显示出:0123456789s3=s2++;s2.display();//此时显示出:3456789s3.display();//此时显示出:23456789}答案:#includeiostream.h#includestring.h#includestdio.hclassMyString{charcpBody[81];public:MyString(constchar*p=NULL);MyString(inti);MyString(MyString&s);MyString&operator=(constMyString&s){strncpy(cpBody,s.cpBody,80);return*this;}MyString&operator[](inti);MyString&operator++(inti){staticMyStrings;s=*this;*this=(cpBody[0]=='\0')?*this:(*this)[1];returns;}voiddisplay(){printf(%s\n,cpBody);}friendMyString&operator+(inti,MyString&s);};MyString::MyString(constchar*p){if(p==NULL)cpBody[0]='\0';elsestrncpy(cpBody,p,80);真的不掉线吗??、????????????}MyString::MyString(inti){intj;for(j=0;ji&&j80;j++)cpBody[j]='';cpBody[j]='\0';}MyString::MyString(MyString&s){*this=s;/*或者改用如下语句:intlength;length=strlen(s.cpBody);for(inti=0;ilength+1;i++)cpBody[i]=s.cpBody[i];*/}MyString&MyString::operator[](inti){staticMyStrings;intj;s=*this;for(j=i;cpBody[j]!='\0';j++)s.cpBody[j-i]=s.cpBody[j];s.cpBody[j-i]='\0';returns;}MyString&operator+(intN,MyString&s){staticMyStringst;inti,length;length=strlen(s.cpBody);for(i=0;iN;i++)s.cpBody[length+i]=s.cpBody[length-1];s.cpBody[length+i]='\0';st=s;returnst;}6.(15分)某公司有二类职员Employee和Manager,Manager亦属于Employee。每个Employee对象所具有的基本信息为:姓名、年令、工作年限、部门号,Manager对象除具有上述基本信息外,还有级别(level)信息。公司中的二类职员都具有二种基本操作:1).printOn()//输出个人信息2).retire()//判断是否到了退休年令,是,则从公司中除名。公司规定://Employee类的退休年令为55岁,Manager类的退休年令为60岁。要求:1).定义并实现类Employee和Manager;2).分别输出公司中二类职员的人数(注意:Manager亦属于Employee)。答案:#includeiostream.h#includestring.h真的不掉线吗??、????????????classEmployee{charname[21];intworkYear;intdepartmentNum;protected:staticintENumber;intage;public:Employee(char*s,intage1,intworkYear1,intdepN){if(strlen(s)=20&&*s!='\0')strcpy(name,s);if(age1=18&&workYear1=0&&depN0){age=age1;workYear=workYear1;departmentNum=depN;Employee::ENumber++;}}virtualvoidprintOn(){coutnameageworkYeardepartmentNumendl;}virtualvoidretire(Employee&e){if(e.age=55){deletethis;Emplo
本文标题:2-C++期末考试试题及答案
链接地址:https://www.777doc.com/doc-5319457 .html