suningin华为招聘--前人经验(1)
这篇文章是写给2007届的毕业生的,我想我这些日子的经历应该能给2007届的师弟和师妹们将来的校园招聘提供点帮助。
一、准备阶段:
在华为面试之前,我把《软件设计师教程》大概的复习了一遍,时间实在太紧迫了,有些概念我也只是很粗糙地掠过去。10号下午还到图书馆借了一本《程序员面试攻略》,11号下午就差不多把那本书大概地啃完。
二、笔试:
11号,收到短信通知当晚7:00在E栋笔试(只要是注册了电子简历的同学都有资格),考试种类分两种:硬件和软件,共四类题:填空,选择,改错,程序设计。基本上都是一些C/C++语言题,数据结构的树的前序、中序及后序排列,计算机网络里的IP报文中的TTL(Time to live),数据库的操作等等;程序题有两道,一道题是关于数据结构的,另外有一道是“字符串A插入字符串B中”。虽然都基础,但题量太大,考试时间太短。大家都在喊没信心。
三、面试:
第二天就有人接到通知去面试了,我们班一位同学去了,他很牛B,从第一轮到第四轮一
直很顺利。我是第三天才和我们寝室另外的一位同学才接到面试通知的(不过我听说我们这一批接到通知的笔试分数普遍都很高),当然在前三天的等待时间里,我心情很郁闷,我还以为我没有慧通的面试资格了,所以一直在玩,希望有时真的是期而不遇,遇而不期阿。(其实笔试这一轮刷的人不多,大家以后没必要像我这样子提前就爆弃了)
我下午4:00准时到凯莱大酒店,一进去就感觉一股热气,大厅里也许是因为太热或者太紧张的缘故,每个人的脸都很红,很红。大概等了半个小时,我的心也跳得好厉害,我就到门口舒缓下情绪,很快一位帅哥就领我去第一轮面试了,他问我会什么,**,这问题该怎么答阿,然后我说我是电子科学与技术专业的,计算机基本上是靠自学的,大概他体会到自学的不易,他给我出了5道编程题,虽然很多,但基本上都不很难。(我一同专业的哥们虽然只有一道题,但却是用C语言编桌球的运动轨迹,妈啊,对于C语言的图像功能我都没接触到过阿),我的题目是:
1、1到100之间的所有素数之和;
2、队列的实现;
3、选首领(有一群人围在一圈,从第一个人开始数1、2、3,数到3者退出,用循环链表实现)
4、字符串匹配问题(int countABC(* s) 输入任何一串字符串,计算机其中有连续ABC子字符串的个数 )
5、用数组存储超大数的问题。
6、询问我操作系统的进程和线程的区别
幸好这些题目在笔试前我就都已经见过了,虽然第四个题目,面试老师说我执行效率不高,但可以过得去了。哈哈,他直接通知我去进行第二轮面试了。
第二轮是资格面试,没多大问题,就聊聊家乡,聊聊自己的情况,这一关只要说话有分寸,一般都可以通过。第二轮面试完,就快到了晚饭的时间了,晚饭当然是慧通免费提供的,晚饭一过后,我就被一被称作是部长的面试官叫了进去,这一关一进去他直接拿了我《软件设计书》提问我:
1、ping命令使用的是哪种报文?
2、OSI分哪几个层,IP是在哪个层?
3、哈希表的问题
4、为什么要采取二叉树这种数据结构?(折半查找)
5、两台计算机中的进程怎么互相通信,我说通过IP呗,他说除了IP呢?我卡住了,他说你听说过五元组吗?我只好老老实实的回答说不知道,然后他在那里给我解释一通,但我还是没搞明白,回来翻潘爱民老师的《计算机网络书》
也没有。这一轮虽然第5个问题我有点卡壳,但老师说我毕竟是自学,还表扬了我,说我已经很不错了。面试完已经好晚了,华为的MM通知我第二天继续去进行第四轮的面试。
第二天,我按时到了考试地点,这一天,明显感觉气氛没有第一天的好,垂头丧气的好多。很快就通知我去面试了,这一轮面试的老师明显态度比前几轮差多了,问的问题都有点让我透不过气来,但终于挺了过去,最后他直接点到桌子上
的一个题目:
void main()
{
char *p;
*p=-130;
printf("%d",*p);
}
正确的答案是126,原因:-130在计算机里面存储形式是11111111-01111110(取反码的形式),因为C里面的CHAR是8位的,所以,最高位1去掉,剩下01111110。
四、些许体会
面试,就是面试,不是学习,考试。你现在会多少东西固然重要,但更重要的是你得
让面试官知道,所以面试时把你的知识表达出来是最重要的。切记!面试表达是关键,你
可以先把自己熟悉的整理一下,不至于面试的时候磕磕碰碰的。面试,好比下棋。把握局
面,掌握主动权是关键。一旦你把面试官成功引入你的领地,让他把注意力关注在你熟悉
的领域,无暇自顾,那就尽情发挥吧,已经成功了一大半。所以从面试官拿到你的简历起
,就主动出击,别给他机会.另外,在大肆开学初,一定要把各位的专业课翻出来看看,考软件的特别要多多看看基础的C语言,想找到好工作一定要从骨子里面重视起来。
1、1到100之间的所有素数之和;
int i = 1;
int j = 0;
bool change= 1;
int sum = 0;
for (i=1; i<100; i++)
{ for (j=2; j
{ if(i%j= =0)
{ change = 0;
break; 跳出J循环,I+1继续判断
}
}
if(change= =1)
sum +=i;
change = 1;
}
printf("%d\n",sum);
2、队列的实现;(用数组或者链表,定义好输入和输出即可)
3、选首领(有一群人围在一圈,从第一个人开始数1、2、3,数到3者退出,用循环链表实现)
n个人围成一圈,从第一个人开始依次从1到m循环报数,当报到m的时候此人出圈,直到圈 中只剩一人为止.求最后一个人的原始编号。
int yuesefu(int n, int m)
{ int i,r=0;
for (i=2;i<=n;i++) r=(r+m)%i;
return r+1;
}
//上面看不懂,程心建注释
4、字符串匹配问题(int countABC(* s) 输入任何一串字符串,计算机其中有连续ABC子字符 串的个数 )
int countABC(* s)
{
int i = 0;
int j = 0;
int num = 0;
scanf("%s",s);
int len = strlen(s);
for (i=0; i { j = strcmp(s+i,"ABC"); if(j= =0) num++; } } 5、用数组存储超大数的问题。 这是数组得一个应用,思想是我们定义一个数组,让每一个元素得值都是从后到前以十 进制得方式存贮得,如过到了9下一位就要让前一个元素进位为1,9变为0同时。 下面这个例子是要求一个40位的 n!的值 int data[40];//存储40位书的整数数组 int digit;//数据位数变量 int i,j,r,k; int n;//用户输入值 for(i=1; i<40+1; i++) data[i]=0; data[0]=data[1]=1; digit=1; printf("enter a number :"); scanf("%d",&n); for(i=1; i { for(j=1; j data[j]*=i; for(j=1; j { if(data[j]>10) { for(r=1; r { if(data[digit]>10)//大于10时候位数加1 digit++; data[r+1]+=data[r]/10;//进位增加 data[r]=data[r]%10;//去掉进位后得值 } } } printf("%d! = ",i); for(k =digit; k>0; k--) printf("%d",data[k]); printf("\n"); } 6、询问我操作系统的进程和线程的区别 进程和线程都是由操作系统所体会的程序运行的基本单元,系统利用该基本单元 实现系统对应用的并发性。进程和线程的区别,简而言之:一个程序至少有一个进程,一个进程至少有一个线程. 线程的划分尺度小于进程,使得多线程程序的并发性高。 另外,进程在执行过程中拥有独立的内存单元,而多个线程共享内存,从而极大 地提高了程序的运行效率。 1、ping命令使用的是哪种报文? PING命令使用ICMP的哪种code类型:Echo reply(回显请求报文) 2、OSI分哪几个层,IP是在哪个层? osi:物理层、链路层、网络层、传输层、会话层、管理层、应用层。 tcp/ip:主机网络层、互联层、传输层、应用层。ip是在互联层 3、哈希表的问题 主要用于快速查找检索方面 4、为什么要采取二叉树这种数据结构? 他折半查找,可以减少查找比较次数 5、五元组 二元组的定义: 三元组的定义: 五元组的定义: V是值的集合,O是操作的集合,G是构成名字的文法,M是存储的集合,S是从G能构成的名字 几个到M的映射. iP报文中的五元组(即源IP地址,源端口号,目的IP地址,目的端口,协议)。 半相关 综上所述,网络中用一个三元组可以在全局唯一标志一个进程: (协议,本地地址,本地端口号) 这样一个三元组,叫做一个半相关(half-association),它指定连接的每半部分。 全相关 一个完整的网间进程通信需要由两个进程组成,并且只能使用同一种高层协议。也就是 说,不可能通信的一端用TCP协议,而另一端用UDP协议。因此一个完整的网间通信需要 一个五元组来标识: (协议,本地地址,本地端口号,远地地址,远地端口号) 这样一个五元组,叫做一个相关(association),即两个协议相同的半相关才能组合 成一个合适的相关,或完全指定组成一连接。 suningin详解华为面试试题(1) 1.怎么判断 float a 是 0? (if (a>-1e-6)&&a<1e-6) 判断= =0 if(x < -0.000001 && x > 0.000001)判断!=0 1e-6=1*(10的-6次方 sizeof(a)=800 sizeof(a[2])=8 这里要注意如果数组名作为函数的形参后,它就是一个普通的指针了这时sizeof (a)=4指针占4位(后面有) 32位系统中,字符型占1字节,整型占4字节,短整型占2字节,浮点型占4字节,双精度占8字节。 (静态存储区中) 共有四轮面试: 问题一:两笔记本电脑连起来后拼不通,你觉得可能有哪些问题? 问题二:我们在南京,和深圳的网络是通的,但和北京的网络不通, 你以怎样的顺序检查问题? 问题三:解释什么叫"透明"?什么叫"网格"? 问题四:交换和路由的区别?VLAN的特点? 问题五:画一个积分电路和一个微分电路。 问题六:知道现在的路由器是第几代了吗? 问题一:两笔记本电脑连起来后ping不通,你觉得可能有哪些问题可能的原因大体有以下几个: 1、网线不通; 2、某台笔记本上的tcp/ip协议安装的不完整; 3、ip地址配置有问题(不在一个网段上); 4、某台笔记本上有防火墙,把icmp端口给屏蔽了(端口号:139)。 这个题的我是从osi模型上入手,从物理层往上一层层排除。 问题二:我们在南京,和深圳的网络是通的,但和北京的网络不通,你以怎样的顺序检查问题? 我设想的顺序是按照由近及远的顺序进行测试,如果是有的话,只要确定两端和本 地网络提供支持的公司之间的网络是连通的,其他的就交个那个公司来做了,如果是自 己维护的基于ddn一类的点对点网络,那么找到路由表,从最近的路由器开始ping吧。 问题三:解释什么叫“透明”?什么叫“网格”? 关于透明,我的理解就是一种开放的通信,意味着应用程序可以与网络上它所知道地址的其它任何应用程序连接并会话,而在这个网络上的所有中间设备不会干扰应用程序之间的信息交换。 关于网格,就是把网络上所有的计算机进行整合使其成一台超级计算 机,实现计算能力、存储容量、数据和信息资源等全方位的共享。 网格作为一种能带来巨大处理、存储能力和其他IT资源的新型网络,可以应付临时之用。网格计算通过共享网络将不同地点的大量计算机相联,从而形成虚拟的超级计算机,将各处计算机的多余处理器能力合在一起,可为研究和其他数据集中应用提供巨大的处理能力。有了网格计算,那些没有能力购买价值数百万美元的超级计算机的机构,也能利用其巨大的计算能力。 问题四:交换和路由的区别?VLAN的特点? 交换技术和路由技术的最大区别在于他们寻址的方式以及报文的转发方式上,交换技术是发生在2层也就是数据链路层上,是直接利用mac地址建立会话;路由技术发生在网络层,需要通过ip地址建立路由表,然后进行数据通信。在报文的转发方式上,交换技术 是使用先收再转,路由技术是采用边收边转。 vlan(虚拟局域网)的主要特点就是安全,信息只到达应该到达的地点。因此,防止了大部分基于网络监听的入侵手段。通过虚拟网设置的访问控制,使在虚拟网外的网络节点不能直接访问虚拟网内节点。 问题五:画一个积分电路和一个微分电路。 这个题目这里不好给出图片,呵呵,我还不会弄图片,大家可以查看电子书就好了,相信电子通信的朋友都知道的。 问题六:知道现在的路由器是第几代了吗? 第几代是华为公司提出的概念 第三代是基于分布式处理系统,软件转发,如华为的NE16E/08E/05,CISCO 7200/7500。 第四代是基于分布式处理系统,ASIC硬件转发,如CISCO 12000 第五代是基于分布式处理系统,NP硬件转发,如华为的NE80。 第六代是基于集群系统,啥转发的不知道,例子也不知道。 还有一种回答,大家也参考一下: 从体系结构上看,路由器可以分为 第一代单总线单CPU结构路由器 第二代单总线主从CPU结构路由器 第三代单总线对称式多CPU结构路由器 第四代多总线多CPU结构路由器 第五代共享内存式结构路由器 第六代交叉开关体系结构路由器和基于机群系统的路由器等多类。 suningin详解华为面试试题(2)(本科生)华为面试题 1:OSI七层网络结构:物理层、数据链路层、网络层、传输层、会话层、表示层、应用层。 TCP/IP五层结构:物理层、数据链路层、互联层、传输层、应用层。 四层 :主机-网络层、互联层、传输层、应用层。 2:TCP/IP是一个协议集,对英特网中主机的寻址方式,主机的命名机制,信息的传输规则,以及各种服务功能作了约定. IP协议是英特网中的交通规则,连入英特网中的每台计算机及处于十字路口的路由器都必须熟知和遵守该交通规则。IP运行于互联层。屏蔽各个物理网络的细节和差异。 TCP:传输控制协议,运行于传输层。利用IP层提供的服务,提供端到端的可靠的(TCP)服务. UDP:用户数据报协议,运行于传输层。利用IP层提供的服务,提供端到端的不可靠的(UDP)服务。 3:一般意义上说交换机是工作在数据链路层。但随着科技的发展,现在有了三层交换机,三层交换机已经扩展到了网络层。也就是说:它等于“数据链路层 + 部分网络层”。交换机中传的是帧。通过存储转发来实现的。 路由器是工作在网络层。路由器中传的是IP数据报。主要是选址和路由。 交换机属于OSI第二层即数据链路层设备。它根据MAC地址寻址,通过站表选择路由,站表的建立和维护由交换机自动进行。 路由器属于OSI第三层即网络层设备,它根据IP地址进行寻址,通过路由表路由协议产生。 交换机最大的好处是快速,路由器最大的好处是控制能力强。 4.比较“C++的类”和“C的struct”的区别没什么意思,他们的区别太大了,至少C的struct不能有成员函数。 比较“C++的类”和“C++的struct”还有点意思。主要体现在: (1)class的默认成员访问权限是private,而struct是public; (2)从class的的默认继承是private继承,从struct的默认继承是public继承。(Union是protected继承)。 5.置于“~”是析构函数;析构函数因使用"~"符号(逻辑非运算符),表示它为逆构造函数,加上类名称来定义;析构函数也是特殊的类成员函数,它没有返回类型,没有参数,不能随意调用,也没有重载,只有在类对象的生命期结束的时候,由系统自动调用。 有适放内存空间的做用! 虚函数是C++多态的一种表现 例如:子类继承了父类的一个函数(方法),而我们把父类的指针指向子类,则必须把父类的该函数(方法)设为virtual(虚函数)。 使用虚函数,我们可以灵活的进行动态绑定,当然是以一定的开销为代价。 如果父类的函数(方法)根本没有必要或者无法实现,完全要依赖子类去实现的话,可以把此函数(方法)设为virtual 函数名=0 ;我们把这样的函数(方法)称为纯虚函数。如果一个类包含了纯虚函数,称此类为抽象类 6.全局变量是整个程序都可访问的变量,谁都可以访问,生存期在整个程序从运行到结束(在程序结束时所占内存释放),而局部变量存在于模块(子程序,函数)中,只有所在模块可以访问,其他模块不可直接访问,模块结束(函数调用完毕),局部变量就消失,所占据的内存释放。 操作系统和编译器,可能是通过内存分配的位置来知道的,全局变量分配在全局数据段并且在程序开始运行的时候被加载。局部变量则分配在堆栈里面 。 8.8086的机器字长是16位,8086使用40个引脚的16个做地址/数据复用引腿来传输数据,一次读写过程由一个基本总线周期完成,它由4个时钟(CLK)周期组成,按时间顺序定义为T1、T2、T3、T4。在T1期间8086发出访问目的地的地址信号和地址锁存选通信号ALE;T2期间发出读写命令信号RD、WR及其它相关信号;T3期间完成数据的访问;T4结束该总线周期。可见,地址与数据信号不会同时出现在一个时钟(CLK)周期,二者可以分时复用同一组引线。 suningin详解华为笔试题(1) suningin解答的华为笔试题 1.写出判断ABCD四个表达式的是否正确, 若正确, 写出经过表达式中 a的值(3分) int a = 4; (A) a += (a++); (B) a += (++a) ; (C) (a++) += a; (D) (++a) += (a++); a = ? 答:C错误,左侧不是一个有效变量,不能赋值,可改为(++a) += a;改后答案依次为9,10,10,11 a++是先运算完了 A再加1;++a是先加1在运算,二者好像都不能单独作为左值 2.某32位系统下, C++程序,请计算sizeof 的值(5分). char str[] = “www.ibegroup.com” char *p = str ; int n = 10; 请计算 sizeof (str ) = ?(1) sizeof ( p ) = ?(2) sizeof ( n ) = ?(3) void Foo ( char str[100]){ 请计算 sizeof( str ) = ?(4) void *p = malloc( 100 ); 请计算 sizeof ( p ) = ?(5) 答:(1)17 (2)4 (3) 4 (4)4 (5)4 字符串结束标志符为\0,一般不写,系统默认占1位,32位系统中,字符型占1字节,整型占4字节,短整型占2字节,浮点型占4字节,双精度占8字节,指针占4位;这里要注意如果数组名作为函数的形参后,它就是一个普通的指针了这时sizeof(a)=4, 3. 回答下面的问题. (4分) (1).头文件中的 ifndef/define/endif 干什么用?预处理 答:防止头文件被重复引用 (2). #include 《filename.h》和 #include “filename.h” 有什么区别? 答:前者用来包含开发环境提供的库头文件,后者用来包含自己编写的头文件。查找的 (3).在C++ 程序中调用被C 编译器编译后的函数,为什么要加 extern “C”声明? 答:函数和变量被C++编译后在符号库中的名字与C语言的不同,被extern "C"修饰的变量和函数是按照C语言方式编译和连接的。由于编译后的名字不同,C++程序不能直接调用C 函数。C++提供了一个C 连接交换指定符号extern“C”来解决这个问题。 (4). switch()中不允许的数据类型是? 答:实型 4. 回答下面的问题(6分) (1).Void GetMemory(char **p, int num) { *p = (char *)malloc(num);} void Test(void) { char *str = NULL; GetMemory(&str, 100); strcpy(str, "hello");由后面的串复制得前面的串 printf(str); } 请问运行Test 函数会有什么样的结果? 答:输出“hello” (2). void Test(void) { char *str = (char *) malloc(100); strcpy(str, “hello”); free(str); free掉的只是内存,并非指针本身,指针要在赋值为空在真正不存在 if(str != NULL) { strcpy(str, “world”); printf(str); } } 请问运行Test 函数会有什么样的结果? 答:输出“world” 正确,str经过Free后必须手工赋值为NULL,内存已经释放了,str现在是一个野指针,所以,要养成释放后,指针赋零的习惯,使用前变量初始化;free是释放申请的内存空间,释放了之后该变量的值是一个随机值,因而需要自己赋NULL;就象某个人死了,但是没有去派出所去注销户口, 结果你去查,发现他还"活着"~~~~~~~~~`于是你想给他打电话,就见鬼了啊--------程序死了 (3). char *GetMemory(void) { char p[] = "hello world"; return p; } void Test(void) { char *str = NULL; str = GetMemory(); printf(str); } 请问运行Test 函数会有什么样的结果? 答:无效的指针,输出不确定 char p[] = "hello world"; void GetMemory( char *p ) 请问运行Test 函数会有什么样的结果? 程心建注释//不能通过编译,编译报错是某些内存区的内容不确定。 传入中GetMemory( char *p )函数的形参为字符串指针,在函数内部修改形参并不能真正的改变传入形参的值,执行完char *str = NULL;GetMemory( str );后的str仍然为NULL; 再看看下面的一段程序有什么错误 swap( int* p1,int* p2 ) 在swap函数中,p是一个“野”指针,有可能指向系统区,导致程序运行的崩溃。在VC++中DEBUG运行时提示错误“Access Violation”。该程序应该改为: swap( int* p1,int* p2 ) 5.编写strcat函数(6分) 已知strcat函数的原型是char *strcat (char *strDest, const char *strSrc); 其中strDest 是目的字符串,strSrc 是源字符串。 (1)不调用C++/C 的字符串库函数,请编写函数 strcat 答: VC源码: char * __cdecl strcat (char * dst, const char * src) { char * cp = dst; while( *cp ) cp++; /* find end of dst */ while( *cp++ = *src++ ) ; /* Copy src to end of dst */ return( dst ); /* return dst */ } (2)strcat能把strSrc 的内容连接到strDest,为什么还要char * 类型的返回值? 答:方便赋值给其他变量 6.MFC中CString是类型安全类么? 答:不是,其它数据类型转换到CString可以使用CString的成员函数Format来转换 7.C++中为什么用模板类。 答:(1)可用来创建动态增长和减小的数据结构 (2)它是类型无关的,因此具有很高的可复用性。 (3)它在编译时而不是运行时检查数据类型,保证了类型安全 (4)它是平台无关的,可移植性 (5)可用于基本数据类型 8.CSingleLock是干什么的。 答:同步多个线程对一个数据类的同时访问 9.NEWTEXTMETRIC 是什么。Newtextmetric 答:物理字体结构,用来设置字体的高宽大小 10.程序什么时候应该使用线程,什么时候单线程效率高。 答:1.耗时的操作使用线程,提高应用程序响应 2.并行操作时使用线程,如C/S架构的服务器端并发线程响应用户的请求。 3.多CPU系统中,使用线程提高CPU利用率 4.改善程序结构。一个既长又复杂的进程可以考虑分为多个线程,成为几个独立或半独立的运行部分,这样的程序会利于理解和修改。 其他情况都使用单线程。 11.Windows是内核级线程么。 答:见下一题 12.Linux有内核级线程么。 答:线程通常被定义为一个进程中代码的不同执行路线。从实现方式上划分,线程有两种类型:“用户级线程”和“内核级线程”。 用户线程指不需要内核支持而在用户程序中实现的线程,其不依赖于操作系统核心,应用进程利用线程库提供创建、同步、调度和管理线程的函数来控制用户线程。这种线程甚至在象 DOS 这样的操作系统中也可实现,但线程的调度需要用户程序完成,这有些类似 Windows 3.x 的协作式多任务。另外一种则需要内核的参与,由内核完成线程的调度。其依赖于操作系统核心,由内核的内部需求进行创建和撤销,这两种模型各有其好处和缺点。用户线程不需要额外的内核开支,并且用户态线程的实现方式可以被定制或修改以适应特殊应用的要求,但是当一个线程因 I/O 而处于等待状态时,整个进程就会被调度程序切换为等待状态,其他线程得不到运行的机会;而内核线程则没有各个限制,有利于发挥多处理器的并发优势,但却占用了更多的系统开支。 Windows NT和OS/2支持内核线程。Linux 支持内核级的多线程 13.C++中什么数据分配在栈或堆中,New分配数据是在近堆还是远堆中? 答:栈: 存放局部变量,函数调用参数,函数返回值,函数返回地址。由系统管理 堆: 程序运行时动态申请,new 和malloc申请的内存就在堆上 14.使用线程是如何防止出现大的波峰。 答:意思是如何防止同时产生大量的线程,方法是使用线程池,线程池具有可以同时提高调度效率和限制资源使用的好处,线程池中的线程达到最大数时,其他线程就会排队等候。 15函数模板与类模板有什么区别? 答:函数模板的实例化是由编译程序在处理函数调用时自动完成的,而类模板的实例化必须由程序员在程序中显式地指定。 16一般数据库若出现日志满了,会出现什么情况,是否还能使用? 答:只能执行查询等读操作,不能执行更改,备份等写操作,原因是任何写操作都要记录日志。也就是说基本上处于不能使用的状态。 17 SQL Server是否支持行级锁,有什么好处? 答:支持,设立封锁机制主要是为了对并发操作进行控制,对干扰进行封锁,保证数据的一致性和准确性,行级封锁确保在用户取得被更新的行到该行进行更新这段时间内不被其它用户所修改。因而行级锁即可保证数据的一致性又能提高数据操作的迸发性。 19 关于内存对齐的问题以及sizeof()的输出 答:编译器自动对齐的原因:为了提高程序的性能,数据结构(尤其是栈)应该尽可能地在自然边界上对齐。原因在于,为了访问未对齐的内存,处理器需要作两次内存访问;然而,对齐的内存访问仅需要一次访问。 20 int i=10, j=10, k=3; k*=i+j; k最后的值是? 答:60,此题考察优先级,实际写成: k*=(i+j);,赋值运算符优先级最低 21.对数据库的一张表进行操作,同时要对另一张表进行操作,如何实现? 答:将操作多个表的操作放入到事务中进行处理 22.TCP/IP 建立连接的过程?(3-way shake) 答:在TCP/IP协议中,TCP协议提供可靠的连接服务,采用三次握手建立一个连接。 第一次握手:建立连接时,客户端发送syn包(syn=j)到服务器,并进入SYN_SEND状态,等待服务器确认; 第二次握手:服务器收到syn包,必须确认客户的SYN(ack=j+1),同时自己也发送一个SYN包(syn=k),即SYN+ACK包,此时服务器进入SYN_RECV状态; 第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=k+1),此包发送完毕,客户端和服务器进入ESTABLISHED状态,完成三次握手。 23.ICMP是什么协议,处于哪一层? 答:Internet控制报文协议,处于网络层(IP层) 24.触发器怎么工作的? 答:触发器主要是通过事件进行触发而被执行的,当对某一表进行诸如UPDATE、 INSERT、 DELETE 这些操作时,数据库就会自动执行触发器所定义的SQL 语句,从而确保对数据的处理必须符合由这些SQL 语句所定义的规则。 25.winsock建立连接的主要实现步骤? 答:服务器端:socker()建立套接字,绑定(bind)并监听(listen),用accept()等待客户端连接。 客户端:socker()建立套接字,连接(connect)服务器,连接上后使用send()和recv(),在套接字上写读数据,直至数据交换完毕,closesocket()关闭套接字。 服务器端:accept()发现有客户端连接,建立一个新的套接字,自身重新开始等待连接。该新产生的套接字使用send()和recv()写读数据,直至数据交换完毕,closesocket()关闭套接字。 26.动态连接库的两种方式? 答:调用一个DLL中的函数有两种方法: 1.载入时动态链接(load-time dynamic linking),模块非常明确调用某个导出函数,使得他们就像本地函数一样。这需要链接时链接那些函数所在DLL的导入库,导入库向系统提供了载入DLL时所需的信息及DLL函数定位。 2.运行时动态链接(run-time dynamic linking),运行时可以通过LoadLibrary或LoadLibraryEx函数载入DLL。DLL载入后,模块可以通过调用GetProcAddress获取DLL函数的出口地址,然后就可以通过返回的函数指针调用DLL函数了。如此即可避免导入库文件了。 27.IP组播有那些好处? 答:Internet上产生的许多新的应用,特别是高带宽的多媒体应用,带来了带宽的急剧消耗和网络拥挤问题。组播是一种允许一个或多个发送者(组播源)发送单一的数据包到多个接收者(一次的,同时的)的网络技术。组播可以大大的节省网络带宽,因为无论有多少个目标地址,在整个网络的任何一条链路上只传送单一的数据包。所以说组播技术的核心就是针对如何节约网络资源的前提下保证服务质量。 1、填空选择 1.1 二分法的时间复杂度.(答:log(N)) 1.2 堆栈的工作方式. (答:先进后出表FILO(first in last out )队列为先进先出FIFO) 1.3 循环链表的概念(答:链表的最后一个节点指向第一个节点) 1.4 图的遍历方式. (答:深度优先搜索和广度优先搜索) 1.10 80x86的加减操作最后对标志位的影响 (溢出标志位) 1.12 private, protected, public类型的区别 2、 下列两个编程题任选其一,如果都答去分最低的。(40分) 2.1 对于非负整数0,1,2,....,如果该整数左右对称,我们称该数为回文数,如11, 121, 1331 等,请编一段C程序,查找0到N内所有满足(m, m*m, m*m*m)同时都是回文数的m. #include "stdio.h" #include "stdlib.h" int panduan(int numputin)//判断是不是对称数 { int digit[10];//用于存放每个输入数字的每位位数 int temp = numputin; for(int digitstop=0; digitstop<10; digitstop++)//初始化 { digit[digitstop] = 0;} digitstop=0; while(temp)//取出每位的数值 { digit[digitstop] = temp%10; digitstop++; temp = temp/10 ;}
2.有 double a[100],问 sizeof(a),sizeof(a[2])有什么不同?
double 8位
3.const 型数据在内存中如何存储?
return p;的p[]数组为函数内的局部自动变量,在函数返回后,内存已经被释放。这是许多程序员常犯的错误,其根源在于不理解变量的生存期。
{
p = (char *) malloc( 100 );
}
void Test( void )
{
char *str = NULL;
GetMemory( str );
strcpy( str, "hello world" );
printf( str );
}
{
int *p;
*p = *p1;
*p1 = *p2;
*p2 = *p;
}
{
int p;
p = *p1;
*p1 = *p2;
*p2 = p;
}