大型公司笔试题目汇总(1)——46家笔试题解答
为了下个月的找工作冲刺,把见过的笔试题目解答并贴在此处,希望对所有的人都有帮助。本文的代码全部是个人所编,并且全部在VC++ 6.0开发环境中通过测试,请大家放心使用。在转载的同时,请注明出处。如果有更好的算法实现,欢迎指点。
本章主要引用网络上比较流行的《46家笔试题解答》,需要下载原题的可以在以下链接找到出处:http://download.csdn.net/source/1671590
一、Sony公司笔试题
1、打印以下信息
*
*.*.
*..*..*..
*...*...*...*...
*....*....*....*....*....
*.....*.....*.....*.....*.....*.....
*......*......*......*......*......*......*......
*.......*.......*.......*.......*.......*.......*.......*.......
- #include<stdio.h>
- #define N 8
- int main()
- {
- int i,j,k;
- for(i=0;i<N;i++)
- {
- for(j=0;j<=i;j++)
- {
- printf("*");
- for(k=0;k<i;k++)
- {
- printf(".");
- }
- }
- printf("/n");
- }
- return 0;
- }
2、给出以下数组的逆序排列:int array[]={45,56,76,234,1,34,23,2,3}
- #include<stdio.h>
- void sort();
- void print();//为本人后面所加函数
- int array[]={45,56,76,234,1,34,23,2,3};
- int main()
- {
- sort();
- print();
- return 0;
- }
- void sort()
- {
- for(int j=0;j<9;j++)
- {
- int mid_value;
- int min_value=array[j];
- for(int i=0;i<9;i++)
- {
- if(array[i]<min_value)
- {
- mid_value=array[i];
- array[i]=min_value;
- min_value=mid_value;
- }
- }
- array[j]=min_value;
- }
- }
- void print()
- {
- for(int i=0;i<9;i++)
- {
- printf("%d ",array[i]);
- }
- }
3.费波那其数列,1,1,2,3,5……编写程序求第十项。可以用递归,也可以用其他方法,但要说明你选择的理由。
- #include<stdio.h>
- int Pheponatch(int);
- int main()
- {
- printf("The 10th is %d",Pheponatch(10));
- printf("/n");
- return 0;
- }
- int Pheponatch(int N)
- {
- if((N==1)||(N==2))
- {
- return 1;
- }
- else
- return (Pheponatch(N-1)+Pheponatch(N-2));
- }
4.下列程序运行时会崩溃,请找出错误并改正,并且说明原因。
注意:由于测试环境为VC++6.0,所以对原题的语法进行了一定的修改。
- #include <stdio.h>
- #include <malloc.h>
- typedef struct node{
- struct node* left;
- struct node* 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, 数字任意给出
- return 0;
- }
- void append(int N)
- {
- TNode* NewNode=(TNode *)malloc(sizeof(TNode));
- NewNode->value=N;
- if(root==NULL)
- {
- root=NewNode;
- return;
- }
- else
- {
- TNode* temp;
- temp=root;
- while((N>=temp->value && temp->left!=NULL) || (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;
- else
- temp->right=NewNode;
- return;
- }
- }
错误在于:结构体在使用之前需要清零,否则运行时会崩溃。修改后的部分代码如下:
- TNode* NewNode=(TNode *)malloc(sizeof(TNode));
- NewNode->value=N;
- NewNode->left=NULL;
- NewNode->right=NULL;
二、华为公司笔试题
1、请你分别画出OSI的七层网络结构图和TCP/IP的五层结构图。
7 应用层 5应用层
6 表示层 4传输层
5 会话层 3 网络层
4 传输层 2 数据链路层
3 网络层 1物理层
2 数据链路层
1 物理层
2.请你详细地解释一下IP协议的定义,在哪个层上面?主要有什么作用?TCP与UDP呢?
IP协议(Internet Protocol)又称互联网协议,是支持网间互连的数据报协议,它与TCP协议(传输控制协议)一起构成了TCP/IP协议族的核心。它在网络层。主要是用于路由数据包及主机之间寻址。
TCP与UDP在传输层的协议。
3、请问交换机和路由器各自的实现原理是什么?分别在哪个层次上面实现的?
交换机(二层交换)的工作原理和网桥一样,它的各个端口都具有桥接功能,每个端口可以连接一个LAN或一台高性能网站或服务器,交换机按每一个包中的MAC地址相对简单地决策信息转发。路由器转发IP分组时,只根据IP分组目的IP地址的网络号部分,选择合适的端口,把IP分组送出去。同主机一样,路由器也要判定端口所接的是否是目的子网,如果是,就直接把分组通过端口送到网络上,否则,也要选择下一个路由器来传送分组。
交换机一般用于LAN-WAN的连接,交换机归于网桥,是数据链路层的设备,有些交换机也可实现第三层的交换。路由器用于LAN-WAN之间的连接,可以解决异性网络之间转发分组,作用于网络层。
4、请问C++的类和C里面的struct有什么区别?
(1) C++类中属性默认访问类型为private,而C中的struct没有访问类型
(2) C++类可以有继承,虚函数,多态,而C中struct没有。
(3) C语言struct里面不可以有函数,只能有变量。 C++给C中的struct功能扩展了
5、请讲一讲析构函数和虚函数的用法和作用
(1) 析构函数是特殊的类成员函数,它没有返回类型,没有参数,不能随意调用,也没有重载,只有在类对象的生命期结束的时候,由系统自动调用。主要用途就是自动获取资源,可以完成所需的资源回收,作为类构造函数的补充。
使用方法:在定义的时候用~标识即可。
(2) 虚函数是C++多态的一种表现:例如:子类继承了父类的一个函数(方法),而我们把父类的指针指向子类,则必须把父类的该函数(方法)设为virtual(虚函数)。使用虚函数,我们可以灵活的进行动态绑定,当然是以一定的开销为代价。
使用方法:使用virtual关键字即可。
6、全局变量和局部变量有什么区别?是怎么实现的?操作系统和编译器是怎么知道的?
全局变量和局部变量的区别是在存储器中位置不同,具体说,全局变量存储在数据段中,局部变量都有可能,一般来说在堆栈段;编译器根据语法进行判断。操作系统可以根据存储位置进行判断。
7、8086是多少位的系统?在数据总线上是怎么实现的?
8086是16微处理器,内部及对外有16位数据通路,8080/8085只有8位。 8086寻址空间1MB,8080/8085为64KB。8086有一个初级流水线结构,内部操作与对外操作具有并行性,8085无。 8086是个里程碑。
8086的机器字长是16位,8086使用40个引脚的16个做地址/数据复用引腿来传输数据,一次读写过程由一个基本总线周期完成,它由4个时钟(CLK)周期组成,按时间顺序定义为T1、T2、T3、T4。在T1期间8086发出访问目的地的地址信号和地址锁存选通信号ALE;T2期间发出读写命令信号RD、WR及其它相关信号;T3期间完成数据的访问;T4结束该总线周期。可见,地址与数据信号不会同时出现在一个时钟(CLK)周期,二者可以分时复用同一组引线。
三、联想公司笔试题
1、设计函数 int atoi(char *s):字符串转化为数字
- #include<stdio.h>
- #include <ctype.h>
- int atoi(char*);
- int main()
- {
- char * s="43";
- printf("%d/n",atoi(s));
- return 0;
- }
- int atoi (char s[])
- {
- int i,n,sign;
- for(i=0;isspace(s[i]);i++)//跳过空白符
- ;
- sign=(s[i]=='-')?-1:1;
- if(s[i]=='+'||s[i]==' -')//跳过符号
- i++;
- for(n=0;isdigit(s[i]);i++)
- n=10*n+(s[i]-'0');//将数字字符转换成整形数字
- return sign *n;
- }
2、int i=(j=4,k=8,l=16,m=32); printf(“%d”, i); 输出是多少?
32,逗号表达式取最后一个的值,即类似于int i=32;
3、解释局部变量、全局变量和静态变量的含义。
(1) 局部变量:在一个函数内部定义的变量是内部变量,它只在本函数范围内有效,也就是说只有在本函数内才能使用它们,在此函数以外时不能使用这些变量的,它们称为局部变量;说明:
1.主函数main中定义的变量也只在主函数中有效,而不因为在主函数中定义而在整个文件或程序中有效
2.不同函数中可以使用名字相同的变量,它们代表不同的对象,互不干扰
3.形式参数也使局部变量
4.在一个函数内部,可以在复合语句中定义变量,这些变量只在本符合语句中有效
(2) 全局变量:在函数外定义的变量是外部变量,外部变量是全局变量,全局变量可以为本文件中其它函数所共用,它的有效范围从定义变量的位置开始到本源文件结束;
说明:
1.设全局变量的作用:增加了函数间数据联系的渠道
2.建议不再必要的时候不要使用全局变量,因为a.全局变量在程序的全部执行过程中都占用存储单元;b.它使函数的通用性降低了c.使用全局变量过多,会降低程序的清晰性
3.如果外部变量在文件开头定义,则在整个文件范围内都可以使用该外部变量,如果不再文件开头定义,按上面规定作用范围只限于定义点到文件终了。如果在定义点之前的函数想引用该外部变量,则应该在该函数中用关键字extern作外部变量说明
4.如果在同一个源文件中,外部变量与局部变量同名,则在局部变量的作用范围内,外部变量不起作用;
(3) 静态变量:在程序运行期间分配固定的存储空间的变量,叫做静态变量。4、解释堆和栈的区别。栈上分配的内存,由系统自动分配,系统会自动收回.
如果需要动态分配内存,则只能通过malloc/new在堆上分配的内存,
使用完毕后,通过free/delete来释放内存。 5、论述含参数的宏与函数的优缺点。含参数的宏优点:省去了函数调用的开销,运行效率高.
含参数的缺点:由于宏本质上是字符串的替换,所有可能会由于一些参数的副作用导致得出
错误的结果.如:#define max(a, b) ( ((a) > (b)) ? (a) : (b) )
如果程序中出现这样的调用: max(a++, b);
将导致a被计算2次,从而可能得到错误的结果,而函数调用不会出现这种问题.另外,如果程序中有多次宏替换的话,可能导致代码体积变大.函数的优点是:没有带参数宏可能导致的副作用,计算的正确性较宏更有保证.
函数调用的缺点:函数调用需要一些参数,返回地址等入栈,出栈的开销,效率没有宏函数高.
四、普天C++笔试题
1、实现双向链表删除一个节点P,在节点P后插入一个节点,写出这两个函数。
- //假设线性表的双向链表存储结构
- typedef struct DulNode{
- struct DulNode *prior; //前驱指针
- ElemType data; //数据
- struct DulNode *next; //后继指针
- }DulNode,*DuLinkList;
- //插入节点
- Status ListInsert_DuL(DuLinkList &L,int i,ElemType &e)
- {
- if(!(p=GetElemP_DuL(L,i)))
- return ERROR;
- if(!(s=(DuLinkList)malloc(sizeof(DuLNode))))
- return ERROR;
- s->data=e;
- s->prior=p->prior;
- p->prior->next=s;
- s->next=p;
- p->prior=s;
- return OK;
- }
2、写一个函数,将其中的/t都转换成4个空格。
- #include<string>
- #include<iostream>
- using std::string;
- using std::iostream;
- string ReplaceTab(string );
- int main()
- {
- string s="Hello World!";
- std::cout<<ReplaceTab(s);
- return 0;
- }
- string ReplaceTab(string s)
- {
- for(int i=0;i<s.length();i++)
- {
- if(s[i]=='/t')
- s[i]=' ';
- }
- return s;
- }
另外一种方法为:
- //该函数命名为convert,参数的意义为:
- //*strDest目的字符串,*strSrc源字符串,length源字符串的长度
- //函数实现为:
- char* convert(char *strDest, const char *strSrc,int length)
- {
- char * cp = strDest;
- int i=0;
- while(*strSrc && i<length) // 跳出条件
- {
- if (*strSrc=='/t') //将/t转换成4个空格
- {
- for(int j=0;j<4;j++)
- *cp++=' ';
- }
- else //否则直接拷贝
- *cp++=*strSrc;
- strSrc++;
- i++;
- }
- return strDest;
- }
3、Windows程序的入口是哪里?写出Windows消息机制的流程。
Windows程序的入口是WinMain函数。
消息机制:系统将会维护一个或多个消息队列,所有产生的消息都会被放入或是插入队列中。系统会在队列中取出每一条消息,根据消息的接收句柄而将该消息发送给拥有该窗口的程序的消息循环。每一个运行的程序都有自己的消息循环,在循环中得到属于自己的消息并根据接收窗口的句柄调用相应的窗口过程。而在没有消息时消息循环就将控制权交给系统。
4、如何定义和实现一个类的成员函数为回调函数?
所谓的回调函数,就是预先在系统的对函数进行注册,让系统知道这个函数的存在,以后,当某个事件发生时,再调用这个函数对事件进行响应。定义一个类的成员函数时在该函数前加CALLBACK即将其定义为回调函数,函数的实现和普通成员函数没有区别。
5、C++里面是不是所有的动作都是main()引起的?如果不是,请举例。
不是,比如中断引起的中断处理不是直接由main()引起的,而是由外部事件引起的。
6、C++里面如何声明const void f(void)函数为C程序中的库函数?
在该函数前添加extern “C”声明
7、下列哪两个是等同的
int b;
A const int* a = &b;
B const* int a = &b;
C const int* const a = &b;
D int const* const a = &b;
各式表示的意思分别为:
A const int* a = &b; //*a是const,但指针a可变
B const* int a = &b; //a是const,但*a可变
C const int* const a = &b; //a和*a都是const,常量和指针的值都不能改变
D int const* const a = &b; //a和*a都是const,常量和指针的值都不能改变
因此C,D两者是相同的。
总结个技巧:如果const位于星号的左侧,则const就是用来修饰指针所指向的变量,即指针指向为常量;如果const位于星号的右侧,const就是修饰指针本身,即指针本身是常量。
8、内联函数在编译时是否做参数类型检查?
做类型检查,因为内联函数就是在程序编译时,编译器将程序中出现的内联函数的调用表达式用内联函数的函数体来代替。
五、大唐通信笔试题
1、什么是中断?中断发生时CPU做什么工作?
中断是CPU响应外设需求的一种模式,在外设需要CPU时,会向中断控制器发送中断请求,这时CPU要保护现场,即把正在运行的程序保存起来,一般是把状态压入堆栈,然后读中断号,启动相应的中断服务程序,服务完成后,载入保护现场,即把堆栈的数据弹出,继续运行之前的程序。
2、CPU在上电后,进入操作系统的main()之前必须做什么工作?
加电后,会触发cpu的reset信号,导致cpu复位,然后cpu会跳到(arm下0x00000000,x86下0xfffffff0)/执行指令.主要是做cpu初始化,确定cpu的工作模式,mmu初始化。建立页表段表,初始化中孤单控制器和中断向量表,初始化输入和输出,初始化nandflash,把os的TEXT区加载到sdram,然后跳转到sdram的main()
3、简述ISO OSI的物理层Layer1,链路层Layer2,网络层Layer3的任务。
物理层的主要任务:
(1) 数据端设备提供传送数据的通路,数据通路可以是一个物理媒体,也可以是多个物理媒体连接而成.一次完整的数据传输,包括激活物理连接,传送数据,终止物理连接.所谓激活,就是不管有多少物理媒体参与,都要在通信的两个数据终端设备间连接起来,形成一条通路.
(2) 传输数据.物理层要形成适合数据传输需要的实体,为数据传送服务.一是要保证数据能在其上正确通过,二是要提供足够的带宽(带宽是指每秒钟内能通过的比特(BIT)数),以减少信道上的拥塞.传输数据的方式能满足点到点,一点到多点,串行或并行,半双工或全双工,同步或异步传输的需要.
(3) 完成物理层的一些管理工作.
链路层的主要任务:链路层是为网络层提供数据传送服务的,这种服务要依靠本层具备的功能来实现。
(1) 链路链接的建立、拆除、分离。
(2) 帧定界和帧同步.链路层的数据传输单元是帧,协议不同,帧的长短和界面也有差别,但无论如何必须对帧进行定界.
(3) 顺序控制,指对帧的收发顺序的控制.
(4) 差错检测和恢复
网络层为建立网络连接和为上层提供服务
4、有线电话和无线电话有何区别?无线电话特别需要注意的是什么?
有线电话有线,只能在线的范围内移动,无线电话没有线的限制,有信号就可以。无线电话特别需要注意信道的干扰。
5、软件开发五个主要step是什么?
需求分析、系统设计、系统编码、测试运行、升级维护
6、你在开发软件的时候,这5个step分别占用的时间百分比是多少?
需求分析大概在30%、系统设计在15%、系统编码在40%、测试运行在5%、升级维护在10%
7、makefile文件的作用是什么?
makefile文件保存了编译器和连接器的参数选项,还表述了所有源文件之间的关系(源代码文件需要的特定的包含文件,可执行文件要求包含的目标文件模块及库等).创建程序(make程序)首先读取makefile文件,然后再激活编译器,汇编器,资源编译器和连接器以便产生最后的输出,最后输出并生成的通常是可执行文件.创建程序利用内置的推理规则来激活编译器,以便通过对特定CPP文件的编译来产生特定的OBJ文件.
8、UNIX显示文件夹中,文件名的命令是什么?能使文件内容显示在屏幕的命令是什么 ?
(1) l、lc、ls这三个命令都可以显示文件名,只是显示方式不同
(2) cat、more、vi都能显示文件内容,也是显示方式不同
9、手机用户在从一个基站漫游到另一个基站的过程中,都会发生什么?
在退出当前基站前,在下一个基站注册,当注册完毕开启新的信道后,从上一个基站退出。
六、小结
1、OSI七层模型以及TCP/IP四层模型的名称以及各层的主要功能。
OSI七层模型结构图如图1所示。
图1 OSI七层模型
物理层 : O S I 模型的最低层或第一层,该层包括物理连网媒介,如电缆连线连接器。物理层的协议产生并检测电压以便发送和接收携带数据的信号。在你的桌面P C 上插入网络接口卡,你就建立了计算机连网的基础。换言之,你提供了一个物理层。尽管物理层不提供纠错服务,但它能够设定数据传输速率并监测数据出错率。网络物理问题,如电线断开,将影响物理层。
数据链路层: O S I 模型的第二层,它控制网络层与物理层之间的通信。它的主要功能是如何在不可靠的物理线路上进行数据的可靠传递。为了保证传输,从网络层接收到的数据被分割成特定的可被物理层传输的帧。帧是用来移动数据的结构包,它不仅包括原始数据,还包括发送方和接收方的网络地址以及纠错和控制信息。其中的地址确定了帧将发送到何处,而纠错和控制信息则确保帧无差错到达。数据链路层的功能独立于网络和它的节点和所采用的物理层类型,它也不关心是否正在运行Word、Excel或使用Internet 。有一些连接设备,如交换机,由于它们要对帧解码并使用帧信息将数据发送到正确的接收方,所以它们是工作在数据链路层的。
网络层: O S I 模型的第三层,其主要功能是将网络地址翻译成对应的物理地址,并决定如何将数据从发送方路由到接收方。网络层通过综合考虑发送优先权、网络拥塞程度、服务质量以及可选路由的花费来决定从一个网络中节点A 到另一个网络中节点B 的最佳路径。由于网络层处理路由,而路由器因为即连接网络各段,并智能指导数据传送,属于网络层。在网络中,“路由”是基于编址方案、使用模式以及可达性来指引数据的发送.
传输层: O S I 模型中最重要的一层。传输协议同时进行流量控制或是基于接收方可接收数据的快慢程度规定适当的发送速率。除此之外,传输层按照网络能处理的最大尺寸将较长的数据包进行强制分割。例如,以太网无法接收大于1 5 0 0 字节的数据包。发送方节点的传输层将数据分割成较小的数据片,同时对每一数据片安排一序列号,以便数据到达接收方节点的传输层时,能以正确的顺序重组。该过程即被称为排序。工作在传输层的一种服务是 T C P / I P 协议套中的T C P (传输控制协议),另一项传输层服务是I P X / S P X 协议集的S P X (序列包交换)。
会话层: 负责在网络中的两节点之间建立和维持通信。 会话层的功能包括:建立通信链接,保持会话过程通信链接的畅通,同步两个节点之间的对 话,决定通信是否被中断以及通信中断时决定从何处重新发送。你可能常常听到有人把会话层称作网络通信的“交通警察”。当通过拨号向你的 I S P (因特网服务提供商)请求连接到因特网时,I S P 服务器上的会话层向你与你的P C 客户机上的会话层进行协商连接。若你的电话线偶然从墙上插孔脱落时,你终端机上的会话层将检测到连接中断并重新发起连接。会话层通过决定节点通信的优先级和通信时间的长短来设置通信期限。
表示层: 应用程序和网络之间的翻译官,在表示层,数据将按照网络能理解的方案进行格式化;这种格式化也因所使用网络的类型不同而不同。表示层管理数据的解密与加密,如系统口令的处理。例如:在 Internet上查询你银行账户,使用的即是一种安全连接。你的账户数据在发送前被加密,在网络的另一端,表示层将对接收到的数据解密。除此之外,表示层协议还对图片和文件格式信息进行解码和编码。
应用层: 负责对软件提供接口以使程序能使用网络服务。术语“应用层”并不是指运行在网络上的某个特别应用程序 ,应用层提供的服务包括文件传输、文件管理以及电子邮件的信息处理。
TCP/IP四层模型如图2所示:
图2 TCP/IP四层模型
实际应用中往往采取折中的办法,即综合OSI和TCP/IP的优点,采用一种只有五层协议的体系结构。即应用层、传输层、网络层、数据链路层和物理层。具体每个层的功能如下:
(1) 应用层:确定了进程(正在运行的程序)之间通信性质以满足用户的需要。它提供应用进程所需信息交换以及用户代理语义上有意义信息交换所需功能。常用HTTP、FTP等属于应用层协议。
(2) 传输层:负责主机中两个进程之间通信,传输单位是报文段。运输层具有复用和分用功能。即运输层中的多个进程可复用下面网络层功能。到了主机的网络层后,再使用分用功能,将数据交给相应的进程.可分为面向连接的TCP和无连接的UDP协议
(3) 网络层:为分组交换网上的不同主机提供通信。传输单位为分组。路由选择是网络层的主机功能。该层为无连接的,不可靠的协议。
(4) 数据链路层:在两个相邻结点间线路上无差错地传送以帧为单位的数据。每一帧包括数据和必要控制信息,其控制信息包括:同步信息、地址信息、差错控制以及流量控制信息等。链路层把一条有可能出差错的实际链路,转变为让网络层向下看上去好像是一条不出差错的链路。
(5) 物理层:透明地传送比特流。在物理层上所传送的单位是比特。
注意:传递信息所利用的一些物理媒体如双绞线、同轴电缆不包括在该层内,透明含义:某一实际存在的事物看起来好像并不存在一样。“透明地传送比特流”表示经实际电路传送后的比特流没有发生变化。
数据传送过程如图3所示:
图3 两台主机数据传输过程
2、对某些C/C++的API函数进行重写。
这部分内容的解题方式主要要了解算法的核心思想即可。