C++实验指导书

更新时间:2023-10-21 06:07:01 阅读量: 综合文库 文档下载

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

第1章C++基础知识

C++语言是一种应用较广的面向对象的程序设计语言,使用它可以实现面向对象的程序设计。面向对象的设计是在面向过程程序设计的基础上一个质的飞跃。C++语言是一种典型的面向对象程序设计语言,学习C++语言首先要认识它面向对象的特性和实现面向对象的方法。

实验目的和要求:

1.熟悉使用Visual C++6.0编写简单的C++控制台程序。 2.理解C++的抽象、封装、继承和多态性特点。 3.掌握基本的输入输出语句。 4.掌握UML类图中各部分含义。

实验内容:

一、程序分析题

1、写出以下程序的运行结果。 #include using namespace std; void swap(int &a,int &b) {

int temp; temp=a; a=b; b=temp; } int main() {

int a=2; int b=3;

cout<<”a=”<

cout<<”a=”<

}

2、当输入4和6时,写出以下程序的输出结果。 #include using namespace std; int main() {

int a,b,d,min;

cout<<”Enter two numbers:”; cin>>a; cin>>b;

min=a>b?b:a;

for(d=2;d

if(((a%d)==0)&&((b%d)==0)) break; if(d==min) {

cout<<”No common denominators”<

}

cout<<”The lowest common denominator is ”<

3、写出以下程序的运行结果。 #include using namespace std; int main() { }

for(int i=3;i<=10;i++) {

for(int j=2;j<(i/2+1);j++) {

if(i%j==0) break; }

if(j==(i/2+1)) cout<

}

cout<

4、写出以下程序的运行结果。 #include using namespace std; int main() {

int f[10]; f[0]=1;

f[1]=1;

for(int i=2;i<10;i++)

f[i]=f[i-1]+f[i-2]; for(int j=0;j<10;j++) cout<

}

5、程序执行过程中输入5 4 3 2 1 ,写出以下程序的运行结果。 #include //类似于C中的stdio.h using namespace std; //命名空间 int main() { }

二、编程题

1、逻辑推理题:新郎与新娘。三对情侣参加婚礼,三位新郎为A、B、C,三位新娘为X、Y、Z。有人不知道谁和谁结婚,于是询问了六位新人中的三位,听到的回答是这样的:A说他将和X结婚;X说她的未婚夫是C;C说他将和Z结婚。这个人听后,知道他们在开玩笑,全是假话。请编程找出谁将和谁结婚。 问题分析与算法设计:

按照题目叙述可以写出表达式: X!=A X!=C Z!=C

A不与X结婚 X的未婚夫不是C C不与Z结婚 int f[5],min,flag; for(int i=0;i<5;i++)

cin>>f[i]; for(int j=0;j<5;j++) {

min=f[j]; flag=j;

for(int k=j+1;k<5;k++) {

if(f[k]

flag=k;

}

if(flag!=j) { f[flag]=f[j]; }

f[j]=min;

}

for(int m=0;m<5;m++) cout<

另外,隐含着X、Y、Z三个新娘不能结为配偶,则有:

X!=Y并且X!=Z并且Y!=Z

使用穷举法,进行推理运算,若假设的情况使得上述表达式的值都为真,则此情况就是正确结果。 程序代码:

#include using namespace std; int main() {

int x,y,z; for(x=1;x<=3;x++)

for(y=1;y<=3;y++)

for(z=1;z<=3;z++) if(x!=1 && x!=3 && z!=3 && x!=y && x!=z && y!=z)

{ }

cout<<\cout<<\cout<<\

return 0; }

2、写出计算f(n)=1/2+2/3+3/4+…+n/n+1(n为正整数)的递归程序,n由用户从键盘输入。 分析:递归调用的含义是函数自己调用自己,在递归函数中,需要有终止条件。题目中的递归函数需要根据输入整数的不同取值范围,分别进行计算。 当n<=0时,f(n)=0

当n>0时,f(n)=f(n-1)+n/(n+1)

需要注意的是,在计算n/(n+1)时,需要先将整型数转换为浮点数,才能进行计算。 程序代码:

#include using namespace std;

double f(int m) { }

double sum; //sum存放计算结果 if(m<=0)

sum=0.0;

if(m>0) sum=f(m-1)+double(m)/double(m+1); return sum;

int main() {

}

int n;

cin>>n;

cout<<\return 0;

3、假定一个高科技公司所有员工的每周工作时间保存在一个二维数组中。每行保存一个员工7天的工作时间。例如,下面的数组保存了7名员工的每周工作时间。编写一个程序,按照周工作总时数递减的次序输出所有员工以及他们的周工作总时数。 员工0 员工1 员工2 员工3 员工4 员工5 员工6 周日 2 7 3 9 3 3 3 周一 4 3 3 3 5 4 7 周二 3 4 4 4 4 4 4 周三 4 3 3 7 3 6 8 周四 5 3 3 3 6 3 3 周五 8 4 2 4 3 4 8 周六 8 4 2 1 8 4 4 分析: 本题目考察数组的使用方法和排序算法。首先将所有员工的每周每天工作时间保存在一个二维数组中,接着将所有员工的周工作总时数计算出来,并保存在一个一维数组中,将员工的序号保存在另外一个一维数组中。使用排序算法(选择排序、插入排序、冒泡排序等)从大到小排列并输出结果。 程序代码:

#include using namespace std;

int main() { int a[7][7]={{2,4,3,4,5,8,8},{7,3,4,3,3,4,4},{3,3,4,3,3,2,2},{9,3,4,7,3,4,1}, {3,5,4,3,6,3,8},{3,4,4,6,3,4,4},{3,7,4,8,3,8,4}};

int b[7],c[7]; int i,j,temp; for(i=0;i<7;i++) {

b[i]=0; c[i]=i;

for(j=0;j<7;j++) b[i]+=a[i][j]; //计算每一位员工的总工时数

//选择排序,从大到小排

//二维数组a存放每一位员工每天的工时数

//b数组存放每一位员工的总工时数,c数组存放员工序列号 //i,j是循环变量,temp是临时变量

}

for(i=0;i<7;i++) {

for(j=i+1;j<7;j++) {

}

if(b[i]

temp=b[i];b[i]=b[j];b[j]=temp; temp=c[i];c[i]=c[j];c[j]=temp; }

}

cout<<\员工\的工时数为\

} return 0;

4、编写一个程序,检查字符串s1是否是字符串s2的子串。如果s1是s2的子串,函数返回第一次匹配处的下标;否则,返回-1。函数原型如下: int indexof(const char*s1, const char*s2)

编写一个测试程序,读入两个字符串,调用indexof函数。

分析:

需要对s1和s2这两个字符串中的每个字符依次进行比较,如果相同,则比较下一个字符,如果不相同,则从s1的第一个字符重新开始比较。

5、编写一个函数,分析一个表示二进制数的字符串,将其转换为十进制整数,函数原型如下:int parsebinary(const char*)

例如,parsebinary(“10001”)返回整数17。使用二进制串11111111测试parsebinary函数。 分析:

二进制数是一个字符串,需要判断字符串的长度。将此字符串中的内容按位取出,如果为1,则累加2的相应位次幂。

第2章类与对象

类是面向对象程序设计中最基本并且最重要的概念,也是面向对象方法的第一个难点。类是对逻辑上相关的函数与数据的封装,是对问题的抽象描述。对象是类的实例化,是抽象的具体实现,类和对象的关系,是抽象与具体的关系,类概括出事物的本质特点,对象是对这些特点的具体体现。

实验目的和要求:

1. 掌握类和对象的使用。

2. 掌握类的构造函数与析构函数。 3. 掌握构造函数的重载。 4. 了解拷贝构造函数的方法。

5. 熟悉静态成员的使用和意义。

6. 掌握友元的含义(友元函数、友元成员、友元类)。 7. 掌握new和delete的使用。

实验内容:

一、程序分析题

1、写出以下程序的执行结果。 #include using namespace std; class Tdate{ public:

Tdate(){ Init(4,15,1995); } Tdate(int d){ Init(4,d,1996); }

Tdate(int m,int d){ Init(m,d,1997); } Tdate(int m,int d,int y){ Init(m,d,y); } protected: int month; int day; int year;

void Init(int m,int d,int y) {

month=m; day=d; year=y;

cout <

int main() {

Tdate aday; Tdate bday(10); Tdate cday(2,12); Tdate dday(1,2,1998); return 0; }

2、写出以下程序的执行结果。 #include using namespace std; class MyClass{

public:

MyClass(); MyClass(int); ~MyClass(); void Display(); protected: int number; };

MyClass::MyClass(){number =0;cout <<\MyClass::MyClass(int m):number(m) {

cout <<\ }

void MyClass::Display(){ cout <<\MyClass::~MyClass(){ cout <<\int main() {

MyClass obj1; MyClass obj2(20);

obj1.Display(); obj2.Display(); return 0; }

3、写出以下程序的执行结果。 #include using namespace std; class AA{ public: AA(int a){i=a;cout<<\ AA(int a,int b){i=a;j=b;cout<<\ ~AA(){cout<<\ } private: int i; int j; };

int main() { AA a[2]={AA(3),AA(4,5)}; return 0; }

4、阅读下面的程序,写出当输入25时的输出结果。 #include using namespace std; class goods{

private:

static int totalWeight; int weight;

public:

goods(int w) {

weight=w;

totalWeight+=w; }

goods(goods& gd) {

weight=gd.weight; totalWeight+=weight; }

~goods() { }

int getwg() {

return weight; }

static int getTotal() {

return totalWeight; }

};

int goods::totalWeight=0; int main() {

int w;

cout<<\ cout<<\ cin>>w; //输入25 goods g1(w); //构造函数被调用

cout<<\

cout<<\

goods g2(g1); //拷贝构造函数被调用

cout<<\ cout<<\ return 0; }

5、阅读下面程序,写出运行结果。

#include using namespace std; class csample { private:

int i;

static int k;

public:

csample(int t); void display(); }; csample::csample(int t){ i=t; k++; }

void csample::display(){

cout<<”i=”<

int csample::k=0; int main(){

csample a(3),b(5); a.display(); b.display(); return 0; }

二、编程题

1、阅读以下程序,将主函数编写完整。声明一个时间类Time,类中有3个私有数据成员Hour,Minute,Second和两个公有成员函数SetTime,PrintTime。SetTime根据传递的3个参数为对象设置时间。PrintTime将对象表示的时间显示输出。在main函数中,建立一个时间类的对象,设置时间为9点20分30秒,并显示该时间。 #include using namespace std; class Time{ private: int Hour,Minute,Second;

public: void SetTime(int h,int m,int s)

{

Hour=h; Minute=m;

Second=s; }

void PrintTime() {

cout<

int main() {

class triangle //三角形类

{

private: double a,b,c; public:

//三角形的三条边长

triangle(double A=0.0,double B=0.0,double C=0.0);//构造函数 void area(); //计算面积

};

//文件triangle.cpp #include”triangle.h” #include #include using namespace std;

triangle::triangle(double A,double B,double C) {

a=A; b=B; c=C;

}

void triangle::area() { }

double s=(a+b+c)/2.0;

cout<<\三角形面积:\

//应用程序文件app.cpp #include”triangle.h” #include using namespace std; int main() { }

2.为有理数定义一个Rational类。有理数可以表示成为两个相除的整数,比如3/4,13/3等等。将有理数表示成int类型的两个值,分别表示分子和分母。Rational类包括三个构造函数,分别是接收2个int参数的构造函数,该构造函数将一个对象的数据成员设为任何合法的值;接收1个int参数的构造函数,将这个单独的形参命名为whole_number,使对象初始化为有理数whoel_number/1;默认构造函数,将对象初始化为0(也就是0/1)。

double a,b,c;

cout<<\请输入三角形的三条边长:\

cin>>a>>b>>c; triangle tr(a,b,c); tr.area(); return 0;

重载输入和输出操作符>>和<<。数字以3/4,200/301这样的形式来输入和输出。注意,分子和分母有可能含有减号。

将Rational类的定义部分和实现部分存放在不同的文件中,并且编写应用程序来测试Rational类。 分析:

本题目考察Rational类的构造,重载的构造函数,以及重载运算符>>和<<,在编写代码过程中,需要将Rational定义部分放入rational.h文件,将Rational实现部分放入rational.cpp文件,此外需要编写应用文件(如application.cpp)来使用Rational类。

3.定义复数complex类。复数的形式是:a+bi,其中a和b是double类型的数字,i是虚数单位,数据成员命名为real和imaginary。complex类包括接收两个double参数的构造函数,以及默认的构造函数,默认构造函数将对象初始化为0,即0+0i。重载运算符==,+,-,*,>>,<<,使它们正确地支持complex类型。

将complex类的定义部分和实现部分存放在不同的文件中,并且编写应用程序来测试complex类。 分析:

本题目考察类的构造,运算符重载,以及多文件结构。将complex类的定义和实现分别存放在complex.h和complex.cpp文件中。

第6章模板

模板是类型参数化的工具,也是C++通用编程实现的机制。类型参数化是把类型定义为参数,当参数实例化时,可指定不同的数据类型,从而实现真正的代码重用。在C++中,模板分为函数模板和类模板。

C++标准模板库STL是C++标准函数库的一个子集,这个子集占据了整个库的80%分量,标准模板库STL通过相应的运算法则在应用程序的容器、迭代器、算法及其他定义的序列中建立一种统一的标准。

实验目的和要求:

1. 熟悉模板的概念,掌握函数模板与模板函数、类模板与模板类。 2. 了解C++标准模板库STL的容器类的使用方法。 3. 应用C++标准模板库STL通用算法和函数。

实验内容:

一、程序分析题

1. 有以下程序,写出运行结果。 #include using namespace std; template T total(T *data) { }

T s=0;

while(*data) s+=*data++; return s;

int main() { }

2.写出下列程序的输出结果。 #include using namespace std; template

T fun(T a, T b){return (a<=b)?a:b;} int main() {

cout<

}

3.有以下程序,写出运行结果。

int x[]={2,4,6,8,0,12,14,16,18}; cout<

#include using namespace std; template class HClass {

private:

TYPE data;

public:

HClass(TYPE a, TYPE b, TYPE c);

TYPE getData(){return data;} };

template

HClass< TYPE>::HClass(TYPE a, TYPE b, TYPE c) {

if(a>b&&a>c) data=a; else if(b>c) data=b;

else data=c;

}

int main() { }

HClass x1(1,2,3),x2(2,3,4),x3(3,4,5),x4(4,5,6),x5(5,6,7);

cout<

4.下面是一个栈类的模板,其中push函数将元素i压入栈顶,pop函数弹出栈顶元素。栈初始为空,top值为0,栈顶元素在stack[top-1]中。写出程序输出结果。 #include using namespace std; template class Tstack {

private: enum{size=1000};

T stack[size]; int top;

Tstack():top(0){}

void push(const T &i){

if(top

public:

}

T pop(){ if(top==0)

};

}

{

cout<<\ exit(1);

}//栈空时终止运行 return stack[--top];

int main() {

Tstack s; s.push(1); cout<

}

5.写出下面程序的输出结果。 #include using namespace std; template T average(T *data) {

T s=0;

int i=0;

while(data[i]) s+=data[i++]; return s/(i+1); }

int main() {

double x[]={1.2,2.3,3.4,4.5,5.6,6.7,7.8,8.9}; cout<

二、编程题

1.编写程序,使用函数模板求数组x[]的最大值。 分析:

本题目考察函数模板的编写方法和使用方法,求数组最大值的模板函数可以应用于整型数组、浮点型数组等多种类型。 程序代码如下: #include using namespace std;

}

char* getname() { return name; } int getage() { return age; } };

class leader:virtual public base // 领导类 {

private:

char *job;//职务 char *dep;//部门 leader() { }

void setjob(char jb[]) { job=new char[strlen(jb)+1];

public:

strcpy (job, jb); }

void setdep(char dp[]) { dep=new char [strlen (dp) +1] ;

strcpy (dep, dp); }

char *getjob() { return job; } char *getdep() { return dep; } };

class engineer:virtual public base // 工程师类 {

private:

char *major; // 专业 char *prof; // 职称 public:

engineer () { }

void setmajor(char maj [])

{

major=new char[strlen(maj)+1];

strcpy (major,maj); } void setprof(char pf[])

{ }

prof=new char[strlen(pf)+1]; strcpy (prof, pf);

char*getmajor() {return major; } char*getprof() {return prof; } };

class chairman:public leader,public engineer // 主任工程师类 { };

int main() {

chairman c;

c.setname(\李明\ c.setage(42);

c.setjob(\处长\ c.setdep(\设计处\

c.setmajor(\电站锅炉设计\ c.setprof(\高级工程师\ cout<<\输出结果:\ cout<<\\

\

\,\

cout<<\,从事\专业\。 \ }

return 0;

2、定义一个Person类,它包含数据成员age、name和gender。从Person中派生一个类Employee,在新类中添加一个数据成员,存储个人的number。再从Employee中派生一个类Executive,每个派生类都应定义一个函数,来显示相关的信息(名称和类型,如\Smith is an Employee\)。编写一个main()函数,生成两个数组,一个数组包含5个Executive对象,另一个数组包含5个一般的Employee对象,然后显示它们的信息。另外,调用从Employee类继承的成员函数,显示Executive的信息。 分析:

本题目考察类继承的使用方法,以及对象数组的使用方法。 程序代码如下:

#include #include using namespace std;

class Person {

public:

Person(): age(0), name(\默认构造函数 Person(int theAge, string theName, char theGender); void who() const; //显示详细信息

protected:

int age; //年龄 string name;

char gender; // 'm'或'f' };

class Employee: public Person {

public:

Employee() {}; //默认构造函数

Employee(int theAge, string theName, char theGender, long persNum): Person(theAge, theName, theGender), personnelNumber(persNum) {}

void who() const; //显示详细信息 protected:

long personnelNumber; };

class Executive: public Employee {

public:

Executive() {}; //默认构造函数

Executive(int theAge, string theName, char theGender, long persNum): Employee(theAge, theName, theGender, persNum) {}

void who() const; //显示详细信息 };

Person::Person(int theAge, string theName, char theGender): age(theAge), name(theName), gender(theGender) {}

void Person::who() const {

cout << \}

void Employee::who() const {

cout << endl

<< name << \ << \}

void Executive::who() const

{

cout << endl

<< name << \is a \<< (gender == 'f' ? \: \<< \executive.\

}

int main() {

Employee employees[5];

employees[0] = Employee(21, \ employees[1] = Employee(32, \ employees[2] = Employee(46, \

employees[3] = Employee(37, \ employees[4] = Employee(65, \

int i = 0;

for (i=0; i

Executive executives[5];

executives[0] = Executive(44, \ executives[1] = Executive(32, \ executives[2] = Executive(42, \ executives[3] = Executive(33, \ executives[4] = Executive(29, \

for(i = 0 ; i

executives[i].who();

executives[i].Employee::who(); }

cout << endl; return 0; }

3、定义一个基类Animal,它包含两个私有数据成员,一个是name,存储动物的名称(例如\或\),另一个是整数成员weight,包含该动物的重量(单位是磅)。该类还包含一个公共成员函数who(),它可以显示一个消息,给出Animal对象的名称和重量。把Animal用作公共基类,派生两个类Lion和Crocodile。再编写一个main()函数,创建Lion和Crocodile对象(\,400磅;\,50磅)。为派生类对象调用who()成员函数,who()成员函数在两个派生类中是继承得来的。

分析:

本题目考察继承和派生的使用方法,派生类成员函数的使用方法。 程序代码如下:

#include #include

using namespace std;

class Animal

{

public:

Animal(string theName, int wt); //构造函数

void who() const; //显示名字和重量 private:

string name; int weight; };

Animal::Animal(string theName, int wt): name(theName), weight(wt) { }

//识别动物

void Animal::who() const

{

cout << \}

class Lion: public Animal {

public:

Lion(string theName, int wt): Animal(theName, wt) {} };

class Crocodile: public Animal {

public:

Crocodile(string theName, int wt): Animal(theName, wt) {} };

int main() {

Lion lion1(\

Crocodile crocodile1(\ lion1.who();

crocodile1.who(); }

4、下面的程序包含了Time类和Date类的声明,要求编写程序,设计一个Birthtime类,它继承了Time类和Date类,并且还有一项出生孩子的名字Childname,同时设计主程序显示一个小孩的出生时间和名字。 #include #include

return 0;

//动物名字 //动物重量

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

Top