其他公司的笔试题5

来源:互联网 发布:linux ftp配置文件丢失 编辑:程序博客网 时间:2024/04/30 08:30
 
1.多态类中的虚函数表是Compile-Time,还是Run-Time时建立的?
Compile-Time时,只有vtbl中其slab对应哪个虚函数才是Run-Time建立的
Vptr是在基类构造函数之后,成员列表之前初始化的
2.将一个 1M -10M 的文件,逆序存储到另一个文件,就是前一个文件的最后一个
字符存到新文件的第一个字符,以此类推。
   fstat获得文件的大小,然后使用fseek从输入的文件一个字节一个字节的从后往前读,写到输出文件就行了。   不过这样系统调用太多,效率不高。
#include   <sys/stat.h>  
  #include   <stdio.h>  
   
  int   main(int   argc,   char*   argv[])  
  {  
          FILE*                       fpin;  
          FILE*                       fpout;  
          struct   stat           fst;  
          unsigned   long       filelen;  
          int                           c;  
           
          if(argc   !=   3)  
          {  
                  printf("Usage:   %s   <filename1>   <filename2>/n",   argv[0]);  
                  printf("filename1   :   input   file   name/n");  
                  printf("filename2   :   output   file   name/n");  
                  return(-1);  
          }  
   
          if(stat(argv[1],   &fst))  
          {  
                  printf("stat   error/n");  
                  return(-2);  
          }  
          filelen   =   fst.st_size;  
   
          if((fpin   =   fopen(argv[1],   "rb"))   ==   NULL)  
          {  
                  printf("Error   opening   input./n");  
                  return(-3);  
          }  
   
          if((fpout   =   fopen(argv[2],   "wb"))   ==   NULL)  
          {  
                  printf("Error   opening   output./n");  
                  fclose(fpin);  
                  return(-4);  
          }  
           
          while(filelen--   >   0)  
          {  
                  if(fseek(fpin,   filelen,   SEEK_SET))  
                  {  
                          printf("error   fseek/n");  
                          fclose(fpin);  
                          fclose(fpout);  
                          return(-5);  
                  }  
                  c   =   getc(fpin);  
                  printf("%c",   c);  
                  if(c   ==   EOF)  
                  {  
                          printf("getc   error,   return   EOF/n");  
                          fclose(fpin);  
                          fclose(fpout);  
                          return(-6);  
                  }  
                  if(c   !=   putc(c,   fpout))  
                  {  
                          printf("putc   error/n");  
                          fclose(fpin);  
                          fclose(fpout);  
                          return(-7);  
                  }  
          }  
          fclose(fpin);  
          fclose(fpout);  
          return(0);  
  }  
可以使用缓冲区吧,stat获得文件的大小,除以1024,分成n块,然后定位到最后一块的起点,读取它到缓冲区,翻转,写入新文件,然后定位在n-1块,继续以上操作……
 
3.main主函数执行完毕后,是否可能会再执行一段代码?
atexit
4.一个父类写了一个virtual 函数,如果子类覆盖它的函数不加virtual ,也能实现多态?
在子类的空间里,有没有父类的这个函数,或者父类的私有变量?
能,
5.给一个字符串、例如 “ababc”要求返回“ab”. 因为“ab”连续重复出现且最长。
 用C/C++语言写一函数完成该算法,给出复杂度
6.对序列1、1、2、3、5、8、13。。。。 是Fab..数列
 2、3、5、13...是Fab..质数数列,因为他们与自己前面的Fab...数列都互质
给出k,返回第k小的Fab..质数
7.101个硬币100真、1假,真假区别在于重量。请用无砝码天平称两次给出真币重还是假币重的结论。
8.完成字符串拷贝可以使用 sprintf、strcpy 及 memcpy 函数,请问这些函数有什么区别,你喜欢使用哪个,为什么?
9.变量的声明和定义有什么区别?
10.请写出下面代码在 32 位平台上的运行结果,并说明 sizeof 的性质:
#include <stdio.h>
#include <stdlib.h>
 
int main(void)
{
        char a[30];
        char *b = (char *)malloc(20 * sizeof(char));
        printf("%d/n", sizeof(a));
        printf("%d/n", sizeof(b));
        printf("%d/n", sizeof(a[3]));
        printf("%d/n", sizeof(b+3));
        printf("%d/n", sizeof(*(b+4)));
        return 0 ;
}
12.请完成以下题目。注意,请勿直接调用 ANSI C 函数库中的函数实现。
 
   a)请编写一个 C 函数,该函数给出一个字节中被置 1 的位的个数,并请
     给出该题的至少一个不同解法。
   b)请编写一个 C 函数,该函数将给定的一个字符串转换成整数。
   c)请编写一个 C 函数,该函数将给定的一个整数转换成字符串。
   d)请编写一个 C 函数,该函数将一个字符串逆序。
   e)请编写一个 C 函数,该函数在给定的内存区域搜索给定的字符,并返回
     该字符所在位置索引值。
   f)请编写一个 C 函数,该函数在一个字符串中找到可能的最长的子字符串,
     该字符串是由同一字符组成的。
 
给出演示上述函数功能的一个简单程序,并请编写对应的 Makefile 文件
 
13.我们需要编写一个图形相关的应用程序,需要处理大量图形(Shape)信息,
图形有矩形(Rectangle),正方形(Square),圆形 (Circle)等种类,应用
需要计算这些图形的面积,并且可能需要在某个设备上进行显示(使用在标准
输出上打印信息的方式做为示意)。
 
    a)请用面向对象的方法对以上应用进行设计,编写可能需要的类
    b)请给出实现以上应用功能的示例性代码,从某处获取图形信息,
      并且进行计算和绘制
    c)如果你的Square继承自Rectangle,请给出理由,如果不是,
      请给出理由,并且请比较两种方式的优劣
    d)请问你所编写的类,在如下代码中会有何表现,请解释
    void test_rectangle_area(Rectangle& r)
    {
        r.set_width(10);
        r.set_height(15);
        assert(r.area() == 150);
    }
14.假设现有一个单向的链表,但是只知道只有一个指向该节点的指针p,并且假设这个节点不是尾节点,试编程实现删除此节点
15.写一个程序,把一个100以内的自然数分解因数。(自然数分解因数就是将一个自然数分解为几个素数的乘积,提示,由于该数不是很大,所以可以将质数保存在数组中,以加快计算速度)
 
16.编写一个Identify的分配、释放的函数,为1-10000之间的自然数。
17.分别实现itoa和atoi.
18.Consider the following code:
 
#include <stdio.h>
#include <string.h>
int main(int argc, char *argv[]) {
int i = 1;
char buf[4];
strcpy(buf, "AAAA");
printf("%d/n", i);
return 0;
}
 
a) When compiled and executed on x86, why does this program usually not
output what the programmer intended?
 
b) Name several ways in which the security problem that causes this
program not to output what the programmer intended can be prevented
WITHOUT changing the code.
 
19.int w=1,x=2,y=3,z=4;
m=(w<x)?w:x;
m=(m<y)?m:y;
m=(m<2)?m:z;
printf("m=%d",m);        说出结果
20.说出结果
#include <stdio.h>
main()
{
    FILE *fp;
    int i,a[4]={1,2,3,4},b;
    fp=fopen("data.dat","wb");//这里帮忙解释一下
    for(i=0;i<4;i++)
    fwrite(&a[i],sizeof(int),1,fp);//这里也帮忙看一下
    fclose(fp);
    fp=fopen("data.dat","rb");
    fseek(fp,-2L*sizeof(int),SEEK_END);//还有这里
    fread(&b,sizeof(int),1,fp);//这里还有也看一下
    fclose(fp);
    printf("b=%d/n",b);
}
21.有双向循环链表结点:
typedef struct node
{
 int date;
 struct node *front,*next;
}_Node;
有两个双向循环链表A,B,知道其头指针为:pHeadA,pHeadB,请写一函数将两上链表中date值相同的结点删除
 
22.
char * GetStr()
{
char *tmp;
tmp = "123"
return tmp;
}
 
void main()
{
printf("%s", GetStr());
}
 
会输出123吗?123创建在堆上还是栈上呢?123的空间是什么时候释放的?
会,都不是,程序结束
23.
字符指针、浮点数指针、以及函数指针这三种类型的变量哪个占用的内存最大?为什么?
一样
类ClassB从ClassA派生,那么ClassA *a = new ClassB(…); 试问该表达是否合法?为什么?
如果ClassA中定义并实现虚函数int func(void),ClassB中也实现该函数,那么上述变量a->func()将调用哪个类里面的函数?如果int func(void)不是虚函数,情况又如何?为什么?
classb
char **p, a[16][8]; 问:p=a是否会导致程序在以后出现问题?为什么?
如下所述的if else和switch语句哪个的效率高?为什么?
在同一个进程中,一个模块是否可以通过指针操作破坏其它模块的内存,为什么?
应用程序在运行时的内存包括代码区和数据区,其中数据区又包括哪些部分?
Bss data
24.Assignment 2: Picture Processing
 
Use C++, Java, or similar languages or/and any middleware such as EJB and J2EE to process a picture with a high resolution (3 Mega Pixels for example). Use some methodologies to degrade the resolution of the picture to make it quicker for browsing. Then divide the degraded picture into 9 sectors equally. Click any of the 9 sectors will result a detailed picture for this sector with the same resolution as that of the original picture. This assignment is designed for you to demonstrate your ability to handle pictures.
25.用<<,>>,|,&实现一个WORD(2个字节)的高低位交换!!
26.要开辟P1,P2,P3,P4内存来做缓冲,大小自定,但这四个缓冲的大小要一样,并且是连续的!
calloc
27.有一浮点型数组A,用C语言写一函数实现对浮点数组A进行降序排序,并输出结果,要求要以数组A作为函数的入口.(建议用冒泡排序法)
28.找错:
#include <string.h>
#include <stdio.h>
class Base
{
private:
char * name;
public:
Base(char * className)
{
name = new char[strlen(className)];//1
strcpy(name, className);
}
~Base()
{
delete name;
}
char * copyName()
{
char newname [256];
strcpy(newname, name);
return newname;
}
char * getName()
{
return name;
}
static void print(Base base)
{
printf("name: %s/n" , base.name);
}
};
class Subclass : public Base
{
public:
Subclass(char * className) : Base(className)
{
}
};
int main()
{
Base * pBase = new Subclass("test");
Base::print(*pBase);
printf("name: %s/n", pBase->getName());
printf("new name: %s/n", pBase->copyName());
return 0;
}
29.编写一个函数,函数接收一个字符串,是由十六进制数组成的一组字符串,函数的功能是把接到的这组字符串转换成十进制数字.并将十进制数字返回.
30.编写一个函数将一条字符串分成两部分,将前半部分按ASCII码升序排序,后半部分不变,(如果字符串是奇数则中间的字符不变,)最后再将前后两部分交换,然后将该字符串输出,
测试字符串“ADZDDJKJFIEJHGI”
 
   
 
38.写一个函数,判断一个int型的整数是否是2的幂,即是否可以表示成2^X的形式(不可以用循环)
我只知道是用递推,大概写了一下,如下:
int IsTwoPow(int s)
{
 if(s==1)return FALSE;
 s=s>>1;
 if(s>1)IsTwoPow(s);
 return (s==1)?TRUE:FALSE;//大概是这个意思,但是这一句似乎不该这么返回!
}
 
39 A,B从一堆玻璃球(共100个)里向外拿球,规则如下:
 (1)A先拿,然后一人一次交替着拿;
(2)每次只能拿1个或2个或4个;
(3)谁拿最后一个球,谁就是最后的失败者;
 问A,B谁将是失败者?写出你的判断步骤。
40.已知:无序数组,折半查找,各元素值唯一。
函数原型是:Binary_Seach(int array[], int iValue, int iCount)
array是数组,在里面用折半查找的方法找等于iValue的值,找到返回1否则0,iCount是元素个数
41.统计一个字符串中字符出现的次数
42.100位以上的超大整数的加法(主要考虑数据结构和加法的实现)。
43.对如下电文:"CASTCASTSATATATASA"给出Huffman编码。
44.int (* (*f)(int, int))(int)表示什么含义?
45.x=x+1,x+=1,x++,为这三个语句的效率排序。并说明为什么。
46.中缀表达式 A-(B+C/D)*E的后缀形式是什么?
47.struct S1
{
char c;
int i;
};
sizeof(S1) = ?
 
class X{
public:
X();
virtual ~X();
void myMemberFunc();
static void myStaticFunc();
virtual void myVirtualFunc();
private:
int i;
char * pstr;
char a;
}
sizeof(X) = ?16
48.找出两个字符串中最大子字符串,如"abractyeyt","dgdsaeactyey"的最大子串为"actyet"
49.有一百个整数,其中有负数,找出连续三个数之和最大的部分.
50.写一程序实现快速排序. 假设数据输入为一文件
快速算法描述如下
Algorithm Partition
Input: sequence a0, ..., an-1 with n elements
Output: permutation of the sequence such that all elements a0, ..., aj are less than or equal to all
elements ai, ..., an-1 (i > j)
Method:
 
choose the element in the middle of the sequence as comparison element x
let i = 0 and j = n-1
while ij
 
    search the first element ai which is greater than or equal to x
    search the last element aj which is less than or equal to x
    if ij
 
    exchange ai and aj
    let i = i+1 and j = j-1
After partitioning the sequence, Quicksort treats the two parts recursively by the same procedure.
The recursion ends whenever a part consists of one element only.
51.写一算法检测单向链表中是否存在环(whether there is a loop in a link list),
要求算法复杂度(Algorithm's complexity是O(n)) 并只使用常数空间(space is O(c)).
注意,你只知道一个指向单向链表头的指针。链表的长度是不定的,而且环出现的地方也是不定的,环有可能在头,有可能在中间。而且要求是检测, 不能破坏环的结构.
52.设下列函数已经通过了调试
bool Sort_Array(ArrayType * Pinputarray, ArrayType * Poutarray);
该函数在内存中排序,能把字节数最大为100M字节的ArrayType类型的数组排序。其中ArrayType是一个
预定义的数组类型(细节无关紧要),Pinputarray,Poutarray分别为排序前的指针和排序后的指针。
请用c语言的伪码风格设计一个算法,他调用上面给出的函数完成下列从输入到输出的任务:
输入:排序前的大文件,名称为char * pinoutfilename ,其内容为用分号分隔的ArrayType类型的数组元素,可装满4个100M字节的数组。
输出:排序后的大文件char * poutoutfilename。
53.用最有效率的方法算出2乘以8等於几?
<< 
54.
1.错误的转义字符是 ( )
A.'/091' B.'//'
C.'/0' D.'/''
 
2.若数组名作实参而指针变量作形参,函数调用实参传给形参的是 ( )
A.数组的长度 B.数组第一个元素的值
C.数组所有元素的值 D.数组第一个元素的地址
 
3.变量的指针含意是指变量的 ()
A.值 B.地址
C.存储 D.名字
 
5.某文件中定义的静态全局变量(或称静态外部变量)其作用域是 ( )
A.只限某个函数 B.本文件
C.跨文件 D.不限制作用域
55.
1. 解二次方程:a*x*x+b*x+c
int Quadratic( double a,double b,double c,double& x1,double& x2);
返回值:解的个数
 
2. 最大公约数
DWORD Divisor( DWORD dwFirst, DWORD dwSecond );
返回值:最大公约数
 
3. 根据蒙特卡洛算法计算圆周率
double PI( DOWRD dwCount/*测试次数*/ );
返回值:PI
 
4. 无符号整数乘法,乘数为32bit,结果为64bit
提示:32bit整数分解为16bit相乘
void Multiply( DWORD dwFirst, DWORD dwSecond, DWORD& dwHigh, DWORD& dwLower );
 
5. 链表排序(从小到大)
节点定义为:
struct Node{
 int nValue;
 struct Node* pNext;
};
最后一个节点的pNext = NULL.
Node* SortChain( Node* pHead );
返回值:链表头
 
合并连续的空格为一个空格
void remove_blank(char * str)
{
    char *src = str;
    char *dst = str;
    bool hasblank = false;
    while(*src)
    {
       if(hasblank)
       {
           if(*src == ' ')
              src ++;
           else
           {
              hasblank = false;
              *dst++ = *src++;
           }
       }
       else
       {
           if(*src == ' ')
           {
              hasblank = true;
           }
           *dst++ = *src++;
       }
    }
    *dst = '/0';
}
C++内建型别   A      B,在哪几种情况下B能隐式转化为A[C++中等]  
 答:  
 a.   class   B   :   public   A   {   ……}   //   B公有继承自A,可以是间接继承的  
 b.   class   B   {   operator   A(   );   }   //   B实现了隐式转化为A的转化  
 c.   class   A   {   A(   const   B&   );   }   //   A实现了non-explicit的参数为B(可以有其他带默认值的参数)构造函数  
 d.   A&   operator=   (   const   A&   );   //   赋值操作,虽不是正宗的隐式类型转换,但也可以勉强算一个  
 
以下代码有什么问题?[C++易]  
 cout   <<   (true?1:"1")   <<   endl;  
 答:三元表达式“?:”问号后面的两个操作数必须为同一类型。
error C2446: : : 没有从“const char *”到“int”的转换
 
以下反向遍历array数组的方法有什么错误?[STL]  
  vector   array;  
  array.push_back(   1   );  
  array.push_back(   2   );  
  array.push_back(   3   );  
  for(   vector::size_type   i=array.size()-1;   i>=0;   --i   )   //  
反向遍历array数组  
  {  
          cout   <<   array[i]   <<   endl;  
  }  
   
 答:首先数组定义有误,应加上类型参数:vector<int>   array。其次vector::size_type被定义为unsigned   int,即无符号数,这样做为循环变量的i0时再减1就会变成最大的整数,导致循环失去控制。 
9.   以下代码中的输出语句输出0吗,为什么?[C++易]  
 struct   CLS  
 {  
          int   m_i;  
          CLS(   int   i   )   :   m_i(i)   {}  
          CLS()  
          {  
                  CLS(0);  
          }  
 };  
 CLS   obj;  
 cout   <<   obj.m_i   <<   endl;  
   
 答:不能。在默认构造函数内部再调用带参的构造函数属用户行为而非编译器行为,亦即仅执行函数调用,而不会执行其后的初始化表达式。只有在生成对象时,初始化表达式才会随相应的构造函数一起调用。  
   
   
 10.   C++中的空类,默认产生哪些类成员函数?[C++易]  
 答:  
 class   Empty  
 {  
 public:  
          Empty();                                                     //   缺省构造函数  
          Empty(   const   Empty&   );                         //   拷贝构造函数  
          ~Empty();                                                   //   析构函数  
          Empty&   operator=(   const   Empty&   );   //   赋值运算符  
          Empty*   operator&();                               //   取址运算符  
          const   Empty*   operator&()   const;       //   取址运算符   const  
 };  
   
   
     
 3.   以下两条输出语句分别输出什么?[C++]  
 float   a   =   1.0f;  
 cout   <<   (int)a   <<   endl;  
 cout   <<   (int&)a   <<   endl;  
 cout   <<   boolalpha   <<   (   (int)a   ==   (int&)a   )   <<  endl;   //   输出什么?  
 float   b   =   0.0f;  
 cout   <<   (int)b   <<   endl;  
 cout   <<   (int&)b   <<   endl;  
 cout   <<   boolalpha   <<   (   (int)b   ==   (int&)b   )   <<   endl;   //   输出什么?  
   
  答:分别输出falsetrue。注意转换的应用。(int)a实际上是以浮点数a为参数构造了一个整型数,该整数的值是1(int&)a则是告诉编译器将a当作整数看(并没有做任何实质上的转换)。因为1以整数形式存放和以浮点形式存放其内存数据是不一样的,因此两者不等。对b的两种转换意义同上,但是0的整数形式和浮点形式其内存数据是一样的,因此在这种特殊情形下,两者相等(仅仅在数值意义上)。  
 注意,程序的输出会显示(int&)a=1065353216,这个值是怎么来的呢?前面已经说了,1以浮点数形式存放在内存中,按ieee754规定,其内容为0x0000803F(已考虑字节反序)。这也就是a这个变量所占据的内存单元的值。当(int&)a出现时,它相当于告诉它的上下文:“把这块地址当做整数看待!不要管它原来是什么。”这样,内容0x0000803F按整数解释,其值正好就是1065353216(十进制数)。  
 通过查看汇编代码可以证实“(int)a相当于重新构造了一个值等于a的整型数”之说,而(int&)的作用则仅仅是表达了一个类型信息,意义在于为cout<<==选择正确的重载版本。  
   
   
 6.   以下代码有什么问题?[STL]  
 typedef   vector   IntArray;  
 IntArray   array;  
 array.push_back(   1   );  
 array.push_back(   2   );  
 array.push_back(   2   );  
 array.push_back(   3   );  
 //   删除array数组中所有的2  
 for(   IntArray::iterator   itor=array.begin();   itor!=array.end();   ++itor   )  
 {  
          if(   2   ==   *itor   )   array.erase(   itor   );  
 }  
   
 答:同样有缺少类型参数的问题。另外,每次调用“array.erase(   itor   );”,被删除元素之后的内容会自动往前移,导致迭代漏项,应在删除一项后使itor--,使之从已经前移的下一个元素起继续遍历。  
     
 11.   写一个函数,完成内存之间的拷贝。[考虑问题是否全面]  
 答:  
 void*   mymemcpy(   void   *dest,   const   void   *src,   size_t   count   )  
 {  
          char*   pdest   =   static_cast<char*>(   dest   );  
          const   char*   psrc   =   static_cast<const   char*>(   src   );  
          if(   pdest>psrc   &&   pdest<psrc+cout   )   能考虑到这种情况就行了  
          {  
                  for(   size_t   i=count-1;   i!=-1;   --i   )  
                                  pdest[i]   =   psrc[i];  
          }  
          else  
          {  
                  for(   size_t   i=0;   i<count;   ++i   )  
                          pdest[i]   =   psrc[i];  
          }  
          return   dest;  
 }   
1,若一子程序的起始地址为3K,调用指令CALL的内存地址为K+1,则执行指令需要调用的地址为:____  
4k+1call指令里的地址是相对偏移  
 
 2,pc机中,CPU进行算术运算和逻辑运算时,可以处理的信息长度为  
 a,32位  
 b,16位  
 c,8位  
 d,都可以  
d
 3,signed   char   u=259,printf("%d",u);的输出为___为什么?  
259做整型是100000011,转到signed   char时只留下低字节,最前的1载去,所以剩下3  
 
 4,不用其他变量如何交换a,b的值  
 5,8086CPU运行如下:  
 short   A=0x62A9  
 short   B=0x7090  
 则A+B后,标志位OF(overflow   flag)为___,SF(sign   flag)为___(为什么?)  
 5, 8086CPU运行如下:  
 short   A=0x62A9  
 short   B=0x7090  
 A+B后,标志位OFoverflow   flag)___,SFsign   flag)___(为什么?)  
   
 //===========================  
    0110   0010   1010   1001  
   
 +0111   0000   1001   0000  
 -----------------------  
    1101   0011   0011   1001  
 所以各标志位是:  
 sf=1,zf=0,pf=1,af=0,cf=0,of=1  
6. cpu有10位Address   Bus和7位Date   Bus,它可以寻址的最大内存地址为:___,它可以存储的最大符号数为:___。
地址为2^10-1,最大符号数为2^6-1
 
(2)   编译中的问题:全局变量如int   i=5;   int*(pf)()=foo;   分别  
 在何时被初始化?设计时候如何具体的实现。  
   (3)   OS相关的问题,内存访问,cache等(包括cache在整个系  
 统中的位置,画出来,并解释)  
   (4)   解释例如mov   ax,100H   这样一条指令的cpu,   os,   memory  
 等都完成了什么样的工作。  
   (5)   Strlen()的C语言实现,不能使用任何变量。  
int   my_strlen(char   *s)  
{  
    if(*s=='/0')  
       return   0;  
    else    
       return   my_strlen(s+1)+1;  
}
   (6)   编译中display表的一些问题  
   (7)   一个hash函数,输入随机,现发生冲突,如数据集中在  
 某几条中,问怎样处理hash函数保证高效的访问,怎样实现?  
   (8)   把Switch()case…语句翻译成三元组。  
   (9)   一个byte(用C语言实现计数其中1的个数),给出最高效  
 的实现方法。  
   (10)   上海有多少个加油站?你是怎样解决这一问题?  
   (11)   C语言参数的入栈顺序?为什么这么实现?  
   (12)   你的最大的优点和缺点分别是什么?  
   (13)   C语言中字符串的翻转,最高效率(时间和空间)的实现?  
   (14)   你解决问题和分析问题的能力如何?请给出一个具体的  
 例子来证明你的这种能力?
 
原创粉丝点击