VC++实验报告 哈威_第1页
VC++实验报告 哈威_第2页
VC++实验报告 哈威_第3页
VC++实验报告 哈威_第4页
VC++实验报告 哈威_第5页
已阅读5页,还剩26页未读 继续免费阅读

下载本文档

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

文档简介

1、VC+实验报告 班号: 学号: 姓名: 实验1 VC+开发环境的熟悉和Windows编程基础一、实验目的 1. 熟悉Visual C+的开发环境2. 掌握用应用程序向导创建一个控制台应用项目的方法。3. 掌握源代码文件的新建、打开、保存和关闭等基本操作。4掌握用应用程序向导创建一个Windows应用项目的方法5. 掌握Visual C+项目的编译、连接和执行6. 掌握代码简单语法错误修正和调试的一般过程7掌握Windows程序运行基本原理。 8. 掌握使用SDK(Windows API)方式编写Windows应用程序方法。 9. 掌握用应用程序向导创建一个Windows应用项目的方法。二、实验

2、知识点概念Visual C+是Microsoft公司推出的目前使用极为广泛的基于Windows平台的可视化编程环境。由于其功能强大、灵活性好、完全可扩展以及具有强有力的Internet支持,在各种C+语言开发工具中脱颖而出,成为目前较为流行的C+语言集成开发环境。Windows程序设计不同于DOS下的程序设计,它是一种事件驱动的程序设计模式,主要是基于消息的。Windows SDK编程主要采用C+/C语言和Windows API进行Windows应用程序设计。三、实验题目1. 控制台应用程序编写术语:“控制台应用程序”是一个在仿DOS窗口(控制台窗口)中运行的基于字符的程序,控制台窗口将成为其

3、标准输入和输出装置。由于这种模式的应用程序比Windows程序简单,我们先选择利用Visual C+来建立这样一个应用,这样使得我们可以将精力先投入到学习使用C+编程语言,而不需要把过多的精力投入到学习复杂的Windows编程中去。创建一个控制台应用,输入以下代码:#include class Vehicle public: Vehicle(float speed,int total) speed = speed; total = total; cout”constructor is called!” endl; void ShowMember() coutspeed | totalspeed

4、 = speed; this-total = total; 3、类的最后加分号 ; 4、缺少命名空间using namespace std;(2)分别在创建对象,构造函数处设置断点,调试运行。 (3)写出程序运行结果 constructor is called! 120|4 120|42.Windows SDK应用程序编写下面是一个SDK应用程序的示例,该程序的功能是构造一个编辑框控件和一个按钮。编辑框用于输入一元二次方程的系数,各系数之间用逗号分隔,当单击“计算”按钮,获取方程系数,然后将求得的根通过TextOut显示在窗口客户区中。#include #include #include /

5、求一元二次方程的根,函数返回根的个数int GetRoot(float a, float b, float c, double *root)double delta, deltasqrt;delta = b*b - 4.0 * a * c;if (delta0.0) return 0;/ 无根deltasqrt = sqrt(delta);if (a!=0.0) root0 = (-b + deltasqrt)/(2.0 * a);root1 = (-b - deltasqrt)/(2.0 * a); elseif (b!=0.0) root0 = root1 = -c/b;elseretur

6、n 0;if (root0 = root1) return 1;else return 2;char str80;LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM);/ 窗口过程int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) HWND hwnd ;/ 窗口句柄 MSG msg ;/ 消息 WNDCLASSwndclass ;/ 窗口类 wndclass.style = CS_HREDRAW |

7、CS_VREDRAW ; wndclass.lpfnWndProc = WndProc ; wndclass.cbClsExtra = 0 ; wndclass.cbWndExtra = 0 ; wndclass.hInstance = hInstance ; wndclass.hIcon = LoadIcon (NULL, IDI_APPLICATION) ; wndclass.hCursor = LoadCursor (NULL, IDC_ARROW) ; wndclass.hbrBackground = (HBRUSH) GetStockObject (WHITE_BRUSH) ; wn

8、dclass.lpszMenuName = NULL ; wndclass.lpszClassName = SDKWin;/ 窗口类名 if (!RegisterClass (&wndclass)/ 注册窗口 MessageBox (NULL, 窗口注册失败!, HelloWin, 0) ; return 0 ; / 创建窗口 hwnd = CreateWindow (SDKWin, / 窗口类名 实验1Windows编程基础,/ 窗口标题 WS_OVERLAPPEDWINDOW, / 窗口样式 CW_USEDEFAULT, / 窗口最初的 x 位置 CW_USEDEFAULT, / 窗口最初

9、的 y 位置 CW_USEDEFAULT, / 窗口最初的 x 大小 CW_USEDEFAULT, / 窗口最初的 y 大小 NULL, / 父窗口句柄 NULL, / 窗口菜单句柄 hInstance, / 应用程序实例句柄 NULL) ; / 创建窗口的参数 ShowWindow (hwnd, nCmdShow) ;/ 显示窗口 UpdateWindow (hwnd) ;/ 更新窗口,包括窗口的客户区 while (GetMessage (&msg, NULL, 0, 0) TranslateMessage (&msg) ;/ 转换某些键盘消息 DispatchMessage (&msg)

10、 ;/ 将消息发送给窗口过程,这里是WndProc return msg.wParam ;LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)HDChdc;PAINTSTRUCTps;staticHWNDhwndButton, hwndEdit;charstrEdit80, strA380, strHint80;floata3;doubleroot2;inti, j, k, m;switch (message)case WM_CREATE:/ 窗口创建产生的消息hwndEdit = Cr

11、eateWindow(edit, NULL, WS_CHILD|WS_VISIBLE|WS_ BORDER,10, 60, 200, 25, hwnd, NULL, NULL, NULL );hwndButton = CreateWindow(button, 计 算,WS_CHILD|WS_VISIBLE|BS_PUSHBUTTON,240, 60, 80, 25, hwnd, NULL, NULL, NULL );return 0 ; case WM_COMMAND:/ 命令消息,控件产生的通知代码在wParam的高字中if (HWND)lParam = hwndButton )&( HIW

12、ORD(wParam) = BN_CLICKED )/ 获取编辑框控件的内容,并将其转换成float数值GetWindowText( hwndEdit, strEdit, 80); / 获取编辑框内容/ 分隔字符串k = 0;m = 0;for (j=0; j80; j+)if (strEditj = ,)k+; m = 0;else strAkm = strEditj;m+;for (i=0; i3; i+)ai = (float)atof(strAi);/ 将字符串转换成float数值int n = GetRoot(a0, a1, a2, root);if (n1)strcpy(str,

13、方程无根!) ;else sprintf(str,方程的解为:%f, %f, root0, root1);InvalidateRect(hwnd, NULL, TRUE);case WM_PAINT:hdc = BeginPaint(hwnd, &ps);strcpy(strHint, 请输入一元二次方程的3个系数,中间用逗号分隔); TextOut(hdc, 10, 40, strHint, strlen(strHint);TextOut(hdc, 10, 90, str, strlen(str);EndPaint(hwnd, &ps);return 0 ; case WM_DESTROY:

14、/ 当窗口关闭时产生的消息PostQuitMessage (0) ;return 0 ;return DefWindowProc (hwnd, message, wParam, lParam) ;/ 执行默认的消息处理(1)请仔细阅读该程序,写出该程序的设计思路。1 书写一个求一元二次方程根的函数,使其返回值为函数的个数2 注册并 创建一个窗口3 消息处理-将其中不适合的类型改为float4 销毁窗口5 程序结束(2)参考上面的代码,使用SDK方式编写一窗口应用程序,能实现简单的画线功能。a.设计思想 所编代码只需要在函数LRESULT CALLBACK WndProc (HWND hwnd,

15、 UINT message, WPARAM wParam, LPARAM lParam)中即可,消息循环中捕捉鼠标点击的坐标的信息,再在case WM_PAINT:中调用画线的函数即可。 b.程序源代码(要求有详细的注释) #include #include #include LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM);/ 窗口过程int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) HWND

16、 hwnd ;/ 窗口句柄 MSG msg ;/ 消息 WNDCLASSwndclass ;/ 窗口类 wndclass.style = CS_HREDRAW | CS_VREDRAW ; wndclass.lpfnWndProc = WndProc ; wndclass.cbClsExtra = 0 ; wndclass.cbWndExtra = 0 ; wndclass.hInstance = hInstance ; wndclass.hIcon = LoadIcon (NULL, IDI_APPLICATION) ; wndclass.hCursor = LoadCursor (NULL

17、, IDC_ARROW) ; wndclass.hbrBackground = (HBRUSH) GetStockObject (WHITE_BRUSH) ; wndclass.lpszMenuName = NULL ; wndclass.lpszClassName = SDKWin;/ 窗口类名 if (!RegisterClass (&wndclass)/ 注册窗口 MessageBox (NULL, 窗口注册失败!, HelloWin, 0) ; return 0 ; / 创建窗口 hwnd = CreateWindow (SDKWin, / 窗口类名 实验Windows编程基础画线,/

18、 窗口标题 WS_OVERLAPPEDWINDOW, / 窗口样式 CW_USEDEFAULT, / 窗口最初的x 位置 CW_USEDEFAULT, / 窗口最初的y 位置 CW_USEDEFAULT, / 窗口最初的x 大小 CW_USEDEFAULT, / 窗口最初的y 大小 NULL, / 父窗口句柄 NULL, / 窗口菜单句柄 hInstance, / 应用程序实例句柄 NULL) ; / 创建窗口的参数 ShowWindow (hwnd, nCmdShow) ;/ 显示窗口 UpdateWindow (hwnd) ;/ 更新窗口,包括窗口的客户区 while (GetMessag

19、e (&msg, NULL, 0, 0) TranslateMessage (&msg) ;/ 转换某些键盘消息 DispatchMessage (&msg) ;/ 将消息发送给窗口过程,这里是WndProc return msg.wParam ;LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)HDChdc;PAINTSTRUCTps;static POINTS pt2;/定义一个元素为两个点的数组,方便存储鼠标落下和抬起的两个点switch (message)case WM_CRE

20、ATE:/ 窗口创建产生的消息case WM_COMMAND:/ 命令消息,控件产生的通知代码在wParam的高字中case WM_LBUTTONDOWN:/鼠标落下的消息/pt0.x = GET_X_LPRAM(lParam);/pt0.y = GET_Y_LPAAM(lParam);pt0 = MAKEPOINTS(lParam); / lParam共32位,低字节表示光标的X坐标,高字节表示光标的Y坐标,坐标是相对于客户区域的左上角case WM_LBUTTONUP:pt1 = MAKEPOINTS(lParam); /通过宏MAKEPOINTS把参数lParam转化为点Invalida

21、teRect(hwnd,NULL,TRUE); /让系统发送WM_PAINT消息重绘case WM_PAINT:hdc = BeginPaint(hwnd, &ps);MoveToEx (hdc, pt0.x, pt0.y, NULL);/起点LineTo(hdc,pt1.x,pt1.y);/终点EndPaint(hwnd, &ps);return 0 ; case WM_DESTROY:/ 当窗口关闭时产生的消息PostQuitMessage (0) ;return 0 ;return DefWindowProc (hwnd, message, wParam, lParam) ;/ 执行默认

22、的消息处理c.调试分析&运行结果 d. 用户使用说明(输入 / 输出规定) 鼠标左键落下拖拽后松开,即形成一条直线,当再次画线时前一直线消失,故窗口上 只能存在一条直线。 实验2 类和对象一、实验目的 1. 掌握类的定义方法,能合理指定类中成员的访问权限。 2. 学习对象的说明和使用方法。3. 灵活运用类和对象的相关知识进行综合程序设计。二、实验知识点概念类是对同一类事物的抽象描述,其数据成员用于描述该类事物的属性,成员函数完成修改、获取属性值或实现基于属性的某些操作。类不占用存储空间。对象是类的实例,对象占用存储空间。C+中类与结构体并没有本质的区别,结构体中也可以定义成员函数,也可以指定各

23、个成员的访问权限。两者的唯一差异在于:结构中成员的缺省访问权限是公有的,而类中成员的缺省访问权限是私有的。三、实验题目 1.设计个人信息类CPerson和学生成绩类CScore。其中,CPerson类的数据成员是姓名和学号;CScore类的数据成员除了三门成绩外,还有一个CPerson类对象stu。 2.设计数据操作类CStack,它使用数组来动态存储CScore类对象,并模拟栈的操作:push(压入)与pop(弹出)。栈是一种“FILO”(先进后出)或“LIFO”(后进先出)的存储结构。如图2-1所示,它占用一块连续的内存空间,有两个端点:一个端点是固定的,称为栈底;另一个端点是活动的,称为

24、栈顶。操作只能在栈顶进行,建立一个栈先要开辟栈空间,且为了指示栈顶位置还要设定一个指针,称为栈顶指针(图2-1中的SP)。初建栈时,栈顶指针SP指向栈底,如图2-1(a)所示。当向栈内压入一个元素d1时,先向栈顶写入d1,再将SP+,如图2-1(b)所示。再压入一个元素d2时,先向栈顶写入d2,再将SP+,如图2-1(c)所示。可见,栈顶总是用于存放下一个元素。当栈内弹出一个元素d2时,直接执行SP-,然后返回SP中的内容,如图2-1(d)所示。这样,当再次压入新元素时,d2被覆盖。SP栈底栈空间栈空间SPd1栈底 (a)空栈 (b)压入d1 图2-1 栈模型 栈空间d2d1栈底栈底栈空间d1

25、d2SPSP(c)压入d2 (d)弹出d2 图2-1 栈模型四、程序思路 思路就是先声明一个空间足够大的对象数组到一个指针,用这个指针来访问数组。涉及到一些初始化问题,各类的构造函数要写好。压栈就是把对象以参数形式传给push函数,push把对象放到数组里,并把指针+1。弹栈就是利用pop函数,把指针-1,这样就相当于栈顶元素没了。五、程序源代码(要求有详细的注释)#include #include using namespace std;const int size = 100;/数组大小static int count =0;/栈内元素计数class CPersonstring name;

26、string number;public:CPerson(const CPerson& person )/拷贝构造函数name = ;number = person.number;public:CPerson(string nam,string numbe)/两参数构造函数name = nam;number = numbe;public:CPerson():name(无人),number(000)/无参构造函数public:string showname()/取值函数return name;public:string shownumber()/取值函数return num

27、ber;class CScoreint chinese;intmath;int english;CPerson stu;public:CScore():stu(),chinese(0),math(0),english(0)/无参构造函数及初始化列表 public:CScore(CPerson st,int chines,int mat,int musi)/四参数构造函数:stu(st),chinese(chines),math(mat),english(musi)/stu = st;/chinese = chines;/math = mat;/english = musi;public:CPe

28、rson getstu()/取值函数return stu;public:int getchinese()/取值函数return chinese;public:int getmath()/取值函数return math;public:int getenglish()/取值函数return english;class CStackpublic:CScore *p;/堆栈指针public:CStack()p = new CScoresize;for(int i=0;isize-1;i+)p=new CScore();p+;p = p-size;/恢复p的指向void push(CScore scor

29、e)/压栈*p = score;p+;/指针上移count+;/栈内元素机组CScore pop()/弹栈p-;/指针下移CScore temp = *p;count-;/栈内元素机组return temp;/返回所弹出的元素,本程序中没有用到void display()/展示栈内现有元素p = p-count;/把指针归到数组开始for(int j = 0;j count;j+)cout getstu().showname() getstu().shownumber() getchinese() getmath() getenglish();p+;cout endl;void main()c

30、out 数组模拟堆栈 endl;CStack *stack = new CStack();string s1,s2;/姓名、学号int x;/想录入的信息数CPersontempPerson;CScore tempScore;cout 您要录入多少条信息: x;cout 请分别输入姓名,学号,语文成绩,数学成绩,英语成绩,用空格间隔,回车后数据压入堆栈: s1;cin s2;CPerson *tempPerson = new CPerson(s1,s2); int a,b,c;cin a;cin b;cin c;CScore *tempScore = new CScore(*tempPerso

31、n,a,b,c);stack-push(*tempScore);x-;cout 堆栈内现有: endl;cout 姓名学号语文数学英语:display();cout 输入想弹栈的数量: d & d =count)/弹栈数量必须不能大于现有元素量for(int e=0;e p-;cout 弹出p-getstu().showname() p-getstu().shownumber() p-getchinese() p-getmath() p-getenglish();cout p+;stack-pop();elsecout 堆栈内元素不足或输入非整数 endl;cout 堆栈内现有: endl;c

32、out 姓名学号语文数学英语:display();六、用户使用说明(输入 / 输出规定) 先输入人数 再依次输入 姓名 学号 语文 数学 英语成绩七、调试分析&运行结果 数组模拟堆栈 您要录入多少条信息: 3 请分别输入姓名 学号 语文成绩 数学成绩 英语成绩,用空格间隔,回车后数据压入堆栈: 张三 001 80 85 88 李四 002 85 80 90 王五 003 78 75 80 堆栈内现有:姓名 学号 语文 数学 英语张三 001 80 85 88李四 002 85 80 90王五 003 78 75 80输入想弹栈的数量:1弹出 王五 003 78 75 80堆栈内现有:姓名 学号

33、 语文 数学 英语张三 001 80 85 88李四 002 85 80 90 实验3 继承和派生一、实验目的 继承与派生是面向对象的特性,是面向对象程序设计模拟客观世界的手段之一,通过实验要求掌握:1. 掌握类的继承与派生关系及实现方法,理解类的层次结构。2. 掌握派生类构造函数初始化基类成员的方法。3. 灵活运用继承和派生的相关知识进行综合程序设计。二、实验知识点概念类的继承是新的类从已有类那里得到已有的特性。从已有的类产生新类的过程就是类的派生。在继承过程中,原有的类或已经存在的用来派生新类的类称为基类或父类,而由已经存在的类派生出的新类则称为派生类或子类。 根据派生类所拥有的基类数目不

34、同,可以分为单继承和多继承。一个类只有一个直接基类时,称为单继承;而一个类同时有多个直接基类时,则称为多继承。三、实验题目编写一个程序实现小型公司的工资管理。该公司主要有4类人员:经理、兼职技术人员、销售员和销售经理。要求存储这些人员的编号、姓名和月工资,计算月工资并显示全部信息。月工资计算办法是:经理拿固定月薪8000元,兼职技术人员按每小时100元领取月薪,销售员按该当月销售额的4%提成,销售经理即拿固定月工资也领取销售提成,固定月工资为5000元,销售提成为所管辖部门当月销售总额的5%。四、程序思路1 编写一个员工类,再编写技术人员类、销售员类和经理类虚继承员工类,使销售经理类继承销售员

35、类和经理类,兼职技术人员继承技术人员类,继承和派生关系如下图 2.在每个类中构造相应的函数,使得满足各类员工的工资管理3.构造主函数,实现存储这些人员的编号、姓名和月工资,计算月工资并显示全部信息5、 程序源代码(要求有详细的注释)#include #include using namespace std;class employeeprotected :string name;string number;double salary;double sale;public :void input(string name,string number)this-name =name;this-num

36、ber =number;this-salary =0;this-sale=10000000.0; void countsalary( )void showinformation()cout姓名:nameendl;cout编号:numberendl;cout工资:salaryendl;class manager:public employee public : void countsalary () salary=8000.0; ;class technicist:public employee public:int hour;void countsalary (int hour) cout请输

37、入工作时间hour;salary =100*hour;class salesman:public employee public :void countsalary ( )salary =sale*0.04;class salesmanager:public employee public :void countsalary ()salary =sale*0.05+5000;int main()int n;string name,number;int hour;manager a;technicist b; salesman c;salesmanager d;cout经理请按1,兼职技术人员请

38、按2,销售员请按3,销售经理请按4n;switch (n)case 1:cout请输入姓名,编号namenumber;a.input (name,number);a.countsalary ();a.showinformation ();case 2:cout请输入姓名,编号namenumber;b.input (name,number);cout请输入工作时间hour;b.countsalary (hour);b.showinformation ();case 3:cout请输入姓名,编号namenumber;c.input (name,number);c.countsalary ();c.

39、showinformation ();case 4:cout请输入姓名,编号namenumber;d.input (name,number);d.countsalary ();d.showinformation ();return 0;六、用户使用说明(输入 / 输出规定)输入职员类所代表的数字再输入姓名 编号七、调试分析运行结果 实验4 多态性和虚函数一、实验目的 1. 了解多态性在C+中的体现。2. 掌握虚函数的应用。3. 了解抽象类。二、实验知识点概念l 多态性n 多态是指同样的消息被不同类型的对象接收时导致不同的行为,所谓消息是指对类的成员函数调用,不同的行为是指不同的实现,也就是调用

40、了不同的函数。n 多态性可分为四类:重载多态、强制多态、包含多态和参数多态。n 多态从实现的角度来讲可以划分为两类:编译时的多态和运行时的多态。编译时的多态性是在编译的过程中确定了同名操作的具体操作对象,也就是通过重载函数来实现的。运行时的多态性是在程序运行过程中才动态地确定操作所针对的具体对象,就是用虚函数来实现的。l 虚函数n 虚函数是重载的另一种表现形式,它是一种动态的重载方式,它提供了一种更为灵活的多态性机制。虚函数允许函数调用与函数体之间的联系在运行时才建立,也就是在运行时才决定如何动作,即所谓的“动态连接”。n 一般虚函数成员的定义语法是:n virtual 函数类型 函数名(形参

41、表)n 虚函数的定义实际就是在原有的普通函数成员前面使用virtual关键字来限定,虚函数声明只能出现在类定义中的函数原型声明中,而不能在成员的函数体中。n 运行过程中的多态需要满足三个条件,首先类之间应满足赋值兼容规则,其二是要声明虚函数,第三是要由成员函数来调用或者是通过指针、引用来访问虚函数。三、实验题目1.编写一个程序实现图书和杂志销售管理。当输入一系列图书和杂志销售记录后,将销售良好(图书每月售500本以上,杂志每月售2500本以上)的图书和杂志名称显示出来。2.定义一个抽象类CShape,包括纯虚函数Area()(用来计算面积)和SetData(用来重设形状大小)。然后派生出三角形CTriangle类,矩形CRect类,圆CCircle类,分别求其面积。最后定义一个CArea类,计算这几个形状的面积之和,各形状的数据通过CArea类构造函数或成员函数来设置。编写一个完整的程序。四、程序思路1.建立一个基类函数,对象为书名和数目,派生类继承,然后虚函数分别为其需要的数目。2.建立一个基类函数,其中只有虚函数,对象为三角形矩形和圆,分别继承基类。五、程序源代码1、#include using namespace std;enum boolean False,True;clas

温馨提示

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

评论

0/150

提交评论