阿尔卡特笔试题目之一

1、能否实现一个宏来实现sizeof(type),   sizeof(var),   type为基本类型,var   为变量.  
  #define     NEWSIZEOF(x)     sizeof(x)       这样答题是不会得分的。回答不能实现,也是0分。   
//  selfsizeof.cpp : 定义控制台应用程序的入口点。
//

#include 
" stdafx.h "
#include 
< iostream >
using   namespace  std;

#define  NEWSIZEOFVAR(x)     ((char*)(&x+1)-(char*)&x) 

int  _tmain( int  argc, _TCHAR *  argv[])
{
    
int rhs = 0;
    
int result = NEWSIZEOFVAR(rhs);
    cout 
<< "the result is " << result;
    
return 0;
}

3、 结构 体sizeof   的题目。不写了。最后一问:   结构体成员能否进行   16bytes对齐?  
  根据 编译器和OS,   在64位OS上结构体内的数据成员可能16bytes   对齐. http://www.vckbase.com/document/viewdoc/?id=1054;http://blog.vckbase.com/panic/archive/2005/04/02/4340.aspx


4、写一个函数reverse一个byte  
  unsigned   char   ByteReverse(unsigned   char   szByte)  
  {    
      unsigned   char   a   =   szByte,    
      unsigned   char   b   =   0;  
      int   i;  
      for(i=0;   i<8;   i++) {  
      b   <<=   1;  
      b   |=   (0x01   &   a);  
      a   >>=   1;  
      }  
      return   b;  
  }   
   
5、写一个函数判断一个整型是不是power   of   2  
  bool   IS_POWEROFTWO(unsigned   int   m)  
  {   
      if(   ((m&(m-1))==0)   &&   m>0   )   //decrease by 1 to remove one "1" in the binary of num at once.
      return   true;  
      else  
      return   false;  
  }   
   
7、2选1  
  写个函数实现反转一个字符串的 功能         

// stringReverse.cpp : 定义控制台应用程序的入口点。
#include "stdafx.h"
#include <iostream>
using namespace std;

/************************************************************************/  
//   函数名称:   Ustrlen  
//   输入参数:   strSource,待求长度字符串;  
//   输出参数:   int,字符串的长度。  
//   描         述:   通过判断字符'/0'来得到字符串的长度  
/************************************************************************/    
int   Ustrlen(const   char   *strSource)  
{  
 //   声明变量  
 int   iLength(0);  
 //   遍历字符串,查找字符'/0'  
 while(*strSource++   !=   '/0')  
 {  
  ++iLength;  
 }  
 //   返回字符串的长度  
 return   iLength;  
}  
/************************************************************************/  
//   函数名称:   _ReversalChar  
//   输入参数:   strSouce,待反转字符串;iStart,旋转字符串开始位置;iEnd,旋转字符串结束位置  
//   输出参数:   char*,反转后字符串的指针;  
//   描         述:   反转iStart到字符串iEnd之间的字符串  
/************************************************************************/  
char*   _ReversalChar(char   *strSouce,int   iStart,int   iEnd)  
{  
 //   反转字符串  
 for(;iEnd   >   iStart;   ++iStart,--iEnd)  
 {  
  char   ch;  
  ch   =   strSouce[iStart];  
  strSouce[iStart]   =   strSouce[iEnd];  
  strSouce[iEnd]   =   ch;  
 }  
 //   返回字符串指针  
 return   strSouce;  
}  

/************************************************************************/  
//   函数名称:   ReversalChar  
//   输入参数:   strSource,待反转字符串  
//   输出参数:   char*,反转字符串后的指针  
//   描         述:   按单词反转字符串  
/************************************************************************/  
char   *   ReversalChar(char   *strSouce)  
{  
 //   获取字符串的长度  
 int   iLength   =   Ustrlen(strSouce);  

 //   反转整个字符串  
 _ReversalChar(strSouce,0,iLength-1);  

 //   声明变量(单词的开始以及结束默认从0开始)  
 int   iStart(0),iEnd(0);  

 //   查找单词  
 //   像上面讨论的查找单词的情况,我们只需要修改这部分,就可以实现对不  
 //   同格式类型单词进行处理,为了更好的通用性,其实最好把查找单词这部分  
 //   作为单独一个函数,或者一个类来处理  
 for(int   i   =   0;   i   <   iLength;   ++i)  
 {  
  //   查找空格分割符号  
  if(strSouce[i]  ==   ' ')  
  {  
   //   找到一个单词  
   iEnd   =   i-1;  
   //   对于只有一个字符的单词比如说(I)没有必要反转  
   if(iStart   <   iEnd)  
   {  
    //   反转单词  
    _ReversalChar(strSouce,iStart,iEnd);  
   }  
   //   记录下一个单词的开始位置  
   iStart   =   i+1;  
  }  
  //   特殊处理几种常见标点符号  
  else   if(strSouce[i]   ==   '!'   ||   strSouce[i]   ==   ','   ||   strSouce[i]   ==   '.')  
  {  
   iStart   =   i+1;  
  }  
 }  
 //   返回反转后的字符串  
 return   strSouce;  
}  

int main ()
{
 char  str []= "I want to be get hired!!!";
 cout << "before reverse " << str << endl;
 cout << "after reverse " << ReversalChar(str) << endl;
 return 0;
}


8、不另外增加存储空间实现如下功能:   a=1,   b=2,   交换a和b的值   
public   int   swap (int   x,int   y){
      x   =   x   +   y;
      y   =   x   -   y;
      x   =   x   -   y;


9、改错题  
  void   f()  
  {  
  unsigned   static   int   i;  
  int   sum   =   0;  
  for(i=0;   i<=100;   i++)  
  sum+=i;  
          return   sum;  
  }  
  去掉static,否则每次调用函数得到的结果都不同,static变量会保留值. 

你可能感兴趣的:(阿尔卡特笔试题目之一)