面向对象程序设计实验报告_第1页
面向对象程序设计实验报告_第2页
面向对象程序设计实验报告_第3页
面向对象程序设计实验报告_第4页
面向对象程序设计实验报告_第5页
已阅读5页,还剩30页未读 继续免费阅读

下载本文档

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

文档简介

南昌航空高校试验报告

二年月日

课程名称:面对对象程序设计B试验名称:类与结构

班级:XXXXXXX同学姓名:XXXXXX学号:

指导老师评定:XX签名:XXXXX

1、试验目的

•学习把握声明和定义类及成员。

•学习把握访问类对象成员。

•学习把握爱护数据如何屏蔽外部访问的原理,更好的熟悉类的封装

2、试验内容

(1)

定义一个满意下列要求的Date类:

①用下面的格式输出日期:日/月/年

②可运行在日期上加一天操作

③设置日期

//Date,h

#include<iostrearn.h>

classDate{

public:

voidDisplay();

voidAddOneDay();

voidSetDay(inty,intm,intd);

protected:

boolLegal(inty,intm,intd);

boolIsLeapYear(inty);

intyear;

intmonth;

intday;

};

voidDate::Display()

{cout<<day<<〃/“<<month<<"/"<<year«endl;

}

voidDate::AddOneDay()

(

if(Legal(year,month,day+1))

day++;

elseif(Legal(year,month+1,1))

month++,day=l;

elseif(Legal(year+1,1,1))

day=1,month=l,year++;

voidDate::SetDay(inty,intm,intd)

{if(Legal(y,m,d))

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

}

boolDate::Legal(inty,intm,intcl)

{if(y>9999||y<l||d<l||m<l||m>12)

returnfalse;

intdayLimit=31;

switch(m)case4:case6:case9:case11:dayLimit—;

if(m==2)dayLimit=IsLeapYear(y)?29:28;

return(d>dayLimit)?false:true;

}

boolDate::IsLeapYear(inty)

{return!(y%4)&&(y%100)I!(y%400);

)

(2)

定义一个时间类Time,能供应和设置由时、分、秒组成的时间,并编出应用程序,定义

时间对象,设置时间,输出该对象供应的时间。并将类定义作为接口,用多文件结构实

现之。

//Time,h

classTime

(

public:

TimeO;

voidPrint();

voidSet(int,int,int);

protected:

intmin;

intsec;

inthour;

};

//time,cpp

^include<iostream.h>

^include"Time.h"

Time::Time()

{min=23;

sec=20;

hour=18;

)

voidTime::Print()

{cout«hour<<min<<,z:,z«sec<<endl;

)

voidTime::Set(ints,intm,inth)

{min=m;

sec=s;

hour=h;

)

//test,cpp

#include<iostream.h>

#include"Time.h〃

voidmain()

{intm,s,h;

Timetime;

cout«z,Nowthetimeis:〃<<endl;

time.Print();

cout«z'Pleaseinputthetime:(sec/min/hour)«endl;

cin»s>>m»h;

while(s<0||s>=60I|m<0||m>=60||h<0||h>24)

(

cout«^Pleaseinputagain:<<endl;

cin>>s>>m>>h;

)

time.Set(s,m,h);

cout<<z,Thetimeofbeingchangedis:〃«endl;

time.Print();

)

南昌航空高校试验报告

二年月日

课程名称:面对对象程序设计B试验名称:静态成员与友元

班级:XXXXXXX同学姓名:XXXXXX学号:

指导老师评定:XX签名:XXXXX

1、试验目的

•学习友元函数的定义和原理。

・学习静态数据成员和静态成员函数的使用。

•学习静态成员代替全局变量实现对象间的共享。

2、试验内容

(1)有如下类的定义。类成员函数copy用于实现两个对象的相互拷贝,请完成该函数

的实现。(有两种方法即不用this指针和用this指针),并采用友员函数实现copy.

#include<iostream.h>

classMyclass

{public:

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

voidcopy(Myclass&my);

voidprint()

{cout«ux=,,«x«endl;

cout«,,y=,,«y«endl;

)

private:

intx,y;

);

voidmain()

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

my.print();

my.Copy(t);

my.print();

)

成员函数实现:

#include<iostream.h>

classMyclass

{public:

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

voidcopy(Myclass&my);

voidprint()

{cout«ux=n«x«endl;

cout<<ny="«y«endl;

)

private:

intx,y;

);

voidMyclass::copy(Myclass&my)

{x=my.x;//this->x=my.x;

y=my.y;//this->y=my.y;

)

voidmain()

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

my.print();

my.copy(t);

my.print();

)

友员函数实现:

#include<iostream.h>

classMyclass

{public:

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

friendvoidcopy(Myclass&o,Myclassy);

voidprint()

{cout«Hx="«x«endl;

cout«My=n«y«endl;

)

private:

intx,y;

};

voidcopy(Myclass&o,Myclassy)

{o.x=y.x;

oy=yy;

)

voidmain()

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

my.print();

copy(my,t);

my.print();

(2)商店经销一种货物,货物成箱购进,成箱卖出,购进和卖出时以重量为单位,各箱

的重量不一样,单价不一样,因此商店需要纪录下目前库存的货物的总重量和总价值。编写

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

(本题目主要练习静态数据成员的使用,定义私有变量存每件货物的价格和重量,用静态数

据成员存货物的总重量和总价钱,定义构造函数和析构函数,当定义新的对象完成初始化的

功能和删除对象时,从总重量和总价钱中减去对象的重量和价格)

//Menu,h

ttifndefMENU」

ttdefineMENU_H

classMenu

{public:

intshow();

);

#endif;

//Carlo.h

classCarlo

{public:

Carlo(doubleWeight=0,doublePrice=0);

virtual"Carlo();

voidSetCarlo(double=0,double=0);

constdouble&GetCurrentTotalWeight()const;

constdouble&GetCurrentTotalPrice()const;

voidBuyBox();

voidSellBox();

voidShowBoxInfor()const;

protected:

staticdoubleTotalWeight;

staticdoubleTotalPrice;

private:

doubleBoxWeight;

doubleBoxPrice;

);

//Carlo,cpp

#include<iostream.h>

#include"Carlo.h〃

doubleCarlo::TotalPrice=0.0;

doubleCarlo::TotalWeight=0.0;

Carlo::Carlo(doubleWeight,doublePrice)

{BoxWeight=Weight;

BoxPrice=Price;

TotalPrice+=Weight*Price;

TotalWeight+=Weight;

}

voidCarlo::BuyBox()

{system(〃cls〃);

Carlocarlo;

doubleWeight,Price;

cout<<〃请输入进货的重量和价格:〃;

cin>>Weight»Price;

carlo.SetCarlo(Weight,Price);

}

constdouble&Carlo::GetCurrentTotalPrice()const

{returnTotalPrice;

}

constdouble&Carlo::GetCurrentTotalWeight()const

{returnTotalWeight;

)

voidCarlo::SetCarlo(doubleWeight,doublePrice)

{BoxWeight=Weight;

BoxPrice=Price;

TotalPrice+=Weight*Price;

TotalWeight+=Weight;

)

voidCarlo::SellBox()

{system(〃cls〃);

doubleWeight,Price;

cout<〈〃输入出货的重量和单价:〃;

cin>>Weight»Price;

while(Weight<0|iPrice<0)

{cout"〃参数不对,请重新输入:〃;

cin»Weight»Price;

if((Weight*Price>TotalPrice)iIWeight>TotalWeight|'TotalPrice<0)

{cout<<"存货不够!〃;

cin.get();

cin.get();

)

else

{TotalPrice-=Weight*Price;

TotalWeight-=Weight;

cout<〈〃出货完成!〃;

cin.get();

cin.get();

)

)

voidCarlo::ShowBoxInfor()const

{system(〃cls〃);

cout<〈〃库中的存货总重量为:〃;

cout.precision(6);

cout.setf(ios_base::showpoint);

cout<<GetCurrentTotalWeight()<<endl;

cout。〃库中的存货总价钱为:〃;

cout.precision(6);

cout<<GetCurrentTotalPrice();

cin.get();

cin.get();

)

Carlo::"Carlo()

(

)

//Menu,cpp

ttinclude<iostream.h>

#include<windows.h>

ttinclude"Menu.h〃

intMenu::show()

{system(〃cls〃);

intchioce;

cout<<"\n\n\n\n\n\t\t\t"<X"\>\>\>”;

徵111<<〃进出货演示"<<“\<\<\<“<<011(11<<611(11;

cout〈<"\t\t\t"«〃L进货登记.“《endl〈〈endl;

cout«"\t\t\t"<<”2.出货登记."«endl<<endl;

cout«,z\t\t\t"«z/3.猎取库存信息.〃<<endl«endl;

cout〈<"\t\t\t"<<"4.退出,"<<endl〈<endl;

cout<〈〃\t\t\t〃<〈〃请选择操作:〃;

cin>>chioce;

return(chioce);

)

//CarloDemo.cpp

#include<iostream.h>

4include"Menu.h〃

^include"Carlo.h〃

voidmain()

{Menumenu;

Carlocarlo;

intchioce;

while((chioce=menu.showO)-4)

{switch(chioce)

{case1:carlo.BuyBox();

break;

case2:carlo.SellBox();

break;

case3:carlo.ShowBoxInfor();

break;

)

)

南昌航空高校试验报告

二年月日

课程名称:面对对象程序设计B试验名称:构造函数与析构函数

班级:XXXXXXX同学姓名:XXXXXX学号:

指导老师评定:XX签名:XXXXX

1、试验目的

•理解类与对象的区分。

•学习把握定义构造函数与析构函数的方法。

•学习把握默认构造函数的意义。

•了解类成员初始化,把握构造与析构类成员的方式。

2、试验内容

(1)

创建一个Employee类,该类中用字符数组存放Employee的信息,如姓名、地址、市、省、

及邮政编码;每个成员函数的定义放在类定义之外;成员函数包括转变姓名数据成员等;构

造函数完成成员数据的初始化;用Display。函数将完整的对象数据打印出来;其中数据成

员是爱护的,成员函数是公共的。

#include<iostream.h>

#include<string.h>

#include<stdio.h>

classEmployee

(

public:

Employee(charn[20],chara[50],chars[20],charsh[20],charp[6]);

voidChangeName(charch_name[20]);

voidDisplay();

protected:

charname[20];

charaddress[50];

charshi[20];

charsheng[20];

charpost[6];

);

Employee::Employee(charn[20],chara[50],chars[20],charsh[20],charp[6])

strcpy(name,n);

strcpy(address,a);

strcpy(shi,s);

strcpy(sheng,sh);

strcpy(post,p);

)

voidEmployee::ChangeName(charch_name[20])

(

strcpy(name,chname);

)

voidEmployee::Display()

(

cout<<"name:〃<<name<<endl

<<,zaddress:/z<<address«endl

<<z,shi:/z«shi«endl

<<//sheng:z,<<sheng<<endl

<<z/post:,z«post«endl;

)

voidmain()

(

Employeeem(,zrerr34t3〃,“5WestSt.","Revere","CA","12290");

em.Display();

em.ChangeNameC'sdfesfefe^);

em.Display();

)

(2)设计一个表示矩形的类Reel,其矩形成员长float*Length,宽float*Width为指针变量,设

计相应成员函数,实现下列功能:

①构造函数设置长和宽(默认为1)。

②复制构造函数用老对象生成新对象。

③set()函数设置长和宽(默认为0)。

④计算并返回长方形的周长。

⑤计算并返回长方形的面积。

⑥析构函数释放动态安排的长和宽。

编制主程序应用指针建立对象测试类。

#include<iostream.h>

classRect{

float*Length,*Width;

public:

Rect(floata=l,floatb=l);

Rect(Rect&);

voidset(floata=0,floatb=0);

floatperi();

floatareaO;

"Rect(){deleteLength;deleteWidth;}

);

Rect::Rect(floata,floatb)

{Length=newfloat;

Width=newfloat;

"Length=a;*Width=b;

)

Rect::Rect(Rect&x)

{Length=newfloat;

Width=newfloat;

*Length=*x.Length;*Width=*x.Width;cout<<“执行复制构造函数〃<<6ndl;

)

voidRect::set(floata,floatb)

{"Length=a;*Width二b;}

floatRect::peri()

{return("Length+Width)*2;}

floatRect::area()

{return(*Length)*(*Width);}

〃主函数

voidmain()

{Rectrl(55.5,40);

cout《〈〃周长为:peri()<<"面积为:areaO«endl;

cout<<"------------------------------------------------------\n〃;

Rect*p=newRect(rl);〃思索:此处改为Rect*p=newRect;下一行的

输出会是什么结果

cout<<”周长为:〃<<p->peri()<<〃面积为:〃<<p->area()«endl;

p->set(20.5,13);

cout<〈〃周长为:〃<<p->peri()<<〃面积为:〃<<p->area()«endl;

南昌航空高校试验报告

二年月日

课程名称:面对对象程序设计B试验名称:继承与多态性

班级:XXXXXXX同学姓名:XXXXXX学号:

指导老师评定:XX签名:XXXXX

1、试验目的

了解类的两种使用方式

学习从现有类派生出新类的方式

了解在派生类中如何使用基类的成员

了解基类成员在派生类中的访问掌握

了解虚函数对多态性的支持

2、试验内容

题目:应用多态设计同学类

生成表示同学的类XS,供应成员函数dispXMO、dispXBO和dispNLO分别用来显示姓名、性

别和年龄,并将他们全部定义为纯虚函数;生成CZS类表示学校生,包含数据成员xm、xb和nl

表示同学的姓名、性别和年龄,供应成员函数dispXMO、dispXBO和dispNLO分别用来显示

姓名、性别和年龄;再生成类GZS表示高中生和类DXS表示高校生,同样包含相同含义的数据

成员xm、xb和nl,也包括成员函数dispXMO、dispXBO和dispNLO。

试验要求

①设计和实现基类XS。

②设计和实现派生类CZS、GZS、DXSo

③分别生成CZS、GZS、DXS类的对象。

④将CZS、GZS、DXS类对象的地址赋给XS类的指针变量。

⑤分别用XS类的指针和引用访问dispXMO、dispXBO和dispNLO函数。

⑥观看程序结果。

#include<iostream.h>

#include<string.h>

〃设计抽象类(XS)表示同学类,定义其中dispXMO,dispXB(),dispNL()三个函数为纯虚函数

classXS{

public:

virtualvoiddispXMO=0;

virtualvoiddispXB()=0;

virtualvoiddispNL()=0;

);

/*定义CZS类,使其继承XS类,包含三个数据成员xm(4个以内汉字,默认名为〃张三〃),

xb(int型,1表示男,0表示女,默认为1),nl(int型,默认为14);定义构造函数,

初始化各数据成员.另:实现基类的三个纯虚函数,显示各数据成员.

*/

classCZS:publicXS(

public:

CZS(char*〃张三〃,intb=l,intn=14);

voiddispXMO;

voiddispXB();

voiddispNLO;

protected:

charxm[9];

intxb,nl;

};

〃仿照上面的写法,定义高中生类(GZS)和高校生类(DXS)

classGZS:publicXS{

public:

GZS(char*m=〃张三“,intb=l,intn=17);

voiddispXMO;

voiddispXBO;

voiddispNLO;

protected:

charxm[9];

intxb,nl;

);

classDXS:publicXS{

public:

DXS(char*m==〃张三〃,intb=l,intn=20);

voiddispXMO;

voiddispXBO;

voiddispNLO;

protected:

charxm[9];

intxb,nl;

};

〃实现上面CZS类的成员函数

CZS::CZS(char*m,intb,intn)

{strcpy(xm,m);xb=b;nl=n;}

voidCZS::dispXMO

{cout<<endl<<〃学校生的姓名为:}

voidCZS::dispXB()

{cout«,z\t性别:〃<<(xb=l?〃男〃:〃女〃);}

voidCZS::dispNL()

{cout«,,\t年龄:;}

〃实现上面GZS类的成员函数

GZS::GZS(char*m,intb,intn)

{strcpy(xm,m);xb=b;nl=n;}

voidGZS::dispXM()

{cout«endl<<“高中生的姓名为:"<Xxm;}

voidGZS::dispXB()

{cout«〃\t性别:〃<<(xb=l?〃男〃:〃女〃);)

voidGZS::dispNL()

(cout«,z\t年龄:"<<nl;}

〃实现上面DXS类的成员函数

DXS::DXS(char*m,intb,intn)

{strcpy(xm,m);xb=b;nl=n;}

voidDXS::dispXM()

{cout〈〈endl<<〃高校生的姓名为:〃<<xm;}

voidDXS::dispXB()

{cout«,z\t性别:"<<(xb=l?〃男〃:〃女〃);)

voidDXS::dispNL()

{cout<C\t年龄:〃<<nl;}

〃使用抽象基类的指针变量,编写通用displayPO函数

voiddisplayP(XS*p)

(

p->dispXM();

p->dispXB();

p->dispNL();

);

〃使用抽象基类的引用变量,编写通用displayRO函数

voiddisplayR(XS&r)

(

r.dispXM();

r.dispXB();

r.dispNLO;

);

〃主函数

voidmain0

CZSczs("赵一”,1,12);

GZSgzs(〃钱二”,0,15);

DXSdxs(〃孙三〃,1,18);

XS*p;〃定义抽象基类的指针变量p

p=&CZS;〃将学校生对象CZS的地址赋给P

displayP(p);

p=&gzs;〃将高中生对象czs的地址赋给p

displayP(p);

p=&dxs;〃将高校生对象czs的地址赋给p

displayP(p);

cout«z,\n-----------------------------------------\n〃;

XS&rl二czs;〃定义抽象基类的引用变量rl为czs的别名

displayR(rl);

XS&r2二gzs;〃定义抽象基类的引用变量r2为czs的别名

displayR(r2);

XS&r3二dxs;〃定义抽象基类的引用变量r3为czs的别名

displayR(r3);

cout<<〃\n-----------------------------------------\n〃;

南昌航空高校试验报告

二0年月日

课程名称:面对对象程序设计B试验名称:运算符重载

班级:XXXXXXX同学姓名:XXXXXX学号:

指导老师评定:XX签名:XXXXX

1、试验目的

•学习把握重定义与类有关的运算符。

•把握重载运算符的时机。

•学习把握把一个类对象转换为另一个类对象。

•学习把握重载为成员与友元的区分及其带参数的状况。

•学习把握值返回与引用返回的区分及应用时机。

2、试验内容

(1)

生成一个表示复数的类FS。复数的实部sb和虚部xb作为其数据成员。供应成员函数disp()

显示复数(格式:-3+5i或6-2i),重载“+”、为FS类的成员函数,用来计算两个复数

的和、差。

思路导航:

①定义类,设计构造函数和显示函数print。;

②重载运算符“+”、"-”为类FS的成员函数。

③实例化FS类的2个对象,并采用重载的运算符对其进行计算。

此外,依据上述定义,试将上述的运算符重载成员函数改写成友元函数。

#include<iostream.h>

classFS{

doublesb,xb;

public:

FS(doublea=0,doubleb=0);

FS&operator+(FS&);

FS&operator-(FS&);

voidprint();

};

FS::FS(doublea,doubleb){sb=a;xb=b;}

FS&FS::operator+(FS&f)

(

FSg=*this;

g.sb+=f.sb;

g.xb+=f.xb;

returng;

FS&FS::operator-(FS&f)

FSg=*this;

g.sb-=f.sb;

g.xb-=f.xb;

returng;

}

voidFS::print()

(

cout<</z(〃<<sb;

if(xb>=0)cout<<"+";

cout<<xb«/zi)z,;

)

voidmain()〃主函数

(

FSa(-8,3),b(7,-4);

FScl;cl=a+b;

a.print();cout<<〃+〃;b.print();cout<<〃=〃;cl.print();

cout<<endl;

FSc2;c2=a-b;

a.print();cout<X〃-”;b.print();cout<</,=/,;c2.print();

cout<<endl;

)

〃运算符重载为友元函数

#include<iostream.h>

classFS{

doublesb,xb;

public:

FS(doublea=0,doubleb=0);

friendFSoperator+(FS&,FS&);

friendFSoperator-(FS&,FS&);

voidprint();

};

FS::FS(doublea,doubleb){sb=a;xb=b;}

FSoperator+(FS&fl,FS&f2)

(

FSg;

g.sb=f1.sb+f2.sb;

g.xb=fl.xb+f2.xb;

returng;

)

FSoperator-(FS&fl,FS&f2)

(

FSg;

g.sb=f1.sb-f2.sb;

g.xb=f1.xb-f2.xb;

returng;

)

voidFS::print()

(

cout<<z,(,,«sb;

if(xb>=0)cout«,z+,z;

cout<<xb<<z/i)z/;

)

voidmain()〃主函数

(

FSa(8,3),b(7,-14);

FScl;cl=a+b;

a.print();cout〈〈〃+〃;b.print();cout<X〃=〃;cl.print();

cout«endl;

FSc2;c2=a-b;

a.print();b.print();cout«〃=〃;c2.print();

cout<<endl;

)

编写一个时间类,实现时间的加、减、读和输出:

//class,h

classTime

{

public:

Time(){}

voidSetTime();

voidDisplay();

Timeoperator+(Time&a);

Timeoperator-(Time&a);

private:

inthour,minute,second;

);

//function,cpp

ftinclude<iostream.h>

#include"class.h〃

voidTime::SetTime()

(

do

(

cout«〃请输入小时:〃<<endl;

cin>>hour;

}while(hour<0||hour>23);

do

cout<<〃请输入分钟:〃<<endl;

cin»minute;

}while(minute<0|minute>59);

do

(

cout<<〃请输入秒钟:〃<<endl;

cin»second;

}while(second<0||second>59);

)

voidTime::Display()

(

cout<<hour<<z/:〃<<minute<<〃:^<<second<<endl;

)

TimeTime::operator+(Time&a)

(

Timec;

c.second=second+a.second;

if(c.second>59)

(

c.second一二60;

minute++;

)

c.minute=minute+a.minute;

if(c.minute>59)

(

c.minute-=60;

hour++;

)

c.hour=hour+a.hour;

if(c.hour>23)

c.hour-=24;

returnc;

)

TimeTime::operator-(Time&a)

(

Timec;

c.second=second-a.second;

if(c.second<0)

(

c.second+=60;

minute一;

)

c.minute=minute-a.minute;

if(c.minute<0)

(

c.minute+=60;

hour——;

c.hour=hour-a.hour;

if(c.hour<0)

c.hour+=24;

returnc;

}

//overload,cpp

#include<iostream.h>

#include"class.h〃

voidmain()

(

Timea,b,c;

cout«〃请输入A的时间:,,«endl;

a.SetTime();

cout«〃请输入B的时间:,,«endl;

b.SetTime();

cout〈〈〃A的时间为:〃;

a.Display();

cout<<〃B的时间为:〃;

b.Display();

cout<<〃c=a+b二〃;

c=a+b;

c.Display();

cout<<endl<<zzc=a-b=//;

c=a-b;

c.Display0;

}

南昌航空高校试验报告

年月日

课程名称:面对对象程序设计B试验名称:动态链接库的制作与调用

班级:XXXXXXX同学姓名:XXXXXX学号:

指导老师评定:XX签名:XXXXX

一用所学的内容编写一个动态链接库的文件

1、试验目的

(1)了解和把握类和指向函数的指针的使用。

(2)了解和把握宏的使用,

(3)把握动态链接库文件创建的过程。

2、试验要求

娴熟把握动态链接库文件的创建

3、试验步骤与内容

题目:创建一个动态链接库,实现画一棵树。

1).启动VisualC++6.0或者C++Builder5.0

.在WINDOWS98或WINDOWS2000环境下,找到VisualC++6.0或者C++Builder5.0

图标,双击之。为了不使VisualC++6.0或者C++Builder5.0的默认搜寻路径与WINDOWS

其他软件相冲突,清修改VisualC++6.0或者C++Builder5.0图标的属性。在属性|程序|批

处理一栏中填上你自己的批处理程序名。以便启动时,首先运行你的批处理程序。然后在该

批处理程序中,写上palh=...路径。

2).设置用户程序子名目

设置用户程序子名目的目的是,将全部编程时产生的中间文件和最终执行程序文件全部

放在自己的名目中,以便管理。

3).创建和输入程序

VisualC++6.0启动后,要先建立一个project工程文件。方法为:

•选择File|new菜单项,将弹出New对话框。

,单击Projects选项卡

,在Location中填用户子名目路径

,在Projectname中填入工程名(如MyDll)

•在列表中选择MFCAppWizard(dll),表示你编制的应用程序将生成动态链接库文件(.dll)

•依据提示创建一个自己想要的工程

令定位到mydll.h文件处,添加动态链接库的函数原型声明,下面为mydll.h的内容:

intDrawTree(CPaintDC*dc,intxStart,intyStart,doublelength,doubleangle,intnum);

classCMyDllApp:publicCWinApp

令定位到mydll.cpp文件处,添加动态链接库中的函数的实现部分,下面为mydll.cpp的

内容:

//TheoneandonlyCMyDllAppobject

CMyDllApptheApp;

intDrawTree(CPaintDC*dc,intxStart9intyStart,doublelength9doubleangle,

intnum)

(

intxEnd,yEnd;

if(num==0)return1;

xEnd=xStart+(int)(length:i:cos(angle));

yEnd=yStart+(int)(length*sin(ang!e));

dc->MoveTo(xStart,yStart);

dc->LineTo(xEnd,yEnd);

DrawTree(dc,xEnd,yEnd,length*0.6,angIe+0.624,num-1);

DrawTree(dc,xEnd,yEnd,length*0.85,angle+0.08,num-1);

DrawTree(dc,xEnd,yEnd,length:}:0.65,angle-0.6,num-1);

return1;

)

令在mydll.def中引出DrawTree函数,下面为mydll.def的内容。

;MyDll.def:DeclaresthemoduleparametersfortheDLL.

LIBRARY,'MyDir,

DESCRIPTION'MyDllWindowsDynamicLinkLibrary'

EXPORTS

DrawTree

•编译程序

[思索问题]

令程序中大小写用错了,结果会怎样?

令假如返回类型void没有,结果会怎样,是否需要return语句?

令编译中若有警告信息,影响程序运行吗?

令如何编写动态链接库文件以及步骤?

二动态链接库文件的调用

1、试验目的

(1)解和把握类和指向函数的指针的使用。

(2)了解和把握宏的使用。

(3)把握如何显示调用动态链接库文件。

(4)把握如何隐示调用动态链接库文件。

(5)调用动态链接库文件的步骤。

2、试验要求

娴熟把握在自己的应用程序中调用动态连接库文件的方法

3、试验步骤与内容

1)启动VisualC++6.0或者C++Builder5.0

.在WINDOWS98或WINDOWS2000环境下,找到VisualC++6.0或者C++Builder5.0

图标,双击之。为了不使VisualC++6.0或者C++Builder5.0的默认搜寻路径与WINDOWS

其他软件相冲突,清修改VisualC++6.0或者C++Builder5.0图标的属性。在属性|程序好比

处理一栏中填上你自己的批处理程序名。以便启动时,首先运行你的批处理程序.然后在该

批处理程序中,写上palh=...路径。

2)设置用户程序子名目

设置用户程序子名目的目的是,将全部编程时产生的中间文件和最终执行程序文件全部

放在自己的名目中,以便管理。

3)创建和输入程序

VisualC++6.0启动后,要先建立一个project工程文件。方法为:

・选择File|new菜单项,将弹出New对话框。

,单击Projects选项卡

•在Location中填用户子名目路径

,在Projectname中填入工程名

•在列表中选择MFCAppWizard(exe),表示你编制的应用程序将生成可执行文件(.exe)

•依据提示创建一个自己想要的工程

4)调用步骤

令隐示链接

包含导出函数(或C++类)声明的头文件(.h)

导入库(Jib)文件

实际的DLL(.dll)文件

令显示链接

显示链接时,使用DLL的可执行程序在运行时通过函数调用来显示加载或卸载

DLL,并通过函数指针来调用DLL的导出函数,要显示链接DLL,应用程序必需

调用LoadLibrary来加载DLL,并猎取模块句柄,调用GetProcAddress来猎取应

用程序要调用的导出函数的指针,使用完DLL后,应调用FreeLibrary来卸载DLL.

5)主要程序代码

定位到视图类CtestDllView的实现TestDUView.cpp中的函数OnPaint处,加入下列的代码:

voidCTestDllView::OnPaint()

(

CPaintDCdc(this);//devicecontextforpainting

//typedefint(*DRAWTREE)(CPaintDC*,int,int,double,double,

//int);

typedefint(*DRAWTREE)(CPaintDC*,int,int,double,double,int);

DRAWTREEDrawTree;

CRectrect;

GetClientRect(rect);

FARPROClpfn=NULL;

HINSTANCEhinst=NULL;

hinst=LoadLibrary("MyDll.dll");

if(hinst==NULL)

(

AfxMessageBox("不能加载动态链接库)

return;

)

lpfn=GetProcAddress(hinst,"DrawTreeH);

DrawTree=(DRAWTREE)lpfn;

dc.SetMapMode(MM_LOENGLISH);

if(lpfn==NULL)

AfxMessageBox(”不能加载画树函数)

else

DrawTree(&dc,rect.right/2,-rect.bottom*9/10,(double)rect.bottom*0.2,1.57,9);

FreeLibrary(hinst);

//TODO:Addyourmessagehandlercodehere

//DonotcallCView::OnPaint()forpaintingmessages

6)运行界面

[思索问题I

1.在调用动态链接库文件时应留意哪些问题?

2.如何显示或隐示调用动态链接库文件。

3.实际的动态链接库文件可以存放在哪些位置。

南昌航空高校试验报告

二年11月20日

课程名称:面对对象程序设计B试验名称:动态链接库的制作与调用

班级:同学姓名:XXX学号:

指导老师评定2签名:

一用所学的内容编写一个动态链接库的文件

1、试验目的

(4)了解和把握类和指向函数的指针的使用。

(5)了解和把握宏的使用,

(6)把握动态链接库文件创建的过程。

2、试验要求

娴熟把握动态链接库文件的创建

3、试验步骤与内容

题目:创建一个动态链接库,实现计算器功能。

1).启动VisualC++6.0

2)新建一个具有计算功能的动态链接库。

3).创建和输入程序

VisualC++6.0启动后,要先建立一个project工程文件。方法为:

•选择File|new菜单项,将弹出New对话框。

•单击Projects选项卡

•在Location中填用户子名目路径

,在Projectname中填入工程名(如MyDll)

•在列表中选择Win32Dynamic-LinkLibrary,表示你编制的应用程序将生成动态链接库

文件(.dll)

•新建一个JiSuan.h

extern"CH_declspec(dllexport)intadd(inti,intj);

extern"C"_declspec(dllexport)intsub(inti,intj);

extern"C"_declspec(dllexport)intmull(inti,intj);

externuC,'_declspec(dllexport)floatdivv(inti,intj);

extern”。表示依据C语言的函数生成方式编译,由于C++中实现了函数的重载,所以在

同名函数的处理上实行名称粉碎功能(即在函数名中加上一些特别字符来区分不同函数)。

_declspec(dllexport)表示该函数是可导出函数,可以用VC6.0中的Depends工具查看.dll

中的导出函数。

,新建一个JiSuan.cpp

#include"JiSuan.h"

intadd(inti,intj)

(

returni+j;

)

intsub(inti,intj)

(

returni-j;

)

intmull(inti,intj)

(

returni*j;

)

floatdivv(inti,intj)

(

returni/(float)j;

)

编译程序生成JiSuan.dll和JiSuan.lib以便其他程序调用。

二动态链接库文件的调用

1、试验目的

(6)解和把握类和指向函数的指针的使用。

(7)了解和把握宏的使用。

(8)把握如何显示调用动态链接库文件。

(9)把握如何隐示调用动态链接库文件。

(10)调用动态链接库文件的步骤。

2、试验要求

娴熟把握在自己的应用程序中调用动态连接库文件的方法

3、试验步骤与内容

1)启动VisualC++6.0

2)创建和输入程序

VisualC++6.0启动后,要先建立一个project工程文件。方法为:

,选择File|new菜单项,将弹出New对话框。

•单击Projects选项卡

•在Location中填用户子名目路径

•在Projectname中填入工程名

•在列表中选择MFCAppWizard(exe),表示你编制的应用程序将生成可执行文件(.exe)

•依据提示创建一个自己想要的工程

3)调用步骤

本试验实行隐式调用动态链接库的方法。

建立一个名为:JieMian的MFC程序。打开“工程”.“设置”玲“link”玲“对象/库”

加入“JiSuan.lib”表示该工程调用“JiSuan.dll”动态链接库。

设计界面如上图。

将两个文本输入框和两个整形变量关联.

同时在四个按钮下添加大事:

voidCJieMianDlg::OnButton1()

(

//TODO:Addyourcontrolnotificationhandlercodehere

UpdateData(TRUE);

CStringstr;

inthe=add(m_a,m_b);

str.Format(n%d和%(1的和为:%d!”,m_a,m_b,he);

AfxMessageBox(str);

}

voidCJieMianDlg::OnButton2()

//TODO:Addyourcontrolnotificationhandlercodehere

UpdateData(TRUE);

CStringstr;

intcha=sub(m_a,m_b);

str.Format(u%d和%(1的差为:%d!”,m_a,m_b,cha);

AfxMessageBox(str);

)

voidCJieMianDlg::OnButton3()

(

//TODO:Addyourcontrolnotificationhandlercodehere

UpdateData(TRUE);

CStringstr;

intji=mull(m_a,m_b);

str.Format("%d和%(1的积为:%d!”,m_a,m_b,ji);

AfxMessageBox(str);

)

voidCJieMianDlg::OnButton4()

(

//TODO:Addyourcontrolno

温馨提示

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

评论

0/150

提交评论