首页 > 编程知识 正文

华为机试题目c语言,华为c语言面试题目及答案

时间:2023-05-04 12:39:43 阅读:214336 作者:3393

分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow

也欢迎大家转载本篇文章。分享知识,造福人民,实现我们中华民族伟大复兴!

                华为C语言笔试题集合 分类: C/C++笔试题目 2011-08-14 16:07  1762人阅读  评论(1)  收藏  举报 ①华为笔试题搜集
1.static有什么用途?(请至少说明两种)
    1)在函数体,一个被声明为静态的变量在这一函数被调用过程中维持其值不变。
    2) 在模块内(但在函数体外),一个被声明为静态的变量可以被模块内所用函数访问,但不能被模块外其它函数访问。它是一个本地的全局变量。
    3) 在模块内,一个被声明为静态的函数只可被这一模块内的其它函数调用。那就是,这个函数被限制在声明它的模块的本地范围内使用

2.引用与指针有什么区别?
    1) 引用必须被初始化,指针不必。
    2) 引用初始化以后不能被改变,指针可以改变所指的对象。
    3) 不存在指向空值的引用,但是存在指向空值的指针。

3.描述实时系统的基本特性
       在特定时间内完成特定的任务,实时性与可靠性。

4.全局变量和局部变量在内存中是否有区别?如果有,是什么区别?
      全局变量储存在静态全局数据段,局部变量在堆栈。

5.什么是平衡二叉树?
      hldxss都是平衡二叉树 且hldxss的深度差值的绝对值不大于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程序。

     循环链表,用取余操作做

14.不能做switch()的参数类型是:
     switch的参数不能为实型。
15.上海华为的一道关于指针方面的编程题

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

②华为最近笔试题目

 一、判断题(对的写T,错的写F并说明原因,每小题4分,共20分)

1、有数组定义int a[2][2]={{1},{2,3}};则a[0][1]的值为0。( T    )

2、int (*ptr) (),则ptr是一维数组的名字。(   F )

3、指针在任何情况下都可进行>, <, >=, <=, = =运算。(  F   )

4、switch(c) 语句中c可以是int, long, char, float, unsigned int 类型。(F )

5、#define print(x)   printf("the no, "#x",is ")    ( T )
二、填空题(共30分)

1、在windows下,写出运行结果,每空2分,共10分。

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  )

2、void setmemory(char **p, int num)

{ *p=(char *) malloc(num);}

void test(void)

{   char *str=NULL;

getmemory(&str,100);

strcpy(str,"hello");

printf(str);

}

运行test函数有什么结果?(   hello                             )10分

3、设int arr[]={6,7,8,9,10};

    int *ptr=arr;

*(ptr++)+=123;

printf("%d,%d",*ptr,*(++ptr));

(          8,8                         ) 10分


二、编程题(第一小题20,第二小题30分)

1、   不使用库函数,编写函数int strcmp(char   *source, char *dest)
相等返回0,不等返回-1;

[cpp]  view plain copy int strcmp(char *source,char *dest)  {      if((source == NULL) && (dest == NULL))      {          return 0;      }      while((*source != '') && (*dest != ''))      {          if(*source != *dest)          {              return 1;          }          else          {              source ++;              dest ++;          }      }      if((*source == '') && (*dest == ''))      {          return 0;      }      else      {          return 1;      }  }  

2、   写一函数int fun(char *p)判断一字符串是否为回文,是返回1,不是返回0,出错返回-1 

[cpp]  view plain copy int fun(char *p)  {      if(p == NULL)      {          return -1;      }      char *pBegin = p;      char *pEnd   = p;      while(*pEnd != '')      {          pEnd ++;      }      pEnd --;      while(pBegin < pEnd)      {          if(*pBegin != *pEnd)          {              return 0;          }          else          {              pBegin ++;              pEnd   --;          }      }      return 1;  }  
③华为笔试题含答案 [软件工程题]
写一个程序, 要求功能:求出用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()函数。——任何大型工程软件都需要预先设计良
好的调试手段,而这里提到的就是一种有用的方法。
1  一个学生的信息是:姓名,学号,性别,年龄等信息,用一个链表,把这些学生信息连在一起, 给出一个age, 在些链表中删除学生年龄等于age的学生信息。
[cpp]  view plain copy #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 %dn",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、实现一个函数,把一个字符串中的字符从小写转为大写。
[cpp]  view plain copy #include "stdio.h"  #include "conio.h"      void uppers(char *s,char *us)  {  for(;*s!='';s++,us++)  {  if(*s>='a'&&*s<='z')  *us = *s-32;  else  *us = *s;  }  *us = '';  }  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%sn",us);  getch();  }   随机输入一个数,判断它是不是对称数(回文数)(如3,121,12321,45254)。不能用字符串库函数 

/***************************************************************
1.
函数名称:Symmetry 
功能: 判断一个数时候为回文数(121,35653) 
输入: 长整型的数 
输出: 若为回文数返回值为1 esle 0 
******************************************************************/

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。