Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1140564
  • 博文数量: 322
  • 博客积分: 10010
  • 博客等级: 上将
  • 技术积分: 3276
  • 用 户 组: 普通用户
  • 注册时间: 2009-12-17 09:21
文章分类

全部博文(322)

文章存档

2010年(155)

2009年(167)

我的朋友

分类: C/C++

2009-12-19 09:35:37

程序调试

1. 指针问题
#include
#include
using namespace std;

void GetMemory(char *p,int num)
{
    p=(char*)malloc(sizeof(char)*num);
}

void test(void)
{
    char* str=NULL;
    GetMemory(str,100); //str仍然为NULL
    strcpy(str,"hello");     //运行错误
}

void GetMemory2(char **p,int num)
{
    *p=(char*)malloc(sizeof(char)*num);
}

void test2(void)
{
    char *str=NULL;
    GetMemory2(&str,100);
    strcpy(str,"hello");
    cout<    free(str);
}

char *GetMemory3(int num)
{
char* p=(char*)malloc(sizeof(char)*num);
return p;
}

void test3(void)
{
char* str=NULL;
str=GetMemory3(100);
strcpy(str,"hello");
cout<free(str);
}

char* GetString(void)
{
char p[]="hello world";    //位于堆栈内存
return p;
}

void test4(void)
{
char* str=NULL;
str=GetString();        //str的内容是垃圾
cout<}

void main(void)
{
// test();     
// test2();
// test3();
test4();
}

2.
TC2.0 环境下的如下程序, 执行结果为
please input: scanf : floating point formats not linked
Abnormal program termination

#include "stdio.h"
#include "stdlib.h"
main()
{
    float *a;
    a = (float *)malloc(10*sizeof(float));
    printf(" Please input: ");
    scanf("%f", &a[0]); /* &a[0] 也不行 */
    printf(" What you have input is %f ", *a);
    getch();
    free(a);
}


3.


F(n)=1 n>8 n<12
F(n)=2 n<2
F(n)=3 n=6
F(n)=4 n=other

使用+ - * /和sign(n)函数组合出F(n)函数

sign(n)=0 n=0
sign(n)=-1 n<0
sign(n)=1 n>0


4.    找错
Void test1()
{
    char string[10];
    char* str1=”0123456789”;
    strcpy(string, str1);
}

Void test2()
{
    char string[10], str1[10];
    for(I=0; I<10;I++)
   {
        str1[i] =’a’;
   }
    strcpy(string, str1);
}

Void test3(char* str1)
{
    char string[10];
    if(strlen(str1)<=10)
    {
        strcpy(string, str1);
    }
}


5.    找错
#define MAX_SRM 256
DSN get_SRM_no()
{
        static int SRM_no;
        int I;
        for(I=0;I        {
            SRM_no %= MAX_SRM;
             if(MY_SRM.state==IDLE)
             {
                      break;
             }
        }
        
        if(I>=MAX_SRM)
             return (NULL_SRM);
        else
            return SRM_no;
}


6.    写出程序运行结果
int sum(int a)
{
        auto int c=0;
        static int b=3;
        c+=1;
         b+=2;
          return(a+b+C);
}

void main()
{
        int I;
        int a=2;
        for(I=0;I<5;I++)
        {
             printf(“%d,”, sum(a));
        }
}

7.
int func(int a)
{
    int b;
    switch(a)
    {
        case 1: 30;
        case 2: 20;
        case 3: 16;
        default: 0
     }
     return b;
}
则func(1)=?


5:
int a[3];
a[0]=0; a[1]=1; a[2]=2;
int *p, *q;
p=a;
q=&a[2];
则a[q-p]=?

6.
定义 int **a[3][4], 则变量占有的内存空间为

7.
编写一个函数,要求输入年月日时分秒,输出该年月日时分秒的下一秒。如输入2004年12月31日23时59分59秒,则输出2005年1月1日0时0分0秒。




上海微创笔试

1.上海的苏州河由于遭受多年的工业污染,一直是条臭水沟。上海市政府下了很大决心清理苏州河,你觉得需要几年能让河水变清?你的依据是什么?
2.找出字符串A中包含的字符可以进行的所有不同组合。例如:abccd中,ab,ac,bc,cc,abd等都是可能的组合。(请用C/C++编程,不允许上机操作)
3.请估算月球的体积。
4.经常去的技术网站,请举例。
5.对软件开发过程的理解。
6.上海有多少外籍和港澳台人士?你的依据是什么?(不得引用政府和调研机构数据)
7.字符串A是由n个小写英文字母(a ~ z)构成的,定义为char A[n]。你能用更少的空间表示这个字符串吗?请写出从char A[n]到你的新的储存格式的转换函数。(请用C/C++编程,不允许上机操作)
8.哈希表和数组的定义,区别,优缺点。
9.用递归实现菲波列数列。
10.用dhtml写页面。



一些software必定会被问到的问题,供大家参考(这些问题很多都非常基础,出现在华为、中兴、intel、上海群硕、深圳正阳、腾讯、惠普、微软等公司,如果栽在这上面谁都不会甘心):

C++部分:

1、排序。这种题目几乎是必问的,一般是问你排序有几种,各种排序的比较啊等等。还有哪些排序是稳定的等,这些还是要记住的。末了,必定会问你快排的算法~呵呵,狠一些的就让你写出来。(至于堆排序桶排序啊什么的,倒是从来没有听说有人被问过——我们觉得这么麻烦的算法面试官自己估计也不会记得……呵呵)

2、查找。哈希、二叉树、折半等对比。哈希映射和哈希表的区别。

3、链表和数组的区别。在什么情况下用链表什么情况下用数组。

4、栈和队列的区别。

5、多态。overload 和 override的区别。

6、字符串有关的函数。比如让你写一个拷贝字符串的函数啊,或者字符串反转啊什么的。strcpy和memcpy。

7、继承、多继承。

8、面向对象有什么好处

9、说说static的与众不同之处。如果一个变量被声明为static,它会被分配在哪里。在什么时候分配空间等。

10、软件开发的几个过程。如果说到测试,一定会问测试分哪几种,有什么区别等。

11、什么是虚函数、纯虚函数、虚的析构函数,用途。

12、还没想起来,欢迎大家补充



网络部分:

1、OSI模型7层结构。TCP/IP模型结构

2、TCP/UDP区别

3、建立连接的步骤

JAVA部分

1、Java的特性,垃圾回收,让你想一个大概的实现垃圾回收的架够。
2、Java和C/C++的区别
3、虚函数,纯虚函数、重栽函数,他们之间的区别,什么时候用,重载什么时候用虚函数。虚函数的实现机理。
4、现场编写程序的考点:指针越界、基本类型数据的字长、字符串、数组

 
面试常见问题解答

1:CObject类中的析构函数为什么是虚函数ZZ
         面试SE时,很多公司喜欢问到虚函数相关。宝宝有一次被问到,CObject类中的析构函数为什么是虚函数,不懂。后来上网查到了答案,特贴上来与大家分享
MFC类库中,CObject类的重要性不言自明的。在CObject的定义中,我们 看到一个有趣的现象,即CObject的析构函数是虚拟的。

在AFX.H中,CObject的定义:

class CObject
{
   public:
// Object model (types, destruction, allocation)
   
   virtual CRuntimeClass* GetRuntimeClass() const;
   virtual ~CObject(); //virtual destructors are necessary
   
   ...
   ...
};

为什么MFC的编写者认为virtual destructors are necessary (虚拟的析构函数是必要的)?

在著名的VC教程 "精通Visual C++ for Windows 95/NT"(电子工业版, 1997年5月版,胡俭,丘宗明等著)第99页中有这样一段话:

“如果CObject的析构函数不是虚拟的,派生类就不会自动地得到虚拟的   析构函数,当对象撤消时就会带来问题——只有当前类的析构函数得到
  调用而基类的析构函数就得不到调用。...”
 
我认为这段解释是这本很不错的书中一个不应出现的严重错误。其意思是说:
若:
class CBase
{
   public:
      ~CBase() { ... };
   ...
};

class CChild : public CBase
{
   public:
      ~CChild() { ... };
   ...
};

main()
{
   Child c;
   ...
   return 0;
}

上段代码在运行时,当栈框中的自动对象 c 被撤消时,只调用~CChild(), 而不调用~CBase()。

我想但凡对C++继承性理论有所了解的人都会立刻指出这是错误的。

由于在生成CChild对象c时,实际上在调用CChild类的构造函数之前必须首先 调用其基类CBase的构造函数,所以当撤消c时,也会在调用CChild类析构函数
之后,调用CBase类的析构函数(析构函数调用顺序与构造函数相反)。也就是说,无论析构函数是不是虚函数,派生类对象被撤消时,肯定会依次上调其基类的
析构函数。

那么为什么CObject类要搞一个虚的析构函数呢?

仍以上面代码为例,如果main()中有如下代码:
...

CBase * pBase;
CChild c;
pBase = &c;

...


那么在、当pBase指针被撤消时,调用的是CBase的析构函数还是CChild的呢? 显然是CBase的(静态联编)。但如果把CBase类的析构函数改成virtual型,当 pBase指针被撤消时,就会先调用CChild类构造函数,再调用CBase类构造函数。


在这个例子里,所有对象都存在于栈框中,当离开其所处的作用域时,该对象 会被自动撤消,似乎看不出什么大问题。但是试想,如果CChild类的的构造函数

在堆中分配了内存,而其析构函数又不是virtual型的,那么撤消pBase时,将不会 调用CChild::~CChild(), 从而不会释放CChild::CChild()占据的内存,造成内存泄露。

而将CObject的析构函数设为virtual型,则所有CObject类的派生类的析构函数都将 自动变为virtual型,这保证了在任何情况下,不会出现由于析构函数未被调用而
导致 的内存泄露。这才是MFC将CObject::~CObject()设为virtual型的真正原因。

注意:析构函数可以为virtual型,构造函数则不能。

 
面试常见问题解答2:几种查找方式的比较ZZ



宝宝提供的答案仅供参考,如有不对欢迎指正screen.width-500)this.style.width=screen.width-500;">
hash表的查找性能是与装填因子(=填充数/表长)成正比的;
2叉树查找则需要遍历节点,性能为O(n);
折半查找性能应该为log(n);
 
 
面试常见问题解答3:说说static的与众不同之处

static是静态分配,生命域>=作用域,在静态数据区,当函数返回时,其静态地址并不
释放,并保留以前的值。但其只能在作用域内
被访问。故在递归调用等程序中,它的作用很突出。


   |
   V

   ^
   |
   堆
   数据段
   代码段
 
 
面试常见问题解答4:overload和override的区别

重写Overriding是父类与子类之间多态性的一种表现,
重载Overloading是一个类中多态性的一种表现。
如果在子类中定义某方法与其父类有相同的名称和参数,
我们说该方法被重写 (Overriding)。
子类的对象使用这个方法时,将调用子类中的定义,对它而言,
父类中的定义如同被“屏蔽”了。
如果在一个类中定义了多个同名的方法,
它们或有不同的参数个数或有不同的参数类型,
则称为方法的重载(Overloading)。
Overloaded的方法是可以改变返回值的类型。

数据结构面试题目



对n个顶点的无向图和有向图用邻接矩阵和邻接表表示时,如何判断下列问题
1)图中有多少边?
2)任意两个顶点的i和j是否有变相连?
3)任意一个顶点的度是多少?


有向图G用邻接矩阵存储,其第i行的所有元素之和等于顶点i的_____

阅读(475) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~