
计算机科学与技术系上机实验报告
课 程:C++语言程序设计
老 师:张永军
姓 名:石岩(老挝留学生)
班 级:计科 101 班
学 号:100806L405
学 院:计算机科学与信息学院
实验日期: 年 月 日
实验一
一、实验名称
类和对象
二、实验目的及要求
设计一个类,并对其属性进行操作。
三、实验环境
Microsoft Visual Studio 2010
四、实验内容
1,定义一个dog类,包含age,weight等属性。以及对这些属性的操作方法。实现并测试这个类。
2,设计一个rectangle类,其属性为矩形的左下角与右上角的坐标,根据坐标计算矩形的面积。
五、算法描述及实验步骤
Dog
+Dog(n: string , ag: int ,we: int)
+get()
+show()
+~Dog()
-name: string
-weight: int
-age: int
六、调试过程及实验结果
1, 保存源程序代码,并声称解决方案。
2,调试并执行。
3,输出为:
①
the message of dog is:
name:tutu age:2 weight:20
input the name age and weight of dog
花花 3 60
the message of dog is:
name:花花 age:3 weight:60
the message of dog is:
name:hua age:4 weight:60
called
called
请按任意键继续. . .
②
输入左下角的坐标:
3 6
输入右上角的坐标:
4 7
两点的坐标
左下角的坐标:(3,6)
右上角的坐标:(4,7)
面积为:1
输入左下角的坐标:
1 0
输入右上角的坐标:
2 6
两点的坐标
左下角的坐标:(1,0)
右上角的坐标:(2,6)
面积为:6
请按任意键继续. . .
七、总结
1,构造函数用于对对象的初始化,在定义类时,如果没有定义构造函数,系统将自动生成一个简单的构造函数。
2,构造函数没有返回值,不允许显示调用,创建对象时,系统将自动调用相应的构造函数。
3,析构函数是对对象进行最后的清理工作,它不允许有参数,没有返回值。如果没有定义析构函数,系统将自动生成。
4,对象的私有成员,可以通过成员函数访问,类外不能访问对象的私有成员。
八、附录
1,① Dog.h
#include #include using namespace std; class Dog { public: Dog(string n,int ag,int we); void get(); void show(); ~Dog() { cout<<"called "< private: string name; int weight; int age; }; ②Dog.cpp #include"4-8.h" Dog::Dog(string n,int ag,int we):name(n),age(ag),weight(we){} void Dog::get() { cout<<"input the name age and weight of dog"< } void Dog::show() { cout<<"the message of dog is:"< Dogmain.cpp #include"4-8.h" int main() { Dog dog("tutu",2,20); dog.show(); dog.get(); dog.show(); Dog dog1("hua",4,60); dog1.show(); return 0; } 2, ①rectangle.h #include #include using namespace std; class Rectangle { public: void get(); void show(); private: int x1,x2,y1,y2; }; ②Rectangle.cpp #include"4-9.h" void Rectangle::get() { cout<<"输入左下角的坐标:"< cout<<"输入右上角的坐标:"< } void Rectangle::show() { cout<<"两点的坐标"< ③Rectangle main.cpp #include"4-9.h" int main() { Rectangle r1; r1.get(); r1.show(); Rectangle r2; r2.get(); r2.show(); return 0; } 实验二 一、实验名称 类与对象 二、实验目的及要求 熟悉设计简单类及测试的方法。 三、实验环境 Microsoft Visual Studio 2010 四、实验内容 1,设计一个人事管理类,其属性有编号、性别、出生年月、身份证号等 其中出生年月声明为一个日期类内嵌子对象。实现对成员信息的录入和输出。要求包括:构造函数析构函数、复制构造函数、内联成员函数、带默认形参值的成员函数、类的组合。 2,定义一个复数类complex,是下面的程序代码能够工作: Complex c1(3,5); //用复数5+3i初始化c1 Complex c2=4.5; //用实数4.5初始化c2 c1.add(c2); //将c1与c2相加,结果保留在c1中 C1.show(); //将c1输出,结果应为7.5+5i 五、算法描述及实验步骤 1, Date +date(y:int=0,m:int=0,d:int=0) +get():void +show():void +~date() -year:int -month:int -day:int 2, 六、调试过程及实验结果 1, 保存源程序代码,并声称解决方案。 2,调试并执行。 3,输出为: ①: the first one before set name: six: CD: number: berthday:0/0/0 the first one after set input the name six CD and number: name:喻福松 six:男 CD:5210452015 number:1008060028 input berthday:input year month and day 1990 5 6 name:喻福松 six:男 CD:5210452015 number:1008060028 berthday:1990/5/6 p2 name:喻福松 six:男 CD:5210452015 number:1008060028 berthday:1990/5/6 called date called date 请按任意键继续. . . number: ② 7.5+5i 请按任意键继续. 七、总结 1,类的组合 当当前类所使用的类还没有定义时,在当前类中只能建立此类的引用。如果已经定义在前,就可以直接建立对象。 2,访问子对象中的可访问成员用“当前类·子对象·成员”的形式。 3,内联成员函数:用关键字“inline”声明,在程序调用内联成员函数时,并不真正执行函数的调用过程,如保留返回地址等处理,而是把函数代码嵌入程序的调用点,这样可以减少调用成员函数的时间。 4,带默认参数的函数: 由于函数调用时,实参和形参的结合是从左到右顺序进行的,因此指定默认值的参数必须放在参数列表的最右端。 八、附录 1,humain·h 文件 #include #include using namespace std; class date { public: date(int y=0,int m=0,int d=0); void get (); void show(); ~date() { cout <<"called date"< private: int year; int month; int day; }; lass humain { public: humain(); humain(humain &p); void get(humain &p); void show(humain &p); private: date berthday; string name; string CD; string six; string number; }; Humain·cpp文件 #include"4-10.h" date::date(int y,int m,int d):year(y),month(m),day(d){} void inline date::get() { cout<<"input year month and day"< } void date::show() { cout< humain::humain() {name=" "; CD=" "; six=" "; number=""; } humain::humain(humain &p) {berthday=p.berthday; name=p.name; CD=p.CD; six=p.six; number=p.number;} void humain::get(humain &p) {cout<<"input the name six CD and number:"< cin>>name; cout<<"six:"; cin>>six; cout<<"CD:"; cin>>CD; cout<<"number:"; cin>>number; cout<<"input berthday:"; p.berthday.get(); } void humain::show(humain &p) { cout<<"name:"< p.berthday.show(); } Humain main·cpp文件 #include"4-10.h" int main() { humain p1; cout<<"the frist one befor set"< cout<<"the frist one after set"< p1.show(p1); humain p2(p1); cout<<"p2"< return 0; } 2, Complex·h文件 #include using namespace std; class complex { public: complex(float a=0,float b=0); void add(complex &p); void show(); private: float real; float imag; }; Complex·cpp文件 #include"4-20.h" complex::complex(float a,float b):real(a),imag(b){} void complex::add(complex &p) { real=real+p.real; imag=imag+p.imag; } void complex::show() { cout< Complex main·cpp文件 #include"4-20.h" int main() { complex c1(3,5); complex c2=4.5; c1.add(c2); c1.show(); return 0; } 实验三 一、实验名称 数据的共享与保护 二、实验目的及要求 掌握对静态成员、静态函数、友元函数的使用方法。 三、实验环境 Microsoft Visual Studio 2010 四、实验内容 1,定义一个cat类,拥有静态成员numofcat,记录cat的个体数目;静态成员函数getnumofcat(),读取numofcat。 2,定义boat与car两个类,二者都有weight属性,定义二者的友元函数gettoalweight(),计算二者的重量和。 五、算法描述及实验步骤 1, 六、调试过程及实验结果 1, 保存源程序代码,并声称解决方案。 2,调试并执行。 3,输出为: 1, input the name tutu name:tutu num:1 numofcat:1 call static numofcat:1 input the name hua name:hua num:2 numofcat:2 call static numofcat:2 请按任意键继续. . . 2, boat name:feng num:012002 weight:60 car name:ben num:0054 weight:80 140 tutu 0124 90 baoma 0142453 100 boat name:tutu num:0124 weight:90 car name:baoma num:0142453 weight:100 190 请按任意键继续 七、总结 1,静态成员,不属于任何对象,系统单独非配空间。静态数据成员具有一般静态数据的特征,即只在第一次赋值。 2,静态数据成员可以被所在类的成员函数访问,由于静态成员函数的形参中没有this指针,因此静态成员函数不能直接访问非静态成员数据,可以通过对象名的方式访问。 3,如果一个函数被声明为以为类的友元函数,那么这个函数就可以访问这个类中的所有成员。 4,有元不可以传递:如声明a是b的有元,b是c的有元。那么b不是a的有元,c也不是b的有元,a不是c的有元。 八、附录 1, cat·h文件 #include #include using namespace std; class cat { public: cat() { name=" "; numofcat++; num=numofcat; } void get(); void show(); static void getnumofcat(); private: static int numofcat; string name; string num; }; Cat·cpp文件 #include"5-7.h" int cat::numofcat=0; void cat::get() { cout<<"input the name "; cin>>name; } void cat::show() { cout<<"name:"< void cat::getnumofcat() { cout<<"call static"< Cat main·cpp文件 #include"5-7.h" int main() { cat cat1; cat1.get(); cat1.show(); cat1.getnumofcat(); cat cat2; cat2.get(); cat2.show(); cat2.getnumofcat(); return 0; } 2, Car and boat·h文件 #include #include using namespace std; class car; class boat {public: boat(string n,string nu,int we); void friend gettoalweight(boat &p1,car &p2); void get(); void show(); private: string name; string num; int weight; }; class car { public: car(string n,string nu,int we); void friend gettoalweight(boat &p1,car &p2); void get(); void show(); private: string name; string num; int weight; }; Car and boat·cpp文件 #include"5-14.h" void gettoalweight(boat &p1,car &p2) { cout< boat::boat(string n,string nu,int we):name(n),num(nu),weight(we){} void boat::get() { cin>>name>>num>>weight; } void boat::show() { cout<<"boat"< car::car(string n,string nu,int we):name(n),num(nu),weight(we){} void car::get() { cin>>name>>num>>weight; } void car::show() { cout<<"car"< Car and boat main·cpp文件 #include"5-14.h" int main() { boat b("feng car c("ben b.show(); c.show(); gettoalweight(b,c); b.get(); c.get(); b.show(); c.show(); gettoalweight(b,c); return 0; } 实验四 一、实验名称 MFC对话框应用程序 二、实验目的及要求 了解并设计一个MFC对话框 三、实验环境 Microsoft Visual Studio 2010 四、实验内容 设计一个对话框应用程序,在对话框模板上添加控件,实现简单计算功能运行时界面如下 五、算法描述及实验步骤 1.创建一个对话框 2 修改创建的对话框项目模板。删除模板上自动创建的两个控件。加入需要的静态文本框、编辑框和按钮控件,更改按钮的标题。 3. 用ClassWizard为编辑框添加变量。 4. 用ClassWizard为按钮控件添加消息映射: 5. 添加初始化代码:(在CDlg.cpp文件) 6. 在实现文件(cpp文件)中加入单击按钮时的事件响应代码。(双击一个按钮可直接进入函数编辑) 六、调试过程及实验结果 1, 保存源程序代码,并声称解决方案。 2,调试并执行。 3,运行结果: 七、总结 MFC是类和对象的简单应用。 八、附录 在BOOL Cmfc1Dlg::OnInitDialog()函数中添加: m_1=m_2=m_3; UpdateData(FALSE); 程序段。 char f; void Cmfc1Dlg::OnBnClickedRadio1() { f='+'; } void Cmfc1Dlg::OnBnClickedRadio2() { f='-'; } void Cmfc1Dlg::OnBnClickedRadio3() { f='*'; } void Cmfc1Dlg::OnBnClickedRadio4() { f='/'; } void Cmfc1Dlg::OnBnClickedButton1() { UpdateData(TRUE); switch(f) { case '+': m_3=m_1+m_2;break; case '-': m_3=m_1-m_2; break; case '*': m_3=m_1*m_2; break; case '/': if(m_2==0 ) MessageBox(_T("除y数ºy不?能¨¹为a零¢?!ê?")); else { m_3 = m_1/m_2; break; } default: m_3=m_1+m_2; } void Cmfc1Dlg::OnBnClickedButton2() { UpdateData(TRUE); m_1=0; m_2=0; m_3=0; UpdateData(FALSE); } 实验五 一、实验名称 MFC单文档应用程序 二、实验目的及要求 了解并设计一个简单的MFC单文档应用程序 三、实验环境 Microsoft Visual Studio 2010 四、实验内容 用MFC单文档设计一个直方图和一个滚动字幕 五、算法描述及实验步骤 A 直方图 使用AppWixard生成单文档工程tt 在ttDoc.h中类 CttDoc的定义之前加入类Max的定义,并在ttDoc.cpp的文件尾部加入类Max的实现部分。用来求四个数中的最大数。 为CttDoc类增加一个公有的void类型的成员函数Find和一个公有int数据成员数组m_num[5],使用类产生对象并计算它们的最大值,将它们转换成int,存入整数数组m_num。 为CttDoc类的成员函数OnNewDocument增加调用Find函数语句,为画图准备数据。 在视类中的OnDraw函数添加画图写字代码。 B 滚动字幕 1. 创建一个简单的单文档应用程序gd; 2. 在gdView.h中定义一个私有变量n,用于控制输出文字的初始位置和移动。并在构造函数中对其初始化。 3. 在gdView.cpp文件中修改OnDraw函数。 4. 添加三条消息映射:双击鼠标左右键及时间映射,并加入相应代码。添加方法:项目类向导消息相应的函数添加项目编译代码。 5. 添加菜单控制与代理。方法:点击视图资源视图Menu文件夹 MAINFRAME,进入菜单编辑。添加运行子菜单:启动和停止及 其消息映射(右键->添加事件处理程)。 在消息类型中选择COMMAND,在类列表中选择CgdView,并在函数处理程序名称栏修改函数名。点击添加编辑添加相应的函数。 六、调试过程及实验结果 1, 保存源程序代码,并声称解决方案。 2,调试并执行。 3,输出为: A B输出如下图:(点击运行菜单中的启动和停止按钮,或者双击鼠标的左右键,字幕会执行相应的动作) 七、总结 Microsoft Visual Studio 2008与Microsoft Visual Studio 2010有很大的差别。 八、附录 A 添加的类Max定义: class Max { double x1,x2,x3,x4; double Max2(double,double); public: Max(double,double,double,double); double Max4(); }; 2.添加的类Max实现部分: double Max::Max2(double a, double b) { if(a>=b) return a; else return b; } Max::Max(double a, double b, double c, double d) { x1=a;x2=b;x3=c;x4=d; } double Max::Max4() { return Max2(Max2(x1,x2),Max2(x3,x4)); } 3. 添加的Find函数:void CPlotDoc::Find() { Max a(110.5, 120.8, 110, 68); Max b(130, 256.5, 90, 200); Max c(125, 406.8, 350, 330); Max d(120, 356.8, 300, 280.5); Max e(102, 256.8, 120, 105); m_num[0] = (int) a. Max4(); m_num[1] = (int) b. Max4(); m_num[2] = (int) c. Max4(); m_num[3] = (int) d. Max4(); m_num[4] = (int) e. Max4(); } 4. 修改后的OnDraw函数: void CPlotView::OnDraw(CDC* pDC) { CPlotDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc); // TODO: add draw code for native data here pDC->SetMapMode(MM_ISOTROPIC); pDC->SetViewportOrg(50,250); pDC->MoveTo(0,0); pDC->LineTo(1100,0); pDC->MoveTo(0,0); pDC->LineTo(0,600); int width = 40; int ch = 'A'; CString str1; CBrush brush; brush.CreateSolidBrush(RGB(50, 250,0)); pDC->SelectObject(brush); for(int i = 1; i<6; i++, ch++) { pDC->Rectangle(200*i, 0, 200*i+width, pDoc->m_num[i-1]); str1.Format(_T("%c"),ch); //整型以字符格式赋给str1 pDC->TextOut(200*i+10,-10, str1); //输出ABCDE } CFont font; font.CreateFont(0,0,0,0,800,0,0,0,OEM_CHARSET, OUT_DEFAULT_PRECIS,CLIP_DEFAULT_PRECIS,DEFAULT_QUALITY,DEFAULT_PITCH,_T("楷体")); pDC->SelectObject(&font); pDC->TextOut(200,550, _T("各公司销售点水果月销售量直方图")); } B 1. 在gdView.cpp文件中修改后的OnDraw函数: void CXxx2View::OnDraw(CDC* pDC) { CXxx2Doc* pDoc = GetDocument(); ASSERT_VALID(pDoc); if (!pDoc) return; pDC->SetTextColor(RGB(0,0,235)); pDC->SetBkMode(TRANSPARENT); CFont font; font.CreateFont(28,15,0,0,FW_NORMAL,false,false,false,DEFAULT_CHARSET,OUT_DEVICE_PRECIS,CLIP_DEFAULT_PRECIS,DEFAULT_QUALITY,DEFAULT_PITCH,_T("隶书")); pDC->SelectObject(&font); pDC->TextOut(n,100,_T("世上无难事,只要肯登攀!")); n=n+20; RECT r; GetClientRect(&r); //获得窗口 if(n>r.right-r.left)//窗口如果n> 右坐标减去左坐标 n=0; } 添加的消息映射: void CgdView::OnLButtonDblClk(UINT nFlags, CPoint point) { //鼠标左双击函数 // TODO: Add your message handler code here and/or call default SetTimer(1,500,NULL); CView::OnLButtonDblClk(nFlags, point); } void CgdView::OnRButtonDblClk(UINT nFlags, CPoint point) { //鼠标右双击函数 // TODO: Add your message handler code here and/or call default KillTimer(1); CView::OnRButtonDblClk(nFlags, point); } Void CgdView::OnTimer(UINT nIDEvent) { // TODO: Add your message handler code here and/or call default Invalidate(); CView::OnTimer(nIDEvent); } 添加的启动及停止对应的消息 void CXxx2View::OnMove() //启动对应消息 { // TODO: Add your command handler code here SetTimer(1,300,NULL); } void CXxx2View::OnStop() //停止对应的消息 { // TODO: Add your command handler code here KillTimer(1); } 实验六 一、实验名称 单文档串行化编程 二、实验目的及要求 了解简单的单文档串行化编程方法。 三、实验环境 Microsoft Visual Studio 2010 四、实验内容 设计应用程序串行化一个矩形数据,用对话框修改数据,并显示图形。 对话框如下: 五、算法描述及实验步骤 1.用AppWizard建立一个普通单文档ff工程,按下一步,直到出现下图,将CffView的基类设为CFormView。 2.在对话框中添加相应的控件,并添加变量,如下图: 其中第五个编辑框添加为:控件类型,如下图: 3.为四个编辑框添加事件处理程序,如下图: 并添加相应的函数。 3.在Doc头文件ffDoc.h中添加变量,并在ffDoc.cpp的构造函数中初始化变量。 4.在ffDoc.cpp的串行化代码。 5.为ffView类添加OnDraw函数,添加方法如下图: 六、调试过程及实验结果 1, 保存源程序代码,并声称解决方案。 2,调试并执行。 3,输出为: 输入不同的x1、y1、x2、y2,编辑框中会显示相应的图形。 七、总结 串行化代码“ar< 中的ar的作用和cin、cout相似。 八、附录 1.定义变量及初始化的代码为(添加的代码): //ffdoc.h 文件中 class ffDoc : public CDocument { public: int x1, y1, x2, y2; } //ffdoc.cpp 文件中 CSerialRectDoc::CSerialRectDoc() { x1=y1=x2=y2=0; } 2. 在ffView.cpp中修改的代码(即控件处理函数): Void ffView::OnChangeEdit1() { UpdateData(); CSerialRectDoc* pDoc= GetDocument(); if(m_x1!=pDoc-> x1) pDoc-> x1 =m_x1; if(m_y1!=pDoc-> y1) pDoc-> y1 =m_y1; if(m_x2!=pDoc-> x2) pDoc-> x2 =m_x2; if(m_y2!=pDoc-> y2) pDoc-> y2 =m_y2; Invalidate(true); } Void ffView::OnChangeEdit2() { OnChangeEdit1(); } Void ffView::OnChangeEdit3() { OnChangeEdit1(); } Void ffView::OnChangeEdit5() { OnChangeEdit1(); } void CSerialRectView::OnInitialUpdate() { m_x1=GetDocument()->x1; m_x2=GetDocument()->x2; m_y1=GetDocument()->y1; m_y2=GetDocument()->y2; UpdateData(false); } void CSerialRectDoc::Serialize(CArchive& ar) 3. 在ffDoc.cpp中修改的串行化代码: { if (ar.IsStoring()) { // TODO: add storing code here ar< else { // TODO: add loading code here ar>>x1>>y1>>x2>>y2; } } 4. 在ffView.cpp文件中添加OnDraw函数 void CSerialRectView::OnDraw(CDC *pDC) { m_Ctrl.UpdateWindow(); pDC=m_Ctrl.GetWindowDC(); pDC->Rectangle(m_x1,m_y1,m_x2,m_y2); UpdateData(false); }
