程序设计及算法语言A卷.doc
东 南 大 学 考 试 卷(A卷)学号 姓名 密封线课程名称程序设计及算法语言1考试学期07-08-2得分适用专业吴健雄学院考试形式闭卷考试时间长度120分钟卷面总分67,另有上机编程33分,总成绩100分一、简答题(每问2分,共6分)自 觉 遵 守 考 场 纪 律 如 考 试 作 弊 此 答 卷 无 效下列各段程序都存在错误,请说明错误所在及理由(1)类说明(2分)class Squareprivate: int upper_left_x=0, upper_left_y=0;int side_length=2;public:Square();Square();int draw();答: (2)类说明(2分)class ComplexdoubleReal,Image ;public : Complex(double r=0.0, double i=0.0) Real=r;Image=i; friend Complex operator+(const Complex &,const Complex &);Complex Complex:operator+(const Complex & c1,const Complex & c2)return Complex(c1.Real+c2.Real,c1.Image+c2.Image); 答: (3)求1到100倒数和的程序段(1分)double sum=0;int i;for(i=1;i<=100;i+) sum+=1/i;cout<<sum<<endl;答: 1二、程序阅读与修改题(共22分)1设输入大写字母D,画出输出图形。(5分)int main()char in;int i,j;docout<<"输入一个字母:"cin>>in;if(in>=65)&&(in<=90) in+=32;while(in<97)|(in>122); (5分)int line=in-'a'for (i=0;i<=line;i+) for(j=line-i;j>0;j-) cout<<" " for(j=1;j<=2*i+1;j+) cout<<' '<<char(i+'a');cout<<endl;for (i=line;i>0;i-)for(j=0;j<=line-i;j+) cout<<" "for(j=1;j<=2*i-1;j+) cout<<' '<<char(i-1+'a');cout<<endl;2return 0;2调用递归函数ch(D),可得输出为?(6分)void ch(char w)char i;if(w>=A)for(i=A;i<=w;i+) cout<<t<<w;cout<<endl;ch(w-1);for(i=A;i<=w;i+) cout<<t<<w;cout<<endl;3写出下例的运行结果。希望实现动态的多态性,如未实现请指出错误,并给出更正后的运行结果。(6分)class base3运行结果:指出错误并更正:更正后的运行结果:public:virtual void fn(int x)cout<<"In base class, x="<<x<<endl;class sub:public basepublic:virtual void fn(float x)cout<<"In sub class, x="<<x<<endl;int main()base b,*p;sub s;p=&b;p->fn(2);p=&s;p->fn(3.5);return 0;4下例求给定数的平方根,第一次输入2,第二次输入-2。给出屏幕上显示的内容。(5分)double dsqrt(double d)if(d<0) throw 2;4return sqrt(d);int main()int x;while(1)cout<<”请输入一个正整数:”<<endl;cin>>x;trycout<<dsqrt(x)<<endl;catch(int)cout<<”这是一个负整数!”<<endl;if(d<0) break;return 0;三、程序填空完善题(除特别标出者,每空1.5分,共39分)1下例是由数组类模板派生栈类模板,注意格式。(共10.5分)#include<iostream>using namespace std;template<class T,int size> class arrayT asize;int last;int maxSize;public:array()last=-1;maxSize=size;bool isfull()if(last=maxSize-1) return true; else return false; bool isempty()if(last=-1) return true; else return false;void insertRear(T data) /将data插在数组最后一个元素位置,可用于创建数组if(1) ) (2) ;else cout<<"array is full,can not insert!"<<endl;T deleteRear() /将数组最后一个元素从数组中删除,值返回if(3) ) (4) ;else cout<<"array is empty,can not delete!"<<endl;void print() /输出数组int i;for(i=0;(5) ;i+) cout<<ai<<'t'cout<<endl;/其他无关接口函数略;template<class T,int size> class stack:private array<T,size>/私有派生屏蔽原有的接口函数public:void push(T data)(6) ;/调用基类合适的公有函数T pop()(7) ; /调用基类合适的公有函数,并返回void stackprint()print();2下面采用冒泡排序的成员函数模板实现线性表降序排序。冒泡排序采用从线性表尾部往头部进行,比较运算符采用小于运算符。(其中810三空各2分,共9分)template <typename T,int size>class Orderedlistint maxsize;int last;T slistsize;public:Orderedlist()last=-1;maxsize=size;void BubbleSort();bool Insert(T & elem,int i);void print();/ 无关成员函数省略,缺省的=等不必定义;/Insert(T & elem ,int i)和print()不再重复定义template <typename T,int size> void Orderedlist<T,size>:BubbleSort()/降序bool noswap; /交换标志int i,j;T temp;for (8) )/从线性表尾部往头部逐个元素完成排序noswap=true;for(9) )/注意一趟排序的方向if(10) )/关键字比较采用小于号,实现降序排序temp=slistj;slistj=slistj+1;slistj+1=temp;(11) ;/标识本趟有交换(12) ;/本趟无交换,则终止算法。3下例线性表的析构函数将线性表存入文本文件,而构造函数由该文件恢复线性表。(共13.5分)template <typename T,int size>class Orderedlistint maxsize;int last;T slistsize;public:Orderedlist();Orderedlist();int getlast()return last;void putlast(int n)last=n;T getslist(int k)return slistk;void putslist(T t,int k)slistk=t;void print()for(int i=0;i<=last;i+) cout<<slisti;/ 无关成员函数省略;template <typename T,int size> Orderedlist<T,size>:Orderedlist()last=-1;maxsize=size;T t;(13) ;/定义流文件infile.open(14) ); /进入时由文件mylist.txt建立对象if(!infile)cout<<"没有数据文件"<<endl; /只给提示不退出else/有数据文件while(!infile.eof()infile>>t;(15) ;(16) ;last-;/对应文本文件结束处是回车换行后加文件结束符infile.close();print();cout<<endl;template <typename T,int size> Orderedlist<T,size>:Orderedlist()int i;(17) ;outfile.open(18) ); /退出时由文本文件保存对象if(!outfile)cout<<"不能打开文件"<<endl;elsefor(19) )(20) ;outfile.close();/这时生成的文本文件结束处是回车换行后加文件结束符问:作为线性表的模板类型参数T的实参类型中需对那些运算符进行重载:(21) 4完善链表类模板的复制构造函数。(共6分)template<typename T>class List;template<typename T>class NodeT info; /数据域Node<T> *link; /指针域public:Node(); /生成头结点的构造函数Node(const T & data); /生成一般结点的构造函数friend class List<T>/省略其他成员函数定义; template<typename T>class ListNode<T> *head,*tail; /链表头指针和尾指针public:List(); /构造函数,生成头结点(空链表)List(List<T> &); /拷贝构造函数List(); /析构函数/其它成员函数略;template<typename T>List<T>:List(List<T> & ls) /拷贝构造函数Node<T>* TempP=ls.head->link,*P1;head=tail=(22) ;/动态建立链表的头结点while(TempP!=NULL)P1=new Node<T>(23) );/复制一个链表结点P1->link=tail->link;/向后生成链表(24) ;tail=P1;(25) ;/准备复制ls的下一个结点