[转载]C,C++及数据结构笔试题1(转)

一:

已知类String的原型为:

class String

{

 public:

     String(const char *str = NULL);            

     String(const String ©);                    

     ~String(void);                

     String & operator = (const String ©);  

 private:

     char * m_data;  

};

请编写String的上述4个函数。

答案:

版本1

// String 的析构函数

String::~String(void) // 3 分

{

 delete [] m_data;

// 由于m_data 是内部数据类型,也可以写成delete m_data;

}

String::String(const char *str)

{

 if(str==NULL)

{

 m_data = new char[1]; // 若能加NULL 判断则更好

 *m_data = ‘{post.content}’;

 }

else

 {

 int length = strlen(str);

 m_data = new char[length+1]; // 若能加NULL 判断则更好

 strcpy(m_data, str);

 }

}

// 拷贝构造函数

String::String(const String &other)

{

 int length = strlen(other.m_data);

 m_data = new char[length+1]; // 若能加NULL 判断则更好

 strcpy(m_data, other.m_data);

}

// 赋值函数

String & String:operate =(const String &other)

{

// (1) 检查自赋值

if(this == &other)

return *this;

// (2) 释放原有的内存资源

delete [] m_data;

// (3)分配新的内存资源,并复制内容

 int length = strlen(other.m_data);

m_data = new char[length+1]; // 若能加NULL 判断则更好

 strcpy(m_data, other.m_data);

// (4)返回本对象的引用

 return *this;

}

版本2

String::String (const char *str)

{

     if(str){

      memset(m_data,0,strlen(m_data));

      strcpy(m_data,str);

     }

     else *m_data=0;

}

  String::String (const String ©)

 {

     strcpy(m_data,copy.m_data);

  }

  String& String:operator =(const String ©)

 {

    if(this==©) retrun *this;

     strcpy(m_data,copy.m_data);

      return *this;

}

版本3

String::String (const char *str)

{

     if ( m_data )

         delete[] m_data;

     if(str){

      m_data = new char[strlen(str)];

      memset(m_data,0,strlen(m_data));

      strcpy(m_data,str);

     }

     else *m_data=0;

}

 

  String::String (const String ©)

 {

     if ( m_data )

     delete[] m_data;

     m_data = new char[strlen(copy.m_data+1)]

     strcpy(m_data,copy.m_data);

  }

 

  String& String:operator =(const String ©)

 {

    if(this==©) retrun *this;

     if ( m_data )

         delete[] m_data;

     m_data = new char[strlen(copy.m_data+1)]

     strcpy(m_data,copy.m_data);

      return *this;

  }

~String::String(void)

{

  if ( m_data )

      delete[] m_data;

}

二:改错题,只能在原来的基础上增加代码,不能删除代码

#include

#include

void foo(int age,char *b)

{

   b = (char *)malloc(64);

   sprintf(b,"Your Age is %d",age);

}

int main()

{

  char *f;

  foo(23,f);

  printf("%sn",f);

}

答案

版本1

#include

#include

void foo(int age,char **b)

{

   *b = (char *)malloc(64);

   sprintf(*b,"Your Age is %d",age);

}

int main()

{

  char **f;

  foo(23,f);

  printf("%sn",**f);

  return 0;

}

版本2

#include

#include

void foo(int age,char *&b)

{

   b = (char *)malloc(64);

   sprintf(b,"Your Age is %d",age);

}

int main()

{

  char *f;

  foo(23,f);

  printf("%sn",f);

  free(f);//不要忘了free;

}

三:有程序片断如下

int main()

{

   int I = 20;

   pid_t pid = 5;

   if((pid = fork()) > 0)

   {

      I = 50;

      printf("%dn",I);   (1)

   }

   else if(pid == 0)

   {

      printf("%dn",I);   (2)

   }

}

请问该程序用的是进程方式还是线程方式,并说明进程与线程的区别:

请问该程序输出什么结果?

四、constant pointer points for String

   pointer points for constant string

五、下面等价的是:

A int i=0

    if(i)

   {

    printf("hello,world");

   }

   int i=1;

      int j=2;

      if(i==1 || j==2)

      {

       printf("hello,world");

       }

   Boolean b1=true;

      Boolean b2=true;

      if(b1==b2)

      {

       printf("hello,world");

     }

    int i=1;

      int j=2;

      if(i==1 &| j==2)

      {

       printf("hello,world");

     }

六、排序二叉树插入一个节点或双向链表的实现

四~六为IBM面试题。

七、指针++的含义和用法

八、stack 和heap的分配,rt-os的特点、同步的方式

九、怎样避免内存泄漏的问题

十、编程实现十进制数转化为十六进制输出,不准用任何已经定义的库函数,比方说String,Math。int toHex(int ) 

十一、编程实现大于100的两个数值相乘的结果输出,同样不准使用任何已定义函数,Math,string,convert等。比方说12345*32534677                                                                      

输入为两个string      int toPlus('12345','32434677')                                     

输出为一个长型的

十二、int delete(node * head)

                                                                                            free(head);                          

head=head->link;                                  

return 0;

                                                                          

指出程序的错误,并且写出正确的程序

十三、写一个程序可以算出字节在计算机中的存储是由大到小还是有小到大。

十四、一段程序,写出输出结果     

大概是                                                                                  
class A                                                                                
                                                                                     
 static void virtual print(){cout<<"A::print()"<<ENDL}< font="" />;                   
                                                                                            class B                                                                                
                                                                                     
 static void virtual print(){cout<<"B::print()"<<ENDL}< font="" />;                   
                                                                                            class C   

                                                                                     
 static void  print(){cout<<"C::print()"<<ENDL}< font="" />;                          
                                                                                                                                                             
print (A a)                                                                            
                                                                                     
 a.print();                                                                            
                                                                                            main()                                                                                 
                                                                                     
A a,*aa,*ab,*ac;                                                                       
B b;                                                                                   
C c; 

aa=&a;                                                                                 
ab=&b;                                                                                 
ac=&c;                                                                                 
a.print();
b.print();                                                                             
c.print();                                                                             
aa.print();                                                                            
ab.print();                                                                       
ac.print();                                                                            
print(a);                                                                              
print(b);                                                                              
print(c);                                                                              
    

十五、给两个变量,如何找出一个带环单链表中是什么地方出现环的。(答案参考expert C programming)。

十~十五为MS笔试题。

十六、写一个带参数宏get_struct_addr_from_member_addr(p, stru, m),

能够根据任意结构实体的某一个成员的地址,算出该结构实体的地址,其中参数p是指向该

成员的指针,stru是该结构体,m是该成员。(SUN试题)

十七、给一个函数

int main(){

    int i, n=20;

    for(i=0;i<N;I--)< font="" />

        printf("-");

    return 0;

}

要求替换、增加或者减少一个字符,使该程序可以打出20个“-”号,并要求写出三种解法

。(sun试题)

参考:1。i-- 换成 n--

2。i<="" font="" />换成 -i<N< font="" />

十八、解释 typedef char (*FUNC)(int, char*)的含义

十九、问#include 和#include "abc.h"的区别,#define MAX_NUM 10 和 const int

MAX_NUM=10区别

二十、问用什么方法可以避免一些潜在错误,比如if( myvar = 3)这一类

编程规范的问题,用 if( 3 = myvar)就可以在编译时报错

十六~二十为SUN笔试题。

1. 下面这段代码的输出是多少(在32位机上).

    char *p;

    char *q[20];

    char *m[20][20];

    int (*n)[10];

struct MyStruct

{

char dda;

double dda1;

int type ;

};

MyStruct k;

 printf("%d %d %d %d",sizeof(p),sizeof(q),sizeof(m),sizeof(n),sizeof(k));

2.

(1)

char a[2][2][3]={{{1,6,3},{5,4,15}},{{3,5,33},{23,12,7}} };

for(int i=0;i<12;i++)

printf("%d ",_______);

在空格处填上合适的语句,顺序打印出a中的数字

 (2) char **p, a[16][8]; 

问:p=a是否会导致程序在以后出现问题?为什么?

3.用递归方式,非递归方式写函数将一个字符串反转.

   函数原型如下:char *reverse(char *str);

4.strcpy函数和memcpy函数有什么区别?它们各自使用时应该注意什么问题?

5.写一个函数将一个链表逆序.

一个单链表,不知道长度,写一个函数快速找到中间节点的位置.

写一个函数找出一个单向链表的倒数第n个节点的指针.(把能想到的最好算法写出).

6.用递归算法判断数组a[N]是否为一个递增数组。

7. 有一个文件(名为a.txt)如下,每行有4项,第一项是他们的名次,写一个c程序,将五个人的名字打印出来.并按名次排序后将5行数据仍然保存到a.txt中.使文件按名次排列每行.

2,07010188,0711,李镇豪,

1,07010154,0421,陈亦良,

3,07010194,0312,凌瑞松,

4,07010209,0351,罗安祥,

5,07010237,0961,黄世传,

8.写一个函数,判断一个unsigned char 字符有几位是1.

  写一个函数判断计算机的字节存储顺序是升序(little-endian)还是降序(big-endian).

 9.微软的笔试题.

Implement a string class in C++ with basic functionality like comparison, concatenation, input and output. Please also provide some test cases and using scenarios (sample code of using this class).

Please do not use MFC, STL and other libraries in your implementation.

10.有个数组a[100]存放了100个数,这100个数取自1-99,且只有两个相同的数,剩下的98个数不同,写一个搜索算法找出相同的那个数的值.(注意空间效率时间效率尽可能要低).

 

posted @ 2012-06-29 16:47  刘竹青  阅读(215)  评论(0编辑  收藏  举报