《面向对象程序设计》课程界面设计练习题目
面向对象程序设计练习题

面向对象程序设计练习题面向对象程序设计练习题面向对象程序设计是一种常用的软件开发方法,它将现实世界中的事物抽象成对象,通过定义对象的属性和方法来描述其行为。
这种编程方法可以提高代码的可重用性、可维护性和可扩展性。
下面将介绍几个面向对象程序设计的练习题,帮助读者更好地理解和应用这一编程方法。
1. 汽车租赁系统设计一个汽车租赁系统,包括汽车类、客户类和租赁记录类。
汽车类包括车牌号、品牌、型号和日租金等属性,客户类包括姓名、联系方式等属性,租赁记录类包括租车日期、租期和总租金等属性。
实现以下功能:- 客户可以查看可租赁的汽车列表;- 客户可以选择汽车租赁,并记录租车日期和租期;- 客户可以查看自己的租赁记录和总租金。
2. 图书管理系统设计一个图书管理系统,包括图书类、读者类和借阅记录类。
图书类包括书名、作者、出版社和价格等属性,读者类包括姓名、学号等属性,借阅记录类包括借书日期、归还日期等属性。
实现以下功能:- 图书管理员可以添加、删除和修改图书信息;- 读者可以查询图书信息,并借阅或归还图书;- 读者可以查看自己的借阅记录和逾期情况。
3. 银行账户管理系统设计一个银行账户管理系统,包括账户类、客户类和交易记录类。
账户类包括账户号码、余额等属性,客户类包括姓名、联系方式等属性,交易记录类包括交易日期、交易类型和交易金额等属性。
实现以下功能:- 客户可以查询账户余额;- 客户可以进行存款和取款操作,并记录交易记录;- 客户可以查看自己的交易记录和账户余额变动情况。
通过以上练习题,读者可以锻炼面向对象程序设计的能力,熟悉类的定义、属性和方法的使用,以及对象之间的交互。
在实现这些功能的过程中,读者需要考虑如何合理组织代码结构,如何处理异常情况,以及如何提高代码的可读性和可维护性。
在实际的软件开发中,面向对象程序设计是一种非常常用的编程方法。
它不仅可以提高代码的质量,还可以提高开发效率。
因此,掌握面向对象程序设计的技巧对于软件开发人员来说是非常重要的。
《面向对象程序设计(Java)》机试题库(含答案)

《面向对象程序设计(Java)》机试题库(含答案)1.编写一个字符界面的Java Application 程序,接受用户从键盘输入的一个正整数,然后统计并输出从1到这个正整数的累加和。
2.编写一个字符界面的Java Application 程序,接受用户输入的10个整数,并输出这10个整数的最大值和最小值。
3.编写一个完整的Java Applet 程序使用复数类Complex验证两个复数1+2i 和3+4i 相加产生一个新的复数4+6i 。
复数类Complex必须满足如下要求:(1)复数类Complex 的属性有:RealPart : int型,代表复数的实数部分ImaginPart : int型,代表复数的虚数部分(2)复数类Complex 的方法有:Complex( ) : 构造函数,将复数的实部和虚部都置0Complex( int r , int i ) : 构造函数,形参r 为实部的初值,i为虚部的初值。
Complex complexAdd(Complex a) : 将当前复数对象与形参复数对象相加,所得的结果仍是一个复数值,返回给此方法的调用者。
String ToString( ) : 把当前复数对象的实部、虚部组合成a+bi 的字符串形式,其中a 和b 分别为实部和虚部的数据。
4.编写一个学生类Student ,要求:(1) 学生类Student 属性有:id : long型,代表学号name : String类对象,代表姓名age : int型,代表年龄sex : boolen型,代表性别(其中:true表示男,false表示女)phone : String类对象,代表联系电话(2) 学生类Student的方法有:Student(long i , String n , int a , boolean s , long p): 有参构造函数,形参表中的参数分别初始化学号、姓名、年龄、性别和联系电话。
《面向对象程序设计》课程知识 复习 学习材料 试题与参考答案

《面向对象程度设计》课程知识复习学习材料试题与参考答案一、单选题1.下列(C)的调用方式是引用调用。
A.形参和实参都是变量B.形参是指针,实参是地址值C.形参是引用,实参是变量D.形参是变量,实参是地址值2.假定CTest为一个类,并且有一无默认值的的有参构造函数和一无参构造函数,则执行“CTest objTest;”语句时将自动调用该类的(B)。
A.有参构造函数B.无参构造函数C.复制构造函数D.赋值构造函数3.假定AA为一个类,a为该类私有的数据成员,GetValue()为该类公有函数成员,它返回a 的值,x为该类的一个对象,则访问x对象中数据成员a的格式为(D)。
A.x.aB.x.a()C.x->GetValue()D.x.GetValue()4.C++编译系统确定调用是具体对象的过程称为关联。
C++有(B)关联。
A.1种B.2种C.3种D.4种5.下面有关重载函数的说法中正确的是(C)。
A.重载函数必须具有不同的返回值类型B.重载函数形参个数必须不同C.重载函数必须有不同的形参列表D.重载函数名可以不同6.如果表达式a==b中的“==”是作为普通函数重载的运算符,若采用运算符函数调用格式,则可表示为(C)。
A.a.operator==(b)B.b.operator==(a)C.operator==(a,b)D.operator==(b,a)7.下列对继承关系的描述中,(D)是正确的。
A.在公有继承中,基类中的公有成员和私有成员在派生类中都是可见的;B.在公有继承中,基类中只有公有成员对派生类的对象是可见的;C.在私有继承中,基类中只有公有成员对派生类是可见的;D.在私有继承中,基类中的保护成员对派生类的对象是可见的;8.定义p并使p指向动态空间中的包含30个整数的数组所使用的定义语句为(A)。
A.int *p=new int[30];B.int *p=new int(30);C.int *p=new [30];D.*p=new int[30];9.在一个类中可以对一个运算符进行(D)重载。
面向对象程序设计模拟试题-1

C、对随机文件可以根据记录号进行读写
D、可用Input函数和Print函数进行随机文件的读写
10.在下列的( )事件中可以获取用户按下的键的ASCII码
A、KeyPressB、KeyUpC、KeyDownD、MouseUp
11.要使得文件列表框file1中只显示文件后缀名为bmp和jpg的图片文件,以下哪个语句是对的:()
4.水平滚动条HScroll1的LargeChange属性值为100,表示(C)为100
A、该滚动条值的最大值
B、拖动滚动框时滚动条值的变化量
C、单击滚动箭头和滚动框之间某位置时的滚动条值的变化量
D、单击滚动箭头时的滚动条值的变化量
5.与Microsoft SQL Server数据库连接,一般应采用中的()连接对象
14.要使窗体运行时,显示在屏幕的中央,应设置窗体的(C)属性
A、WindowState
B、StartPosition
C、CenterScreen
D、CenterParent
15.当一个窗体在可见状态下,由非活动窗体变成活动窗体时,产生的事件是:()
A、Load事件
B、Resize事件
C、Initialize事件
说明:此题中所需的数据库文件Henry Books.mdb在上机考试文件中,请找到此文件,用Access打开,找到Branch表,了解表结构设计。
二、单项选择题(在每小题的四个备选答案中选出一个正确答案,并将其号码填在题后的括号内。每小题2分,共30分)
1.下述的说法中,哪种是的程序设计方法:(D)
4.(共15分)数据库操作(在窗体Form3中完成,界面已设计好)
面向对象程序设计样卷

面向对象程序设计样卷一、选择题( 本大题共10小题, 每题2分, 共20分)4.在下列定义的引用中, ( B )是错误的。
A. int i;B. int i;int &j = i; float &j=i;C. float i;D. char d;float &j = i; char &e = d;5. 假定BB为一个类,则执行BB y;语句时将自动调用该类的( B )A. 有参构造函数B. 无参构造函数C. 拷贝构造函数D. 赋值重载函数7.下列对派生类的描述中, ( C )是错误的。
A. 一个派生类能够作为另一个派生类的基类B.派生类至少应有一个基类C. 基类中成员访问权限继承到派生类中都保持不变D.派生类成员除了自己定义的成员外, 还包含了它的基类成员10.控制输出格式的控制符中, ( D )是设置输出宽度的。
A.wsB.endsC. setfill()D.setw()二、填空题( 本大题共10小题, 每题2分, 共20分)1.以/*开始, 以*/结束, 在/*和*/之间的部分即为注释。
2.重载函数在参数类型或参数个数上不同, 但函数名和类名_相同。
3. 假如一个类的名称为MyClass, 使用这个类的一个对象初始化该类的另一个对象时, 能够调用__拷贝______构造函数来完成此功能。
4.当删除对象时, 程序自动调用析构函数。
5. 对于每一个类的非静态成员函数, 都有一个隐含的_this_______指针。
8. 抽象类是指类里有一个函数, 是纯嘘函数。
三、改错题( 下面程序或程序段中有一处错误, 请用注释标明错误所在行的出错原因。
本大题共5小题, 每题2分, 共10分) 1. #include<iostream>using namespace std;int main(){ cout<<"This is a program."<<endl;return 0;}2. #include<iostream>using namespace std;int main(){x=3;int y=x*x;cout<<"y="<<y<<"\n";return 0;}3. #include<iostream>using namespace std;class Aa{public:Aa(int i=0){a=i; cout<<"Constructor "<<a<<endl; } ~Aa(){ cout<<"Destructor "<<a<<endl; }void print( ){cout<<a<<endl;}private:int a;};int main(){Aa al(1),a2(2);al.print();cout<<a2.a<<endl;return 0;}4.class A{int a,b;public:A(int aa,int bb=78){a=aa;b=bb;} };int main(){A x(2), y(4,9);return 0;}5. #include<iostream>using namespace std;class Test{public:static int x;};int Test :: x=20;int main(){cout<<Test::x;return 0;}四、程序分析题( 分析程序, 写出运行结果。
面向对象程序设计习题

⾯向对象程序设计习题选择题1. 程序中主函数的名字为()。
A. mainB. MAINC. MainD. 任意标识符2. 为了提⾼程序的运⾏速度,可将不太复杂的功能⽤函数实现,此函数应选择()。
A. 内联函数B.重载函数C.递归函数D.函数模板3. 将两个字符串连接起来组成⼀个字符串时,选⽤()函数。
A. strlen()B. strcap()C. strcat()D. strcmp()4. 对于任⼀个类,⽤户所能定义的析构函数的个数⾄多为( )。
A. 0B. 1C. 2D. 任意个5. 对类中引⽤成员的初始化是通过构造函数中给出的( )实现的。
A. 函数体B. 参数表C. 初始化表D. 初始化表或函数体6. 假定AB为⼀个类,则执⾏“AB x(a,5);”语句时将⾃动调⽤该类的( )。
A. 带参构造函数B. ⽆参构造函数C. 拷贝构造函数D. 赋值重载函数7. 对于任⼀个类,⽤户所能定义的析构函数的个数⾄多为( )。
A. 0B. 1C. 2D. 任意个8. ⽤new运算符创建⼀维整型数组的正确语句是__________。
A. int *p=new a[10];B.int *p=new float[10];C. int *p=new int[10];D.int *p=new int[5]={1,2,3,4,5}9. 假定有定义“int b[10]; int *pb;”,则不正确的赋值语句为()。
A. pb=b;B. pb=&b[0];C. pb=new int;D. pb=b[5];10. 程序中主函数的名字为()。
A. mainB. MAINC. MainD. 任意标识符11. 为了提⾼程序的运⾏速度,可将不太复杂的功能⽤函数实现,此函数应选择()。
A. 内联函数B.重载函数C.递归函数D.函数模板12. 将两个字符串连接起来组成⼀个字符串时,选⽤()函数。
A. strlen()B. strcap()C. strcat()D. strcmp()13. ⽤new运算符创建⼀维整型数组的正确语句是__________。
《面向对象程序设计》练习题(20120612完整版)

《面向对象程序设计》练习题《面向对象程序设计》练习题 (1)一、选择题 (2)第1部分习题 (2)第2部分习题 (3)第3部分习题 (5)第4部分习题 (6)第5部分习题 (8)附加选择题 (9)二、概念填空题 (13)三、运行程序,给出结果 (15)一、选择题第1部分习题(1)编译Java程序的命令文件名是()。
A. java.exeB. javac.exeC. javacD. appletviewer.exe(2)已知JavaDemo.class是一个独立应用程序的class文件,下面的执行语句中正确的是()。
A. java JavaDemo.classB. java JavademoC. java JavaDemoD. javac JavaDemo.class(3)设JavaAppletDemo.java是一个Applet程序,它的web文件是JavaAppletDemo.html。
现在要显示这个Applet,下列语句中正确的是()。
A. appletviewer javaAppletDemo.javaB. appletviewer JavaAppletDemo.classC. appletviewer JavaAppletDemo.htmD. appletviewer JavaAppletDemo.html(4)编译Java程序filename.java后生成的程序是()。
A. filename.htmlB. filename.javC. filename.classD. filename.jar(5)Java编译器将源代码翻译成独立于平台的格式是()。
A. opcodesB. bytecodesC. virtual machinesD. applet(6)可以用来创建Java程序的工具集是()。
A. JREB. JNIC. JVMD. JDK(7)下面声明Java独立应用程序main()方法中,正确的是()。
面向对象程序设计习题

1.面向对象程序设计中的数据隐藏指的是参考答案为: DA.输入数据必须输入保密口令B.数据经过加密处理 C. 对象内部数据结构上建有防火墙D.对象内部数据结构的不可访问性解析输入数据必须输入保密口令和数据经过加密处理都不是面向对象程序设计的特征;对象内部数据结构上也不可能建有防火墙,所以它们都不是面向对象程序设计中所指的数据隐藏;面向对象程序设计系统中的封装单位是对象,对象之间只能通过接口进行信息交流,外部不能对对象中的数据随意地进行访问,这就造成了对象内部数据结构的不可访问性,也使得数据被隐藏在对象中;这就是面向对象程序设计中的数据隐藏所指;2.下列各项中符合函数重载必须满足的条件的是参考答案为:DA.必须有不同的参数个数B.对应的参数类型必须不相同 C. A和B必须同时满足D.A和B只要满足一个即可解析我们知道,在同一个作用域中,要实现函数重载必须满足的条件的是:① 有不同的参数个数;或者② 对应的参数有不相同的数据类型,即①和②中只要有一个满足就可以了;当然两者都满足更好,但这不是必须的;3.下列带缺省值参数的函数说明中,正确的说明是参考答案为:AA.int Funint x,int y=2,int z=3; B.int Funint x=1,int y,int z=3;C. int Funint x,int y=2,int z; D.int Funint x=1,int y,int z=3;解析在带缺省值参数的函数说明中,正确的说明应该是无缺省值的参数依次排列在参数表的左边,排完无缺省值的参数后,再依次排列带缺省值的参数;从所给出的四个选项来看,只有“int Funint x,inty=2,int z=3”符合这条规定,其它的都不符合;4.有如下的对类“CSample”的说明,其中是错误的;class CSample { 参考答案为:AA.int a=23;B.CSample;public:C.CSampleint val;D.~ CSample;}解析在上面对类“CSample”说明中,“CSample”和“CSampleint val”是该类重载的构造函数、“~ CSample”是该类的析构函数,这三个语句都是正确的;错误的语句是“int a=23”,因为它违反了在类的声明不管是引用性声明,还是定义性声明中都不能以赋值表达式的形式给它的数据成员进行初始化; 5.已知类A中的一个成员函数的说明如下:void SetA &a;则该函数的参数“A &a”的含义是参考答案为:CA.指向A的指针为aB.将变量a的地址赋给类AC.类A对象引用a用作函数的形参D.变量A与a按位与后作函数参数解析因为A是一个类,所以“A &a”表示a是类A的对象,但因为对象a的前缀了符号“&”,则“&a”表示是类A的对象引用;所以“A &a”的含义是类A对象引用a用作函数的形参;6.若类A和类B的定义如下:class A {public:int i,j;void get;};class B:A {int i,j;protected:int k;public:void make;};void B::make { k=ij; }则其中是非法的表达式; 参考答案为:DA.void get;B.int k;C.void make;D.k=ij;解析对于给定的四项中,前三项都是正确的,只有第四项是错误的;因为,类B是类A的私有派生类缺省访问类型,所以A中的公类型的数据成员在类B中成为了私有数据成员,但函数“void B::make”既然是类B的成员函数,则既可访问类A中的公有数据成员,也能访问类B中的私有数据成员,则表达式“k=ij;”造成了访问的二义性,即其中的i和j,到底是取自类A呢还是取自类B呢7.下面的主程序中,语句是错误的;class A {int i;public:virtual void fun=0;Aint a { i=a; }};class B {int j;public:void fun { cout<<”B::fun\n”; }Bint b,int c :Ab { j=c; }};void main 参考答案为:AA.{ A a5;B.A pa;C.B b7;D.B pb;}解析在类A中,函数“virtual void fun=0”为纯虚函数,因此,类A为抽象类;作为抽象类,它是不能被用来定义具体对象的,而语句“A a5;”恰恰是定义抽象类的对象的,所以它是错误的8.拷贝复制构造函数的作用是参考答案为:CA.进行数据类型的转换B.用对象调用成员函数C.用对象初始化对象D.用一般类型的数据初始化对象解析进行数据类型的转换和用一般类型的数据初始化对象都是一般构造函数的功能;用对象调用成员函数不用构造函数,只要用“对象名.成员函数名”即可;所以拷贝复制构造函数的作用,只能是用对象来初始化对象;9.下列说法中,正确的说法是参考答案为:BA.所有的运算符都能被重载B.运算符被重载时,它们的优先级与结合性不会改变C.当需要时,我们可以自定义一个运算符来进行重载D.每个运算符都可以被重载成成员函数和友元函数解析当重载运算符时,不是所有的运算符都能被重载,有几个运算符是不能被重载的,如三元运算符“:”、‘.’、‘’、‘::’、‘’等;也不是每个运算符都可以被重载成成员函数和友元函数,如运算符‘=’、‘’、‘’、和‘→’都只能被重载成成员函数;无论何时,都不能自定义运算符来进行重载,也即重载只能对已有运算符进行;但是运算符被重载时,它们的优先级与结合性不会改变; 10.下面对结构或类中成员的访问中,不正确的访问是参考答案为:AA.; 其中pointer为指向类对象的指针B.pointer->salary;C.x=; 其中worker为具有类类型的对象D.Location &rA=A1;int x=rA.GetX; Location为已定义的类,A1为对象解析因pointer为指向类对象的指针,所以“pointer->salary”是正确的访问数据成员的形式;因worker为具有类类型的对象,所以“”也是正确的访问数据成员的形式;因Location为已定义的类,A1为对象,所以“Location &rA=A1;int x=rA.GetX;”表示以对象A1初始化对象引用rA,然后由对象引用rA调用成员函数GetX给变量x赋值,这样的访问成员函数的形式也是正确的;“;”中,因为运算符‘.’的优先级高于运算符‘’的优先级,所以相当于“;”,那正确的形式应该是“pointer→salary;”;故“”是不正确的访问;11.C++ 对 C 语言作了很多改进,即从面向过程变成为面向对象的主要原因是 DA.增加了一些新的运算符B. 允许函数重载,并允许设置缺省参数C. 规定函数说明符必须用原型 D. 引进了类和对象的概念12.下列符号不能组成标识符的是 A A. 连接符 B. 下划线 C. 大小写字母 D. 数字字符13.类型修饰符 unsigned 不能修饰 D A. char B. int C. long int D. float14.在 int a=3,int p=&a ;中, p 的值是 D A. 变量 a 的地址值 B. 无意义 C. 变量 p 的地址值15.下列关于指针的操作中,错误的是 D A. 两个同类型的指针可以进行比较运算 B. 可以用一个空指针赋给某个指针 C. 一个指针可以加上两个整数之差 D. 两个同类型的指针可以相加二,填空题不写解答过程,将正确的答案写在每小题的空格内;错填或不填均无分;1.面向对象程序设计中的多态性包括静态多态性和动态多态性,前者由____________机制支持,而后者则由____________机制支持;答:函数重载、虚函数解析静态多态性又称编译时多态性,调用何函数应该在编译之前就知道了,所以必须由函数重载机制来支持;动态多态性又称运行时多态性,调用何函数只有在运行时才知道,所以由虚函数与指针或引用机制来支持;2.由cha r const str=”stucture”;所以定义的指针称为____________,关键字const 所修饰的是____________;答:指向常量的指针、指针所指的字符串解析根据由‘’在修饰符“const”中位置的不同,它所修饰的对象也不同,“const ”表示所修饰的是指针所指的常量,该指针称为指向常量的指针;“ const”表示所修饰的是指针本身,该指针称为常指针;“ const ”则表示所修饰的是指针本身和指针所指常量,该指针称为指向常量的常指针;3.引入虚基类的目的是为了解决多重继承中的____________和____________问题;答:二义性、多占用空间解析在允许多重继承时可能出现两个问题,第一个是公有派生类中的成员通过不同基类调用它们上一级公共基类的同一成员,这就产生了调用的二义性;每一个基类都为它们的上一级公共基类存有备份,这就引起了公共基类的重复存储,也就多占了存储空间;引入虚基类的目的是为了解决多重继承中的这两个问题;4.构造函数与析构函数所调用的虚函数是____________的函数,因此调用时实现的是____________联编;答:所在类、静态解析在生成派生类的对象时,先调用基类的构造函数生成基类对象,再调用派生类的构造函数来生成派生类对象;所以当在构造函数中调用虚函数时,当调用基类的构造函数时,此时派生类还未生成,所以它只能调用自己的虚函数;调用派生类构造函数时,它也只能调用自己的虚函数,因为虚函数的调用是不能由派生类调用基类的;在析构派生类对象是时,先调用派生类的析构函数析构掉派生类对象,再调用基类的析构函数来析够掉基类的对象;所以当在析够构函数中调用虚函数时,派生类的析构函数调用的是它自己的虚函数原因同构造函数,基类的析构函数调用的也是它自己的虚函数,因为此时派生类对象以已被析构掉了;由上可见,当构造函数与析够函数调用虚函数时,它们调用的都是自己类的函数,因此调用时实现的是静态联编;7.说明一个const成员函数又称常量成员函数的方法是,将const写在__________之间,而且它修饰的是__________;答:函数头与函数体、this指针解析为了说明一个常量成员函数的方法是,将const写在函数头的右圆括号‘’与函数体的左花括号‘{’之间,而且它修饰的是对象所属的this指针;表示该函数不能修改它所在对象中的数据成员的值; 20.对某个运算符的重载,实际上是用关键字____________与该运算符组成一个运算符函数,而且该运算符函数的返回类型不能是____________的;答:operater、void解析对某个运算符的重载,实际上是用关键字operater 与该运算符组成一个运算符函数,而且该运算符函数的返回类型不能是无类型的,即不能是void的;三改错题1.分析下列程序中的错误,并说明出错原因;includeclass base {const int n;public:base { cout<<”Initializing default\n”; }baseint m { cout<<”Initializing\n”; n=m; }~base { cout<<”Destroying\n”; }};void main{ base x1;base y=x;}答:1 n=m; const数据成员不以该形式赋值2错误处base y=x;,以对象初始化对象解析1作为const数据成员n不能用赋值表达式的形式为其赋初值,必须在定义构造函数时在函数头中以“baseint m:nm”形式来初始化;2base y=x; 语句中‘=’不是赋值的意思,而是初始化的意思;即在定义类base的对象y时,以对象x给它初始化,相当于base yx;;但是以对象初始化对象时,必须调用拷贝构造函数才行;因程序中没给出拷贝构造函数,也不能调用系统的缺省拷贝构造函数,因用户给出了构造函数后,再也不能调用系统提供的任何缺省构造函数;所以,base y=x;是错误的;2.分析下列程序中的错误,并说明出错原因;includeclass A {int x;public:Aint a { x=a; fun; }virtual void fun=0;};class B:public A {public:Bint b :Ab {}void fun { }};void main{ A aa5;B bb8;}答:1A aa5; 抽象类不能定义对象解析1在构造函数“Aint a”调用了纯虚函数“fun”,因构造函数调用虚函数是静态联编,即调用的是它自己类的虚函数;在此调用的是纯虚函数,它只被说明,而未定义,所以不可能被执行,因此出错;2抽象类相当于是对类的引用性声明,所以它只能定义该类的指针和引用,而不能定义它的对象;在此,A 为抽象类,而“A aa5”却定义了A的对象,因此是错误的;3.分析下列程序中的错误,并说明出错原因;includeclass AA {int aa;AAint xx { aa=xx; }public:int get { return aa; }~AA { cout<<”Destroying”<<AA<< endl;};main{ AA elem5;cout<<<<endl;}答:1AAint xx 的访问属性错、应具有公有属性解析1构造函数虽是由系统自动调用来生成对象的,但一般都是在类外调用,所以它的访问属性必须是公有的;程序中构造函数的访问属性是私有的缺省值,运行中必定出错;四.完成程序题本大题共5小题,每小题4分,共20分根据题目要求,完成程序填空;1.仔细阅读下列求两个点之间距离的程序,根据程序的输出结果在划线处填入正确语句;class point {float x,y;public:pointfloat a,float b { x=a; y=b; }float distancepoint &p {float dx=_____①______;float dy=_____②______;return floatsqrtdxdx+dydy;}};void main{ point p12,3,p232,43;cout<<③___<<endl;}答:①②③distancep2解析由于求两点之间距离的函数“distance”为成员函数,所以由该函数的this指针所指对象可用作起点参数之一,另一个用作终点的参数,必须在函数的参数表中显式地给出;dx 和dy分别计算两个结点间x和y坐标间的距离,因此应该为:dx= – x 和 dy = – y;对它们求平方相加后开方即可,得到两点间的距离:floatsrrtdada+dydy;在主程序中求p1和p2两个结点之间的距离,由于由p1调用距离函数,所以由p2作为它的参数,即distancep2;2.两个复数只有当它们的实部和虚部分别相等时,才被认为它们相等;在空格处填入合适的内容,以完成下面的程序,使其重载运算符“==”,用以比较两个复数的相等;请在主函数中输出比较的结果;includeclass complex {double real,imag;public:complexdouble r,double i { real=r; imag=i; }bool operator==complex &;};int complex:: operator==complex &com{ return_____①_____ }void main{ complex c1,,c2,;if______②______return cout<<”true\n”;elsereturn cout<<”false\n”;}答:① real==&&imag==② c1==c2或==c2解析若两个复数的相等,则必有它们的实数部分和虚数部分都相等,所以运算符重载函数中返回“real==&&imag==”,只有real==与imag==都为真时,该函数的返回值才为真;在主程序中,为了比较两个复数c1和c2,可以隐式地写成“c1==c2”,也可显式写成“==c2”;3.下列程序中声明了两个类AA和BB,其中函数“print”是类AA的成员函数,但是类BB的友元函数;请在①、②和③处各填入正确的内容,使程序能正常运行;include_____①______;class AA {int t;public:AAint x { t=x; }void printBB &b;};class BB {int s;public:BBint y { s=y; }friend v oid ___②___printBB &;};void ____③_____{ cout<<”AA:”<<T<<”;BB:”<<<<endl;}void main{ AA m6;BB n8;n;}答:① class BB;② AA::③ AA::printBB &w解析由于AA类的成员函数“print”是类BB的友元函数,因此它必须有一个BB类的引用作为参数,以便有引用BB类数据成员的接口;但此时BB类还未定义,为解决此矛盾,在①处先对BB类作引用性声明“class BB;”,告诉系统BB类在后面定义;因为函数“print”是类AA的成员函数,在类外定义必须加上类名和作用域分辨符,即在②处加上“AA::”;在BB类外定义“print”时,因是友元,所以没有加上“BB::”的必要,但“AA::”还是必须加的,所以在③处填“AA::printBB &w”;五.程序分析题1.请分析以下的程序,给出该程序的正确执行结果;include<iostream>using namespace std;int addint x,int y Array {return x+y; }void main{int m=2,n=3;cout<<"1:"<<addm++,m+n<<endl;m=2,n=3;cout<<"2:"<<add++m,m+n<<endl;m=2,n=3;cout<<"3:"<<addm+n,m++<<endl;m=2,n=3;cout<<"4:"<<addm+n,++m<<endl;}答:1:72:83:84:9解析在说明答案之前,要说明两个问题:1C++语言中,函数参数是压在栈里的,因压栈是从前往后进行的,所以出栈就是从后向前进行的,也即先取最后的参数,然后再向前逐个取用;2对于单加运算,m++是先执行后加1,++m是加1后再执行;由此,因m=2,n=3;,所以:1:m+++m+n=2+2+3=7 m++后执行,且后加1,所以m=2一直未变2:++m+m+n=3+2+3=8 ++m后执行,但先加1,执行++m时,m=3了3:m+n+m++=3+3+2=8 先执行m++,后加1,执行m+n时,m=3了4:m+n+++m=3+3+3=9; 先执行++m,且先加1,故一开始就有m=33.请分析下面的程序并给出该程序的执行结果;includeclass AA {int a;public:AA { cout<<”In itualizing AA\n”; }~AA { cout<<”Destroying AA\n”;};class BB {int b;AA p;public:BB { cout<<”Initualizing BB\n”; }~BB { cout<<”Destroying BB\n”;};void main{ BB X;cout<<”Ending main\n”;}答:Initualizing AAInitualizing BBEnding mainDestroying BBDestroying AA解析虽然在主程序中只定义了一个类BB的对象,但在类BB中声明了类AA的对象作为它的数据成员;当一个类中含有对象作为数据成员时,在生成对象时,先调用成员对象的构造函数,再调用类自己的构造函数,所以输出了“Initualizing AA”成员对象构造函数的输出和“Initualizing BB”类自己构造函数的输出;对象生成后,执行下一句输出语句,则输出“Ending main”;此时程序结束,调用析构函数来析构掉对象,先调用类自身的析构函数,其输出为“Destroying BB”,再调用成员对象的析构函数,其输出为“Destroying AA”;4.写出下列程序的运行结果;includeclass AA {public:static int n;AA { n++; }};int AA::n=0;main{ cout<<”AA::n=”<<AA::n<<endl;AA d1;cout<<<<<endl;AA d2;cout<<<<<endl;AA d3,d4;cout<<<<<endl;cout<<<<<endl;}答:AA::n=0=1=2=4=4解析由于数据成员n的访问属性是公有的,所以在类外可访问它;又它是静态变量,所以具有全局性;在构造函数中,执行的是n++操作,即每次调用构造函数n就加1;当程序开始时,因未定义对象,所以n的值为初始化时的值,则输出为“AA::n=0”;当定义了对象d1后,由于调用了构造函数,则该对象中n=1,故输出“=1”;同理,对象d2输出“=2”;由于接下来生成了两个对象d3和d4,调用两次构造函数,n两次加1,此时n=4,所以下面两条语句的输出为“=4”和“=4”;5.写出下列程序的输出结果;includeclass AA {public:AA{} { cout<<”Constructor of AA. \n”; fun; }virtual void fun { cout<<”AA::fun calle d.\n”; }};class BB:public AA {public:BB{ cout<<”Constructor of BB.\n”; fun; }void fun { cout<<”BB::fun calle d.\n”; }};void main{ BB d; }答:Constructor of AA.AA::fun called.Constructor of BB.BB::fun called.解析虽然函数fun说明为虚函数,但当在构造函数中被调用时,呈现的是静态联编,即基类和派生类都调用各自的函数fun;所以,当生成对象d时,先调用基类的构造函数,在构造函数中又调用自己的函数“fun”,所以输出为“Constructor of AA.”和“AA::fun called.”;同理调用派生类的构造函数时,生成的输出为“Constructor of BB.”和“BB::fun called.”;6.请给出下面的程序的输出结果;includetemplate class Tvoid sortT a,int n{ T num;forint i=0;i<n-1;i++{ forint j=i;j<n-1;j++ifaj>aj+1{ num=aj; aj=aj+1; aj+1=num; }}fori=0;i<n;i++cout<<ai<<endl;}void main{ int iver5={ 12,45,9,23,37 };double dver5= { ,,,, };sortiver,5;sortdver,.5;}答:9 12 23 37 45解析这是使用模板的例子;函数sort是一个递增的排序函数,T是个模板;当数组是整型数据类型时,它为整型数组排序;当数组为双精度数据类型时,它为双精度数组排序;所以输出如上结果;7.分析以下程序的执行结果 include<>void main{int a;int &b=a; fp;fp=&Sample::gety;int t=s.fp;cout<<"v="<<v<<",t="<<t<<endl;}解:本题说明了类成员函数指针的使用方法;在main中定义的fp是一个指向Sample类成员函数的指针;执行fp=Sample::getx后;fp指向成员函数getx,int v=s.fp语句等价于int ,v=x=2;执行fp=Sample::gety之后,fp指向成员函数gety,int t=s.fp语句等价于int t=,t=x=7;所以输出为:v=2,t=711.分析以下程序的执行结果include<>class Sample{int x;int y;public:Sampleint a,int b{x=a;y=b;}int getx{return x;}int gety{return y;}};void main{int Sample::fp;fp=&Sample::getx;Sample s2,7,p=&s;int v=p->fp;fp=&Sample::gety;int t=p->fp;cout<<"v="<<v<<",t="<<t<<endl;}解:本题说明了类成员函数指针的使用方法;这里通过指向对象的指针来调用指向类成员函数的指针,其原理与上题相似;输出仍为:v=2,t=712.分析以下程序的执行结果include<>class base{public:base{cout<<"constructing base class"<<endl;}~base{cout<<"destructing base class"<<endl; }};class subs:public base{public:subs{cout<<"constructing sub class"<<endl;}~subs{cout<<"destructing sub class"<<endl;}};void main{subs s;}解:本题说明单继承情况下构造函数和析构函数的调用顺序;这里base为基类,subs为派生类;所以输出为:constructing base classconstructing sub classdestructing sub classdestrcuting base class注意:在单继承情况下,首先调用基类的构造函数 ,随后调用派生类的构造函数,析构函数的调用顺序则正好相反;13.分析以下程序的执行结果:include<>class base{int n;public:baseint a{cout<<"constructing base class"<<endl;n=a;cout<<"n="<<n<<endl;}~base{cout<<"destructing base class"<<endl;}};class subs:public base{base bobj;int m;public:subsint a,int b,int c:basea,bobjc{cout<<"constructing sub cass"<<endl;m=b;cout<<"m="<<m<<endl;}~subs{cout<<"destructing sub class"<<endl;}};void main{subs s1,2,3;}解:本题说明派生类中含有对象成员情况下构造函数和析构函数的调用顺序;这里base为基类,subs 为派生类,subs类的构造函数中含有对象成员;所以输出为:constrcuting base classn=1constructing base classn=3constructing sub classm=2destructing sub classdestructing base classdestructing base class注意:当派生类中含有对象成员时,构造函数的调用顺序如下:基类的构造函数2对象成员的构造函数3派生类的构造函数析构函数的调用顺序与之相反14.分析以下程序的执行结果include<>class A{public:int n;};class B:public A{};class C:public A{};class D:public B,public C{int getn{return B::n;}};void main{D d;::n=10;::n=20;cout<<::n<<","<<::n<<endl;}解: D类是从类和类派生的而类和类又都是从类派生的,但各有自己的副本;所以对于对象d,::n与::n 是两个不同的数据成员它们互无联系;所以输出为:10,2015.分析以下程序的执行结果include<>class A{public:int n;};class B:virtual public A{};class C:virtual public A{};class D:public B,public C{int getn{return B::n;}};void main{D d;::n=10;::n=20;cout<<::n<<","<<::n<<endl;}解:D类是从类和类派生的而类和类又都是从类派生,但这是虚继承关系即是虚基类因此和共用一个的副本所以对于对象d,::n与::n是一个成员;所以输出为:20,2016.分析以下程序执行结果include<>int addint x,int y{return x+y;}double adddouble x,double y{return x+y;}void main{int a=4,b=6;double c=,d=;cout<<adda,b<<","<<addc,d<<endl;解:本题说明函数重载的使用方法, 这里有两个add函数,一个add函数的参数与返回值为int型,另一个的参数与返回值为double型,它们是根据参数类型自动区分的;所以输出为: 10,1017.分析以下程序的执行结果include<>class Sample{int i;double d;public:void setdataint n{i=n;}void setdatadouble x{d=x;}void disp{cout<<"i="<<i<<",d="<<d<<endl;}};void main{Sample s;10;;;}解:本题说明重载成员函数的使用方法;setdata成员函数有两个,根据其参数类型加以区分;所以输出为:i=10, d=22.分析以下程序的执行结果include<>class Sample{int n;public:Sample{}Sampleint i{n=i;}Sample &operator =Sample;void disp{cout<<"n="<<n<<endl;}};Sample &Sample::operator=Sample s{Sample::n=;return this;}void mainSample s110,s2;s2=s1;;}解:本题说明重载运算符=的使用方法;operator=成员函数实现两个对象的赋值;所以输出为: n=10六.程序设计题1.设计一个三角形类Triangle,包含三角形三条边长的私有数据成员,另有一个重载运算符“+”,以实现求两个三角形对象的面积之和;解:在Triangle类中设计一个友元函数operator+Triangle t1,Triangle t2,它重载运算符"+",返回t1和t2两个三角形的面积之和;本题程序如下:include<>include<>class Triangle{int x,y,z;double area;public:Triangleint i,int j,int k{double s;x=i;y=j;z=k;s=x+y+z/;area=sqrtss-xs-ys-z;}void disparea{cout<<"Area="<<area<<endl;}friend double operator+Triangle t1,Triangle t2{return +;}};void main{Triangle t13,4,5,t24,5,6;double s;cout<<"t1:"; ;cout<<"t2:"; ;s=t1+t2;cout<<"总面积="<<s<<endl;本程序执行结果如下:t1:Area=6t2:Area=总面积=2.重载运算符“+”友元函数只能返回两个三角形的面积之和,不能计算三个三角形的面积之和,改进一下,使之能计算任意多个三角形的面积之和;解:重载运算符为什么不能计算3个三角形的面积之和呢对于式子:s=t1+t2+t3,先计算t1+t2,返回一个double数然后再进行该double数+t3的计算,显然没有这样的重载运算符“+”友元函数,只需要添加这样重载运算符“+”友元函数即可;本题程序如下:include<>include<>class Triangle{int x,y,z;double area;public:Triangleint i,int j,int k{double s;x=i;y=j;z=k;s=x+y+z/;area=sqrtss-xs-ys-z;}void disparea {cout<<"Area="<<area<<endl;}friend double operator+Triangle t1,Triangle t2{return +;}friend double operator+double d,Triangle t{return d+;}};void main{Triangle t13,4,5,t24,5,6,t35,6,7,t46,7,8;double s;cout<<"t1:"; ;cout<<"t2:"; ;cout<<"t3:"; ;cout<<"t4:"; ;s=t1+t2+t3+t4;cout<<"总面积="<<s<<endl; }本程序的执行结果如下:t1:Area=6t2:Area=t3:Area=t4:Area=总面积=3.设计一个学生类student,包括姓名和三门课程成绩,利用重载运算符”+“将所有学生的成绩相加放在一个对象中,再对该对象求各门课程的平均分; 解:include<>include<>include<>class student{char name10;int deg1,deg2,deg3;public:student{}studentchar na,int d1,int d2,int d3{strcpyname,na;deg1=d1;deg2=d2;deg3=d3;}friend student operator+student s1,student s2{static student st;=+;=+;=+;return st;}void disp{cout<<setw10<<name<<setw5<<deg1<<setw5<<deg2<<setw5<<deg3<<endl;}friend void avgstudent &s,int n{cout<<setw10<<"平均分"<<setw5<<n<<setw5<<n<<setw5<<n<<endl;}};void main{student s1"Li",77,82,85,s2"Zheng",75,62,89;student s3"Ma",89,87,95,s4"Xu",55,79,65,s;out<<"输出结果"<<endl;;;s=s1+s2;avgs,2;;;s=s3+s4;avgs,2;}运行结果:输出结果li 77 82 85zheng 75 62 89平均分 76 72 87Ma 89 87 95Xu 55 79 65平均分 72 83 804.计算e的值;e是自然对数的底,它和π一样是数学中最常用的无理数常量;其近似值的计算公式为:e=1+1/1+1/2+1/3+...+1/n-1+r当n充分大时,这个公式可以计算任意精度e的近似值;为了保证误差r<ε,只需1/n-1 > r <ε程序代码如下:// programinclude<>void main{const double eps=;int n=1;float e=,r=;do // 开始do循环;循环条件由后面的while中的表达式值确定;{e+=r;n++;r/=n;}whiler>eps;cout<<"The approximate Value of natural logarithm base is: ";cout<<e<<endl;}5.16.设计一个立方体类Box,它能计算并输出立方体的体积和表面积;解: Box类包含三个私有数据成员a立方体边长、volume体积和area表面积,另有两个构造函数以及seta设置立方体边长、getvolume计算体积、getarea计算表面积和disp输出结果;。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
《面向对象程序设计》课程界面设计练习题目Windows NT系统内建了若干个的常用控件,极大地方便了Windows下可视化程序的开发。
对于初学者来说,能够熟练地使用这些控件,是学好C++面向对象编程的关键步骤。
为了指引初学者或者检验学习效果,下面设计了五个练习题目,囊括了大部分的常用控件,以及程序界面开发中常常使用的技术。
练习题目如下:一、播放器配置程序二、消息提示器三、流媒体管理器四、可定制背景的视图五、通讯簿一、播放器配置程序内容:制作一个基于对话框的播放器配置程序,能够从配置文件(*.ini )中读取设置信息;能够将修改后的设置信息保存在配置文件中。
界面如图1所示:图1 播放器设置界面目的:掌握使用VS 建立基于对话框的应用程序;熟悉标签(Static Text )、分组(Group Box )、按钮(Button )、编辑框(Edit Control )、组合框(Combo Box )、单选按钮(Radio Button )、复选框(Check Box )、热键设置控件(Hot Key )等常用控件的属性、事件;掌握配置文件(*.ini )的读写;学习MSDN 文档的查阅等。
要求:1、 控件1(组合框):不可输入文字,只能从下拉列表中选取一项,列表中的内容为:简体中文、繁軆中文、English ;2、 控件2(复选框):默认勾选。
3、 控件3(热键设置控件):当控件2勾选时,控件才3可编辑;当控件2未12 345678912 1314 15 161011勾选时,控件3灰掉(不可编辑);4、控件4~7(复选框):默认勾选控件4和控件5;5、控件8(编辑框):只能输入数字,范围1~60;6、控件9~11(一组单选按钮):默认选中控件9;7、控件12(按钮):当点击按钮时,在13中输出如图1所示的文字;8、控件13(编辑框):能够输入换行符,具有垂直滚动条,当文本框内容不能全部显示时,滚动条自动有效;9、控件14~16(按钮):按钮15初始不可用,当更改设置信息后才激活;接收回车提交命令;点击该按钮,将新的设置信息(控件12和13不触发配置信息改变)写回与程序同目录下,名称为config.ini配置文件中;点击按钮14时,如果设置信息有更改,将设置信息写入配置文件,并关闭对话框;若设置信息未发生改变,直接关闭对话框;点击16直接关闭对话框;10、配置文件读写要求:程序启动时若没有找到配置文件,能够按照默认设置初始化界面(按钮15激活),点击按钮14和15生成配置文件并写入设置信息,点击16则不生成配置文件;若找到配置文件,从文件中加载配置信息并初始化程序界面;11、对话框样式:对话框可以最小化,不能最大化,不可以改变大小;界面布局要工整;对话框初始时控件1取得焦点,按tab键焦点将按图中标注的序号逐一移动到下个控件上。
提示:1、复选框勾选状态的获取:可以将复选框与一个BOOL变量关联,通过BOOL变量得知其勾选与否;也可以获取其控件状态(state)来得到是否被勾选;可以响应复选框的单击事件来处理复选框状态改变时的任务;2、单选按钮组的概念:点选按钮有组的概念,同一组内的单选按钮相互排斥,只能有一个被点选;一个单选按钮A若具有GROUP=true属性,则紧跟其后的GROUP=false属性的单选按钮同A为一组,可以为A关联一个int型变量,改变量反应了该组内那个按钮被点选;3、配置文件的读写:配置文件(*.ini)为文本文件,常用于保存配置信息;系统具有GetPrivateProfileString、WritePrivateProfileString等函数用于操作配置文件,具体可参见MSDN中相关介绍;4、使用Tab键移动焦点:需要控件具有Tabstop属性;焦点移动的顺序与界面控件的排放顺序有关,可以在界面编辑界面按Ctrl+D显示控件的序号,在序号上点击可以修改控件的顺序。
二、消息提示器内容:制作一个基于对话框的消息提示器,能够添加、删除消息,轮流展现消息。
主界面如图2所示;点击“消息管理”,弹出消息管理界面,如图3所示;在消息管理界面点击“+”,弹出新建消息对话框,如图4所示。
图2 消息提示器 目的:进一步了解对话框的设置,如模态和非模态、置顶等;学会界面布局管理;掌握界面逻辑控制;掌握列表(List Box )控件的使用;掌握定时器的使用。
要求:1、控件1-1(复选框):设置属性为按钮样式;点击一次,按钮凹下,文字变为“取消置顶”,对话框置顶(主界面失去焦点,获得焦点的其他程序界面仍不能遮盖住主界面),再次点击按钮,按钮弹出,文字恢复为“置顶”,主界面取消置顶;2、控件1-2、1-3(按钮):点击按钮1-2弹出消息管理界面(模态),主界面不可操作;点击按钮1-3,按钮1-2灰掉(不可操作),按钮1-3文字变为“停止提示”,1-5中开始显示消息;再次点击按钮1-3,按钮1-2激活,按钮1-3文字恢复为“开始提示”;点击1-4,若正在提示消息,停止提示,然后退出程序;3、控件1-5(编辑框):用于显示提示的消息,能够显示多行文字,具有水平、垂直滚动条,只读,无边框;未进行消息提示时,内容为空;4、控件2-1、2-2(列表):项为消息名称;列表2-1显示不进行提示的消息;列1-11-51-2 1-31-4表2-2显示要进行提示的消息;图3 消息管理对话框图4 新建消息对话框5、 控件2-3(按钮):点击弹出新建消息对话框;6、 新建消息:输入名称和消息内容,点击按钮3-3,检查消息名称是否不为空,3-13-23-3 3-42-1 2-22-3 2-4 2-9 2-102-112-122-13 2-52-62-72-8若为空给出修改提示,不为空则创建新的消息,消息列表增加一项;点击“取消”不创建新的消息;7、控件2-4(按钮):点击按钮,若消息列表未选中一项给出提示;已选中一项,将选中项删除;8、控件2-5(按钮):点击按钮,若消息列表未选中一项给出提示;已选中一项,将其移动到提示列表;9、控件2-6(按钮):点击按钮,若提示列表未选中一项给出提示;已选中一项,将其移动到消息列表;10、控件2-7(按钮):点击按钮,将消息列表中的项全部移到提示列表;11、控件2-8(按钮):点击按钮,将提示列表中所有项移到消息列表;12、控件2-9(按钮):点击按钮,若提示列表未选中一项给出提示;已选中一项,将选中项上移一次(已位于最顶端的项不再移动);13、控件2-10(按钮):点击按钮,若提示列表未选中一项给出提示;已选中一项,将选中项下移一次(已位于最底端项不再移动);14、控件2-11(编辑框):用于设定轮流提示消息的时间隔,仅可输入数字,数值范围500~30000;15、界面逻辑:当提示列表中没有要提示的消息时,1-3灰掉;当提示列表中存在消息时,1-3激活;点击1-3,启动消息提示,按设定的时间间隔,依照提示列表中消息的顺序逐一在1-5中显示提示列表中的消息;16、对话框样式:标题栏上动态显示当前时间;主界面可用鼠标动态调整大小;当主界面大小改变时,其中按钮相对窗口边缘的位置不变,只有1-5大小发生变化。
提示:1、定时器的使用:启动定时器采用Cwnd::SetTimer函数,程序退出前应该调用CWnd::KillTimer停止之前启动的定时器;函数的具体使用方法参考MSDN 文档;2、对话框的置顶,界面控件位置、大小修改:可通过Cwnd::SetWindowsPos函数实现;函数的具体使用方法参考MSDN文档;三、流媒体管理器内容:制作一个基于单文档框架的流媒体管理器(视图类的基类为CFormView ),能够添加、删除流媒体,查看流媒体属性等,主界面如图5所示,菜单结构如图6所示,添加流媒体对话框如图7所示:图5 流媒体管理器图6 菜单结构图7 添加流媒体界面目的: 熟悉单文档程序框架;学会菜单、工具栏的编辑以及消息响应;掌握表格控件(List Control )、IP 地址控件(IP Address )、选项卡控件(Tab Control )的使1-1 菜单结构如图61-21-32-12-22-32-42-52-6用;了解右击快捷菜单的使用等。
要求:1、程序框架:单文档程序框架,视图类的基类为CFormView;主框架可以用鼠标调节大小;具备菜单栏1-1、工具栏1-2,不要状态栏;将默认主界面标题栏中的“–无标题”去掉;按照图5图6修改默认菜单和工具栏,菜单“视图”和“帮助”项不变,工具栏按钮依次为“添加流媒体”、“删除流媒体”、“属性”;2、控件1-3(表格):具有如图5示的报表样式及表头;填充整个View区域,改变程序窗口大小,1-3也调节大小;右击1-3中一项数据弹出如图5所示的快捷菜单,内容同主菜单“流媒体”项;3、菜单“流媒体”-“添加流媒体”:点击弹出添加流媒体对话框;4、控件2-1(编辑框):限最大字符数16;5、控件2-2(组合框):默认列表数据为“RTSP”、“MMS”、“HTTP”;用户也可以输入文字;6、控件2-3(IP地址控件);7、控件2-4(编辑框):可输入多行文字;限制最大字符数128;8、控件2-5、2-6(按钮):输入完设置信息,点击按钮2-5添加一个流媒体,同时1-3对应添加一项;若设置信息除备注外有空,将不添加流媒体,给出提示;点击按钮2-6放弃添加新的流媒体;9、界面逻辑:若没有1-3中未选中一项,菜单“流媒体”中“删除流媒体”、“属性”不可用,工具栏对应按钮不可用;10、界面逻辑:若1-3中选中一项,点击菜单“流媒体”-“删除流媒体”,弹出删除确认对话框,确认后删除选中的流媒体,点击工具栏“删除流媒体”按钮具有同样响应;11、界面逻辑:若1-3中选中一项,点击菜单“流媒体”-“属性”或工具栏按钮“属性”,弹出下图8所示的“流媒体属性”对话框;对话框具有两个页面,“常规”页面显示选中流媒体的信息(均不可编辑),“网络”页面显示网络状态(为简单起见,固定为图示内容)。
点击“确定”关闭属性对话框。
图8 流媒体属性-常规页面图9 流媒体属性-网络页面提示:1、去掉标题栏的“–无标题”:可以在函数CMainFrame::PreCreateWindow中去掉框架样式FWS_ADDTOTITLE;2、IP 地址控件内容的获取:可通过关联字符串的方式获取输入的IP地址;可通过关联DWORD整数的方式获取输入的IP地址;3、选项卡的使用:图8和图9共使用了三个对话框;通过在TabControl控件的区域内创建嵌入式的子对话框实现图示效果,子对话框具有Border=None、Style=Child的样式,然后通过CDialog::Creat函数创建,再调用ShowWindow 显示出来;在TabControl的切换事件中,根据选中的要显示页面索引,将对应的子对话框显示出来,将其它对话框隐藏起来;4、选项卡的替代者:属性页(CPropertySheet、CPropertyPage)也能实现选项卡的效果,可以在网络上查找使用方法;四、可定制背景的视图内容:制作单文档程序,如图10所示的效果,能够根据设置的“画面属性”在视图中绘制背景:1-1图10 主界面及菜单结构2-12-2 2-32-42-5 2-62-7 2-8图11 画面属性设置界面目的:掌握滑块控件(Slider Control)、提示条(ToolTip Control)的使用;了解自定义控件的方法;掌握文件浏览对话框(CFileDialog)、颜色选择对话框(CColorDialog)等常用对话框的使用;了解使用GDI绘制简单图形图像的方法等。