c++面向对象课后答案第7章(1)

合集下载

面向对象程序设计 C 山师 第七章习题答案

面向对象程序设计 C    山师 第七章习题答案

第七章习题答案一、选择填空1、D2、A3、B4、C5、A6、C7、B8、D9、二、判断下列描述的正确性,对者划√,错者划×。

1、√2、×3、×4、×5、√6、×7、√8、√9、√ 10、×11、√ 12、√ 13、× 14、√ 15、√ 16、× 17、√ 18、√三、分析下列程序的输出结果。

1、(1)上述结构的DAG图如下所示。

(2)无二义性(3)无二义性2、(1)无(2无(3)有(4)无(5)有四、分析下列程序的输出结果1、运行该程序输出如下结果。

(1,2)5,6(6,9)2、该程序的输出结果如下所示(1,2)(6,9)5,6(6,9)3、该程序的输出结果如下:(13,22,30,40)4、运行该程序输出结果如下所示。

D2::display()pri1=4,pri2=5pri4=6pri12=7D2::display()pri1=12 ,pri2=9pri4=7pri12=85、该程序输出结果如下所示:D2::display()pri1=1,pri2=4pri4=6pri12=7D2::display()pri1=9,pri2=8pri4=7pri12=86、该程序输出结果如下所示:base classbase classbase classderive1 classderive2 class五、按下列要求编写程序。

1、程序内容如下所示。

#include <iostream.h>#include <iomanip.h>class person{int no。

char name[10]。

public:void input(){cout<<" 编号:"。

cin>>no。

cout<<" 姓名:"。

cin>>name。

C程序设计(第2版)第七章习题解答.doc

C程序设计(第2版)第七章习题解答.doc

C程序设计(第2版)第七章习题解答第七章动态内存分配习题一、基本概念与基础知识自测题7.1 填空题7.1.1 C/C++定义了4个内存区间:(1)、(2)、(3)和(4)。

答案:(1)代码区,存放程序代码;(2)全局变量与静态变量区,存放全局变量或对象(包括静态);(3)局部变量区即栈(stack)区,存放局部变量;(4)自由存储区(free store),即动态存储区或堆(heap)区。

7.1.2 静态定义的变量和对象用标识符命名,称为(1);而动态建立的称为(2),动态建立对象的初始化是通过(3)实现(4)。

答案:(1)命名对象(2)无名对象(3)初始化式(initializer)(4)显式初始化7.1.3 在用new运算符建立一个三维数组15*30*10时,使用了(1)个下标运算符,对应的用delete运算符注销这个三维数组时使用了(2)个下标运算符。

new返回的指针是指向(3)的指针。

答案:(1)3个(2)1个(3)30行10列的2位数组7.1.4 当动态分配失败,系统采用(1)来表示发生了异常。

如果new返回的指针丢失,则所分配的自由存储区空间无法收回,称为(2)。

这部分空间必须在(3)才能找回,这是因为无名对象的生命期(4)。

答案:(1)返回一个空指针(NULL)(2)内存泄漏(3)重新启动计算机后(4)并不依赖于建立它的作用域7.1.5 按语义的默认复制构造函数和默认复制赋值操作符实现的复制称为(1),假设类对象obj中有一个数据成员为指针,并为这个指针动态分配一个堆对象,如用obj1按成员语义拷贝了一个对象obj2,则obj2对应指针指向(2)。

答案:(1)浅拷贝(2)同一个堆对象7.1.6 单链表的结点包含两个域:(1)和(2)。

使用链表的最大的优点是(3),即使是动态数组也做不到这一点。

答案:(1)数据域(2)指针域(3)用多少空间,开多少空间7.1.7 进入单链表必须通过单链表的(1),如果它丢失则(2),内存也(3),在单链表中进行的查找只能是(4)。

C语言程序设计教程第七章课后习题参考答案

C语言程序设计教程第七章课后习题参考答案

C语言程序设计教程第七章课后习题参考答案P198 3 求主、副对角线元素之和#include#define M 4#define N 4int main(){int a[M][N]={1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16}; int i,j,m=0,n=0;for(i=0;i<m;i++)< p="">{for(j=0;j<n;j++)< p="">{printf("%4d",a[i][j]);}printf("\n");}for(i=0;i<m;i++)< p="">{for(j=0;j<n;j++)< p="">{if(i==j)m+=a[i][j];}}printf("主对角线元素之和为:%d\n",m);for(i=0;i<m;i++)< p="">{for(j=0;j<n;j++)< p="">{if(i+j==3)n+=a[i][j];}}printf("副对角线元素之和为:%d\n",n); return 0;}P198 4数组逆序存放#includevoid input(int a[],int n);void reverse(int a[],int n);int main(){int a[5];int size=sizeof(a)/sizeof(int);input(a,size);reverse(a,size);printf("\n");return 0;}void input(int a[],int n){int i;printf("请输入%d个整数:\n",n);for(i=0;i<n;i++)< p="">{scanf("%d",&a[i]);}}void reverse(int a[],int n) {int i,t;for(i=0;i<="" p="">{t=a[i];a[i]=a[5-i-1];a[5-i-1]=t;}for(i=0;i<n;i++)< p=""> {printf("%-3d",a[i]);}}198 4数组逆序存放(2)#includevoid reverse(int a[],int n); void print(int a[],int n);int main(){int a[]={1,2,3,4,5,11,16,13}; int size=sizeof(a)/sizeof(int); print(a,size);reverse(a,size);printf("\n");return 0;}void print(int a[],int n){int i;printf("原:\n");for(i=0;i<n;i++)< p="">{printf("%-4d",a[i]);}printf("\n");}void reverse(int a[],int n){int t,i;printf("逆序:\n");for(i=0;i<="" p="">{t=a[i];a[i]=a[n-1-i];a[n-1-i]=t;}for(i=0;i<n;i++)< p="">{printf("%-4d",a[i]);}}P198 5对称矩阵#includevoid print(int a[][3],int rows,int cols); int fun(int a[][3],int rows,int clos); void main(){int a[3][3],i,j;printf("input:\n");for(i=0;i<3;i++){for(j=0;j<3;j++)scanf("%d",&a[i][j]);}print(a,3,3);if(fun(a,3,3)==0)printf("此矩阵是对称矩阵\n");elseprintf("此矩阵不是对称矩阵\n"); } void print(int a[][3],int rows,int cols) {int i,j;for(i=0;i<rows;i++)< p="">{for(j=0;j<cols;j++)< p="">printf("%-4d",a[i][j]);printf("\n");}}int fun(int a[][3],int rows,int clos) {int i,j,x=0;for(i=0;i<rows;i++)< p="">{for(j=0;j<clos;j++)< p="">{if(a[i][j]!=a[j][i]) x++;}}if(x>0) return 1;else return 0;}P198 5对称矩阵(2)#include#define M 3#define N 3void print(int a[][N],int m,int n); int yan(int a[][N],int m,int n); int main(){int a[][N]={1,2,3,4,5,6,7,8,9}; print(a,M,N);if(yan(a,M,N))printf("YES\n");elseprintf("NO\n");return 0;}void print(int a[][N],int m,int n) {int i,j;for(i=0;i<m;i++)< p="">{for(j=0;j<n;j++)< p="">{printf("%-4d",a[i][j]);}printf("\n");}}int yan(int a[][N],int m,int n){int i,j,x=0;for(i=0;i<m;i++)< p="">{for(j=0;j<n;j++)< p="">{if(a[i][j]!=a[j][i]) x++;}}if(x>0) //不是对称矩阵return 0;return 1;}P198 6矩阵求和#include#define M 3#define N 3void input(int a[][N],int m,int n);void sum(int a[][N],int b[][N],int m, int n); void print(int a[][N],int m,int n);int main(){int a[M][N];int b[M][N];printf("请输入%d*%d阶矩阵A:\n",M,N);input(a,M,N);print(a,M,N);printf("请输入%d*%d阶矩阵B:\n",M,N);input(b,M,N);print(b,M,N);printf("A+B=\n");sum(a,b,M,N);return 0;}void input(int a[][N],int m,int n){int i,j;for(i=0;i<m;i++)< p="">{for(j=0;j<n;j++)< p="">{scanf("%d",&a[i][j]);}}}void print(int a[][N],int m,int n){int i,j;for(i=0;i<m;i++)< p="">{for(j=0;j<n;j++)< p="">{printf("%4d",a[i][j]);}printf("\n");}}void sum(int a[][N],int b[][N],int m,int n) {int i,j;int c[M][N];for(i=0;i<m;i++)< p="">{for(j=0;j<n;j++)< p="">{c[i][j]=a[i][j]+b[i][j];}}print(c,M,N);}P198 7模拟骰子投掷#include#include#define N 10000int main(){int a[N],i;double x=0,y=0,z=0,l=0,m=0,n=0; for(i=0;i<n;i++)< p="">{a[i]=rand()%6+1;if(a[i]==1)x++;if(a[i]==2)y++;if(a[i]==3)z++;if(a[i]==4)l++;if(a[i]==5)m++;if(a[i]==6)n++;}printf("出现1的概率为:%lf\n",x/N); printf("出现2的概率为:%lf\n",y/N); printf("出现3的概率为:%lf\n",z/N); printf("出现4的概率为:%lf\n",l/N); printf("出现5的概率为:%lf\n",m/N); printf("出现6的概率为:%lf\n",n/N); return 0;}P67 1最大奇、偶数#include#define M 10int main(){int i,a[M];int max1=-1,max2=-1;for(i=0;i<m;i++)< p="">{printf("请输入第%d个正整数:",i+1); scanf("%d",&a[i]);}for(i=0;i<m;i++)< p="">{if(a[i]%2!=0){if(a[i]>max1)max1=a[i];}else{if(a[i]>max2)max2=a[i];}}if(max1==-1)printf("没有奇数\n");elseprintf("最大奇数是%d\n",max1); if(max2==-1)printf("没有偶数\n");elseprintf("最大偶数是%d\n",max2); return 0;}P69 3#includeint main(){int a[20];int p=0,n=0,i,j=0;double avg,sum=0;printf("请输入非0整数:"); while(1){scanf("%d",&a[j]);if(a[j]==0)break;j++;}for(i=0;i<j;i++)< p="">{sum=sum+a[i];}avg=sum/j;printf("平均数:%lf",avg);for(i=0;i<j;i++)< p="">{if(a[i]>0)p++;if(a[i]<0)n++;}printf("正数个数:%d 负数个数:%d\n",p,n); return 0;}P75 2冒泡排序#include#define N 10void bubble_sort(int a[],int n);void main(){int i, a[N]={1,3,6,8,9,2,11,12,14,7}; printf("原数组为:\n");for(i=0;i<n;i++)< p="">{printf("%4d",a[i]);}bubble_sort(a,N);printf("\n");}void bubble_sort(int a[],int n) {int i,j,tmp;for(i=0;i<n-1;i++)< p=""> {for(j=0;j<n-i-1;j++)< p=""> {if(a[j]>a[j+1]){tmp=a[j];a[j]=a[j+1];a[j+1]=tmp;}}}printf("\n");printf("排序后的数组为:\n"); for(i=0;i<n;i++)< p=""> {printf("%4d",a[i]);}}P76 3 成绩#includevoid input(int cla[50][3],int n); void print(int cla[50][3],int n);void sort(int cla[50][3],int n);void main(){int cla[50][3];int n;printf("请输入学生人数(小于50):\n"); scanf("%d",&n);if(n<=0 || n>=50)printf("error,请输入正确的人数。

C 面向对象程序设计课后答案(谭浩强)

C  面向对象程序设计课后答案(谭浩强)

C++面向对象程序设计课后答案(1-4章)第一章:面向对象程序设计概述[1_1]什么是面向对象程序设计?面向对象程序设计是一种新型的程序设计范型。

这种范型的主要特征是:程序=对象+消息。

面向对象程序的基本元素是对象,面向对象程序的主要结构特点是:第一:程序一般由类的定义和类的使用两部分组成,在主程序中定义各对象并规定它们之间传递消息的规律。

第二:程序中的一切操作都是通过向对象发送消息来实现的,对象接受到消息后,启动有关方法完成相应的操作。

面向对象程序设计方法模拟人类习惯的解题方法,代表了计算机程序设计新颖的思维方式。

这种方法的提出是软件开发方法的一场革命,是目前解决软件开发面临困难的最有希望、最有前途的方法之一。

[1_2]什么是类?什么是对象?对象与类的关系是什么?在面向对象程序设计中,对象是描述其属性的数据以及对这些数据施加的一组操作封装在一起构成的统一体。

对象可以认为是:数据+操作在面向对象程序设计中,类就是具有相同的数据和相同的操作的一组对象的集合,也就是说,类是对具有相同数据结构和相同操作的一类对象的描述。

类和对象之间的关系是抽象和具体的关系。

类是多个对象进行综合抽象的结果,一个对象是类的一个实例。

在面向对象程序设计中,总是先声明类,再由类生成对象。

类是建立对象的“摸板”,按照这个摸板所建立的一个个具体的对象,就是类的实际例子,通常称为实例。

[1_3]现实世界中的对象有哪些特征?请举例说明。

对象是现实世界中的一个实体,其具有以下一些特征:(1)每一个对象必须有一个名字以区别于其他对象。

(2)需要用属性来描述它的某些特性。

(3)有一组操作,每一个操作决定了对象的一种行为。

(4)对象的操作可以分为两类:一类是自身所承受的操作,一类是施加于其他对象的操作。

例如:雇员刘名是一个对象对象名:刘名对象的属性:年龄:36 生日:1966.10.1 工资:2000 部门:人事部对象的操作:吃饭开车[1_4]什么是消息?消息具有什么性质?在面向对象程序设计中,一个对象向另一个对象发出的请求被称为“消息”。

C 课后习题答案第七章

C  课后习题答案第七章

C++作业答案第7章继承7.1 选择题1.在c++中,类与类之间的继承关系具有( c )。

(a) 自反性 (b) 对称性 (c) 传递性 (d) 反对称性2.下列关于类的继承描述中,( a,b )是错误的。

(a) 派生类可以访问基类的所有数据成员,调用基类的所有成员函数(b) 派生类也是基类,所以基类具有派生类的全部属性和方法(c) 继承描述类的层次关系,派生类可以具有与基类相同的属性和方法(d) 一个基类可以有多个派生类,一个派生类可以有多个基类3.当一个派生类公有继承一个基类时,基类中的所有公有成员成为派生类的( a )。

(a) public 成员 (b)private成员(c) protected成员 (d)友员4.当一个派生类私有继承一个基类时,基类中的所有公有成员和保护成员成为派生类的( b )。

(a) public 成员 (b)private成员(c) protected成员 (d)友员5.当一个派生类保护继承一个基类时,基类中的所有公有成员和保护成员成为派生类的( c )。

(a) public 成员 (b)private成员(c) protected成员 (d)友员6.不论派生类以何种方式继承基类,都不能使用基类的( b )。

(a) public 成员 (b)private成员(c) protected成员 (d)public 成员和protected成员7.下面描述中,错误的是( b, c )。

(a) 在基类定义的public成员在公有继承的派生类中可见,也能在类外被访问(b) 在基类定义的public和protected成员在私有继承的派生类中可见,在类外可以被访问(c) 在基类定义的public和protected成员在保护继承的派生类中不可见(d) 在派生类中不可见的成员要变成可访问的需进行访问声明8.在c++中,不能被派生类继承的函数是( b,c )。

(a) 成员函数 (b)构造函数(c) 析构函数 (d)静态成员函数9.在创建派生类对象时,构造函数的执行顺序是( d )。

《C++面向对象程序设计答案》-第七章--谭浩强-清华大学出版社

《C++面向对象程序设计答案》-第七章--谭浩强-清华大学出版社

1:解法一解法一#include <iostream> #include <cmath> using namespace std; int main() {double a,b,c,s,area; cout<<"please input a,b,c:"; cin>>a>>b>>c; if (a+b<=c) cerr<<"a+b<=c,error!"<<endl; else if(b+c<=a) cerr<<"b+c<=a,error!"<<endl; else if (c+a<=b) cerr<<"c+a<=b,error!"<<endl; else {s=(a+b+c)/2; area=sqrt(s*(s-a)*(s-b)*(s-c)); cout<<"area="<<area<<endl;} return 0; } 1:解法二:解法二#include <iostream> #include <cmath> using namespace std; void input(double a,double b,double c) {cout<<"please input a,b,c:"; cin>>a>>b>>c; } void area(double a,double b,double c) {double s,area; if (a+b<=c) cerr<<"a+b<=c,error!"<<endl; else if(b+c<=a) cerr<<"b+c<=a,error!"<<endl; else if (c+a<=b) cerr<<"c+a<=b,error!"<<endl; else {s=(a+b+c)/2; area=sqrt(s*(s-a)*(s-b)*(s-c)); cout<<"area="<<area<<endl;} } int main() {double a=2,b=3,c=5; input(a,b,c); area(a,b,c); return 0; } 2:解法一:解法一#include <iostream> #include <iomanip> using namespace std; int main() {float a[5]; cout<<"input data:"; for(int i=0;i<5;i++) cin>>a[i]; cout<<se osflags(ios::fixed)<<setprecision(2); for(i=0;i<5;i++) cout<<setw(10)<<a[i]<<endl; return 0; } 2:解法二:解法二#include <iostream> using namespace std; int main() {float a[5]; int i; cout<<"input data:"; for(i=0;i<5;i++) cin>>a[i]; cout.se (ios::fixed); cout.precision(2); for(i=0;i<5;i++) {cout.width(10); cout<<a[i]<<endl;} return 0; } 3:#include <iostream> #include <iomanip> using namespace std; int main() { for(int n=1;n<8;n++) cout<<setw(20-n)<<se ill(' ')<<" " //nm <<setw(2*n-1)<<se ill('B')<<"B"<<endl; } 4:#include <iostream> #include <fstream> using namespace std; //VC++ 6.0要此行要此行//fun1函数从键盘输入20个整数,分别存放在两个磁盘文件中个整数,分别存放在两个磁盘文件中void fun1() {int a[10]; ofstream ou ile1("f1.dat"),ou ile2("f2.dat"); //分别定义两个文件流对象分别定义两个文件流对象if(!ou ile1) //检查打开f1.dat是否成功是否成功 {cerr<<"open f1.dat error!"<<endl; exit(1); } if(!ou ile2) //检查打开f2.dat是否成功是否成功 {cerr<<"open f2.dat error!"<<endl; exit(1); } cout<<"enter 10 integer numbers:"<<endl; for(int i=0;i<10;i++) //输入10个数存放到f1.dat文件中文件中{cin>>a[i]; ou ile1<<a[i]<<" ";} cout<<"enter 10 integer numbers:"<<endl; for(i=0;i<10;i++) //输入10个数存放到f2.dat文件中文件中{cin>>a[i]; ou ile2<<a[i]<<" ";} ou ile1.close(); //关闭f1.dat文件文件ou ile2.close(); //关闭f2.dat文件文件} //从f1,dat读入10个数,然后存放到f2.dat文件原有数据的后面文件原有数据的后面void fun2() {ifstream infile("f1.dat"); //f1.dat作为输入文件作为输入文件if(!infile) {cerr<<"open f1.dat error!"<<endl; exit(1); } ofstream ou ile("f2.dat",ios::app); //f2.dat作为输出文件,文件指针指向文件尾,向它写入的数据放在原来数据的后面作为输出文件,文件指针指向文件尾,向它写入的数据放在原来数据的后面 if(!ou ile) {cerr<<"open f2.dat error!"<<endl; exit(1); } for(int i=0;i<10;i++) {infile>>a; //磁盘文件f2.dat读入一个整数读入一个整数ou ile<<a<<" "; //将该数存放到f2.dat中} infile.close(); ou ile.close(); } //从f2.dat中读入20个整数,将它们按从小到大的顺序存放到f2.dat void fun3() {ifstream infile("f2.dat"); //定义输入文件流定义输入文件流infile,以输入方式打开f2.dat if(!infile) {cerr<<"open f2.dat error!"<<endl; exit(1); } int a[20]; int i,j,t; for(i=0;i<20;i++) infile>>a[i]; //从磁盘文件f2.dat读入20个数放在数组a中for(i=0;i<19;i++) //用起泡法对20个数排序个数排序for(j=0;j<19-i;j++) if(a[j]>a[j+1]) {t=a[j];a[j]=a[j+1];a[j+1]=t;} infile.close(); //关闭输入文件f2.dat ofstream ou ile("f2.dat",ios::out); // f2.dat作为输出文件,文件中原有内容删除作为输出文件,文件中原有内容删除if(!ou ile) {cerr<<"open f2.dat error!"<<endl; exit(1);} cout<<"data in f2.dat:"<<endl; for( i=0;i<20;i++) {ou ile<<a[i]<<" "; //向f2.dat输出已排序的20个数个数 cout<<a[i]<<" ";} //同时输出到显示器同时输出到显示器cout<<endl; ou ile.close(); } int main() {fun1(); //分别调用3个函数个函数fun2(); fun3(); return 0; } 5:#include <iostream> #include <fstream> using namespace std; struct staff {int num; char name[20]; int age; double pay; }; int main() {staff staf[7]={2101,"Li",34,1203,2104,"Wang",23,674.5,2108,"Fun",54,778, 3006,"Xue",45,476.5,5101,"Ling",39,656.6},staf1; fstream iofile("staff.dat",ios::in|ios::out|ios::binary); if(!iofile) {cerr<<"open error!"<<endl; abort(); } int i,m,num; cout<<"Five staff :"<<endl; for(i=0;i<5;i++) {cout<<staf[i].num<<" "<<staf[i].name<<" "<<staf[i].age<<" "<<staf[i].pay<<endl; iofile.write((char *)&staf[i],sizeof(staf[i]));} cout<<"please input data you want insert:"<<endl; for(i=0;i<2;i++) {cin>>staf1.num>>>>staf1.age>>staf1.pay; iofile.seekp(0,ios::end); iofile.write((char *)&staf1,sizeof(staf1));} iofile.seekg(0,ios::beg); for(i=0;i<7;i++) {iofile.read((char *)&staf[i],sizeof(staf[i])); cout<<staf[i].num<<" "<<staf[i].name<<" "<<staf[i].age<<" "<<staf[i].pay<<endl; } bool find; cout<<"enter number you want search,enter 0 to stop."; cin>>num; while(num) {find=false; iofile.seekg(0,ios::beg); for(i=0;i<7;i++) {iofile.read((char *)&staf[i],sizeof(staf[i])); if(num==staf[i].num) {m=iofile.tellg(); cout<<num<<" is No."<<m/sizeof(staf1)<<endl; cout<<staf[i].num<<" "<<staf[i].name<<" "<<staf[i].age<<" "<<staf[i].pay<<endl; find=true; break; } } if(!find) cout<<"can't find "<<num<<endl; cout<<"enter number you want search,enter 0 to stop."; cin>>num; } iofile.close(); return 0; } 6:解法一:解法一#include <iostream> #include <strstream> using namespace std; struct student {int num; char name[20]; double score; }; int main() {student stud[3]={1001,"Li",78,1002,"Wang",89.5,1004,"Fun",90},stud1[3]; char c[50]; int i; ostrstream strout(c,50); for(i=0;i<3;i++) strout<<stud[i].num<<" "<<stud[i].name<<" "<<stud[i].score<<" "; strout<<ends; cout<<"array c:"<<endl<<c<<endl<<endl; istrstream strin(c,50); for(i=0;i<3;i++) strin>>stud1[i].num>>stud1[i].name>>stud1[i].score; cout<<"data from array c to array stud1:"<<endl; for(i=0;i<3;i++) cout<<stud1[i].num<<" "<<stud1[i].name<<" "<<stud1[i].score<<endl; cout<<endl; return 0; } 6:解法二:解法二#include <iostream> #include <strstream> using namespace std; struct student {int num; char name[20]; double score; }; int main() {int i; student stud[3]={1001,"Li",78,1002,"Wang",89.5,1004,"Fun",90},stud1[3]; char c[50]; strstream strio(c,50,ios::in|ios::out); for(i=0;i<3;i++) strio<<stud[i].num<<" "<<stud[i].name<<" "<<stud[i].score<<" "; strio<<ends; cout<<"array c:"<<endl<<c<<endl<<endl; for(i=0;i<3;i++) strio>>stud1[i].num>>stud1[i].name>>stud1[i].score; cout<<"data from array c to array stud1:"<<endl; for(i=0;i<3;i++) cout<<stud1[i].num<<" "<<stud1[i].name<<" "<<stud1[i].score<<endl; cout<<endl; return 0; } 。

面向对象课后题答案

面向对象课后题答案
C. 使用内联函数,可以加快程序执行的速度,但会增加程序代码的大小
D. 使用内联函数,可以减小程序代码大小,但使程序执行的速度减慢
【结果分析】
内联函数主要是解决程序的运行效率问题。在程序编译时,编译系统将程序中出现内联函数调用的地方用函数体进行替换,进而减少了程序运行的时间,但会增加程序代码的大小。它是以空间换取时间,因此内联函数适用于功能不太复杂,但要求被频繁调用的函数。
B. 对象实际是功能相对独立的一段程序
C. 各个对象间的数据可以共享是对象的一大优点
D. 在面向对象的程序中,对象之间只能通过消息相互通信
【结果分析】
对象是计算机内存中的一块区域。在对象中,不但存有数据,而且存有代码,使得每个对象在功能上相互之间保持相对独立。对象之间存在各种联系,但它们之间只能通过消息进行通信。
C. C++对C语言进行了一些改进 D. C++和C语言都是面向对象的
【结果分析】
C语言是面向过程的。C++语言是一种经过改进的更为优化的C语言,是一种混合型语言,既面向过程也面向对象。
(6) 面向对象的程序设计将数据结构与( A )放在一起,作为一个相互依存、不可分割的整体来处理。
A. 算法 B. 信息 C. 数据隐藏 D. 数据抽象
四、 判断题
(1) 在高级程序设计语言中,一般用类来实现对象,类是具有相同属性和行为的一组对象的集合,它是创建对象的模板。( √ )
(2) C++语言只支持面向对象技术的抽象性、封装性、继承性等特性,而不支持多态性。( × )
【结果分析】
C++语言不仅支持面向对象技术的抽象性、封装性、继承性等特性,而且支持多态性。

c 面向对象程序设计教程习题答案

c 面向对象程序设计教程习题答案

c 面向对象程序设计教程习题答案C面向对象程序设计教程习题答案在学习C面向对象程序设计的过程中,习题答案是非常重要的一部分。

通过练习习题,可以加深对知识点的理解,提高编程能力。

下面我们就来看一些常见的C面向对象程序设计习题及其答案。

1. 什么是面向对象程序设计?面向对象程序设计是一种程序设计范式,它以对象为中心,通过封装、继承和多态等特性来组织和管理代码。

面向对象程序设计可以提高代码的可维护性和可重用性,是现代软件开发中非常重要的一部分。

2. 什么是类和对象?类是一种抽象的数据类型,它描述了一类对象的共同特征和行为。

对象是类的实例,它具体描述了一个具体的实体。

在C面向对象程序设计中,类和对象是非常重要的概念。

3. 请编写一个简单的类和对象的例子。

```c#include <stdio.h>// 定义一个简单的类class Person {public:int age;char name[20];void display() {printf("Name: %s, Age: %d\n", name, age);}};int main() {// 创建一个对象Person p;p.age = 25;strcpy(, "Alice");p.display();return 0;}```4. 什么是封装?封装是面向对象程序设计中的一种重要特性,它将数据和行为封装在一个类中,对外部隐藏了内部的实现细节。

封装可以保护数据的安全性,同时提供了简单的接口供外部访问。

5. 请编写一个简单的封装例子。

```c#include <stdio.h>// 定义一个简单的类class Circle {private:double radius;public:void setRadius(double r) {radius = r;}double getArea() {return 3.14 * radius * radius;}};int main() {// 创建一个对象Circle c;c.setRadius(5.0);printf("Area: %f\n", c.getArea());return 0;}```以上就是一些常见的C面向对象程序设计习题及其答案。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

1.概念填空题C++最重要的特性之一就是代码重用,为了实现代码重用,代码必须具有通用性。

通用代码需要不受数据类型的影响,并且可以自动适应数据类型的变化。

这种程序设计类型称为参数化程序设计。

模板是C++支持参数化程序设计的工具,通过它可以实现参数化多态性性。

函数模板的定义形式是template <模板参数表> 返回类型函数名(形式参数表){…}。

其中,<模板参数表>中参数可以有多个,用逗号分开。

模板参数主要是模板类型参数。

它代表一种类型,由关键字typename或class后加一个标识符构成,标识符代表一个潜在的内置或用户定义的类型参数。

类型参数由可以是任意合法标识符。

C++规定参数名必须在函数定义中至少出现一次。

编译器通过如下匹配规则确定调用那一个函数:首先,寻找最符合函数名和参数类型的一般函数,若找到则调用该函数;否则寻找一个函数模板,将其实例化成一个模板函数,看是否匹配,如果匹配,就调用该模板函数;再则,通过类型转换规则进行参数的匹配。

如果还没有找到匹配的函数则调用错误。

如果有多于一个函数匹配,则调用产生二义性,也将产生错误。

类模板使用户可以为类声明一种模式,使得类中的某些数据成员、某些成员函数的参数、某些成员函数的返回值能取任意类型(包括系统预定类型和用户自定义的类型)。

类是对一组对象的公共性质的抽象,而类模板则是对不同类的数据类型的抽象,因此类模板是属于更高层次的抽象。

由于类模板需要一种或多种类型参数,所以类模板也常常称为参数化类。

2. 简答题简述函数模板生成函数的过程。

简述类模板生成对象的过程。

简述函数模板与模板函数、类模板与模板类的区别。

3. 选择题关于函数模板,描述错误的是(A )。

A.函数模板必须由程序员实例化为可执行的函数模板B.函数模板的实例化由编译器实现C.一个类定义中,只要有一个函数模板,则这个类是类模板D.类模板的成员函数都是函数模板,类模板实例化后,成员函数也随之实例化下列的模板说明中,正确的是(D )。

<typename T1,T2><class T1,T2><class T1,class T2><typename T1,typename T2>函数模板定义如下:template <typename T>Max( T a, T b ,T &c){c=a+b;}下列选项正确的是(B )。

A. int x, y; char z; x, y, z;Max(x, y, z); Max( x, y, z);x, y; float z; x; double y, z;Max( x, y, z); Max( x,y, z);下列有关模板的描述错误的是(D)。

A.模板把数据类型作为一个设计参数,称为参数化程序设计。

B.使用时,模板参数与函数参数相同,是按位置而不是名称对应的。

C.模板参数表中可以有类型参数和非类型参数。

D.类模板与模板类是同一个概念。

类模板的使用实际上是将类模板实例化成一个(C)。

A.函数B.对象C.类D.抽象类类模板的模板参数(D)。

A.只能作为数据成员的类型B.只可作为成员函数的返回类型C.只可作为成员函数的参数类型D.以上三种均可类模板的实例化(A)。

A.在编译时进行B.属于动态联编C.在运行时进行D.在连接时进行以下类模板定义正确的为(A)。

A.template<class T,int i=0> B.template<class T,class int i>C.template<class T,typename T> D.template<class T1,T2>4.编程题设计一个函数模板,其中包括数据成员T a[n]以及对其进行排序的成员函数 sort( ),模板参数T可实例化成字符串。

#include <iostream>#include <string>using namespace std;template<typename T>void Sort(T* a,int n){int i,j;T t;for(i=0;i<n-1;i++)for(j=0;j<n-i-1;j++)if (a[j]>a[j+1]){ t=a[j];a[j]=a[j+1];a[j+1]=t;}}template<typename T>void Print(T* a,int n){int i;for(i=0;i<n;i++)cout<<a[i]<<" ";cout<<endl;}int main(){stringStr[10]={"Zhang","Li","Wang","Qian","Zhao","Wu","Xu","Tang","Shen","Liang"};int Int[8]={20,12,0,-5,9,-18,6,11};double Dou[7]={,,,6,10,-9,};Sort<string>(Str,10);Sort<int>(Int,8);Sort<double>(Dou,7);Print(Str,10);Print(Int,8);Print(Dou,7);return 0;}设计一个类模板,其中包括数据成员T a[n]以及在其中进行查找数据元素的函数int search(T)模板参数 T可实例化成字符串。

#include <iostream>using namespace std;template<typename T,int n>class A{int size;T* element;public:A();~A();int Search(T);void SetElement(int index,const T& value);};template<typename T,int n>A<T,n>::A(){size=n>1 n:1;element=new T[size];}template<typename T,int n>A<T,n>::~A(){delete [] element;}template<typename T,int n>int A<T,n>::Search(T t){int i;for(i=0;i<size;i++)if(element[i]==t)return i;return -1;}template<typename T,int n>void A<T,n>::SetElement(int index,const T& value){ element[index]=value;}int main(){A<int,5> intAry; //用int实例化,建立模板类对象A<double,10> douAry;//用double实例化,建立模板类对象int i;for(i=0;i<5;i++)(i,i+3);for(i=0;i<10;i++)(i,(i+i)*;i=(7);if(i>=0)cout<<i<<endl;i=;if(i>=0)cout<<i<<endl;return 0;}设计一个单向链表类模板,节点数据域中数据从小到大排列,并设计插入、删除节点的成员函数。

#include<iostream>using namespace std;template<typename T>class List;template<typename T>class Node{T info; //数据域Node<T> *link; //指针域public:Node(); //生成头结点的构造函数Node(const T & data);//生成一般结点的构造函数friend class List<T>;};template <typename T> Node<T>::Node(){link=NULL;}template <typename T> Node<T>::Node(const T & data){info=data;link=NULL;}//定义链表类template<typename T>class List{Node<T> *head; //链表头指针和尾指针public:List(); //构造函数,生成头结点(空链表)~List(); //析构函数void MakeEmpty(); //清空一个链表,只余表头结点Node<T>* Find(T data); //搜索数据域与data相同的结点,返回该结点的地址void PrintList(); //打印链表的数据域void InsertOrder(Node<T> *p); //按升序生成链表Node<T>* CreatNode(T data); //创建一个结点(孤立结点)Node<T>* DeleteNode(Node<T>* p); //删除指定结点};template<typename T>List<T>::List(){head=new Node<T>(-9999);//头结点,最小的数据从小到大插入}template<typename T>List<T>::~List(){MakeEmpty();delete head;}template<typename T>void List<T>::MakeEmpty(){Node<T> *tempP;while(head->link!=NULL){tempP=head->link;head->link=tempP->link; //把头结点后的第一个节点从链中脱离delete tempP; //删除(释放)脱离下来的结点}}template<typename T> Node<T>* List<T>::Find(T data){Node<T> *tempP=head->link;while(tempP!=NULL && tempP->info!=data) tempP=tempP->link;return tempP; //搜索成功返回该结点地址,不成功返回NULL}template<typename T>void List<T>::PrintList(){Node<T>* tempP=head->link;while(tempP!=NULL){cout<<tempP->info<<'\t';tempP=tempP->link;}cout<<endl;}template<typename T>void List<T>::InsertOrder(Node<T> *p){Node<T> *tempP=head,*tempQ=head; //tempQ指向tempP前面的一个节点while(tempP!=NULL){if(p->info<tempP->info)break; //找第一个比插入结点大的结点,由tempP指向tempQ=tempP;tempP=tempP->link;}p->link=tempP;tempQ->link=p;}template<typename T>Node<T>* List<T>::CreatNode(T data){//建立新节点Node<T>*tempP=new Node<T>(data);return tempP;}template<typename T>Node<T>* List<T>::DeleteNode(Node<T>* p){Node<T>* tempP=head->link,*tempQ=head,*tempC;while(tempP!=NULL && tempP!=p){tempQ=tempP;tempP=tempP->link;}tempC=tempP;tempQ->link=tempP->link;return tempC;}int main(){Node<int> * P1;List<int> list1;int a[10]={20,12,0,-5,9,-18,6,11,5,3},i,j;for(i=0;i<10;i++){P1=(a[i]);(P1);}();cout<<"请输入一个要求删除的整数"<<endl;cin>>j;P1=(j);if(P1!=NULL){P1=(P1);delete P1;();}else cout<<"未找到"<<endl;cout<<"请输入一个要求插入的整数"<<endl;cin>>j;P1=(j);(P1);();();//清空list1();return 0;}为单链表类模板增加一个复制构造函数和赋值运算符(=)。

相关文档
最新文档