C++实验指导书(2017年修改版)(1).doc_第1页
C++实验指导书(2017年修改版)(1).doc_第2页
C++实验指导书(2017年修改版)(1).doc_第3页
C++实验指导书(2017年修改版)(1).doc_第4页
C++实验指导书(2017年修改版)(1).doc_第5页
已阅读5页,还剩36页未读 继续免费阅读

下载本文档

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

文档简介

面向对象程序设计实验指导书苗 暹 编王晓东 审2017.8目 录实验一 函数设计实验实验二 类程序设计实验实验三 数组与指针实验实验四 类的继承与多态实验实验五 输入、输出流程序设计实验实验六 综合程序设计实验实验一 函数设计实验【实验目的】1掌握函数的定义及其调用。 2掌握函数参数的传递方式,按值传递、按址传递和按引用传递。3掌握函数重载概念与使用方法。4学习函数模板的使用。【实验内容】1 运行参考程序,理解按值传递、按地址传递和按引用传递不同之处。/参考程序1#include/使用按值传递的方法将两变量值对换void swapbyValue(int a,int b)int t;t=a;a=b;b=t;/使用按地址传递的方法将两变量值对换void swapbyAddress(int *a,int *b)int t;t=*a;*a=*b;*b=t;/使用按引用传递的方法将两变量值对换void swapbyQuote(int &a,int &b)int t;/这里访问与修改的是实际参数本身,而不是实际参数的一个副本 t=a;a=b;b=t;int main()int x,y; x=66;y=98;swapbyValue(x,y);coutx=x y=yendl;swapbyAddress(&x,&y);coutx=x y=yendl;swapbyQuote(x,y);coutx=x y=yendl;return(0);2运行参考程序,理解带缺省形参值函数的用法。/参考程序2#include#includeconst double PI=3.14159;float area(float a=3,double b=4,double c=5);int main()double s;s=area();couts=sendl;s=area(6);couts=sendl;s=area(2,4);couts=sendl;s=area(5,6,7);couts=sendl;return 0;float area(float a,double b,double c)float s,S;s=1/2.0*(a+b+c);S=sqrt(s*(s-a)*(s-b)*(s-c);return S;3运行参考程序,理解函数重载概念与基本使用方法。/参考程序3#includeint min(int a,int b,int c)int k;k=(ab)?a:b;k=(kc)?k:c;return k;int min(int a,int b)int k;k=(ab)?a:b;return k;int main()int x,y,z,m;coutxyz; m=min(x,y,z);cout最小的数是:mn;coutxy;m=min(x,y);cout最小的数是:mn;return(0);4运行参考程序,理解函数模板概念与基本使用方法。/参考程序4#includetemplateT min(T a, T b)return(ab)?a:b;int main()int x,y;coutxy;cout最小的整数是:min(x,y)n;float x1,y1; coutx1y1;cout最小的实数是:min(x1,y1)n;return(0);5编程计算圆台体积(要求上底和下底半径带默认形参值)。(提示:体积公式为 可附加页6用函数重载方法编写求面积程序,要求能计算圆、矩形、三角形面积。可附加页7应用函数模板求数组中的最大数,要求分别处理整型、浮点型数据。8建立一个简单的银行账户系统。关于账户的信息有:户名、账号、余额。对账户的管理有:开户、存款、取款、查询余额等功能。用结构化程序设计方法设计一个程序,使该程序能对银行账户的信息进行上述操作管理。参考程序框架(为简单起见,只考虑对一个账户信息进行管理):#include#include /getch()要用到此头文件#include /system(cls)清屏函数用到此头文件#include/定义一个账户结构体struct Accountchar mName10;long mSN;float mBalance; ;/开户void getAcc(struct Account *p) cout请输入姓名、帐号、存入钱数:endl; coutp-mName; coutp-mSN;coutp-mBalance; /往账户中存款,存款金额为amountvoid deposit(struct Account *p) float amount;coutamount;p-mBalance=p-mBalance+amount;/从账户中取款,取款金额为amount(请考虑透支情况)void withdraw(struct Account *p)/*查询帐户当前余额*void getBalance(struct Account *p) /主菜单void menu(void) system(cls); /清屏 cout-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*endl; cout-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*endl; cout 简易银行帐户系统endlendl; cout1:开户endl; cout2:存款 endl; cout3:取款endl; cout4:查询余额 endl; cout5:退出 endlendl; cout-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*endl; cout-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*endl; coutendlendlendl;/主函数int main()int cho;struct Account p; /定义一个银行账户结构体变量while(1)menu();docoutplease input selection:cho;while(cho5);switch(cho)case 1:getAcc(&p); break;case 2:deposit(&p);break;case 3: withdraw(&p);break;case 4: getBalance(&p); break;case 5:return 0 ; return(0);【思考题】1回答按值传递、按地址传递和按引用传递有何不同?2重载函数和函数模板有何区别?什么情况下使用重载函数?什么情况下使用函数模板?实验二 类程序设计实验【实验目的】1掌握类和对象的概念、定义和使用方法。2学习数据成员与成员函数的访问方式。3掌握构造函数、拷贝构造函数和析构函数的使用方法。4掌握类的组合使用方法。5熟悉类模板的定义和使用方法。【实验内容】1阅读下列程序,写出执行结果:(1) #includeclass Circlepublic:Circle(float radius)Radius=radius;cout构造函数被调用endl; Circle() cout析构函数被调用!endl;float GetArea()return 3.14*Radius*Radius;private:float Radius;int main()float radius;coutradius; Circle obj(radius);cout半径为radius圆的面积为:obj.GetArea()endl;return(0); (2) #includeclass Circlepublic:Circle(float radius)Radius=radius;cout构造函数被调用endl;Circle(Circle& p)Radius=p.Radius;cout拷贝构造函数被调用endl;Circle() cout析构函数被调用!endl;float GetArea()return 3.14*Radius*Radius;private:float Radius;int main()float radius;coutradius;Circle obj1(radius);Circle obj2(obj1);cout对象1的面积为:obj1.GetArea()endl;cout对象2的面积为:obj2.GetArea()endl;return(0);(3) #include using namespace std; class Student public: Student(int num, char *n); /构造函数Student();/析构函数void display( ); private: int number;/学号char *name;/姓名; Student:Student(int num, char *n) number=num; name=new charstrlen(n)+1; /用new为name分配堆内存strcpy(name,n); cout执行Student类构造函数endl; Student:Student()delete name;cout执行Student类析构函数endl;void Student:display( ) cout学号: numberendl; cout姓名: nameendl; int main() Student stud1(2017001,John); stud1.display(); return 0; 2设计一个银行账户(Account)类,包含户名、帐号以及当前余额属性,可完成开户、存款、取款和查询余额等行为。银行账户类的定义如下:class Accountpublic:Account(char name,long num,float amount);/类的有参构造函数Account();/类的无参构造函数void deposit(float amount); /往账户中存款 int withdraw(float amount); /从账户中取款float getBalance(); /查询余额private:char mName20; /银行账户的户名long mSN; /本账户的帐号float mBalance; /本账户当前的余额;请根据上述给定的类,完善其相应的构造函数及成员函数的定义,并执行主函数实现测试。参考程序框架:#includeusing namespace std;class Accountpublic:Account(char name,long num,float amount); /类的有参构造函数Account();/类的无参构造函数void deposit(float amount); /往账户中存款 int withdraw(float amount); /从账户中取款 float getBalance(); /查询余额private:char mName20; /银行账户的户名long mSN; /本账户的帐号float mBalance; /本账户当前的余额;/有参构造函数的实现Account:Account(char name,long num,float amount) strcpy(mName,name); mSN=num;mBalance=amount;/类的无参构造函数Account:Account()/存款void Account:deposit(float amount)mBalance=mBalance+amount;/取款,考虑透支情况int Account:withdraw(float amount)/查询余额float Account:getBalance()/主菜单void menu(void) system(cls); /清屏 cout-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*endl; cout-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*endl; cout 简单银行帐户系统endlendl; cout1.存款 endl; cout2:取款endl; cout3:查询余额 endl; cout4:退出 endlendl; cout-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*endl; cout-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*endl; coutendlendlendl;int main()int cho,m;char name20;long num;float amount;cout请输入开户信息:endlendl;coutname;coutnum;coutamount;Account p(name,num,amount); /定义银行账户类对象while(1)menu();docout请输入选择:cho;while(cho4);switch(cho)case 1:coutamount;p.deposit(amount);break;case 2: coutamount;m=p.withdraw(amount);if(m=0)cout透支!endl;else cout取款成功!endl;break;case 3: cout余额为:p.getBalance()endl; break;case 4:return 0; coutendl敲回车继续!endl;cin.sync(); /清空输入缓冲区的内容 cin.get(); /从指定的输入流中提取一个字符,防止屏幕一闪而过3设计一个股票(Stock)类,包含股票名称、股票代码、股票的数量、每股的价格、股票的总值等属性,可完成获得股票(用构造函数完成)、增持、卖出股票、更新股票价格、显示所持股票的信息等行为。可附加页4设计一个用于学生管理的Student类,属性有:学号、年龄、性别、出生日期、身份证号等。其中“出生日期”声明为一个“日期”类的内嵌子对象。用成员函数实现对学生信息的录入和显示。要求包括:构造函数和析构函数、拷贝构造函数、组合。可附加页5设计复数类,实现复数的+、-、*、/运算。(附加题) 可附加页【思考题】1C+语言中类和结构体类型有何异同?2什么时候程序会调用其构造函数?3什么时候程序会自动调用析构函数?4类的组合在什么情况下使用?实验三 数组与指针实验【实验目的】1学习使用数组数据对象。2掌握指针的使用方法。3学习通过动态内存分配实现动态数组的定义和使用,并体会指针在其中的作用。4掌握静态成员的使用方法。5练习通过Debug观察指针的内容及其所指对象的内容。【实验内容】1运行下列程序,观察运行结果。(1)#includeclass ArrayElemint x;public:ArrayElem(int i)x=i; /带参数的构造函数int getx()return x;int main()ArrayElem obs4 =-1,-2,-3,-4; /创建对象数组并初始化for(int i=0;i4;i+)coutobsi.getx():obsi.getx()n;/访问数组元素的成员return(0);(2)#includeclass NumClassint num;public:void set_num(int val)num=val;void show_num()coutThe num is :numset_num(20);p-show_num(); /通过指针调用成员函数return(0);(3)#includeclass NumClassint num;public:void set_num(int val)num=val;void show_num()coutThe num is :numshow_num(); /通过指针显示数组元素p+; p-show_num(); return(0);(4)#includeclass NumClassint num;public:void set_num(int val)num=val;void show_num()coutThe num is :numn;int main()NumClass *p=new NumClass2; /动态创建一个对象数组p0.set_num(10); p1.set_num(20); /通过指针访问数组元素的成员p0.show_num(); p1.show_num(); /通过指针显示数组元素delete p; /删除整个对象数组return(0);2用对象数组实现一个简单的银行账户管理系统,完成多个用户的开户、存款、取款和查询余额等行为。#include#include#include /system(cls)清屏函数和exit()用到此头文件#include /getch()要用到此头文件class Accountprivate:char mName10; /银行账户的户名long mSN; /本账户的帐号float mBalance; /本账户当前的余额public: Account();/无参构造函数void deposit(); /往账户中存款 int withdraw(); /从账户中取款 void getBalance(); /查询余额long getmSN()return mSN; /取得客户的帐号; Account:Account() /无参构造函数,从键盘输入信息进行初始化/往账户中存款,存款金额为amountvoid Account:deposit()/从账户中取款,取款金额为amountint Account:withdraw() /查询帐户当前余额void Account:getBalance()/菜单函数void menu(void)/主函数int main()int cho,n,r,i,flag=0;long aNo; cout要开的账户数目为:n;Account *p; /定义对象指针 p=new Accountn; /动态创建对象数组while(1)menu();docout请根据菜单进行操作选择:cho;/getch(); /清除键盘缓冲区内容,为下一次正确读入做准备。while(cho4);switch(cho)case 1:/存款coutaNo;for(i=0;igetmSN()=aNo)flag=1;(p+i)-deposit();(p+i)-getBalance();break;if(flag=0)cout对不起,输入帐号有错误!endl;getch();break;case 2:/取款case 3:/查询case 4:/退出return 0;delete p; /释放空间return 0;3 N个学生数据,包括学号、姓名、成绩,要求输出这些学生数据并计算平均分。设计一个学生类,包括学号、姓名和成绩数据成员外,还有两个静态变量sum和num,分别存放总分和人数,另有两个普通成员函数setdata()和disp(),分别用于给数据成员赋值和输出数据成员的值,另有一个静态成员函数avg(),它用于计算平均分。在main()函数中定义了一个对象数组用于存储输入的学生数据。可附加页4改进实验内容2,添加利息计算。(附加题)可附加页【思考题】1数组之间如何赋值?2引用和指针有何区别?3对那些类型的数据不能使用引用?实验四 类的继承与多态实验【实验目的】1理解软件重用性的一种形式继承。2能够通过继承已有的类创建新类。3理解基类和派生类的概念。4能够在派生类中使用构造函数和析构函数5学习虚基类在解决二义性问题中的作用。6熟悉多态分类,理解静态联编和动态联编概念。7掌握运算符重载方法。【实验内容】1分析程序,写出下列程序的运行结果:(1)#includeclass Baseprivate: int base_priv_dat;protected: int base_prot_dat;public: void base_show();class Derived:public Baseprivate: int derived_priv_dat;public: void derived_show();void Base:base_show()base_priv_dat=1; /基类函数可以操纵私有和保护型基类数据base_prot_dat=2;coutbase_priv_dat=base_priv_dattbase_prot_dat=base_prot_datendl;void Derived:derived_show()derived_priv_dat=3;base_prot_dat=4; /派生函数可以处理保护型基类数据,但不能处理私有基类数据coutderived_priv_dat=derived_priv_dattbase_prot_dat=base_prot_datendl;base_show(); /派生函数可以调用公有基类函数int main()Derived d_obj;d_obj.base_show(); /可用派生对象调用基类函数d_obj.derived_show();return(0);(2) #include#includeclass Person public: Person(const char* s) /带参数的构造函数 name=new charstrlen(s)+1;strcpy(name,s); Person()delete name; /析构函数做清理工作 char *GetName()return name; protected: char *name; ;class Student:public Personchar *major; public:Student(const char * s,const char *m):Person(s) /派生类构造函数major=new charstrlen(m)+1;strcpy(major,m);Student()delete major; /派生类析构函数char *GetMajor()return major;int main()Student stu(WZQ,Electric automatization);coutstudent Name is:stu.GetName() Major is: stu.GetMajor()endl;return(0);2编译运行下列程序,分析出现编译错误的原因,并给出解决办法。#include#includeusing namespace std;class Personpublic:Person(string the_name,string the_gender,string the_id)name=the_name;gender=the_gender;id_number=the_id;coutPerson类构造函数被调用!endl;void show()cout姓名:nameendl;cout性别:genderendl;cout身份证号码:id_numberendl;protected:string name;/姓名string gender; /性别string id_number; /身份证号码;class Student: public Personpublic:Student(string n,string g,string i,string c):Person(n,g,i)classname=c;coutStudent类构造函数被调用!endl;protected:string classname;/学生所在班级;class Teacher: public Personpublic:Teacher(string n,string g,string i,string d):Person(n,g,i)department=d;coutTeacher类构造函数被调用!endl;protected:string department;/教师所在单位;class Assistant:public Student,public Teacherpublic:Assistant(string n,string g,string i,string c,string d):Student(n,g,i,c),Teacher(n,g,i,d)void disp()show();cout班级:classnameendl;cout系部:departmentendl;int main() Assistant a(李玮,男软件141,电信系); a.disp(); return 0;解决方法一:(通过作用域符号来唯一标识)可附加页解决方法二:(虚基类技术)可附加页4开发一个简单的大学人员管理程序,该程序可以管理大学的一些基本人员:学生(student)、教师(teacher)。首先设计一个虚基类person。通过该类保存人员的最基本信息:姓名(name)、年龄(age)、性别(sex)和身份证号码。然后使用该类派生出学生类student、教师类teacher,在其中添加各自的特性,如在student类中添加如下信息:专业(speciality),在teacher类中添加院系(department)等。还有部分教师在工作的同时在职修读学位,因此同时具有教师和学生双重身份,所以由student类和teacher类再次派生出stuTeacher类。为每个类定义一个输出函数print(),输出该类相关信息。可附加页5 用运算符重载设计复数类,实现复数的+、-、*、/运算。可附加页【思考题】1组合与继承的区别是什么? 2公有继承、保护继承和私有继承分别在什么情况下使用?3什么是虚基类?有何作用?4静态联编和动态联编有什么区别? 5简述空的虚函数与纯虚函数的区别?6简述抽象类和具体类的区别?实验五 输入、输出流程序设计实验【实验目的】1理解输入/输出流相关概念2掌握输入/输出流的常用操作3理解文件概念4掌握文件流的常用操作【实验内容】1分析程序,写出下列程序的运行结果:(1)#include using namespace std; int main() char *str=How are you!;coutstrendl;cout.write(str,8);cout.put(n);cout.write(str+4,8);cout.put(n);return 0;(2)#include using namespace std; const int SIZE=30; int main() char bufferSIZE;cout:buffer;coutThe sentence is:bufferendl;return 0; (3)#include using namespace std; const int SIZE=30; int main() char bufferSIZE;coutEnter a sentence with cin.get():endl;cin.get(buffer,SIZE); /默认以换行符结束coutThe sentence is:bufferendl; return 0; (4)#include using namespace std; const int SIZE=30; int main() char bufferSIZE;coutEnter a sentence with cin.getline():endl;cin.getline(buffer,SIZE,?); /以字符?作为终止符coutThe sentence is:bufferendl; return 0; (5)#include using namespace std; const int SIZE=30; int main() char bufferSIZE;coutEnter a sentence with cin.read():endl;cin.read(buf

温馨提示

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

最新文档

评论

0/150

提交评论