1、东 南 大 学 考 试 卷(C卷)学号 姓名 密封线课程名称程序设计及算法语言考试学期07-08-2得分适用专业吴健雄学院考试形式闭卷考试时间长度120分钟卷面总分60,另有上机编程30分,平时成绩10分一、简答题(共3分)自 觉 遵 守 考 场 纪 律 如 考 试 作 弊 此 答 卷 无 效下列各段程序都存在错误,请说明错误所在及理由(1)类说明(1分)class Circleregister int atom_x,atom_y;auto int radius;public:Circle(int x=0,int y=0,int radius=3); Circle();答: (2) 类说明(1
2、分)class Figurepublic:Figure(); Figure(bool have_drawn);virtual int darw()=0;答: (3)使用一个函数来交换两个数据(1分)void swap(double d1,double d2)double temp ;temp=d1 ; d1=d2 ; d2=temp ;int main(void)double x , y ;cout请输入x和y的值xy ;swap(x,y) ;coutx=xty=yn;return 0;答: 二、程序阅读与修改题(第1题3分,其他每题5分,共18分)1下例演示C+的异常处理功能。请给出程序输出
3、结果。class ZeroExcepstring message;public:ZeroExcep():message(被0除异常)string what()return message;double divide(double num1,double num2)if(num2=0) throw ZeroExcep();return num1/num2;int main()trycout5.0/2.0=divide(5.0,2.0)endl;cout7.0/0.0=divide(7.0,0.0)endl;cout9.0/2.0=divide(9.0,2.0)endl;1catch(ZeroEx
4、cep ze)coutze.what()endl;return 0;2写出下面的程序的输出,删去Person类show()前的virtual,输出又是如何?class Personprotected:string name;public:Person(string Name=#)name=Name;virtual void show()cout我的名字是:nameendl;class student:public Personstring No;public:student(string Name=#,string num=0):Person(Name)No=num;void show()co
5、ut我的学号是:Not我的名字是:nameendl;class teacher:public Personstring special;public:teacher(string Name=#,string sp=无):Person(Name)special=sp;void show()cout我的专业是:specialt我的名字是:nameshow();student st(沈洁,06007126);pp=&st;pp-show();teacher tc(陈棣,计算机);pp=&tc;pp-show();return 0;3阅读下列模拟售瓜程序,给出运行的输出结果。class waterme
6、londouble weight;static double total_weight;static int total_number;public:watermelon(double wt) /模拟售瓜weight=wt;total_weight+=weight;total_number+;returnwatermelon()/模拟退瓜total_weight-=weight;total_number-;total_show();void show()coutThe watermelon weight is:weightendl;void total_show()coutTotal weig
7、ht is:total_weightendl;coutTotal number is:total_numberendl;3;double watermelon:total_weight=0;int watermelon:total_number=0;int main()watermelon wm1(12.5);wm1.show();wm1.total_show();watermelon wm2(10.7);wm2.show();wm2.total_show();wm1.returnwatermelon();return 0;4下列程序为线性表插入一个新元素,请给将插入前后数组中元素按顺序写出,
8、并指出Insert()函数代码错在哪里?给出正确代码。template class seqlistT slistsize; /存放顺序表的数组int Maxsize; /最大可容纳项数 int last; /已存表项的最后位置public:seqlist()last=-1;Maxsize=size; /初始化为空表bool Insert(T & x,int i); /x插入到列表中第i个位置处(下标)T Get(int i)return ilast?NULL:slisti; /取第i个元素之值/其他成员函数略;template bool seqlist:Insert(T & x, int i)
9、int j;if (ilast+1|last=Maxsize -1) return false; /插入位置不合理,不能插入(稳健性)elselast+;for(j= i;jlast;j+) slistj+1=slistj;/从表最后位置向前依次后移,空出指定位置slisti=x;return true;int main()seqlist seqlisti; /顺序表对象seqlisti的元素为整型int i,j,k,a10=2,3,5,11,13,17,19,23,29;for(j=0;j9;j+)seqlisti.Insert(aj,j) /把素数写入for(i=0;i9;i+) cout
10、seqlisti.Get(i) ; /打印出素数表 coutendl;seqlisti.Insert(7,3);for(i=0;i10;i+) coutseqlisti.Get(i) ; /打印出添加素数7后的素数表 coutendl;return 0;4输出:原因:正确代码:三、程序填空完善题(每空1.5分,共39分)1 定义复数类,重载、+(包括前置与后置)运算符和复数到实数的类型转换函数double()。class Complexdouble re,im;public:Complex(double a=0,double b=0)re=a;im=b;Complex operator +(C
11、omplex &);(1) ; /重载= =的声明,参见其定义friend ofstream &operator (ifstream &,Complex &);(2) ; /由复数到实数的类型强制转换函数double(),即求模 Complex operator +(); /前置+,实部虚部各+1(3) ; /后置+ ;(4) /重载+运算符Complex t;t.re=re+c.re;t.im=im+c.im;return t;bool operator = =(Complex &c1,Complex &c2)if(5) ) return true; /实部与虚部各自相等else retur
12、n false; (6) /重载插入运算符if(c.re) /实部不为0out0) out+c.imiendl; /虚部为正数if(c.im0) out-c.imiendl; /虚部为负数else outc.imi(istream &in,Complex &c)cout请分别输入实部和虚部:endl;(8) ; /直接输入实部和虚部return in;Complex Complex:operator +() /前+re+; im+;return *this;Complex Complex:operator +(int) /后+Complex t=(9) ; /保存对象自身re+;im+;ret
13、urn t;Complex:operator double()/由复数到实数的类型强制转换函数double(),即求模return (sqrt(re*re+im*im);2以下是一个链表类模板的应用程序,链表的节点为结构体,包含一个数据域和一个指针域,其中数据域的类型参数化。链表类的数据成员为指向节点的指针。各函数成员功能参见注释行。该链表为空链表的标志是头指针和尾指针同指向一个头节点(链表有效数据从该节点的下一个节点开始)。请完成程序空缺部分。templatestruct NodeT info; /数据域Node *link; /指针域;templateclass ListNode *hea
14、d,*tail; /头指针和尾指针public:List(); /生成头结点(空链表)List(); void MakeEmpty(); /清空链表,只余头结点Node* Find(T data); /搜索值为data的结点,返回结点地址void PrintList(); /打印链表的数据域void InsertRear(Node* p); /在链尾添加结点,可用来正向生成链表Node*CreatNode(T data); /创建一个值为data的孤立结点T DeleteNode(Node* p); /删除指定结点,返回该节点值;templateList:List() /建立空链表,仅创建头节
15、点head=tail=new Node;head-link=NULL;templateList:List()(10) ; /先清空链表delete head; /释放头结点templatevoid List:MakeEmpty()Node *tempP;while(head-link!=NULL)tempP=head-link;head-link=(11) ; /把头结点后的第一个节点从链中脱离delete tempP; /删除(释放)脱离下来的结点tail=head; /表头指针与表尾指针均指向表头结点,表示空链templateNode* List:Find(T data)Node *tem
16、pP=head-link;while(12) &(13) )/数未找到同时链表未搜完则继续搜索tempP=tempP-link;return tempP; /搜索成功返回该结点地址,不成功返回NULLtemplatevoid List:PrintList()Node* tempP=head-link;while(tempP!=NULL)coutinfolink;coutendl;templatevoid List:InsertRear(Node *p)p-link=tail-link;(14) ; /p节点连到链尾tail=p;templateNode* List:CreatNode(T da
17、ta) /创建值为data的孤立结点Node*tempP=(15) ; /建立1个结点tempP-info=data;(16) ; /指针域不能悬浮return tempP;template T List:DeleteNode(Node* p)T temp;temp=p-info; /保存p节点值Node* tempP=head; /用tempP找p节点的前节点:while(tempP-link!=NULL&(17) ) tempP=tempP-link; /未找到就继续向后找。if(tempP-link=tail) tail= (18) ; /p节点是尾节点,修改尾指针tempP-link=
18、p-link; /将p节点从链表中脱离delete p; /释放p节点空间return temp; int main()Node * P1;List list1;int i,j,m; cout请输入9个整数:endl;for(i=0;im; /输入节点数据P1=(19) ; /创建孤立节点 list1.InsertRear(P1); /正向生成list1list1.PrintList();cout请输入一个要求删除的整数j;P1=(20) ; /搜索值为j的节点if(P1!=NULL)list1.DeleteNode(P1); /删除该节点list1.PrintList();else cout
19、无该数据节点endl;return 0;3约瑟夫(Josephus)问题:一群猴子围成一圈,从第1只猴子起顺时针数到第m个猴子时,该猴子便出围。继续不断数下去,猴子不断出围,最后剩下的一只猴子就是猴大王。问猴大王是第几只猴子?算法的关键是如何用数组表示圆圈,方法就是“加1求模”。可以给顺序表模板类添加一个Josephus()成员函数实现该算法:template class seqlistT *elements; /存放顺序表的数组int Maxsize; /最大可容纳项数 int last; /已存表项的最后位置public:seqlist(int ms=18);seqlist()delete
20、 elements;T& operator(int); /重载下标运算符int Josephus(int,int);template seqlist:seqlist(int ms)last=-1;Maxsize=ms;elements=(21) ; /动态分配数组assert(elements!=NULL); /断言:分配成功template T& seqlist:operator(int i)/用引用作为返回值即可读也可写if(ilast+1|i=Maxsize)cout下标出界!last) last+; /下标运算符,只能增加表的元素,不能减少return (22) ;template i
21、nt seqlist:Josephus(int a,int m) /a猴子总数,m报数终点int i,j,k,l;for(i=0;ia;i+)elementsi=1;/元素赋初值,1 表示该位置上有猴子last+;i=-1,j=0,k=last;while(k!=0)while(jm)i=(23) ; /用数组表示圆圈,方法就是“加1求模”if((24) ) j+; /该位置上有猴子才计数(25) ;/元素为0表示该猴子出局j=0;k-;/倒计数for(l=0;l=last;l+) coutelementslt;coutendl;for(i=0;i=last;i+)if(elementsi=1) break;return i;int main()seqlist seq;int a,m;cout请输入猴子总数和报数停止数:am;cout猴大王下标为:(26) endl;return 0;共 11 页 第 11 页