2020年度C常见笔试题及答案.docx
C+常见笔试题及答案C+面试题1 # include " filename.h ”和# include filename.h的区另?答:对于# includefilename.h编译器从标准库 开始搜索filename.h对于#include “filename.h”编译器从用户工作 路径开始搜索filename.h2头文件的作用是什么?答:、经过头文件来调用库功能。在很多场合, 源代码不便(或不准)向用户公布,只要向用户 提供头文件和二进制的库即可。用户只需要按照 头文件中的接口声明来调用库功能,而不必关心 接口怎么实现的。编译器会从库中提取相应的代 码。二、头文件能加强类型安全检查。如果某个接口 被实现或被使用时,其方式与头文件中的声明不 一致,编译器就会指出错误,这一简单的规则, 能大大减轻程序员调试、改错的负担。3 C+函数中值的传递方式有哪几种?答:C+函数的三种传递方式为:值传递、指针 传递和引用传递。4内存的分配方式有几种?答:、从静态存储区域分配。内存在程序编译 的时候就已经分配好,这块内存在程序的整个运 行期间都存在。例如全局变量。二、在栈上创立。在执行函数时,函数内局部变 量的存储单元都能够在栈上创立,函数执行结束 时这些存储单元自动被释放。栈内存分配运算内 置于处理器的指令集中,效率很髙,可是分配的 内存容量有限。三、从堆上分配,亦称动态内存分配。程序在运 行的时候用malloc或new申请任意多少的内存, 程序员自己负责在何时用free或delete释放内 存。动态内存的生存期由我们决定,使用非常灵 活,但问题也最多。5实现双向链表删除个节点P,在节点P后插 入个节点,写出这两个函数;答:双向链表删除个节点Ptemplate<class type> void list<type>:delnode(int P)int k=l;listnode<type> *ptr,*t;ptr=first;while(ptr->next!=NULL&&k!=p)(ptr=ptr->next;k+;t=ptr->next;cout«"你已经将数据项"«t->data«"删除,<<endl;ptr->next=ptr->next->next;length-;delete t;)在节点P后插入一个节点:booltemplate<classtype>list<type>:insert(type t,int p)(listnode<type> *ptr;ptr=first;int k=l;while(ptr!=NULL&&k<p)ptr=ptr->next;k+;if(ptr=NULL&&k!=p)return false;elselistnode<type> *tp;tp=new listnode<type>tp->data=t;tp->next=ptr->next;ptr->next=tp;length+;return true;)6写个函数,将其中的t都转换成4个空格。bool change(char *buf, int len)int count = 0;int i;/Z统计有多少个、for (i = 0; bufi != '0' i+) if (bufi = 't')count+;/Z给定的buf空间是否能装下生成的字符串int j = i + 3 * count;if(len<j + l)return false;/Z从后向前逐个替换while (count > 0)while (bufi != 't')bufj- = bufi-;count-;bufj = bufj -1 = bufj - 2 = bufj - 3='j-= 4;i 一;)return true;)int main()charbuf100"123t45ttt6tt65n4234t5345"cout«"Before chage:"«endl;cout«buf«endl;cout«"After calling the function:"«endl;/ buf是原字符串,100是buf的长度(要足够大,最好是原字符串的3倍)if (change(buf, 100) = true)cout« buf « endl;char c;cin»c;7 Windows程序的入口是哪里?写出Windows 消息机制的流程.函数 WinMain()Windows应用程序的消息处理机制如图L2所示。(1)操作系统接收到应用程序的窗口消息,将 消息投递到该应用程序的消息队列中。(2)应用程序在消息循环中调用GetMessage 函数从消息队列中取出一条一条的消息、。取出消 息后,应用程序能够对消息进行一些预处理,例 如,放弃对某些消息的响应,或者调用 TranslateMessage产生新的消息。(3)应用程序调用DispatchMessage,将消息回 传给操作系统。消息是由MSG结构体对象来表 示的,其中就包含了接收消息的窗口的句柄。因 此DispatchMessage函数总能进行正确的传递。(4)系统利用 WNDCLASS结构体的IpfnWndProc 成员保存的窗口过程函数的指针调用窗口过程, 对消息进行处理(即“系统给应用程序发送了消 息”)。8如何定义和实现个类的成员函数为回调函 数?把函数声明为static9 C+里面是不是所有的动作都是main()引起的? 如果不是,请举例.答:在运行C+程序时,一般从main()函数开始 执行。因此如果没有main(),程序将不完整,编 译器将指出未定义main()函数。例外情况:如,在windows编程中,能够编写 个动态连接库(dll)模块,这是其它windows 程序能够使用的代码。由于DLL模块不是独立的 程序,因此不需要main().用于专用环境的程序 如机器人中的控制器芯片一可能不需要main(). 但常规的独立程序都需要main().10 C+里面如何声明const void f(void)函数为C程序中的库函数?extern "C" void f(void);11下列哪两个是等同的C=Dint b;A const int* a = &b;B const* int a = &b;C const int* const a = &b;D int const* const a = &b;12内联函数在编译时是否做参数类型检查 是13 三个 float:a,b,c 问值(a+b)+c=(b+a)+c 1(a+b)+c=(a+c)+b 114把一个链表反向填空void reverse(test* head)test* pe = head;test* ps = head->next;while(ps)pe->next = ps->next;ps->next = head;head = ps;ps = pe->next;16某个程序在个嵌入式系统(200M的 CPU,50M的SDRAM)中已经最化了,换到另个 系统(300M的CPU,50M的SDRAM)中运行,还需 要优化吗?要。程序在每时每刻都要优化,只要能找到能够 优化的方法。优化有多种目的,在200M的CPU中可能需要以 速度为重点优化,在300M的CPU中可能要以代 码长度为目的优化。17 .下面哪种排序法对!2354最快Ca quick sort /快速排序 b.buble sort /冒泡排序c.merge sort 归并排序18 .哪种结构,平均来讲,获取个值最快Ba. binary tree /叉树b. hash table 散列表,哈希表c. stack /栈19请问C+的类和C里面的struct有什么区另?答:C+的类的成员默认情况下是私有的,C的 struct的成员默认情况下是公共的.20请讲讲析构函数和虚函数的用法和作用?答:析构函数的名字和类名相同,没有返回值, 没有参数,不能随意调用也没有重载。只是在类 对象生命期结束时由系统自动调用。虚函数用在继承中,当在派生类中需要重新定义 基类的函数时需要在基类中将该函数声明为虚 函数,作用为使程序支持动态联编。21全局变量和局部变量有什么区别?是怎么实 现的?操作系统和编译器是怎么知道的?答:些变量整个程序中都是可见的,它们称为 全局变量,些变量在函数内部定义且只在函数 中可知,则称为局部变量。全局变量由编译器建立且存放在内存的全局数 据区,局部变量存放在栈区.主要是寻址和内存管理22 些寄存器的题目, 等些知识。1、 立即寻址2、 寄存器寻址3、直接寻址4、 寄存器间接寻址5、 基址加变址寻址6、 寄存器相对寻址7、 相对基址加变址寻址23 8086是多少位的系统?在数据总线上是怎么 实现的?8086有16根数据线和20根地址线,因为可用20位地址.8086是!6位处理器.24 多态。overload 和 override 的区别。答:多态:接口的多种不同的实现方式即为多态重载在相同范围(同一个类中),函数名字相同, 参数不同,virtual关键字可有可无。覆盖是指派生类函数覆盖基类函数,不同的范围, 函数名字相同,参数相同,基类函数必须有 virtual关键字。«Sony笔试题>>25 .完成下列程序* * * * * * *#i nclude<iostream> using namespace std;const int n = 8;main()int i;int j;int k;for(i = n; i >= 1; i-)for(j = 0; j < n-i+1; j+)cout«"*n: for(k=l; k < n-i+1; k+)cout«"."cout«endl;system("pause")26完成程序,实现对数组的降序排序# i nclude <iostream>using namespace std;void sort(int* ai% int n);int main()int array 卜45,56,76,234,1,3433,2,3;sort(array, 9);for(int i = 0; i <= 8; i+)曾经在这儿出界cout«arrayi«"cout«endl;system("pause");void sort(int* an; int n)(int temp;for(int i = 1; i < 9; i+)for(int k = 0; k < 9 - i; k+)曾经在这儿出界(if(arrk < arrk + 1)(temp = arrk;arrk = arrk+ 1;arrk + 1 = temp;)27费波那其数列,1, 1, 2, 3, 5编写程序 求第十项。能够用递归,也能够用其它方法,但 要说明你选择的理由。非递归# i nclude <iostream>using namespace std;int Pheponatch(int n);main()(int Ph = Pheponatch(lO);cout«Ph«endl;system("pauseH);)int Pheponatch(int n)int elem;int nl = 1;int n2 = 1;if(n = 1 11 n =2)return 1;elsefor(int i = 3; i <= n; i+)(elem = nl + n2;nl = n2;n2 = elem;Jreturn elem;递归#i nclude <iostream> using namespace std;int Pheponatch(int n);main()int n;cin»n;int ph = Pheponatch(n);cout«ph«endl;system("pause");)int Pheponatch(int n)(if(n <= 0)exit(-l);elseif(n = 1 11 n =2)return 1;elsereturn Pheponatch(n -1) + Pheponatch(n - 2);28下列程序运行时会崩溃,请找出错误并改正, 而且说明原因。#i nclude <stdio.h>#i nclude <malloc.h>typedef structTNode* left;TNode* right;int value; TNode;TNode* root=NULL;void append(int N);int main()append(63);append(45);append(32);append(77);append(96);append(21);append(17); Again,数字任意给出)void append(int N)TNode*NewNode=(TNode*)malloc(sizeof(TNode);NewNode->value=N;if(root=NULL)(root=NewNode;return;)elseTNode* temp;temp=root;while(N>=temp.value && temp.left!=NULL) 11 (N<temp. value && temp.right!=NULL)(while(N>=temp.value && temp.left!=NULL)temp=temp.left;while(N<temp.value && temp.right!=NULL)temp=temp.right;)if(N>=temp.value)temp.left=NewNode;elsetemp.right=NewNode;return;29. A class B network on the internet has a subnet mask of 255.255.240.0, what is the maximum number of hosts per subnet.a. 240 b. 255 c. 4094 d. 6553430. What is the difference: between o(log n) and o(log nA2), where both logarithems have base 2 .a. o(log nA2) is bigger b. o(log n) is biggerc. no difference31. For a class what would happen if we call a class' s constructor from with the same class' s constructor.a. compilation error b. linking errorc. stack overflow d. none of the above32. "new" in C+ is a:.a. library function like malloc in cb. key word c. operatord. none of the above33. Which of the following information is not contained in an inode .a. file owner b. file sizec. file name d. disk address34. What' s the number of comparisons in the worst case to merge two sorted lists containing n elements each.a. 2n b.2n-l c.2n+l d.2n-235. Time complexity of n algorithm T(n), where n is the input size ,is T(n)=T(n-l)+l/n if n>l otherwise 1 the order of this algorithm is .a. log (n) b. n c. nA2 d. nAn36. The number of 1 ' s in the binary representation of 3*4096+ 15*256+5*16+3 are .a. 8 b. 9 c. 10 d. 1237. 设计函数 int atoi(char *s)。38. int i=(j=4,k=8,1=16,m=32); printf("d”, i);输出是多少?39. 解释局部变量、全局变量和静态变量的含义。40. 解释堆和栈的区别。栈区(stack)-由编译器自动分配释放,存放 函数的参数值,局部变量的值等。其操作方式类 似于数据结构中的栈。堆:一般由程序员分配释放,若程序员不释放, 程序结束时可能由OS回收。注意它与数据结构 中的堆是两回事,分配方式倒是类似于链表.41. 论述含参数的宏与函数的优缺点。1 .函数调用时,先求出实参表示式的值,然后带 入形参。而使用带参的宏只是进行简单的字符替 换。2 .函数调用是在程序运行时处理的,分配临时的 内存单元;而宏展开则是在编译时进行的,在展 开时并不分配内存单元,不进行值的传递处理, 也没有“返回值”的概念。3 .对函数中的实参和形参都要定义类型,二者的 类型要求一致,如不一致,应进行类型转换;而 宏不存在类型问题,宏名无类型,它的参数也无 类型,只是个符号代表,展开时带入指定的字 符即可。宏定义时,字符串能够是任何类型的数 据。4 .调用函数只可得到个返回值,而用宏能够设 法得到几个结果。5 .使用宏次数多时,宏展开后源程序长,因为每 展开一次都使程序增长,而函数调用不使源程序 变长。6 .宏替换不占运行时间,只占编译时间;而函数 调用则占运行时间(分配单元、保留现场、值传 递、返回)。一般来说,用宏来代表简短的表示式比较合适。42 .以下三条输出语句分别输出什么? C易char strl = "abc"char str2 = "abc"const char str3 = "abc"const char str4 = "abc"const char* str5 = "abc"const char* str6 = "abc"cout « boolalpha « ( strl=str2 ) « endl; /Z 输 出什么? 0cout « boolalpha « ( str3=str4 ) « endl; /Z 输 出什么? 0cout « boolalpha « ( str5=str6 ) « endl; /Z 输 出什么? 1答:分别输出 false, false, true strl 和 str2 都是字符数组,每个都有其自己的存储区,它们 的值则是各存储区首地址,不等;str3和str4 同上,只是按const语义,它们所指向的数据区 不能修改。str5和str6并非数组而是字符指针, 并不分配存储区,其后的“abc”以常量形式存于 静态数据区,而它们自己仅是指向该区首地址的 指针,相等。43 .非C+内建型别A和B,在哪几种情况下B 能隐式转化为A? C+中等答:BDa. class B : public A B公有继承自 A,能够是间接继承的b. class B operator A(); / B 实现 了 隐式转化为 A的转化c. class A A( const B& ); A 实现了 non-explicit的参数为B (能够有其它带默认值的 参数)构造函数d. A& operator= ( const A& ); / 赋值操作,虽不 是正宗的隐式类型转换,但也能够勉强算个44 .以下代码中的两个sizeof用法有问题吗? C 易void UpperCase( char str ) / 将 str 中的小写 字母转换成大写字母for( size_t i=0; i<sizeof(str)/sizeof(str0); +i)if( 'a'<=stri && stri<='z')stri -= ('a'-'A');)char str = "aBcDe"cout « "str 字符长度为:"« sizeof(str)/sizeof(str0)« endl;UpperCase( str);cout« str« endl;45 .以下代码有什么问题? C难void char2Hex( char c ) /将字符以16进制表示(char ch = c/OxlO + 'O' if( ch > '9') ch += (7V-9-1);char cl = c%OxlO +'O' if( cl >'9') cl += ('A-9'-l);cout« ch « cl « ')char str = "I love 中国”;for( size_t i=0; i<strlen(str); +i)char2Hex( stri);cout« endl;46 .以下代码有什么问题? C+易struct Test(Test( int) Test() void fun() );void main( void )Test a(l);a.fun();Test b();b.fun();* Test b();定义了一个函数47.以下代码有什么问题? C+易cout« (true?l:"l") « endl;8.以下代码能够编译经过吗,为什么? C+易unsigned int const sizel = 2;char strl sizel ;unsigned int temp = 0;cin »temp;unsigned int const size2 = temp;char str2 size2 ;48 .以下代码中的输出语句输出。吗,为什么?C+易 struct CLSint m_i;CLS( int i): m_i(i) CLS()CLS(O););CLS obj;cout« obj.m_i « endl;49 . C+中的空类,默认产生哪些类成员函数?C+易答:class Empty public:Empty(); /Z缺省构造函数Empty( const Empty& ); /Z 拷贝构造函数Empty();析构函数Empty& operator=( const Empty& ); /Z 赋值运算 符Empty* operator&(); /Z 取址运算符const Empty* operator&() const; /Z 取址运算符 const;50 .以下两条输出语句分别输出什么? C+难float a = l.Of;cout« (int)a « endl;cout« (int&)a « endl;cout « boolalpha « (int)a = (int&)a ) « endl;/Z输出什么0 float b = O.Of;cout« (int)b « endl;cout« (int&)b « endl;cout « boolalpha « ( (int)b = (int&)b ) « endl;/Z输出151 .以下反向遍历array数组的方法有什么错误?STL 易vector array;array.push_back( 1);array.push_back( 2);array.push_back( 3);for( vector:size_type i=array.size()-l; i>=0; -i ) /反向遍历array数组cout« arrayi « endl;)52 .以下代码有什么问题? STL易typedef vector I nt Array;I nt Array array;array.push_back( 1);array.push_back( 2);array.push_back( 2);array.push_back( 3);/Z删除array数组中所有的2for( lntArray:iterator itor=array.begin(); itor!=array.end(); +itor)(if( 2 = *itor) array.erase( itor);)53 .写个函数,完成内存之间的拷贝。考虑问 题是否全面答:void* mymemcpy( void *dest, const void *src, size_t count)(char* pdest = static_cast<char*>( dest);const char* psrc = static_cast<const char*>( src );if( pdest>psrc && pdest<psrc+cout )能考虑到这 种情况就行了for( size_t i=count-l; i!=-l; -i)pdesti = psrci;elsefor( size_t i=0; i<count; +i)pdesti = psrci;return dest;int main( void) char str=mymemcpy( str+1, str+O, 9 );cout« str« endl;system( "Pause");return 0;)54线程与进程的区别进程就是个应用程序在处理机上的一次执 行过程,它是个动态的概念,而线程是进程中 的一部分,进程包含多个线程在运行。55:请你分别划划OSI (开放式系统互联)的七层网络结构图,和TCP/IP的五层结构图?赤安全技术应用程序网勢倉包过速OSI 层应用相关保密网关SOCKS年含包过滤IPSecSa/TLS歯湿密侑边加密应用层(application layer) 传输层(transport layer) 网络层(network layer) 数据链路层(data link layer) 物理层(physical layer)56:请你详细的解释一下IP协议的定义,在哪 个层上面,主要有什么作用? TCP与UDP呢?IP协议是网络层的协议,它实现了 Internet中 自动路由的功能,即寻径的功能,TCP协议是 个传输性的协议它向下屏蔽了 IP协议不可靠传 输的特性,向上提供一个可靠的点到点的传输, UDP提供的是种无连接的服务,主要考虑到很 多应用不需要可靠的连接,但需要快速的传输57:请问交换机和路由器分别的实现原理是什么? 分别在哪个层次上面实现的?交换机用在局域网中,交换机经过记录局域网 内各节点机器的MAC地质(物理地址)就能够实 现传递报文,无需看报文中的IP地址。路由器识 别不同网络的方法是经过识别不同网络的网络 ID号(IP地址的高端部分)进行的,因此为了保证 路由成功,每个网络都必须有一个唯一的网络编 号。路由器经过察看报文中IP地址,来决定路 径,向那个子网(下一跳)路由,也就是说交换机 工作在数据链路层看MAC地址,路由器工作在 网际层看IP地址可是由于现在网络设备的发展,很多设备既有交 换机的功能有由路由器的功能(交换试路由器)使 得两者界限越来越模糊。58:请问C+的类和C里面的struct有什么区别?(1)C+类中属性默认访问类型为private,而C中 的struct默认的访问类型为public(2)c+类能够有继承,虚函数,多态,而C中struct 不能够。C+的class具有数据封装功能,其包含属性访问 级别能够为private,public和protect,还具有实现 类接口功能和辅助功能的操作函数,而struct属 性访问权限只有public,没有数据封装功能,也 就没有实现信息隐藏这一面向对象的思想的机 制,struct本身不含有操作函数,只有数据。59:请讲讲析构函数和虚函数的用法和作用?析构函数是在类对象死亡时由系统自动调用, 其作用是用来释放对象的指针数据成员所指的 动态空间,如果在构造函数中,你申请了动态空 间,那么为了避免引起程序错误,你必须在析构 函数中释放这部分内存空间。如果基类的函数用 virtual修饰,成为虚函数,则其派生类相应的重 载函数仍能继承该虚函数的性质,虚函数进行动 态联编,也即具有多态性,也就是派生类能够改 变基类同名函数的行为,在面向对象世界中,多 态是最强大的机制,虚函数就是这机制的C+ 实现方式。60:全局变量和局部变量有什么区别?实怎么实 现的?操作系统和编译器是怎么知道的?全局变量是整个程序都可访问的变量,谁都能 够访问,生存期在整个程序从运行到结束(在程 序结束时所占内存释放),而局部变量存在于模 块(子程序,函数)中,只有所在模块能够访问, 其它模块不可直接访问,模块结束(函数调用完 毕),局部变量消失,所占据的内存释放。全局变量分配在全局数据段而且在程序开始 运行的时候被加载.局部变量则分配在堆栈里 面。61:一些寄存器的题目,主要是寻址和内存管理 等些知识。2、交换机用在局域网中,交换机经过纪录局域 网内各节点机器的MAC地质(物理地址)就能够 实现传递报文,无需看报文中的IP地质。路由器 识别不同网络的方法是经过识别不同网络的网 络ID号(IP地址的高端部分)进行的,因此为了保 证路由成功,每个网络都必须有一个唯一的网络 编号。路由器经过察看报文中IP地址,来决定 路径,向那个子网(下跳)路由,也就是说交换 机工作在数据链路层看MAC地址,路由器工作 在网际层看IP地质可是由于现在网络设备的发展,很多设备既有交 换机的功能有由路由器的功能(交换试路由器)使 得两者界限越来越模糊。3、IP协议是网络层的协议,它实现了 Internet 中自动路由的功能,即寻径的功能,TCP协议是 个传输性的协议它向下屏蔽了 IP协议不可靠 传输的特性,向上提供个可靠的点到点的传输, UDP提供的是种无连接的服务,主要考虑到很 多应用不需要可靠的连接,但需要快速的传输。Test b();定义了一个函数62:8086是多少位的系统?在数据总线上是怎么 实现的?«IBM»63 .怎样用最快的方法判断链表是否有环?设置两个指针,开始都指向链表头,然后其中 个指针每次向前走一步,另个指针每次向前 走两步,如果快的遇到NULL 了,证明该链表中 没有环,如果有环,快的指针每次都要比慢的多 走步,最终两个指针会相遇,64 .C+中引用和指针有什么不同?指针加上什么 限制等于引用?答:1引用被创立的时候必须被初始化,而指 针不是必须的。2引用在创立后就不能改变引用 的关系,而指针在初始化后能够随时指向其它的 变量或对象。3没有NULL引用,引用必须与合法 的存储单元关联,而指针能够是NULL。65 .做的项目,遇到的困难,怎样解决?69 .操作符重载class CMyObject:pulic CObjectPublic:CMyObject();CMyObject &operator=(const CMyObject &my);private:CString strName;int nld:);请重载赋值操作符70儀表int value;structList *pHead;Struct LinkedList *pMyList;请编写删除链表的头、尾和第n个节点的程序71 .用Socket AP!制作一个聊天程序,通讯协议使 用tcp/ip。要求有简单界面即可,支持多人聊天。72 .如果有过工作经验,请说明在先前公司的 作以及离职原因(如无,请说明毕业后的个人展 望)73对于C+中类(dass)与结构(struct)的描述正 确的为:A,类中的成员默认是private的,当是能够声明为 public,private和protected,结构中定义的成员默 认的都是public;B,结构中不允许定义成员函数,当是类中能够定 义成员函数;C,结构实例使用malloc()动态创立,类对象使用 new操作符动态分配内存;D,结构和类对象都必须使用new创立;E,结构中不能够定义虚函数,当是类中能够定义 虚函数.F,结构不能够存在继承关系,当是类能够存在继 承关系.答:A,D,F74,两个互相独立的类:QassA和QassB,都各自 定义了非静态的公有成员函数PublicFunc()和 非静态的私有成员函数PrivateFunc();现在要在ClassA中增加定义个成员函数ClassA:AdditionalPunction(ClassA a,ClassB b);则 能够在 AdditionalPunction(ClassA x,ClassB y)的实 现部分(函数功能体内部)出现的合法的表示是最全的是:A,x.Pri