CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
不看会后悔的Windows XP之经验谈 简单快捷DIY实用家庭影院
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  C/C++ >  C语言

今天的面试题,大家讨论一下!

楼主quanbaoxiao(永不言败)2006-04-05 23:30:30 在 C/C++ / C语言 提问

第一题:  
  /*  
  typedef   struct   _mf  
  {  
  int   a   ;  
  int   b   ;  
  char   c   ;  
  int   d   ;  
  }mf   ;  
     
  在vc下默认设置时输出多少?  
  int   main(int   argc,   char*   argv[])  
  {  
  do    
  {  
  cout   <<   &(((mf*)0)->d)<<endl   ;  
  }   while(0);  
  return   0;  
  }  
   
   
  */  
   
  第二题  
  /*  
  class     CA  
  {  
  int   a   ;  
  ~CA(){}  
  };  
   
  class   CB  
  {  
  int   b   ;  
  virtual   ~CB(){}  
  };  
   
  int   main()  
  {  
   
  cout   <<   sizeof(CA)-sizeof(CB)   ?   1   :   0   <<endl   ;  
  }*/  
   
   
  /*  
   
  第三题  
  把Fun转为非递归  
  void   Fun(int   *n   ,   int   nn)  
  {  
   
  if(nn==0)  
  return   ;  
  for(int   i   =   0   ;   i<nn-1   ;   ++i)  
  {  
  if(n[i]>n[i+1])  
  {//一下几行代码具体的记不起了  
  n[i]   +=   n[i+1]   ;  
  n[i+1]   =   n[i]   -   n[i+1]   ;  
  n[i]       -=   n[i+1]   ;    
  }  
  }  
   
  Fun(n+1   ,   nn-1)   ;  
  }  
   
  一下是我的答案,不过他要求高效率,不知道还什么高效方法?  
  void   Fun2(int   *n   ,   int   nn)  
  {  
  for(int   i=0   ;   i<nn-1   ;   ++i)  
  for(int   j=i   ;   j<nn-1   ;   ++j)  
  if(n[j]>n[j+1])  
  {  
  n[j]   +=   n[j+1]   ;  
  n[j+1]   =   n[j]   -   n[j+1]   ;  
  n[j]       -=   n[j+1]   ;    
  }  
  }  
   
  */  
   
  第四题:  
  在c下实现两个数的交换,模拟c++的模板功能  
  一下是我的答案,不过他要求高效率,不知道还什么高效方法?  
  void   Ex(void   *a   ,   void   *b   ,   int   type_len)  
  {  
  char   *pa   =   (char*)a   ;  
  char   *pb   =   (char*)b   ;  
  for(int   i=0   ;   i<type_len   ;   ++i)  
  {  
  *(pa+i)   +=   *(pb+i)   ;  
  *(pb+i)   =   *(pa+i)   -   *(pb+i)   ;  
  *(pa+i)   =   *(pa+i)   -   *(pb+i)   ;  
  }  
  }  
   
  int   main()  
  {  
  int   a   =   1   ;    
  int   b   =   2   ;  
  Ex((void*)&a   ,   (void*)&b   ,   sizeof(a))   ;  
  cout   <<a<<"   "<<b   <<endl   ;  
  }  
  */  
   
   
  第五题:  
  输出一个整数的2的指数和表达式  
  一下是我的答案,不过他要求高效率,不知道还什么高效方法?  
  /*  
  void   OutPutEx(int   num)  
  {  
  int   count   ;  
  int   result   ;  
  while(num>0)  
  {  
  count   =   0     ;  
  result   =   1   ;  
  while(result<=num)  
  {  
  result   *=   2   ;  
  ++count   ;  
  }  
  if(result>num)  
  {  
  result   /=   2   ;  
  --count   ;  
  }  
  num   -=   result   ;  
  if(num!=0)  
  cout<<2<<"^"<<count<<"+"   ;  
  else  
  cout<<2<<"^"<<count<<endl   ;  
   
  }  
   
   
  }  
   
  int   main()  
  {  
  int   a   =   13   ;  
  OutPutEx(a)   ;  
  return   1   ;  
  }  
  */ 问题点数:0、回复次数:18Top

1 楼cunsh(村少)回复于 2006-04-05 23:41:29 得分 0

markTop

2 楼ares0906(bupt_ares)回复于 2006-04-06 01:25:34 得分 0

第一题9  
  第二题1Top

3 楼cattlenzq(吃狼的豆腐(不要给分了,散起来真麻烦!))回复于 2006-04-06 01:32:38 得分 0

第一题是   12   因为输出的是类内偏移地址,VC下4字节对其,所以   b+c+d=12  
   
  第二题中间是   ‘-’?那就是不相等,因为有vptr,在vc下两个差了4  
   
  第三题不知道题到底对不先扔那  
   
  第四题我能想起来的最快的,或者换成宏定义能更快一点,不过太难认  
  #include   <memory.h>  
  #include   <stdio.h>  
  void   change(void*   a,void   *b,int   type_len)  
  {  
  void*   tmp=malloc(type_len);  
  memcpy(tmp,a,type_len);  
  memcpy(a,b,type_len);  
  memcpy(b,tmp,type_len);  
  }  
   
  int   main()  
  {  
  int   x=1;  
  int   y=4;  
  change((void*)&x,(void*)&y,sizeof(int));  
  printf("x=%d,   y=%d",x,y);  
  }  
  第五题   32位机子可以这样写(输出的时候‘+’整的我吐血。。。)  
  #include<iostream>  
  using   namespace   std;  
  void   OutPutEx(int   num)  
  {  
  cout<<num<<"=";  
  int   count=15;  
  bool   first=true;  
  do  
  {  
  if(num&0x8000)  
  {  
  if(first)  
  first=false;  
  else  
  cout<<'+';  
  cout<<2<<'^'<<count;  
  }  
  --count;  
  }while(num<<=1);  
  }  
   
  int   main()  
  {  
  int   a;  
  cin>>a;  
  OutPutEx(a)   ;  
  return   0;  
  }Top

4 楼L_BOY()回复于 2006-04-06 01:40:54 得分 0

第一题我运行结果是0000000c  
  不知道是为什么Top

5 楼L_BOY()回复于 2006-04-06 01:59:39 得分 0

每三题下面一段代码就是将n[j]与n[j+1]交换  
  n[j]   +=   n[j+1]   ;  
  n[j+1]   =   n[j]   -   n[j+1]   ;  
  n[j]       -=   n[j+1]   ;    
   
  所以非递归代码  
  void   Fun2(int   *n   ,   int   nn)  
  {  
  for(int   i=0   ;   i<nn-1   ;   ++i)  
  for(int   j=i   ;   j<nn-1   ;   ++j)  
  if(n[j]>n[j+1])  
  {  
                                                                          int   temp   =   n[j];  
  n[j]   =   n[j+1]   ;  
  n[j+1]   =   temp;  
  }  
  }  
  Top

6 楼quanbaoxiao(永不言败)回复于 2006-04-06 09:15:38 得分 0

if里面本来是用异或来做的。类似下面,但是具体不是很记得了。  
  n[j]   ^=   n[j+1]   ;  
  n[j+1]   ^=   n[j]   ;  
  n[j]       =   n[j+1]   ;    
  我觉得if里面的代码应该影响不大,递归和非递归应该都是一样的直接copy过来就是了  
  第二个for应该是for(int   j=i   ;   j<nn-1-1   ;   ++j)Top

7 楼citywanderer2005(流浪狗)回复于 2006-04-06 09:53:50 得分 0

第三题楼主用的是冒泡排序,难道他要你用别的排序方法?Top

8 楼quanbaoxiao(永不言败)回复于 2006-04-06 09:59:33 得分 0

他要求考虑效率,不过我只能写出冒泡,但其效率不高Top

9 楼yayageyaya(牙牙个牙呀)回复于 2006-04-06 10:54:13 得分 0

第一题这一句没懂  
  什么意思啊?  
   
  &(((mf*)0)->d)Top

10 楼f9941220(无虚)回复于 2006-04-06 11:14:49 得分 0

第一题:答案12  
  分析:  
  typedef   struct   _mf  
  {  
  int   a   ;  
  int   b   ;  
  char   c   ;  
  int   d   ;  
  }mf;  
  0转换为mf结构,地址((mf*)0)->a的0x0000  
  b的地址+4  
  c的地址+4  
  d的地址+4(考虑对齐方式)  
  4+4+4=12  
  Top

11 楼LiHubei(lhb)回复于 2006-04-06 11:31:48 得分 0

markTop

12 楼cattlenzq(吃狼的豆腐(不要给分了,散起来真麻烦!))回复于 2006-04-06 13:05:12 得分 0

to   :L_BOY()    
  第一题我运行结果是0000000c  
  不知道是为什么  
  —————————————  
  c   就是10进制的12啊Top

13 楼cattlenzq(吃狼的豆腐(不要给分了,散起来真麻烦!))回复于 2006-04-06 13:20:09 得分 0

第三题主要是化非递归,所以感觉其他方面不能改,所以效率不会提升很厉害,把数组从小到大排序,方法还是很多的,STL里面实现应该算比较有效率的了吧Top

14 楼quanbaoxiao(永不言败)回复于 2006-04-06 21:07:44 得分 0

顶一个Top

15 楼cg5353(努力学习中)回复于 2006-04-07 17:21:15 得分 0

第四题的result   *=   2   ;可以换成result   <<   1;Top

16 楼oo(为了名副其实,努力学习oo技术ing)回复于 2006-04-07 17:32:07 得分 0

第四题:  
  在c下实现两个数的交换,模拟c++的模板功能  
   
  #define   swap(type,a,b)   \  
        {   type   tmp;   tmp=a;a=b;b=tmp;}Top

17 楼steepriver()回复于 2006-04-07 17:41:50 得分 0

顶Top

18 楼stonepeter(笨笨石头.NET_从公务员转身成为了程序员)回复于 2006-04-11 16:23:52 得分 0

建议楼主把结果整理一下,然后结贴吧Top

相关问题

关键词

得分解答快速导航

  • 帖主:quanbaoxiao

相关链接

  • C/C++ Blog
  • C/C++类图书
  • C/C++类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo