大工软院 c++实验讲义.docx

上传人:b****2 文档编号:1696128 上传时间:2023-05-01 格式:DOCX 页数:26 大小:36.83KB
下载 相关 举报
大工软院 c++实验讲义.docx_第1页
第1页 / 共26页
大工软院 c++实验讲义.docx_第2页
第2页 / 共26页
大工软院 c++实验讲义.docx_第3页
第3页 / 共26页
大工软院 c++实验讲义.docx_第4页
第4页 / 共26页
大工软院 c++实验讲义.docx_第5页
第5页 / 共26页
大工软院 c++实验讲义.docx_第6页
第6页 / 共26页
大工软院 c++实验讲义.docx_第7页
第7页 / 共26页
大工软院 c++实验讲义.docx_第8页
第8页 / 共26页
大工软院 c++实验讲义.docx_第9页
第9页 / 共26页
大工软院 c++实验讲义.docx_第10页
第10页 / 共26页
大工软院 c++实验讲义.docx_第11页
第11页 / 共26页
大工软院 c++实验讲义.docx_第12页
第12页 / 共26页
大工软院 c++实验讲义.docx_第13页
第13页 / 共26页
大工软院 c++实验讲义.docx_第14页
第14页 / 共26页
大工软院 c++实验讲义.docx_第15页
第15页 / 共26页
大工软院 c++实验讲义.docx_第16页
第16页 / 共26页
大工软院 c++实验讲义.docx_第17页
第17页 / 共26页
大工软院 c++实验讲义.docx_第18页
第18页 / 共26页
大工软院 c++实验讲义.docx_第19页
第19页 / 共26页
大工软院 c++实验讲义.docx_第20页
第20页 / 共26页
亲,该文档总共26页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

大工软院 c++实验讲义.docx

《大工软院 c++实验讲义.docx》由会员分享,可在线阅读,更多相关《大工软院 c++实验讲义.docx(26页珍藏版)》请在冰点文库上搜索。

大工软院 c++实验讲义.docx

大工软院c++实验讲义

C++程序设计实验讲义

 

软件学院C++教学团队

目录

 

实验1在小范围内用C++增强C的功能3

实验2类的定义与应用5

实验3this指针、常量和静态成员和友元函数的使用8

实验4派生与继承13

实验5多态性16

实验6IO流上机实验20

实验7运算符重载、模板22

实验8windows程序设计25

实验1在小范围内用C++增强C的功能

1.实验目的和要求

目的:

快速掌握C++语言编程的方法,在小范围内增强C++的功能,主要内容有:

(1)输入流、输出流的使用;

(2)函数原型;(3)new和delete运算符分配内存。

2.实验内容:

(1)编写一个用输入和输出流运算符进行的输入和输出的程序。

从键盘输入两个数,分别对两个数进行加,减,乘和除的运算。

并输出计算结果,如:

23+123=146。

(2)用new和delete运算符动态分配内存空间的方法编写程序。

从键盘输入33整型数组的数据,并计算出所有元素之和,打印出最大值和最小值。

输入输出要用流运算符实现。

(3)编写C++风格的程序,解决百钱问题:

将1元人民币兑换成1,2,5分的人民币,有多少种换法?

(4)在主函数中定义2个整型元素a,b,用引用作函数参数的方法,在函数voidswap(int&x,int&y)中实现将数据交换存放,并在主函数中打印出来。

(5)假设我们班有50名同学,每个同学都报出自己的生日,每个同学的生日都不相重的概率只有0.0296,如果有100个同学,不相重的概率为3.072510-7。

相重复的概率如此之大与我们主观想象不同。

写一个程序,输入同学的人数n计算出其生日不重复的概率。

然后在用彷真的方法,利用随机数产生每个同学的生日,计算出生日不重复的概率并与前面的结果进行比较。

[学生的生日可以用随机数产生,rand()产生0—32767之间的伪随机数,因为此需要一个种子,种子不同产生的随机数列不同,rand()产生的随机数也不同,可以调用srand(longint*)函数设置种子,比如我们可以获得计算机中的时间获得随机数种子,以上函数需要包含头文件stdlib.h]

3.思考题:

结合上机的体会,回答下列问题.

(1)C++引入了I/O流运算符,与C语言相比,它们好处是什么?

(2)与C语言的动态分配内存函数相比,C++的new和delete运算符的优点是什么?

(3)引用是C++的很重要的功能,在函数定义中,如何使用引用,会实现怎样的效果?

实验2类的定义与应用

1、实验目的和要求:

掌握类定义的方法,理解类类型,实例的含义,体会面向对象程序设计中数据隐藏的概念。

理解构造函数和析构函数的作用和运行实际,掌握拷贝构造函数的作用。

并熟练掌握复杂对象类型的运用。

2、实验内容:

(1)定义一个时间类Time,它能提供由时分秒组成的时间。

要求能够修改时间和打印出时间。

(2)编写一个计数器类,定义一个私有数据成员,通过两个成员函数,分别使其完成加1和减1操作。

用构造函数数据成员初始化为0,输出函数可以输出数据成员函数的值。

(3)设计一个时间类,要求包含以下功能:

数据成员:

时、分、秒

成员函数:

各种构造函数

析构函数

可以通过函数分别设置时间的各个组成部分

也可以整体设置时间

有一个tick函数,负责给当前时间加1秒钟,然后输出新的时间

(4)定义一个分数类如下,要求实现各个成员函数,并在主函数中测试两个分数的加减乘除等运算。

classRational{

public:

Rational(intnn=1,intmm=1);//构造

RationalR_add(Rational&A);//加

RationalR_sub(Rational&A);//减

voidR_mul(Rational&A);//乘

voidR_div(Rational&A,Rational&B);//除

voidsimple();//约分

voidprint();//以分数形式显示,注意约分

private:

intm;//分母

intn;//分子

};

(5)定义一个类包含一个整型数的指针变量,在构造函数中用new分配10各整型数的内存空间,在析构函数中用delete释放内存空间,并编写给内存空间赋值和输出函数。

(6)编写类String的构造函数、析构函数

已知类String的原型为:

classString

{

public:

String(constchar*str=NULL);//普通构造函数

String(constString&other);//拷贝构造函数

~String(void);//析构函数

private:

char*m_data;//用于保存字符串

};

请编写String的上述3个函数。

并编写一个主函数,在主函数中对所编写的成员函数进行测试。

(7)定义和实现类Array。

数据成员有包含了10个元素的数组,成员函数GetData,有一个整形数参数i,函数返回下标为i的元素值,对一个数组元素的引用,成员函数Print打印出数组的值。

构造函数将数据成员的所有数组元素初始化为0。

还有一个input成员函数为数组赋值。

(8)定义类Point.要求定义类对象时,可以有这样的定义语句:

Pointp1(1,2),p2(p1);

#include

classPoint

{

public:

Point(inta,intb)

{

x=a;y=b;

}

voidfun(Point&p);

voidfun(Point*p);

private:

intx,y;

};

voidfun(Point&p)

{

x=p.x;

y=p.y;

cout<<"Thefun(Point&p)"<

}

voidPoint:

:

fun(Point*p)

{

x=p->x;

y=p->y;

cout<<"Fun(Point*p)"<

}

Voidmain()

{

Pointp(1,2),q(3,4);

p.fun(q);

q.fun(&q);

}

改正程序中小的错误,给出程序运行的结果,并对程序进行分析。

3、思考题:

结合编程实践回答下列的问题。

(1)结合第一个例子,说明什么是类?

什么是对象?

你是如何理解类和对象的?

(2)面向对象的程序设计与结构化程序设计有何不同?

(3)拷贝构造函数那些情况下会被调用,分别给出例子?

实验3this指针、常量和静态成员和友元函数的使用

1、实验目的和要求:

(1)掌握显式使用this指针的方法

(2)掌握静态数据成员的意义及使用方法

(3)掌握常量数据成员和常量成员函数的意义和使用方法

(4)掌握友元函数和友元类的使用方法

2、实验内容:

(1)有如下类的定义。

类成员函数copy用于实现两个对象的相互拷贝,请完成该函数的实现。

(有两种方法即不用this指针和用this指针)

#include

classMyclass

{public:

Myclass(inta,intb){x=a;y=b;}

Voidcopy(Myclass&my);

voidprint()

{cout<<“x=”<

cout<<”y=”<

}

private:

intx,y;

};

voidmain()

{Myclassmy(10,20),t(30,40);

my.print();

my.Copy(t);

my.print();

}

(2)设计一个类,实现两个复数的四则运算。

实现加减乘除功能的函数用友元函数实现。

(3)分析下面程序,给出横线部分的语句,并分析程序的输出,和m_count的功能。

#include

usingnamespacestd;

classA{

staticintm_counter;

public:

A();

~A();

staticvoiddisplay();

}

——————————//将m_counter初始化为0;

A:

A()

{

m_counter++;

}

A:

:

~A()

{

m_counter--;

}

voidA:

:

display()

{

cout<<”Thereare:

”<

:

m_counter<<”objectsofclassA.\n”;

}

intmain()

{

Aa1;

Aa2;

Aa3;

A:

:

display();

a1.display();

}

(4)商店经销一种货物,货物成箱购进,成箱卖出,购进和卖出时以重量为单位,各箱的重量不一样,单价不一样,因此商店需要记录下目前库存的货物的总重量和总价值。

编写一个程序,通过定义类Carlo来模拟商店货物购进和卖出的情况。

(本题目主要练习静态数据成员的使用,定义私有变量存每件货物的价格和重量,用静态数据成员存货物的总重量和总价钱,定义构造函数和析构函数,当定义新的对象完成初始化的功能和删除对象时,从总重量和总价钱中减去对象的重量和价格)

(5)静态成员练习

1)。

编写一个类Node,声明一个数据成员member和已经静态成员count,另构造函数初始化数据成员,并把静态数据成员加1,另析构函数把静态数据成员减1。

2)。

在1)的基础上编写应用程序,创建3个对象,然后显示他们的数据成员和静态成员,再析构每个对象,并显示他们对静态数据成员的影响。

3)。

修改2),让静态成员函数访问静态数据成员,并让静态数据成员是私有的。

(6)个类分别为整型数集合类和实型数集合数类。

将缺少的内容补齐。

并完成要求的其它内容。

如:

classIntset

{private:

intnum[3];

public:

Intset(intx,inty,intz)

{//添加初始化内容}

voidprint()

{//打印数据}

};

classfloatset

{private:

floatnum[3];

public:

floatset(floatx,floaty,floatz)

{

//添加初始化内容

}

voidprint()

{//打印数据

}

};

(1)在Intset中再增加一个成员函数,将对象的整型数据拷贝的到floatset的对象中此成员函数的原型为:

voidsettofloat(floatset&set);//形参为拷贝的目标对象

(2)办法需要调用函数,程序的开销较大,可以定义一个友元函数来实现上述的功能。

请分别完成两个程序。

(7)分析以下程序的功能,把程序用三种方法(公有数据成员、友元、用成员函数访问私有数据成员)补充完整,实现对对象peppy的成员

#include

classAnimal;

voidSetValue(Animal&,int);

voidSetValue(Animal&,int,int);

classAnimal

{

public:

Animal():

itsWeight(0),itsAge(0){}

voidshow(){cout<

protected:

intitsWeight;

intitsAge;

};

voidSetValue(Animal&ta,inttw)

{

//设置itsWeight值

}

voidSetValue(Animal&ta,inttw,inttn)

{

//设置itsWeight和itsAge值

}

intmain()

{

Animalpeppy;

SetValue(peppy,5);

peppy.show();

SetValue(peppy,7,9);

peppy.show();

return0;

}

(8)设计一个整数链表类,满足栈操作。

即,总在链表首插入结点,总在链表首取出(删除)结点。

类中需有记录结点个数的数据成员。

如果链表为空,而要做取出结点操作,则类必须给出错误信息。

编写应用程序,取100次随机数(范围10-200),每取到比前一个随机数大时,放入链表中,否则,略去。

然后逐个取出,求其和。

用堆分配方法逐个产生满足条件的结点,插入链表中。

每当从链表中取出一个结点时,要及时将结点删除。

求和工作不要在链表类中完成,以使该链表类具有通用性。

3、思考题:

结合编程实践回答下列的问题。

(1)什么是this指针,它的主要作用是什么?

(2)总结静态成员的特点。

实验4派生与继承

1、实验目的和要求:

此实验用两个单元的时间完成,是一个综合性的实验,要求编写的程序涉及到C++的许多知识点,如类的定义,动态分配内存,构造函数,派生,虚基类等。

实验内容给出的是一个完整的程序,4个题目实际是类等级。

同学也可以在此基础上发挥增加新的内容。

2、实验内容:

1.定义一个基类MyArray,基类中可以存放一组数组。

ClassMyarray

{int*alist;

intlength;

public:

Myarray(intleng);

~myarray();

voidinput();

voiddisplay();

};

编写构造函数,析构函数及其它函数,实现动态分配内存,释放内存和数据输入输出等功能。

并进行调试。

2.定义一个类averarray继承自myarray,在类中求数组的平均值,并输出。

进行调试。

3.定义一个类revarray继承自myarray,使数组按反序存放,并输出。

进行调试。

4.定义一个类Nawarray继承自averarray和revarray。

在继承过程中声明为虚基类,体会虚基类在解决二义性中的问题中的作用。

调试中可以试一试不用虚基类出现的问题。

5.读程序,回答问题

#include

usingnamespacestd;

classA

{

public:

voidf1();

A(){i1=10;j1=11;}

protected:

intj1;

private:

inti1;

};

classB:

privateA

{

public:

voidf2();

B(){i2=20;j2=21;}

protected:

intj2;

private:

inti2;

};

classC:

publicB

{

public:

voidf3();

C(){i3=30;j3=31;}

protected:

intj3;

private:

inti3;

};

回答下列问题:

(1)派生类B中成员函数f2()能否访问基类A中的成员f1()、i1和j1?

(2)派生类B的对象b能否访问基类A中的成员f1()、i1和j1?

(3)派生类C中成员函数f3()能否访问直接基类B中的成员f2()、i2和j2?

能否访问间接基类A中的成员f1()、j1和i1?

(4)派生类C的对象c能否访问直接基类B中的成员f2()、i2和j2?

能否访问间接基类A中的成员f1()、j1和i1?

6.编写一个程序,实现字符串操作:

一个简单串类string,包含输入字符串、返回字符串长度及内容等功能;

另有一个具有编辑功能的串类edit_string,它继承string类,在其中设置一个光标,使其能支持在光标处的插入、替换和删除等编辑功能。

 

实验5多态性

1.实验目的和要求:

(1)理解多态性、虚拟函数、抽象类和具体类、静态绑定和动态绑定等概念

(2)学会利用虚函数来实现多态性,以便更好地来扩展和维护系统

(3)理解C++如何实现虚拟函数和动态绑定(*)

2.实验内容:

(1)以下是一个计算正方体、球体和圆柱体的面积和体积的程序。

试分析程序

并写出程序的运行结果,然后上机运行验证。

#include

classcontainer

{

protected:

doubleradius;

public:

container(doubleradius)

{

container:

:

radius=radius;

}

virtualdoublesurface_area()=0;

virtualdoublevolume()=0;

};

classcube:

publiccontainer

{

public:

cube(doubleradius):

container(radius){};

doublesurface_area()

{

returnradius*radius*6;

}

doublevolume()

{

returnradius*radius*radius;

}

};

classsphere:

publiccontainer

{

public:

sphere(doubleradius):

container(radius){};

doublesurface_area()

{

return4*3.1416*radius*radius;

}

doublevolume()

{

return3.1416*radius*radius*radius*4/3;

}

};

classcylinder:

publiccontainer

{

doubleheight;

public:

cylinder(doubleradius,doubleheight):

container(radius)

{

cylinder:

:

height=height;

}

doublesurface_area()

{

return2*3.1416*radius*(height+radius);

}

doublevolume()

{

return3.1416*radius*radius*height;

}

};

voidmain()

{

container*p;

cubeobj1(10);

sphereobj2(6);

cylinderobj3(4,5);

p=&obj1;

cout<<"输出结果:

"<

cout<<"正方体表面积:

"<surface_area()<

cout<<"正方体体积:

"<volume()<

p=&obj2;

cout<<"球体表面积:

"<surface_area()<

cout<<"球体体积:

"<volume()<

p=&obj3;

cout<<"圆柱体表面积:

"<surface_area()<

cout<<"圆柱体体积:

"<volume()<

}

(2)实现下图中的Shape层次结构。

每个TwoDimensionalShape类应包括成员函数getArea,以计算二维图形的面积。

每个ThreeDimensionalShape类包含成员函数getArea和getVolume,分别计算三维图形的表面积和体积。

编写一个程序,使用层次结构中每个具体类的对象的Shape向量指针。

程序要打印出向量元素所指的对象。

同样,再将所有形状存入向量的循环中,要能判断每个图形到底属于TwoDimensionalShape还是属于ThreeDimenionalShape。

如果某个图形是TwoDimensionalShape就显示其面积,如果某个图形是ThreeDimenionalShape,则显示其面积和体积。

(3)编写一个程序,先设计一个链表List类,再从链表类派生出一个集合类Set类,再集合类中添加一个记录元素个数的数据项。

要求可以实现对集合的插入、删除、查找和显示。

3.结合上机体会,回答下列问题

(1)多态性是如何让程序“普遍化”而非“特殊化”的?

试说明程序“普遍化”的主要好处。

(2)什么是虚拟函数?

请说明虚拟函数适用的环境。

(3)多态性是如何提高可扩展性的?

(4)说出静态绑定和动态绑定的区别,并试解释说明动态绑定究竟是如何实现的?

 

实验6IO流上机实验

1.实验目的和要求

(1)理解I/O流与标准流对象的意义

(2)掌握常用的IO成员函数:

(3)掌握文件的基本操作

(4)理解二进制文件与文本文件的区别

(5)熟练掌握文件的顺序读写方法

(6)熟练掌握文件的随机读写方法

2.实验内容:

(1)由希腊著名数学家埃拉托色尼提出求解素数的“筛选法”,

1)阅读程序改正其中的错误,使其能输出100以内的所有素数。

2)改写该程序,将1~Num以内的所有素数按清晰的格式写入文件中。

3)从文件中读出n~m(1

#include

#include

usingnamespacestd;

intmain()

{

constintMAX=100;

boolisPrime[MAX];

for(inti=0;i

isPrime[i]=true;

isPrime[0]=isPrime[1]=false;//1和0不是素数

intn=sqrt(MAX)+1;

for(i=2;i

{

//素数的整数倍不是素数,从而筛选掉所有不是素数的数

if(isPrime[i])

{

for(intj=2*i;j

isPrime[j]=false;

}

}

for(i=2;i

if(isPrime[i])

cout<

return0;

}

(2)课程管理程序

设计程序对学生选修课程情况进行记录和管理。

一名学生可选修多门课程,每条课程记录包括课程名,学分,选修学期和成绩等信息。

要求进行如下操作:

1)输入多个学生的选修课程信息,以清晰的格式写到文件中;

2)修改某个学生的选课记录,增加新选修的课程;

3)在文件中查找某个学生的信息,输出所有选修的课程;

4)删除某个学生的所有选课

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 人文社科 > 法律资料

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2