c++面向对象课后答案第9章
- 格式:doc
- 大小:121.00 KB
- 文档页数:14
9-3编写程序,使用结构体类型,输出一年十二个月的英文名称及相应天数。
解:#include "stdio.h"struct date{char month[10] ;int daynumber ;}main(){int i ;struct datea[12]={{"January",31},{"February",29},{"March",31},{"Aprial",30},{ "May",31},{"June",30},{"july",31},{"August",31},{"September",30}, {"October",31},{"November",30},{"December",31}} ;for(i=0;i<12;i++);printf("%d 月:%s %d\n",i+1,a[i].month,a[i].daynumber) ;}思考:如何对结构体变量进行初始化?对结构体变量的引用为何要体现为分量(或成员)的引用?9-4 编写程序求空间任一点到原点的距离,点用结构体描述。
并请考虑求空间中任意两点的距离的程序。
解:#include "stdio.h"#include "math.h"struct point{float x ;float y ;float z ;} main(){double d1,d2,d ;struct point p1,p2 ;printf("请输入第一个点的坐标:");scanf("%f,%f,%f",&p1.x,&p1.y,&p1.z);printf("请输入第二个点的坐标:");scanf("%f,%f,%f",&p2.x,&p2.y,&p2.z);d1=sqrt(p1.x*p1.x+p1.y*p1.y+p1.z*p1.z);d2=sqrt(p2.x*p2.x+p2.y*p2.y+p2.z*p2.z);d=sqrt((p2.x-p1.x)*(p2.x-p1.x)+(p2.y-p1.y)*(p2.y-p1.y)+(p2.z-p1.z)*( p2.z-p1.z));printf("第一个点到原点的距离:%f\n",d1);printf("第二个点到原点的距离:%f\n",d2);printf("两点间的距离:%f\n",d);}9-5 编写输入、输出10个朋友数据的通讯录程序,每个朋友数据包括姓名、地址、邮编、电话、传呼、手机等数据。
#include<stdio.h>struct student{int xuehao;char name[20];float yuwen,shuxue,yingyu,ave;};float aver(float yuwen,float shuxue,float yingyu){float y;y=(yuwen+shuxue+yingyu)/3.0;return y;}main(){struct student a;printf("Enter xuehao:\n");scanf("%d",&a.xuehao);printf("Enter name:\n");scanf("%s",&);printf("Enter yuwen:\n");scanf("%f",&a.yuwen);printf("Enter shuxue:\n");scanf("%f",&a.shuxue);printf("Enter yingyu:\n");scanf("%f",&a.yingyu);a.ave=aver(a.yuwen,a.shuxue,a.yingyu);printf("xuehao:%d name:%s yuwen:%f shuxue:%f yingyu:%f ave:%f\n",a.xuehao,,a.yuwen,a.shuxue,a.yingyu,a.ave);}/*练习9-6*/#include<stdio.h>struct student{int xuehao;char name[20];float yuwen,shuxue,yingyu,ave;};float aver(float yuwen,float shuxue,float yingyu){y=(yuwen+shuxue+yingyu)/3.0;return y;}main(){int i;struct student a;for(i=1;i<=100;i++){printf("请输入第%d个学生的信息:\n",i);printf("请输入学号:\n");scanf("%d",&a.xuehao);printf("请输入姓名:\n");scanf("%s",&);printf("请输入语文成绩:\n");scanf("%f",&a.yuwen);printf("请输入数学成绩:\n");scanf("%f",&a.shuxue);printf("请输入英语成绩:\n");scanf("%f",&a.yingyu);a.ave=aver(a.yuwen,a.shuxue,a.yingyu);printf("学号:%d 姓名:%s 语文:%f 数学:%f 英语:%f 平均分:%f\n",a.xuehao,,a.yuwen,a.shuxue,a.yingyu,a.ave);}}。
第一章:面向对象程序设计概述[1_1]什么是面向对象程序设计?面向对象程序设计是一种新型的程序设计范型。
这种范型的主要特征是:程序=对象+消息。
面向对象程序的基本元素是对象,面向对象程序的主要结构特点是:第一:程序一般由类的定义和类的使用两部分组成,在主程序中定义各对象并规定它们之间传递消息的规律。
第二:程序中的一切操作都是通过向对象发送消息来实现的,对象接受到消息后,启动有关方法完成相应的操作。
面向对象程序设计方法模拟人类习惯的解题方法,代表了计算机程序设计新颖的思维方式。
这种方法的提出是软件开发方法的一场革命,是目前解决软件开发面临困难的最有希望、最有前途的方法之一。
[1_2]什么是类?什么是对象?对象与类的关系是什么?在面向对象程序设计中,对象是描述其属性的数据以及对这些数据施加的一组操作封装在一起构成的统一体。
对象可以认为是:数据+操作在面向对象程序设计中,类就是具有相同的数据和相同的操作的一组对象的集合,也就是说,类是对具有相同数据结构和相同操作的一类对象的描述。
类和对象之间的关系是抽象和具体的关系。
类是多个对象进行综合抽象的结果,一个对象是类的一个实例。
在面向对象程序设计中,总是先声明类,再由类生成对象。
类是建立对象的“摸板”,按照这个摸板所建立的一个个具体的对象,就是类的实际例子,通常称为实例。
[1_3]现实世界中的对象有哪些特征?请举例说明。
对象是现实世界中的一个实体,其具有以下一些特征:(1)每一个对象必须有一个名字以区别于其他对象。
(2)需要用属性来描述它的某些特性。
(3)有一组操作,每一个操作决定了对象的一种行为。
(4)对象的操作可以分为两类:一类是自身所承受的操作,一类是施加于其他对象的操作。
例如:雇员刘名是一个对象对象名:刘名对象的属性:年龄:36 生日:1966.10.1 工资:2000 部门:人事部对象的操作:吃饭开车[1_4]什么是消息?消息具有什么性质?在面向对象程序设计中,一个对象向另一个对象发出的请求被称为“消息”。
c语言习题第九章答案C语言习题第九章答案第九章是C语言学习中的一个重要章节,主要涉及指针和动态内存分配的知识。
在这一章中,我们将学习如何使用指针来操作内存,并且了解动态内存分配的概念和用法。
本文将为大家提供第九章习题的答案,帮助大家更好地理解和掌握这些知识。
1. 以下代码的输出结果是什么?```c#include <stdio.h>int main() {int arr[] = {1, 2, 3, 4, 5};int *ptr = arr;printf("%d\n", *ptr++);printf("%d\n", *ptr++);printf("%d\n", *ptr++);return 0;}```答案:输出结果为1、2、3。
解析:在这段代码中,我们定义了一个整型数组arr,并且定义了一个指针ptr,将arr的首地址赋值给ptr。
在输出语句中,我们使用了后置自增运算符,这意味着先输出ptr指向的值,然后再将指针ptr的值加1。
因此,第一个输出语句输出的是arr[0]的值1,第二个输出语句输出的是arr[1]的值2,第三个输出语句输出的是arr[2]的值3。
2. 以下代码的输出结果是什么?```c#include <stdio.h>int main() {int arr[] = {1, 2, 3, 4, 5};int *ptr = arr;printf("%d\n", *(ptr++));printf("%d\n", *(ptr++));printf("%d\n", *(ptr++));return 0;}```答案:输出结果为1、2、3。
解析:这段代码与上一题的代码非常相似,唯一的区别在于输出语句中对指针的解引用操作使用了括号。
这是因为后置自增运算符的优先级比解引用运算符高,为了保证先解引用再自增,我们需要使用括号来明确优先级。
第九章流类库和输入/输出习题一.本概念与基础知识测试题9.1填空题9.1.1 在C++中“流”是表示(1)。
从流中取得数据称为(2),用符号(3)表示;向流中添加数据称为(4),用符号(5)表示。
答案:(1)数据从一个对象到另一个对象的传送(2)提取操作(3)>>(4)插入操作(5)<<9.1.2 抽象类模板(1)是所有基本流类的基类,它有一个保护访问限制的指针指向类(2),其作用是管理一个流的(3)。
C++流类库定义的cin,cout,cerr和clog是(4)。
cin通过重载(5)执行输入,而cout,cerr和clog通过(6)执行输出。
答案:(1)basic_ios(2)basic_streambuf(3)缓冲区(4)全局流对象(5)>>(stream_extraction operator)(6)<<(stream_insertion operator)9.1.3 C++在类ios中定义了输入输出格式控制符,它是一个(1)。
该类型中的每一个量对应两个字节数据的一位,每一个位代表一种控制,如要取多种控制时可用(2)运算符来合成,放在一个(3)访问限制的(4)数中。
所以这些格式控制符必须通过类ios的(5)来访问。
答案:(1)公有的无名的枚举类型(2)或“|”(3)保护(4)一个长整型数(5)公共接口(函数)9.1.4 取代麻烦的流格式控制成员函数,可采用(1),其中有参数的,必须要求包含(2)头文件。
答案:(1)流操作子(2)iomanip9.1.5 通常标准设备输入指(1)。
标准设备输出指(2)。
答案:(1)键盘(2)显示屏9.1.6 EOF为(1)标志,在iostream.h中定义EOF为(2),在int get()函数中读入表明输入流结束标志(3),函数返回(4)。
答案:(1)文件结束标志(2)-1(3)^Z(Ctrl-Z)(4)EOF9.1.7 C++根据文件内容的(1)可分为两类(2)和(3),前者存取的最小信息单位为(4),后者为(5)。
练习9-1答案一、选择题1.typedef unsigned long LONG的作用是( D )。
A.建立了一种新的数据类型B.定义了一个整形变量C.定义了一个长整型变量D.定义了一个新的数据类型标识符2.下面的4个运算符中,优先级最低的是( D )。
A.( ) B.. C.-> D.++3.已知:struct{int i;char c;float a;} test;则sizeof(test)的值是( D )。
A.4 B.5 C.6 D.74.当声明一个结构变量时系统分配给它的内存是( A )。
A.各成员所需内存量的总和B.结构中第一个成员所需内存量C.成员中占内存量最大者所需的容量D.结构中最后一个成员所需内存量5.以下对结构类型变量的定义中错误的是( D )。
A.typedef struct student B.struct student{ i nt num; {int num;float age; float age;} STUDENT std1; } std1;C.struct D.struct{ i nt num; {int num;float age; float age;} std1; } student;struct student std1;6.根据下面的定义,能打印出字母M的语句是( D )。
struct person{char name[9];int age;};struct person class[10]={"John", 17, "Paul", 19, "Mary", 18, "adam", 16};A.printf("%c\n", class[3].name); B.printf("%c\n", class[3].name[1]);C.printf("%c\n", class[2].name[1]); D.printf("%c\n", class[2].name[0]); 7.以下scanf函数调用语句中对结构变量成员的错误引用是( D )。
1.概念填空题1.1 C++支持两种多态性,分别是编译时和运行时。
1.2在编译时就确定的函数调用称为静态联编,它通过使用函数重载,模板等实现。
1.3在运行时才确定的函数调用称为动态联编,它通过虚函数来实现。
1.4虚函数的声明方法是在函数原型前加上关键字virtual。
在基类中含有虚函数,在派生类中的函数没有显式写出virtual关键字,系统依据以下规则判断派生类的这个函数是否是虚函数:该函数是否和基类的虚函数同名;是否与基类的虚函数参数个数相同、类型;是否与基类的虚函数相同返回类型。
如果满足上述3个条件,派生类的函数就是虚函数。
并且该函数覆盖基类的虚函数。
1.5当通过引用或指针使用虚函数时,C++会在与对象关联的派生类中正确的选择重定义的函数。
实现了运行时时多态。
而通过对象使用虚函数时,不能实现运行时时多态。
1.6 纯虚函数是一种特别的虚函数,它没有函数的函数体部分,也没有为函数的功能提供实现的代码,它的实现版本必须由派生类给出,因此纯虚函数不能是友元函数。
拥有纯虚函数的类就是抽象类类,这种类不能实例化。
如果纯虚函数没有被重载,则派生类将继承此纯虚函数,即该派生类也是抽象。
1.7 类的构造函数不可以 (可以/不可以)是虚函数,类的析构函数可以(可以/不可以)是虚函数。
当类中存在动态内存分配时经常将类的析构函数函数声明成虚函数。
2.简答题2.1在C++中,能否声明虚构造函数?为什么?能否声明虚析构函数?为什么?2.2 什么是抽象类?抽象类有何作用?可以声明抽象类的对象吗?为什么?2.3多态性和虚函数有何作用?2.4是否使用了虚函数就能实现运行时的多态性?怎样才能实现运行时的多态性?2.5为什么析构函数总是要求说明为虚函数?3.选择题3.1在C++中,要实现动态联编,必须使用(D)调用虚函数。
A.类名B.派生类指针C.对象名D.基类指针3.2下列函数中,不能说明为虚函数的是(C)。
A.私有成员函数B.公有成员函数C.构造函数D.析构函数3.3在派生类中,重载一个虚函数时,要求函数名、参数的个数、参数的类型、参数的顺序和函数的返回值(A)。
A.相同B.不同C.相容D.部分相同3.4当一个类的某个函数被说明为virtual时,该函数在该类的所有派生类中(A)。
A.都是虚函数B.只有被重新说明时才是虚函数C.只有被重新说明为virtual时才是虚函数D.都不是虚函数3.5(C)是一个在基类中说明的虚函数,它在该基类中没有定义,但要求任何派生类都必须定义自己的版本。
A.虚析构函数B.虚构造函数C.纯虚函数D.静态成员函数3.6 以下基类中的成员函数,哪个表示纯虚函数(C)。
A.virtual void vf(int);B.void vf(int)=0;C.virtual void vf( )=0;D.virtual void vf(int){ }3.7下列描述中,(D)是抽象类的特性。
A.可以说明虚函数B.可以进行构造函数重载C.可以定义友元函数D.不能定义其对象3.8类B是类A的公有派生类,类A和类B中都定义了虚函数func( ),p是一个指向类A 对象的指针,则p->A::func( )将(A)。
A.调用类A中的函数func( )B.调用类B中的函数func( )C.根据p所指的对象类型而确定调用类A中或类B中的函数func( )D.既调用类A中函数,也调用类B中的函数3.9类定义如下。
class A{public:virtual void func1( ){ }void fun2( ){ }};class B:public A{public:void func1( ) {cout<<”class B func1”<<endl;}virtual void func2( ) {cout<<”class B func2”<<endl;}};则下面正确的叙述是(A)A.A::func2( )和B::func1( )都是虚函数B.A::func2( )和B::func1( )都不是虚函数C.B::func1( )是虚函数,而A::func2( )不是虚函数D.B::func1( )不是虚函数,而A::func2( )是虚函数3.10下列关于虚函数的说明中,正确的是(B)。
A.从虚基类继承的函数都是虚函数B.虚函数不得是静态成员函数C.只能通过指针或引用调用虚函数D.抽象类中的成员函数都是虚函数4.写出下列程序运行结果4.1#include<iostream>using namespace std;class A {public:virtual void func( ) {cout<<”func in class A”<<endl;}};class B{public:virtual void func( ) {cout<<”func in class B”<<endl;}};class C:public A,public B{public:void func( ) {cout<<”func in class C”<<endl:} };int main( ){C c;A& pa=c;B& pb=c;C& pc=c;pa.func( );pb.func( );pc.func( );}func in class Cfunc in class Cfunc in class C4.2#include<iostream>using namespace std;class A{public:virtual ~A( ){cout<<”A::~A( ) called “<<endl; }};class B:public A{char *buf;public:B(int i) { buf=new char[i]; }virtual ~B( ){delete []buf;cout<<”B::~B( ) called”<<endl;}};void fun(A *a) {delete a;}int main( ){ A *a=new B(10);fun(a);}B::~B( ) calledA::~A( ) called5.程序设计题5.1有一个交通工具类vehicle,将它作为基类派生小车类car、卡车类truck和轮船类boat,定义这些类并定义一个虚函数用来显示各类信息。
#include<iostream>#include<cstring>using namespace std;class Vehicle{public:virtual void showinfo()=0;protected:char Name[20];};class Car:public Vehicle{public:Car(char *name){strcpy(Name,name);}void showinfo(){cout<<Name<<endl;}protected:int Radius;};class Truck:public Vehicle{public:Truck(char *name){strcpy(Name,name);}void showinfo(){cout<<Name<<endl;}};class Boat:public Vehicle{public:Boat(char *name){strcpy(Name,name);}void showinfo(){cout<<Name<<endl;}};int main(){Vehicle *vp;Car car("奔驰");Truck truck("运输卡车");Boat boat("游艇");vp=&car;vp->showinfo ();vp=&truck;vp->showinfo ();vp=&boat;vp->showinfo ();return 0;}5.2定义一个shape抽象类,派生出Rectangle类和Circle类,计算各派生类对象的面积Area( )。
#include<iostream>#include<cstring>using namespace std;class Shape{public:virtual void Area()=0;};class Rectangle:public Shape{public:Rectangle(double w,double h){width=w,height=h;}void Area(){cout<<width*height<<endl;}protected:double width,height;};class Circle:public Shape{public:Circle(double r){radius=r;}void Area(){cout<<3.1415*radius*radius<<endl;}protected:double radius;};int main(){Shape *sp;Rectangle re1(10,6);Circle cir1(4.0);sp=&re1;sp->Area ();sp=&cir1;sp->Area ();return 0;}5.3定义猫科动物Animal类,由其派生出猫类(Cat)和豹类(Leopard),二者都包含虚函数sound( ),要求根据派生类对象的不同调用各自重载后的成员函数。
#include<iostream>#include<fstream>using namespace std;class Animal{public:virtual void Speak()=0;};class Cat :public Animal{void Speak(){cout<<"My name is Cat"<<endl;}};class Leopard:public Animal{void Speak(){cout<<"My name is Leopard"<<endl;}};int main(){Animal *pa;Cat cat;pa=&cat;pa->Speak();Leopard leopard;pa=&leopard;pa->Speak();return 0;}5.4矩形法(rectangle)积分近似计算公式为:Δx(y0+y+….y)梯形法(1adder)积分近似计算公式为:[y0+2(y+….y)+y]辛普生法(simpson)积分近似计算公式(n为偶数)为:[y0+ y +4(y+y….y)+2(y+y+…y)]被积函数用派生类引入,定义为纯虚函数。