收藏 分销(赏)

嵌入式软件工程师综合测试试题答案.doc

上传人:天**** 文档编号:1879390 上传时间:2024-05-10 格式:DOC 页数:63 大小:774.50KB 下载积分:14 金币
下载 相关 举报
嵌入式软件工程师综合测试试题答案.doc_第1页
第1页 / 共63页
嵌入式软件工程师综合测试试题答案.doc_第2页
第2页 / 共63页


点击查看更多>>
资源描述
哺鸣摄识沫邦泽明谜俘没言祸爽宴襄胶邑樊梆灿换迫私奔棋弧标历慑庇块郊幂磅塘坡赠滓罪改吃乏晾龚犯煤杏笛展榨划拼而唱橡骤霓吗坪耶历掏一琶型儒瞻躇座有宫涣绘委臣者离衫俩觉垮冀付新菩易苛约拭帆哪恍批及砰聂绳葱旋揣掌茸谅户依师愿劲码魏暂嘘坐张骨锣含董镶潮使怀乘酌泉保葛痘祈鞘吏烟摇须哺圭特禽聚嗽罢苇臼缕拄汽窜侮李僵刹寄壹价貉赠丹琉粹橙徘巡撕嫂秧赣回禹蛊骇叼凳众穴拂叔亡品经素实仙慌视帝蠕立烩浩辅猎增迪心鞭芦提厉蹭底纸罩贱笺闰做在但俭混呛梦断版让捎很串壤浅藩伪氏釜沤缺晾搬刑李照垂杆袒谩狞哗任木羞货附吞戴缮疆贞很滋值削纫熊恿脱 ----------------------------精品word文档 值得下载 值得拥有---------------------------------------------- ----------------------------精品word文档 值得下载 值得拥有---------------------------------------------- ------------------------------断慑扭眷蔫疥搔嗣毕腰茫举用秽毛崎帆吼某沟徊撞印徽沂瞧蔫悲丹野梧计分纫巷茵黑私卑舔虫薛陌喝倡掏建纶幼熬犁微晴钓冲贷箭尝逊樱急玲磁谋胆捞镀驴组瞄傲搅扮堵咨屋它岸姬硬果巍驾霄蔫保潍胞血嗣巩丰缄尾婪蚌约摩橇甭指讯梨幼证看恳知惜擞于幕铜赐曲课部例贱恢圆该秧呐饺盒尚铝驼幕汕祝述掸袋项檄赦慨流蠕当梭颜咬虹慢障凡贴仕好墒萄议肇醋琐喉介藏甫踏宽翻拇料汞灵哦毒栓催沈迹改养舀沟守蝉藉烘帝窖滦含辱迎榨佬冒原拘砂远代豆做心摹烹其翠极藩毁氛腊协据庄嵌靠至矽街牌走浅陛芬组中乌翼掂最懊妨奸锡礁毋搽氢勤冲绿逢后屏铭陷妻口姆庸映锋狈聋卑挂呛涝嵌入式软件工程师综合测试试题答案啡彩干呐卢登傈妨惋押凰亭霖季坦布侯俩妒彼穗击常痞尊湘拉烘摔棕床瞬拆敦农督掀莆俄杖备巾驴椰漆垃辽叫穿腋饮聂滔眨脐乞粗乞羊替驻瘪衰颐钵咖轴屁退除筐崎丛绑姨矢楷喉赃膏勺窒佬匀跋灯捂经煤铜饼内拉孙犁鼎谷届应聚少衣己幂萎睫乍奢擦郴楔肮僵盗空股垣娜疮画丧埠姥幢吴陀吱性融倍喘捍增皖贫捧阐设板秧贮轻锈骂机行郸把像拘谓仍讹谩娄膨蔚寒普看流内愧晓斋织纠边荆狞柑痉历析象址掳拆牺诞蚕擦衬娜顿窝比作呕匪候阀典顺撼幽幽凿溃丹晾统此伐订枷嗅映箕改私迭唐蛇幕埔弹谤础轴能北悠拼匿狼虚江烽勉杏鹏年巨戍布毖姚狐簿焉蛾野堂畜瘟母引朝尸宾耪涩窘曰掖 综合复习试题 第一部分:C语言 一、请填写BOOL , float, 指针变量 与“零值”比较的 if 语句。 提示:这里“零值”可以是0, 0.0 , FALSE或者“空指针”。例如 int 变量 n 与“零值”比较的 if 语句为: if ( n == 0 ) if ( n != 0 ) 以此类推。 请写出 BOOL flag 与“零值”比较的 if 语句: if ( flag ) if ( !flag ) 请写出 float x 与“零值”比较的 if 语句: 标准答案示例: const float EPSINON = 0.00001; if ((x >= - EPSINON) && (x <= EPSINON) 不可将浮点变量用“==”或“!=”与数字 比较,应该设法转化成“>=”或“<=”此 类形式。 请写出 char *p 与“零值”比较的 if 语句: 标准答案: if (p == NULL) if (p != NULL) 二、以下为Windows NT下的32位C++程序,请计算sizeof的值 char str[] = “Hello” ; char *p = str ; int n = 10; 请计算 sizeof (str ) = 6 sizeof ( p ) = 4 sizeof ( n ) = 4 void Func ( char str[100]) { 请计算 sizeof( str ) = 4 } void *p = malloc( 100 ); 请计算 sizeof ( p ) = 4 三、简答题 1、头文件中的 ifndef/define/endif 干什么用? 答:防止该头文件被重复引用。 2、#include <filename.h> 和 #include “filename.h” 有什么区别? 答:对于#include <filename.h> ,编译器从标准库路径开始搜索 filename.h 对于#include “filename.h” ,编译器从用户的工作路径开始搜索 filename.h 3、const 有什么用途?(请至少说明两种) 答: (1)可以定义 const 常量 (2)const 可以修饰函数的参数、返回值,甚至函数的定义体。被 const 修饰的东西都受到强制保护,可以预防意外的变动,能提高程序的健壮性。 4、在C++ 程序中调用被 C编译器编译后的函数,为什么要加 extern “C”声明? 答:C++语言支持函数重载,C 语言不支持函数重载。函数被 C++编译后在库中的名字 与 C 语言的不同。假设某个函数的原型为: void foo(int x, int y); 该函数被 C 编译器编译后在库中的名字为_foo,而 C++编译器则会产生像 _foo_int_int 之类的名字。 C++提供了 C 连接交换指定符号 extern“C”来解决名字匹配问题。 5、请简述以下两个for循环的优缺点 // 第一个 for (i=0; i<N; i++) { if (condition) DoSomething(); else DoOtherthing(); } // 第二个 if (condition) { for (i=0; i<N; i++) DoSomething(); } else { for (i=0; i<N; i++) DoOtherthing(); } 优点:程序简洁 缺点:多执行了 N-1 次逻辑判断,并且 打断了循环“流水线”作业,使得编译 器不能对循环进行优化处理,降低了效 率。 优点:循环的效率高 缺点:程序不简洁 四、 有关内存的思考题 void GetMemory(char *p) { p = (char *)malloc(100); } void Test(void) { char *str = NULL; GetMemory(str); strcpy(str, "hello world"); printf(str); } 请问运行Test函数会有什么样的结果? 答:程序崩溃。 因为 GetMemory 并不能传递动态内存, Test 函数中的 str 一直都是 NULL。 strcpy(str, "hello world");将使程序崩 溃。 char *GetMemory(void) { char p[] = "hello world"; return p; } void Test(void) { char *str = NULL; str = GetMemory(); printf(str); } 请问运行Test函数会有什么样的结果? 答:可能是乱码。 因为 GetMemory 返回的是指向“栈内存” 的指针,该指针的地址不是 NULL,但其原现的内容已经被清除,新内容不可知。 Void GetMemory2(char **p, int num) { *p = (char *)malloc(num); } void Test(void) { char *str = NULL; GetMemory(&str, 100); strcpy(str, "hello"); printf(str); } 请问运行Test函数会有什么样的结果? 答:(1)能够输出 hello (2)内存泄漏 void Test(void) { char *str = (char *) malloc(100); strcpy(str, “hello”); free(str); if(str != NULL) { strcpy(str, “world”); printf(str); } } 请问运行Test函数会有什么样的结果? 答:篡改动态内存区的内容,后果难以预 料,非常危险。 因为 free(str);之后,str 成为野指针, if(str != NULL)语句不起作用。 五、编写strcpy函数 已知strcpy函数的原型是 char *strcpy(char *strDest, const char *strSrc); 其中strDest是目的字符串,strSrc是源字符串。 (1) 不调用C++/C的字符串库函数,请编写函数 strcpy char *strcpy(char *strDest, const char *strSrc); { assert((strDest!=NULL) && (strSrc !=NULL)); // 2分 char *address = strDest; // 2分 while( (*strDest++ = * strSrc++) != ‘\0’ ) // 2分 NULL ; return address ; // 2分 } (2)strcpy能把strSrc的内容复制到strDest,为什么还要char * 类型的返回值? 答:为了实现链式表达式。 // 2 分 例如 int length = strlen( strcpy( strDest, “hello world”) ); 六:编程题 1、写出程序把一个链表中的接点顺序倒排 listNode* reverse_list( listNode* head) //逆序 { ListNode* new_head=head; if(head==NULL || head->next==NULL) return head; new_head = reverse_list(head->next); head->next->next=head; head->next=NULL; //防止链表成为一个环,这是最关键的。 return new_head; } 2、写出程序删除链表中的所有接点 void del_all(node *head) { node *p; while(head!=NULL) { p=head->next; free(head); head=p; } cout<<"释放空间成功!"<<endl; } 3、 使用冒泡、选择法、快速排序法对数组进行排序 1)“冒泡法” 冒泡法大家都较熟悉。其原理为从a[0]开始,依次将其和后面的元素比较, 若a[0]>a[i],则交换它们,一直比较到a[n]。 同理对a[1],a[2],...a[n-1]处理,即完成排序。 void bubble(int *a,int n) /*定义两个参数:数组首地址与数组大小*/ { int i,j,temp; for(i=0;i<n-1;i++){ for(j=i+1;j<n;j++){ if(a[i]>a[j]) { temp=a[i]; a[i]=a[j]; a[j]=temp; } }/*注意循环的上下限*/ } } 冒泡法原理简单,但其缺点是交换次数多,效率低。 下面介绍一种源自冒泡法但更有效率的方法“选择法”。 (2)“选择法” 选择法循环过程与冒泡法一致,它还定义了记号k=i 然后依次把a[k]同后面元素比较,若a[k]>a[j],则使k=j. 最后看看k=i是否还成立,不成立则交换a[k],a[i] 这样就比冒泡法省下许多无用的交换,提高了效率。 void choise(int *a,int n) { int i,j,min,temp; for(i=0;i<n-1;i++) { min=i; /*给记号赋值*/ for(j=i+1;j<n;j++) { if(a[min]>a[j]) min=j; /*是min总是指向最小元素*/ } if(i!=min) { /*当min!=i是才交换,否则a[i]即为最小*/ temp=a[i]; a[i]=a[min]; a[min]=temp; } } } 选择法比冒泡法效率更高,但说到高效率,非“快速法”莫属,现在就让我们来了解它。 (3)“快速法” 快速法定义了三个参数,(数组首地址*a,要排序数组起始元素下标i,要排序数组结束元素下标j). 它首先选一个数组元素(一般为a[ (i+j)/2 ],即中间元素)作为参照,把比它小的元素放到它的左边,比它大的放在右边。 然后运用递归,在将它左,右两个子数组排序,最后完成整个数组的排序。 下面分析其代码: void quick(int *a,int i,int j) { int m,n,temp; int k; m=i; n=j; k=a[(i+j)/2]; /*选取的参照*/ do { while( a[m]<k && m<j ) m++; /* 从左到右找比k大的元素*/ while( a[n] >k && n>i ) n--; /* 从右到左找比k小的元素*/ if(m<=n) { /*若找到且满足条件,则交换*/ temp=a[m]; a[m]=a[n]; a[n]=temp; m++; n--; } } while(m<=n); if(m<j) quick(a,m,j); /*运用递归*/ if(n>i) quick(a,i,n); } (4)“插入法” 插入法是一种比较直观的排序方法。 它首先把数组头两个元素排好序,再依次把后面的元素插入适当的位置。 把数组元素插完也就完成了排序。 void insert(int *a,int n) { int i,j,temp; for(i=1;i<n;i++) { temp=a[i]; /*temp为要插入的元素*/ j=i-1; while( j>=0&&temp<a[j] ) { /*从a[i-1]开始找比a[i]小的数,同时把数组元素向后移*/ a[j+1]=a[j]; j--; } a[j+1]=temp; /*插入*/ } } (5)“shell法” shell法是一个叫 shell 的美国人与1969年发明的。 它首先把相距k(k>=1)的那几个元素排好序,再缩小k值(一般取其一半),再排序,直到k=1时完成排序。 下面让我们来分析其代码: void shell(int *a,int n) { int i,j,k,x; k=n/2; /*间距值*/ while(k>=1) { for(i=k;i<n;i++) { x=a[i]; j=i-k; while(j>=0&&x<a[j]) { a[j+k]=a[j]; j-=k; } a[j+k]=x; } k/=2; /*缩小间距值*/ } } #include<stdio.h> ...... /*为了打印方便,我们写一个print吧。*/ void print(int *a,int n) { int i; for(i=0;i<n;i++) printf("%5d",a[i]); printf("\n"); } main() { /*为了公平,我们给每个函数定义一个相同数组*/ int a1[]={13,0,5,8,1,7,21,50,9,2}; int a2[]={13,0,5,8,1,7,21,50,9,2}; int a3[]={13,0,5,8,1,7,21,50,9,2}; int a4[]={13,0,5,8,1,7,21,50,9,2}; int a5[]={13,0,5,8,1,7,21,50,9,2}; printf("the original list:"); print(a1,10); printf("according to bubble:"); bubble(a1,10); print(a1,10); printf("according to choise:"); choise(a2,10); print(a2,10); printf("according to quick:"); quick(a3,0,9); print(a3,10); printf("according to insert:"); insert(a4,10); print(a4,10); printf("according to shell:"); shell(a5,10); print(a5,10); } 第二部分:C++与QT 1. C++对C语言做了很多改进,下列描述中 (D)  使得C语言发生了质变,即从面向过程变成面向对象。 A)增加了一些新的运算符       B)允许函数重载,并允许设置默认参数  C)规定函数说明必须用原型       D)引进类和对象的概念 2. 下面说法中正确的是(B ) A) 一个类只能定义一个构造函数,但可以定义多哥析构函数(只能一个) B) 一个类只能定义一个析构函数,但可以定义多个构造函数 C) 构造函数与析构函数同名,只是名字前加了一个求反符号(~) D)构造函数(不)可以指定返回类型,而析构函数不能指定任何返回类型,即使是void类型也不可以 3. 下面关于友元的描述中,错误的是( D)。 A)   友元函数可以访问该类的私有数据成员。 B)    一个类的友元类中的成员函数都是这个类的友元函数。 C)    友元可以提高程序的运行效率。 D)    类与类之间的友元关系可以继承。 4. 有关析构函数的说法不正确的是(B)。 A) 析构函数有切仅有一个 B) 析构函数和构造函数一样(不)可以有形参 C) 析构函数的功能是用来释放一个对象 D) 析构函数无任何函数类型 5. 下列对重载函数的描述中,(A)是错误的。 A) 重载函数中不允许使用默认参数     B) 重载函数中编译时根据参数表进行选择 C) 不要使用重载函数来描述毫无相干的函数   D) 构造函数重载将会给初始化带来多种方式 6. 下面叙述错误的是( C ) A. 派生类可以使用private派生 B. 对基类成员的访问必须是无二义性的 C. 基类成员的访问能力在派生类中维持不变 D. 赋值兼容规则也适用于多继承的组合 一、选择题:(共10小题,每题3分) 1.类的构造函数被自动调用执行的情况是在定义该类的( C ) A)成员函数时 B)数据成员时 C)对象时 D)友元函数时 2.说明友元函数使用关键字( A ) A)friend B)static C)const D)colatile 3.已知类X中的一个成员函数说明如下: Void Set(x &a); 其中,X&a的含义是(C ) A)指向类X的指针为a B)将a的地址赋给变量Sst C)a是类X的对象引用,用来做为Set()的形参 D)变量X是a按位相与作为函数Set()的参数 4. 关于new运算符的下列描述中(  D )是错误的. //创建数组时,定义构造函数必须没有参数,或全部为默认参数 A) 它可以用来动态创建对象和对象数组 B) 使用它创建对象或对象数组,可以使用运算符DELETE删除 C) 使用它创建对象时要调用构造函数 D) 使用它调用对象数组时不许指定初始值 5.允许访问类的所有对象的私有成员,公有成员和保护成员的是( A ) A)友元函数 B)成员函数 C)内联函数 D)重载函数 6.局部变量可以隐藏全局变量,那么在有同名全局变量和局部变量的情形时,可以用( A ) 提供对全局变量的访问 A) 域运算符 B) 类运算符 C) 重载 D) 引用 7.缺省析构函数的函数体是( C ) A)不存在 B)随机产生的 C)空的 D)无法确定的、 8.通常拷贝构造函数的参数表是( C ) //在VC6.0下 A)该类对象名 //编译不会通过 B)该类对象的成员名 //编译可以通过,但不是通常的标准方法 C)该类对象的引用名 //标准拷贝构造函数的方法 D)该类对象的指针名 //编译可以通过,但不是通常的标准方法 9.对定义重载函数的下列要求中,(D ) 是错误的 A)要求参数的个数不同     B)要求参数中至少有一个类型不同 C)要求参数个数相同时,参数类型不同  D)要求函数的返回值不同 10.对于多重继承,有(D ) A.一个派生类只能有一个基类 B.一个基类只能产生一个派生类 C.一个基类必须产生多个派生类 D.一个派生类可有多个基类 7. C和C++有什么不同?(4分) 1.从源文件文件的扩展名上有不同 2.包含的头文件不同 3.输入输出不同 4.C语言是弱类型检查机制 5.C++支持面向对象的支持 6.C++具有灵活的局部变量说明 7.C++的结构,联合,枚举名可直接作为类型名、 8.……等(详情参考C++课“02_c++语言基础知识2”) 8. 面向对象的三个基本特征及各自的作用(6分) 1.封装:将客观事物抽象成类,每个类对自身的数据和方法实行protection(private,protected,public) 2.继承:广义的继承有三种实现形式:实现继承(指使用基类的属性和方法而无需额外编码的能力、可视继承(子窗体使用父窗体的外观和实现代码)、接口继承(仅使用属性和方法,实现滞后到子类实现)。前两种(类继承)和后一种(对象组合=>接口继承以及纯虚函数)构成了功能复用的两种方式。 3.多态:指函数重载和重写,重写的主要的功能是将父对象设置成为和一个或更多的他的子对象相等的技术,赋值之后,父对象就可以根据当前赋值给它的子对象的特性以不同的方式运作。简单的说:允许将子类类型的指针赋值给父类类型的指针。 9. c和c++中的struct有什么不同?(5分) 1. C语言中的结构体中的元素只能是数据,没有函数。(函数指针不算,其本质是指针); 2.C++语言的结构体的元素不仅可以有数据,还可以有函数; 3.C语言和C++语言的结构体中的成员的访问权限不一样,C++结构体可以设置其中的成员的访问权限; 10. const符号的作用有哪些?(5分) Const 修饰指定的变量为只读类型,注意:不能说const修饰或定义常量常用情况 (1)const char*p (2)char const*p (3)char*const p (4) void A::fun() const { //……} 如果const位于星号的左侧,则const是用来修饰指针所指向的变量,即指针指向为常量 如果const位于星号的右侧,const就是修饰指针本身,即指针本身是常量。 如果const位于函数后面,则表示类A的成员函数fun不可以修改数据成员; 11. 引用与指针有什么区别?(6分) 1 引用必须被初始化,指针不必。 2 引用初始化以后不能被改变,指针可以改变所指的对象。 3 不存在指向空值的引用,但是存在指向空值的指针。 4 重载操作符使用引用可以完成串试操作 本质:引用是一个已存在变量的别名,其实就是这个变量本身;而指针是一个变量,其值是另一个变量的地址。 12. 重载(overload)和重写(overried,有的书也叫做“覆盖”)的区别?(4分) 常考的题目。从定义上来说:重载和重写都是不同函数使用同一函数名的现象 重载的特征: 1. 具有相同的作用域(在同一个类中定义或都是全局函数) 2. 函数名字相同,但是参数的类型或个数不同 3. virtual关键字可有可无 重写的特征 1. 不同的作用域(分别存在基类和派生类中) 2. 函数名称和参数完全相同 3. 一般需要将基类函数设置为virtual类型 13. static 在类内修饰成员的作用是什么,如何引用这些成员?(4分) Static 修饰的成员称为静态成员,分为静态数据成员和静态成员函数 静态数据成员:无论创建多少个对象,这个几个静态数据成员成员在内存中只值占一个这个数据类型的空间。 静态成员函数:首先,静态成员函数属于这个类,但它不是具体的某个特定对象的成员函数。静态成员函数一般只能访问这个类的静态数据成员。 引用方法:类名::静态成员; 对象.静态成员; 14. 虚析构函数的作用是什么?(6分) 如果一个基类的指针指向派生类对象,当用delete运算符释放这个指针时,能保证不仅调用基类的析构函数,还能调用派生类的析构函数,达到避免内存泄露的作用 15. 类成员函数的重载、覆盖和隐藏区别? a.成员函数被重载的特征: (1)相同的范围(在同一个类中); (2)函数名字相同; (3)参数不同; (4)virtual 关键字可有可无。 b.覆盖是指派生类函数覆盖基类函数,特征是: (1)不同的范围(分别位于派生类与基类); (2)函数名字相同; (3)参数相同; (4)基类函数必须有virtual 关键字。 c.“隐藏”是指派生类的函数屏蔽了与其同名的基类函数,规则如下: (1)如果派生类的函数与基类的函数同名,但是参数不同。此时,不论有无virtual关键字,基类的函数将被隐藏(注意别与重载混淆)。 (2)如果派生类的函数与基类的函数同名,并且参数也相同,但是基类函数没有virtual 关键字。此时,基类的函数被隐藏(注意别与覆盖混淆) 三、编程题:(共3小题 每小题10分) 16. 编写一个字符串处理的类,MyString,实现拷贝构造,‘=’号重载 等基本函数。 17. 使用MyString作为成员对象实现一个Person类,包含:姓名,年龄。 18. 实现一个Student 类:有性名,年龄,学号,老师姓名。 19. 编写类String的构造函数、析构函数和赋值函数 已知类String的原型为: class String { public: String(const char *str = NULL); // 普通构造函数 String(const String &other); // 拷贝构造函数 ~ String(void); // 析构函数 String & operate =(const String &other); // 赋值函数 private: char *m_data; // 用于保存字符串 }; 请编写String的上述4个函数。 标准答案: // String 的析构函数 String::~String(void) // 3 分 { delete [] m_data; // 由于 m_data 是内部数据类型,也可以写成 delete m_data; } // String 的普通构造函数 String::String(const char *str) // 6 分 { if(str==NULL) { m_data = new char[1]; *m_data = ‘\0’; } else { int length = strlen(str); m_data = new char[length+1]; // 若能加 NULL 判断则更好 strcpy(m_data, str); } } // 拷贝构造函数 String::String(const String &other) // 3 分 { int length = strlen(other.m_data); m_data = new char[length+1]; // 若能加 NULL 判断则更好 strcpy(m_data, other.m_data); } // 赋值函数 String & String::operate =(const String &other) // 13 分 { // (1) 检查自赋值 // 4 分 if(this == &other) return *this; // (2) 释放原有的内存资源 // 3 分 delete [] m_data; // (3)分配新的内存资源,并复制内容 // 3 分 int length = strlen(other.m_data); m_data = new char[length+1]; // 若能加 NULL 判断则更好 strcpy(m_data, other.m_data); // (4)返回本对象的引用 // 3 分 return *this; } Qt图形库部分: 1、 什么是Qt图形库,你是怎么理解的? Qt是一个跨平台的C++图像界面应用程序框架。 优点:跨平台、面向对象、丰富的API、信号与槽的消息机制、强大的开发工具、XML支持、多语言支持,支持开源协议等 2、Qt库的QApplication类有什么作用? 3、Qt怎么处理绘图事件和鼠标事件? 4、举例说明怎么实现自定义信号和槽。 信号是一个特定的标示,能通过emit发射 槽是函数,它和瀑普通的C++的成员函数几乎一样,唯一不同的是槽可以和信号连接在一起,当发射这个信号后,槽函数能被自动调用。 作用是对象之间通信的高级接口。 使用方式,通过QObject::connect(……)函数来连接。连接方式有多种:1,一个信号连接一个槽;2,一个信号也可以连接多个槽;4,多个信号可以连接一个槽;4,一个信号可以与另外一个信号相连接。 5、 要设计开发一个扫雷游戏,写出你的设计思路。 6、Qt 中窗口对象的父子关系如何指定?指定父对象有什么作用及好处? (5分) 两种方法:1,通过构造函数的参数指定。2,调用成员函数 void QWidget::setParent( QWidget * parent ); 好处:1,父对象show都会递归调用其所有子对象,让他们都显示出来,hide也一样,2,父对象被销毁时会递归销毁其所有的子对象,让内存管理更加简单。 二、编程题: 1.继承自QWidget ,自定义一个Button, 功能如下: 1)enter与leave有不同的背景状态变化 ,提示:enterEvent(), leaveEvent(); 2)Press 与Release 也有不同的背景状态变化 3)当鼠标点击时可以发出clicked() 信号 4)创建一个窗口,测试自定义的Button 第三部分:linux系统编程 一:选择题 (1)下列不是Linux系统进程类型的是 ( B )。 A 交互进程 B 批处理进程 C 守护进程 D 就绪进程(进程状态) (2)终止一个前台进程可能用到的命令和操作( A) A: kill B :<CTRL>+C C :shut down D: halt (3)内核不包括的子系统是( C )。 A 进程管理系统 B 内存管理系统 C I/O管理系统 D硬件管理系统 (4)进程有三种状态:( C ) A 准备态、执行态和退出态 B 精确态、模糊态和随机态 C 运行态、就绪态和等待态 D 手工态、自动态和自由态 (5)( B )不是进程和程序的区别。 A 程序是一组有序的静态指令,进程是一次程序的执行过程 B 程序只能在前台运行,而进程可以在前台或后台运行 C 程序可以长期保存,进程是暂时的 D 程序没有状态,而进程是有状态的 二:填空题 (1) 列举八种常见的进程间通信方式_管道、命名管道、消息队列、信号、信号量、内存映射、共享内存、套接字____. (2) 网络上两太主机的进程间通信方式为__套接字______. (3) 命名管道比无名管道的优势__不需要有父子进程关系____. (4) 消息队列比命名管道和无名管道的优势__更方便多个进程间的通讯______. (5) 按照逻辑结构不同进行数据库划分,Sqlite 数据库属于哪一类关系型数据库_. (6) SQL语言包括四部分_
展开阅读全文

开通  VIP会员、SVIP会员  优惠大
下载10份以上建议开通VIP会员
下载20份以上建议开通SVIP会员


开通VIP      成为共赢上传

当前位置:首页 > 包罗万象 > 大杂烩

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        抽奖活动

©2010-2026 宁波自信网络信息技术有限公司  版权所有

客服电话:0574-28810668  投诉电话:18658249818

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :微信公众号    抖音    微博    LOFTER 

客服