VC++实验报告

更新时间:2024-01-04 08:05:01 阅读量: 教育文库 文档下载

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

VC++实验报告

班号:0904101

学号:090410110 姓名:杨士杰

实验一VC++开发环境的熟悉和C++基础知识实验

一、实验目的

1. 掌握C++语言的特点。

2. 掌握C++的各种数据类型及基本运算。 3. 掌握C++各种控制结构及使用技巧。

4. 掌握C++的函数、数组、指针的相关概念和使用方法。 5. 灵活运用C++相关基础知识进行综合程序设计。 6. 回顾面向过程程序设计方法。

7. 熟悉Visual C++的开发环境

8.掌握用应用程序向导创建一个控制台应用项目的方法。 9.掌握源代码文件的新建、打开、保存和关闭等基本操作。 10.掌握Visual C++项目的编译、连接和执行。 11.掌握代码简单语法错误修正和调试的一般过程。

二、实验知识点概念

注意C++中同C的不同之处,包括数据类型,输入输出等相关的差异。

三、实验题目

1. 采用插入排序法,输入10个整数按升序排序后输出。要求编写一个通用的插入排序函数,它带有三个参数,第一个参数是含有n个元素的数组,这n个元素已按升序排序;第二个参数给出当前数组中元素个数;第三个参数是要插入的整数。该函数的功能是将一个整数插入到数组中,然后进行排序。另外还需要一个用于输出数组元素的函数,要求每一行输出5个元素。

2. 有5个学生,每个学生的数据结构包括学号、姓名、年龄、C++成绩,数学成绩和英语成绩、总平均分,从键盘输入5个学生的学号、姓名、3门课的成绩,计算3门课的总平均分,最后将5个学生的数据输出。要求各个功能用函数实现。

3. 对程序加入断点简单调试。

四、程序思路

题目(一): 1:初始化数组各项为零。 2:定义插入函数,输出函数,主函数。 3:主函数循环输入,每次输入之后讲数字插入数组中。 4:插入利用指针进行操作。

1

题目(二):

1:定义student和students类,其中students中包含student的数组。

2:student中包含应有的数据成员,并且都具有相应的getXXX和setXXX的方法。

五、程序源代码

题目(一):

#include

void func(int a[],int num, int n) {

int *p=a; int *q=p+1; int j; int i;

if(num==0) //如果数组为空,就把此数字置为第一个数。 { *p=n;

2

}

void output(int a[]) //输出函数 {

int i;

int span=10;

for(i=0;iint main() {

int i;

int b[11]={0,0,0,0,0,0,0,0,0,0,0};

int n;

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

3

return; }

for(i=0;i

p=a+num; //将指针置于数字排列的尾部,使数组元素由

//插入节点之后依次向后移动。

for(j=0;j

*(p+1)=n;

cout<<\ cin>>n; func(b,i,n); }

output(b); return 0; }

题目(二):

#include #include

#define N 2 class Student {

private:

char *name; char *num; int age;

float cScore;

float englishScore; float mathScore; float ave; public:

void setName() { cout<<\ name=new char[10]; cin>>name; }

char * getName() { return name; }

int getAge() { return age; }

void setAge() { cout<<\

4

//宏定义数组元素的个数

cin>>age; }

char *getNum() { return num; }

void setNum() { cout<<\ num=new char[10]; cin>>num; }

float getCScore() { return cScore; }

float getEnglishScore() { return englishScore; }

float getMathScore() { return mathScore; }

void setCScore() { cout<<\ cin>>cScore; }

void setEnglishScore() { cout<<\ cin>>englishScore; }

void setMathScore() {

5

cout<<\ cin>>mathScore; }

float getAve() { return (mathScore+englishScore+cScore)/3; }

~Student() //释放动态内存 {

delete num; delete name; } };

class Students {

private:

Student stu[N]; public:

void inPut() { for(int i=0;i

void outPut() { for( int i=0;i

6

cout<<\ cout<

int main() {

Students stu; stu.inPut(); stu.outPut(); return 0; }

六、用户使用说明(输入 / 输出规定)

根据程序提示进行输入。

七、调试分析&运行结果

7

题目(一):

输入:

please input the 1number 3

please input the 2number 1

please input the 3number 2

please input the 4number 6

please input the 5number 4

please input the 6number 5

please input the 7number 7

please input the 8number 9

please input the 9number 8

please input the 10number 10

输出:

12345 678910

Press any key to continue

题目(二):

输入:

please input the name :ysj please input the num :3 please input the age :18 please input the CScore :98

8

please input the EnglishScore :97 please input the MathScore :99 please input the name :zy please input the num :2 please input the age :19 please input the CScore :99

please input the EnglishScore :96 please input the MathScore :97

输出:

------------------------------ name :ysj num:3 age:18 cScore:98

EnglishScore:97 MathScore:99 Ave:98

------------------------------ ------------------------------ name :zy num:2 age:19 cScore:99

EnglishScore:96 MathScore:97 Ave:97.3333

------------------------------ Press any key to continue

9

实验二Windows SDK程序设计

一、实验目的

1. 掌握Windows程序运行基本原理。

2. 掌握使用SDK(Windows API)方式编写Windows应用程序方法。 3. 掌握用应用程序向导创建一个Windows应用项目的方法。

二、实验知识点概念

Windows程序设计不同于DOS下的程序设计,它是一种事件驱动的程序设计模式,主要是基于消息的。

三、实验题目

编写一窗口应用程序,能实现简单的画线功能。

四、程序思路

1.工程由WinMain()和MyWinProc()构成。

2.设计菜单选项:形状,颜色,笔形。其中形状弹出选项中有点,直线,矩形,椭圆四个选项;颜色中有红,绿,蓝三个选项,其中默认的为黑色;笔形里有粗和细两种选择。

3.设计自己的鼠标指针和图标,并导入到工程中。

4.实现简单的画线功能,实现“橡皮筋”画线和“橡皮筋”画矩形功能。 5..添加颜色的选择,添加笔形的选择。

10

五、程序源代码

#include #include #include \

LRESULT CALLBACK MyWinProc(HWND hwnd,UINT uMsg,WPARAM wparam,LPARAM lparam); int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int cmdShow) {

WNDCLASS wndcls; wndcls.cbClsExtra=0; wndcls.cbWndExtra=0;

wndcls.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH); wndcls.hCursor=LoadCursor(hInstance,

MAKEINTRESOURCE(IDC_CURSOR1));//设置自己的鼠标指针

wndcls.hIcon=LoadIcon(hInstance,MAKEINTRESOURCE(IDI_ICON1));、//设置自己的图标

wndcls.hInstance=hInstance;

wndcls.lpfnWndProc=MyWinProc; wndcls.lpszClassName=\

wndcls.lpszMenuName=MAKEINTRESOURCE(IDR_MENU1); wndcls.style=CS_HREDRAW | CS_VREDRAW;

if (!RegisterClass(&wndcls)) //注册窗口类 return 1;

HWND hwnd;

hwnd=CreateWindow(\\vc课堂\

CW_USEDEFAULT,CW_USEDEFAULT,600,400,NULL,NULL,hInstance,NULL);

if (!hwnd) return 1;

11

ShowWindow(hwnd,SW_SHOWNORMAL); UpdateWindow(hwnd);

MSG msg;

while(GetMessage(&msg,NULL,0,0)) { TranslateMessage(&msg); DispatchMessage(&msg); }

return 0; }

LRESULT CALLBACK MyWinProc(HWND hwnd,UINT uMsg,WPARAM wparam,LPARAM lparam) {

static int drawtype=1; //声明一些静态的常量来保存当前的画图状态 static BOOL isDraw=0;

static POINT pt1; //保存点的坐标 static POINT pt2;

static int size=1; //设置初始的字体

static COLORREF color=RGB(0,0,255); // 设置初始的颜色

switch(uMsg) { /*

case WM_CHAR: char c[10]; sprintf(c,\ MessageBox(hwnd,c,\ break; */

case WM_CLOSE: if(IDYES==MessageBox(hwnd,\ { DestroyWindow(hwnd); } break;

case WM_DESTROY:

12

PostQuitMessage(0); break;

case WM_COMMAND: //响应菜单的操作 if(ID_MENU_DOTLINE==LOWORD(wparam)) { drawtype=1; } else if(ID_MENU_LINE==LOWORD(wparam)) { drawtype=2; } else if(ID_MENU_RECT==LOWORD(wparam)) { drawtype=3; //MessageBox(hwnd,\ } else if(ID_MENU_ELLIPSE==LOWORD(wparam)) { drawtype=4; } else if(ID_MENU_THIN==LOWORD(wparam)) { size=1; } else if(ID_MENU_WIDE==LOWORD(wparam)) { size=10; } else if(IDM_RED==LOWORD(wparam)) { color=RGB(255,0,0); } else if(IDM_GREEN==LOWORD(wparam)) { color=RGB(0,255,0); } else if(IDM_BLACK==LOWORD(wparam)) { color=RGB(0,0,255); } break; case WM_LBUTTONDOWN: //响应鼠标左键按下

13

pt1.x=LOWORD(lparam); pt1.y=HIWORD(lparam); pt2.x=LOWORD(lparam); pt2.y=HIWORD(lparam); isDraw=1; //MessageBox(hwnd,\ break;

case WM_LBUTTONUP: //响应鼠标左键抬起 pt2.x=LOWORD(lparam); pt2.y=HIWORD(lparam); HDC dc; dc=GetDC(hwnd); if(drawtype==2) { //SelectObject(dc,GetStockObject(BLACK_PEN)); HPEN pen; pen=CreatePen(PS_SOLID,size,color); SelectObject(dc,pen); MoveToEx(dc,pt1.x,pt1.y,NULL); LineTo(dc,pt2.x,pt2.y); DeleteObject(pen); } if(drawtype==3) { SelectObject(dc,GetStockObject(HOLLOW_BRUSH)); Rectangle(dc,pt1.x,pt1.y,pt2.x,pt2.y); } isDraw=0; ReleaseDC(hwnd,dc); break;

case WM_MOUSEMOVE: if(isDraw==1&&drawtype==1) { HDC dc; dc=GetDC(hwnd);

14

}

MoveToEx(dc,pt1.x,pt1.y,NULL);

LineTo(dc,pt1.x=LOWORD(lparam),pt1.y=HIWORD(lparam)); ReleaseDC(hwnd,dc);

if(isDraw==1&&drawtype==2) { HDC dc; dc=GetDC(hwnd);

HPEN pen;

pen=CreatePen(PS_SOLID,size,color);

SelectObject(dc,pen); SetROP2(dc,R2_NOTXORPEN); //此函数擦除先前画线的痕迹 MoveToEx(dc,pt1.x,pt1.y,NULL); if(pt1.x!=pt2.x&&pt1.y!=pt2.y) LineTo(dc,pt2.x,pt2.y);

SelectObject(dc,pen);

MoveToEx(dc,pt1.x,pt1.y,NULL);

LineTo(dc,LOWORD(lparam),HIWORD(lparam)); ReleaseDC(hwnd,dc); pt2.x=LOWORD(lparam); pt2.y=HIWORD(lparam); DeleteObject(pen);

}

if(isDraw==1&&drawtype==3) {

15

HDC dc;

dc=GetDC(hwnd);

SelectObject(dc,GetStockObject(NULL_BRUSH)); HPEN pen;

pen=(HPEN)SelectObject(dc,CreatePen(PS_SOLID,1,GetBkColor(dc))); SetROP2(dc,R2_NOT); //此函数擦除先前画线的痕迹 Rectangle(dc,pt1.x,pt1.y,pt2.x,pt2.y); SelectObject(dc,pen); Rectangle(dc,pt1.x,pt1.y,LOWORD(lparam),HIWORD(lparam)); pt2.x=LOWORD(lparam); pt2.y=HIWORD(lparam); DeleteObject(pen); ReleaseDC(hwnd,dc); } break;

default: return DefWindowProc(hwnd,uMsg,wparam,lparam);

}

// ReleaseDC(hwnd,dc); return 0; }

六、用户使用说明(输入 / 输出规定)

七、调试分析&运行结果

16

实验三 类和对象实验

一、实验目的

1. 掌握类的定义方法,能合理指定类中成员的访问权限。 2. 学习对象的说明和使用方法。

3. 灵活运用类和对象的相关知识进行综合程序设计。

二、实验知识点概念

类是对同一类事物的抽象描述,其数据成员用于描述该类事物的属性,成员函数完成修改、获取属性值或实现基于属性的某些操作。类不占用存储空间。对象是类的实例,对象占用存储空间。C++中类与结构体并没有本质的区别,结构体中也可以定义成员函数,也可以指定各个成员的访问权限。两者的唯一差异在于:结构中成员的缺省访问权限是公有的,而类中成员的缺省访问权限是私有的。

三、实验题目

定义整数集合数set,该类包括以下数据成员: int elem[N]; int num;

包含以下成员函数: Set();//默认构造函数

Set(int a[],int s); //以数组a的元素和位置s构造一个集合 void empty();//清空集合

int isempty();//判断是否为空集合

17

int member(int a);//判断a是否为集合元素 int add(int a); //将a添加到集合中 int del(int a); //从集合中删除元素a

int equ(Set & set);//判断两个集合是否相等 Set intersection(Set & set);//求两个集合的交集 Set merge(Set & set);// 求两个集合的并集 void copy(Set & set);//集合复制 void disp();//输出集合元素

四、程序思路

18

五、程序源代码

Set.h:

class Set {

public: int num; int elem[N]; Set();//默认构造函数 Set(int a[],int s); //以数组a的元素和位置s构造一个集合 Set(Set & st); void empty();//清空集合 int isempty();//判断是否为空集合

19

int member(int a);//判断a是否为集合元素 int add(int a); //将a添加到集合中 int del(int a); //从集合中删除元素a

int equ(Set & set);//判断两个集合是否相等 Set intersection(Set & set);//求两个集合的交集 Set merge(Set & set);// 求两个集合的并集 void copy(Set & set);//集合复制 void disp();//输出集合元素

};

Set.cpp:

#include #include \#define N 100

Set::Set() {

for(int i=0;i

Set::Set(int a[],int s) {

for(int i=0;i

num=s; }

void Set::empty() {

for(int i=0;i

num=0;

20

}

int Set::isempty() {

return num; }

int Set::member(int a) {

int i;

for(i=0;i

if(i!=num)

return i+1; else return 0; }

int Set::add(int a) {

if(!member(a)) { elem[num]=a; num++; return 1; } else { //cout<<\元素重复!\ return 0; } }

int Set::del(int a) {

int k=member(a);

21

if(k) { for(int i=k;i

int Set::equ(Set & set) {

int flag=1;

if(num==set.num) { for(int i=0;i

else flag=0; return flag; }

Set Set::intersection(Set & set) {

Set st;

for(int i=0;i

22

if(elem[i]==set.elem[j]) { st.add(elem[i]); } } }

return st; }

Set Set::merge(Set & set) {

Set st;

for(int i=0;i

for(int j=0;j

void Set::copy(Set & set) {

this->empty();

for(int i=0;i

num=set.num; }

void Set::disp() {

if(num==0) cout<<\没有元素\ for(int i=0;i

cout<

23

Set::Set(Set & set) {

this->empty();

for(int i=0;i

num=set.num; }

int main() {

int a[10]={1,3,2,4,6,5,19,89,9,45};

int b[20]={1,2,4,3,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20}; Set s1;

Set s2(a,10); Set s3(b,20); Set s4; s1.disp();

cout<<\ s2.disp();

cout<<\ s4=s2.intersection(s3); s4.disp();

cout<<\ s4.empty();

cout<<\ s4.disp();

cout<<\ s4=s2.merge(s3); s4.disp();

cout<<\ s1.copy(s2); s1.disp();

cout<<\ s2.del(89); s2.disp();

cout<<\ s2.add(104); s2.disp();

cout<<\ return 0;

24

}

六、用户使用说明(输入 / 输出规定)

无输入,测试输出时用横线隔开。

七、调试分析&运行结果

输出:

没有元素

-----------

1 3 2 4 6 5 19 89 9 -----------

1 3 2 4 6 5 19 9 ----------- ----------- 没有元素

-----------

1 3 2 4 6 5 19 89 9 18 20 -----------

1 3 2 4 6 5 19 89 9 -----------

1 3 2 4 6 5 19 9 45 -----------

1 3 2 4 6 5 19 9 45 -----------

Press any key to continue

45 45 7 8 45 104 25

10 11 12 13 14 15 16 17 实验四 继承和派生实验

一、实验目的

继承与派生是面向对象的特性,是面向对象程序设计模拟客观世界的手段之一,通过实验要求掌握:

1. 掌握类的继承与派生关系及实现方法,理解类的层次结构。 2. 掌握派生类构造函数初始化基类成员和对象成员的方法。 3. 灵活运用继承和派生的相关知识进行综合程序设计。

二、实验知识点概念

类的继承是新的类从已有类那里得到已有的特性。从已有的类产生新类的过程就是类的派生。在继承过程中,原有的类或已经存在的用来派生新类的类称为基类或父类,而由已经存在的类派生出的新类则称为派生类或子类。 根据派生类所拥有的基类数目不同,可以分为单继承和多继承。一个类只有一个直接基类时,称为单继承;而一个类同时有多个直接基类时,则称为多继承。

三、实验题目

编写一个程序实现小型公司的工资管理。该公司主要有4类人员:经理、兼职技术人员、销售员和销售经理。要求存储这些人员的编号、姓名和月工资,计算月工资并显示全部信息。月工资计算办法是:经理拿固定月薪8000元,兼职技术人员按每小时100元领取月薪,销售员按该当月销售额的4%提成,销售经理即拿固定月工资也领取销售提成,固定月工资为5000元,销售提成为所管辖部门当月销售总额的5%。

四、程序思路

26

27

五、程序源代码

People.h:

#ifndef PEOPLE #define PEOPLE 0

class People {

private:

char *name; char *num; int salary; public:

People();

People(char *name,char *num); char * getName(); char * getNum();

virtual int getSalary()=0; void setName(char * n); void setNum(char * n); ~People(); }; #endif

Manager.h:

#ifndef MANAGER #define MANAGER 0

class Manager: public People {

public:

Manager(char *name,char *num); int getSalary();

28

}; #endif

Salesman.h:

#ifndef SALESMAN #define SALESMAN 0

class Salesman:public People {

private:

float saleroom; public:

Salesman(char * name,char * num,float saleroom); int getSalary(); }; #endif

Salesmanager.h:

#ifndef SALESMANAGER #define SALESMANAGER 0

class SalesManager:public People {

private:

float T_saleroom; public :

SalesManager(char *name,char *num,float T_saleroom); int getSalary(); };

#endif

29

Technician.h:

#ifndef TECHNICIAN #define TECHNICIAN 0

class Technician:public People {

private:

int workHour; public :

Technician(char *name,char *num,int workHour); int getSalary(); };

#endif

People.cpp:

#include #include

#include \#include \#include \#include \#include \

People::People() { name= new char[7]; strcpy(name,\ num= new char[2]; strcpy(num,\ salary=0; }

People::People(char *name,char *num)

30

{ this->name=new char[strlen(name)+1]; strcpy(this->name,name); this->num=new char[strlen(num)+1]; strcpy(this->num,num); salary=0; }

char * People::getName() { return name; }

char * People::getNum() { return num; }

void People::setName(char * n) { delete name; this->name=new char[strlen(n)+1]; strcpy(this->name,n); }

void People::setNum(char * n) { delete num; this->num=new char[strlen(n)+1]; strcpy(this->num,n); }

People::~People() { delete name; delete num; }

Manager::Manager(char *name,char *num):People(name,num) { }

int Manager::getSalary()

31

{ return 8000; }

Technician::Technician(char*name,char*num,int workHour):People(name,num) { this->workHour=workHour; }

int Technician::getSalary() { return 100*workHour; }

Salesman::Salesman(char*name,char*num,float saleroom):People(name,num) { this->saleroom=saleroom; }

int Salesman::getSalary() { return (int)(0.04*saleroom); }

SalesManager::SalesManager(char*name,char*num,float T_saleroom):People(name,num) { this->T_saleroom=T_saleroom; }

int SalesManager::getSalary() { return 5000+(int)(0.05*T_saleroom); }

32

int main() {

SalesManager sma(\ Salesman sm(\ Technician tn(\ Manager m(\

People *p=&m; cout<getName()<<\ p=&tn; cout<getName()<<\ p=&sm; cout<getName()<<\ p=&sma; cout<getName()<<\ return 0; }

六、用户使用说明(输入 / 输出规定)

七、调试分析&运行结果

输出:

ysj 001 8000 zz 101 10000 ss 201 40 yy 302 5615 Press any key to continue

33

实验五 多态性和虚函数实验

一、实验目的

1. 了解多态性在C++中的体现。 2. 掌握虚函数的应用。 3. 了解抽象类。

二、实验知识点概念

? 多态性

? 多态是指同样的消息被不同类型的对象接收时导致不同的行为,所谓消息是指对类的成员函数调用,不同的行为是指不同的实现,也就是调用了不同的函数。

? 多态性可分为四类:重载多态、强制多态、包含多态和参数多态。 ? 多态从实现的角度来讲可以划分为两类:编译时的多态和运行时的多态。编译时的多态性是在编译的过程中确定了同名操作的具体操作对象,也就是通过重载函数来实现的。运行时的多态性是在程序运行过程中才动态地确定操作所针对的具体对象,就是用虚函数来实现的。 ? 虚函数

? 虚函数是重载的另一种表现形式,它是一种动态的重载方式,它提供了一种更为灵活的多态性机制。虚函数允许函数调用与函数体之间的联系在运行时才建立,也就是在运行时才决定如何动作,即所谓的“动态连接”。

? 一般虚函数成员的定义语法是:

? virtual 函数类型 函数名(形参表)

? 虚函数的定义实际就是在原有的普通函数成员前面使用virtual关键字来限定,虚函数声明只能出现在类定义中的函数原型声明中,而不能在成员的函数体中。

? 运行过程中的多态需要满足三个条件,首先类之间应满足赋值兼容规则,其二是要声明虚函数,第三是要由成员函数来调用或者是通过指针、引用来访问虚函数。

三、实验题目

编写一个程序实现图书和杂志销售管理。当输入一系列图书和杂志销售记录后,将销售良好(图书每月售500本以上,杂志每月售2500本以上)的图书和杂志名称显示出来。

四、程序思路

1. 编写book基类,并派生出sbook类和magzine类。

2. 在book基类中编写纯虚函数printifCan(),并在sbook类和magzine类

中分别实现它。

3. 在主函数中声明一个book *p的基类指针,分别把它指向多个已经初始

34

化的sbook类和magzine类,并调用printifCan函数。

五、程序源代码

book.h:

#ifndef BOOK #define BOOK 1

class Book {

protected:

char *name; int sellAmount; public: Book();

Book(char *n,int a);

Book(const Book &b);

char *getName();

virtual int printIfCan()=0;

void setName(char *n); void setAmount(int a); virtual ~Book(); }; #endif

35

Sbook.h:

#include \

#ifndef SBOOK #define SBOOK 1

class SBook:public Book {

public: SBook(char *n,int a); int printIfCan(); virtual ~SBook(); }; #endif

Magzine.h:

#include \

#ifndef MAGZINE #define MAGZINE 1

class Magzine:public Book {

public:

Magzine(char *n,int a);

int printIfCan(); }; #endif

36

Ysj_book.cpp:

#include #include #include \#include \#include \ Book::Book() { name=new char[7]; strcpy(name,\ sellAmount=0; } Book::Book(char *n,int a) { name=new char[strlen(n)+1]; strcpy(name,n); sellAmount=a; } Book::Book(const Book &b) { name=new char[strlen(b.name)+1]; strcpy(name,b.name); sellAmount=b.sellAmount; } char * Book::getName() { return name; } virtual int Book::printIfCan(); void Book::setName(char *n) { delete name; name=new char[strlen(n)+1]; strcpy(name,n); }

37

void Book::setAmount(int a) { sellAmount=a; }

Book::~Book() { cout<<\ delete name; } SBook::SBook(char *n,int a):Book(n,a) {} int SBook::printIfCan() { if(sellAmount>500) { cout<

SBook::~SBook() { cout<<\ } Magzine::Magzine(char *n,int a):Book(n,a) {}

38

int Magzine::printIfCan() { if(sellAmount>2500) { cout<

int main() { SBook b1(\ SBook b2(\ SBook b3(\ Magzine m1(\ Magzine m2(\ Book *b=&b1; b->printIfCan(); b=&b2; b->printIfCan(); b=&b3; b->printIfCan(); b=&m1; b->printIfCan(); b=&m2; b->printIfCan(); b=&b2; b2.setAmount(900); b2.setName(\ b->printIfCan(); return 0; }

39

六、用户使用说明(输入 / 输出规定)

由于有初始化,所以无特殊规定 SBook b1(\

SBook b2(\ SBook b3(\ Magzine m1(\

Magzine m2(\

七、调试分析&运行结果 c++ jsp earth jspjsp

Press any key to continue

40

实验六 Windows程序开发实验

一、实验目的

1、掌握使用Visual C++开发Windows程序的基本方法 2、理解Windows程序原理。

3、了解MFC类库及MFC应用程序框架。

二、实验知识点概念

1、Windows程序设计是基于事件驱动的程序设计模式。

2、类库是一个可以在应用程序中使用的互相关联的C++类的集合。与一般类库不同,Microsoft基本类库(MFC)是一个Windows应用程序框架,它定义了应用程序的结构并实现了标准的用户接口。MFC提供了管理窗口、菜单、对话框的代码,可以实现基本的输入/输出和数据存储。

二、实验题目

1. 利用MFC应用程序向导分别生成单文档、多文档、对话框应用程序,观察三种应用程序分别有哪些类组成?这些类有什么作用,分别继承哪些MFC基类?

单文档:

CAboutDlg 继承自CDialog 显示信息

CMainFrame 继承自CFrameWnd 程序窗口的框架 C***App 继承自CWinApp 程序运行的主程序 C***Doc 继承自CDocument 文档类 C***View 继承自CView 试图类

多文档:

CAboutDlg 继承自CDialog 显示信息

CMainFrame 继承自CFrameWnd 程序窗口的框架 CChildFrame继承自CFrameWnd 程序的字窗口框架 C***App 继承自CWinApp 程序运行的主程序 C***Doc 继承自CDocument 文档类 C***View 继承自CView 试图类

对话框:

CAboutDlg 继承自CDialog 显示信息

C***App 继承自CWinApp 程序运行的主程序

C***Dlg 继承自CDialog 控制程序的主对话框

41

2. 创建一个单文档工程项目,在该项目中添加一个口令对话框(如图所示),口令为自己设定的一个值,以防止非法用户侵入。

口令对话框

(1)设计思路与步骤

1.设计和插入一个新的对话框资源,并设计好编辑框。

2. 为对话框关联一个类,并为编辑框关联一个成员变量m_key,并声明为public。

3.在App中的initInstance(),中增加代码。

(2)源代码(只写明自己添加的代码)

CMyDlg dlg; //声明对话框变量

if(dlg.DoModal()==IDOK&&dlg.m_key==\ { if (!ProcessShellCommand(cmdInfo)) return FALSE;

m_pMainWnd->ShowWindow(SW_SHOW); m_pMainWnd->UpdateWindow(); return TRUE; } else { AfxMessageBox(\密码错误!\ return FALSE; }

42

本文来源:https://www.bwwdw.com/article/2hbx.html

Top