C++实验指导书(2017年修改版)(1)

更新时间:2024-05-18 03:40:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

暹 王晓东 2017.8

编 审

苗《面向对象程序设计》实验指导书

目 录

实验一 函数设计实验 实验二实验三实验四实验五实验六

类程序设计实验 数组与指针实验 类的继承与多态实验 输入、输出流程序设计实验 综合程序设计实验

1

《面向对象程序设计》实验指导书

实验一 函数设计实验

【实验目的】

1.掌握函数的定义及其调用。

2.掌握函数参数的传递方式,按值传递、按址传递和按引用传递。 3.掌握函数重载概念与使用方法。 4.学习函数模板的使用。

【实验内容】

1. 运行参考程序,理解按值传递、按地址传递和按引用传递不同之处。 //参考程序1

#include< iostream.h >

//使用按值传递的方法将两变量值对换 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); cout<<\ swapbyAddress(&x,&y); cout<<\ swapbyQuote(x,y); cout<<\ return(0); }

2

《面向对象程序设计》实验指导书

2.运行参考程序,理解带缺省形参值函数的用法。

//参考程序2

#include #include

const double PI=3.14159;

float area(float a=3,double b=4,double c=5); int main() { double s; s=area(); cout<<\ s=area(6); cout<<\ s=area(2,4); cout<<\ s=area(5,6,7); cout<<\ 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

#include

int min(int a,int b,int c) { int k; k=(a

int min(int a,int b) { int k; k=(a

int main() { int x,y,z,m; cout<<\请输入三个整数:\ cin>>x>>y>>z; m=min(x,y,z); cout<<\最小的数是:\ cout<<\请输入两个整数:\ cin>>x>>y; m=min(x,y); cout<<\最小的数是:\ return(0); }

3

《面向对象程序设计》实验指导书

4.运行参考程序,理解函数模板概念与基本使用方法。

//参考程序4

#include template T min(T a, T b) { return(a

int main() { int x,y; cout<<\请输入两个整数:\ cin>>x>>y; cout<<\最小的整数是:\ float x1,y1; cout<<\请输入两个实数:\ cin>>x1>>y1; cout<<\最小的实数是:\ return(0); }

5.编程计算圆台体积(要求上底和下底半径带默认形参值)。 (提示:体积公式为 13?H(R21?R22?R1R2)

4

可附加页

《面向对象程序设计》实验指导书

6.用函数重载方法编写求面积程序,要求能计算圆、矩形、三角形面积。

5

可附加页

《面向对象程序设计》实验指导书

7.应用函数模板求数组中的最大数,要求分别处理整型、浮点型数据。

8.建立一个简单的银行账户系统。关于账户的信息有:户名、账号、余额。对账户的管理有:开户、存款、取款、查询余额等功能。用结构化程序设计方法设计一个程序,使该程序能对银行账户的信息进行上述操作管理。

参考程序框架(为简单起见,只考虑对一个账户信息进行管理):

6

《面向对象程序设计》实验指导书

#include

#include //getch()要用到此头文件

#include //system(\清屏函数用到此头文件 #include //定义一个账户结构体 struct Account

{ char mName[10]; long mSN;

float mBalance; }; //开户

void getAcc(struct Account *p) {

cout<<\请输入姓名、帐号、存入钱数:\ cout<<\姓名:\

cin>>p->mName; cout<<\帐号:\ cin>>p->mSN;

cout<<\存入钱数:\ cin>>p->mBalance; }

//往账户中存款,存款金额为amount void deposit(struct Account *p) {

float amount; cout<<\存款金额:\ cin>>amount; p->mBalance=p->mBalance+amount; }

//从账户中取款,取款金额为amount(请考虑透支情况) void withdraw(struct Account *p) { }

7

《面向对象程序设计》实验指导书

//*****查询帐户当前余额*****

void getBalance(struct Account *p) {

}

//主菜单

void menu(void)

{ system(\清屏

cout<<\ cout<<\ cout<<\简易银行帐户系统\ cout<<\开户\ cout<<\存款 \ cout<<\取款\

cout<<\查询余额 \ cout<<\退出 \

cout<<\ cout<<\ cout<

//主函数 int main() { int cho;

struct Account p; //定义一个银行账户结构体变量 while(1) { menu(); do

{ cout<<\ cin>>cho;

}while(cho<1||cho>5); 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); }

8

《面向对象程序设计》实验指导书

【思考题】

1.回答按值传递、按地址传递和按引用传递有何不同?

2.重载函数和函数模板有何区别?什么情况下使用重载函数?什么情况下使用函数模板?

9

《面向对象程序设计》实验指导书

实验二 类程序设计实验

【实验目的】

1.掌握类和对象的概念、定义和使用方法。 2.学习数据成员与成员函数的访问方式。

3.掌握构造函数、拷贝构造函数和析构函数的使用方法。 4.掌握类的组合使用方法。

5.熟悉类模板的定义和使用方法。

【实验内容】

1.阅读下列程序,写出执行结果:

(1) #include

class Circle {

public:

Circle(float radius) { Radius=radius; cout<<\构造函数被调用\ }

~Circle()

{ cout<<\析构函数被调用!\

float GetArea(){return 3.14*Radius*Radius;} private:

float Radius; };

int main() {

float radius;

cout<<\请输入圆的半径:\ cin>>radius; Circle obj(radius);

cout<<\半径为\圆的面积为:\ return(0); }

(2) #include

class Circle {

public:

Circle(float radius) { Radius=radius; cout<<\构造函数被调用\ }

Circle(Circle& p) { Radius=p.Radius; cout<<\拷贝构造函数被调用\ }

10

《面向对象程序设计》实验指导书

~Circle()

{ cout<<\析构函数被调用!\

float GetArea(){return 3.14*Radius*Radius;} private:

float Radius; };

int main() {

float radius;

cout<<\请输入圆的半径:\ cin>>radius;

Circle obj1(radius); Circle obj2(obj1);

cout<<\对象1的面积为:\ cout<<\对象2的面积为:\ 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 char[strlen(n)+1]; //用new为name分配堆内存 strcpy(name,n);

cout<<\执行Student类构造函数\}

Student::~Student() {

delete name;

cout<<\执行Student类析构函数\}

void Student::display( ) {

cout<<\学号: \ cout<<\姓名: \}

int main() {

Student stud1(2017001,\ stud1.display(); return 0; }

11

《面向对象程序设计》实验指导书

2.设计一个银行账户(Account)类,包含户名、帐号以及当前余额属性,可完成开户、存款、取款和查询余额等行为。银行账户类的定义如下:

class Account {

public: Account(char name[],long num,float amount); //类的有参构造函数 Account(); //类的无参构造函数 void deposit(float amount); //往账户中存款 int withdraw(float amount); //从账户中取款

float getBalance(); //查询余额 private: char mName[20]; //银行账户的户名 long mSN; //本账户的帐号 float mBalance; //本账户当前的余额 };

请根据上述给定的类,完善其相应的构造函数及成员函数的定义,并执行主函数实现测试。 参考程序框架:

#include using namespace std; class Account {

public: Account(char name[],long num,float amount); //类的有参构造函数 Account(); //类的无参构造函数 void deposit(float amount); //往账户中存款 int withdraw(float amount); //从账户中取款 float getBalance(); //查询余额 private: char mName[20]; //银行账户的户名 long mSN; //本账户的帐号 float mBalance; //本账户当前的余额 };

//有参构造函数的实现

Account::Account(char name[],long num,float amount) {

strcpy(mName,name); mSN=num;

mBalance=amount; }

//类的无参构造函数 Account::Account() { }

//存款

12

《面向对象程序设计》实验指导书

void Account::deposit(float amount) { mBalance=mBalance+amount; }

//取款,考虑透支情况

int Account::withdraw(float amount) { }

//查询余额

float Account::getBalance() { }

//主菜单

void menu(void)

{ system(\清屏

cout<<\ cout<<\ cout<<\简单银行帐户系统\ cout<<\存款 \ cout<<\取款\

cout<<\查询余额 \ cout<<\退出 \

cout<<\ cout<<\ cout<

int main()

{ int cho,m; char name[20]; long num; float amount; cout<<\请输入开户信息:\ cout<<\姓名:\ cin>>name; cout<<\帐号:\ cin>>num; cout<<\存款金额:\ cin>>amount; Account p(name,num,amount); //定义银行账户类对象 while(1) { menu();

13

《面向对象程序设计》实验指导书

}

do { cout<<\请输入选择:\ cin>>cho; }while(cho<1||cho>4); switch(cho) { case 1: cout<<\存款金额:\ cin>>amount; p.deposit(amount); break; case 2: cout<<\取款金额:\ cin>>amount; m=p.withdraw(amount); if(m==0) cout<<\透支!\ else cout<<\取款成功!\ break; case 3: cout<<\余额为:\ break; case 4: return 0; } cout<

3.设计一个股票(Stock)类,包含股票名称、股票代码、股票的数量、每股的价格、股票的总值等属性,可完成获得股票(用构造函数完成)、增持、卖出股票、更新股票价格、显示所持股票的信息等行为。

14

《面向对象程序设计》实验指导书

15

可附加页

《面向对象程序设计》实验指导书

4.设计一个用于学生管理的Student类,属性有:学号、年龄、性别、出生日期、身份证号等。其中“出生日期”声明为一个“日期”类的内嵌子对象。用成员函数实现对学生信息的录入和显示。要求包括:构造函数和析构函数、拷贝构造函数、组合。

16

可附加页

《面向对象程序设计》实验指导书

*、/运算。(附加题)

17

可附加页5.设计复数类,实现复数的+、-、

《面向对象程序设计》实验指导书

【思考题】

1.C++语言中类和结构体类型有何异同?2.什么时候程序会调用其构造函数? 3.什么时候程序会自动调用析构函数? 4.类的组合在什么情况下使用?

18

《面向对象程序设计》实验指导书

实验三 数组与指针实验

【实验目的】

1.学习使用数组数据对象。 2.掌握指针的使用方法。

3.学习通过动态内存分配实现动态数组的定义和使用,并体会指针在其中的作用。 4.掌握静态成员的使用方法。

5.练习通过Debug观察指针的内容及其所指对象的内容。 【实验内容】

1.运行下列程序,观察运行结果。 (1)#include

class ArrayElem { int x; public: ArrayElem(int i){x=i;} //带参数的构造函数 int getx(){return x;} };

int main() { ArrayElem obs[4] ={-1,-2,-3,-4}; //创建对象数组并初始化 for(int i=0;i<4;i++) cout<<\访问数组元素的成员 return(0); }

(2)#include

class NumClass { int num; public: void set_num(int val){num=val;} void show_num(){cout<<\};

int main() { NumClass ob,*p; //声明一个对象和指向对象的指针 ob.set_num(10); ob.show_num(); //通过对象ob直接调用成员函数 p=&ob; //使对象指针p指向对象ob p->set_num(20);p->show_num(); //通过指针调用成员函数 return(0); }

(3)#include

class NumClass { int num; public: void set_num(int val){num=val;} void show_num(){cout<<\};

19

《面向对象程序设计》实验指导书

int main() { NumClass ob[2],*p; //声明一个对象数组和对象指针 ob[0].set_num(10); ob[1].set_num(20); //通过对象数组名和下标来访问 p=&ob[0]; //将对象数组的首元素地址赋给指针 p->show_num(); //通过指针显示数组元素 p++; p->show_num(); return(0); }

(4)#include

class NumClass { int num; public: void set_num(int val){num=val;} void show_num(){cout<<\};

int main() { NumClass *p=new NumClass[2]; //动态创建一个对象数组 p[0].set_num(10); p[1].set_num(20); //通过指针访问数组元素的成员 p[0].show_num(); p[1].show_num(); //通过指针显示数组元素

delete[] p; //删除整个对象数组 return(0); }

2.用对象数组实现一个简单的银行账户管理系统,完成多个用户的开户、存款、取款和查询余额等行为。

#include #include

#include //system(\清屏函数和exit()用到此头文件 #include //getch()要用到此头文件 class Account {

private: char mName[10]; //银行账户的户名 long mSN; //本账户的帐号 float mBalance; //本账户当前的余额 public: Account(); //无参构造函数 void deposit(); //往账户中存款 int withdraw(); //从账户中取款 void getBalance(); //查询余额 long getmSN(){return mSN;} //取得客户的帐号 };

Account::Account() //无参构造函数,从键盘输入信息进行初始化 {

20

《面向对象程序设计》实验指导书

}

//往账户中存款,存款金额为amount void Account::deposit() {

}

//从账户中取款,取款金额为amount int Account::withdraw() {

}

//查询帐户当前余额

void Account::getBalance() { }

21

《面向对象程序设计》实验指导书

//菜单函数

void menu(void) { }

//主函数

int main() { int cho,n,r,i,flag=0; long aNo;

cout<<\要开的账户数目为:\ cin>>n; Account *p; //定义对象指针

p=new Account[n]; //动态创建对象数组 while(1) { menu(); do { cout<<\请根据菜单进行操作选择:\ cin>>cho; // getch(); //清除键盘缓冲区内容,为下一次正确读入做准备。 }while(cho<1||cho>4); switch(cho) { case 1://存款 cout<<\请输入帐号:\ cin>>aNo; for(i=0;igetmSN()==aNo) { flag=1; (p+i)->deposit(); (p+i)->getBalance();break; } } if(flag==0) cout<<\对不起,输入帐号有错误!\ getch();

22

《面向对象程序设计》实验指导书

break; case 2://取款

case 3://查询

case 4://退出

return 0; } }

delete[] p; //释放空间 return 0;

}

23

《面向对象程序设计》实验指导书

3. N个学生数据,包括学号、姓名、成绩,要求输出这些学生数据并计算平均分。设计一个学生类,包括学号、姓名和成绩数据成员外,还有两个静态变量sum和num,分别存放总分和人数,另有两个普通成员函数setdata()和disp(),分别用于给数据成员赋值和输出数据成员的值,另有一个静态成员函数avg(),它用于计算平均分。在main()函数中定义了一个对象数组用于存储输入的学生数据。

24

可附加页

《面向对象程序设计》实验指导书

,添加利息计算。(附加题) 25

可附加页4.改进实验内容2

《面向对象程序设计》实验指导书

【思考题】

1.数组之间如何赋值? 2.引用和指针有何区别?

3.对那些类型的数据不能使用引用?26

《面向对象程序设计》实验指导书

实验四 类的继承与多态实验

【实验目的】

1.理解软件重用性的一种形式——继承。 2.能够通过继承已有的类创建新类。 3.理解基类和派生类的概念。

4.能够在派生类中使用构造函数和析构函数 5.学习虚基类在解决二义性问题中的作用。

6.熟悉多态分类,理解静态联编和动态联编概念。 7.掌握运算符重载方法。 【实验内容】

1.分析程序,写出下列程序的运行结果: (1) #include

class Base {

private: int base_priv_dat; protected: int base_prot_dat; public: void base_show(); };

class Derived:public Base {

private: int derived_priv_dat; public: void derived_show(); };

void Base::base_show() { base_priv_dat=1; //基类函数可以操纵私有和保护型基类数据 base_prot_dat=2; cout<<\ <<\}

void Derived::derived_show() { derived_priv_dat=3; base_prot_dat=4; //派生函数可以处理保护型基类数据,但不能处理私有基类数据 cout<<\ <<\ base_show(); //派生函数可以调用公有基类函数 }

int main() { Derived d_obj; d_obj.base_show(); //可用派生对象调用基类函数

27

《面向对象程序设计》实验指导书

}

d_obj.derived_show(); return(0);

(2) #include

#include class Person {

public: Person(const char* s) //带参数的构造函数 { name=new char[strlen(s)+1]; strcpy(name,s); } ~Person(){delete []name;} //析构函数做清理工作 char *GetName(){return name;} protected: char *name; };

class Student:public Person { char *major; public: Student(const char * s,const char *m):Person(s) //派生类构造函数 {major=new char[strlen(m)+1];strcpy(major,m);} ~Student(){delete[] major;} //派生类析构函数 char *GetMajor(){return major;} };

int main() { Student stu(\ cout<<\ <

2.编译运行下列程序,分析出现编译错误的原因,并给出解决办法。

#include #include

using namespace std; class Person {

public: Person(string the_name,string the_gender,string the_id) { name=the_name; gender=the_gender; id_number=the_id; cout<<\类构造函数被调用!\ } void show()

28

《面向对象程序设计》实验指导书

{ cout<<\姓名:\ cout<<\性别:\ cout<<\身份证号码:\ }

protected: string name; //姓名 string gender; //性别 string id_number; //身份证号码 };

class Student: public Person {

public: Student(string n,string g,string i,string c):Person(n,g,i) { classname=c; cout<<\类构造函数被调用!\ }

protected: string classname; //学生所在班级 };

class Teacher: public Person {

public: Teacher(string n,string g,string i,string d):Person(n,g,i) { department=d; cout<<\类构造函数被调用!\ }

protected: string department; //教师所在单位 };

class Assistant:public Student,public Teacher {

public: Assistant(string n,string g,string i,string d):Student(n,g,i,c),Teacher(n,g,i,d) {} void disp() { show(); cout<<\班级:\ cout<<\系部:\ } };

int main() {

Assistant a(\李玮\男\软件141\电信系\ a.disp(); return 0; }

29

c,string

《面向对象程序设计》实验指导书

(通过作用域符号来唯一标识) 30

可附加页解决方法一:

《面向对象程序设计》实验指导书

31

可附加页

解决方法二:(虚基类技术)

《面向对象程序设计》实验指导书

4.开发一个简单的大学人员管理程序,该程序可以管理大学的一些基本人员:学生(student)、教师(teacher)。首先设计一个虚基类person。通过该类保存人员的最基本信息:姓名(name)、年龄(age)、性别(sex)和身份证号码。然后使用该类派生出学生类student、教师类teacher,在其中添加各自的特性,如在student类中添加如下信息:专业(speciality),在teacher类中添加院系(department)等。还有部分教师在工作的同时在职修读学位,因此同时具有教师和学生双重身份,所以由student类和teacher类再次派生出stuTeacher类。为每个类定义一个输出函数print(),输出该类相关信息。

32

可附加页

《面向对象程序设计》实验指导书

用运算符重载设计复数类,实现复数的+、-、*、/运算。 33

可附加页5.

《面向对象程序设计》实验指导书

【思考题】

1.组合与继承的区别是什么?

2.公有继承、保护继承和私有继承分别在什么情况下使用? 3.什么是虚基类?有何作用?

4.静态联编和动态联编有什么区别? 5.简述空的虚函数与纯虚函数的区别? 6.简述抽象类和具体类的区别?

34

《面向对象程序设计》实验指导书

实验五 输入、输出流程序设计实验

【实验目的】

1.理解输入/输出流相关概念 2.掌握输入/输出流的常用操作 3.理解文件概念

4.掌握文件流的常用操作 【实验内容】

1.分析程序,写出下列程序的运行结果: (1)#include using namespace std; int main() { char *str=\ cout<

(2)#include using namespace std; const int SIZE=30; int main() { char buffer[SIZE]; cout<<\ cin>>buffer; cout<<\ return 0; }

(3)#include using namespace std; const int SIZE=30; int main() { char buffer[SIZE]; cout<<\ cin.get(buffer,SIZE); //默认以换行符结束

35

《面向对象程序设计》实验指导书

cout<<\ return 0; }

(4)#include using namespace std; const int SIZE=30; int main() { char buffer[SIZE]; cout<<\ cin.getline(buffer,SIZE,'?'); //以字符?作为终止符 cout<<\ return 0; }

(5)#include using namespace std; const int SIZE=30; int main() { char buffer[SIZE]; cout<<\ cin.read(buffer,18); //从输入流提取18字节写入字符数组 cout<<\ return 0; }

(6)include #include using namespace std; int main() { int x=123; float y=456.789; cout<

36

《面向对象程序设计》实验指导书

}

cout<

2.按一行一行的方法将一个文本文件复制到另一个文件中。

37

《面向对象程序设计》实验指导书

3.打开指定的一个文本文件,在每一行前面加上行号。

4.编写程序,从键盘输入5个学生的学生信息,包括学号、姓名、3门课程的成绩,计算3门课的平均成绩,将全部信息以二进制方式保存到文件中。

可附加页

38

《面向对象程序设计》实验指导书

【思考题】

1. 什么叫流?流的提取和插入指的是什么?

2.C++有哪4个预定义的流?它们分别与什么具体设备相关联? 3.标准输出与标准错误在输出方面有那些异同?

4.为什么在不为每个类型提供明确指示的情况下,cout仍能够显示不同的C++类型? 5.C++进行文件输入/输出的基本过程是什么? 6.C++中顺序文件和随机文件有什么区别?

39

《面向对象程序设计》实验指导书

实验六 综合程序设计实验

【实验目的】

本实验运用面向对象程序设计思想和方法,综合使用C++语言的类、对象、继承、多态性、文件流、泛型程序设计等理论知识,编写C++程序。

【实验内容】

1.某学校对教师每月工资的计算规定如下:固定工资+课时补贴。教授的固定工资为5000元,每个课时补贴50元。副教授的固定工资为3000元,每个课时补贴30元。讲师的固定工资为2000元,每个课时补贴20元。定义教师抽象类,派生不同职称的教师类,编写程序求若干个教师的月工资。

R1=6

R2=8

2. 编写一个程序,计算由3个并联的子电路组成的电路的总电阻。子R1=7 电路由两个串联或并联的电阻器组成(如图3-11 )。首先创建一个纯虚类Resistance,含有CalcRes()纯虚函数,由Resistance派生出串联类Series-R2=9 Res和并联类ParallelRes,两个类都包含同名的CalcRes()函数计算子电路的电阻值。输入电阻值,输出总电阻值,所有子电路使用一个循环计算总电R1=4 R2=5 阻。(选做) 提示:

图3-11 电路图

串联电阻方程为:Rtot=R1+R2

并联电阻的方程为:Rtot=1/(1/R1+1/R2) 其中,R1和R2是单个电阻器的电阻。

在主函数中定义一个基类指针数组,用于存放子电路对象的地址,通过循环来遍历数组,使用地址来调用每个子电路对象的函数,从而实现多态性。

3. 编程实现一个简单的大学人员管理程序,该程序可以管理大学的一些基本人员:学生、教师、职工。首先设计一个抽象类person。通过该类保存人员的最基本信息:姓名(name)、年龄(age)和性别(sex),同时定义一个静态数据成员用来统计人数(sum)。然后使用该类派生出学生类、教师类和职工类,在其中添加各自的特性,如在学生类中添加如下信息:专业(speciality),在教师类中添加院系(department),在职工类中添加部门和职务等信息。为每个类定义一个输出函数print(),输出该类相关信;定义一个保存函数保存相关信息到文件。

40

本文来源:https://www.bwwdw.com/article/q6e7.html

Top