《C++面向对象程序设计基础》实验报告_第1页
《C++面向对象程序设计基础》实验报告_第2页
《C++面向对象程序设计基础》实验报告_第3页
《C++面向对象程序设计基础》实验报告_第4页
《C++面向对象程序设计基础》实验报告_第5页
已阅读5页,还剩33页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、西安交通大学C+面向对象程序设计基础实验报告 学院: 电子与信息工程学院 班级:计算机科学与技术x班学号: 姓名: 指导教师: 1、 面向对象的程序设计.基本概念面向对象的程序设计是通过对类、子类和对象等的设计来体现的,类是面向对象程序设计技术的核心。类:定义了对象特征以及对象外观和行为的模板。类的特征:封装性:隐藏了类中对象的内部数据或操作细节,只看到外表信息。继承性:任何类都可以从其它已有的类中派生,新类保持了父类中的行为和属性,但增加了新的功能。体现了面向对象设计方法的共享机制。多态性:相同的操作可作用于多种类型的对象上,并获得不同的结果。抽象性:提取一个类或对象与众不同的特征,而不对该

2、类或对象的所有信息进行处理。基类:系统本身提供的类称为基类。基类包括容器类和控件类。容器类是其他对象的集合,如表格、选项按钮组;控件类是单一的对象,不包含其他对象,如命令按钮、文本框。子类:以其他类定义为起点,对某一对象所建立的新类。新类将继承任何对父类所做的修改。二、C+语言基础.C+既可以用于面向过程的结构化程序设计,也可用于面向对象的程序设计。C+对C的增强体现在两个方面:1.对原来的面向过程机制做了扩充。2.增加了面向对象的机制。学习C+之后,既可以进行面向对象的程序设计,也可以进行面向过程的程序设计。. 为了与C兼容, C+保留了C语言中的一些规定,例如头文件的文件名,以C语言里头文

3、件的扩展名是 .h,许多C+编译系统保留了这种扩展名,近年推出的C+编译系统新版本,推出了一批不带扩展名的头文件如iostream,string ,cmath 等。为了兼容C+仍允许使用带扩展名的头文件。由于C语言无命名空间,因此使用带扩展名的头文件时不用using namespace std。.C+相对与c程序来说变化不大。头文件从原来的studio.h 文件变成了iostream 标准输入输出流文件,从而输入输出方式也从printf、Scanf,变成cin、 cout 。虽然cin 、cout 输入输出方式简单,但格式设计不方便,而且耗时较大。本质上,c+与c程序区别不大,两者主要区别在于

4、c+使用全新的面向对象思想。.C+基本数据类型有整数类型(int)、字符类型(char)、浮点类型(float)和双精度类型(double)、布尔类型(bool)、空类型(void)六种类型。.C+中的表达式有算术表达式(+、-、*、/、%)、赋值表达式(=)、增量表达式(+和-)、关系表达式(>、<、>=、<=、!=)、逻辑表达式(!、&&、|)、条件表达式(操作数1?操作数2:操作数3)、逗号表达式(操作数1,操作数2,操作数n)。.C+中的基本语句有空语句()、表达式语句、声明语句、条件(if)语句、switch语句、循环语句(for循环语句、wh

5、ile循环语句、do-while循环语句、break语句、continue语句)。三、类和对象.类是一个全新的概念,与c程序中结构体类似,但与其不同的是类中自带类内函数且在类中数据成员和成员函数的类型分为三种:public、 private、 protected,这三种数据类型有不同的访问权限:public可以被外界直接调用,而private与protected 需要通过函数才能被使用。类对象:在C+中,对象是类的实际变量。对象的使用格式有 对象名.数据成员名/成员函数名(实参表)。在类的外部,只有公有数据成员和公有成员函数才可以通过类的对象进行访问,而私有数据成员和成员函数只能在类的内部被访

6、问。.构造函数和析构函数:构造函数和析构函数使类对象能够轻松被创建和撤销。构造函数创建类对象,初始化类成员,析构函数撤销类对象。它们是类的特殊成员函数。.对象数组与对象指针:对象数组就是每一个数组元素都是类的对象的数组,对象指针就是用于存放对象地址的变量。对象数组定义的一般格式是 类名 对象数组名下标表达式,使用方法是 对象数组名下表表达式.成员名,对象指针的声明方式是 类名*对象指针名。四、静态成员与友元.在类定义中,类的成员可以用关键字static声明为静态的,这些成员就是静态成员,它被这类所有对象共享。类的私有成员只能在类的内部被访问,在外部要访问时,友元机制提供了很好的途径和方法。.(

7、a)友元函数:不是类的成员函数,在外部定义时,不需要加上(:)。在声明为友元函数时,需要在其函数名前加上关键字friend。(b)友元成员:一个类的成员函数要声明为另一个类的友元函数时,必须要先定义这个类。(c)友元类:友元类的声明方法是在另一个类中加入形如“friend class 类名”的语句。当一个类做另一个类的友元时,友元类中的所有成员函数都可以访问另一个类的所有成员(包括私有成员)。五、派生类与继承.继承是在已有类的基础上创建新类的过程,新类就是派生类,已有类就是基类。派生类不仅可以继承基类的功能,而且还能对基类的功能进行扩充、修改或重定义。.派生类:派生类有三种继承方式,公有继承(

8、public)、私有继承(private)、保护继承(protect)。对于public继承,基类的public和 protect成员分别继承为派生类的public和 protect成员,基类的private成员在派生类中被隐藏。.继承:继承有单一继承和多重继承两种方式。单继承的定义格式是 class 派生类名: 继承方式 基类名。多重继承的声明方式是 class 派生类名:继承方式1 基类名1,继承方式2 基类名2,继承方式n 基类名n。在C+中,要使公共基类只产生一个拷贝,应该把这个基类声明为虚基类。使用关键字virtual,语法形式是 class 派生类名:virtual 继承方式 基类

9、名。六、多态性.多态:多态性是指用一个名字定义不同的函数,这些函数执行不同但又类似的操作。这样可以极大地提高代码利用效率。.重载:函数重载,c+允许定义多个同名函数,只要这些函数属于不同的类或有不同的参数列表(类型,个数或不同类型参数的顺序至少有一个不同)。在调用重载函数时,为某类操作取一个通用的名字,而由编译器解决具体由哪个函数来执行。(析构函数无法重载)运算符重载:通过运算符重载可以使运算符在不同的上下文有不同的含义,便于程序功能的实现与修改。三大原则:1. 重载不改变优先级2. 重载不改变运算符操作数个数3. 重载不能创造新运算符.模板:模板可以利用以下的代码实现Template<

10、class T> class也可以换为typename 函数模板:模板函数可以实现多个不同类型的函数运用同种功能。模板的使用可以进行显示实例化与隐式实例化,同时,函数模板也可以进行重载。类模板:定义一个类模板是以关键字template开始,定义格式是:template<class 类型参数>Class 类名;七、虚函数当通过基类指针或引用将派生类对象作为基类使用时,覆写机制会失效,即只能访问基类中定义的成员。定义虚函数的方法是Virtual 返回类型 函数名 (参数表)、函数体在派生类中重新定义时,该函数的函数原型(包括返回类型,函数名,参数列表)必须与基类中的函数原型完全相

11、同。注意,一个类的构造函数不能是虚函数,析构函数可以为虚函数。八、实验内容1.输入3个整数,按由小到大的顺序输出输入输出格式如下:输入:2 1 3输出:1 2 3设计程序如下:#include <iostream>using namespace std;int main() int a,b,c,*p1,*p2,*p3,*p; cin>>a>>b>>c; p1=&a;p2=&b;p3=&c; if(a>b) p=p2;p2=p1;p1=p; else if(b>c) p=p3;p3=p2;p2=p; if(a&g

12、t;c) p=p3;p3=p2;p2=p; cout<<*p1<<" "<<*p2<<" "<<*p3; return 0;2.输入3个字符串,按由小到大的顺序输出输入输出格式如下输入cbaabcbac输出abcbaccba设计程序如下:#include <iostream>#include<string>using namespace std;int main()string a1,a2,a3,temp;cin>>a1>>a2>>a3

13、;if (a1>a2)temp=a1;a1=a2;a2=temp;if (a3<a2)if (a3<a1)cout<<a3<<endl<<a1<<endl<<a2;elsecout<<a1<<endl<<a3<<endl<<a2;elsecout<<a1<<endl<<a2<<endl<<a3;return 0;3.写一函数,将一个3X3的矩阵转置提示:矩阵可存放到二维数组中,用指针完成数的交换(s

14、wap)操作输入输出示例如下输入1 2 34 5 67 8 9输出1 4 72 5 83 6 9设计程序如下:#include <iostream>using namespace std;int main() int i,j,t; int a33,(*p)3,*q; for(i=0;i<3;i+) for(j=0;j<3;j+) cin>>aij; p=a; q=a0; for(i=0;i<3;i+) for(j=i;j<3;j+) t=*(q+3*i+j); *(q+3*i+j)=*(q+3*j+i); *(q+3*j+i)=t; for(p=

15、a;p<a+3;p+) q=*p;cout<<*q<<" "q+; cout<<*q<<" "q+; cout<<*q<<endl; return 0; 4.写一个函数,实现两个字符串的比较。即自己写一个strcmp函数,函数原型为int strcmp(char * p1,char * p2)设p1指向字符串s1,p2指向字符串s2。要求当s1=s2时,返回值为0;若s1s2时,返回它们二者第1个不同字符的ASCII码差值(如“BOY”与“BAD”,第2个字母不同,“O”与“A

16、”之差为79-65=14)。如果s1>s2,则输出正值;如果s1<s2,则输出负值。当1个字符串为另一个字符串从第一个字符开始的字串时,如diffculty和diffcult,输出y的ASCII码值。输入输出实例如下输入BOYBAD输出14设计程序如下:#include <iostream>using namespace std;int main() char a100,b100; char *x,*y; int k; int strcmp(char *p,char *o); cin>>a>>b; x=a; y=b; k=strcmp(x,y);

17、 cout<<k; return 0;int strcmp(char *p,char *o) int i,k; k=0; for(i=0;(*(p+i)!='0')|(*(o+i)!='0');i+=1) if (*(p+i)=*(o+i) k=0; else k=*(p+i)-*(o+i); break; return k;5.编写C+风格的程序,输出100以内的所有素数。主:各个素数之间用空格隔开。设计程序如下:#include <iostream>using namespace std;int main() int n,r,i; f

18、or(n=2;n<=100;n+) for(i=2;i<=n-1;i+) r=n%i; if(r=0) break; if(i>=n-1) cout<<n<<" "return 0;6.编写C+风格的程序,实现10个整数的冒泡排序(按递增的顺序)。注:输出的整数之间用空格隔开。设计程序如下:#include <iostream>using namespace std;int main() int a10; int i,j,t; for(i=0;i<10;i+) cin>>ai; for(i=0;i<

19、;9;i+) for(j=0;j<9-i;j+) if(aj>aj+1) t=aj; aj=aj+1; aj+1=t; for(i=0;i<10;i+) cout<<ai<<" " return 0;7.编程求三个数(假定这三个数中可以有两个或三个数相同)的最大公约数与最小公倍数。例如:输入:10 12 20输出260设计程序如下:#include <iostream>using namespace std;int main() int a,b,c,t,x,y,z;cin>>a>>b>>

20、;c;int gys(int i,int j);x=gys(gys(a,b),c);t=gys(a,b);y=a*b/t;t=gys(y,c);z=y*c/t;cout<<x<<endl<<z;return 0;int gys(int i,int j) int t;while(i!=0) t=j%i; j=i; i=t;return(j);8.用递归的方法求n!。例如:输入5输出120设计程序如下:#include <iostream>using namespace std;int main()int fac(int n);int n,y;cin

21、>>n;y=fac(n);cout<<y;return 0;int fac(int n) int f; if(n<0) cout<<"data error" else if(n=0|n=1) f=1; else f=fac(n-1)*n; return(f);9.n个人围成一圈,顺序排号。从第1个人开始报数(从1到3报数),凡是报到3的人退出圈子,问最后留下的是原来第几号的那位。(用指针实现)例如:输入8输出7设计程序如下:#include <iostream>using namespace std;int main()

22、 int i,k,m,n,num50,*p;cin>>n;p=num;for(i=0;i<n;i+)*(p+i)=i+1;i=0;k=0;m=0;while(m<n-1)if(*(p+i)!=0)k+;if(k=3)*(p+i)=0;k=0;m+;i+;if(i=n)i=0;while(*p=0)p+;cout<<*p;return 0;10.建立一个链表(可以存放10个整数),给链表结点赋值,并输出。例如:输入9 8 7 6 5 4 3 2 1 10输出9 8 7 6 5 4 3 2 1 10设计程序如下:#include <iostream>

23、using namespace std;struct form int num; struct form *next;int main() struct form a,b,c,d,e,f,g,h,i,j,*head,*p; cin>>a.num>>b.num>>c.num>>d.num>>e.num>>f.num>>g.num>>h.num>>i.num>>j.num; head=&a; a.next=&b; b.next=&c; c.next=&am

24、p;d; d.next=&e; e.next=&f; f.next=&g; g.next=&h; h.next=&i; i.next=&j; j.next=NULL; p=head; do cout<<p->num<<" " p=p->next; while(p->next)!=NULL); cout<<p->num; return 0;11.有n个整数,使其前面各数顺序向后移m个位置,最后m个数变成最前面的m个数(用指针实现)。例如:输入:812 43 65 67

25、8 2 7 113输出2 7 11 12 43 65 67 8设计程序如下:#include <iostream>using namespace std;int main() int *p,a50,i,j,k,n,m; p=a; cin>>n; for(i=0;i<n;i+) cin>>*(p+i); cin>>k; m=k%n; for(i=0;i<m;i+) cout<<*(p+n-m+i)<<" " p=a; for(i=0;i<n-m;i+) cout<<*(p+i

26、)<<" " return 0;12.设计并定义一个矩形类(Rectangle),属性为矩形的左下与右上角的坐标,操作为计算矩形的周长和面积。例如:输入1 12 3输出6 2设计程序如下:#include <iostream>#include <math.h>using namespace std;class juxingprivate: int length,width;public: juxing(int a,int b) length=a; width=b; juxing(const juxing&p) length=p.l

27、ength; width=p.width; void print() int C,S; C=2*(length+width); S=length*width; cout<<C<<' '<<S<<endl; juxing();int main() int a,b,c,d,L,W; cin>>a>>b>>c>>d; L=fabs(a-c); W=fabs(b-d); juxing A(L,W); A.print(); return 0;15.设计一个学校在册人员类( Person )。数

28、据成员包括:身份证号( IdPerson ),姓名( Name ),性别( Sex ),生日( Birthday )和家庭住址( HomeAddress )数据类型均为字符串,字符串长度均为20。成员函数包括人员信息的录入和显示。还包括构造函数与拷贝构造函数。设计一个合适的初始值。设计程序如下:#include <iostream>#include <string>using namespace std; class Personpublic: Person() /缺省构造函数 Person(string i,string n,string

29、 s,string b,string h): idperson(i),name(n),sex(s),birthday(b),homeaddress(h) /含参数的构造函数 Person(Person & p) /复制构造函数   idperson=p.idperson;  name=;  sex=p.sex;  birthday=p.birthday;  homeaddress=p.homeaddress;  void se

30、t_info(); /信息录入 void dis_info(); /信息显示private: string idperson; string name; string sex; string birthday; string homeaddress; void Person:set_info() cin>>idperson>>name>>sex>>birthday>>homeaddress; void Person:dis_info() 

31、;cout<<idperson<<" "<<name<<" "<<sex<<" "<<birthday<<" "<<homeaddress<<endl;int main()    Person a;    a.set_info();    a.dis_info(); &

32、#160;  return 0;17.构造一个日期时间类(Timedate),数据成员包括年、月、日和时、分、秒,函数成员包括设置日期时间和输出时间,并完成测试。(包括用构造函数和普通成员函数来设置日期时间值)设计程序如下:#include <iostream>#include <ctime>using namespace std;class TimeDate    private:    int year;    int mon;

33、    int mday;    int h;    int m;    int s;public:    TimeDate()            cout<<"constructing TimeDate."<<endl; 

34、;       tm* dt;        time_t curr;        curr=(time(0);        dt=localtime(&curr);        year=dt-

35、>tm_year+1900;        mon=dt->tm_mon+1;        mday=dt->tm_mday;        h=dt->tm_hour;        m=dt->tm_min;   

36、     s=dt->tm_sec;    TimeDate(int a,int b,int c,int d,int e,int f)            year=a;        mon=b;        mday

37、=c;        h=d;        m=e;        s=f;        TimeDate()            cout<<

38、;"destructing TimeDate."<<endl;         void show()            cout<<year<<'-'<<mon<<'-'<<mday<<"  "  

39、          <<h<<":"<<m<<":"<<s<<endl;     int main()    TimeDate curr;    curr.show();    TimeDate a(2014,3,12,12,30,45);    a.show();    return 0;18、 编写一个程序设计一个汽车类vehicle,包含的数据成员有车轮个数wheels和车重weight.小车类car是它的私有派生类,其中包含载人数pa

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论