华为C语言笔试题集合

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

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

               

华为C语言笔试题集合

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

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

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

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

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程序。

     循环链表,用取余操作做

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
  1. int strcmp(char *source,char *dest)  
  2. {  
  3.     if((source == NULL) && (dest == NULL))  
  4.     {  
  5.         return 0;  
  6.     }  
  7.     while((*source != '\0') && (*dest != '\0'))  
  8.     {  
  9.         if(*source != *dest)  
  10.         {  
  11.             return 1;  
  12.         }  
  13.         else  
  14.         {  
  15.             source ++;  
  16.             dest ++;  
  17.         }  
  18.     }  
  19.     if((*source == '\0') && (*dest == '\0'))  
  20.     {  
  21.         return 0;  
  22.     }  
  23.     else  
  24.     {  
  25.         return 1;  
  26.     }  
  27. }  

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

[cpp]  view plain copy
  1. int fun(char *p)  
  2. {  
  3.     if(p == NULL)  
  4.     {  
  5.         return -1;  
  6.     }  
  7.     char *pBegin = p;  
  8.     char *pEnd   = p;  
  9.     while(*pEnd != '\0')  
  10.     {  
  11.         pEnd ++;  
  12.     }  
  13.     pEnd --;  
  14.     while(pBegin < pEnd)  
  15.     {  
  16.         if(*pBegin != *pEnd)  
  17.         {  
  18.             return 0;  
  19.         }  
  20.         else  
  21.         {  
  22.             pBegin ++;  
  23.             pEnd   --;  
  24.         }  
  25.     }  
  26.     return 1;  
  27. }  

③华为笔试题含答案 [软件工程题]
写一个程序, 要求功能:求出用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
  1. #include "stdio.h"  
  2. #include "conio.h"  
  3.   
  4.   
  5. struct stu{  
  6. char name[20];  
  7. char sex;  
  8. int no;  
  9. int age;  
  10. struct stu * next;  
  11. }*linklist;  
  12. struct stu *creatlist(int n)  
  13. {  
  14. int i;  
  15. //h为头结点,p为前一结点,s为当前结点  
  16. struct stu *h,*p,*s;  
  17. h = (struct stu *)malloc(sizeof(struct stu));  
  18. h->next = NULL;  
  19. p=h;  
  20. for(i=0;i<n;i++)  
  21. {   
  22. s = (struct stu *)malloc(sizeof(struct stu));  
  23. p->next = s;  
  24. printf("Please input the information of the student: name sex no age \n");  
  25. scanf("%s %c %d %d",s->name,&s->sex,&s->no,&s->age);  
  26. s->next = NULL;  
  27. p = s;  
  28. }  
  29. printf("Create successful!");  
  30. return(h);  
  31. }  
  32. void deletelist(struct stu *s,int a)  
  33. {  
  34. struct stu *p;  
  35. while(s->age!=a)  
  36. {  
  37. p = s;  
  38. s = s->next;  
  39. }  
  40. if(s==NULL)  
  41. printf("The record is not exist.");  
  42. else  
  43. {  
  44. p->next = s->next;  
  45. printf("Delete successful!");  
  46. }  
  47. }  
  48. void display(struct stu *s)  
  49. {  
  50. s = s->next;  
  51. while(s!=NULL)  
  52. {  
  53. printf("%s %c %d %d\n",s->name,s->sex,s->no,s->age);  
  54. s = s->next;  
  55. }  
  56. }  
  57. int main()  
  58. {  
  59. struct stu *s;  
  60. int n,age;  
  61. printf("Please input the length of seqlist:\n");  
  62. scanf("%d",&n);  
  63. s = creatlist(n);  
  64. display(s);  
  65. printf("Please input the age:\n");  
  66. scanf("%d",&age);  
  67. deletelist(s,age);  
  68. display(s);  
  69. return 0;  
  70. }  
2、实现一个函数,把一个字符串中的字符从小写转为大写。
[cpp]  view plain copy
  1. #include "stdio.h"  
  2. #include "conio.h"  
  3.   
  4.   
  5. void uppers(char *s,char *us)  
  6. {  
  7. for(;*s!='\0';s++,us++)  
  8. {  
  9. if(*s>='a'&&*s<='z')  
  10. *us = *s-32;  
  11. else  
  12. *us = *s;  
  13. }  
  14. *us = '\0';  
  15. }  
  16. int main()  
  17. {  
  18. char *s,*us;  
  19. char ss[20];  
  20. printf("Please input a string:\n");  
  21. scanf("%s",ss);  
  22. s = ss;  
  23. uppers(s,us);  
  24. printf("The result is:\n%s\n",us);  
  25. getch();  
  26. }  
随机输入一个数,判断它是不是对称数(回文数)(如3,121,12321,45254)。不能用字符串库函数 

/***************************************************************
1.
函数名称:Symmetry 
功能: 判断一个数时候为回文数(121,35653) 
输入: 长整型的数 
输出: 若为回文数返回值为1 esle 0 
******************************************************************/
  • 13
    点赞
  • 84
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值