读书人

华为口试笔试题集锦

发布时间: 2012-09-06 10:37:01 作者: rapoo

华为面试笔试题集锦

1、局部变量能否和全局变量重名?

  答:能,局部会屏蔽全局。要用全局变量,需要使用"::"

  局部变量可以与全局变量同名,在函数内引用这个变量时,会用到同名的局部变量,而不会用到全局变量。对于有些编译器而言,在同一个函数内可以定义多个同名的局部变量,比如在两个循环体内都定义一个同名的局部变量,而那个局部变量的作用域就在那个循环体内。

2、如何引用一个已经定义过的全局变量?

  答:extern

  可以用引用头文件的方式,也可以用extern关键字,如果用引用头文件方式来引用某个在头文件中声明的全局变量,假定你将那个变量写错了,那么在编译期间会报错,如果你用extern方式引用时,假定你犯了同样的错误,那么在编译期间不会报错,而在连接期间报错。

3、全局变量可不可以定义在可被多个.C文件包含的头文件中?为什么?

  答:可以,在不同的C文件中以static形式来声明同名全局变量,用static声明的变量只限于本文件引用,而不能被其他文件引用。

  可以在不同的C文件中声明同名的全局变量,前提是其中只能有一个C文件中对此变量赋初值,此时连接不会出错。

4、语句for(;1;)有什么问题?它是什么意思?

答:和while(1)相同。

5、do……while和while……do有什么区别?

答:前一个循环一遍再判断,后一个判断以后再循环

6、请写出下列代码的输出内容

  #include<stdio.h>

  main()

  {

   inta,b,c,d;

   a=10;

   b=a++; /* a的值先赋值给b,然后a再自加1*/

   c=++a; /* a先自加1,再赋值给c*/

   d=10*a++;

   printf("b,c,d:%d,%d,%d",b,c,d);

   return 0;

  }

  答:10,12,120

7、static全局变量与普通的全局变量有什么区别?

static局部变量和普通局部变量有什么区别?

static函数与普通函数有什么区别?

全局变量(外部变量)的说明之前再冠以static就构成了静态的全局变量。全局变量本身就是静态存储方式,静态全局变量当然也是静态存储方式。这两者在存储方式上并无不同。这两者的区别虽在于非静态全局变量的作用域是整个源程序,当一个源程序由多个源文件组成时,非静态的全局变量在各个源文件中都是有效的,可以用extern访问。而静态全局变量则限制了其作用域,即只在定义该变量的源文件内有效,在同一源程序的其它源文件中不能使用它。由于静态全局变量的作用域局限于一个源文件内,只能为该源文件内的函数公用,因此可以避免在其它源文件中引起错误。

static局部变量的值在函数调用结束后不消失而保留原值,即占用的储存单元不释放。

  从以上分析可以看出,把局部变量改变为静态变量后是改变了它的存储方式即改变了它的生存期。把全局变量改变为静态变量后是改变了它的作用域,限制了它的使用范围。

  static函数与普通函数作用域不同。仅在本文件。只在当前源文件中使用的函数应该说明为内部函数(static),内部函数应该在当前源文件中说明和定义。对于可在当前源文件以外使用的函数,应该在一个头文件中说明,要使用这些函数的源文件要包含这个头文件

  static全局变量与普通的全局变量有什么区别:static全局变量只初使化一次,防止在其他文件单元中被引用;

  static局部变量和普通局部变量有什么区别:static局部变量只被初始化一次,下一次依据上一次结果值;

  static函数与普通函数有什么区别:static函数在内存中只有一份,普通函数在每个被调用中维持一份拷贝

这里还有一种register变量,一般情况下,变量都是存放在内存中的,而register是存放在寄存器中的,这样提高了执行效率,但只有局部自动变量和形式参数可以作为register变量,局部静态变量不能定义为register变量,如当一些变访问频繁时:

register long i,f=1;

for(i=1;i<=n;++i)

f=f*i;

  8、程序的局部变量存在于(堆栈)中,全局变量存在于(静态区)中,动态申请数据存在于(堆)中。

  9、设有以下说明和定义:

  typedefunion {long i; int k[5]; char c;} DATE;

  struct data{ int cat; DATE cow; double dog;} too;

  DATE max;

  则语句printf("%d",sizeof(struct date)+sizeof(max));的执行结果是:___52____

  答:DATE是一个union,变量公用空间.里面最大的变量类型是int[5],占用20个字节.所以它的大小是20

data是一个struct,每个变量分开占用空间.依次为int4 +DATE20 + double8 = 32.

所以结果是 20 + 32= 52.

  当然...在某些16位编辑器下, int可能是2字节,那么结果是 int2 + DATE10 + double8 = 20

  10、队列和栈有什么区别?

队列先进先出,栈后进先出

  11、写出下列代码的输出内容

  #include<stdio.h>

  int inc(inta)

  {

   return(++a);

  }

  intmulti(int*a,int*b,int*c)

  {

   return(*c=*a**b);

  }

  typedefint(FUNC1)(int in);

  typedefint(FUNC2) (int*,int*,int*);

  voidshow(FUNC2 fun,int arg1, int*arg2)

  {

   INCp=&inc;

   int temp=p(arg1);

   fun(&temp,&arg1,arg2);

   printf("%d\n",*arg2);

  }

  main()

  {

   int a;

   show(multi,10,&a);

   return 0;

  }

  答:110

  12、请找出下面代码中的所以错误

  说明:以下代码是把一个字符串倒序,如“abcd”倒序后变为“dcba”

  1、#include"string.h"

  2、main()

  3、{

  4、 char*src="hello,world";

  5、 char* dest=NULL;

  6、 int len=strlen(src);

  7、 dest=(char*)malloc(len);

  8、 char* d=dest;

  9、 char* s=src[len];

  10、 while(len--!=0)

  11、 d++=s--;

  12、 printf("%s",dest);

  13、 return 0;

  14、}

  答:

  方法1

  int main()

  {

   char* src ="hello,world";

   int len =strlen(src);

   char* dest= (char*)malloc(len+1);//要为\0分配一个空间

   char* d =dest;

   char* s =&src[len-1];//指向最后一个字符

   while(len-- != 0 )

   *dest++=*s--;

   *dest =0;//尾部要加\0

   printf("%s\n",d);

   free(d);//使用完,应当释放空间,以免造成内存汇泄露

   return 0;

}

方法2:

  #include <stdio.h>

  #include <string.h>

  main()

  {

   char str[]="hello,world";

   int len=strlen(str);

   char t;

   for(int i=0; i<len/2; i++)

   {

    t=str[i];

    str[i]=str[len-i-1];

str[len-i-1]=t;

   }

   printf("%s",str);

   return 0;

  }

(1). -1,2,7,28,,126请问28和126中间那个数是什么?为什么?

  第一题的答案应该是4^3-1=63

  规律是n^3-1(当n为偶数0,2,4)n^3+1(当n为奇数1,3,5)

  答案:63

  (2).用两个栈实现一个队列的功能?要求给出算法和思路!

  设2个栈为A,B,一开始均为空.

  入队:

  将新元素push入栈A;

  出队:

  (1)判断栈B是否为空;

  (2)如果不为空,则将栈A中所有元素依次pop出并push到栈B;

  (3)将栈B的栈顶元素pop出;

#include <iostream>#include <stack>using namespace std; template<class T>class queue{public:       void enqueue(const T &data){              s1.push(data);       }       void dequeue(){              if(!s2.empty())                     return s2.pop();              while(!s1.empty()){                     s2.push(s1.top());                     s1.pop();              }           s2.pop();       }       T front(){              if(!s2.empty())                     return s2.top();              while(!s1.empty()){                     s2.push(s1.top());                     s1.pop();              }           return s2.top();       }private:       stack<T> s1,s2;};

  这样实现的队列入队和出队的平摊复杂度都还是O(1),比上面的几种方法要好。

3.在c语言库函数中将一个字符转换成整型的函数是atool()吗,这个函数的原型是什么?

  函数名: atol

  功能:把字符串转换成长整型数

  用法: long atol(const char *nptr);

  程序例:

  

#include <stdlib.h>   #include <stdio.h>   int main(void)   {    long l;    char *str = "98765432";    l = atol(lstr);    printf("string = %s integer = %ld\n", str, l);    return(0);   }

13.对于一个频繁使用的短小函数,在C语言中应用什么实现,在C++中应用什么实现?

  c用宏定义,c++用inline(内联函数)

-------------网络------------------------------------------------------

  14.直接链接两个信令点的一组链路称作什么?

  PPP点到点连接

  

  15.接入网用的是什么接口?

  根据国际电联关于接入网框架建议(G.902),接入网是在业务节点接口(SNI)和用户网络接口(UNI)之间的一系列为传送实体提供所需传送能力的实施系统,可经由管理接口(Q3)配置和管理。因此,接入网可由三个接口界定,即网络侧经由SNI与业务节点相连,用户侧由UNI与用户相连,管理方面则经Q3接口与电信管理网(TMN)相连。

  16.voip都用了那些协议?

目前常用的协议如H.323、SIP、MEGACO和MGCP

-------------------------------------

  17.软件测试都有那些种类?

  黑盒:针对系统功能的测试

  白合:测试函数功能,各函数接口

  18.确定模块的功能和模块的接口是在软件设计的那个队段完成的?

  概要设计阶段

  19.

  enum string

 {

   x1,

   x2,

   x3=10,

   x4,

   x5,

  }x;

  问x= 0x801005,0x8010f4 ;

  20.

  unsigned char *p1;

  unsigned long *p2;

  p1=(unsigned char *)0x801000;

  p2=(unsigned long *)0x810000;

  请问p1+5= 0x801005 ;

    p2+5= ;

P1 = 5 *sizeof(unsigned char) + 0x801000 = 0x801005

p2 = 5 *sizeof(unsighed long) + 0x801000 = 0x801014

  

选择题:

  21.Ethternet链接到Internet用到以下那个协议?B

  A.HDLC;B.ARP;C.UDP;D.TCP;E.ID

 

  22.属于网络层协议的是:B C

   A.TCP;B.IP;C.ICMP;D.X.25

  23.Windows消息调度机制是: C

  A.指令队列;B.指令堆栈;C.消息队列;D.消息堆栈;

  24.

  unsigned short hash(unsigned short key) {

 return (key>>)%256

}

  请问hash(16),hash(256)的值分别是:

   A.1.16;B.8.32;C.4.16;D.1.32

答:首先我们不知道这道题的右移位数是多少,也不知道这道题是不是出题有问题,现在我们来看看答案

首先%256肯定不起作用,因为16%256移动一位以后都小于256,所以只要考虑key> > n即可
我们考虑16=10H,他右移可能的结果是
移动位数,结果
1 8
2 4
3 2
4 1
对比四个答案
A.1.16;B.8.32;C.4.16;D.1.32
A: n=4,带入key=256得到结果是16,match
B: n=1,带入key=256结果是128,不match
C: n=2,带入key=256结果是64,不match
D: n=3,带入key=256结果是16,不match

  找错题:

  25.请问下面程序有什么错误?

  int a[60][250][1000],i,j,k;

  for(k=0;k<=1000;k++)

  for(j=0;j<250;j++)

  for(i=0;i<60;i++)

  a[i][j][k]=0;

  把循环语句内外换一下

  26.

  #define Max_CB 500

  void LmiQueryCSmd(Struct MSgCB * pmsg)

  {

   unsigned char ucCmdNum;

   ......

  for(ucCmdNum=0;ucCmdNum<Max_CB;ucCmdNum++)

   {

    ......;

   }

  unsigned char类型的取值范围为0~255,也就是说ucCmdNum的最大值都才能取到255,所以ucCmdNum是肯定小于500的,这样一来就造成死循环.

  27.以下是求一个数的平方的程序,请找出错误:

  #define SQUARE(a)((a)*(a))

  int a=5;

  int b;

  b=SQUARE(a++);

程序的意思是要得到一个数的平方,但是a++后,a的值会改变,变为7,所以,并不会得到5的平方。

  问答题:

  29.IP Phone的原理是什么?

  IPV6

  30.TCP/IP通信建立的过程怎样,端口有什么作用?

  三次握手,确定是哪个应用程序使用该协议

1、通信网的基本结构形式有五种,以下正确的说法是(C)
A、网型、星型、树型、环型、总线型;
B、网型、星型、线型、复合型、环型;
C、网型、星型、复合型、环型、总线型;
D、网型、环型、线型、复合型、树型。
2、N个节点完全互联的网型网需要的传输电路数为—)
A、N(N-1) B、N
C、N-1 D、1/2N(N-1)
11、TCP/IP分层模型是怎样的,各有什么作用?
应用层:向用户提供一组常用的应用程序
传输层:提供应用程序间的通信
网间网层:负责相邻计算机之间的通信
网络接口
1.static有什么用途?(请至少说明两种)

1)在函数体,一个被声明为静态的变量在这一函数被调用过程中维持其值不变。

2)在模块内(但在函数体外),一个被声明为静态的变量可以被模块内所用函数访问,但不能被模块外其它函数访问。它是一个本地的全局变量。

3)在模块内,一个被声明为静态的函数只可被这一模块内的其它函数调用。那就是,这个函数被限制在声明它的模块的本地范围内使用

2.引用与指针有什么区别?

1)引用必须被初始化,指针不必。

2)引用初始化以后不能被改变,指针可以改变所指的对象。

3)不存在指向空值的引用,但是存在指向空值的指针。

3.描述实时系统的基本特性

在特定时间内完成特定的任务,实时性与可靠性。

4.全局变量和局部变量在内存中是否有区别?如果有,是什么区别?

全局变量储存在静态数据区,局部变量在堆栈。

一个由C/C++编译的程序占用的内存分为以下几个部分

  1、栈区(stack)—由编译器自动分配释放,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。

  2、堆区(heap)—由程序员分配释放,若程序员不释放,程序结束时可能由OS回收。注意它与数据结构中的堆是两回事,分配方式倒是类似于链表。

  3、全局区(静态区)(static)—全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域,未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。程序结束后由系统释放。

  4、文字常量区 — 常量字符串就是放在这里的,程序结束后由系统释放。

  5、程序代码区—存放函数体的二进制代码。

5.什么是平衡二叉树?

左右子树都是平衡二叉树且左右子树的深度差值的绝对值不大于1。

6.堆栈溢出一般是由什么原因导致的?

堆栈溢出就是不顾堆栈中分配的局部数据块大小,向该数据块写入了过多的数据,导致数据越界,结果覆盖了老的堆栈数据。或者解释为在长字符串中嵌入一段代码,并将过程的返回地址覆盖为这段代码的地址,这样当过程返回时,程序就转而开始执行这段自编的代码了。

7.什么函数不能声明为虚函数?

constructor函数不能声明为虚函数。

8.冒泡排序算法的时间复杂度是什么?

时间复杂度是O(n^2)。

9.写出float x 与“零值”比较的if语句。

if(x>0.000001&&x<-0.000001)

10.Internet采用哪种网络协议?该协议的主要层次结构?

Tcp/Ip协议

主要层次结构为:应用层/传输层/网络层/数据链路层/物理层。

11.Internet物理地址和IP地址转换采用什么协议?

ARP (Address Resolution Protocol)(地址解析)

12.IP地址的编码分为哪俩部分?

IP地址由两部分组成,网络号和主机号。不过是要和“子网掩码”按位与上之后才能区分哪些是网络位哪些是主机位。

13.用户输入M,N值,从1至N开始顺序循环数数,每数到M输出该数值,直至全部输出。写出C程序。

#include <stdio.h>#include <stdlib.h> struct number{       int num;       struct number * next;};void main (){       int m, n;       struct number * p, * head=NULL, * tail;        printf("please input M and N:\n");       scanf("%d %d", &m, &n);           //输入M、N值。        for (int i=1; i<=n; i++)               //建立循环链表。       {              p=(struct number *)malloc(sizeof(struct number));              p->num=i;              if(head==NULL){                     head=p;                        tail=p;//注意开始tail也要赋值               }              else                     tail->next=p;              tail=p;       }       tail->next=head;       p = tail;  //从head开始,记录开始的前一个指针       for(;n>0;--n)   //剩下的数的个数为n                                          {       int t = m%n; //防止多数太多圈造成时间浪费                                                for(int j=1; j<t;j++ )      //数到要删的那个数的前一个                                         p=p->next;                  number *q = p->next;  //要删的数的指针                                 printf("%d ", q->num);     //输出要删的数                        p->next = q->next;   //要删的数从链表中去掉                free(q);                  }        printf("\n");
}

14.不能做switch()的参数类型是:

switch后面的括号里面只能放int类型的值,

注意是只能放int类型,但是放byte,short,char类型的也可以

因为byte,short,shar可以自动提升(自动类型转换)为int,

不是说就可以放它们,说白了,你放的byte,short,shar类型,然后他们会自动转换为int类型(宽化,自动转换并且安全),其实最后放的还是int类型!

long不行,是因为long类型不能自动转换为int类型;

上海华为的一道关于指针方面的编程题

int A[nSize],其中隐藏着若干0,其余非0整数,写一个函数int Func(int* A, int nSize),使A把0移至后面,非0整数移至数组前面并保持有序,返回值为原数据中第一个元素为0的下标。(尽可能不使用辅助空间且考虑效率及异常问题,注释规范且给出设计思路)

#include<stdio.h>#define N 10int Func(int *A,int nSize){ int i=0,first=-1,move=0,count=0; for(i=0;i<nSize;i++) //得ì?到ì?零¢?的ì?个?数oy,  if(0==A[i]) { count++; if(-1==first) first=i; }  for(i=0;i<nSize;i++)   if(0==A[i]) move++; //第ì¨2 move 个?零¢?后¨®面?的ì?数oy要°a向¨°前??移°?动?¥move个?位?置?  else A[i-move]=A[i];  for(i=nSize-count;i<nSize;i++) // 数oy组á¨|最á?后¨®的ì?count个?数oy都?为a零¢?  A[i]=0; return first; //返¤|ì回?第ì¨2一°?个?零¢?的ì?下?标à¨o} void main(){ int A[N]={9,1,6,5,0,2,8,4,0,7}; printf("first 0:%d \n",Func(A,N)); for(int i=0;i<N;i++)  printf("%d ",A[i]);}

华为笔试题含答案 [软件工程题]

写一个程序,要求功能:求出用1,2,5这三个数不同个数组合的和为100的组合个数。如:100个1是一个组合,5个1加19个5是一个组合。。。。请用C++语言写。

答案:最容易想到的算法是:

设x是1的个数,y是2的个数,z是5的个数,number是组合数

注意到0<=x<=100,0<=y<=50,0<=z=20,所以可以编程为:

number=0;

for (x=0; x<=100; x++)

for (y=0; y<=50; y++)

for (z=0; z<=20; z++)

if ((x+2*y+5*z)==100)

number++;

cout<<number<<endl;

上面这个程序一共要循环100*50*20次,效率实在是太低了

事实上,这个题目是一道明显的数学问题,而不是单纯的编程问题。我的解法如下:

因为x+2y+5z=100

所以x+2y=100-5z,且z<=20 x<=100 y<=50

所以(x+2y)<=100,且(x+5z)是偶数

对z作循环,求x的可能值如下:

z=0, x=100, 98, 96, ... 0

z=1, x=95, 93, ..., 1

z=2, x=90, 88, ..., 0

z=3, x=85, 83, ..., 1

z=4, x=80, 78, ..., 0

......

z=19, x=5, 3, 1

z=20, x=0

因此,组合总数为100以内的偶数+95以内的奇数+90以内的偶数+...+5以内的奇数+1,

即为:

(51+48)+(46+43)+(41+38)+(36+33)+(31+28)+(26+23)+(21+18)+(16+13)+(11+8)+(6+3)+1

某个偶数m以内的偶数个数(包括0)可以表示为m/2+1=(m+2)/2

某个奇数m以内的奇数个数也可以表示为(m+2)/2

所以,求总的组合次数可以编程为:

number=0;

for (int m=0;m<=100;m+=5)

{

number+=(m+2)/2;

}

cout<<number<<endl;

这个程序,只需要循环21次,两个变量,就可以得到答案,比上面的那个程序高效了许多

倍----只是因为作了一些简单的数学分析

这再一次证明了:计算机程序=数据结构+算法,而且算法是程序的灵魂,对任何工程问

题,当用软件来实现时,必须选取满足当前的资源限制,用户需求限制,开发时间限制等种

种限制条件下的最优算法。而绝不能一拿到手,就立刻用最容易想到的算法编出一个程序了

事——这不是一个专业的研发人员的行为。

那么,那种最容易想到的算法就完全没有用吗?不,这种算法正好可以用来验证新算法

的正确性,在调试阶段,这非常有用。在很多大公司,例如微软,都采用了这种方法:在调

试阶段,对一些重要的需要好的算法来实现的程序,而这种好的算法又比较复杂时,同时用

容易想到的算法来验证这段程序,如果两种算法得出的结果不一致(而最容易想到的算法保

证是正确的),那么说明优化的算法出了问题,需要修改。

可以举例表示为:

#ifdef DEBUG

int simple();

#end if

int optimize();

......

in a function:

{

result=optimize();

ASSERT(result==simple());

}

这样,在调试阶段,如果简单算法和优化算法的结果不一致,就会打出断言。同时,在程

序的发布版本,却不会包含笨重的simple()函数。——任何大型工程软件都需要预先设计良

好的调试手段,而这里提到的就是一种有用的方法。

一个学生的信息是:姓名,学号,性别,年龄等信息,用一个链表,把这些学生信息连在一起,给出一个age,在些链表中删除学生年龄等于age的学生信息。

#include "stdio.h"#include "conio.h"struct stu{char name[20];char sex;int no;int age;struct stu * next;}*linklist;struct stu *creatlist(int n){int i;//h为头结点,p为前一结点,s为当前结点struct stu *h,*p,*s;h = (struct stu *)malloc(sizeof(struct stu));h->next = NULL;p=h;for(i=0;i<n;i++){ s = (struct stu *)malloc(sizeof(struct stu));p->next = s;printf("Please input the information of the student: name sex no age \n");scanf("%s %c %d %d",s->name,&s->sex,&s->no,&s->age);s->next = NULL;p = s;}printf("Create successful!");return(h);}void deletelist(struct stu *s,int a){struct stu *p;while(s->age!=a){p = s;s = s->next;}if(s==NULL)printf("The record is not exist.");else{p->next = s->next;printf("Delete successful!");}}void display(struct stu *s){s = s->next;while(s!=NULL){printf("%s %c %d %d\n",s->name,s->sex,s->no,s->age);s = s->next;}}int main(){struct stu *s;int n,age;printf("Please input the length of seqlist:\n");scanf("%d",&n);s = creatlist(n);display(s);printf("Please input the age:\n");scanf("%d",&age);deletelist(s,age);display(s);return 0;}

2、实现一个函数,把一个字符串中的字符从小写转为大写。

#include "stdio.h"#include "conio.h"void uppers(char *s,char *us){for(;*s!='\0';s++,us++){if(*s>='a'&&*s<='z')*us = *s-32;else*us = *s;}*us = '\0';}int main(){char *s,*us;char ss[20];printf("Please input a string:\n");scanf("%s",ss);s = ss;uppers(s,us);printf("The result is:\n%s\n",us);getch();}

3.随机输入一个数,判断它是不是对称数(回文数)(如3,121,12321,45254)。不能用字符串库函数

unsigned char Symmetry (long n)

{

long i,temp;

i=n; temp=0;

while(i) //不用出现长度问题,将数按高低位掉换

{

temp=temp*10+i%10;

i/=10;

}

return(temp==n);

}

求2~2000的所有素数.有足够的内存,要求尽量快

答案:

#include <stdio.h>

int findvalue[2000] = {2};

static int find = 1;

bool adjust(int value){

if(value== 2) return true;

for(inti = 0;i < find ;i++){

if(value%findvalue[i]==0) //能被已经找到的素数整出,则不是素数

returnfalse;

}

findvalue[find++]= value;

returntrue;

}

int main(){

for(inti = 3;i<=2000;i++)//生成素数

adjust(i);

intcnt = 0;

for(inti = 0;i< find ;i++){//输出素数

if((cnt+1)%11==0) printf("\n");

cnt++;

printf("%d",findvalue[i]);

}

return0;

}

读书人网 >其他相关

热点推荐