面向对象程序设计期末综合练习三(程序填充)
1. 斐波那契数列的第1和第2个数分别为0和1 ,从第三个数开始,每个数等于其前两个数之和。求斐波那契数列中的前20个数,要求每行输出5个数。
#include
void main() {
int f,f1,f2,i;
cout<<”斐波那契数列:\n”;
f1=0; f2=1;
cout< for(i=3;i<=20;i++) { f=______(1)______; cout< if(_____(2)______) cout< f1=f2; f2=____(3)_______; } cout< } (1) (2) (3) 2. 计算∑ = + - 10 1 1 ! )1 ( i i i i x 的值。 #include void main() { double x,p1=1,p2=1,s=0; int i,j=1; cout<<"输入x的值:"; cin>>x; for(i=1;i<=10;i++) { p1*=___(1)_____; p2*=____(2)____; s+=j*p1/p2; //j的值为(-1)i+1 j=____(3)____; } cout< } (1) (2) (3) 3. 打印出2至99之间的所有素数(即不能被任何数整除的数)。 #include #include void main() { int i,n; for(n=2; ___(1)___; n++) { int temp=int(sqrt(n)); //求出n的平方根并取整 for(i=2; ___(2)___; i++) if(n%i==0) ___(3)___; if(i>temp) cout< } cout<<'\n'; } (1) (2) (3) 4. 采用辗转相除法求出两个整数的最大公约数。 #include void main() { int a,b; cout<<"请输入两个正整数:"; cin>>a>>b; while(a<=0 || __(1)___) {cout<<"重新输入:"; cin>>a>>b;} while(b) { int r; r=a%b; ___(2)___; ___(3)___; //分别修改a和b的值 } cout< } (1) (2) (3) 5. 把从键盘上输入的一个大于等于3的整数分解为质因子的乘积。如输入24时得到的输出结果为“2 2 2 3”,输入50时得到的输出结果为“2 5 5”,输入37时得到的输出结果为“37”。 #include void main() { int x; cout<<"请输入一个整数,若小于3则重输:"; do cin>>x; while(___(1)___); int i=2; do{ while(___(2)___) { cout< x/=i; } ___(3)___; }while(i if(x!=1) cout< cout< } (1) (2) (3) 6. 下面函数是求两个整型参数a和b的最小公倍数。 int f2(int a, int b) { int i=2, p=1; do { while(a%i==0 && ___(1)___) { p*=i; a/=i; b/=i; } ___(2)___; }while(a>=i && ___(3)___); return p*a*b; } (1) (2) (3) 7. 在输出屏幕上打印出一个由字符’*’组成的等腰三角形,该三角形的高为5行,从上到下每行的字符数依次为1,3,5,7,9。 #include void main() { int i,j; for(i=1;___(1)___;i++) { for(j=1;j<=9;j++) if(j<=5-i || ___(2)___) cout<<’’; else ___(3)___; cout< } } (1) (2) (3) 8. 统计字符串中英文字母个数的程序。 #include int count (char str[]); void main(){ char s1[80]; cout <<”Enter a line:”; cin >>s1; cout <<”count=”< } int count(char str[]){ int num=0; //给统计变量赋初值 for(int i=0;str[i];i++) if (str[i]>=’a’ && str[i]<=’z’ ||___(1)___ ) ___(2)___; ___(3)___; } (1) (2) (3) 9. 主函数调用一个fun函数将字符串逆序。 #include #include ___(1)___; void main( ) { char s[80]; cin>>s; ___(2)___; cout<<”逆序后的字符串:”< } void fun(char ss[]) { int n=strlen(ss); for(int i=0; ___(3)____; i++) { char c=ss[i]; ss[i]=ss[n–1–i]; ss[n–1–i]=c; } } (1) (2) (3) 10. 从一个字符串中删除所有同一个给定字符后得到一个新字符串并输出。 #include const int len=20; void delstr(char a[],char b[],char c); void main() { char str1[len],str2[len]; char ch; cout<<"输入一个字符串:"; cin>>str1; cout<<"输入一个待删除的字符:"; cin>>ch; delstr(str1,str2,ch); cout< } void delstr(char a[],char b[],char c) { int j=0; for(int i=0; ___(1)___; i++) if(___(2)___) b[j++]=a[i]; b[j]=___(2)___; } (1) (2) (3) 11. 采用指针访问方式从键盘给数组a[N]输入数据,然后对元素值重新按逆序存放并输出。 #include const int N=8; void main() { int a[N],*p,*q; for(p=a; p p=a;q=a+N-1; while(p int r=*p; *p=*q; *q=r; ___(2)___; ___(3)___; } for(p=a;p cout<<*p<<' '; cout< } (1) (2) (3) 12. 从键盘上输入一个正整数,然后把它转换成的二进制数的每一位存放到一维数组中,最后输出该二进制数。注意二进制数的存放是按照从低位到高位的次序进行的。 #include void main() { int x; cout<<"输入一个整数:"; cin>>x; int a[20],k=0,r; do { r=x%2; a[k++]=r; x=___(1)___; } while(___(2)___); for(--k;k>=0;k--) ___(3)___; cout< } (1) (2) (3) 13. 对数组a[n]按升序进行的选择排序算法 void SelectSort(int a[], ___(1)___) { int i,j,k; for(i=1;i k=i-1; for(j=i;j if(a[j] int x=a[i-1]; a[i-1]=a[k]; ___(3)___; } } (1) (2) (3) 14. 对数组a[n]按升序进行的插入排序算法 void InsertSort(___(1)___, int n) { int i,j,x; for(i=1;i x=a[i]; for(j=i-1;j>=0;j--) //为x顺序向前寻找合适的插入位置 if(x else ___(3)___; a[j+1]=x; } } (1) (2) (3) 15. 对按从小到大排列的有序数组a[n]进行二分查找x的算法,若查找成功返回该元素下标,否则返回-1。 int BinarySearch(int a[],int x) { int low=0, high=N-1; //定义并初始化区间下界和上界变量 int mid; //定义保存中点元素下标的变量 while(low<=high) { mid=___(1)___; if(x==a[mid]) ___(2)___; else if(x else ___(3)___; } return -1; } (1) (2) (3) 16. 用插入排序方法对table指针数组中size个指针所指向的字符串进行按升序排序的算法。 void sort(char *table[], int size){ for(int i=1,___(1)___; i++){ char *p=table[i]; for(int j=i-1; j>=0 ; j--) if(strcmp(p,table[j])<0) ___(2)___; else break; table[j+1]=___(3)___; } } (1) (2) (3) 17. 假定有定义为“struct NODE{int data; NODE* next;};”,下面算法根据table数组中的n个元素建立一个表头指针为L的链表,链表中结点值的顺序与数组元素值的顺序相同。 void f5(NODE*& L, int table[], int n) { if(n<=0) {L=NULL; return;} L=new NODE; //生成附加的头结点 int i=0; NODE* p=L; while(___(1)___) { p=p->next=___(2)___; p->data=___(3)___; i++; } p->next=NULL; //把最后一个结点的指针域置空 p=L; L=L->next; //使L指向链表的第一个带值的结点 delete p; } (1) (2) (3) 18. 假定有定义为“struct NODE{int data; NODE* next;};”,下面算法根据table数组中的n个元素建立一个表头指针为L的链表,链表中结点值的顺序与数组元素值的顺序正好相反。 void f6(NODE*& L, int table[], int n) { L=NULL; if(n<=0) return; int i=0; NODE* p; while(___(1)___) { p=new NODE; p->data=___(2)___; p->next=L; ___(3)___; i++; } } (1) (2) (3) 19. 假定有定义为“struct NODE{int data; NODE* next;};”,下面算法是依次显示输出以L为表头指针的链表中各结点的值。 void f7(NODE* L) { for(___(1)___; p!=NULL; ___(2)___) cout<<___(3)___ <<' '; cout< } (1) (2) (3) 20. 假定有定义为“struct NODE{int data; NODE* next;};”,下面算法是把以L为表头指针的链表中各结点依次按相反次序链接并返回新链表的表头指针。 NODE* f8(NODE* L) { if(L==NULL) return NULL; NODE *p=NULL, *q=L, *t; while(q!=NULL) { t=q; q=___(1)___; t->next=___(2)___; p=t; } ___(3)___; } (1) (2) (3) 21. 已知一维数组类ARRAY的定义如下,ARRAY与普通一维数组区别是:其重载的运算符[ ]要对下标是否越界进行检查。 class ARRAY{ int *v; //指向存放数组数据的空间 int s; //数组大小 public: ARRAY(int a[], int n); ~ ARRAY(){delete []v;} int size(){ return s;} int& operator[](int n); }; ___(1)___ operator[](int n) //[ ]的运算符成员函数定义 { if(n<0 || ___(2)___) {cerr<<"下标越界!"; exit(1);} return ___(3)___; } (1) (2) (3) 22. 已知一维数组类ARRAY的定义如下,构造函数的作用是把参数n的值赋给s,给v动态分配长度为n的数组空间,接着利用数组参数a初始化v所指向的数组。 class ARRAY{ int *v; //指向存放数组数据的空间 int s; //数组大小 public: ARRAY(int a[], int n); ~ ARRAY(){delete []v;} int size(){ return s;} int& operator[](int n); }; ___(1)___ ARRAY(int a[], int n) { if(n<=0) {v=NULL;s=0;return;} s=n; v=___(2)___; for(int i=0; i } (1) (2) (3) 23. 下面是一维数组类ARRAY的定义,ARRAY与普通一维数组区别是:(a)用()而不是[]进行下标访问,(2)下标从1而不是从0开始, (c)要对下标是否越界进行检查。 class ARRAY{ int *v; //指向存放数组数据的空间 int s; //数组大小 public: ARRAY(int a[], int n); ~ ARRAY(){delete []v;} int size(){ return s;} int& operator()(int n); }; ___(1)___ operator()(int n) { // ()的运算符函数定义 if(___(2)___) {cerr<<"下标越界!"; exit(1);} return ___(3)___; } (1) (2) (3) 24. 已知一个类的定义如下: #include class AA { int a[10]; int n; public: void SetA(int aa[], int nn); //用数组aa初始化数据成员a, //用nn初始化数据成员n int MaxA(); //从数组a中前n个元素中查找最大值 void SortA(); //采用选择排序的方法对数组a中前n个元素 //进行从小到大排序 void InsertA();//采用插入排序的方法对数组a中前n个元素进行从小到大排序void PrintA(); //依次输出数组a中的前n个元素 }; 该类中MaxA()函数的实现如下,请在标号位置补充适当的内容。 int ____(1)_____ { int x=a[0]; for(int i=1; i if(a[i]>x) ___(2)___; ___(3)___; } (1) (2) (3) 25. 已知一个类的定义如下: #include class AA { int a[10]; int n; public: void SetA(int aa[], int nn); //用数组aa初始化数据成员a, //用nn初始化数据成员n int MaxA(); //从数组a中前n个元素中查找最大值 void SortA(); //采用选择排序的方法对数组a中前n个元素 //进行从小到大排序 void InsertA();//采用插入排序的方法对数组a中前n个元素进行从小到大排序void PrintA(); //依次输出数组a中的前n个元素 }; void AA::SortA() { int i,j; for(i=0; ___(1)___; i++) { int x=a[i], k=i; for(j=i+1; j if(a[j] a[k]=a[i]; ___(3)___; } } (1) (2) (3) 26. 已知一个类的定义如下: #include class AA { int a[10]; int n; public: void SetA(int aa[], int nn); //用数组aa初始化数据成员a, //用nn初始化数据成员n int MaxA(); //从数组a中前n个元素中查找最大值 void SortA(); //采用选择排序的方法对数组a中前n个元素 //进行从小到大排序 void InsertA();//采用插入排序的方法对数组a中前n个元素进行从小到大排序void PrintA(); //依次输出数组a中的前n个元素 }; void ___(1)___ { int i,j; for(i=1; i int x=a[i]; for(j=i-1; j>=0; j--) if(x else ___(3)___; a[j+1]=x; } } (1) (2) (3) 27. 已知一个类的定义如下: #include class AA { int a[10]; int n; public: void SetA(int aa[], int nn); //用数组aa初始化数据成员a, //用nn初始化数据成员n int MaxA(); //从数组a中前n个元素中查找最大值 void SortA(); //采用选择排序的方法对数组a中前n个元素 //进行从小到大排序 void InsertA();//采用插入排序的方法对数组a中前n个元素进行从小到大排序void PrintA(); //依次输出数组a中的前n个元素 //最后输出一个换行 }; 使用该类的主函数如下: void main() { int a[10]={23,78,46,55,62,76,90,25,38,42}; AA x; ___(1)___; int m=___(2)___; ___(3)___; cout< } 该程序运行结果为: 23 78 46 55 62 76 78 (1) (2) (3) 28. 已知一个类的定义如下: #include class AA { int a[10]; int n; public: void SetA(int aa[], int nn); //用数组aa初始化数据成员a, //用nn初始化数据成员n int MaxA(); //从数组a中前n个元素中查找最大值 void SortA(); //采用选择排序的方法对数组a中前n个元素 //进行从小到大排序 void PrintA(); //依次输出数组a中的前n个元素, //最后输出一个换行 }; 使用该类的主函数如下: void main() { int a[10]={23,78,46,55,62,76,90,25,38,42}; ___(1)___; x.SetA(a,8); int ___(2)___; ___(3)___; x.PrintA(); cout< } 该程序运行结果为: 23 25 46 55 62 76 78 90 90 (1) (2) (3) 29. 已知一个利用数组实现栈的类定义如下: const int ARRAY_SIZE=10; class Stack { public: void Init() {top=-1;} //初始化栈为空 void Push(int newElem); //向栈中压入一个元素int Pop(); //从栈顶弹出一个元素 bool Empty() { //判栈空 if(top==-1) return true;else return false;} int Depth() {return top+1;} //返回栈的深度 void Print(); //按照后进先出原则依次输出栈中每个元素,直到栈空为止private: int elem[ARRAY_SIZE]; //用于保存栈元素的数组 int top; //指明栈顶元素位置的指针 }; void Stack::Push(int newElem) { if(___(1)___) { cout<<"栈满!"< exit(1); //中止运行 } ___(2)___; elem[top]=___(3)___; } (1) (2) (3) 30. 已知一个利用数组实现栈的类定义如下: const int ARRAY_SIZE=10; class Stack { public: void Init() {top=-1;} //初始化栈为空 void Push(int newElem); //向栈中压入一个元素 int Pop(); //从栈顶弹出一个元素 bool Empty() { //判栈空 if(top==-1) return true;else return false;} int Depth() {return top+1;} //返回栈的深度 void Print(); //按照后进先出原则依次输出栈中每个元素,直到栈空为止private: int elem[ARRAY_SIZE]; //用于保存堆栈元素的数组 int top; //指明栈顶元素位置的指针 }; 该类的Pop和Print函数的实现分别如下: ___(1)___ { if(top==-1) { cout<<"栈空!"< exit(1); //中止运行 } return ___(2)___; } void Stack::Print() { while(!Empty()) cout<<___(3)___ <<' '; } (1) (2) (3) 31.class A { int a; public: A() {a=0;} ___(1)___{} //定义构造函数,用参数aa初始化数据成员a }; main() { ___(2)___; //定义类A的指针对象p ___(3)__; //用p指向动态对象并初始化为整数5 } (1) (2) (3) 32.class A { char *a; public: ___(1)___ //定义无参构造函数,使a的值为空 A(char *aa) { a=___(2)___; strcpy(a,aa); //用aa所指字符串初始化a所指向的动态存储空间 } ___(3)___ //定义析构函数,删除a所指向的动态存储空间 }; (1) (2) (3) 33.class A { int a,b; public: A(int aa=0, int bb=0) ___(1)___ {} //分别用aa和bb对应初始化a和b }; main() { ___(2)___ ; //定义类A的对象x并用5初始化,同时定义y并用x初始化 ___(3)___ ; //定义p指针,使之指向对象x } (1) (2) (3) 34.class A { int a,b; public: ___(1)___ //定义构造函数,使参数aa和bb的默认值为0, //在函数体中用aa初始化a,用bb初始化b }; main() { A *p1, *p2; ___(2)___ ; //调用无参构造函数生成由p1指向的动态对象 ___(3)___ ; //调用带参构造函数生成由p2指向的动态对象, //使a和b成员分别被初始化为4和5 } (1) (2) (3) 35. #include #include class A { int *a; int n; int MaxLen; public: A(): a(0), n(0), MaxLen(0) {} A(int *aa, int nn, int MM) { n=nn; MaxLen=MM; if(n>MaxLen) exit(1); ___(1)___; //由a指向长度为MaxLen的动态数组 for(int i=0; i } ~A() {delete []a;} int GetValue(int i) ___(2)___ //函数体返回a[i]的值 }; void main() { int b[10]={1,2,3,4,5,6,7,8,9,10}; A r(b,10,10); int i,s=0; for(i=0; i<10; i++); ___(3)___ //把r对象的a数据成员中的每个 //元素值依次累加到s中 cout<<"s="< } (1) (2) (3) 36. #include #include class A { int *a; int n; int MaxLen; public: A(): a(0), n(0), MaxLen(0) {} A(int *aa, int nn, int MM) { n=nn; MaxLen=MM; if(n>MaxLen) exit(1); a=new int[MaxLen]; ___(1)___; //以i为循环变量把aa数组中每个元素值 //传送给a数组的对应元素中 } ~A(); int GetValue(int i) {return a[i];} //函数体返回a[i]的值}; ___(2)___ //析构函数的类外定义 void main() { int b[10]={1,2,3,4,5,6,7,8,9,10}; A r(b,10,10); int i,s=0; ___(3)___ ; //以i为循环变量,把r对象的a数据成员中的 //每个元素值依次累加到s中 cout<<"s="< } (1) (2) (3) 37. 一种类定义如下: class Goods { private: char gd_name[20]; //商品名称 int weight; //商品重量 static int totalweight; //同类商品总重量 public: Goods (char*str,int w){ //构造函数 strcpy(gd_name,str); weight=w; totalweight+=weight; } ~ Goods (){totalweight -= weight;} char* GetN(){___(1)___;} //返回商品名称 int GetW(){return weight;} ___(2)___ GetTotal_Weight() { //定义静态成员函数返回总重量 ___(3)___; } } (1) (2) (3) 38. class Point { private: int x, y; public: Point(){x=y=0;} Point(int x0,int y0) {x=x0;y=y0;} int GetX() { return x; } int GetY() { return y; } void Print(){cout<<"Point("< ___(1)___; //友元函数声明 ___(2)___; //友元函数声明 }; Point operator+(Point& pt,int dd) //加号操作符重载函数,实现Point类对象与整数加法 { Point temp=pt; temp.x+=dd; temp.y+=dd; return temp; } Point operator+(Point& pt1,Point& pt2) //加号操作符重载函数,实现两个Point类对象的加法 { Point temp=pt1; temp.x+=pt2.x; ___(3)___; return temp; } (1) (2) (3) 39. 在下面一段类定义中, Derived类是由直接基类Base 1和Base 2所派生的,Derived类包含有两个间接基类BaseBase,在初始化函数Init中,需要把x1和x2的值分别赋给属于基类Base1的x成员和属于基类Base2的x成员。 class BaseBase { protected: int x; public: BaseBase(){ x = 1;} }; class Base1: public BaseBase { public: Base1(){} }; class Base2: public BaseBase { public: Base2(){} }; class Derived: ___(1)___ { public: Derived() {} void Init(int x1, int x2) { ___(2)___; ___(3)___; } void output() {cout< }; (1) (2) (3) 40. 在下面一段类定义中, Derived类公有继承了基类Base。需要填充的函数由注释内容给出了功能。 class Base { private: int mem1,mem2; //基类的数据成员 public: Base(int m1,int m2) { mem1=m1; mem2=m2; } void output(){cout< //... }; class Derived: public Base { private: int mem3; //派生类本身的数据成员 public: //构造函数,由m1和m2分别初始化mem1和mem2,由m3初始化mem3 Derived(int m1,int m2, int m3); //输出mem1,mem2和mem3数据成员的值 void output(){ ___(1)___; cout< } //... }; Derived::Derived(int m1,int m2, int m3): ___(2)___ {___(3)___;} (1) (2) (3) 41. 在下面一段类的定义中,需要填充的函数由注释内容给出了功能。 class Point //定义坐标点类 { public: int x,y; //点的横坐标和纵坐标 Point(){x=0;y=0;} Point(int x0,int y0) {x=x0; y=y0;} int X(){return x;} int Y(){return y;} void PrintP(){cout<<"Point:("< }; class Line: public Point //利用坐标点类定义直线类 { private: class Point pt1,pt2; //直线的两个端点 public: Line(Point pts, Point pte); //构造函数,分别用参数初始化对应的端点 double Dx(){return pt2.x-pt1.x;} double Dy(){return pt2.y-pt1.y;} double Length(){ //计算直线的长度 return sqrt(___(1)___); }; void PrintL(); //输出直线的两个端点和直线长度 }; Line::Line(Point pts, Point pte) ___(2)___ void Line::PrintL() { cout<<"1st "; pt1.PrintP(); cout<<"2nd "; pt2.PrintP(); cout<<"The Length of Line: "<<___(3)___ < } (1) (2) (3) 42. 在下面一段类的定义中,自行车类的虚基类为车辆类,机动车类的虚基类也为车辆类,摩托车类的基类为自行车类和机动车类,类之间均为公有继承。 class vehicle //车辆类 { private: int MaxSpeed; //最大车速 int Weight; //车重 public: vehicle(){MaxSpeed=0; Weight=0;}; virtual void Run() {cout<<"A vehicle is running!"< }; class bicycle : ___(1)___ //自行车类 { private: int Height; //车高 public: bicycle(){}; void Run() {cout<<"A bicycle is running!"< }; class motorcar : ___(2)___ //机动车类 { private: int SeatNum; //乘人数 public: motorcar(){}; void Run() {cout << "A motorcar is running!" << endl; } }; class motorcycle: ___(3)___ //摩托车类 { public: motorcycle (){}; void Run() {cout<<"A motorcycle is running!"< }; (1) (2) (3) 程序填充参考解答 1. (1) f1+f2 (2) i%5==0 (3) f 2. (1) x (2) i (3) -j 3. (1) n<=99 (2) i<=temp (3) break 4. (1) b<=0 (2) a=b (3) b=r 5. (1) x<3 (或x<=2) (2) x%i==0 (3) i++ 6. (1) b%i==0 (2) i++ (或++i) (3) b>=i 7. (1) i<=5 (2) j>=5+I (3) cout<<’*’ 8. (1) str[i]>=’A ’&& str[i]<=’Z’ (2) num++ (3) return num 9. (1) void fun(char ss[]) (2) fun(s) (3) i 10. (1) a[i] (或a[i]!=’\0’) (2) a[i]!=c (3) '\0' 11. (1) cin>>*p (2) p++ (或++p) (3) q-- (或--q) 12. (1) x/2 (2) x!=0 (3) cout< 13. (1) int n (2) k=j (3) a[k]=x 14. (1) int a[] (或int* a) (2) a[j+1]=a[j] (3) break 15. (1) (low+high)/2 (2) return mid (3) low=mid+1 16. (1) i 17. (1) i 18. (1) i 19. (1) NODE* p=L (2) p=p->next (3) p->data 20. (1) q->next (2) p (3) return p 21. (1) int& ARRAY:: (2) n>=s (3) v[n] (或*(v+n)) 22. (1) ARRAY:: (2) new int[n] (3) v[i]=a[i] 23. (1) int& ARRAY:: (2) n<1 || n>s (3) v[n-1] (或*(v+n-1)) 24. (1) AA::MaxA() (2) x=a[i] (3) return x 25. (1) i 26. (1) AA::InsertA() (2) a[j+1]=a[j] (3) break 27. (1) x.SetA(a,6) (2) x.MaxA() (3) x.PrintA() 28. (1) AA x (2) m=x.MaxA() (3) x.SortA() 29. (1) top==ARRAY_SIZE-1 (2) top++(或++top) (3) newElem 30. (1) int Stack::Pop() (2) elem[top--] (3) Pop() 31. 答案:(1) A(int aa):a(aa) (2) A *p (3) p=new A(5) 32. 答案:(1) A() {a=0;} 或A():a(0){} 注:数据0可用NULL代替 (2) new char[strlen(aa)+1] (3) ~A() {delete []a;} 33. 答案:(1) :a(aa),b(bb) (2) A x(5),y(x) 注:x(5)与x=5等效,y(x) 与y=x等效 (3) A *p=&x 34. 答案:(1) A(int aa=0, int bb=0){a=aa; b=bb;} (2) p1=new A (3) p2= new A(4,5) 35. 答案:(1) a=new int[MaxLen] (b) {return a[i];} (c) s+=r.GetValue(i) 36. 答案:(1) for(int i=0; i (2) A::~A() {delete []a;} (3) for(i=0; i<10; i++) s+=r.GetValue(i) 37. (1) return gd_name (2) static int (3) return totalweight 38. (1) friend Point operator+(Point& pt,int dd) (2) friend Point operator+(Point& pt1,Point& pt2) (3) temp.y+=pt2.y 39. (1) public Base1, public Base2 (2) Base1::x=x1 (3) Base2::x=x2 40. (1) Base::output() (2) Base(m1,m2) (3) mem3=m3 41. (1) Dx()*Dx()+Dy()*Dy() (2) {pt1=pts;pt2=pte;} (或 :pt1(pts),pt2(pte){}) (3) Length() 42. (1) virtual public vehicle (2) virtual public vehicle (3) public bicycle, public motorcar 《面向对象程序设计》 大作业 题目学生成绩管理系统 学院 专业 班级 姓名 指导教师 2015 年11 月11 日 目录 一大作业的目的 (1) 二大作业的内容............................ . .. (2) 三大作业的要求与数据............... ...... . (3) 四大作业应完成的工作.................. . (4) 五总体设计(包含几大功能模块)........... . (5) 六详细设计(各功能模块的具体实现算法——流程图) (6) 七调试分析(包含各模块的测试用例,及测试结果) (7) 八总结 (8) 十参考资料 (9) 一大作业的目的 《面向对象程序设计》是一门实践性很强的课程,通过大作业不仅可以全方位检验学生知识掌握程度和综合能力,而且还可以进一步加深、巩固所学课程的基本理论知识,理论联系实际,进一步培养自己综合分析问题和解决问题的能力。更好地掌握运用C++语言独立地编写、调试应用程序和进行其它相关设计的技能。 二大作业的内容 对学生信息(包括学号、语文、数学、英语、平均分)进行管理,包括学生成绩的信息输入、输出、查询、删除、排序、统计、退出.将学生的成绩信息进行记录,信息内容包含:(1)学生的学号(2)学生的姓名(3)学生的成绩。假设,现收集到了一个班学生的所有成绩信息,要求用C语言编写一个简单的成绩管理系统,可进行录入、查询、修改和浏览等功能。学习相关开发工具和应用软件,熟悉系统建设过程。 三大作业的要求与数据 1、用C++语言实现系统; 2、对学生信息(包括学号、姓名、语文、数学、英语、平均分)进行管理,包括学生成绩的信息输入、输出、查询、删除、排序、统计、退出. 3、学生信息包括:其内容较多,为了简化讨论,要求设计的管理系统能够完成以下功能: (1) 每一条记录包括一个学生的学号、姓名、3门课成绩 (2)、成绩信息录入功能:(成绩信息用文件保存,可以一次完成若干条记录 的输入。) (3)、成绩信息显示浏览功能:完成全部学生记录的显示。 (4)、查询功能:完成按姓名查找学生记录,并显示。 (5)成绩信息的删除:按学号进行删除某学生的成绩. (6)、排序功能:按学生平均成绩进行排序。 (7)、应提供一个界面来调用各个功能,调用界面和各个功能的操作界面应尽可能清晰美观! 1 什么是面向对象程序设计,它与传统的结构式程序有什么不同。 面向对象程序设计是一种适用于设计、开发各类软件的范型。它是将软件看成是一个由对象组成的社会:这些对象具有足够的智能,能理解从其他对象接受的信息,并以适当的行为作出响应;允许低层对象从高层对象继承属性和行为。通过这样的设计思想和方法,将所模拟的现实世界中的事物直接映射到软件系统的解空间。 与传统的结构式程序设计相比,面向对象程序设计吸取了结构式程序设计的一切优点(自顶向下、逐步求精的设计原则)。而二者之间的最大差别表现在: ·面向对象程序采用数据抽象和信息隐藏技术使组成类的数据和操作是不可分割的,避免了结构式程序由于数据和过程分离引起的弊病。 · 面向对象程序是由类定义、对象(类实例)和对象之间的动态联系组成的。而结构式程序是由结构化的数据、过程的定义以及调用过程处理相应的数据组成的 2 用面向对象方法建立模型的思维过程是怎样的。 用面向对象方法建立拟建系统的模型的过程就是从被模拟现实世界的感性具体中抽象要解决的问题概念的过程。这种抽象过程分为知性思维和具体思维两个阶段,其中:·知性思维是从感性材料中分解对象,抽象出一般规定,形成了对对象的普遍认识。·具体思维是从知性思维得到出的一般规定中揭示的事物的深刻本质和规律,其目的是把握具体对象的多样性的统一和不同规定的综合。 3 解释以下概念: ①对象:在现实世界中,对象就是可以感觉到的实体。每个对象具有一个特定的名字以 区别于其他对象;具有一组状态用来描述它的某些特性;具有一组操作,每一个操作决定对象的一种功能或行为(为自身服务的操作和为其他对象提供服务的操作)。而在面向对象系统中,对象是可以标识的存储区域。每个对象的状态被保存在此区域中,而实现一类对象行为的操作(代码)被保存在另外相关的存储器区域中。 ②消息:消息是要求某个对象执行其某种功能操作(方法)的规格说明。因此,消息是 由消息的接收者、消息要求提供的操作(消息名)和必要的参数组成的。 ③类:在现实世界中,类是对一组具有共同特性(属性和行为)的客观对象的抽象。而 在面向对象系统中,类是由程序员自定义的具有特定结构和功能的类型,是一种代码共享的手段。 ④实例:任何一个对象都是该对象所属类的一个具体实例。 ⑤公有消息:是由对象外向对象发送的消息,用于激活该对象的某种方法。 ⑥私有消息:是由对象向自身发送的消息,用于内部操作;该类消息不能从对象外向该 对象发送。 ⑦消息序列:在面向对象系统中一个事件的发生总会有多个对象的多次相互作用才能完 成,使得这些对象能够相互作用的消息组成的序列被称为消息序列。 4 类与实例的关系如何? 类是创建对象的模板,而对象是实现类的实例。属于同一类的不同实例必须具有: ·相同的操作集合; ·相同的静态属性集合; ·不同的对象名和属性动态值。 第3章面向对象程序设计基础 第3章面向对象程序设计基础 【1】什么是Java程序使用的类?什么是类库? 答:类是将一类事物的特性描述出来,然后如果用这个类来定义对象,则该对象就拥有了这个类所描述的所有特性。 在Java系统中,系统定义好的类根据实现的功能不同,可以划分成不同的集合,每个集合称为一个包,所有包合称为类库。 【2】如何定义方法?在面向对象程序设计中方法有什么作用? 答:方法的定义由两部分组成:方法声明和方法体。 方法的声明如下: 返回值类型方法名(参数类型形式参数1,参数类型形式参数2…){ 程序代码; 返回值; } 在面向对象程序设计中,方法的作用是完成对类和对象属性操作。 【3】简述构造方法的功能和特点。下面的程序片段是某学生为student类编写的构造方法,请指出其中的错误。 void Student(int no,String name) { studentNo=no; studentName=name; return no; } 答:构造方法的功能是:构造方法是一个特殊的方法,主要用于初始化新创建的对象; 特点:构造方法的方法名要求与类名相同,用户不能直接调用,只能通过new运算符调用,而且构造方法是不返回任何数据类型,甚至也不返回void数据类型,即不能在构造方法前加void。 错误之处:(1)构造方法Student()前不能加void,(2)不能用return语句,(3)类名Student 首字母S改成小写s. 【4】定义一个表示学生的student类,包括的域有学号、姓名、性别、年龄,包括的方法有获得学号、姓名、性别、年龄及修改年龄。编写Java程序创建student类的对象及测试其方法的功能。 class Student { String id; String name; String sex; int age; void talk(){ 面向对象程序设计实验指导书 实验一、C++开发环境应用入门(2学时)(选做) 1、实验目的 (1)了解C++开发工具的特点 (2)熟悉C++开发环境 (3)学习用C++编写标准的C++程序 2、实验任务 使用C++来建立一个非图形化的标准C++程序,编译、运行下例程序: #include 2015秋季学期计算机科学与技术本科 《面向对象程序设计技术》作业题 (在电大在线该课程讨论区跟帖提交,注明姓名和学号以记录成绩)选择题 1.可以在本类及派生类的成员函数中进行访问的访问控制修饰符是(B) A.private B.protected C.public 2.在IDE中将编程项目采用多文件结构下,类的定义一般放在(A) A.头文件 B.程序文件 C.主程序文件 3.内联成员函数在类外定义时要将其和类定义一起放在(A) A.头文件 B.程序文件 C.主程序文件 4.下面哪个内存区域是C++中的运行时动态内存分配区域?( D ) A.代码区 B.栈区 C.数据区 D.堆区 5.对象作为函数参数使用时,一般使用(A)形式 A.引用 B.指针 C.对象拷贝 6.同类的多个不同对象的数据成员值各有不同,但不同对象可以共享类的成员函数代码, 实际调用成员函数时,是通过(B )来区分不同对象的。 A.显式给出不同对象不同地址 B.隐含的this指针 C.引用 7.下面哪一种情况不会自动调用拷贝构造函数。(E) A.用一个对象初始化另一个对象时 B.当一个对象作为值传递给一个函数时 C.当一个对象作为值从一个函数返回之前,该对象被拷贝到栈区 D.函数调用结束后,栈区中的返回对象拷贝给主调程序的对象 E.建立指向对象的指针并初始化指针值时 8.下列哪些对象的数据成员类型可以不用初始化表的方式进行初始化(D) A.常量数据成员 B.引用数据成员 C.类中对象成员 D.一般数据成员 9.下列哪一种类设计一般无需在类中设计静态数据成员以使建立的多个对象共享静态数 据数据成员。( D ) A.一个链表类的头指针和尾指针 B.一个学生类中用于保存建立了多少个学生对象的计数器 C.银行帐号类中的年利率 D.一般只用于建立一个对象的类 10.一个类中的公有(public)性质的静态数据成员,以下哪一种访问方式是错误的(D) A.对象名.静态数据成员名 B.指向对象的指针—>静态数据成员名 C.类名::静态数据成员名 D.类名.静态数据成员名 11.下列哪一个运算符不能够被类所重载(E) A.“.”成员访问运算符 B.“*”成员指针访问运算符 C.“::”域运算符 D.“?:”条件运算符 E.“=”赋值运算符c++面向对象程序设计大作业
什么是面向对象程序设计
第3章 面向对象程序设计基础
面向对象程序设计实验指导书讲解
2016年电大面向对象程序设计技术-作业题
《面向对象程序设计》答案